Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(252)

Unified Diff: src/gpu/GrAARectRenderer.cpp

Issue 435743002: Always use both a color and coverage attribute in GrAARectRenderer. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix unsigned/signed issue Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/GrAARectRenderer.h ('k') | src/gpu/GrClipMaskManager.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrAARectRenderer.cpp
diff --git a/src/gpu/GrAARectRenderer.cpp b/src/gpu/GrAARectRenderer.cpp
index 44c16a18d67b3a5b98eeb9bdb2ef30a1f877b26d..be82d5b88fe7d2fe6077d8f3944bf51b1ef62bfd 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,15 @@ 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));
+ if (GrColorIsOpaque(color)) {
+ drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true);
+ }
GrDrawTarget::AutoReleaseGeometry geo(target, 8, 0);
if (!geo.succeeded()) {
@@ -471,7 +463,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 +520,11 @@ 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;
+ *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = 0;
}
int scale;
@@ -541,20 +535,11 @@ 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;
+ GrColor innerCoverage;
+ innerCoverage = GrColorPackRGBA(scale, scale, scale, 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;
+ *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = innerCoverage;
}
target->setIndexSourceToBuffer(indexBuffer);
@@ -723,8 +708,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 +751,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 +768,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 +776,15 @@ 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();
+ if (GrColorIsOpaque(color)) {
+ drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true);
+ }
int innerVertexNum = 4;
int outerVertexNum = miterStroke ? 4 : 8;
@@ -817,7 +803,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 +851,15 @@ void GrAARectRenderer::geometryStrokeAARect(GrGpu* gpu,
set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf);
}
+ // Make verts point to vertex color and then set all the color and coverage vertex attrs values.
// The outermost rect has 0 coverage
verts += sizeof(SkPoint);
for (int i = 0; i < outerVertexNum; ++i) {
- *reinterpret_cast<GrColor*>(verts + i * vsize) = 0;
+ *reinterpret_cast<GrColor*>(verts + i * vsize) = color;
+ *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 +868,18 @@ 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;
+ 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) = color;
+ *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;
+ *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = 0;
}
target->setIndexSourceToBuffer(indexBuffer);
@@ -911,8 +890,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 +900,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);
}
« no previous file with comments | « src/gpu/GrAARectRenderer.h ('k') | src/gpu/GrClipMaskManager.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698