blob: cc636aa276453415319b48427fc9e55783fd9bbb [file] [log] [blame]
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +00001/*
2 * Copyright 2014 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
halcanaryb0cce2c2015-01-26 12:49:00 -08008#include "sk_tool_utils.h"
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +00009#include "SkBitmapSource.h"
10#include "SkBlurImageFilter.h"
halcanary878fa022015-01-26 11:24:32 -080011#include "SkColor.h"
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +000012#include "SkDisplacementMapEffect.h"
13#include "SkDropShadowImageFilter.h"
14#include "SkGradientShader.h"
15#include "SkMorphologyImageFilter.h"
16#include "SkOffsetImageFilter.h"
senorblanco@chromium.org47d98c82014-03-03 14:58:09 +000017#include "SkPerlinNoiseShader.h"
18#include "SkRectShaderImageFilter.h"
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +000019#include "SkScalar.h"
halcanary878fa022015-01-26 11:24:32 -080020#include "gm.h"
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +000021
senorblanco@chromium.org897b73f2014-02-19 22:10:12 +000022#define RESIZE_FACTOR_X SkIntToScalar(2)
23#define RESIZE_FACTOR_Y SkIntToScalar(5)
24
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +000025namespace skiagm {
26
27class ImageFiltersClippedGM : public GM {
28public:
29 ImageFiltersClippedGM() : fInitialized(false) {
30 this->setBGColor(0x00000000);
31 }
32
33protected:
commit-bot@chromium.orga90c6802014-04-30 13:20:45 +000034
mtklein36352bf2015-03-25 18:17:31 -070035 SkString onShortName() override {
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +000036 return SkString("imagefiltersclipped");
37 }
38
mtklein36352bf2015-03-25 18:17:31 -070039 SkISize onISize() override {
tfarinaf5393182014-06-09 23:59:03 -070040 return SkISize::Make(860, 500);
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +000041 }
42
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +000043 void make_gradient_circle(int width, int height) {
44 SkScalar x = SkIntToScalar(width / 2);
45 SkScalar y = SkIntToScalar(height / 2);
commit-bot@chromium.orgc3bd8af2014-02-13 17:14:46 +000046 SkScalar radius = SkMinScalar(x, y) * 0.8f;
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +000047 fGradientCircle.allocN32Pixels(width, height);
commit-bot@chromium.orgc3bd8af2014-02-13 17:14:46 +000048 SkCanvas canvas(fGradientCircle);
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +000049 canvas.clear(0x00000000);
50 SkColor colors[2];
51 colors[0] = SK_ColorWHITE;
52 colors[1] = SK_ColorBLACK;
53 SkAutoTUnref<SkShader> shader(
54 SkGradientShader::CreateRadial(SkPoint::Make(x, y), radius, colors, NULL, 2,
55 SkShader::kClamp_TileMode)
56 );
57 SkPaint paint;
58 paint.setShader(shader);
59 canvas.drawCircle(x, y, radius, paint);
60 }
61
mtklein36352bf2015-03-25 18:17:31 -070062 void onDraw(SkCanvas* canvas) override {
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +000063 if (!fInitialized) {
halcanary878fa022015-01-26 11:24:32 -080064 fCheckerboard.allocN32Pixels(64, 64);
65 SkCanvas checkerboardCanvas(fCheckerboard);
halcanaryb0cce2c2015-01-26 12:49:00 -080066 sk_tool_utils::draw_checkerboard(&checkerboardCanvas, 0xFFA0A0A0, 0xFF404040, 8);
halcanary878fa022015-01-26 11:24:32 -080067
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +000068 this->make_gradient_circle(64, 64);
69 fInitialized = true;
70 }
senorblanco16b254a2015-04-09 11:13:24 -070071 canvas->clear(SK_ColorBLACK);
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +000072
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000073 SkAutoTUnref<SkImageFilter> gradient(SkBitmapSource::Create(fGradientCircle));
74 SkAutoTUnref<SkImageFilter> checkerboard(SkBitmapSource::Create(fCheckerboard));
senorblanco@chromium.org47d98c82014-03-03 14:58:09 +000075 SkAutoTUnref<SkShader> noise(SkPerlinNoiseShader::CreateFractalNoise(
76 SkDoubleToScalar(0.1), SkDoubleToScalar(0.05), 1, 0));
senorblanco@chromium.orgfd0ec2c2014-03-25 17:35:10 +000077 SkMatrix resizeMatrix;
78 resizeMatrix.setScale(RESIZE_FACTOR_X, RESIZE_FACTOR_Y);
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +000079
80 SkImageFilter* filters[] = {
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000081 SkBlurImageFilter::Create(SkIntToScalar(12), SkIntToScalar(12)),
senorblancobc9845b2014-07-22 12:49:25 -070082 SkDropShadowImageFilter::Create(SkIntToScalar(10), SkIntToScalar(10),
sugoi234f0362014-10-23 13:59:52 -070083 SkIntToScalar(3), SkIntToScalar(3), SK_ColorGREEN,
84 SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode),
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000085 SkDisplacementMapEffect::Create(SkDisplacementMapEffect::kR_ChannelSelectorType,
86 SkDisplacementMapEffect::kR_ChannelSelectorType,
87 SkIntToScalar(12),
88 gradient.get(),
89 checkerboard.get()),
90 SkDilateImageFilter::Create(2, 2, checkerboard.get()),
91 SkErodeImageFilter::Create(2, 2, checkerboard.get()),
92 SkOffsetImageFilter::Create(SkIntToScalar(-16), SkIntToScalar(32)),
senorblanco8c874ee2015-03-20 06:38:17 -070093 SkImageFilter::CreateMatrixFilter(resizeMatrix, kNone_SkFilterQuality),
senorblanco@chromium.org47d98c82014-03-03 14:58:09 +000094 SkRectShaderImageFilter::Create(noise),
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +000095 };
96
97 SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
98 SkScalar margin = SkIntToScalar(16);
99 SkRect bounds = r;
100 bounds.outset(margin, margin);
101
102 for (int xOffset = 0; xOffset < 80; xOffset += 16) {
103 canvas->save();
104 bounds.fLeft = SkIntToScalar(xOffset);
105 for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
106 SkPaint paint;
107 paint.setColor(SK_ColorWHITE);
108 paint.setImageFilter(filters[i]);
109 paint.setAntiAlias(true);
110 canvas->save();
111 canvas->clipRect(bounds);
senorblanco@chromium.org897b73f2014-02-19 22:10:12 +0000112 if (5 == i) {
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +0000113 canvas->translate(SkIntToScalar(16), SkIntToScalar(-32));
senorblanco@chromium.org897b73f2014-02-19 22:10:12 +0000114 } else if (6 == i) {
115 canvas->scale(SkScalarInvert(RESIZE_FACTOR_X),
116 SkScalarInvert(RESIZE_FACTOR_Y));
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +0000117 }
reed80ea19c2015-05-12 10:37:34 -0700118 canvas->drawCircle(r.centerX(), r.centerY(), r.width() * 2 / 5, paint);
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +0000119 canvas->restore();
120 canvas->translate(r.width() + margin, 0);
121 }
122 canvas->restore();
123 canvas->translate(0, r.height() + margin);
124 }
senorblanco@chromium.org67117802014-02-06 00:36:01 +0000125
126 for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
127 SkSafeUnref(filters[i]);
128 }
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +0000129 }
130
131private:
132 bool fInitialized;
133 SkBitmap fCheckerboard;
134 SkBitmap fGradientCircle;
135 typedef GM INHERITED;
136};
137
138//////////////////////////////////////////////////////////////////////////////
139
140static GM* MyFactory(void*) { return new ImageFiltersClippedGM; }
141static GMRegistry reg(MyFactory);
142
143}