blob: 9a684a28597252c8722652ac63c638a99ae65a98 [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"
9#include "SkColor.h"
fmalita5598b632015-09-15 11:26:13 -070010#include "SkImageSource.h"
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +000011#include "SkRefCnt.h"
fmalita5598b632015-09-15 11:26:13 -070012#include "SkSurface.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,
halcanary96fcdcc2015-08-27 07:41:13 -070031 SkImageFilter* input = nullptr) {
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
fmalita5598b632015-09-15 11:26:13 -070090 SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterN32Premul(16, 16));
91 SkCanvas* surfaceCanvas = surface->getCanvas();
92 surfaceCanvas->clear(0x000000);
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +000093 {
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);
fmalita5598b632015-09-15 11:26:13 -070098 surfaceCanvas->drawOval(ovalRect, paint);
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +000099 }
fmalita5598b632015-09-15 11:26:13 -0700100 SkAutoTUnref<SkImage> image(surface->newImageSnapshot());
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +0000101 SkRect inRect = SkRect::MakeXYWH(-4, -4, 20, 20);
102 SkRect outRect = SkRect::MakeXYWH(-24, -24, 120, 120);
fmalita5598b632015-09-15 11:26:13 -0700103 SkAutoTUnref<SkImageFilter> source(
104 SkImageSource::Create(image, inRect, outRect, kHigh_SkFilterQuality));
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +0000105 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}