1d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org/*
2d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org * Copyright 2013 Google Inc.
3d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org *
4d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be
5d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org * found in the LICENSE file.
6d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org */
7d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
8d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org#include "gm.h"
9d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org#include "SkColorFilter.h"
10d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
11d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org#include "SkColorFilterImageFilter.h"
12d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org#include "SkDropShadowImageFilter.h"
13d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
14d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org///////////////////////////////////////////////////////////////////////////////
15d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
16d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.orgstatic void draw_paint(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
17d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    SkPaint paint;
18d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    paint.setImageFilter(imf);
19d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    paint.setColor(SK_ColorBLACK);
20d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    canvas->save();
21d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    canvas->clipRect(r);
22d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    canvas->drawPaint(paint);
23d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    canvas->restore();
24d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org}
25d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
26d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.orgstatic void draw_path(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
27d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    SkPaint paint;
28d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    paint.setColor(SK_ColorGREEN);
29d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    paint.setImageFilter(imf);
30d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    paint.setAntiAlias(true);
31d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    canvas->save();
32d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    canvas->clipRect(r);
33d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    canvas->drawCircle(r.centerX(), r.centerY(), r.width()/3, paint);
34d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    canvas->restore();
35d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org}
36d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
37d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.orgstatic void draw_text(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
38d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    SkPaint paint;
39d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    paint.setImageFilter(imf);
40d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    paint.setColor(SK_ColorGREEN);
41d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    paint.setAntiAlias(true);
42992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    sk_tool_utils::set_portable_typeface(&paint);
43d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    paint.setTextSize(r.height()/2);
44d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    paint.setTextAlign(SkPaint::kCenter_Align);
45d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    canvas->save();
46d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    canvas->clipRect(r);
47d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    canvas->drawText("Text", 4, r.centerX(), r.centerY(), paint);
48d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    canvas->restore();
49d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org}
50d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
51d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.orgstatic void draw_bitmap(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
52d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    SkPaint paint;
53d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
54d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    SkIRect bounds;
55d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    r.roundOut(&bounds);
56d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
57d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    SkBitmap bm;
58eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com    bm.allocN32Pixels(bounds.width(), bounds.height());
59d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    bm.eraseColor(SK_ColorTRANSPARENT);
60d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    SkCanvas c(bm);
61d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    draw_path(&c, r, NULL);
62d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
63d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    paint.setImageFilter(imf);
64d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    canvas->save();
65d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    canvas->clipRect(r);
66d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    canvas->drawBitmap(bm, 0, 0, &paint);
67d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    canvas->restore();
68d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org}
69d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
70d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.orgstatic void draw_sprite(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
71d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    SkPaint paint;
72d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
73d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    SkIRect bounds;
74d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    r.roundOut(&bounds);
75d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
76d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    SkBitmap bm;
77eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com    bm.allocN32Pixels(bounds.width(), bounds.height());
78d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    bm.eraseColor(SK_ColorRED);
79d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    SkCanvas c(bm);
80d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
81d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    SkIRect cropRect = SkIRect::MakeXYWH(10, 10, 44, 44);
82d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    paint.setColor(SK_ColorGREEN);
83d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    c.drawRect(SkRect::Make(cropRect), paint);
84d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
85d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    paint.setImageFilter(imf);
86d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    SkPoint loc = { r.fLeft, r.fTop };
87d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    canvas->getTotalMatrix().mapPoints(&loc, 1);
88d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    canvas->drawSprite(bm,
89d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org                       SkScalarRoundToInt(loc.fX), SkScalarRoundToInt(loc.fY),
90d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org                       &paint);
91d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org}
92d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
93d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org///////////////////////////////////////////////////////////////////////////////
94d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
95d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.orgclass DropShadowImageFilterGM : public skiagm::GM {
96d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.orgpublic:
97d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    DropShadowImageFilterGM () {}
98d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
99d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.orgprotected:
100d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
101d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    virtual SkString onShortName() {
102d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        return SkString("dropshadowimagefilter");
103d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    }
104d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
105d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    virtual SkISize onISize() { return SkISize::Make(400, 700); }
106d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
107d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    void draw_frame(SkCanvas* canvas, const SkRect& r) {
108d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        SkPaint paint;
109d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        paint.setStyle(SkPaint::kStroke_Style);
110d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        paint.setColor(SK_ColorRED);
111d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        canvas->drawRect(r, paint);
112d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    }
113d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
114d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    virtual uint32_t onGetFlags() const {
115d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        // Because of the use of drawSprite, this test is excluded
116d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        // from scaled replay tests because drawSprite ignores the
117d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        // reciprocal scale that is applied at record time, which is
118d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        // the intended behavior of drawSprite.
119a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipScaledReplay_Flag | kSkipTiled_Flag;
120d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    }
121d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
122d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    virtual void onDraw(SkCanvas* canvas) {
123d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        void (*drawProc[])(SkCanvas*, const SkRect&, SkImageFilter*) = {
124d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org            draw_sprite, draw_bitmap, draw_path, draw_paint, draw_text
125d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        };
126d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
127d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        SkAutoTUnref<SkColorFilter> cf(
128d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org            SkColorFilter::CreateModeFilter(SK_ColorMAGENTA, SkXfermode::kSrcIn_Mode));
129d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        SkAutoTUnref<SkImageFilter> cfif(SkColorFilterImageFilter::Create(cf.get()));
130d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        SkImageFilter::CropRect cropRect(SkRect::Make(SkIRect::MakeXYWH(10, 10, 44, 44)),
131d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org                                         SkImageFilter::CropRect::kHasAll_CropEdge);
132d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        SkImageFilter::CropRect bogusRect(SkRect::Make(SkIRect::MakeXYWH(-100, -100, 10, 10)),
133d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org                                          SkImageFilter::CropRect::kHasAll_CropEdge);
134d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
135d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        SkImageFilter* filters[] = {
136d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org            NULL,
137cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkDropShadowImageFilter::Create(7.0f, 0.0f, 0.0f, 3.0f, SK_ColorBLUE),
138cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkDropShadowImageFilter::Create(0.0f, 7.0f, 3.0f, 0.0f, SK_ColorBLUE),
139cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkDropShadowImageFilter::Create(7.0f, 7.0f, 3.0f, 3.0f, SK_ColorBLUE),
140cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkDropShadowImageFilter::Create(7.0f, 7.0f, 3.0f, 3.0f, SK_ColorBLUE, cfif),
141cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkDropShadowImageFilter::Create(7.0f, 7.0f, 3.0f, 3.0f, SK_ColorBLUE, NULL, &cropRect),
142cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org            SkDropShadowImageFilter::Create(7.0f, 7.0f, 3.0f, 3.0f, SK_ColorBLUE, NULL, &bogusRect),
143d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        };
144d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
145d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
146d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        SkScalar MARGIN = SkIntToScalar(16);
147d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        SkScalar DX = r.width() + MARGIN;
148d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        SkScalar DY = r.height() + MARGIN;
149d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
150d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        canvas->translate(MARGIN, MARGIN);
151d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        for (size_t j = 0; j < SK_ARRAY_COUNT(drawProc); ++j) {
152d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org            canvas->save();
153d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org            for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
154d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org                drawProc[j](canvas, r, filters[i]);
155d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org                canvas->translate(0, DY);
156d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org            }
157d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org            canvas->restore();
158d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org            canvas->translate(DX, 0);
159d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        }
160d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
161d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        for(size_t j = 0; j < SK_ARRAY_COUNT(filters); ++j) {
162d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org            SkSafeUnref(filters[j]);
163d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org        }
164d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    }
165d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
166d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.orgprivate:
167d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org    typedef GM INHERITED;
168d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org};
169d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
170d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org///////////////////////////////////////////////////////////////////////////////
171d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.org
172d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.orgstatic skiagm::GM* MyFactory(void*) { return new DropShadowImageFilterGM; }
173d8f82a4c44b844fed98d3ecc0072e0626b06bb37senorblanco@chromium.orgstatic skiagm::GMRegistry reg(MyFactory);
174