Index: src/gpu/GrAARectRenderer.cpp |
diff --git a/src/gpu/GrAARectRenderer.cpp b/src/gpu/GrAARectRenderer.cpp |
index be82d5b88fe7d2fe6077d8f3944bf51b1ef62bfd..1d350c335bf721cd444a58931ab5886de49de2d0 100644 |
--- a/src/gpu/GrAARectRenderer.cpp |
+++ b/src/gpu/GrAARectRenderer.cpp |
@@ -255,21 +255,35 @@ GrEffect* GrRectEffect::TestCreate(SkRandom* random, |
/////////////////////////////////////////////////////////////////////////////// |
namespace { |
- |
extern const GrVertexAttrib gAARectAttribs[] = { |
{kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding}, |
{kVec4ub_GrVertexAttribType, sizeof(SkPoint), kColor_GrVertexAttribBinding}, |
{kVec4ub_GrVertexAttribType, sizeof(SkPoint) + sizeof(SkColor), kCoverage_GrVertexAttribBinding}, |
}; |
+// Should the coverage be multiplied into the color attrib or use a separate attrib. |
+enum CoverageAttribType { |
+ kUseColor_CoverageAttribType, |
+ kUseCoverage_CoverageAttribType, |
+}; |
+} |
+ |
+static CoverageAttribType set_rect_attribs(GrDrawState* drawState) { |
+ if (drawState->canTweakAlphaForCoverage()) { |
+ drawState->setVertexAttribs<gAARectAttribs>(2); |
+ return kUseColor_CoverageAttribType; |
+ } else { |
+ drawState->setVertexAttribs<gAARectAttribs>(3); |
+ return kUseCoverage_CoverageAttribType; |
+ } |
+} |
+ |
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, |
r.fRight - dx, r.fBottom - dy, stride); |
} |
-}; |
- |
void GrAARectRenderer::reset() { |
SkSafeSetNull(fAAFillRectIndexBuffer); |
SkSafeSetNull(fAAMiterStrokeRectIndexBuffer); |
@@ -444,8 +458,8 @@ void GrAARectRenderer::geometryFillAARect(GrGpu* gpu, |
GrColor color = drawState->getColor(); |
- drawState->setVertexAttribs<gAARectAttribs>(SK_ARRAY_COUNT(gAARectAttribs)); |
- if (GrColorIsOpaque(color)) { |
+ CoverageAttribType covAttribType = set_rect_attribs(drawState); |
+ if (kUseCoverage_CoverageAttribType == covAttribType && GrColorIsOpaque(color)) { |
drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); |
} |
@@ -463,7 +477,6 @@ void GrAARectRenderer::geometryFillAARect(GrGpu* gpu, |
intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); |
size_t vsize = drawState->getVertexSize(); |
- SkASSERT(sizeof(SkPoint) + 2 * sizeof(GrColor) == vsize); |
SkPoint* fan0Pos = reinterpret_cast<SkPoint*>(verts); |
SkPoint* fan1Pos = reinterpret_cast<SkPoint*>(verts + 4 * vsize); |
@@ -523,8 +536,12 @@ void GrAARectRenderer::geometryFillAARect(GrGpu* gpu, |
// 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) = color; |
- *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = 0; |
+ if (kUseCoverage_CoverageAttribType == covAttribType) { |
+ *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
+ *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = 0; |
+ } else { |
+ *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; |
+ } |
} |
int scale; |
@@ -536,10 +553,19 @@ void GrAARectRenderer::geometryFillAARect(GrGpu* gpu, |
} |
GrColor innerCoverage; |
- innerCoverage = GrColorPackRGBA(scale, scale, scale, scale); verts += 4 * vsize; |
+ if (kUseCoverage_CoverageAttribType == covAttribType) { |
+ innerCoverage = GrColorPackRGBA(scale, scale, scale, scale); |
+ } else { |
+ innerCoverage = (0xff == scale) ? color : SkAlphaMulQ(color, scale); |
+ } |
+ verts += 4 * vsize; |
for (int i = 0; i < 4; ++i) { |
- *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
- *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = innerCoverage; |
+ if (kUseCoverage_CoverageAttribType == covAttribType) { |
+ *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
+ *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = innerCoverage; |
+ } else { |
+ *reinterpret_cast<GrColor*>(verts + i * vsize) = innerCoverage; |
+ } |
} |
target->setIndexSourceToBuffer(indexBuffer); |
@@ -779,10 +805,10 @@ void GrAARectRenderer::geometryStrokeAARect(GrGpu* gpu, |
bool miterStroke) { |
GrDrawState* drawState = target->drawState(); |
- drawState->setVertexAttribs<gAARectAttribs>(SK_ARRAY_COUNT(gAARectAttribs)); |
+ CoverageAttribType covAttribType = set_rect_attribs(drawState); |
GrColor color = drawState->getColor(); |
- if (GrColorIsOpaque(color)) { |
+ if (kUseCoverage_CoverageAttribType == covAttribType && GrColorIsOpaque(color)) { |
drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); |
} |
@@ -855,8 +881,12 @@ void GrAARectRenderer::geometryStrokeAARect(GrGpu* gpu, |
// The outermost rect has 0 coverage |
verts += sizeof(SkPoint); |
for (int i = 0; i < outerVertexNum; ++i) { |
- *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
- *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = 0; |
+ if (kUseCoverage_CoverageAttribType == covAttribType) { |
+ *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
+ *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = 0; |
+ } else { |
+ *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; |
+ } |
} |
// scale is the coverage for the the inner two rects. |
@@ -869,17 +899,31 @@ void GrAARectRenderer::geometryStrokeAARect(GrGpu* gpu, |
} |
verts += outerVertexNum * vsize; |
- GrColor innerCoverage = GrColorPackRGBA(scale, scale, scale, scale); |
+ GrColor innerCoverage; |
+ if (kUseCoverage_CoverageAttribType == covAttribType) { |
+ innerCoverage = GrColorPackRGBA(scale, scale, scale, scale); |
+ } else { |
+ innerCoverage = (0xff == scale) ? color : SkAlphaMulQ(color, scale); |
+ } |
+ |
for (int i = 0; i < outerVertexNum + innerVertexNum; ++i) { |
- *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
- *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = innerCoverage; |
+ if (kUseCoverage_CoverageAttribType == covAttribType) { |
+ *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
+ *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = innerCoverage; |
+ } else { |
+ *reinterpret_cast<GrColor*>(verts + i * vsize) = innerCoverage; |
+ } |
} |
// The innermost rect has 0 coverage |
verts += (outerVertexNum + innerVertexNum) * vsize; |
for (int i = 0; i < innerVertexNum; ++i) { |
- *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
- *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = 0; |
+ if (kUseCoverage_CoverageAttribType == covAttribType) { |
+ *reinterpret_cast<GrColor*>(verts + i * vsize) = color; |
+ *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = 0; |
+ } else { |
+ *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; |
+ } |
} |
target->setIndexSourceToBuffer(indexBuffer); |