aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-06-28 17:57:06 +0000
committerGravatar robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-06-28 17:57:06 +0000
commit353f0971d8179f07d2132f18406057c25fde26b4 (patch)
tree62df78f624dd6a645edc1d09122a0ab2b9dbe2c5
parent5330e44796a656b15a4619baec1cab604827d953 (diff)
GPU "fix" for thin stroked rects
-rw-r--r--src/gpu/GrAARectRenderer.cpp34
1 files changed, 24 insertions, 10 deletions
diff --git a/src/gpu/GrAARectRenderer.cpp b/src/gpu/GrAARectRenderer.cpp
index 97fe62601e..5c24f6e79e 100644
--- a/src/gpu/GrAARectRenderer.cpp
+++ b/src/gpu/GrAARectRenderer.cpp
@@ -470,13 +470,9 @@ void GrAARectRenderer::geometryFillAARect(GrGpu* gpu,
GrColor innerColor;
if (useVertexCoverage) {
- innerColor = scale | (scale << 8) | (scale << 16) | (scale << 24);
+ innerColor = GrColorPackRGBA(scale, scale, scale, scale);
} else {
- if (0xff == scale) {
- innerColor = target->getDrawState().getColor();
- } else {
- innerColor = SkAlphaMulQ(target->getDrawState().getColor(), scale);
- }
+ innerColor = SkAlphaMulQ(target->getDrawState().getColor(), scale);
}
verts += 4 * vsize;
@@ -728,10 +724,19 @@ void GrAARectRenderer::geometryStrokeAARect(GrGpu* gpu,
GrPoint* fan2Pos = reinterpret_cast<GrPoint*>(verts + 8 * vsize);
GrPoint* fan3Pos = reinterpret_cast<GrPoint*>(verts + 12 * vsize);
+ // TODO: this only really works if the X & Y margins are the same all around
+ // the rect
+ SkScalar inset = SkMinScalar(SK_Scalar1, devOutside.fRight - devInside.fRight);
+ inset = SkMinScalar(inset, devInside.fLeft - devOutside.fLeft);
+ inset = SkMinScalar(inset, devInside.fTop - devOutside.fTop);
+ inset = SK_ScalarHalf * SkMinScalar(inset, devOutside.fBottom - devInside.fBottom);
+ SkASSERT(inset >= 0);
+
// outermost
set_inset_fan(fan0Pos, vsize, devOutside, -SK_ScalarHalf, -SK_ScalarHalf);
- set_inset_fan(fan1Pos, vsize, devOutside, SK_ScalarHalf, SK_ScalarHalf);
- set_inset_fan(fan2Pos, vsize, devInside, -SK_ScalarHalf, -SK_ScalarHalf);
+ // inner two
+ set_inset_fan(fan1Pos, vsize, devOutside, inset, inset);
+ set_inset_fan(fan2Pos, vsize, devInside, -inset, -inset);
// innermost
set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf);
@@ -741,13 +746,22 @@ void GrAARectRenderer::geometryStrokeAARect(GrGpu* gpu,
*reinterpret_cast<GrColor*>(verts + i * vsize) = 0;
}
+ int scale;
+ if (inset < SK_ScalarHalf) {
+ scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf));
+ SkASSERT(scale >= 0 && scale <= 255);
+ } else {
+ scale = 0xff;
+ }
+
// The inner two rects have full coverage
GrColor innerColor;
if (useVertexCoverage) {
- innerColor = 0xffffffff;
+ innerColor = GrColorPackRGBA(scale, scale, scale, scale);
} else {
- innerColor = target->getDrawState().getColor();
+ innerColor = SkAlphaMulQ(target->getDrawState().getColor(), scale);
}
+
verts += 4 * vsize;
for (int i = 0; i < 8; ++i) {
*reinterpret_cast<GrColor*>(verts + i * vsize) = innerColor;