| Index: src/gpu/gl/GrGLPathRendering.cpp
|
| diff --git a/src/gpu/gl/GrGLPathRendering.cpp b/src/gpu/gl/GrGLPathRendering.cpp
|
| index 8a0b35c661927a149747f9444c4b102916316875..3ceb87692ac9e7b51964ba2c08985faefa53c246 100644
|
| --- a/src/gpu/gl/GrGLPathRendering.cpp
|
| +++ b/src/gpu/gl/GrGLPathRendering.cpp
|
| @@ -91,19 +91,19 @@ void GrGLPathRendering::resetContext() {
|
| fHWPathStencilSettings.invalidate();
|
| }
|
|
|
| -GrPath* GrGLPathRendering::createPath(const SkPath& inPath, const SkStrokeRec& stroke) {
|
| +GrPath* GrGLPathRendering::createPath(const SkPath& inPath, const GrStrokeInfo& stroke) {
|
| return SkNEW_ARGS(GrGLPath, (fGpu, inPath, stroke));
|
| }
|
|
|
| GrPathRange* GrGLPathRendering::createPathRange(GrPathRange::PathGenerator* pathGenerator,
|
| - const SkStrokeRec& stroke) {
|
| + const GrStrokeInfo& stroke) {
|
| return SkNEW_ARGS(GrGLPathRange, (fGpu, pathGenerator, stroke));
|
| }
|
|
|
| GrPathRange* GrGLPathRendering::createGlyphs(const SkTypeface* typeface,
|
| const SkDescriptor* desc,
|
| - const SkStrokeRec& stroke) {
|
| - if (NULL != desc || !caps().glyphLoadingSupport) {
|
| + const GrStrokeInfo& stroke) {
|
| + if (NULL != desc || !caps().glyphLoadingSupport || stroke.isDashed()) {
|
| return GrPathRendering::createGlyphs(typeface, desc, stroke);
|
| }
|
|
|
| @@ -152,44 +152,40 @@ GrPathRange* GrGLPathRendering::createGlyphs(const SkTypeface* typeface,
|
| }
|
|
|
| void GrGLPathRendering::stencilPath(const GrPath* path, const GrStencilSettings& stencilSettings) {
|
| - GrGLuint id = static_cast<const GrGLPath*>(path)->pathID();
|
| + const GrGLPath* glPath = static_cast<const GrGLPath*>(path);
|
|
|
| this->flushPathStencilSettings(stencilSettings);
|
| SkASSERT(!fHWPathStencilSettings.isTwoSided());
|
|
|
| - const SkStrokeRec& stroke = path->getStroke();
|
| -
|
| - GrGLenum fillMode =
|
| - gr_stencil_op_to_gl_path_rendering_fill_mode(fHWPathStencilSettings.passOp(GrStencilSettings::kFront_Face));
|
| + GrGLenum fillMode = gr_stencil_op_to_gl_path_rendering_fill_mode(
|
| + fHWPathStencilSettings.passOp(GrStencilSettings::kFront_Face));
|
| GrGLint writeMask = fHWPathStencilSettings.writeMask(GrStencilSettings::kFront_Face);
|
|
|
| - if (stroke.isFillStyle() || SkStrokeRec::kStrokeAndFill_Style == stroke.getStyle()) {
|
| - GL_CALL(StencilFillPath(id, fillMode, writeMask));
|
| + if (glPath->shouldFill()) {
|
| + GL_CALL(StencilFillPath(glPath->pathID(), fillMode, writeMask));
|
| }
|
| - if (stroke.needToApply()) {
|
| - GL_CALL(StencilStrokePath(id, 0xffff, writeMask));
|
| + if (glPath->shouldStroke()) {
|
| + GL_CALL(StencilStrokePath(glPath->pathID(), 0xffff, writeMask));
|
| }
|
| }
|
|
|
| void GrGLPathRendering::drawPath(const GrPath* path, const GrStencilSettings& stencilSettings) {
|
| - GrGLuint id = static_cast<const GrGLPath*>(path)->pathID();
|
| + const GrGLPath* glPath = static_cast<const GrGLPath*>(path);
|
|
|
| this->flushPathStencilSettings(stencilSettings);
|
| SkASSERT(!fHWPathStencilSettings.isTwoSided());
|
|
|
| - const SkStrokeRec& stroke = path->getStroke();
|
| -
|
| - GrGLenum fillMode =
|
| - gr_stencil_op_to_gl_path_rendering_fill_mode(fHWPathStencilSettings.passOp(GrStencilSettings::kFront_Face));
|
| + GrGLenum fillMode = gr_stencil_op_to_gl_path_rendering_fill_mode(
|
| + fHWPathStencilSettings.passOp(GrStencilSettings::kFront_Face));
|
| GrGLint writeMask = fHWPathStencilSettings.writeMask(GrStencilSettings::kFront_Face);
|
|
|
| - if (stroke.needToApply()) {
|
| - if (SkStrokeRec::kStrokeAndFill_Style == stroke.getStyle()) {
|
| - GL_CALL(StencilFillPath(id, fillMode, writeMask));
|
| + if (glPath->shouldStroke()) {
|
| + if (glPath->shouldFill()) {
|
| + GL_CALL(StencilFillPath(glPath->pathID(), fillMode, writeMask));
|
| }
|
| - this->stencilThenCoverStrokePath(id, 0xffff, writeMask, GR_GL_BOUNDING_BOX);
|
| + this->stencilThenCoverStrokePath(glPath->pathID(), 0xffff, writeMask, GR_GL_BOUNDING_BOX);
|
| } else {
|
| - this->stencilThenCoverFillPath(id, fillMode, writeMask, GR_GL_BOUNDING_BOX);
|
| + this->stencilThenCoverFillPath(glPath->pathID(), fillMode, writeMask, GR_GL_BOUNDING_BOX);
|
| }
|
| }
|
|
|
| @@ -199,32 +195,31 @@ void GrGLPathRendering::drawPaths(const GrPathRange* pathRange,
|
| int count, const GrStencilSettings& stencilSettings) {
|
| SkASSERT(fGpu->caps()->shaderCaps()->pathRenderingSupport());
|
|
|
| - GrGLuint baseID = static_cast<const GrGLPathRange*>(pathRange)->basePathID();
|
| + const GrGLPathRange* glPathRange = static_cast<const GrGLPathRange*>(pathRange);
|
|
|
| this->flushPathStencilSettings(stencilSettings);
|
| SkASSERT(!fHWPathStencilSettings.isTwoSided());
|
|
|
| - const SkStrokeRec& stroke = pathRange->getStroke();
|
| -
|
| GrGLenum fillMode =
|
| gr_stencil_op_to_gl_path_rendering_fill_mode(
|
| fHWPathStencilSettings.passOp(GrStencilSettings::kFront_Face));
|
| GrGLint writeMask =
|
| fHWPathStencilSettings.writeMask(GrStencilSettings::kFront_Face);
|
|
|
| - if (stroke.needToApply()) {
|
| - if (SkStrokeRec::kStrokeAndFill_Style == stroke.getStyle()) {
|
| + if (glPathRange->shouldStroke()) {
|
| + if (glPathRange->shouldFill()) {
|
| GL_CALL(StencilFillPathInstanced(
|
| - count, gIndexType2GLType[indexType], indices, baseID, fillMode,
|
| - writeMask, gXformType2GLType[transformType], transformValues));
|
| + count, gIndexType2GLType[indexType], indices, glPathRange->basePathID(),
|
| + fillMode, writeMask, gXformType2GLType[transformType],
|
| + transformValues));
|
| }
|
| this->stencilThenCoverStrokePathInstanced(
|
| - count, gIndexType2GLType[indexType], indices, baseID,
|
| + count, gIndexType2GLType[indexType], indices, glPathRange->basePathID(),
|
| 0xffff, writeMask, GR_GL_BOUNDING_BOX_OF_BOUNDING_BOXES,
|
| gXformType2GLType[transformType], transformValues);
|
| } else {
|
| this->stencilThenCoverFillPathInstanced(
|
| - count, gIndexType2GLType[indexType], indices, baseID,
|
| + count, gIndexType2GLType[indexType], indices, glPathRange->basePathID(),
|
| fillMode, writeMask, GR_GL_BOUNDING_BOX_OF_BOUNDING_BOXES,
|
| gXformType2GLType[transformType], transformValues);
|
| }
|
|
|