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