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
diff --git a/gm/imageresizetiled.cpp b/gm/imageresizetiled.cpp
new file mode 100644
index 0000000..a54c811
--- /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(); )
+
+}