blob: 4a6da53c97c3a4a726af860768ce3a2844114653 [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 "SkBitmapSource.h"
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000010#include "SkColor.h"
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +000011#include "SkRefCnt.h"
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000012
13namespace skiagm {
14
15class ResizeGM : public GM {
16public:
17 ResizeGM() {
18 this->setBGColor(0x00000000);
19 }
20
21protected:
22 virtual SkString onShortName() {
23 return SkString("resizeimagefilter");
24 }
25
26 void draw(SkCanvas* canvas,
27 const SkRect& rect,
28 const SkSize& deviceSize,
reed93a12152015-03-16 10:08:34 -070029 SkFilterQuality filterQuality,
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +000030 SkImageFilter* input = NULL) {
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000031 SkRect dstRect;
32 canvas->getTotalMatrix().mapRect(&dstRect, rect);
33 canvas->save();
reed80ea19c2015-05-12 10:37:34 -070034 SkScalar deviceScaleX = deviceSize.width() / dstRect.width();
35 SkScalar deviceScaleY = deviceSize.height() / dstRect.height();
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000036 canvas->translate(rect.x(), rect.y());
37 canvas->scale(deviceScaleX, deviceScaleY);
38 canvas->translate(-rect.x(), -rect.y());
senorblanco@chromium.orgfd0ec2c2014-03-25 17:35:10 +000039 SkMatrix matrix;
40 matrix.setScale(SkScalarInvert(deviceScaleX),
41 SkScalarInvert(deviceScaleY));
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000042 SkAutoTUnref<SkImageFilter> imageFilter(
senorblanco8c874ee2015-03-20 06:38:17 -070043 SkImageFilter::CreateMatrixFilter(matrix, filterQuality, input));
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000044 SkPaint filteredPaint;
45 filteredPaint.setImageFilter(imageFilter.get());
46 canvas->saveLayer(&rect, &filteredPaint);
47 SkPaint paint;
48 paint.setColor(0xFF00FF00);
49 SkRect ovalRect = rect;
50 ovalRect.inset(SkIntToScalar(4), SkIntToScalar(4));
51 canvas->drawOval(ovalRect, paint);
52 canvas->restore(); // for saveLayer
53 canvas->restore();
54 }
55
56 virtual SkISize onISize() {
tfarinaf5393182014-06-09 23:59:03 -070057 return SkISize::Make(520, 100);
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000058 }
59
60 virtual void onDraw(SkCanvas* canvas) {
senorblanco16b254a2015-04-09 11:13:24 -070061 canvas->clear(SK_ColorBLACK);
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000062
63 SkRect srcRect = SkRect::MakeWH(96, 96);
64
65 SkSize deviceSize = SkSize::Make(16, 16);
66 draw(canvas,
67 srcRect,
68 deviceSize,
reed93a12152015-03-16 10:08:34 -070069 kNone_SkFilterQuality);
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000070
71 canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
72 draw(canvas,
73 srcRect,
74 deviceSize,
reed93a12152015-03-16 10:08:34 -070075 kLow_SkFilterQuality);
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000076
77 canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
78 draw(canvas,
79 srcRect,
80 deviceSize,
reed93a12152015-03-16 10:08:34 -070081 kMedium_SkFilterQuality);
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000082
83 canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
84 draw(canvas,
85 srcRect,
86 deviceSize,
reed93a12152015-03-16 10:08:34 -070087 kHigh_SkFilterQuality);
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +000088
89 SkBitmap bitmap;
90 bitmap.allocN32Pixels(16, 16);
91 bitmap.eraseARGB(0x00, 0x00, 0x00, 0x00);
92 {
robertphillips9a53fd72015-06-22 09:46:59 -070093 SkCanvas bitmapCanvas(bitmap);
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +000094 SkPaint paint;
95 paint.setColor(0xFF00FF00);
96 SkRect ovalRect = SkRect::MakeWH(16, 16);
reed80ea19c2015-05-12 10:37:34 -070097 ovalRect.inset(SkIntToScalar(2)/3, SkIntToScalar(2)/3);
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +000098 bitmapCanvas.drawOval(ovalRect, paint);
99 }
100 SkRect inRect = SkRect::MakeXYWH(-4, -4, 20, 20);
101 SkRect outRect = SkRect::MakeXYWH(-24, -24, 120, 120);
102 SkAutoTUnref<SkBitmapSource> source(SkBitmapSource::Create(bitmap, inRect, outRect));
103 canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
104 draw(canvas,
105 srcRect,
106 deviceSize,
reed93a12152015-03-16 10:08:34 -0700107 kHigh_SkFilterQuality,
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +0000108 source.get());
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +0000109 }
110
111private:
112 typedef GM INHERITED;
113};
114
115//////////////////////////////////////////////////////////////////////////////
116
117static GM* MyFactory(void*) { return new ResizeGM; }
118static GMRegistry reg(MyFactory);
119
120}