aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/bitmapsource.cpp
diff options
context:
space:
mode:
authorGravatar senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-12-09 18:31:42 +0000
committerGravatar senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-12-09 18:31:42 +0000
commite93e1dbf0eced1e1b9aeed7c0c170961e2d61e32 (patch)
treeb0d4b72c85db74c4dcb18f5c72bf91e729854d62 /gm/bitmapsource.cpp
parent907fbd53c5e5dd4cbde7b72f9242b51febd7ef95 (diff)
Implement srcRect and dstRect functionality in SkBitmapSource. This is required for the "preserveAspectRatio" options of SVG's feImage. Covered by new GM "bitmapsource".
This also includes some changes to the xfermodeimagefilter and tileimagefilter GMs to properly handle the CTM. This worked before only because SkBitmapSource was ignoring the CTM. Now that it respects it, we need to give the correct transform. This also means the GMs now work while zoomed. It also implements CTM support for SkTileImageFilter. NOTE: this will require rebaselining a number of imagefilter GMs on Nexus4, since they render in perspective (using the CTM). The changes to the results should all be improvements. R=reed@google.com, robertphillips@google.com Review URL: https://codereview.chromium.org/106933002 git-svn-id: http://skia.googlecode.com/svn/trunk@12571 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'gm/bitmapsource.cpp')
-rw-r--r--gm/bitmapsource.cpp91
1 files changed, 91 insertions, 0 deletions
diff --git a/gm/bitmapsource.cpp b/gm/bitmapsource.cpp
new file mode 100644
index 0000000000..d6e98a5bbd
--- /dev/null
+++ b/gm/bitmapsource.cpp
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2013 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 "SkBitmapSource.h"
+
+// This GM exercises the SkBitmapSource ImageFilter class.
+
+class BitmapSourceGM : public skiagm::GM {
+public:
+ BitmapSourceGM() {
+ }
+
+protected:
+ virtual SkString onShortName() SK_OVERRIDE {
+ return SkString("bitmapsource");
+ }
+
+ void makeBitmap() {
+ fBitmap.setConfig(SkBitmap::kARGB_8888_Config, 100, 100);
+ fBitmap.allocPixels();
+ SkBitmapDevice device(fBitmap);
+ SkCanvas canvas(&device);
+ canvas.clear(0x00000000);
+ SkPaint paint;
+ paint.setAntiAlias(true);
+ paint.setColor(0xFFFFFFFF);
+ paint.setTextSize(SkIntToScalar(96));
+ const char* str = "e";
+ canvas.drawText(str, strlen(str), SkIntToScalar(20), SkIntToScalar(70), paint);
+ }
+
+ virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(500, 150); }
+
+ virtual void onOnceBeforeDraw() SK_OVERRIDE {
+ this->makeBitmap();
+ }
+
+ static void fillRectFiltered(SkCanvas* canvas, const SkRect& clipRect, SkImageFilter* filter) {
+ SkPaint paint;
+ paint.setImageFilter(filter);
+ canvas->save();
+ canvas->clipRect(clipRect);
+ canvas->drawPaint(paint);
+ canvas->restore();
+ }
+
+ virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
+ canvas->clear(0x00000000);
+ {
+ SkRect srcRect = SkRect::MakeXYWH(20, 20, 30, 30);
+ SkRect dstRect = SkRect::MakeXYWH(0, 10, 60, 60);
+ SkRect clipRect = SkRect::MakeXYWH(0, 0, 100, 100);
+ SkRect bounds;
+ fBitmap.getBounds(&bounds);
+ SkAutoTUnref<SkImageFilter> bitmapSource(new SkBitmapSource(fBitmap));
+ SkAutoTUnref<SkImageFilter> bitmapSourceSrcRect(new SkBitmapSource(fBitmap, srcRect, srcRect));
+ SkAutoTUnref<SkImageFilter> bitmapSourceSrcRectDstRect(new SkBitmapSource(fBitmap, srcRect, dstRect));
+ SkAutoTUnref<SkImageFilter> bitmapSourceDstRectOnly(new SkBitmapSource(fBitmap, bounds, dstRect));
+
+ // Draw an unscaled bitmap.
+ fillRectFiltered(canvas, clipRect, bitmapSource);
+ canvas->translate(SkIntToScalar(100), 0);
+
+ // Draw an unscaled subset of the source bitmap (srcRect -> srcRect).
+ fillRectFiltered(canvas, clipRect, bitmapSourceSrcRect);
+ canvas->translate(SkIntToScalar(100), 0);
+
+ // Draw a subset of the bitmap scaled to a destination rect (srcRect -> dstRect).
+ fillRectFiltered(canvas, clipRect, bitmapSourceSrcRectDstRect);
+ canvas->translate(SkIntToScalar(100), 0);
+
+ // Draw the entire bitmap scaled to a destination rect (bounds -> dstRect).
+ fillRectFiltered(canvas, clipRect, bitmapSourceDstRectOnly);
+ canvas->translate(SkIntToScalar(100), 0);
+ }
+ }
+
+private:
+ SkBitmap fBitmap;
+ typedef GM INHERITED;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+
+DEF_GM( return new BitmapSourceGM; )