Chromium Code Reviews| Index: src/gpu/GrAARectRenderer.cpp |
| diff --git a/src/gpu/GrAARectRenderer.cpp b/src/gpu/GrAARectRenderer.cpp |
| index 44c16a18d67b3a5b98eeb9bdb2ef30a1f877b26d..b93eb672ff7e273e970dd4a43ed2fbbdd832352e 100644 |
| --- a/src/gpu/GrAARectRenderer.cpp |
| +++ b/src/gpu/GrAARectRenderer.cpp |
| @@ -256,24 +256,12 @@ GrEffect* GrRectEffect::TestCreate(SkRandom* random, |
| namespace { |
| -extern const GrVertexAttrib gAARectCoverageAttribs[] = { |
| - {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding}, |
| - {kVec4ub_GrVertexAttribType, sizeof(SkPoint), kCoverage_GrVertexAttribBinding}, |
| +extern const GrVertexAttrib gAARectAttribs[] = { |
| + {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding}, |
| + {kVec4ub_GrVertexAttribType, sizeof(SkPoint), kColor_GrVertexAttribBinding}, |
| + {kVec4ub_GrVertexAttribType, sizeof(SkPoint) + sizeof(SkColor), kCoverage_GrVertexAttribBinding}, |
| }; |
| -extern const GrVertexAttrib gAARectColorAttribs[] = { |
| - {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding}, |
| - {kVec4ub_GrVertexAttribType, sizeof(SkPoint), kColor_GrVertexAttribBinding}, |
| -}; |
| - |
| -static void set_aa_rect_vertex_attributes(GrDrawState* drawState, bool useCoverage) { |
| - if (useCoverage) { |
| - drawState->setVertexAttribs<gAARectCoverageAttribs>(SK_ARRAY_COUNT(gAARectCoverageAttribs)); |
| - } else { |
| - drawState->setVertexAttribs<gAARectColorAttribs>(SK_ARRAY_COUNT(gAARectColorAttribs)); |
| - } |
| -} |
| - |
| static void set_inset_fan(SkPoint* pts, size_t stride, |
| const SkRect& r, SkScalar dx, SkScalar dy) { |
| pts->setRectFan(r.fLeft + dx, r.fTop + dy, |
| @@ -451,11 +439,16 @@ void GrAARectRenderer::geometryFillAARect(GrGpu* gpu, |
| GrDrawTarget* target, |
| const SkRect& rect, |
| const SkMatrix& combinedMatrix, |
| - const SkRect& devRect, |
| - bool useVertexCoverage) { |
| + const SkRect& devRect) { |
| GrDrawState* drawState = target->drawState(); |
| - set_aa_rect_vertex_attributes(drawState, useVertexCoverage); |
| + GrColor color = drawState->getColor(); |
| + |
| + drawState->setVertexAttribs<gAARectAttribs>(SK_ARRAY_COUNT(gAARectAttribs)); |
|
robertphillips
2014/08/11 15:50:57
Add a "bool is_opaque(GrColor)" helper to GrColor.
|
| + static const GrColor kFullAlphaColor = (0xFF << GrColor_SHIFT_A); |
| + if ((kFullAlphaColor & color) == kFullAlphaColor) { |
| + drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); |
| + } |
| GrDrawTarget::AutoReleaseGeometry geo(target, 8, 0); |
| if (!geo.succeeded()) { |
| @@ -471,7 +464,7 @@ void GrAARectRenderer::geometryFillAARect(GrGpu* gpu, |
| intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); |
| size_t vsize = drawState->getVertexSize(); |
| - SkASSERT(sizeof(SkPoint) + sizeof(GrColor) == vsize); |
| + SkASSERT(sizeof(SkPoint) + 2 * sizeof(GrColor) == vsize); |
| SkPoint* fan0Pos = reinterpret_cast<SkPoint*>(verts); |
| SkPoint* fan1Pos = reinterpret_cast<SkPoint*>(verts + 4 * vsize); |
| @@ -528,9 +521,13 @@ void GrAARectRenderer::geometryFillAARect(GrGpu* gpu, |
| *((SkPoint*)((intptr_t)fan0Pos + 3 * vsize)) += vec[0] - vec[1]; |
| } |
| + // Make verts point to vertex color and then set all the color and coverage vertex attrs values. |
| verts += sizeof(SkPoint); |
| for (int i = 0; i < 4; ++i) { |
| - *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; |
| + *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
| + } |
|
robertphillips
2014/08/11 15:50:57
Fuse this into prior loop ?
|
| + for (int i = 0; i < 4; ++i) { |
| + *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = 0; |
| } |
| int scale; |
| @@ -541,20 +538,14 @@ void GrAARectRenderer::geometryFillAARect(GrGpu* gpu, |
| scale = 0xff; |
| } |
| - GrColor innerColor; |
| - if (useVertexCoverage) { |
| - innerColor = GrColorPackRGBA(scale, scale, scale, scale); |
| - } else { |
| - if (0xff == scale) { |
| - innerColor = target->getDrawState().getColor(); |
| - } else { |
| - innerColor = SkAlphaMulQ(target->getDrawState().getColor(), scale); |
| - } |
| - } |
| - |
| verts += 4 * vsize; |
| for (int i = 0; i < 4; ++i) { |
| - *reinterpret_cast<GrColor*>(verts + i * vsize) = innerColor; |
| + *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
| + } |
| + GrColor innerCoverage; |
| + innerCoverage = GrColorPackRGBA(scale, scale, scale, scale); |
|
robertphillips
2014/08/11 15:50:57
Fuse this into prior loop ?
|
| + for (int i = 0; i < 4; ++i) { |
| + *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = innerCoverage; |
| } |
| target->setIndexSourceToBuffer(indexBuffer); |
| @@ -723,8 +714,7 @@ void GrAARectRenderer::strokeAARect(GrGpu* gpu, |
| const SkRect& rect, |
| const SkMatrix& combinedMatrix, |
| const SkRect& devRect, |
| - const SkStrokeRec& stroke, |
| - bool useVertexCoverage) { |
| + const SkStrokeRec& stroke) { |
| SkVector devStrokeSize; |
| SkScalar width = stroke.getWidth(); |
| if (width > 0) { |
| @@ -767,8 +757,7 @@ void GrAARectRenderer::strokeAARect(GrGpu* gpu, |
| } |
| if (spare <= 0 && miterStroke) { |
| - this->fillAARect(gpu, target, devOutside, SkMatrix::I(), |
| - devOutside, useVertexCoverage); |
| + this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside); |
| return; |
| } |
| @@ -785,8 +774,7 @@ void GrAARectRenderer::strokeAARect(GrGpu* gpu, |
| devOutsideAssist.outset(0, ry); |
| } |
| - this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, |
| - devInside, useVertexCoverage, miterStroke); |
| + this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, devInside, miterStroke); |
| } |
| void GrAARectRenderer::geometryStrokeAARect(GrGpu* gpu, |
| @@ -794,11 +782,16 @@ void GrAARectRenderer::geometryStrokeAARect(GrGpu* gpu, |
| const SkRect& devOutside, |
| const SkRect& devOutsideAssist, |
| const SkRect& devInside, |
| - bool useVertexCoverage, |
| bool miterStroke) { |
| GrDrawState* drawState = target->drawState(); |
| - set_aa_rect_vertex_attributes(drawState, useVertexCoverage); |
| + drawState->setVertexAttribs<gAARectAttribs>(SK_ARRAY_COUNT(gAARectAttribs)); |
| + |
| + GrColor color = drawState->getColor(); |
| + static const GrColor kFullAlphaColor = (0xFF << GrColor_SHIFT_A); |
| + if ((kFullAlphaColor & color) == kFullAlphaColor) { |
| + drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); |
| + } |
| int innerVertexNum = 4; |
| int outerVertexNum = miterStroke ? 4 : 8; |
| @@ -817,7 +810,6 @@ void GrAARectRenderer::geometryStrokeAARect(GrGpu* gpu, |
| intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); |
| size_t vsize = drawState->getVertexSize(); |
| - SkASSERT(sizeof(SkPoint) + sizeof(GrColor) == vsize); |
| // We create vertices for four nested rectangles. There are two ramps from 0 to full |
| // coverage, one on the exterior of the stroke and the other on the interior. |
| @@ -866,12 +858,17 @@ void GrAARectRenderer::geometryStrokeAARect(GrGpu* gpu, |
| set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf); |
| } |
| - // The outermost rect has 0 coverage |
| + // Make verts point to vertex color and then set all the color and coverage vertex attrs values. |
| verts += sizeof(SkPoint); |
| for (int i = 0; i < outerVertexNum; ++i) { |
| - *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; |
| + *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
| + } |
| + // The outermost rect has 0 coverage |
|
robertphillips
2014/08/11 15:50:57
Fuse with prior loop ?
|
| + for (int i = 0; i < outerVertexNum; ++i) { |
| + *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = 0; |
| } |
| + // scale is the coverage for the the inner two rects. |
| int scale; |
| if (inset < SK_ScalarHalf) { |
| scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); |
| @@ -880,27 +877,23 @@ void GrAARectRenderer::geometryStrokeAARect(GrGpu* gpu, |
| scale = 0xff; |
| } |
| - // The inner two rects have full coverage |
| - GrColor innerColor; |
| - if (useVertexCoverage) { |
| - innerColor = GrColorPackRGBA(scale, scale, scale, scale); |
| - } else { |
| - if (0xff == scale) { |
| - innerColor = target->getDrawState().getColor(); |
| - } else { |
| - innerColor = SkAlphaMulQ(target->getDrawState().getColor(), scale); |
| - } |
| + verts += outerVertexNum * vsize; |
| + for (int i = 0; i < outerVertexNum + innerVertexNum; ++i) { |
| + *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
| } |
|
robertphillips
2014/08/11 15:50:57
Fuse with prior loop ?
|
| - verts += outerVertexNum * vsize; |
| + GrColor innerCoverage = GrColorPackRGBA(scale, scale, scale, scale); |
| for (int i = 0; i < outerVertexNum + innerVertexNum; ++i) { |
| - *reinterpret_cast<GrColor*>(verts + i * vsize) = innerColor; |
| + *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = innerCoverage; |
| } |
| // The innermost rect has 0 coverage |
| verts += (outerVertexNum + innerVertexNum) * vsize; |
| for (int i = 0; i < innerVertexNum; ++i) { |
| - *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; |
| + *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
| + } |
|
robertphillips
2014/08/11 15:50:57
Fuse with prior loop ?
|
| + for (int i = 0; i < innerVertexNum; ++i) { |
| + *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = 0; |
| } |
| target->setIndexSourceToBuffer(indexBuffer); |
| @@ -911,8 +904,7 @@ void GrAARectRenderer::geometryStrokeAARect(GrGpu* gpu, |
| void GrAARectRenderer::fillAANestedRects(GrGpu* gpu, |
| GrDrawTarget* target, |
| const SkRect rects[2], |
| - const SkMatrix& combinedMatrix, |
| - bool useVertexCoverage) { |
| + const SkMatrix& combinedMatrix) { |
| SkASSERT(combinedMatrix.rectStaysRect()); |
| SkASSERT(!rects[1].isEmpty()); |
| @@ -922,10 +914,9 @@ void GrAARectRenderer::fillAANestedRects(GrGpu* gpu, |
| combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2); |
| if (devInside.isEmpty()) { |
| - this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside, useVertexCoverage); |
| + this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside); |
| return; |
| } |
| - this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, |
| - devInside, useVertexCoverage, true); |
| + this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, devInside, true); |
| } |