Chromium Code Reviews| Index: src/gpu/GrAARectRenderer.cpp |
| =================================================================== |
| --- src/gpu/GrAARectRenderer.cpp (revision 9765) |
| +++ src/gpu/GrAARectRenderer.cpp (working copy) |
| @@ -728,10 +728,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); |
|
bsalomon
2013/06/26 15:47:49
As in square scale? Have we checked that anywhere?
robertphillips
2013/06/26 17:33:05
This code path explicitly expects non-uniform stro
|
| + 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 +750,26 @@ |
| *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 = scale | (scale << 8) | (scale << 16) | (scale << 24); |
|
bsalomon
2013/06/26 15:47:49
Can we use GrColorParckRGBA()?
robertphillips
2013/06/26 17:33:05
Done.
|
| } else { |
| - innerColor = target->getDrawState().getColor(); |
| + if (0xff == scale) { |
| + innerColor = target->getDrawState().getColor(); |
| + } else { |
| + innerColor = SkAlphaMulQ(target->getDrawState().getColor(), scale); |
|
bsalomon
2013/06/26 15:47:49
maybe just call this unconditionally?
robertphillips
2013/06/26 17:33:05
Done.
|
| + } |
| } |
| + |
| verts += 4 * vsize; |
| for (int i = 0; i < 8; ++i) { |
| *reinterpret_cast<GrColor*>(verts + i * vsize) = innerColor; |