OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "GrBlurUtils.h" | 8 #include "GrBlurUtils.h" |
9 #include "GrDrawContext.h" | 9 #include "GrDrawContext.h" |
10 #include "GrCaps.h" | 10 #include "GrCaps.h" |
(...skipping 28 matching lines...) Expand all Loading... |
39 kDevice_GrCo
ordSet))->unref(); | 39 kDevice_GrCo
ordSet))->unref(); |
40 | 40 |
41 SkMatrix inverse; | 41 SkMatrix inverse; |
42 if (!viewMatrix.invert(&inverse)) { | 42 if (!viewMatrix.invert(&inverse)) { |
43 return false; | 43 return false; |
44 } | 44 } |
45 drawContext->fillRectWithLocalMatrix(clip, *grp, SkMatrix::I(), maskRect, in
verse); | 45 drawContext->fillRectWithLocalMatrix(clip, *grp, SkMatrix::I(), maskRect, in
verse); |
46 return true; | 46 return true; |
47 } | 47 } |
48 | 48 |
49 static bool draw_with_mask_filter(GrDrawContext* drawContext, | 49 static bool sw_draw_with_mask_filter(GrDrawContext* drawContext, |
50 GrTextureProvider* textureProvider, | 50 GrTextureProvider* textureProvider, |
51 const GrClip& clipData, | 51 const GrClip& clipData, |
52 const SkMatrix& viewMatrix, | 52 const SkMatrix& viewMatrix, |
53 const SkPath& devPath, | 53 const SkPath& devPath, |
54 const SkMaskFilter* filter, | 54 const SkMaskFilter* filter, |
55 const SkIRect& clipBounds, | 55 const SkIRect& clipBounds, |
56 GrPaint* grp, | 56 GrPaint* grp, |
57 SkPaint::Style style) { | 57 SkPaint::Style style) { |
58 SkMask srcM, dstM; | 58 SkMask srcM, dstM; |
59 | 59 |
60 if (!SkDraw::DrawToMask(devPath, &clipBounds, filter, &viewMatrix, &srcM, | 60 if (!SkDraw::DrawToMask(devPath, &clipBounds, filter, &viewMatrix, &srcM, |
61 SkMask::kComputeBoundsAndRenderImage_CreateMode, sty
le)) { | 61 SkMask::kComputeBoundsAndRenderImage_CreateMode, sty
le)) { |
62 return false; | 62 return false; |
63 } | 63 } |
64 SkAutoMaskFreeImage autoSrc(srcM.fImage); | 64 SkAutoMaskFreeImage autoSrc(srcM.fImage); |
65 | 65 |
66 if (!filter->filterMask(&dstM, srcM, viewMatrix, nullptr)) { | 66 if (!filter->filterMask(&dstM, srcM, viewMatrix, nullptr)) { |
67 return false; | 67 return false; |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 bool pathIsMutable) { | 159 bool pathIsMutable) { |
160 SkASSERT(maskFilter); | 160 SkASSERT(maskFilter); |
161 | 161 |
162 SkIRect clipBounds; | 162 SkIRect clipBounds; |
163 clip.getConservativeBounds(renderTarget, &clipBounds); | 163 clip.getConservativeBounds(renderTarget, &clipBounds); |
164 SkTLazy<SkPath> tmpPath; | 164 SkTLazy<SkPath> tmpPath; |
165 GrStrokeInfo strokeInfo(origStrokeInfo); | 165 GrStrokeInfo strokeInfo(origStrokeInfo); |
166 | 166 |
167 static const SkRect* cullRect = nullptr; // TODO: what is our bounds? | 167 static const SkRect* cullRect = nullptr; // TODO: what is our bounds? |
168 | 168 |
169 if (!strokeInfo.isDashed() && pathEffect && pathEffect->filterPath(tmpPath.i
nit(), *pathPtr, | 169 SkASSERT(strokeInfo.isDashed() || !pathEffect); |
170 &strokeIn
fo, cullRect)) { | 170 |
171 pathPtr = tmpPath.get(); | |
172 pathPtr->setIsVolatile(true); | |
173 pathIsMutable = true; | |
174 } | |
175 if (!strokeInfo.isHairlineStyle()) { | 171 if (!strokeInfo.isHairlineStyle()) { |
176 SkPath* strokedPath = pathIsMutable ? pathPtr : tmpPath.init(); | 172 SkPath* strokedPath = pathIsMutable ? pathPtr : tmpPath.init(); |
177 if (strokeInfo.isDashed()) { | 173 if (strokeInfo.isDashed()) { |
178 if (pathEffect->filterPath(strokedPath, *pathPtr, &strokeInfo, cullR
ect)) { | 174 if (pathEffect->filterPath(strokedPath, *pathPtr, &strokeInfo, cullR
ect)) { |
179 pathPtr = strokedPath; | 175 pathPtr = strokedPath; |
180 pathPtr->setIsVolatile(true); | 176 pathPtr->setIsVolatile(true); |
181 pathIsMutable = true; | 177 pathIsMutable = true; |
182 } | 178 } |
183 strokeInfo.removeDash(); | 179 strokeInfo.removeDash(); |
184 } | 180 } |
185 if (strokeInfo.applyToPath(strokedPath, *pathPtr)) { | 181 if (strokeInfo.applyToPath(strokedPath, *pathPtr)) { |
| 182 // Apply the stroke to the path if there is one |
186 pathPtr = strokedPath; | 183 pathPtr = strokedPath; |
187 pathPtr->setIsVolatile(true); | 184 pathPtr->setIsVolatile(true); |
188 pathIsMutable = true; | 185 pathIsMutable = true; |
189 strokeInfo.setFillStyle(); | 186 strokeInfo.setFillStyle(); |
190 } | 187 } |
191 } | 188 } |
192 | 189 |
193 // avoid possibly allocating a new path in transform if we can | 190 // avoid possibly allocating a new path in transform if we can |
194 SkPath* devPathPtr = pathIsMutable ? pathPtr : tmpPath.init(); | 191 SkPath* devPathPtr = pathIsMutable ? pathPtr : tmpPath.init(); |
195 if (!pathIsMutable) { | 192 if (!pathIsMutable) { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
240 return; | 237 return; |
241 } | 238 } |
242 } | 239 } |
243 } | 240 } |
244 } | 241 } |
245 | 242 |
246 // draw the mask on the CPU - this is a fallthrough path in case the | 243 // draw the mask on the CPU - this is a fallthrough path in case the |
247 // GPU path fails | 244 // GPU path fails |
248 SkPaint::Style style = strokeInfo.isHairlineStyle() ? SkPaint::kStroke_Style
: | 245 SkPaint::Style style = strokeInfo.isHairlineStyle() ? SkPaint::kStroke_Style
: |
249 SkPaint::kFill_Style; | 246 SkPaint::kFill_Style; |
250 draw_with_mask_filter(drawContext, context->textureProvider(), | 247 sw_draw_with_mask_filter(drawContext, context->textureProvider(), |
251 clip, viewMatrix, *devPathPtr, | 248 clip, viewMatrix, *devPathPtr, |
252 maskFilter, clipBounds, paint, style); | 249 maskFilter, clipBounds, paint, style); |
253 } | 250 } |
254 | 251 |
255 void GrBlurUtils::drawPathWithMaskFilter(GrContext* context, | 252 void GrBlurUtils::drawPathWithMaskFilter(GrContext* context, |
256 GrDrawContext* drawContext, | 253 GrDrawContext* drawContext, |
257 GrRenderTarget* rt, | 254 GrRenderTarget* rt, |
258 const GrClip& clip, | 255 const GrClip& clip, |
259 const SkPath& origPath, | 256 const SkPath& origPath, |
260 GrPaint* paint, | 257 GrPaint* paint, |
261 const SkMatrix& viewMatrix, | 258 const SkMatrix& viewMatrix, |
262 const SkMaskFilter* mf, | 259 const SkMaskFilter* mf, |
263 const SkPathEffect* pe, | 260 const SkPathEffect* pathEffect, |
264 const GrStrokeInfo& strokeInfo) { | 261 const GrStrokeInfo& origStrokeInfo, |
265 SkPath* path = const_cast<SkPath*>(&origPath); | 262 bool pathIsMutable) { |
266 draw_path_with_mask_filter(context, drawContext, rt, clip, paint, viewMatrix
, mf, pe, | 263 SkPath* pathPtr = const_cast<SkPath*>(&origPath); |
267 strokeInfo, path, false); | 264 |
| 265 SkTLazy<SkPath> tmpPath; |
| 266 GrStrokeInfo strokeInfo(origStrokeInfo); |
| 267 |
| 268 if (!strokeInfo.isDashed() && pathEffect && pathEffect->filterPath(tmpPath.i
nit(), *pathPtr, |
| 269 &strokeIn
fo, nullptr)) { |
| 270 pathPtr = tmpPath.get(); |
| 271 pathPtr->setIsVolatile(true); |
| 272 pathIsMutable = true; |
| 273 pathEffect = nullptr; |
| 274 } |
| 275 |
| 276 draw_path_with_mask_filter(context, drawContext, rt, clip, paint, viewMatrix
, mf, pathEffect, |
| 277 strokeInfo, pathPtr, pathIsMutable); |
268 } | 278 } |
269 | 279 |
270 void GrBlurUtils::drawPathWithMaskFilter(GrContext* context, | 280 void GrBlurUtils::drawPathWithMaskFilter(GrContext* context, |
271 GrDrawContext* drawContext, | 281 GrDrawContext* drawContext, |
272 GrRenderTarget* renderTarget, | 282 GrRenderTarget* renderTarget, |
273 const GrClip& clip, | 283 const GrClip& clip, |
274 const SkPath& origSrcPath, | 284 const SkPath& origSrcPath, |
275 const SkPaint& paint, | 285 const SkPaint& paint, |
276 const SkMatrix& origViewMatrix, | 286 const SkMatrix& origViewMatrix, |
277 const SkMatrix* prePathMatrix, | 287 const SkMatrix* prePathMatrix, |
(...skipping 29 matching lines...) Expand all Loading... |
307 } | 317 } |
308 // should I push prePathMatrix on our MV stack temporarily, instead | 318 // should I push prePathMatrix on our MV stack temporarily, instead |
309 // of applying it here? See SkDraw.cpp | 319 // of applying it here? See SkDraw.cpp |
310 pathPtr->transform(*prePathMatrix, result); | 320 pathPtr->transform(*prePathMatrix, result); |
311 pathPtr = result; | 321 pathPtr = result; |
312 } | 322 } |
313 } | 323 } |
314 // at this point we're done with prePathMatrix | 324 // at this point we're done with prePathMatrix |
315 SkDEBUGCODE(prePathMatrix = (const SkMatrix*)0x50FF8001;) | 325 SkDEBUGCODE(prePathMatrix = (const SkMatrix*)0x50FF8001;) |
316 | 326 |
| 327 SkTLazy<SkPath> tmpPath2; |
| 328 |
| 329 if (!strokeInfo.isDashed() && pathEffect && |
| 330 pathEffect->filterPath(tmpPath2.init(), *pathPtr, &strokeInfo, nullptr))
{ |
| 331 pathPtr = tmpPath2.get(); |
| 332 pathPtr->setIsVolatile(true); |
| 333 pathIsMutable = true; |
| 334 pathEffect = nullptr; |
| 335 } |
| 336 |
317 GrPaint grPaint; | 337 GrPaint grPaint; |
318 if (!SkPaintToGrPaint(context, paint, viewMatrix, &grPaint)) { | 338 if (!SkPaintToGrPaint(context, paint, viewMatrix, &grPaint)) { |
319 return; | 339 return; |
320 } | 340 } |
321 | 341 |
322 if (paint.getMaskFilter()) { | 342 if (paint.getMaskFilter()) { |
323 draw_path_with_mask_filter(context, drawContext, renderTarget, clip, &gr
Paint, viewMatrix, | 343 draw_path_with_mask_filter(context, drawContext, renderTarget, clip, &gr
Paint, viewMatrix, |
324 paint.getMaskFilter(), paint.getPathEffect(),
strokeInfo, | 344 paint.getMaskFilter(), pathEffect, strokeInfo
, |
325 pathPtr, pathIsMutable); | 345 pathPtr, pathIsMutable); |
326 } else { | 346 } else { |
327 SkTLazy<SkPath> tmpPath2; | |
328 if (!strokeInfo.isDashed() && pathEffect && | |
329 pathEffect->filterPath(tmpPath2.init(), *pathPtr, &strokeInfo, nullp
tr)) { | |
330 pathPtr = tmpPath2.get(); | |
331 pathPtr->setIsVolatile(true); | |
332 pathIsMutable = true; | |
333 } | |
334 drawContext->drawPath(clip, grPaint, viewMatrix, *pathPtr, strokeInfo); | 347 drawContext->drawPath(clip, grPaint, viewMatrix, *pathPtr, strokeInfo); |
335 } | 348 } |
336 } | 349 } |
337 | 350 |
OLD | NEW |