| 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);
|
| }
|
|
|