Index: src/gpu/gl/GrGLPathRange.cpp |
diff --git a/src/gpu/gl/GrGLPathRange.cpp b/src/gpu/gl/GrGLPathRange.cpp |
index 6ed7bcc425dfdc89b499a050ed245f9e4fa5fa69..da1e9fe709da7320d833d0667a405aa073b0cf30 100644 |
--- a/src/gpu/gl/GrGLPathRange.cpp |
+++ b/src/gpu/gl/GrGLPathRange.cpp |
@@ -10,9 +10,9 @@ |
#include "GrGLPathRendering.h" |
#include "GrGLGpu.h" |
-GrGLPathRange::GrGLPathRange(GrGLGpu* gpu, PathGenerator* pathGenerator, const GrStrokeInfo& stroke) |
+GrGLPathRange::GrGLPathRange(GrGLGpu* gpu, PathGenerator* pathGenerator, const GrStyle& style) |
: INHERITED(gpu, pathGenerator), |
- fStroke(stroke), |
+ fStyle(style), |
fBasePathID(gpu->glPathRendering()->genPaths(this->getNumPaths())), |
fGpuMemorySize(0) { |
this->init(); |
@@ -23,9 +23,9 @@ GrGLPathRange::GrGLPathRange(GrGLGpu* gpu, |
GrGLuint basePathID, |
int numPaths, |
size_t gpuMemorySize, |
- const GrStrokeInfo& stroke) |
+ const GrStyle& style) |
: INHERITED(gpu, numPaths), |
- fStroke(stroke), |
+ fStyle(style), |
fBasePathID(basePathID), |
fGpuMemorySize(gpuMemorySize) { |
this->init(); |
@@ -33,19 +33,20 @@ GrGLPathRange::GrGLPathRange(GrGLGpu* gpu, |
} |
void GrGLPathRange::init() { |
+ const SkStrokeRec& stroke = fStyle.strokeRec(); |
// Must force fill: |
// * dashing: NVPR stroke dashing is different to Skia. |
// * end caps: NVPR stroking degenerate contours with end caps is different to Skia. |
- bool forceFill = fStroke.isDashed() || |
- (fStroke.needToApply() && fStroke.getCap() != SkPaint::kButt_Cap); |
+ bool forceFill = fStyle.pathEffect() || |
+ (stroke.needToApply() && stroke.getCap() != SkPaint::kButt_Cap); |
if (forceFill) { |
fShouldStroke = false; |
fShouldFill = true; |
} else { |
- fShouldStroke = fStroke.needToApply(); |
- fShouldFill = fStroke.isFillStyle() || |
- fStroke.getStyle() == SkStrokeRec::kStrokeAndFill_Style; |
+ fShouldStroke = stroke.needToApply(); |
+ fShouldFill = stroke.isFillStyle() || |
+ stroke.getStyle() == SkStrokeRec::kStrokeAndFill_Style; |
} |
} |
@@ -54,7 +55,6 @@ void GrGLPathRange::onInitPath(int index, const SkPath& origSkPath) const { |
if (nullptr == gpu) { |
return; |
} |
- |
// Make sure the path at this index hasn't been initted already. |
SkDEBUGCODE( |
GrGLboolean isPath; |
@@ -65,32 +65,25 @@ void GrGLPathRange::onInitPath(int index, const SkPath& origSkPath) const { |
GrGLPath::InitPathObjectEmptyPath(gpu, fBasePathID + index); |
} else if (fShouldStroke) { |
GrGLPath::InitPathObjectPathData(gpu, fBasePathID + index, origSkPath); |
- GrGLPath::InitPathObjectStroke(gpu, fBasePathID + index, fStroke); |
+ GrGLPath::InitPathObjectStroke(gpu, fBasePathID + index, fStyle.strokeRec()); |
} else { |
const SkPath* skPath = &origSkPath; |
SkTLazy<SkPath> tmpPath; |
- const GrStrokeInfo* stroke = &fStroke; |
- GrStrokeInfo tmpStroke(SkStrokeRec::kFill_InitStyle); |
- |
- // Dashing must be applied to the path. However, if dashing is present, |
- // we must convert all the paths to fills. The GrStrokeInfo::applyDash leaves |
- // simple paths as strokes but converts other paths to fills. |
- // Thus we must stroke the strokes here, so that all paths in the |
- // path range are using the same style. |
- if (fStroke.isDashed()) { |
- if (!stroke->applyDashToPath(tmpPath.init(), &tmpStroke, *skPath)) { |
+ if (!fStyle.isSimpleFill()) { |
+ SkStrokeRec::InitStyle fill; |
+ // The path effect must be applied to the path. However, if a path effect is present, |
+ // we must convert all the paths to fills. The path effect application may leave |
+ // simple paths as strokes but converts other paths to fills. |
+ // Thus we must stroke the strokes here, so that all paths in the |
+ // path range are using the same style. |
+ if (!fStyle.applyToPath(tmpPath.init(), &fill, *skPath, SK_Scalar1)) { |
return; |
} |
+ // We shouldn't have allowed hairlines or arbitrary path effect styles to get here |
+ // so after application we better have a filled path. |
+ SkASSERT(SkStrokeRec::kFill_InitStyle == fill); |
skPath = tmpPath.get(); |
- stroke = &tmpStroke; |
- } |
- if (stroke->needToApply()) { |
- if (!tmpPath.isValid()) { |
- tmpPath.init(); |
- } |
- if (!stroke->applyToPath(tmpPath.get(), *tmpPath.get())) { |
- return; |
- } |
+ |
} |
GrGLPath::InitPathObjectPathData(gpu, fBasePathID + index, *skPath); |
} |