diff options
author | robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-06-28 17:57:06 +0000 |
---|---|---|
committer | robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-06-28 17:57:06 +0000 |
commit | 353f0971d8179f07d2132f18406057c25fde26b4 (patch) | |
tree | 62df78f624dd6a645edc1d09122a0ab2b9dbe2c5 | |
parent | 5330e44796a656b15a4619baec1cab604827d953 (diff) |
GPU "fix" for thin stroked rects
https://codereview.chromium.org/17845003/
git-svn-id: http://skia.googlecode.com/svn/trunk@9812 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r-- | src/gpu/GrAARectRenderer.cpp | 34 |
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; |