blob: 2edb802838e6fb2a30f37e5c0eb725db017c3ddf [file] [log] [blame]
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +00001/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "gm.h"
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +00009#include "SkBitmapDevice.h"
10#include "SkBitmapSource.h"
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000011#include "SkColor.h"
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +000012#include "SkRefCnt.h"
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000013
14namespace skiagm {
15
16class ResizeGM : public GM {
17public:
18 ResizeGM() {
19 this->setBGColor(0x00000000);
20 }
21
22protected:
23 virtual SkString onShortName() {
24 return SkString("resizeimagefilter");
25 }
26
27 void draw(SkCanvas* canvas,
28 const SkRect& rect,
29 const SkSize& deviceSize,
reed93a12152015-03-16 10:08:34 -070030 SkFilterQuality filterQuality,
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +000031 SkImageFilter* input = NULL) {
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000032 SkRect dstRect;
33 canvas->getTotalMatrix().mapRect(&dstRect, rect);
34 canvas->save();
reed80ea19c2015-05-12 10:37:34 -070035 SkScalar deviceScaleX = deviceSize.width() / dstRect.width();
36 SkScalar deviceScaleY = deviceSize.height() / dstRect.height();
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000037 canvas->translate(rect.x(), rect.y());
38 canvas->scale(deviceScaleX, deviceScaleY);
39 canvas->translate(-rect.x(), -rect.y());
senorblanco@chromium.orgfd0ec2c2014-03-25 17:35:10 +000040 SkMatrix matrix;
41 matrix.setScale(SkScalarInvert(deviceScaleX),
42 SkScalarInvert(deviceScaleY));
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000043 SkAutoTUnref<SkImageFilter> imageFilter(
senorblanco8c874ee2015-03-20 06:38:17 -070044 SkImageFilter::CreateMatrixFilter(matrix, filterQuality, input));
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000045 SkPaint filteredPaint;
46 filteredPaint.setImageFilter(imageFilter.get());
47 canvas->saveLayer(&rect, &filteredPaint);
48 SkPaint paint;
49 paint.setColor(0xFF00FF00);
50 SkRect ovalRect = rect;
51 ovalRect.inset(SkIntToScalar(4), SkIntToScalar(4));
52 canvas->drawOval(ovalRect, paint);
53 canvas->restore(); // for saveLayer
54 canvas->restore();
55 }
56
57 virtual SkISize onISize() {
tfarinaf5393182014-06-09 23:59:03 -070058 return SkISize::Make(520, 100);
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000059 }
60
61 virtual void onDraw(SkCanvas* canvas) {
senorblanco16b254a2015-04-09 11:13:24 -070062 canvas->clear(SK_ColorBLACK);
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000063
64 SkRect srcRect = SkRect::MakeWH(96, 96);
65
66 SkSize deviceSize = SkSize::Make(16, 16);
67 draw(canvas,
68 srcRect,
69 deviceSize,
reed93a12152015-03-16 10:08:34 -070070 kNone_SkFilterQuality);
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000071
72 canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
73 draw(canvas,
74 srcRect,
75 deviceSize,
reed93a12152015-03-16 10:08:34 -070076 kLow_SkFilterQuality);
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000077
78 canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
79 draw(canvas,
80 srcRect,
81 deviceSize,
reed93a12152015-03-16 10:08:34 -070082 kMedium_SkFilterQuality);
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000083
84 canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
85 draw(canvas,
86 srcRect,
87 deviceSize,
reed93a12152015-03-16 10:08:34 -070088 kHigh_SkFilterQuality);
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +000089
90 SkBitmap bitmap;
91 bitmap.allocN32Pixels(16, 16);
92 bitmap.eraseARGB(0x00, 0x00, 0x00, 0x00);
93 {
94 SkBitmapDevice bitmapDevice(bitmap);
95 SkCanvas bitmapCanvas(&bitmapDevice);
96 SkPaint paint;
97 paint.setColor(0xFF00FF00);
98 SkRect ovalRect = SkRect::MakeWH(16, 16);
reed80ea19c2015-05-12 10:37:34 -070099 ovalRect.inset(SkIntToScalar(2)/3, SkIntToScalar(2)/3);
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +0000100 bitmapCanvas.drawOval(ovalRect, paint);
101 }
102 SkRect inRect = SkRect::MakeXYWH(-4, -4, 20, 20);
103 SkRect outRect = SkRect::MakeXYWH(-24, -24, 120, 120);
104 SkAutoTUnref<SkBitmapSource> source(SkBitmapSource::Create(bitmap, inRect, outRect));
105 canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
106 draw(canvas,
107 srcRect,
108 deviceSize,
reed93a12152015-03-16 10:08:34 -0700109 kHigh_SkFilterQuality,
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +0000110 source.get());
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +0000111 }
112
113private:
114 typedef GM INHERITED;
115};
116
117//////////////////////////////////////////////////////////////////////////////
118
119static GM* MyFactory(void*) { return new ResizeGM; }
120static GMRegistry reg(MyFactory);
121
122}