blurrect.cpp revision 53007a2b1724c15c170340658daac012f9d909be
1/* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8#include "gm.h" 9#include "SkBlurMaskFilter.h" 10#include "SkCanvas.h" 11#include "SkPath.h" 12 13#define STROKE_WIDTH SkIntToScalar(10) 14 15typedef void (*Proc)(SkCanvas*, const SkRect&, const SkPaint&); 16 17static void fill_rect(SkCanvas* canvas, const SkRect& r, const SkPaint& p) { 18 canvas->drawRect(r, p); 19} 20 21static void stroke_rect(SkCanvas* canvas, const SkRect& r, const SkPaint& p) { 22 SkPaint paint(p); 23 paint.setStyle(SkPaint::kStroke_Style); 24 paint.setStrokeWidth(STROKE_WIDTH); 25 canvas->drawRect(r, paint); 26} 27 28static void draw_donut(SkCanvas* canvas, const SkRect& r, const SkPaint& p) { 29 SkRect rect; 30 SkPath path; 31 32 rect = r; 33 rect.outset(STROKE_WIDTH/2, STROKE_WIDTH/2); 34 path.addRect(rect); 35 rect = r; 36 rect.inset(STROKE_WIDTH/2, STROKE_WIDTH/2); 37 38 path.addRect(rect); 39 path.setFillType(SkPath::kEvenOdd_FillType); 40 41 canvas->drawPath(path, p); 42} 43 44static void draw_donut_skewed(SkCanvas* canvas, const SkRect& r, const SkPaint& p) { 45 SkRect rect; 46 SkPath path; 47 48 rect = r; 49 rect.outset(STROKE_WIDTH/2, STROKE_WIDTH/2); 50 path.addRect(rect); 51 rect = r; 52 rect.inset(STROKE_WIDTH/2, STROKE_WIDTH/2); 53 54 rect.offset(7, -7); 55 56 path.addRect(rect); 57 path.setFillType(SkPath::kEvenOdd_FillType); 58 59 canvas->drawPath(path, p); 60} 61 62#include "SkGradientShader.h" 63 64typedef void (*PaintProc)(SkPaint*, SkScalar width); 65 66static void setgrad(SkPaint* paint, SkScalar width) { 67 SkPoint pts[] = { { 0, 0 }, { width, 0 } }; 68 SkColor colors[] = { SK_ColorRED, SK_ColorGREEN }; 69 SkShader* s = SkGradientShader::CreateLinear(pts, colors, NULL, 2, 70 SkShader::kClamp_TileMode); 71 paint->setShader(s)->unref(); 72} 73 74class BlurRectGM : public skiagm::GM { 75 SkAutoTUnref<SkMaskFilter> fMaskFilter; 76 SkString fName; 77 PaintProc fPProc; 78 SkAlpha fAlpha; 79public: 80 BlurRectGM(const char name[], PaintProc pproc, U8CPU alpha) : 81 fMaskFilter(SkBlurMaskFilter::Create(STROKE_WIDTH/2, 82 SkBlurMaskFilter::kNormal_BlurStyle, 83 SkBlurMaskFilter::kHighQuality_BlurFlag)) 84 , fName(name) 85 , fPProc(pproc) 86 , fAlpha(SkToU8(alpha)) 87 {} 88 89protected: 90 virtual SkString onShortName() { 91 return fName; 92 } 93 94 virtual SkISize onISize() { 95 return SkISize::Make(640, 480); 96 } 97 98 virtual void onDraw(SkCanvas* canvas) { 99 canvas->translate(STROKE_WIDTH*3/2, STROKE_WIDTH*3/2); 100 101 SkRect r = { 0, 0, 250, 120 }; 102 103 SkPaint paint; 104 paint.setMaskFilter(fMaskFilter); 105 if (fPProc) { 106 fPProc(&paint, r.width()); 107 } 108 paint.setAlpha(fAlpha); 109 110 static const Proc procs[] = { 111 fill_rect, draw_donut, draw_donut_skewed 112 }; 113 114 this->drawProcs(canvas, r, paint, false, procs, SK_ARRAY_COUNT(procs)); 115 canvas->translate(r.width() * 4/3, 0); 116 this->drawProcs(canvas, r, paint, true, procs, SK_ARRAY_COUNT(procs)); 117 } 118 119 virtual uint32_t onGetFlags() const { return kSkipPipe_Flag; } 120 121private: 122 void drawProcs(SkCanvas* canvas, const SkRect& r, const SkPaint& paint, 123 bool doClip, const Proc procs[], size_t procsCount) { 124 SkAutoCanvasRestore acr(canvas, true); 125 for (size_t i = 0; i < procsCount; ++i) { 126 if (doClip) { 127 SkRect clipRect(r); 128 clipRect.inset(STROKE_WIDTH/2, STROKE_WIDTH/2); 129 canvas->save(); 130 canvas->clipRect(r); 131 } 132 procs[i](canvas, r, paint); 133 if (doClip) { 134 canvas->restore(); 135 } 136 canvas->translate(0, r.height() * 4/3); 137 } 138 } 139 140 typedef GM INHERITED; 141}; 142 143////////////////////////////////////////////////////////////////////////////// 144 145DEF_GM(return new BlurRectGM("blurrect", NULL, 0xFF);) 146DEF_GM(return new BlurRectGM("blurrect_grad_80", setgrad, 0x80);) 147 148