blob: fe7561626bd1edecb324a1f2ad7fd4b102803b8a [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:
robertphillips549c8992016-04-01 09:28:51 -070023 SkString onShortName() override {
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000024 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,
robertphillips549c8992016-04-01 09:28:51 -070031 sk_sp<SkImageFilter> input) {
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;
robertphillips549c8992016-04-01 09:28:51 -070041 matrix.setScale(SkScalarInvert(deviceScaleX), SkScalarInvert(deviceScaleY));
robertphillipsae8c9332016-04-05 15:09:00 -070042 sk_sp<SkImageFilter> filter(SkImageFilter::MakeMatrixFilter(matrix,
43 filterQuality,
44 std::move(input)));
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000045 SkPaint filteredPaint;
robertphillips549c8992016-04-01 09:28:51 -070046 filteredPaint.setImageFilter(std::move(filter));
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000047 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
robertphillips549c8992016-04-01 09:28:51 -070057 SkISize onISize() override {
tfarinaf5393182014-06-09 23:59:03 -070058 return SkISize::Make(520, 100);
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000059 }
60
robertphillips549c8992016-04-01 09:28:51 -070061 void onDraw(SkCanvas* canvas) override {
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);
robertphillips549c8992016-04-01 09:28:51 -070067 this->draw(canvas,
68 srcRect,
69 deviceSize,
70 kNone_SkFilterQuality,
71 nullptr);
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000072
73 canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
robertphillips549c8992016-04-01 09:28:51 -070074 this->draw(canvas,
75 srcRect,
76 deviceSize,
77 kLow_SkFilterQuality,
78 nullptr);
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000079
80 canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
robertphillips549c8992016-04-01 09:28:51 -070081 this->draw(canvas,
82 srcRect,
83 deviceSize,
84 kMedium_SkFilterQuality,
85 nullptr);
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +000086
87 canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
robertphillips549c8992016-04-01 09:28:51 -070088 this->draw(canvas,
89 srcRect,
90 deviceSize,
91 kHigh_SkFilterQuality,
92 nullptr);
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +000093
robertphillips549c8992016-04-01 09:28:51 -070094 sk_sp<SkSurface> surface(SkSurface::MakeRasterN32Premul(16, 16));
fmalita5598b632015-09-15 11:26:13 -070095 SkCanvas* surfaceCanvas = surface->getCanvas();
96 surfaceCanvas->clear(0x000000);
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +000097 {
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +000098 SkPaint paint;
99 paint.setColor(0xFF00FF00);
100 SkRect ovalRect = SkRect::MakeWH(16, 16);
reed80ea19c2015-05-12 10:37:34 -0700101 ovalRect.inset(SkIntToScalar(2)/3, SkIntToScalar(2)/3);
fmalita5598b632015-09-15 11:26:13 -0700102 surfaceCanvas->drawOval(ovalRect, paint);
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +0000103 }
reed9ce9d672016-03-17 10:51:11 -0700104 sk_sp<SkImage> image(surface->makeImageSnapshot());
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +0000105 SkRect inRect = SkRect::MakeXYWH(-4, -4, 20, 20);
106 SkRect outRect = SkRect::MakeXYWH(-24, -24, 120, 120);
robertphillips549c8992016-04-01 09:28:51 -0700107 sk_sp<SkImageFilter> source(
108 SkImageSource::Make(std::move(image), inRect, outRect, kHigh_SkFilterQuality));
commit-bot@chromium.orgb6593332014-03-21 16:19:28 +0000109 canvas->translate(srcRect.width() + SkIntToScalar(10), 0);
robertphillips549c8992016-04-01 09:28:51 -0700110 this->draw(canvas,
111 srcRect,
112 deviceSize,
113 kHigh_SkFilterQuality,
114 std::move(source));
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +0000115 }
116
117private:
118 typedef GM INHERITED;
119};
120
121//////////////////////////////////////////////////////////////////////////////
122
robertphillips549c8992016-04-01 09:28:51 -0700123DEF_GM(return new ResizeGM; )
senorblanco@chromium.orga612d4c2014-01-15 04:49:18 +0000124
125}