| 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 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 // Draw the mask into maskTexture with the path's integerized top-left at | 141 // Draw the mask into maskTexture with the path's integerized top-left at |
| 142 // the origin using tempPaint. | 142 // the origin using tempPaint. |
| 143 SkMatrix translate; | 143 SkMatrix translate; |
| 144 translate.setTranslate(-maskRect->fLeft, -maskRect->fTop); | 144 translate.setTranslate(-maskRect->fLeft, -maskRect->fTop); |
| 145 drawContext->drawPath(clip, tempPaint, translate, devPath, strokeInfo); | 145 drawContext->drawPath(clip, tempPaint, translate, devPath, strokeInfo); |
| 146 return mask; | 146 return mask; |
| 147 } | 147 } |
| 148 | 148 |
| 149 static void draw_path_with_mask_filter(GrContext* context, | 149 static void draw_path_with_mask_filter(GrContext* context, |
| 150 GrDrawContext* drawContext, | 150 GrDrawContext* drawContext, |
| 151 GrRenderTarget* renderTarget, | |
| 152 const GrClip& clip, | 151 const GrClip& clip, |
| 153 GrPaint* paint, | 152 GrPaint* paint, |
| 154 const SkMatrix& viewMatrix, | 153 const SkMatrix& viewMatrix, |
| 155 const SkMaskFilter* maskFilter, | 154 const SkMaskFilter* maskFilter, |
| 156 const SkPathEffect* pathEffect, | 155 const SkPathEffect* pathEffect, |
| 157 const GrStrokeInfo& origStrokeInfo, | 156 const GrStrokeInfo& origStrokeInfo, |
| 158 SkPath* pathPtr, | 157 SkPath* pathPtr, |
| 159 bool pathIsMutable) { | 158 bool pathIsMutable) { |
| 160 SkASSERT(maskFilter); | 159 SkASSERT(maskFilter); |
| 161 | 160 |
| 162 SkIRect clipBounds; | 161 SkIRect clipBounds; |
| 163 clip.getConservativeBounds(renderTarget, &clipBounds); | 162 clip.getConservativeBounds(drawContext->width(), drawContext->height(), &cli
pBounds); |
| 164 SkTLazy<SkPath> tmpPath; | 163 SkTLazy<SkPath> tmpPath; |
| 165 GrStrokeInfo strokeInfo(origStrokeInfo); | 164 GrStrokeInfo strokeInfo(origStrokeInfo); |
| 166 | 165 |
| 167 static const SkRect* cullRect = nullptr; // TODO: what is our bounds? | 166 static const SkRect* cullRect = nullptr; // TODO: what is our bounds? |
| 168 | 167 |
| 169 SkASSERT(strokeInfo.isDashed() || !pathEffect); | 168 SkASSERT(strokeInfo.isDashed() || !pathEffect); |
| 170 | 169 |
| 171 if (!strokeInfo.isHairlineStyle()) { | 170 if (!strokeInfo.isHairlineStyle()) { |
| 172 SkPath* strokedPath = pathIsMutable ? pathPtr : tmpPath.init(); | 171 SkPath* strokedPath = pathIsMutable ? pathPtr : tmpPath.init(); |
| 173 if (strokeInfo.isDashed()) { | 172 if (strokeInfo.isDashed()) { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 // the mask filter was able to draw itself directly, so there's noth
ing | 217 // the mask filter was able to draw itself directly, so there's noth
ing |
| 219 // left to do. | 218 // left to do. |
| 220 return; | 219 return; |
| 221 } | 220 } |
| 222 | 221 |
| 223 SkAutoTUnref<GrTexture> mask(create_mask_GPU(context, | 222 SkAutoTUnref<GrTexture> mask(create_mask_GPU(context, |
| 224 &maskRect, | 223 &maskRect, |
| 225 *devPathPtr, | 224 *devPathPtr, |
| 226 strokeInfo, | 225 strokeInfo, |
| 227 paint->isAntiAlias(), | 226 paint->isAntiAlias(), |
| 228 renderTarget->numColorSampl
es())); | 227 drawContext->numColorSample
s())); |
| 229 if (mask) { | 228 if (mask) { |
| 230 GrTexture* filtered; | 229 GrTexture* filtered; |
| 231 | 230 |
| 232 if (maskFilter->filterMaskGPU(mask, viewMatrix, maskRect, &filtered,
true)) { | 231 if (maskFilter->filterMaskGPU(mask, viewMatrix, maskRect, &filtered,
true)) { |
| 233 // filterMaskGPU gives us ownership of a ref to the result | 232 // filterMaskGPU gives us ownership of a ref to the result |
| 234 SkAutoTUnref<GrTexture> atu(filtered); | 233 SkAutoTUnref<GrTexture> atu(filtered); |
| 235 if (draw_mask(drawContext, clip, viewMatrix, maskRect, paint, fi
ltered)) { | 234 if (draw_mask(drawContext, clip, viewMatrix, maskRect, paint, fi
ltered)) { |
| 236 // This path is completely drawn | 235 // This path is completely drawn |
| 237 return; | 236 return; |
| 238 } | 237 } |
| 239 } | 238 } |
| 240 } | 239 } |
| 241 } | 240 } |
| 242 | 241 |
| 243 // draw the mask on the CPU - this is a fallthrough path in case the | 242 // draw the mask on the CPU - this is a fallthrough path in case the |
| 244 // GPU path fails | 243 // GPU path fails |
| 245 SkPaint::Style style = strokeInfo.isHairlineStyle() ? SkPaint::kStroke_Style
: | 244 SkPaint::Style style = strokeInfo.isHairlineStyle() ? SkPaint::kStroke_Style
: |
| 246 SkPaint::kFill_Style; | 245 SkPaint::kFill_Style; |
| 247 sw_draw_with_mask_filter(drawContext, context->textureProvider(), | 246 sw_draw_with_mask_filter(drawContext, context->textureProvider(), |
| 248 clip, viewMatrix, *devPathPtr, | 247 clip, viewMatrix, *devPathPtr, |
| 249 maskFilter, clipBounds, paint, style); | 248 maskFilter, clipBounds, paint, style); |
| 250 } | 249 } |
| 251 | 250 |
| 252 void GrBlurUtils::drawPathWithMaskFilter(GrContext* context, | 251 void GrBlurUtils::drawPathWithMaskFilter(GrContext* context, |
| 253 GrDrawContext* drawContext, | 252 GrDrawContext* drawContext, |
| 254 GrRenderTarget* rt, | |
| 255 const GrClip& clip, | 253 const GrClip& clip, |
| 256 const SkPath& origPath, | 254 const SkPath& origPath, |
| 257 GrPaint* paint, | 255 GrPaint* paint, |
| 258 const SkMatrix& viewMatrix, | 256 const SkMatrix& viewMatrix, |
| 259 const SkMaskFilter* mf, | 257 const SkMaskFilter* mf, |
| 260 const SkPathEffect* pathEffect, | 258 const SkPathEffect* pathEffect, |
| 261 const GrStrokeInfo& origStrokeInfo, | 259 const GrStrokeInfo& origStrokeInfo, |
| 262 bool pathIsMutable) { | 260 bool pathIsMutable) { |
| 263 SkPath* pathPtr = const_cast<SkPath*>(&origPath); | 261 SkPath* pathPtr = const_cast<SkPath*>(&origPath); |
| 264 | 262 |
| 265 SkTLazy<SkPath> tmpPath; | 263 SkTLazy<SkPath> tmpPath; |
| 266 GrStrokeInfo strokeInfo(origStrokeInfo); | 264 GrStrokeInfo strokeInfo(origStrokeInfo); |
| 267 | 265 |
| 268 if (!strokeInfo.isDashed() && pathEffect && pathEffect->filterPath(tmpPath.i
nit(), *pathPtr, | 266 if (!strokeInfo.isDashed() && pathEffect && pathEffect->filterPath(tmpPath.i
nit(), *pathPtr, |
| 269 &strokeIn
fo, nullptr)) { | 267 &strokeIn
fo, nullptr)) { |
| 270 pathPtr = tmpPath.get(); | 268 pathPtr = tmpPath.get(); |
| 271 pathPtr->setIsVolatile(true); | 269 pathPtr->setIsVolatile(true); |
| 272 pathIsMutable = true; | 270 pathIsMutable = true; |
| 273 pathEffect = nullptr; | 271 pathEffect = nullptr; |
| 274 } | 272 } |
| 275 | 273 |
| 276 draw_path_with_mask_filter(context, drawContext, rt, clip, paint, viewMatrix
, mf, pathEffect, | 274 draw_path_with_mask_filter(context, drawContext, clip, paint, viewMatrix, mf
, pathEffect, |
| 277 strokeInfo, pathPtr, pathIsMutable); | 275 strokeInfo, pathPtr, pathIsMutable); |
| 278 } | 276 } |
| 279 | 277 |
| 280 void GrBlurUtils::drawPathWithMaskFilter(GrContext* context, | 278 void GrBlurUtils::drawPathWithMaskFilter(GrContext* context, |
| 281 GrDrawContext* drawContext, | 279 GrDrawContext* drawContext, |
| 282 GrRenderTarget* renderTarget, | |
| 283 const GrClip& clip, | 280 const GrClip& clip, |
| 284 const SkPath& origSrcPath, | 281 const SkPath& origSrcPath, |
| 285 const SkPaint& paint, | 282 const SkPaint& paint, |
| 286 const SkMatrix& origViewMatrix, | 283 const SkMatrix& origViewMatrix, |
| 287 const SkMatrix* prePathMatrix, | 284 const SkMatrix* prePathMatrix, |
| 288 const SkIRect& clipBounds, | 285 const SkIRect& clipBounds, |
| 289 bool pathIsMutable) { | 286 bool pathIsMutable) { |
| 290 SkASSERT(!pathIsMutable || origSrcPath.isVolatile()); | 287 SkASSERT(!pathIsMutable || origSrcPath.isVolatile()); |
| 291 | 288 |
| 292 GrStrokeInfo strokeInfo(paint); | 289 GrStrokeInfo strokeInfo(paint); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 333 pathIsMutable = true; | 330 pathIsMutable = true; |
| 334 pathEffect = nullptr; | 331 pathEffect = nullptr; |
| 335 } | 332 } |
| 336 | 333 |
| 337 GrPaint grPaint; | 334 GrPaint grPaint; |
| 338 if (!SkPaintToGrPaint(context, paint, viewMatrix, &grPaint)) { | 335 if (!SkPaintToGrPaint(context, paint, viewMatrix, &grPaint)) { |
| 339 return; | 336 return; |
| 340 } | 337 } |
| 341 | 338 |
| 342 if (paint.getMaskFilter()) { | 339 if (paint.getMaskFilter()) { |
| 343 draw_path_with_mask_filter(context, drawContext, renderTarget, clip, &gr
Paint, viewMatrix, | 340 draw_path_with_mask_filter(context, drawContext, clip, &grPaint, viewMat
rix, |
| 344 paint.getMaskFilter(), pathEffect, strokeInfo
, | 341 paint.getMaskFilter(), pathEffect, strokeInfo
, |
| 345 pathPtr, pathIsMutable); | 342 pathPtr, pathIsMutable); |
| 346 } else { | 343 } else { |
| 347 drawContext->drawPath(clip, grPaint, viewMatrix, *pathPtr, strokeInfo); | 344 drawContext->drawPath(clip, grPaint, viewMatrix, *pathPtr, strokeInfo); |
| 348 } | 345 } |
| 349 } | 346 } |
| 350 | 347 |
| OLD | NEW |