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