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        paint.setColor(0xFFFFFFFF);
32        paint.setTextSize(SkIntToScalar(96));
33        const char* str = "e";
34        canvas->drawText(str, strlen(str), SkIntToScalar(20), SkIntToScalar(70), paint);
35        fPicture.reset(recorder.endRecording());
36    }
37
38    virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(500, 150); }
39
40    virtual void onOnceBeforeDraw() SK_OVERRIDE {
41        this->makePicture();
42    }
43
44    static void fillRectFiltered(SkCanvas* canvas, const SkRect& clipRect, SkImageFilter* filter) {
45        SkPaint paint;
46        paint.setImageFilter(filter);
47        canvas->save();
48        canvas->clipRect(clipRect);
49        canvas->drawPaint(paint);
50        canvas->restore();
51    }
52
53    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
54        canvas->clear(0x00000000);
55        {
56            SkRect srcRect = SkRect::MakeXYWH(20, 20, 30, 30);
57            SkRect emptyRect = SkRect::MakeXYWH(20, 20, 0, 0);
58            SkRect bounds = SkRect::MakeXYWH(0, 0, 100, 100);
59            SkAutoTUnref<SkImageFilter> pictureSource(SkPictureImageFilter::Create(fPicture));
60            SkAutoTUnref<SkImageFilter> pictureSourceSrcRect(SkPictureImageFilter::Create(fPicture, srcRect));
61            SkAutoTUnref<SkImageFilter> pictureSourceEmptyRect(SkPictureImageFilter::Create(fPicture, emptyRect));
62
63            // Draw the picture unscaled.
64            fillRectFiltered(canvas, bounds, pictureSource);
65            canvas->translate(SkIntToScalar(100), 0);
66
67            // Draw an unscaled subset of the source picture.
68            fillRectFiltered(canvas, bounds, pictureSourceSrcRect);
69            canvas->translate(SkIntToScalar(100), 0);
70
71            // Draw the picture to an empty rect (should draw nothing).
72            fillRectFiltered(canvas, bounds, pictureSourceEmptyRect);
73            canvas->translate(SkIntToScalar(100), 0);
74        }
75    }
76
77    // SkPictureImageFilter doesn't support serialization yet.
78    virtual uint32_t onGetFlags() const SK_OVERRIDE {
79        return kSkipPicture_Flag            |
80               kSkipPipe_Flag               |
81               kSkipPipeCrossProcess_Flag   |
82               kSkipTiled_Flag              |
83               kSkipScaledReplay_Flag;
84    }
85
86private:
87    SkAutoTUnref<SkPicture> fPicture;
88    typedef GM INHERITED;
89};
90
91///////////////////////////////////////////////////////////////////////////////
92
93DEF_GM( return new PictureImageFilterGM; )
94