Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(702)

Side by Side Diff: gm/megalooper.cpp

Issue 232913003: Make sure SkDrawLooper objects can only be allocated on the heap. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: rebase Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « gm/drawlooper.cpp ('k') | gm/rects.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 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 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 // looper will undo this translation) 156 // looper will undo this translation)
157 rect.offset(SkIntToScalar(kOffsetToOutsideClip), 0); 157 rect.offset(SkIntToScalar(kOffsetToOutsideClip), 0);
158 158
159 canvas->drawRect(rect, loopPaint); 159 canvas->drawRect(rect, loopPaint);
160 canvas->restore(); 160 canvas->restore();
161 } 161 }
162 } 162 }
163 163
164 // Create a 1-tier drawlooper 164 // Create a 1-tier drawlooper
165 SkLayerDrawLooper* create1Looper(SkScalar xOff, SkScalar yOff, SkColor color ) { 165 SkLayerDrawLooper* create1Looper(SkScalar xOff, SkScalar yOff, SkColor color ) {
166 SkLayerDrawLooper* looper = new SkLayerDrawLooper; 166 SkLayerDrawLooper::Builder looperBuilder;
167 SkLayerDrawLooper::LayerInfo info; 167 SkLayerDrawLooper::LayerInfo info;
168 168
169 info.fPaintBits = SkLayerDrawLooper::kColorFilter_Bit | 169 info.fPaintBits = SkLayerDrawLooper::kColorFilter_Bit |
170 SkLayerDrawLooper::kMaskFilter_Bit; 170 SkLayerDrawLooper::kMaskFilter_Bit;
171 info.fColorMode = SkXfermode::kSrc_Mode; 171 info.fColorMode = SkXfermode::kSrc_Mode;
172 info.fOffset.set(xOff, yOff); 172 info.fOffset.set(xOff, yOff);
173 info.fPostTranslate = false; 173 info.fPostTranslate = false;
174 174
175 SkPaint* paint = looper->addLayer(info); 175 SkPaint* paint = looperBuilder.addLayer(info);
176 176
177 paint->setMaskFilter(this->createBlur())->unref(); 177 paint->setMaskFilter(this->createBlur())->unref();
178 178
179 SkColorFilter* cf = SkColorFilter::CreateModeFilter(color, SkXfermode::k SrcIn_Mode); 179 SkColorFilter* cf = SkColorFilter::CreateModeFilter(color, SkXfermode::k SrcIn_Mode);
180 paint->setColorFilter(cf)->unref(); 180 paint->setColorFilter(cf)->unref();
181 181
182 return looper; 182 return looperBuilder.detachLooper();
183 } 183 }
184 184
185 void draw1x4(SkCanvas* canvas, SkScalar x, SkScalar y) { 185 void draw1x4(SkCanvas* canvas, SkScalar x, SkScalar y) {
186 SkRect rect = { -kHalfSquareSize, -kHalfSquareSize, kHalfSquareSize, kHa lfSquareSize }; 186 SkRect rect = { -kHalfSquareSize, -kHalfSquareSize, kHalfSquareSize, kHa lfSquareSize };
187 rect.offset(x, y); 187 rect.offset(x, y);
188 188
189 SkRect outerClip = { 189 SkRect outerClip = {
190 -kHalfOuterClipSize-kHalfSquareSize, -kHalfOuterClipSize-kHalfSquare Size, 190 -kHalfOuterClipSize-kHalfSquareSize, -kHalfOuterClipSize-kHalfSquare Size,
191 kHalfOuterClipSize+kHalfSquareSize, kHalfOuterClipSize+kHalfSquare Size 191 kHalfOuterClipSize+kHalfSquareSize, kHalfOuterClipSize+kHalfSquare Size
192 }; 192 };
193 outerClip.offset(x, y); 193 outerClip.offset(x, y);
194 194
195 SkPaint paint; 195 SkPaint paint;
196 paint.setAntiAlias(true); 196 paint.setAntiAlias(true);
197 paint.setLooper(create4Looper(-kOffsetToOutsideClip-kHalfSquareSize, 0)) ->unref(); 197 paint.setLooper(create4Looper(-kOffsetToOutsideClip-kHalfSquareSize, 0)) ->unref();
198 198
199 canvas->save(); 199 canvas->save();
200 canvas->clipRect(outerClip, SkRegion::kIntersect_Op); 200 canvas->clipRect(outerClip, SkRegion::kIntersect_Op);
201 canvas->clipRect(rect, SkRegion::kDifference_Op); 201 canvas->clipRect(rect, SkRegion::kDifference_Op);
202 202
203 rect.offset(SkIntToScalar(kOffsetToOutsideClip+kHalfSquareSize), 0); 203 rect.offset(SkIntToScalar(kOffsetToOutsideClip+kHalfSquareSize), 0);
204 canvas->drawRect(rect, paint); 204 canvas->drawRect(rect, paint);
205 canvas->restore(); 205 canvas->restore();
206 } 206 }
207 207
208 // Create a 4-tier draw looper 208 // Create a 4-tier draw looper
209 SkLayerDrawLooper* create4Looper(SkScalar xOff, SkScalar yOff) { 209 SkLayerDrawLooper* create4Looper(SkScalar xOff, SkScalar yOff) {
210 SkLayerDrawLooper* looper = new SkLayerDrawLooper; 210 SkLayerDrawLooper::Builder looperBuilder;
211 SkLayerDrawLooper::LayerInfo info; 211 SkLayerDrawLooper::LayerInfo info;
212 212
213 info.fPaintBits = SkLayerDrawLooper::kColorFilter_Bit | 213 info.fPaintBits = SkLayerDrawLooper::kColorFilter_Bit |
214 SkLayerDrawLooper::kMaskFilter_Bit; 214 SkLayerDrawLooper::kMaskFilter_Bit;
215 info.fColorMode = SkXfermode::kSrc_Mode; 215 info.fColorMode = SkXfermode::kSrc_Mode;
216 info.fPostTranslate = false; 216 info.fPostTranslate = false;
217 217
218 SkPaint* paint; 218 SkPaint* paint;
219 219
220 for (int i = 3; i >= 0; --i) { 220 for (int i = 3; i >= 0; --i) {
221 info.fOffset.set(xOff+gBlurOffsets[i].fX, yOff+gBlurOffsets[i].fY); 221 info.fOffset.set(xOff+gBlurOffsets[i].fX, yOff+gBlurOffsets[i].fY);
222 paint = looper->addLayer(info); 222 paint = looperBuilder.addLayer(info);
223 223
224 paint->setMaskFilter(this->createBlur())->unref(); 224 paint->setMaskFilter(this->createBlur())->unref();
225 225
226 SkColorFilter* cf = SkColorFilter::CreateModeFilter(gColors[i], SkXf ermode::kSrcIn_Mode); 226 SkColorFilter* cf = SkColorFilter::CreateModeFilter(gColors[i], SkXf ermode::kSrcIn_Mode);
227 paint->setColorFilter(cf)->unref(); 227 paint->setColorFilter(cf)->unref();
228 } 228 }
229 229
230 return looper; 230 return looperBuilder.detachLooper();
231 } 231 }
232 232
233 typedef GM INHERITED; 233 typedef GM INHERITED;
234 }; 234 };
235 235
236 const SkPoint MegaLooperGM::gBlurOffsets[4] = { 236 const SkPoint MegaLooperGM::gBlurOffsets[4] = {
237 { kHalfSquareSize, kHalfSquareSize }, 237 { kHalfSquareSize, kHalfSquareSize },
238 { -kHalfSquareSize, kHalfSquareSize }, 238 { -kHalfSquareSize, kHalfSquareSize },
239 { kHalfSquareSize, -kHalfSquareSize }, 239 { kHalfSquareSize, -kHalfSquareSize },
240 { -kHalfSquareSize, -kHalfSquareSize } 240 { -kHalfSquareSize, -kHalfSquareSize }
241 }; 241 };
242 242
243 const SkColor MegaLooperGM::gColors[4] = { 243 const SkColor MegaLooperGM::gColors[4] = {
244 SK_ColorGREEN, SK_ColorYELLOW, SK_ColorBLUE, SK_ColorRED 244 SK_ColorGREEN, SK_ColorYELLOW, SK_ColorBLUE, SK_ColorRED
245 }; 245 };
246 246
247 DEF_GM( return new MegaLooperGM(MegaLooperGM::k0x0_Type); ) 247 DEF_GM( return new MegaLooperGM(MegaLooperGM::k0x0_Type); )
248 DEF_GM( return new MegaLooperGM(MegaLooperGM::k4x1_Type); ) 248 DEF_GM( return new MegaLooperGM(MegaLooperGM::k4x1_Type); )
249 DEF_GM( return new MegaLooperGM(MegaLooperGM::k1x4_Type); ) 249 DEF_GM( return new MegaLooperGM(MegaLooperGM::k1x4_Type); )
OLDNEW
« no previous file with comments | « gm/drawlooper.cpp ('k') | gm/rects.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698