Index: src/gpu/GrAARectRenderer.cpp |
=================================================================== |
--- src/gpu/GrAARectRenderer.cpp (revision 9770) |
+++ src/gpu/GrAARectRenderer.cpp (working copy) |
@@ -470,13 +470,9 @@ |
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 @@ |
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 @@ |
*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; |