Index: src/gpu/SkGpuDevice.cpp |
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp |
index e25cba52020d935364ed30de6d3f23d3b3fef446..5ed068cc18364ce7bb2b65718c99017f4c9ce9d7 100644 |
--- a/src/gpu/SkGpuDevice.cpp |
+++ b/src/gpu/SkGpuDevice.cpp |
@@ -719,8 +719,7 @@ void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& origSrcPath, |
SkASSERT(!pathIsMutable || origSrcPath.isVolatile()); |
- GrPaint grPaint; |
- SkPaint2GrPaintShader(this->context(), paint, *draw.fMatrix, true, &grPaint); |
+ GrStrokeInfo strokeInfo(paint); |
// If we have a prematrix, apply it to the path, optimizing for the case |
// where the original path can in fact be modified in place (even though |
@@ -728,25 +727,37 @@ void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& origSrcPath, |
SkPath* pathPtr = const_cast<SkPath*>(&origSrcPath); |
SkTLazy<SkPath> tmpPath; |
SkTLazy<SkPath> effectPath; |
+ SkPathEffect* pathEffect = paint.getPathEffect(); |
+ |
+ SkMatrix viewMatrix = *draw.fMatrix; |
if (prePathMatrix) { |
- SkPath* result = pathPtr; |
+ // stroking and path effects are supposed to be applied *after* the prePathMatrix. |
+ // The pre-path-matrix also should not affect shadeing. |
+ if (NULL == pathEffect && NULL == paint.getShader() && |
+ (strokeInfo.getStrokeRec().isFillStyle() || |
+ strokeInfo.getStrokeRec().isHairlineStyle())) { |
+ viewMatrix.preConcat(*prePathMatrix); |
+ } else { |
+ SkPath* result = pathPtr; |
- if (!pathIsMutable) { |
- result = tmpPath.init(); |
- result->setIsVolatile(true); |
- pathIsMutable = true; |
+ if (!pathIsMutable) { |
+ result = tmpPath.init(); |
+ result->setIsVolatile(true); |
+ pathIsMutable = true; |
+ } |
+ // should I push prePathMatrix on our MV stack temporarily, instead |
+ // of applying it here? See SkDraw.cpp |
+ pathPtr->transform(*prePathMatrix, result); |
+ pathPtr = result; |
} |
- // should I push prePathMatrix on our MV stack temporarily, instead |
- // of applying it here? See SkDraw.cpp |
- pathPtr->transform(*prePathMatrix, result); |
- pathPtr = result; |
} |
// at this point we're done with prePathMatrix |
SkDEBUGCODE(prePathMatrix = (const SkMatrix*)0x50FF8001;) |
- GrStrokeInfo strokeInfo(paint); |
- SkPathEffect* pathEffect = paint.getPathEffect(); |
+ GrPaint grPaint; |
+ SkPaint2GrPaintShader(this->context(), paint, viewMatrix, true, &grPaint); |
+ |
const SkRect* cullRect = NULL; // TODO: what is our bounds? |
SkStrokeRec* strokePtr = strokeInfo.getStrokeRecPtr(); |
if (pathEffect && pathEffect->filterPath(effectPath.init(), *pathPtr, strokePtr, |
@@ -774,17 +785,13 @@ void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& origSrcPath, |
} |
// transform the path into device space |
- pathPtr->transform(*draw.fMatrix, devPathPtr); |
+ pathPtr->transform(viewMatrix, devPathPtr); |
SkRect maskRect; |
if (paint.getMaskFilter()->canFilterMaskGPU(devPathPtr->getBounds(), |
draw.fClip->getBounds(), |
- *draw.fMatrix, |
+ viewMatrix, |
&maskRect)) { |
- // The context's matrix may change while creating the mask, so save the CTM here to |
bsalomon
2015/01/29 15:59:51
The context no longer maintains a current matrix.
|
- // pass to filterMaskGPU. |
- const SkMatrix ctm = *draw.fMatrix; |
- |
SkIRect finalIRect; |
maskRect.roundOut(&finalIRect); |
if (draw.fClip->quickReject(finalIRect)) { |
@@ -792,7 +799,7 @@ void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& origSrcPath, |
return; |
} |
- if (paint.getMaskFilter()->directFilterMaskGPU(fContext, &grPaint, *draw.fMatrix, |
+ if (paint.getMaskFilter()->directFilterMaskGPU(fContext, &grPaint, viewMatrix, |
stroke, *devPathPtr)) { |
// the mask filter was able to draw itself directly, so there's nothing |
// left to do. |
@@ -806,10 +813,10 @@ void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& origSrcPath, |
if (mask) { |
GrTexture* filtered; |
- if (paint.getMaskFilter()->filterMaskGPU(mask, ctm, maskRect, &filtered, true)) { |
+ if (paint.getMaskFilter()->filterMaskGPU(mask, viewMatrix, maskRect, &filtered, true)) { |
// filterMaskGPU gives us ownership of a ref to the result |
SkAutoTUnref<GrTexture> atu(filtered); |
- if (draw_mask(fContext, *draw.fMatrix, maskRect, &grPaint, filtered)) { |
+ if (draw_mask(fContext, viewMatrix, maskRect, &grPaint, filtered)) { |
// This path is completely drawn |
return; |
} |
@@ -821,12 +828,12 @@ void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& origSrcPath, |
// GPU path fails |
SkPaint::Style style = stroke.isHairlineStyle() ? SkPaint::kStroke_Style : |
SkPaint::kFill_Style; |
- draw_with_mask_filter(fContext, *draw.fMatrix, *devPathPtr, paint.getMaskFilter(), |
+ draw_with_mask_filter(fContext, viewMatrix, *devPathPtr, paint.getMaskFilter(), |
*draw.fClip, &grPaint, style); |
return; |
} |
- fContext->drawPath(grPaint, *draw.fMatrix, *pathPtr, strokeInfo); |
+ fContext->drawPath(grPaint, viewMatrix, *pathPtr, strokeInfo); |
} |
static const int kBmpSmallTileSize = 1 << 10; |