Chromium Code Reviews| Index: src/gpu/gl/GrGLPathRendering.cpp |
| diff --git a/src/gpu/gl/GrGLPathRendering.cpp b/src/gpu/gl/GrGLPathRendering.cpp |
| index 26584bc80872f4dffd8f864aff73478f0b8bb784..66b129e8768e3fb065e1d1c6582bff0fe06730b4 100644 |
| --- a/src/gpu/gl/GrGLPathRendering.cpp |
| +++ b/src/gpu/gl/GrGLPathRendering.cpp |
| @@ -152,147 +152,88 @@ GrPathRange* GrGLPathRendering::createGlyphs(const SkTypeface* typeface, |
| return SkNEW_ARGS(GrGLPathRange, (fGpu, basePathID, numPaths, gpuMemorySize, stroke)); |
| } |
| -void GrGLPathRendering::stencilPath(const GrPath* path, SkPath::FillType fill) { |
| +void GrGLPathRendering::stencilPath(const GrPath* path, const GrStencilSettings& stencilSettings) { |
| GrGLuint id = static_cast<const GrGLPath*>(path)->pathID(); |
| SkASSERT(fGpu->drawState()->getRenderTarget()); |
| SkASSERT(fGpu->drawState()->getRenderTarget()->getStencilBuffer()); |
| - this->flushPathStencilSettings(fill); |
| + 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)); |
| GrGLint writeMask = fHWPathStencilSettings.writeMask(GrStencilSettings::kFront_Face); |
| - GL_CALL(StencilFillPath(id, fillMode, writeMask)); |
| + |
| + if (stroke.isFillStyle() || SkStrokeRec::kStrokeAndFill_Style == stroke.getStyle()) { |
|
Kimmo Kinnunen
2014/11/03 20:39:12
So I guess this is not part of "refactoring", rath
joshualitt
2014/11/03 20:51:46
Err, is there a problem with this chunk? The orig
|
| + GL_CALL(StencilFillPath(id, fillMode, writeMask)); |
| + } |
| + if (stroke.needToApply()) { |
| + GL_CALL(StencilStrokePath(id, 0xffff, writeMask)); |
| + } |
| } |
| -void GrGLPathRendering::drawPath(const GrPath* path, SkPath::FillType fill) { |
| +void GrGLPathRendering::drawPath(const GrPath* path, const GrStencilSettings& stencilSettings) { |
| GrGLuint id = static_cast<const GrGLPath*>(path)->pathID(); |
| SkASSERT(fGpu->drawState()->getRenderTarget()); |
| SkASSERT(fGpu->drawState()->getRenderTarget()->getStencilBuffer()); |
| - this->flushPathStencilSettings(fill); |
| + this->flushPathStencilSettings(stencilSettings); |
| SkASSERT(!fHWPathStencilSettings.isTwoSided()); |
| const SkStrokeRec& stroke = path->getStroke(); |
| - SkPath::FillType nonInvertedFill = SkPath::ConvertToNonInverseFillType(fill); |
| - |
| GrGLenum fillMode = |
| gr_stencil_op_to_gl_path_rendering_fill_mode(fHWPathStencilSettings.passOp(GrStencilSettings::kFront_Face)); |
| GrGLint writeMask = fHWPathStencilSettings.writeMask(GrStencilSettings::kFront_Face); |
| - if (nonInvertedFill == fill) { |
| - if (stroke.needToApply()) { |
| - if (SkStrokeRec::kStrokeAndFill_Style == stroke.getStyle()) { |
| - GL_CALL(StencilFillPath(id, fillMode, writeMask)); |
| - } |
| - this->stencilThenCoverStrokePath(id, 0xffff, writeMask, GR_GL_BOUNDING_BOX); |
| - } else { |
| - this->stencilThenCoverFillPath(id, fillMode, writeMask, GR_GL_BOUNDING_BOX); |
| - } |
| - } else { |
| - if (stroke.isFillStyle() || SkStrokeRec::kStrokeAndFill_Style == stroke.getStyle()) { |
| + if (stroke.needToApply()) { |
| + if (SkStrokeRec::kStrokeAndFill_Style == stroke.getStyle()) { |
| GL_CALL(StencilFillPath(id, fillMode, writeMask)); |
| } |
| - if (stroke.needToApply()) { |
| - GL_CALL(StencilStrokePath(id, 0xffff, writeMask)); |
| - } |
| - |
| - GrDrawState* drawState = fGpu->drawState(); |
| - GrDrawState::AutoViewMatrixRestore avmr; |
| - SkRect bounds = SkRect::MakeLTRB(0, 0, |
| - SkIntToScalar(drawState->getRenderTarget()->width()), |
| - SkIntToScalar(drawState->getRenderTarget()->height())); |
| - SkMatrix vmi; |
| - // mapRect through persp matrix may not be correct |
| - if (!drawState->getViewMatrix().hasPerspective() && drawState->getViewInverse(&vmi)) { |
| - vmi.mapRect(&bounds); |
| - // theoretically could set bloat = 0, instead leave it because of matrix inversion |
| - // precision. |
| - SkScalar bloat = drawState->getViewMatrix().getMaxScale() * SK_ScalarHalf; |
| - bounds.outset(bloat, bloat); |
| - } else { |
| - avmr.setIdentity(drawState); |
| - } |
| - |
| - fGpu->drawSimpleRect(bounds); |
| + this->stencilThenCoverStrokePath(id, 0xffff, writeMask, GR_GL_BOUNDING_BOX); |
| + } else { |
| + this->stencilThenCoverFillPath(id, fillMode, writeMask, GR_GL_BOUNDING_BOX); |
| } |
| } |
| void GrGLPathRendering::drawPaths(const GrPathRange* pathRange, const uint32_t indices[], int count, |
| const float transforms[], PathTransformType transformsType, |
| - SkPath::FillType fill) { |
| + const GrStencilSettings& stencilSettings) { |
| SkASSERT(fGpu->caps()->pathRenderingSupport()); |
| SkASSERT(fGpu->drawState()->getRenderTarget()); |
| SkASSERT(fGpu->drawState()->getRenderTarget()->getStencilBuffer()); |
| GrGLuint baseID = static_cast<const GrGLPathRange*>(pathRange)->basePathID(); |
| - this->flushPathStencilSettings(fill); |
| + this->flushPathStencilSettings(stencilSettings); |
| SkASSERT(!fHWPathStencilSettings.isTwoSided()); |
| const SkStrokeRec& stroke = pathRange->getStroke(); |
| - SkPath::FillType nonInvertedFill = |
| - SkPath::ConvertToNonInverseFillType(fill); |
| - |
| GrGLenum fillMode = |
| gr_stencil_op_to_gl_path_rendering_fill_mode( |
| fHWPathStencilSettings.passOp(GrStencilSettings::kFront_Face)); |
| GrGLint writeMask = |
| fHWPathStencilSettings.writeMask(GrStencilSettings::kFront_Face); |
| - if (nonInvertedFill == fill) { |
| - if (stroke.needToApply()) { |
| - if (SkStrokeRec::kStrokeAndFill_Style == stroke.getStyle()) { |
| - GL_CALL(StencilFillPathInstanced( |
| - count, GR_GL_UNSIGNED_INT, indices, baseID, fillMode, |
| - writeMask, gXformType2GLType[transformsType], |
| - transforms)); |
| - } |
| - this->stencilThenCoverStrokePathInstanced( |
| - count, GR_GL_UNSIGNED_INT, indices, baseID, 0xffff, writeMask, |
| - GR_GL_BOUNDING_BOX_OF_BOUNDING_BOXES, |
| - gXformType2GLType[transformsType], transforms); |
| - } else { |
| - this->stencilThenCoverFillPathInstanced( |
| - count, GR_GL_UNSIGNED_INT, indices, baseID, fillMode, writeMask, |
| - GR_GL_BOUNDING_BOX_OF_BOUNDING_BOXES, |
| - gXformType2GLType[transformsType], transforms); |
| - } |
| - } else { |
| - if (stroke.isFillStyle() || SkStrokeRec::kStrokeAndFill_Style == stroke.getStyle()) { |
| + if (stroke.needToApply()) { |
| + if (SkStrokeRec::kStrokeAndFill_Style == stroke.getStyle()) { |
| GL_CALL(StencilFillPathInstanced( |
| - count, GR_GL_UNSIGNED_INT, indices, baseID, fillMode, |
| - writeMask, gXformType2GLType[transformsType], |
| - transforms)); |
| + count, GR_GL_UNSIGNED_INT, indices, baseID, fillMode, |
| + writeMask, gXformType2GLType[transformsType], |
| + transforms)); |
| } |
| - if (stroke.needToApply()) { |
| - GL_CALL(StencilStrokePathInstanced( |
| - count, GR_GL_UNSIGNED_INT, indices, baseID, 0xffff, |
| - writeMask, gXformType2GLType[transformsType], |
| - transforms)); |
| - } |
| - |
| - GrDrawState* drawState = fGpu->drawState(); |
| - GrDrawState::AutoViewMatrixRestore avmr; |
| - SkRect bounds = SkRect::MakeLTRB(0, 0, |
| - SkIntToScalar(drawState->getRenderTarget()->width()), |
| - SkIntToScalar(drawState->getRenderTarget()->height())); |
| - SkMatrix vmi; |
| - // mapRect through persp matrix may not be correct |
| - if (!drawState->getViewMatrix().hasPerspective() && drawState->getViewInverse(&vmi)) { |
| - vmi.mapRect(&bounds); |
| - // theoretically could set bloat = 0, instead leave it because of matrix inversion |
| - // precision. |
| - SkScalar bloat = drawState->getViewMatrix().getMaxScale() * SK_ScalarHalf; |
| - bounds.outset(bloat, bloat); |
| - } else { |
| - avmr.setIdentity(drawState); |
| - } |
| - |
| - fGpu->drawSimpleRect(bounds); |
| + this->stencilThenCoverStrokePathInstanced( |
| + count, GR_GL_UNSIGNED_INT, indices, baseID, 0xffff, writeMask, |
| + GR_GL_BOUNDING_BOX_OF_BOUNDING_BOXES, |
| + gXformType2GLType[transformsType], transforms); |
| + } else { |
| + this->stencilThenCoverFillPathInstanced( |
| + count, GR_GL_UNSIGNED_INT, indices, baseID, fillMode, writeMask, |
| + GR_GL_BOUNDING_BOX_OF_BOUNDING_BOXES, |
| + gXformType2GLType[transformsType], transforms); |
| } |
| } |
| @@ -466,18 +407,16 @@ void GrGLPathRendering::deletePaths(GrGLuint path, GrGLsizei range) { |
| fPathNameAllocator->free(path); |
| } |
| -void GrGLPathRendering::flushPathStencilSettings(SkPath::FillType fill) { |
| - GrStencilSettings pathStencilSettings; |
| - fGpu->getPathStencilSettingsForFillType(fill, &pathStencilSettings); |
| - if (fHWPathStencilSettings != pathStencilSettings) { |
| +void GrGLPathRendering::flushPathStencilSettings(const GrStencilSettings& stencilSettings) { |
| + if (fHWPathStencilSettings != stencilSettings) { |
| // Just the func, ref, and mask is set here. The op and write mask are params to the call |
| // that draws the path to the SB (glStencilFillPath) |
| GrGLenum func = |
| - GrToGLStencilFunc(pathStencilSettings.func(GrStencilSettings::kFront_Face)); |
| - GL_CALL(PathStencilFunc(func, pathStencilSettings.funcRef(GrStencilSettings::kFront_Face), |
| - pathStencilSettings.funcMask(GrStencilSettings::kFront_Face))); |
| + GrToGLStencilFunc(stencilSettings.func(GrStencilSettings::kFront_Face)); |
| + GL_CALL(PathStencilFunc(func, stencilSettings.funcRef(GrStencilSettings::kFront_Face), |
| + stencilSettings.funcMask(GrStencilSettings::kFront_Face))); |
| - fHWPathStencilSettings = pathStencilSettings; |
| + fHWPathStencilSettings = stencilSettings; |
| } |
| } |