imagefiltersclipped.cpp revision 549c8991959333e5c0f53faebcbbd5d6bc8f6a56
1c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org/*
2c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org * Copyright 2014 Google Inc.
3c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org *
4c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be
5c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org * found in the LICENSE file.
6c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org */
7c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
8b0cce2c1d37d4bf5b89da6c70062209ac4e0e643halcanary#include "sk_tool_utils.h"
9c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkBlurImageFilter.h"
10878fa0204bc246ec5fbaca4aa3c81aaefccc30a1halcanary#include "SkColor.h"
11c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkDisplacementMapEffect.h"
12c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkDropShadowImageFilter.h"
13c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkGradientShader.h"
145598b63cd2443a608a74a222d0206bb2455383b7fmalita#include "SkImage.h"
155598b63cd2443a608a74a222d0206bb2455383b7fmalita#include "SkImageSource.h"
167b7ecfc046f7ec810482266db3430d1358b7a5bfsenorblanco#include "SkLightingImageFilter.h"
17c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkMorphologyImageFilter.h"
18c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkOffsetImageFilter.h"
1977b6ba3b6e23b84a3a4f3a62812e4a9eb6de4c23ajuma#include "SkPaintImageFilter.h"
2047d98c8e85924effc651b09df72027e6801c92a1senorblanco@chromium.org#include "SkPerlinNoiseShader.h"
217b7ecfc046f7ec810482266db3430d1358b7a5bfsenorblanco#include "SkPoint3.h"
22c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org#include "SkScalar.h"
235598b63cd2443a608a74a222d0206bb2455383b7fmalita#include "SkSurface.h"
24878fa0204bc246ec5fbaca4aa3c81aaefccc30a1halcanary#include "gm.h"
25c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
26897b73f62c012758bd8fef77c24d3573c847dbc3senorblanco@chromium.org#define RESIZE_FACTOR_X SkIntToScalar(2)
27897b73f62c012758bd8fef77c24d3573c847dbc3senorblanco@chromium.org#define RESIZE_FACTOR_Y SkIntToScalar(5)
28897b73f62c012758bd8fef77c24d3573c847dbc3senorblanco@chromium.org
29549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillipsstatic sk_sp<SkImage> make_gradient_circle(int width, int height) {
30549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    SkScalar x = SkIntToScalar(width / 2);
31549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    SkScalar y = SkIntToScalar(height / 2);
32549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    SkScalar radius = SkMinScalar(x, y) * 0.8f;
33549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    auto surface(SkSurface::MakeRasterN32Premul(width, height));
34549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    SkCanvas* canvas = surface->getCanvas();
35549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    canvas->clear(0x00000000);
36549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    SkColor colors[2];
37549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    colors[0] = SK_ColorWHITE;
38549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    colors[1] = SK_ColorBLACK;
39549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    SkPaint paint;
40549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    paint.setShader(SkGradientShader::MakeRadial(SkPoint::Make(x, y), radius, colors, nullptr,
41549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips        2, SkShader::kClamp_TileMode));
42549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    canvas->drawCircle(x, y, radius, paint);
43549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    return surface->makeImageSnapshot();
44549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips}
45549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips
46549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillipsstatic void draw_clipped_filter(SkCanvas* canvas, SkImageFilter* filter, size_t i,
47549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips                                const SkRect& primBounds, const SkRect& clipBounds) {
48549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    SkPaint paint;
49549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    paint.setColor(SK_ColorWHITE);
50549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    paint.setImageFilter(filter);
51549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    paint.setAntiAlias(true);
52549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    canvas->save();
53549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    canvas->clipRect(clipBounds);
54549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    if (5 == i) {
55549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips        canvas->translate(SkIntToScalar(16), SkIntToScalar(-32));
56549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    } else if (6 == i) {
57549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips        canvas->scale(SkScalarInvert(RESIZE_FACTOR_X), SkScalarInvert(RESIZE_FACTOR_Y));
58549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    }
59549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    canvas->drawCircle(primBounds.centerX(), primBounds.centerY(),
60549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips                       primBounds.width() * 2 / 5, paint);
61549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips    canvas->restore();
62549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips}
63549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips
64c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgnamespace skiagm {
65c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
66c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgclass ImageFiltersClippedGM : public GM {
67c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgpublic:
68943a462fef57832e2683894bb9f2f36ac25d98f7robertphillips    ImageFiltersClippedGM() {
69c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        this->setBGColor(0x00000000);
70c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    }
71c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
72c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgprotected:
7336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
74c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        return SkString("imagefiltersclipped");
75c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    }
76c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
7736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override {
78f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(860, 500);
79c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    }
80c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
81943a462fef57832e2683894bb9f2f36ac25d98f7robertphillips    void onOnceBeforeDraw() override {
829ce9d6772df650ceb0511f275e1a83dffa78ff72reed        fCheckerboard = SkImage::MakeFromBitmap
839ce9d6772df650ceb0511f275e1a83dffa78ff72reed            (sk_tool_utils::create_checkerboard_bitmap(64, 64, 0xFFA0A0A0, 0xFF404040, 8));
84549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips        fGradientCircle = make_gradient_circle(64, 64);
85943a462fef57832e2683894bb9f2f36ac25d98f7robertphillips    }
86878fa0204bc246ec5fbaca4aa3c81aaefccc30a1halcanary
87943a462fef57832e2683894bb9f2f36ac25d98f7robertphillips    void onDraw(SkCanvas* canvas) override {
8816b254a200f63e85041cac9a283ff0ff14d94ba1senorblanco        canvas->clear(SK_ColorBLACK);
89c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
90549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips        sk_sp<SkImageFilter> gradient(SkImageSource::Make(fGradientCircle));
91549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips        sk_sp<SkImageFilter> checkerboard(SkImageSource::Make(fCheckerboard));
92fd0ec2c76a27ce26a62da23eb75017839959e7cbsenorblanco@chromium.org        SkMatrix resizeMatrix;
93fd0ec2c76a27ce26a62da23eb75017839959e7cbsenorblanco@chromium.org        resizeMatrix.setScale(RESIZE_FACTOR_X, RESIZE_FACTOR_Y);
947b7ecfc046f7ec810482266db3430d1358b7a5bfsenorblanco        SkPoint3 pointLocation = SkPoint3::Make(32, 32, SkIntToScalar(10));
95c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
96c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        SkImageFilter* filters[] = {
97cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkBlurImageFilter::Create(SkIntToScalar(12), SkIntToScalar(12)),
98bc9845bb60cd883e7ddabb21f04997602145a1adsenorblanco            SkDropShadowImageFilter::Create(SkIntToScalar(10), SkIntToScalar(10),
99234f036b3e731e06e616c5291157d3bb4fbfdee2sugoi                SkIntToScalar(3), SkIntToScalar(3), SK_ColorGREEN,
100234f036b3e731e06e616c5291157d3bb4fbfdee2sugoi                SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode),
101cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkDisplacementMapEffect::Create(SkDisplacementMapEffect::kR_ChannelSelectorType,
102cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                            SkDisplacementMapEffect::kR_ChannelSelectorType,
103cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                            SkIntToScalar(12),
104cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                            gradient.get(),
105cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                            checkerboard.get()),
106cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkDilateImageFilter::Create(2, 2, checkerboard.get()),
107cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkErodeImageFilter::Create(2, 2, checkerboard.get()),
10851a315eff9b86bd60e7884240c4efc199129d37arobertphillips            SkOffsetImageFilter::Make(SkIntToScalar(-16),
10951a315eff9b86bd60e7884240c4efc199129d37arobertphillips                                      SkIntToScalar(32),
11051a315eff9b86bd60e7884240c4efc199129d37arobertphillips                                      nullptr).release(),
1118c874eee943bdea0fab5b4d2707083c863e37c55senorblanco            SkImageFilter::CreateMatrixFilter(resizeMatrix, kNone_SkFilterQuality),
112549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips            SkLightingImageFilter::CreatePointLitDiffuse(pointLocation, SK_ColorWHITE, SK_Scalar1,
113549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips                                                         SkIntToScalar(2), checkerboard.get()),
1147b7ecfc046f7ec810482266db3430d1358b7a5bfsenorblanco
115c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        };
116c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
117c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
118c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        SkScalar margin = SkIntToScalar(16);
119c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        SkRect bounds = r;
120c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        bounds.outset(margin, margin);
121c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
12202781977e00d88a7b0a3bbd6de158a9f3fecfd46jvanverth        canvas->save();
123c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        for (int xOffset = 0; xOffset < 80; xOffset += 16) {
124c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            canvas->save();
125c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            bounds.fLeft = SkIntToScalar(xOffset);
126c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
12702781977e00d88a7b0a3bbd6de158a9f3fecfd46jvanverth                draw_clipped_filter(canvas, filters[i], i, r, bounds);
128c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org                canvas->translate(r.width() + margin, 0);
129c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            }
130c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            canvas->restore();
131c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org            canvas->translate(0, r.height() + margin);
132c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org        }
13302781977e00d88a7b0a3bbd6de158a9f3fecfd46jvanverth        canvas->restore();
13467117808ee73bee5454442af75e7d8ebdbfd00e3senorblanco@chromium.org
13567117808ee73bee5454442af75e7d8ebdbfd00e3senorblanco@chromium.org        for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
13667117808ee73bee5454442af75e7d8ebdbfd00e3senorblanco@chromium.org            SkSafeUnref(filters[i]);
13767117808ee73bee5454442af75e7d8ebdbfd00e3senorblanco@chromium.org        }
13802781977e00d88a7b0a3bbd6de158a9f3fecfd46jvanverth
13977b6ba3b6e23b84a3a4f3a62812e4a9eb6de4c23ajuma        SkPaint noisePaint;
140549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips        noisePaint.setShader(SkPerlinNoiseShader::MakeFractalNoise(0.1f, 0.05f, 1, 0));
141549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips
142372177ee115d46dfb5bfb881a408e6c37ae83678robertphillips        sk_sp<SkImageFilter> rectFilter(SkPaintImageFilter::Make(noisePaint));
14302781977e00d88a7b0a3bbd6de158a9f3fecfd46jvanverth        canvas->translate(SK_ARRAY_COUNT(filters)*(r.width() + margin), 0);
14402781977e00d88a7b0a3bbd6de158a9f3fecfd46jvanverth        for (int xOffset = 0; xOffset < 80; xOffset += 16) {
14502781977e00d88a7b0a3bbd6de158a9f3fecfd46jvanverth            bounds.fLeft = SkIntToScalar(xOffset);
146372177ee115d46dfb5bfb881a408e6c37ae83678robertphillips            draw_clipped_filter(canvas, rectFilter.get(), 0, r, bounds);
14702781977e00d88a7b0a3bbd6de158a9f3fecfd46jvanverth            canvas->translate(0, r.height() + margin);
14802781977e00d88a7b0a3bbd6de158a9f3fecfd46jvanverth        }
149c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    }
150c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
151c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.orgprivate:
1529ce9d6772df650ceb0511f275e1a83dffa78ff72reed    sk_sp<SkImage> fCheckerboard, fGradientCircle;
153943a462fef57832e2683894bb9f2f36ac25d98f7robertphillips
154c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    typedef GM INHERITED;
155c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org};
156c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
157c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org//////////////////////////////////////////////////////////////////////////////
158c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
159943a462fef57832e2683894bb9f2f36ac25d98f7robertphillipsDEF_GM(return new ImageFiltersClippedGM;)
160c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org}
161