aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/imageresizetiled.cpp
diff options
context:
space:
mode:
authorGravatar senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-02-19 22:10:12 +0000
committerGravatar senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-02-19 22:10:12 +0000
commit897b73f62c012758bd8fef77c24d3573c847dbc3 (patch)
tree4836a846a76b7a8eb85b3e7ea58d20d7fefa782a /gm/imageresizetiled.cpp
parent5a6abaa1c9db4f2c9a408a6121e98f76b0c38110 (diff)
Fix CTM application in SkResizeImagefilter; implement bounds traversals.
SkResizeImageFilter resizes all the pixels from its input (subject to the input's crop rect), but the offset to be applied was incorrect. It should take the CTM into account, so that the origin of the resize is the world space origin, unaffected by whatever clipping is applied. New GM imageresizetiled exercises the behaviour under impl-side-painting-like conditions, and existing GMs now have resize cases added. R=reed@google.com, robertphillips@google.com Review URL: https://codereview.chromium.org/168283006 git-svn-id: http://skia.googlecode.com/svn/trunk@13506 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'gm/imageresizetiled.cpp')
-rw-r--r--gm/imageresizetiled.cpp77
1 files changed, 77 insertions, 0 deletions
diff --git a/gm/imageresizetiled.cpp b/gm/imageresizetiled.cpp
new file mode 100644
index 0000000000..a54c811cca
--- /dev/null
+++ b/gm/imageresizetiled.cpp
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "gm.h"
+#include "SkResizeImageFilter.h"
+#include "SkRandom.h"
+
+#define WIDTH 640
+#define HEIGHT 480
+
+#define RESIZE_FACTOR SkIntToScalar(2)
+
+namespace skiagm {
+
+class ImageResizeTiledGM : public GM {
+public:
+ ImageResizeTiledGM() {
+ }
+
+protected:
+ virtual SkString onShortName() SK_OVERRIDE {
+ return SkString("imageresizetiled");
+ }
+
+ virtual SkISize onISize() SK_OVERRIDE {
+ return make_isize(WIDTH, HEIGHT);
+ }
+
+ virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
+ SkPaint paint;
+ SkAutoTUnref<SkImageFilter> imageFilter(
+ new SkResizeImageFilter(RESIZE_FACTOR, RESIZE_FACTOR, SkPaint::kNone_FilterLevel));
+ paint.setImageFilter(imageFilter.get());
+ const SkScalar tile_size = SkIntToScalar(100);
+ SkRect bounds;
+ canvas->getClipBounds(&bounds);
+ for (SkScalar y = 0; y < HEIGHT; y += tile_size) {
+ for (SkScalar x = 0; x < WIDTH; x += tile_size) {
+ canvas->save();
+ canvas->clipRect(SkRect::MakeXYWH(x, y, tile_size, tile_size));
+ canvas->scale(SkScalarInvert(RESIZE_FACTOR),
+ SkScalarInvert(RESIZE_FACTOR));
+ canvas->saveLayer(NULL, &paint);
+ const char* str[] = {
+ "The quick",
+ "brown fox",
+ "jumped over",
+ "the lazy dog.",
+ };
+ SkPaint textPaint;
+ textPaint.setAntiAlias(true);
+ textPaint.setTextSize(SkIntToScalar(100));
+ int posY = 0;
+ for (unsigned i = 0; i < SK_ARRAY_COUNT(str); i++) {
+ posY += 100;
+ canvas->drawText(str[i], strlen(str[i]), SkIntToScalar(0),
+ SkIntToScalar(posY), textPaint);
+ }
+ canvas->restore();
+ canvas->restore();
+ }
+ }
+ }
+
+private:
+ typedef GM INHERITED;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+DEF_GM(return new ImageResizeTiledGM(); )
+
+}