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