Index: src/gpu/gl/GrGpuGL.cpp |
diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp |
index 113866759e3a79055e3bea236c6efbe98f2af07b..d313167a82757b7802d70389d2976f83e842ccf9 100644 |
--- a/src/gpu/gl/GrGpuGL.cpp |
+++ b/src/gpu/gl/GrGpuGL.cpp |
@@ -12,6 +12,7 @@ |
#include "GrGLShaderBuilder.h" |
#include "GrTemplates.h" |
#include "GrTypes.h" |
+#include "SkStrokeRec.h" |
#include "SkTemplates.h" |
static const GrGLuint GR_MAX_GLUINT = ~0U; |
@@ -1276,9 +1277,9 @@ GrIndexBuffer* GrGpuGL::onCreateIndexBuffer(uint32_t size, bool dynamic) { |
} |
} |
-GrPath* GrGpuGL::onCreatePath(const SkPath& inPath) { |
+GrPath* GrGpuGL::onCreatePath(const SkPath& inPath, const SkStrokeRec& stroke) { |
SkASSERT(this->caps()->pathRenderingSupport()); |
- return SkNEW_ARGS(GrGLPath, (this, inPath)); |
+ return SkNEW_ARGS(GrGLPath, (this, inPath, stroke)); |
} |
void GrGpuGL::flushScissor() { |
@@ -1700,7 +1701,7 @@ void GrGpuGL::onGpuStencilPath(const GrPath* path, SkPath::FillType fill) { |
GL_CALL(StencilFillPath(id, fillMode, writeMask)); |
} |
-void GrGpuGL::onGpuFillPath(const GrPath* path, SkPath::FillType fill) { |
+void GrGpuGL::onGpuDrawPath(const GrPath* path, SkPath::FillType fill) { |
SkASSERT(this->caps()->pathRenderingSupport()); |
GrGLuint id = static_cast<const GrGLPath*>(path)->pathID(); |
@@ -1709,16 +1710,27 @@ void GrGpuGL::onGpuFillPath(const GrPath* path, SkPath::FillType fill) { |
SkASSERT(!fCurrentProgram->hasVertexShader()); |
flushPathStencilSettings(fill); |
+ const SkStrokeRec& stroke = path->getStroke(); |
SkPath::FillType nonInvertedFill = SkPath::ConvertToNonInverseFillType(fill); |
SkASSERT(!fHWPathStencilSettings.isTwoSided()); |
GrGLenum fillMode = |
gr_stencil_op_to_gl_path_rendering_fill_mode(fHWPathStencilSettings.passOp(GrStencilSettings::kFront_Face)); |
GrGLint writeMask = fHWPathStencilSettings.writeMask(GrStencilSettings::kFront_Face); |
- GL_CALL(StencilFillPath(id, fillMode, writeMask)); |
+ |
+ if (stroke.isFillStyle() || SkStrokeRec::kStrokeAndFill_Style == stroke.getStyle()) { |
+ GL_CALL(StencilFillPath(id, fillMode, writeMask)); |
+ } |
+ if (stroke.needToApply()) { |
+ GL_CALL(StencilStrokePath(id, 0xffff, writeMask)); |
+ } |
if (nonInvertedFill == fill) { |
- GL_CALL(CoverFillPath(id, GR_GL_BOUNDING_BOX)); |
+ if (stroke.needToApply()) { |
+ GL_CALL(CoverStrokePath(id, GR_GL_BOUNDING_BOX)); |
+ } else { |
+ GL_CALL(CoverFillPath(id, GR_GL_BOUNDING_BOX)); |
+ } |
} else { |
GrDrawState* drawState = this->drawState(); |
GrDrawState::AutoViewMatrixRestore avmr; |