1/*
2 * Copyright 2013 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
8#include "gm.h"
9
10#include "SkPictureImageFilter.h"
11#include "SkPictureRecorder.h"
12
13// This GM exercises the SkPictureImageFilter ImageFilter class.
14
15class PictureImageFilterGM : public skiagm::GM {
16public:
17    PictureImageFilterGM() {
18    }
19
20protected:
21    SkString onShortName() override {
22        return SkString("pictureimagefilter");
23    }
24
25    void makePicture() {
26        SkPictureRecorder recorder;
27        SkCanvas* canvas = recorder.beginRecording(100, 100, nullptr, 0);
28        canvas->clear(SK_ColorBLACK);
29        SkPaint paint;
30        paint.setAntiAlias(true);
31        sk_tool_utils::set_portable_typeface(&paint);
32        paint.setColor(0xFFFFFFFF);
33        paint.setTextSize(SkIntToScalar(96));
34        const char* str = "e";
35        canvas->drawText(str, strlen(str), SkIntToScalar(20), SkIntToScalar(70), paint);
36        fPicture.reset(recorder.endRecording());
37    }
38
39    SkISize onISize() override { return SkISize::Make(600, 300); }
40
41    void onOnceBeforeDraw() override {
42        this->makePicture();
43    }
44
45    static void fillRectFiltered(SkCanvas* canvas, const SkRect& clipRect, SkImageFilter* filter) {
46        SkPaint paint;
47        paint.setImageFilter(filter);
48        canvas->save();
49        canvas->clipRect(clipRect);
50        canvas->drawPaint(paint);
51        canvas->restore();
52    }
53
54    void onDraw(SkCanvas* canvas) override {
55        canvas->clear(SK_ColorBLACK);
56        {
57            SkRect srcRect = SkRect::MakeXYWH(20, 20, 30, 30);
58            SkRect emptyRect = SkRect::MakeXYWH(20, 20, 0, 0);
59            SkRect bounds = SkRect::MakeXYWH(0, 0, 100, 100);
60            SkAutoTUnref<SkImageFilter> pictureSource(
61                SkPictureImageFilter::Create(fPicture));
62            SkAutoTUnref<SkImageFilter> pictureSourceSrcRect(
63                SkPictureImageFilter::Create(fPicture, srcRect));
64            SkAutoTUnref<SkImageFilter> pictureSourceEmptyRect(
65                SkPictureImageFilter::Create(fPicture, emptyRect));
66            SkAutoTUnref<SkImageFilter> pictureSourceResampled(
67                SkPictureImageFilter::CreateForLocalSpace(fPicture, fPicture->cullRect(),
68                    kLow_SkFilterQuality));
69            SkAutoTUnref<SkImageFilter> pictureSourcePixelated(
70                SkPictureImageFilter::CreateForLocalSpace(fPicture, fPicture->cullRect(),
71                    kNone_SkFilterQuality));
72
73            canvas->save();
74            // Draw the picture unscaled.
75            fillRectFiltered(canvas, bounds, pictureSource);
76            canvas->translate(SkIntToScalar(100), 0);
77
78            // Draw an unscaled subset of the source picture.
79            fillRectFiltered(canvas, bounds, pictureSourceSrcRect);
80            canvas->translate(SkIntToScalar(100), 0);
81
82            // Draw the picture to an empty rect (should draw nothing).
83            fillRectFiltered(canvas, bounds, pictureSourceEmptyRect);
84            canvas->translate(SkIntToScalar(100), 0);
85
86            canvas->restore();
87
88            // Draw the picture scaled
89            canvas->translate(0, SkIntToScalar(100));
90            canvas->scale(200 / srcRect.width(), 200 / srcRect.height());
91            canvas->translate(-srcRect.fLeft, -srcRect.fTop);
92            fillRectFiltered(canvas, srcRect, pictureSource);
93
94            // Draw the picture scaled, but rasterized at original resolution
95            canvas->translate(srcRect.width(), 0);
96            fillRectFiltered(canvas, srcRect, pictureSourceResampled);
97
98            // Draw the picture scaled, pixelated
99            canvas->translate(srcRect.width(), 0);
100            fillRectFiltered(canvas, srcRect, pictureSourcePixelated);
101        }
102    }
103
104private:
105    SkAutoTUnref<SkPicture> fPicture;
106    typedef GM INHERITED;
107};
108
109///////////////////////////////////////////////////////////////////////////////
110
111DEF_GM( return new PictureImageFilterGM; )
112