aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu
diff options
context:
space:
mode:
authorGravatar jvanverth@google.com <jvanverth@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-04-16 12:30:35 +0000
committerGravatar jvanverth@google.com <jvanverth@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-04-16 12:30:35 +0000
commitc4f2ecaa475756bda48684b1158ec6b8bbdd1016 (patch)
treec5082b3539cbf3f2fd555ad65eab6dd01872ce24 /src/gpu
parent7841c63136e8aa2d3aadbeab8432405abcd73c32 (diff)
Disable GPU acceleration for narrow ovals.
GPU anti-aliasing is currently not correct for ellipses where the ratio of long axis length to short axis length is greater than 2 (see https://code.google.com/p/skia/issues/detail?id=1249). This disables the GPU path for those cases. Review URL: https://codereview.chromium.org/13925015/ git-svn-id: http://skia.googlecode.com/svn/trunk@8694 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/gpu')
-rw-r--r--src/gpu/GrOvalRenderer.cpp17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/gpu/GrOvalRenderer.cpp b/src/gpu/GrOvalRenderer.cpp
index 71052bc3c5..ff468fd83d 100644
--- a/src/gpu/GrOvalRenderer.cpp
+++ b/src/gpu/GrOvalRenderer.cpp
@@ -297,7 +297,7 @@ bool GrOvalRenderer::drawOval(GrDrawTarget* target, const GrContext* context, co
// and axis-aligned ellipses only
} else if (vm.rectStaysRect()) {
- drawEllipse(target, paint, oval, stroke);
+ return drawEllipse(target, paint, oval, stroke);
} else {
return false;
@@ -406,7 +406,7 @@ void GrOvalRenderer::drawCircle(GrDrawTarget* target,
target->drawNonIndexed(kTriangleStrip_GrPrimitiveType, 0, 4, &bounds);
}
-void GrOvalRenderer::drawEllipse(GrDrawTarget* target,
+bool GrOvalRenderer::drawEllipse(GrDrawTarget* target,
const GrPaint& paint,
const GrRect& ellipse,
const SkStrokeRec& stroke)
@@ -425,10 +425,15 @@ void GrOvalRenderer::drawEllipse(GrDrawTarget* target,
vm.mapPoints(&center, 1);
SkRect xformedRect;
vm.mapRect(&xformedRect, ellipse);
+ SkScalar xRadius = SkScalarHalf(xformedRect.width());
+ SkScalar yRadius = SkScalarHalf(xformedRect.height());
+ if (SkScalarDiv(xRadius, yRadius) > 2 || SkScalarDiv(yRadius, xRadius) > 2) {
+ return false;
+ }
GrDrawState::AutoDeviceCoordDraw adcd(drawState);
if (!adcd.succeeded()) {
- return;
+ return false;
}
// position + edge
@@ -443,7 +448,7 @@ void GrOvalRenderer::drawEllipse(GrDrawTarget* target,
GrDrawTarget::AutoReleaseGeometry geo(target, 4, 0);
if (!geo.succeeded()) {
GrPrintf("Failed to get space for vertices!\n");
- return;
+ return false;
}
EllipseVertex* verts = reinterpret_cast<EllipseVertex*>(geo.vertices());
@@ -463,8 +468,6 @@ void GrOvalRenderer::drawEllipse(GrDrawTarget* target,
drawState->setEffect(kEdgeEffectStage, effect,
kEllipseCenterAttrIndex, kEllipseEdgeAttrIndex)->unref();
- SkScalar xRadius = SkScalarHalf(xformedRect.width());
- SkScalar yRadius = SkScalarHalf(xformedRect.height());
SkScalar innerXRadius = 0.0f;
SkScalar innerRatio = 1.0f;
@@ -538,4 +541,6 @@ void GrOvalRenderer::drawEllipse(GrDrawTarget* target,
verts[3].fInnerOffset = SkPoint::Make(xRadius, innerRatio*yRadius);
target->drawNonIndexed(kTriangleStrip_GrPrimitiveType, 0, 4, &bounds);
+
+ return true;
}