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    virtual SkString onShortName() SK_OVERRIDE {
22        return SkString("pictureimagefilter");
23    }
24
25    void makePicture() {
26        SkPictureRecorder recorder;
27        SkCanvas* canvas = recorder.beginRecording(100, 100, NULL, 0);
28        canvas->clear(0x00000000);
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    virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(500, 150); }
40
41    virtual void onOnceBeforeDraw() SK_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    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
55        canvas->clear(0x00000000);
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(SkPictureImageFilter::Create(fPicture));
61            SkAutoTUnref<SkImageFilter> pictureSourceSrcRect(SkPictureImageFilter::Create(fPicture, srcRect));
62            SkAutoTUnref<SkImageFilter> pictureSourceEmptyRect(SkPictureImageFilter::Create(fPicture, emptyRect));
63
64            // Draw the picture unscaled.
65            fillRectFiltered(canvas, bounds, pictureSource);
66            canvas->translate(SkIntToScalar(100), 0);
67
68            // Draw an unscaled subset of the source picture.
69            fillRectFiltered(canvas, bounds, pictureSourceSrcRect);
70            canvas->translate(SkIntToScalar(100), 0);
71
72            // Draw the picture to an empty rect (should draw nothing).
73            fillRectFiltered(canvas, bounds, pictureSourceEmptyRect);
74            canvas->translate(SkIntToScalar(100), 0);
75        }
76    }
77
78    // SkPictureImageFilter doesn't support serialization yet.
79    virtual uint32_t onGetFlags() const SK_OVERRIDE {
80        return kSkipPicture_Flag            |
81               kSkipPipe_Flag               |
82               kSkipPipeCrossProcess_Flag   |
83               kSkipTiled_Flag              |
84               kSkipScaledReplay_Flag;
85    }
86
87private:
88    SkAutoTUnref<SkPicture> fPicture;
89    typedef GM INHERITED;
90};
91
92///////////////////////////////////////////////////////////////////////////////
93
94DEF_GM( return new PictureImageFilterGM; )
95