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