Index: src/gpu/gl/GrGLPathRange.cpp |
diff --git a/src/gpu/gl/GrGLPathRange.cpp b/src/gpu/gl/GrGLPathRange.cpp |
index da1e9fe709da7320d833d0667a405aa073b0cf30..6ed7bcc425dfdc89b499a050ed245f9e4fa5fa69 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 GrStyle& style) |
+GrGLPathRange::GrGLPathRange(GrGLGpu* gpu, PathGenerator* pathGenerator, const GrStrokeInfo& stroke) |
: INHERITED(gpu, pathGenerator), |
- fStyle(style), |
+ fStroke(stroke), |
fBasePathID(gpu->glPathRendering()->genPaths(this->getNumPaths())), |
fGpuMemorySize(0) { |
this->init(); |
@@ -23,9 +23,9 @@ |
GrGLuint basePathID, |
int numPaths, |
size_t gpuMemorySize, |
- const GrStyle& style) |
+ const GrStrokeInfo& stroke) |
: INHERITED(gpu, numPaths), |
- fStyle(style), |
+ fStroke(stroke), |
fBasePathID(basePathID), |
fGpuMemorySize(gpuMemorySize) { |
this->init(); |
@@ -33,20 +33,19 @@ |
} |
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 = fStyle.pathEffect() || |
- (stroke.needToApply() && stroke.getCap() != SkPaint::kButt_Cap); |
+ bool forceFill = fStroke.isDashed() || |
+ (fStroke.needToApply() && fStroke.getCap() != SkPaint::kButt_Cap); |
if (forceFill) { |
fShouldStroke = false; |
fShouldFill = true; |
} else { |
- fShouldStroke = stroke.needToApply(); |
- fShouldFill = stroke.isFillStyle() || |
- stroke.getStyle() == SkStrokeRec::kStrokeAndFill_Style; |
+ fShouldStroke = fStroke.needToApply(); |
+ fShouldFill = fStroke.isFillStyle() || |
+ fStroke.getStyle() == SkStrokeRec::kStrokeAndFill_Style; |
} |
} |
@@ -55,6 +54,7 @@ |
if (nullptr == gpu) { |
return; |
} |
+ |
// Make sure the path at this index hasn't been initted already. |
SkDEBUGCODE( |
GrGLboolean isPath; |
@@ -65,25 +65,32 @@ |
GrGLPath::InitPathObjectEmptyPath(gpu, fBasePathID + index); |
} else if (fShouldStroke) { |
GrGLPath::InitPathObjectPathData(gpu, fBasePathID + index, origSkPath); |
- GrGLPath::InitPathObjectStroke(gpu, fBasePathID + index, fStyle.strokeRec()); |
+ GrGLPath::InitPathObjectStroke(gpu, fBasePathID + index, fStroke); |
} else { |
const SkPath* skPath = &origSkPath; |
SkTLazy<SkPath> tmpPath; |
- 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)) { |
+ 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)) { |
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); |
} |