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);
31533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        paint.setColor(0xFFFFFFFF);
32533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        paint.setTextSize(SkIntToScalar(96));
33533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        const char* str = "e";
34533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        canvas->drawText(str, strlen(str), SkIntToScalar(20), SkIntToScalar(70), paint);
3584b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com        fPicture.reset(recorder.endRecording());
36533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    }
37533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
38533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(500, 150); }
39533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
40533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    virtual void onOnceBeforeDraw() SK_OVERRIDE {
41533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        this->makePicture();
42533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    }
43533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
44533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    static void fillRectFiltered(SkCanvas* canvas, const SkRect& clipRect, SkImageFilter* filter) {
45533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        SkPaint paint;
46533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        paint.setImageFilter(filter);
47533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        canvas->save();
48533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        canvas->clipRect(clipRect);
49533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        canvas->drawPaint(paint);
50533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        canvas->restore();
51533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    }
52533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
53533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
54533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        canvas->clear(0x00000000);
55533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        {
56533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            SkRect srcRect = SkRect::MakeXYWH(20, 20, 30, 30);
57533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            SkRect emptyRect = SkRect::MakeXYWH(20, 20, 0, 0);
58533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            SkRect bounds = SkRect::MakeXYWH(0, 0, 100, 100);
5984b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com            SkAutoTUnref<SkImageFilter> pictureSource(SkPictureImageFilter::Create(fPicture));
6084b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com            SkAutoTUnref<SkImageFilter> pictureSourceSrcRect(SkPictureImageFilter::Create(fPicture, srcRect));
6184b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com            SkAutoTUnref<SkImageFilter> pictureSourceEmptyRect(SkPictureImageFilter::Create(fPicture, emptyRect));
62533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
63533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            // Draw the picture unscaled.
64533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            fillRectFiltered(canvas, bounds, pictureSource);
65533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            canvas->translate(SkIntToScalar(100), 0);
66533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
67533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            // Draw an unscaled subset of the source picture.
68533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            fillRectFiltered(canvas, bounds, pictureSourceSrcRect);
69533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            canvas->translate(SkIntToScalar(100), 0);
70533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
71533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            // Draw the picture to an empty rect (should draw nothing).
72533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            fillRectFiltered(canvas, bounds, pictureSourceEmptyRect);
73533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org            canvas->translate(SkIntToScalar(100), 0);
74533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org        }
75533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    }
76533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
77f01218725458fdb0c31b440e1b068f2c3d3c4145senorblanco@chromium.org    // SkPictureImageFilter doesn't support serialization yet.
78f01218725458fdb0c31b440e1b068f2c3d3c4145senorblanco@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
79f01218725458fdb0c31b440e1b068f2c3d3c4145senorblanco@chromium.org        return kSkipPicture_Flag            |
80f01218725458fdb0c31b440e1b068f2c3d3c4145senorblanco@chromium.org               kSkipPipe_Flag               |
81f01218725458fdb0c31b440e1b068f2c3d3c4145senorblanco@chromium.org               kSkipPipeCrossProcess_Flag   |
82f01218725458fdb0c31b440e1b068f2c3d3c4145senorblanco@chromium.org               kSkipTiled_Flag              |
83f01218725458fdb0c31b440e1b068f2c3d3c4145senorblanco@chromium.org               kSkipScaledReplay_Flag;
84f01218725458fdb0c31b440e1b068f2c3d3c4145senorblanco@chromium.org    }
85f01218725458fdb0c31b440e1b068f2c3d3c4145senorblanco@chromium.org
86533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.orgprivate:
8784b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com    SkAutoTUnref<SkPicture> fPicture;
88533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org    typedef GM INHERITED;
89533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org};
90533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
91533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org///////////////////////////////////////////////////////////////////////////////
92533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.org
93533330065a28b51808e5bf564ae45e56f8d9956asenorblanco@chromium.orgDEF_GM( return new PictureImageFilterGM; )
94