1533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org/*
2533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org * Copyright 2013 Google Inc.
3533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org *
4533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be
5533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org * found in the LICENSE file.
6533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org */
7533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
8533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org#include "gm.h"
9533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
10533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org#include "SkPictureImageFilter.h"
11770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com#include "SkPictureRecorder.h"
12533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
13533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org// This GM exercises the SkPictureImageFilter ImageFilter class.
14533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
15533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.orgclass PictureImageFilterGM : public skiagm::GM {
16533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.orgpublic:
17533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    PictureImageFilterGM() {
18533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    }
19533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
20533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.orgprotected:
21533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    virtual SkString onShortName() SK_OVERRIDE {
22533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        return SkString("pictureimagefilter");
23533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    }
24533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
25533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    void makePicture() {
2684b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com        SkPictureRecorder recorder;
275fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org        SkCanvas* canvas = recorder.beginRecording(100, 100, NULL, 0);
28533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        canvas->clear(0x00000000);
29533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        SkPaint paint;
30533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        paint.setAntiAlias(true);
31992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        sk_tool_utils::set_portable_typeface(&paint);
32533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        paint.setColor(0xFFFFFFFF);
33533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        paint.setTextSize(SkIntToScalar(96));
34533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        const char* str = "e";
35533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        canvas->drawText(str, strlen(str), SkIntToScalar(20), SkIntToScalar(70), paint);
3684b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com        fPicture.reset(recorder.endRecording());
37533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    }
38533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
39533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(500, 150); }
40533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
41533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    virtual void onOnceBeforeDraw() SK_OVERRIDE {
42533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        this->makePicture();
43533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    }
44533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
45533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    static void fillRectFiltered(SkCanvas* canvas, const SkRect& clipRect, SkImageFilter* filter) {
46533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        SkPaint paint;
47533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        paint.setImageFilter(filter);
48533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        canvas->save();
49533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        canvas->clipRect(clipRect);
50533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        canvas->drawPaint(paint);
51533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        canvas->restore();
52533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    }
53533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
54533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
55533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        canvas->clear(0x00000000);
56533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        {
57533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            SkRect srcRect = SkRect::MakeXYWH(20, 20, 30, 30);
58533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            SkRect emptyRect = SkRect::MakeXYWH(20, 20, 0, 0);
59533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            SkRect bounds = SkRect::MakeXYWH(0, 0, 100, 100);
6084b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com            SkAutoTUnref<SkImageFilter> pictureSource(SkPictureImageFilter::Create(fPicture));
6184b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com            SkAutoTUnref<SkImageFilter> pictureSourceSrcRect(SkPictureImageFilter::Create(fPicture, srcRect));
6284b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com            SkAutoTUnref<SkImageFilter> pictureSourceEmptyRect(SkPictureImageFilter::Create(fPicture, emptyRect));
63533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
64533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            // Draw the picture unscaled.
65533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            fillRectFiltered(canvas, bounds, pictureSource);
66533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            canvas->translate(SkIntToScalar(100), 0);
67533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
68533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            // Draw an unscaled subset of the source picture.
69533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            fillRectFiltered(canvas, bounds, pictureSourceSrcRect);
70533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            canvas->translate(SkIntToScalar(100), 0);
71533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
72533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            // Draw the picture to an empty rect (should draw nothing).
73533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            fillRectFiltered(canvas, bounds, pictureSourceEmptyRect);
74533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            canvas->translate(SkIntToScalar(100), 0);
75533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        }
76533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    }
77533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
78f01218725458fdb0c31b440e1b068f2c3d3c4145senorblanco@chromium.org    // SkPictureImageFilter doesn't support serialization yet.
79f01218725458fdb0c31b440e1b068f2c3d3c4145senorblanco@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
80f01218725458fdb0c31b440e1b068f2c3d3c4145senorblanco@chromium.org        return kSkipPicture_Flag            |
81f01218725458fdb0c31b440e1b068f2c3d3c4145senorblanco@chromium.org               kSkipPipe_Flag               |
82f01218725458fdb0c31b440e1b068f2c3d3c4145senorblanco@chromium.org               kSkipPipeCrossProcess_Flag   |
83f01218725458fdb0c31b440e1b068f2c3d3c4145senorblanco@chromium.org               kSkipTiled_Flag              |
84f01218725458fdb0c31b440e1b068f2c3d3c4145senorblanco@chromium.org               kSkipScaledReplay_Flag;
85f01218725458fdb0c31b440e1b068f2c3d3c4145senorblanco@chromium.org    }
86f01218725458fdb0c31b440e1b068f2c3d3c4145senorblanco@chromium.org
87533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.orgprivate:
8884b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com    SkAutoTUnref<SkPicture> fPicture;
89533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    typedef GM INHERITED;
90533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org};
91533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
92533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org///////////////////////////////////////////////////////////////////////////////
93533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
94533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.orgDEF_GM( return new PictureImageFilterGM; )
95