1afc7cce5d68663934128d76963cd501f771d71desenorblanco/* 2afc7cce5d68663934128d76963cd501f771d71desenorblanco * Copyright 2016 Google Inc. 3afc7cce5d68663934128d76963cd501f771d71desenorblanco * 4afc7cce5d68663934128d76963cd501f771d71desenorblanco * Use of this source code is governed by a BSD-style license that can be 5afc7cce5d68663934128d76963cd501f771d71desenorblanco * found in the LICENSE file. 6afc7cce5d68663934128d76963cd501f771d71desenorblanco */ 7afc7cce5d68663934128d76963cd501f771d71desenorblanco 8afc7cce5d68663934128d76963cd501f771d71desenorblanco#include "gm.h" 9afc7cce5d68663934128d76963cd501f771d71desenorblanco#include "SkBlurImageFilter.h" 10afc7cce5d68663934128d76963cd501f771d71desenorblanco#include "SkRRect.h" 11afc7cce5d68663934128d76963cd501f771d71desenorblanco#include "SkSurface.h" 12afc7cce5d68663934128d76963cd501f771d71desenorblanco 13afc7cce5d68663934128d76963cd501f771d71desenorblanco#define WIDTH 512 14afc7cce5d68663934128d76963cd501f771d71desenorblanco#define HEIGHT 512 15afc7cce5d68663934128d76963cd501f771d71desenorblanco 16afc7cce5d68663934128d76963cd501f771d71desenorblanconamespace skiagm { 17afc7cce5d68663934128d76963cd501f771d71desenorblanco 18afc7cce5d68663934128d76963cd501f771d71desenorblancoclass ComplexClipBlurTiledGM : public GM { 19afc7cce5d68663934128d76963cd501f771d71desenorblancopublic: 20afc7cce5d68663934128d76963cd501f771d71desenorblanco ComplexClipBlurTiledGM() { 21afc7cce5d68663934128d76963cd501f771d71desenorblanco } 22afc7cce5d68663934128d76963cd501f771d71desenorblanco 23afc7cce5d68663934128d76963cd501f771d71desenorblancoprotected: 24afc7cce5d68663934128d76963cd501f771d71desenorblanco SkString onShortName() override { 25afc7cce5d68663934128d76963cd501f771d71desenorblanco return SkString("complexclip_blur_tiled"); 26afc7cce5d68663934128d76963cd501f771d71desenorblanco } 27afc7cce5d68663934128d76963cd501f771d71desenorblanco 28afc7cce5d68663934128d76963cd501f771d71desenorblanco SkISize onISize() override { 29afc7cce5d68663934128d76963cd501f771d71desenorblanco return SkISize::Make(WIDTH, HEIGHT); 30afc7cce5d68663934128d76963cd501f771d71desenorblanco } 31afc7cce5d68663934128d76963cd501f771d71desenorblanco 32afc7cce5d68663934128d76963cd501f771d71desenorblanco void onDraw(SkCanvas* canvas) override { 33afc7cce5d68663934128d76963cd501f771d71desenorblanco SkPaint blurPaint; 34afc7cce5d68663934128d76963cd501f771d71desenorblanco SkAutoTUnref<SkImageFilter> blur(SkBlurImageFilter::Create(5.0f, 5.0f)); 35afc7cce5d68663934128d76963cd501f771d71desenorblanco blurPaint.setImageFilter(blur); 36afc7cce5d68663934128d76963cd501f771d71desenorblanco const SkScalar tile_size = SkIntToScalar(128); 37afc7cce5d68663934128d76963cd501f771d71desenorblanco SkRect bounds; 38afc7cce5d68663934128d76963cd501f771d71desenorblanco if (!canvas->getClipBounds(&bounds)) { 39afc7cce5d68663934128d76963cd501f771d71desenorblanco bounds.setEmpty(); 40afc7cce5d68663934128d76963cd501f771d71desenorblanco } 41afc7cce5d68663934128d76963cd501f771d71desenorblanco int ts = SkScalarCeilToInt(tile_size); 42afc7cce5d68663934128d76963cd501f771d71desenorblanco SkImageInfo info = SkImageInfo::MakeN32Premul(ts, ts); 43afc7cce5d68663934128d76963cd501f771d71desenorblanco SkAutoTUnref<SkSurface> tileSurface(canvas->newSurface(info)); 44afc7cce5d68663934128d76963cd501f771d71desenorblanco if (!tileSurface.get()) { 45afc7cce5d68663934128d76963cd501f771d71desenorblanco tileSurface.reset(SkSurface::NewRaster(info)); 46afc7cce5d68663934128d76963cd501f771d71desenorblanco } 47afc7cce5d68663934128d76963cd501f771d71desenorblanco SkCanvas* tileCanvas = tileSurface->getCanvas(); 48afc7cce5d68663934128d76963cd501f771d71desenorblanco for (SkScalar y = bounds.top(); y < bounds.bottom(); y += tile_size) { 49afc7cce5d68663934128d76963cd501f771d71desenorblanco for (SkScalar x = bounds.left(); x < bounds.right(); x += tile_size) { 50afc7cce5d68663934128d76963cd501f771d71desenorblanco tileCanvas->save(); 51afc7cce5d68663934128d76963cd501f771d71desenorblanco tileCanvas->clear(0); 52afc7cce5d68663934128d76963cd501f771d71desenorblanco tileCanvas->translate(-x, -y); 53afc7cce5d68663934128d76963cd501f771d71desenorblanco SkRect rect = SkRect::MakeWH(WIDTH, HEIGHT); 54afc7cce5d68663934128d76963cd501f771d71desenorblanco tileCanvas->saveLayer(&rect, &blurPaint); 55afc7cce5d68663934128d76963cd501f771d71desenorblanco SkRRect rrect = SkRRect::MakeRectXY(rect.makeInset(20, 20), 25, 25); 56afc7cce5d68663934128d76963cd501f771d71desenorblanco tileCanvas->clipRRect(rrect, SkRegion::kDifference_Op, true); 57afc7cce5d68663934128d76963cd501f771d71desenorblanco SkPaint paint; 58afc7cce5d68663934128d76963cd501f771d71desenorblanco tileCanvas->drawRect(rect, paint); 59afc7cce5d68663934128d76963cd501f771d71desenorblanco tileCanvas->restore(); 60afc7cce5d68663934128d76963cd501f771d71desenorblanco tileCanvas->restore(); 61afc7cce5d68663934128d76963cd501f771d71desenorblanco SkAutoTUnref<SkImage> tileImage(tileSurface->newImageSnapshot()); 62afc7cce5d68663934128d76963cd501f771d71desenorblanco canvas->drawImage(tileImage, x, y); 63afc7cce5d68663934128d76963cd501f771d71desenorblanco } 64afc7cce5d68663934128d76963cd501f771d71desenorblanco } 65afc7cce5d68663934128d76963cd501f771d71desenorblanco } 66afc7cce5d68663934128d76963cd501f771d71desenorblanco 67afc7cce5d68663934128d76963cd501f771d71desenorblancoprivate: 68afc7cce5d68663934128d76963cd501f771d71desenorblanco typedef GM INHERITED; 69afc7cce5d68663934128d76963cd501f771d71desenorblanco}; 70afc7cce5d68663934128d76963cd501f771d71desenorblanco 71afc7cce5d68663934128d76963cd501f771d71desenorblanco////////////////////////////////////////////////////////////////////////////// 72afc7cce5d68663934128d76963cd501f771d71desenorblanco 73afc7cce5d68663934128d76963cd501f771d71desenorblancostatic GM* MyFactory1(void*) { return new ComplexClipBlurTiledGM(); } 74afc7cce5d68663934128d76963cd501f771d71desenorblancostatic GMRegistry reg1(MyFactory1); 75afc7cce5d68663934128d76963cd501f771d71desenorblanco 76afc7cce5d68663934128d76963cd501f771d71desenorblanco} 77