1118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org/*
2118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org * Copyright 2014 Google Inc.
3118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org *
4118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be
5118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org * found in the LICENSE file.
6118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org */
7118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
8118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "gm.h"
9118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkCanvas.h"
10118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkColorFilter.h"
11118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkColorPriv.h"
12118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkShader.h"
13118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
14118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkBitmapSource.h"
15118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkBlurImageFilter.h"
16118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkColorMatrixFilter.h"
17118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkDisplacementMapEffect.h"
18118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkDropShadowImageFilter.h"
19118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkGradientShader.h"
20118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkMorphologyImageFilter.h"
21118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkColorFilterImageFilter.h"
22118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkMergeImageFilter.h"
23118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org#include "SkOffsetImageFilter.h"
24118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
25118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org///////////////////////////////////////////////////////////////////////////////
26118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
27118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.orgclass ImageFiltersCropExpandGM : public skiagm::GM {
28118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.orgpublic:
29118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org    ImageFiltersCropExpandGM () {}
30118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
31118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.orgprotected:
32118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
33118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org    virtual SkString onShortName() {
34118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        return SkString("imagefilterscropexpand");
35118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org    }
36118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
37118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org    virtual SkISize onISize() { return SkISize::Make(570, 650); }
38118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
39118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org    void make_checkerboard(SkBitmap* bitmap) {
40118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        bitmap->allocN32Pixels(64, 64);
41118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkCanvas canvas(*bitmap);
42118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        canvas.clear(0xFFFF0000);
43118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkPaint darkPaint;
44118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        darkPaint.setColor(0xFF404040);
45118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkPaint lightPaint;
46118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        lightPaint.setColor(0xFFA0A0A0);
47118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        for (int y = 8; y < 48; y += 16) {
48118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org            for (int x = 8; x < 48; x += 16) {
49118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                canvas.save();
50118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                canvas.translate(SkIntToScalar(x), SkIntToScalar(y));
51118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint);
52118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint);
53118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint);
54118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint);
55118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                canvas.restore();
56118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org            }
57118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        }
58118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org    }
59118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
60118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org    void make_gradient_circle(int width, int height, SkBitmap* bitmap) {
61118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkScalar x = SkIntToScalar(width / 2);
62118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkScalar y = SkIntToScalar(height / 2);
63118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkScalar radius = SkMinScalar(x, y) * 0.8f;
64118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        bitmap->allocN32Pixels(width, height);
65118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkCanvas canvas(*bitmap);
66118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        canvas.clear(0x00000000);
67118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkColor colors[2];
68118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        colors[0] = SK_ColorWHITE;
69118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        colors[1] = SK_ColorBLACK;
70118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkAutoTUnref<SkShader> shader(
71118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org            SkGradientShader::CreateRadial(SkPoint::Make(x, y), radius, colors, NULL, 2,
72118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                                           SkShader::kClamp_TileMode)
73118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        );
74118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkPaint paint;
75118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        paint.setShader(shader);
76118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        canvas.drawCircle(x, y, radius, paint);
77118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org    }
78118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
79118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org    static void draw(SkCanvas* canvas, const SkBitmap& bitmap, const SkRect& rect, SkImageFilter* filter) {
80118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkPaint paint;
81118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        paint.setImageFilter(filter)->unref();
82118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        canvas->saveLayer(&rect, &paint);
83118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        canvas->drawBitmap(bitmap, 0, 0);
84118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        canvas->restore();
85f0f9f5f904a3f9a5c0e42ea19dafe6ae3c2ef8d0skia.committer@gmail.com
86118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkPaint strokePaint;
87118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        strokePaint.setColor(0xFFFF0000);
88118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        strokePaint.setStyle(SkPaint::kStroke_Style);
89118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        canvas->drawRect(rect, strokePaint);
90118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
91118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        canvas->translate(SkIntToScalar(80), 0);
92118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org    }
93118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
94118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org    virtual void onDraw(SkCanvas* canvas) {
95118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkAutoTUnref<SkColorFilter> cf(
96118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org            SkColorFilter::CreateModeFilter(SK_ColorBLUE, SkXfermode::kSrcIn_Mode));
97118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkImageFilter::CropRect crop_rect(
98118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org            SkRect::Make(SkIRect::MakeXYWH(10, 10, 44, 44)),
99118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org            SkImageFilter::CropRect::kHasAll_CropEdge);
100118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
101118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkBitmap gradient_circle, checkerboard;
102118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        make_gradient_circle(64, 64, &gradient_circle);
103118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        make_checkerboard(&checkerboard);
104118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
105118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkAutoTUnref<SkImageFilter> gradient_circle_source(
106118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org            SkBitmapSource::Create(gradient_circle));
107118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkAutoTUnref<SkImageFilter> noop_cropped(
108118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org            SkOffsetImageFilter::Create(0, 0, NULL, &crop_rect));
109118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkScalar sk255 = SkIntToScalar(255);
110118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkScalar matrix[20] = { 1, 0, 0, 0, 0,
111118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                                0, 1, 0, 0, sk255,
112118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                                0, 0, 1, 0, 0,
113118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                                0, 0, 0, 0, sk255 };
114118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkAutoTUnref<SkColorFilter> cf_alpha_trans(SkColorMatrixFilter::Create(matrix));
115118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
116118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
117118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkScalar MARGIN = SkIntToScalar(12);
118118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
119118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkIRect bounds;
120118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        r.roundOut(&bounds);
121118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
122118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        SkPaint paint;
123118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        canvas->translate(MARGIN, MARGIN);
124118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        for (int outset = -15; outset <= 20; outset += 5) {
125118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org            canvas->save();
126118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org            SkRect rect = crop_rect.rect();
127118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org            rect.outset(SkIntToScalar(outset),
128118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                        SkIntToScalar(outset));
129118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org            SkImageFilter::CropRect big_rect(rect, SkImageFilter::CropRect::kHasAll_CropEdge);
130f0f9f5f904a3f9a5c0e42ea19dafe6ae3c2ef8d0skia.committer@gmail.com
131118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org            draw(canvas, checkerboard, rect, SkColorFilterImageFilter::Create(
132118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                cf_alpha_trans, noop_cropped.get(), &big_rect));
133118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
134118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org            draw(canvas, checkerboard, rect, SkBlurImageFilter::Create(
135118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                8.0f, 8.0f, noop_cropped.get(), &big_rect));
136118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
137118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org            draw(canvas, checkerboard, rect, SkDilateImageFilter::Create(
138118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                2, 2, noop_cropped.get(), &big_rect));
139118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
140118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org            draw(canvas, checkerboard, rect, SkErodeImageFilter::Create(
141118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                2, 2, noop_cropped.get(), &big_rect));
142118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
143118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org            draw(canvas, checkerboard, rect, SkDropShadowImageFilter::Create(
144118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                SkIntToScalar(10), SkIntToScalar(10), SkIntToScalar(3), SkIntToScalar(3),
145118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                SK_ColorBLUE, noop_cropped.get(), &big_rect));
146118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
147118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org            draw(canvas, checkerboard, rect, SkDisplacementMapEffect::Create(
148118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                SkDisplacementMapEffect::kR_ChannelSelectorType,
149118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                SkDisplacementMapEffect::kR_ChannelSelectorType,
150118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                SkIntToScalar(12),
151118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                gradient_circle_source.get(),
152118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                noop_cropped.get(),
153118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                &big_rect));
154118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
155118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org            draw(canvas, checkerboard, rect, SkOffsetImageFilter::Create(
156118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org                SkIntToScalar(-8), SkIntToScalar(16), noop_cropped.get(), &big_rect));
157118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
158118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org            canvas->restore();
159118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org            canvas->translate(0, SkIntToScalar(80));
160118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org        }
161118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org    }
162118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
163118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.orgprivate:
164118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org    typedef GM INHERITED;
165118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org};
166118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
167118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org///////////////////////////////////////////////////////////////////////////////
168118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.org
169118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.orgstatic skiagm::GM* MyFactory(void*) { return new ImageFiltersCropExpandGM; }
170118252962f89a80db661a0544f1bd61cbaab6321senorblanco@chromium.orgstatic skiagm::GMRegistry reg(MyFactory);
171