blob: 9a80964a0e6e595777d60cb0c30a1634cc1ed4aa [file] [log] [blame]
senorblanco@chromium.org2bfe36b2014-01-20 19:58:28 +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.org2bfe36b2014-01-20 19:58:28 +00009#include "SkBitmapSource.h"
10#include "SkBlurImageFilter.h"
halcanary878fa022015-01-26 11:24:32 -080011#include "SkColor.h"
senorblanco@chromium.org2bfe36b2014-01-20 19:58:28 +000012#include "SkDisplacementMapEffect.h"
13#include "SkDropShadowImageFilter.h"
14#include "SkGradientShader.h"
commit-bot@chromium.org1037d922014-03-13 19:45:41 +000015#include "SkLightingImageFilter.h"
senorblanco@chromium.org2bfe36b2014-01-20 19:58:28 +000016#include "SkMorphologyImageFilter.h"
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +000017#include "SkOffsetImageFilter.h"
senorblanco@chromium.org47d98c82014-03-03 14:58:09 +000018#include "SkPerlinNoiseShader.h"
19#include "SkRectShaderImageFilter.h"
senorblanco@chromium.org2bfe36b2014-01-20 19:58:28 +000020#include "SkScalar.h"
halcanary878fa022015-01-26 11:24:32 -080021#include "gm.h"
senorblanco@chromium.org2bfe36b2014-01-20 19:58:28 +000022
senorblanco@chromium.org897b73f2014-02-19 22:10:12 +000023#define RESIZE_FACTOR SkIntToScalar(4)
24
senorblanco@chromium.org2bfe36b2014-01-20 19:58:28 +000025namespace skiagm {
26
27class ImageFiltersScaledGM : public GM {
28public:
29 ImageFiltersScaledGM() : fInitialized(false) {
30 this->setBGColor(0x00000000);
31 }
32
33protected:
commit-bot@chromium.orga90c6802014-04-30 13:20:45 +000034
senorblanco@chromium.org2bfe36b2014-01-20 19:58:28 +000035 virtual SkString onShortName() {
36 return SkString("imagefiltersscaled");
37 }
38
39 virtual SkISize onISize() {
tfarinaf5393182014-06-09 23:59:03 -070040 return SkISize::Make(1428, 500);
senorblanco@chromium.org2bfe36b2014-01-20 19:58:28 +000041 }
42
senorblanco@chromium.org2bfe36b2014-01-20 19:58:28 +000043 void make_gradient_circle(int width, int height) {
44 SkScalar x = SkIntToScalar(width / 2);
45 SkScalar y = SkIntToScalar(height / 2);
46 SkScalar radius = SkScalarMul(SkMinScalar(x, y), SkIntToScalar(4) / SkIntToScalar(5));
reed@google.comeb9a46c2014-01-25 16:46:20 +000047 fGradientCircle.allocN32Pixels(width, height);
commit-bot@chromium.orgc3bd8af2014-02-13 17:14:46 +000048 SkCanvas canvas(fGradientCircle);
senorblanco@chromium.org2bfe36b2014-01-20 19:58:28 +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
62 virtual void onDraw(SkCanvas* canvas) {
63 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.org2bfe36b2014-01-20 19:58:28 +000068 this->make_gradient_circle(64, 64);
69 fInitialized = true;
70 }
senorblanco16b254a2015-04-09 11:13:24 -070071 canvas->clear(SK_ColorBLACK);
senorblanco@chromium.org2bfe36b2014-01-20 19:58:28 +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.org2bfe36b2014-01-20 19:58:28 +000077
commit-bot@chromium.org1037d922014-03-13 19:45:41 +000078 SkPoint3 pointLocation(0, 0, SkIntToScalar(10));
79 SkPoint3 spotLocation(SkIntToScalar(-10), SkIntToScalar(-10), SkIntToScalar(20));
80 SkPoint3 spotTarget(SkIntToScalar(40), SkIntToScalar(40), 0);
81 SkScalar spotExponent = SK_Scalar1;
82 SkScalar cutoffAngle = SkIntToScalar(15);
83 SkScalar kd = SkIntToScalar(2);
84 SkScalar surfaceScale = SkIntToScalar(1);
85 SkColor white(0xFFFFFFFF);
senorblanco@chromium.orgfd0ec2c2014-03-25 17:35:10 +000086 SkMatrix resizeMatrix;
87 resizeMatrix.setScale(RESIZE_FACTOR, RESIZE_FACTOR);
commit-bot@chromium.org1037d922014-03-13 19:45:41 +000088
senorblanco@chromium.org2bfe36b2014-01-20 19:58:28 +000089 SkImageFilter* filters[] = {
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000090 SkBlurImageFilter::Create(SkIntToScalar(4), SkIntToScalar(4)),
senorblancobc9845b2014-07-22 12:49:25 -070091 SkDropShadowImageFilter::Create(SkIntToScalar(5), SkIntToScalar(10),
sugoi234f0362014-10-23 13:59:52 -070092 SkIntToScalar(3), SkIntToScalar(3), SK_ColorYELLOW,
93 SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode),
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000094 SkDisplacementMapEffect::Create(SkDisplacementMapEffect::kR_ChannelSelectorType,
95 SkDisplacementMapEffect::kR_ChannelSelectorType,
96 SkIntToScalar(12),
97 gradient.get(),
98 checkerboard.get()),
99 SkDilateImageFilter::Create(1, 1, checkerboard.get()),
100 SkErodeImageFilter::Create(1, 1, checkerboard.get()),
101 SkOffsetImageFilter::Create(SkIntToScalar(32), 0),
senorblanco8c874ee2015-03-20 06:38:17 -0700102 SkImageFilter::CreateMatrixFilter(resizeMatrix, kNone_SkFilterQuality),
senorblanco@chromium.org47d98c82014-03-03 14:58:09 +0000103 SkRectShaderImageFilter::Create(noise),
commit-bot@chromium.org1037d922014-03-13 19:45:41 +0000104 SkLightingImageFilter::CreatePointLitDiffuse(pointLocation, white, surfaceScale, kd),
105 SkLightingImageFilter::CreateSpotLitDiffuse(spotLocation, spotTarget, spotExponent,
106 cutoffAngle, white, surfaceScale, kd),
senorblanco@chromium.org2bfe36b2014-01-20 19:58:28 +0000107 };
108
109 SkVector scales[] = {
110 SkVector::Make(SkScalarInvert(2), SkScalarInvert(2)),
111 SkVector::Make(SkIntToScalar(1), SkIntToScalar(1)),
112 SkVector::Make(SkIntToScalar(1), SkIntToScalar(2)),
113 SkVector::Make(SkIntToScalar(2), SkIntToScalar(1)),
114 SkVector::Make(SkIntToScalar(2), SkIntToScalar(2)),
115 };
116
117 SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
118 SkScalar margin = SkIntToScalar(16);
119 SkRect bounds = r;
120 bounds.outset(margin, margin);
121
122 for (size_t j = 0; j < SK_ARRAY_COUNT(scales); ++j) {
123 canvas->save();
124 for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
125 SkPaint paint;
126 paint.setColor(SK_ColorBLUE);
127 paint.setImageFilter(filters[i]);
128 paint.setAntiAlias(true);
129 canvas->save();
130 canvas->scale(scales[j].fX, scales[j].fY);
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +0000131 if (5 == i) {
132 canvas->translate(SkIntToScalar(-32), 0);
senorblanco@chromium.org897b73f2014-02-19 22:10:12 +0000133 } else if (6 == i) {
134 canvas->scale(SkScalarInvert(RESIZE_FACTOR),
135 SkScalarInvert(RESIZE_FACTOR));
senorblanco@chromium.orgc4b12f12014-02-05 17:51:22 +0000136 }
reed80ea19c2015-05-12 10:37:34 -0700137 canvas->drawCircle(r.centerX(), r.centerY(), r.width()*2/5, paint);
senorblanco@chromium.org2bfe36b2014-01-20 19:58:28 +0000138 canvas->restore();
139 canvas->translate(r.width() * scales[j].fX + margin, 0);
140 }
141 canvas->restore();
142 canvas->translate(0, r.height() * scales[j].fY + margin);
143 }
144
145 for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
146 filters[i]->unref();
147 }
148 }
149
150private:
151 bool fInitialized;
152 SkBitmap fCheckerboard;
153 SkBitmap fGradientCircle;
154 typedef GM INHERITED;
155};
156
157//////////////////////////////////////////////////////////////////////////////
158
159static GM* MyFactory(void*) { return new ImageFiltersScaledGM; }
160static GMRegistry reg(MyFactory);
161
162}