OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "gm.h" | 8 #include "gm.h" |
9 #include "SkBlurMask.h" | 9 #include "SkBlurMask.h" |
10 #include "SkBlurMaskFilter.h" | 10 #include "SkBlurMaskFilter.h" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 rect.offset(7, -7); | 48 rect.offset(7, -7); |
49 | 49 |
50 path.addRect(rect); | 50 path.addRect(rect); |
51 path.setFillType(SkPath::kEvenOdd_FillType); | 51 path.setFillType(SkPath::kEvenOdd_FillType); |
52 | 52 |
53 canvas->drawPath(path, p); | 53 canvas->drawPath(path, p); |
54 } | 54 } |
55 | 55 |
56 #include "SkGradientShader.h" | 56 #include "SkGradientShader.h" |
57 | 57 |
| 58 /* |
| 59 * Spits out a dummy gradient to test blur with shader on paint |
| 60 */ |
| 61 static SkShader* MakeRadial() { |
| 62 SkPoint pts[2] = { |
| 63 { 0, 0 }, |
| 64 { SkIntToScalar(100), SkIntToScalar(100) } |
| 65 }; |
| 66 SkShader::TileMode tm = SkShader::kClamp_TileMode; |
| 67 const SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, }; |
| 68 const SkScalar pos[] = { SK_Scalar1/4, SK_Scalar1*3/4 }; |
| 69 SkMatrix scale; |
| 70 scale.setScale(0.5f, 0.5f); |
| 71 scale.postTranslate(25.f, 25.f); |
| 72 SkPoint center0, center1; |
| 73 center0.set(SkScalarAve(pts[0].fX, pts[1].fX), |
| 74 SkScalarAve(pts[0].fY, pts[1].fY)); |
| 75 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5), |
| 76 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4)); |
| 77 return SkGradientShader::CreateTwoPointRadial(center1, (pts[1].fX - pts[0].f
X) / 7, |
| 78 center0, (pts[1].fX - pts[0].f
X) / 2, |
| 79 colors, pos, SK_ARRAY_COUNT(co
lors), tm, |
| 80 0, &scale); |
| 81 } |
| 82 |
58 typedef void (*PaintProc)(SkPaint*, SkScalar width); | 83 typedef void (*PaintProc)(SkPaint*, SkScalar width); |
59 | 84 |
60 class BlurRectGM : public skiagm::GM { | 85 class BlurRectGM : public skiagm::GM { |
61 SkAutoTUnref<SkMaskFilter> fMaskFilters[kLastEnum_SkBlurStyle + 1]; | 86 SkAutoTUnref<SkMaskFilter> fMaskFilters[kLastEnum_SkBlurStyle + 1]; |
62 SkString fName; | 87 SkString fName; |
63 SkAlpha fAlpha; | 88 SkAlpha fAlpha; |
64 public: | 89 public: |
65 BlurRectGM(const char name[], U8CPU alpha) | 90 BlurRectGM(const char name[], U8CPU alpha) |
66 : fName(name) | 91 : fName(name) |
67 , fAlpha(SkToU8(alpha)) { | 92 , fAlpha(SkToU8(alpha)) { |
68 } | 93 } |
69 | 94 |
70 protected: | 95 protected: |
71 virtual void onOnceBeforeDraw() SK_OVERRIDE { | 96 virtual void onOnceBeforeDraw() SK_OVERRIDE { |
72 for (int i = 0; i <= kLastEnum_SkBlurStyle; ++i) { | 97 for (int i = 0; i <= kLastEnum_SkBlurStyle; ++i) { |
73 fMaskFilters[i].reset(SkBlurMaskFilter::Create((SkBlurStyle)i, | 98 fMaskFilters[i].reset(SkBlurMaskFilter::Create((SkBlurStyle)i, |
74 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar
(STROKE_WIDTH/2)), | 99 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar
(STROKE_WIDTH/2)), |
75 SkBlurMaskFilter::kHighQuality_BlurFlag)); | 100 SkBlurMaskFilter::kHighQuality_BlurFlag)); |
76 } | 101 } |
77 } | 102 } |
78 | 103 |
79 virtual SkString onShortName() { | 104 virtual SkString onShortName() { |
80 return fName; | 105 return fName; |
81 } | 106 } |
82 | 107 |
83 virtual SkISize onISize() { | 108 virtual SkISize onISize() { |
84 return SkISize::Make(440, 820); | 109 return SkISize::Make(860, 820); |
85 } | 110 } |
86 | 111 |
87 virtual void onDraw(SkCanvas* canvas) { | 112 virtual void onDraw(SkCanvas* canvas) { |
88 canvas->translate(STROKE_WIDTH*3/2, STROKE_WIDTH*3/2); | 113 canvas->translate(STROKE_WIDTH*3/2, STROKE_WIDTH*3/2); |
89 | 114 |
90 SkRect r = { 0, 0, 100, 50 }; | 115 SkRect r = { 0, 0, 100, 50 }; |
91 SkScalar scales[] = { SK_Scalar1, 0.6f }; | 116 SkScalar scales[] = { SK_Scalar1, 0.6f }; |
92 | 117 |
93 for (size_t s = 0; s < SK_ARRAY_COUNT(scales); ++s) { | 118 for (size_t s = 0; s < SK_ARRAY_COUNT(scales); ++s) { |
94 canvas->save(); | 119 canvas->save(); |
95 for (size_t f = 0; f < SK_ARRAY_COUNT(fMaskFilters); ++f) { | 120 for (size_t f = 0; f < SK_ARRAY_COUNT(fMaskFilters); ++f) { |
96 SkPaint paint; | 121 SkPaint paint; |
97 paint.setMaskFilter(fMaskFilters[f]); | 122 paint.setMaskFilter(fMaskFilters[f]); |
98 paint.setAlpha(fAlpha); | 123 paint.setAlpha(fAlpha); |
99 | 124 |
| 125 SkPaint paintWithRadial = paint; |
| 126 paintWithRadial.setShader(MakeRadial())->unref(); |
| 127 |
100 static const Proc procs[] = { | 128 static const Proc procs[] = { |
101 fill_rect, draw_donut, draw_donut_skewed | 129 fill_rect, draw_donut, draw_donut_skewed |
102 }; | 130 }; |
103 | 131 |
104 canvas->save(); | 132 canvas->save(); |
105 canvas->scale(scales[s], scales[s]); | 133 canvas->scale(scales[s], scales[s]); |
106 this->drawProcs(canvas, r, paint, false, procs, SK_ARRAY_COUNT(p
rocs)); | 134 this->drawProcs(canvas, r, paint, false, procs, SK_ARRAY_COUNT(p
rocs)); |
107 canvas->translate(r.width() * 4/3, 0); | 135 canvas->translate(r.width() * 4/3, 0); |
| 136 this->drawProcs(canvas, r, paintWithRadial, false, procs, SK_ARR
AY_COUNT(procs)); |
| 137 canvas->translate(r.width() * 4/3, 0); |
108 this->drawProcs(canvas, r, paint, true, procs, SK_ARRAY_COUNT(pr
ocs)); | 138 this->drawProcs(canvas, r, paint, true, procs, SK_ARRAY_COUNT(pr
ocs)); |
| 139 canvas->translate(r.width() * 4/3, 0); |
| 140 this->drawProcs(canvas, r, paintWithRadial, true, procs, SK_ARRA
Y_COUNT(procs)); |
109 canvas->restore(); | 141 canvas->restore(); |
110 | 142 |
111 canvas->translate(0, SK_ARRAY_COUNT(procs) * r.height() * 4/3 *
scales[s]); | 143 canvas->translate(0, SK_ARRAY_COUNT(procs) * r.height() * 4/3 *
scales[s]); |
112 } | 144 } |
113 canvas->restore(); | 145 canvas->restore(); |
114 canvas->translate(2 * r.width() * 4/3 * scales[s], 0); | 146 canvas->translate(4 * r.width() * 4/3 * scales[s], 0); |
115 } | 147 } |
116 } | 148 } |
117 | 149 |
118 virtual uint32_t onGetFlags() const { return kSkipPipe_Flag; } | 150 virtual uint32_t onGetFlags() const { return kSkipPipe_Flag | kSkipTiled_Fla
g; } |
119 | 151 |
120 private: | 152 private: |
121 void drawProcs(SkCanvas* canvas, const SkRect& r, const SkPaint& paint, | 153 void drawProcs(SkCanvas* canvas, const SkRect& r, const SkPaint& paint, |
122 bool doClip, const Proc procs[], size_t procsCount) { | 154 bool doClip, const Proc procs[], size_t procsCount) { |
123 SkAutoCanvasRestore acr(canvas, true); | 155 SkAutoCanvasRestore acr(canvas, true); |
124 for (size_t i = 0; i < procsCount; ++i) { | 156 for (size_t i = 0; i < procsCount; ++i) { |
125 if (doClip) { | 157 if (doClip) { |
126 SkRect clipRect(r); | 158 SkRect clipRect(r); |
127 clipRect.inset(STROKE_WIDTH/2, STROKE_WIDTH/2); | 159 clipRect.inset(STROKE_WIDTH/2, STROKE_WIDTH/2); |
128 canvas->save(); | 160 canvas->save(); |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 } | 417 } |
386 private: | 418 private: |
387 typedef BlurRectCompareGM INHERITED; | 419 typedef BlurRectCompareGM INHERITED; |
388 }; | 420 }; |
389 | 421 |
390 | 422 |
391 ////////////////////////////////////////////////////////////////////////////// | 423 ////////////////////////////////////////////////////////////////////////////// |
392 | 424 |
393 DEF_GM(return new BlurRectGM("blurrects", 0xFF);) | 425 DEF_GM(return new BlurRectGM("blurrects", 0xFF);) |
394 DEF_GM(return new BlurRectDirectGM("blurrect_gallery");) | 426 DEF_GM(return new BlurRectDirectGM("blurrect_gallery");) |
OLD | NEW |