| Index: src/gpu/GrOvalRenderer.cpp
|
| ===================================================================
|
| --- src/gpu/GrOvalRenderer.cpp (revision 8729)
|
| +++ src/gpu/GrOvalRenderer.cpp (working copy)
|
| @@ -420,17 +420,26 @@
|
| }
|
| #endif
|
|
|
| + // do any matrix crunching before we reset the draw state for device coords
|
| const SkMatrix& vm = drawState->getViewMatrix();
|
| GrPoint center = GrPoint::Make(ellipse.centerX(), ellipse.centerY());
|
| vm.mapPoints(¢er, 1);
|
| - SkRect xformedRect;
|
| - vm.mapRect(&xformedRect, ellipse);
|
| - SkScalar xRadius = SkScalarHalf(xformedRect.width());
|
| - SkScalar yRadius = SkScalarHalf(xformedRect.height());
|
| + SkScalar ellipseXRadius = SkScalarHalf(ellipse.width());
|
| + SkScalar ellipseYRadius = SkScalarHalf(ellipse.height());
|
| + SkScalar xRadius = SkScalarAbs(vm[SkMatrix::kMScaleX]*ellipseXRadius +
|
| + vm[SkMatrix::kMSkewY]*ellipseYRadius);
|
| + SkScalar yRadius = SkScalarAbs(vm[SkMatrix::kMSkewX]*ellipseXRadius +
|
| + vm[SkMatrix::kMScaleY]*ellipseYRadius);
|
| if (SkScalarDiv(xRadius, yRadius) > 2 || SkScalarDiv(yRadius, xRadius) > 2) {
|
| return false;
|
| }
|
|
|
| + // do (potentially) anisotropic mapping of stroke
|
| + SkVector scaledStroke;
|
| + SkScalar strokeWidth = stroke.getWidth();
|
| + scaledStroke.fX = SkScalarAbs(strokeWidth*(vm[SkMatrix::kMScaleX] + vm[SkMatrix::kMSkewY]));
|
| + scaledStroke.fY = SkScalarAbs(strokeWidth*(vm[SkMatrix::kMSkewX] + vm[SkMatrix::kMScaleY]));
|
| +
|
| GrDrawState::AutoDeviceCoordDraw adcd(drawState);
|
| if (!adcd.succeeded()) {
|
| return false;
|
| @@ -472,12 +481,7 @@
|
| SkScalar innerRatio = 1.0f;
|
|
|
| if (SkStrokeRec::kFill_Style != style) {
|
| - SkScalar strokeWidth = stroke.getWidth();
|
|
|
| - // do (potentially) anisotropic mapping
|
| - SkVector scaledStroke;
|
| - scaledStroke.set(strokeWidth, strokeWidth);
|
| - vm.mapVectors(&scaledStroke, 1);
|
|
|
| if (SkScalarNearlyZero(scaledStroke.length())) {
|
| scaledStroke.set(SK_ScalarHalf, SK_ScalarHalf);
|
|
|