| Index: src/gpu/GrOvalRenderer.cpp | 
| diff --git a/src/gpu/GrOvalRenderer.cpp b/src/gpu/GrOvalRenderer.cpp | 
| index e5eb665a3d479b6cdecbb7949db0ad04f8266aea..b8c3d3eeb8fc3f9972db37d41284c0959985d8b5 100644 | 
| --- a/src/gpu/GrOvalRenderer.cpp | 
| +++ b/src/gpu/GrOvalRenderer.cpp | 
| @@ -1526,7 +1526,7 @@ private: | 
| } | 
|  | 
| // Setup geometry processor | 
| -        SkAutoTUnref<GrGeometryProcessor> gp(new CircleGeometryProcessor(kStroke_RRectType == fType, | 
| +        SkAutoTUnref<GrGeometryProcessor> gp(new CircleGeometryProcessor(kFill_RRectType != fType, | 
| false, false, | 
| false, localMatrix)); | 
|  | 
| @@ -1612,73 +1612,77 @@ private: | 
| verts++; | 
| } | 
| // Add the additional vertices for overstroked rrects. | 
| -            // Effectively this is an additional rrect, drawn inside out, | 
| -            // with outerRadius == -innerRadius. This will give us correct AA in the center. | 
| +            // Effectively this is an additional stroked rrect, with its | 
| +            // outer radius = outerRadius - innerRadius, and inner radius = 0. | 
| +            // This will give us correct AA in the center and the correct | 
| +            // distance to the outer edge. | 
| // | 
| -            // Note that args.fInnerRadius is negative in this case. | 
| -            // Also, the offset is a constant vector pointing to the right, which guarantees | 
| -            // that the distance value along the inner rectangle is constant, which | 
| -            // is what we want to get nice anti-aliasing. | 
| +            // Also, the outer offset is a constant vector pointing to the right, which | 
| +            // guarantees that the distance value along the outer rectangle is constant. | 
| if (kOverstroke_RRectType == fType) { | 
| +                SkScalar overstrokeOuterRadius = outerRadius - args.fInnerRadius; | 
| +                // this is the normalized distance from the outer rectangle of this | 
| +                // geometry to the outer edge | 
| +                SkScalar maxOffset = -args.fInnerRadius/overstrokeOuterRadius; | 
| + | 
| verts->fPos = SkPoint::Make(bounds.fLeft + outerRadius, yCoords[1]); | 
| verts->fColor = color; | 
| -                verts->fOffset = SkPoint::Make(0, 0); | 
| -                verts->fOuterRadius = -args.fInnerRadius; | 
| -                verts->fInnerRadius = innerRadius; | 
| +                verts->fOffset = SkPoint::Make(maxOffset, 0); | 
| +                verts->fOuterRadius = overstrokeOuterRadius; | 
| +                verts->fInnerRadius = 0; | 
| verts++; | 
|  | 
| verts->fPos = SkPoint::Make(bounds.fRight - outerRadius, yCoords[1]); | 
| verts->fColor = color; | 
| -                verts->fOffset = SkPoint::Make(0, 0); | 
| -                verts->fOuterRadius = -args.fInnerRadius; | 
| -                verts->fInnerRadius = innerRadius; | 
| +                verts->fOffset = SkPoint::Make(maxOffset, 0); | 
| +                verts->fOuterRadius = overstrokeOuterRadius; | 
| +                verts->fInnerRadius = 0; | 
| verts++; | 
|  | 
| -                SkScalar inset = outerRadius - args.fInnerRadius; | 
| -                verts->fPos = SkPoint::Make(bounds.fLeft + inset, | 
| -                                            bounds.fTop + inset); | 
| +                verts->fPos = SkPoint::Make(bounds.fLeft + overstrokeOuterRadius, | 
| +                                            bounds.fTop + overstrokeOuterRadius); | 
| verts->fColor = color; | 
| -                verts->fOffset = SkPoint::Make(1, 0); | 
| -                verts->fOuterRadius = -args.fInnerRadius; | 
| -                verts->fInnerRadius = innerRadius; | 
| +                verts->fOffset = SkPoint::Make(0, 0); | 
| +                verts->fOuterRadius = overstrokeOuterRadius; | 
| +                verts->fInnerRadius = 0; | 
| verts++; | 
|  | 
| -                verts->fPos = SkPoint::Make(bounds.fRight - inset, | 
| -                                            bounds.fTop + inset); | 
| +                verts->fPos = SkPoint::Make(bounds.fRight - overstrokeOuterRadius, | 
| +                                            bounds.fTop + overstrokeOuterRadius); | 
| verts->fColor = color; | 
| -                verts->fOffset = SkPoint::Make(1, 0); | 
| -                verts->fOuterRadius = -args.fInnerRadius; | 
| -                verts->fInnerRadius = innerRadius; | 
| +                verts->fOffset = SkPoint::Make(0, 0); | 
| +                verts->fOuterRadius = overstrokeOuterRadius; | 
| +                verts->fInnerRadius = 0; | 
| verts++; | 
|  | 
| -                verts->fPos = SkPoint::Make(bounds.fLeft + inset, | 
| -                                            bounds.fBottom - inset); | 
| +                verts->fPos = SkPoint::Make(bounds.fLeft + overstrokeOuterRadius, | 
| +                                            bounds.fBottom - overstrokeOuterRadius); | 
| verts->fColor = color; | 
| -                verts->fOffset = SkPoint::Make(1, 0); | 
| -                verts->fOuterRadius = -args.fInnerRadius; | 
| -                verts->fInnerRadius = innerRadius; | 
| +                verts->fOffset = SkPoint::Make(0, 0); | 
| +                verts->fOuterRadius = overstrokeOuterRadius; | 
| +                verts->fInnerRadius = 0; | 
| verts++; | 
|  | 
| -                verts->fPos = SkPoint::Make(bounds.fRight - inset, | 
| -                                            bounds.fBottom - inset); | 
| +                verts->fPos = SkPoint::Make(bounds.fRight - overstrokeOuterRadius, | 
| +                                            bounds.fBottom - overstrokeOuterRadius); | 
| verts->fColor = color; | 
| -                verts->fOffset = SkPoint::Make(1, 0); | 
| -                verts->fOuterRadius = -args.fInnerRadius; | 
| -                verts->fInnerRadius = innerRadius; | 
| +                verts->fOffset = SkPoint::Make(0, 0); | 
| +                verts->fOuterRadius = overstrokeOuterRadius; | 
| +                verts->fInnerRadius = 0; | 
| verts++; | 
|  | 
| verts->fPos = SkPoint::Make(bounds.fLeft + outerRadius, yCoords[2]); | 
| verts->fColor = color; | 
| -                verts->fOffset = SkPoint::Make(0, 0); | 
| -                verts->fOuterRadius = -args.fInnerRadius; | 
| -                verts->fInnerRadius = innerRadius; | 
| +                verts->fOffset = SkPoint::Make(maxOffset, 0); | 
| +                verts->fOuterRadius = overstrokeOuterRadius; | 
| +                verts->fInnerRadius = 0; | 
| verts++; | 
|  | 
| verts->fPos = SkPoint::Make(bounds.fRight - outerRadius, yCoords[2]); | 
| verts->fColor = color; | 
| -                verts->fOffset = SkPoint::Make(0, 0); | 
| -                verts->fOuterRadius = -args.fInnerRadius; | 
| -                verts->fInnerRadius = innerRadius; | 
| +                verts->fOffset = SkPoint::Make(maxOffset, 0); | 
| +                verts->fOuterRadius = overstrokeOuterRadius; | 
| +                verts->fInnerRadius = 0; | 
| verts++; | 
| } | 
| } | 
|  |