Fix stroked oval and rrect rendering on Ubuntu-x86-Release.
The Ubuntu-x86 compiler was optimizing out a case where I was reseting the isStroked boolean based on the new inner radii. This changes it to check the radii at the time the effect is created, which tricks the compiler into doing the right thing. R=bsalomon@google.com, robertphillips@google.com Author: jvanverth@google.com Review URL: https://chromiumcodereview.appspot.com/23592021 git-svn-id: http://skia.googlecode.com/svn/trunk@11035 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
parent
a6f37e77c1
commit
cefde6e578
@ -359,10 +359,6 @@ void GrOvalRenderer::drawCircle(GrDrawTarget* target,
|
||||
SkStrokeRec::Style style = stroke.getStyle();
|
||||
bool isStroked = (SkStrokeRec::kStroke_Style == style || SkStrokeRec::kHairline_Style == style);
|
||||
|
||||
GrEffectRef* effect = CircleEdgeEffect::Create(isStroked);
|
||||
static const int kCircleEdgeAttrIndex = 1;
|
||||
drawState->addCoverageEffect(effect, kCircleEdgeAttrIndex)->unref();
|
||||
|
||||
SkScalar innerRadius = 0.0f;
|
||||
SkScalar outerRadius = radius;
|
||||
SkScalar halfWidth = 0;
|
||||
@ -376,10 +372,13 @@ void GrOvalRenderer::drawCircle(GrDrawTarget* target,
|
||||
outerRadius += halfWidth;
|
||||
if (isStroked) {
|
||||
innerRadius = radius - halfWidth;
|
||||
isStroked = (innerRadius > 0);
|
||||
}
|
||||
}
|
||||
|
||||
GrEffectRef* effect = CircleEdgeEffect::Create(isStroked && innerRadius > 0);
|
||||
static const int kCircleEdgeAttrIndex = 1;
|
||||
drawState->addCoverageEffect(effect, kCircleEdgeAttrIndex)->unref();
|
||||
|
||||
// The radii are outset for two reasons. First, it allows the shader to simply perform
|
||||
// clamp(distance-to-center - radius, 0, 1). Second, the outer radius is used to compute the
|
||||
// verts of the bounding box that is rendered and the outset ensures the box will cover all
|
||||
@ -489,7 +488,6 @@ bool GrOvalRenderer::drawEllipse(GrDrawTarget* target,
|
||||
if (isStroked) {
|
||||
innerXRadius = xRadius - scaledStroke.fX;
|
||||
innerYRadius = yRadius - scaledStroke.fY;
|
||||
isStroked = (innerXRadius > 0 && innerYRadius > 0);
|
||||
}
|
||||
|
||||
xRadius += scaledStroke.fX;
|
||||
@ -512,7 +510,8 @@ bool GrOvalRenderer::drawEllipse(GrDrawTarget* target,
|
||||
|
||||
EllipseVertex* verts = reinterpret_cast<EllipseVertex*>(geo.vertices());
|
||||
|
||||
GrEffectRef* effect = EllipseEdgeEffect::Create(isStroked);
|
||||
GrEffectRef* effect = EllipseEdgeEffect::Create(isStroked &&
|
||||
innerXRadius > 0 && innerYRadius > 0);
|
||||
|
||||
static const int kEllipseCenterAttrIndex = 1;
|
||||
static const int kEllipseEdgeAttrIndex = 2;
|
||||
@ -683,12 +682,13 @@ bool GrOvalRenderer::drawSimpleRRect(GrDrawTarget* target, GrContext* context, b
|
||||
|
||||
if (isStroked) {
|
||||
innerRadius = xRadius - halfWidth;
|
||||
isStroked = (innerRadius > 0);
|
||||
}
|
||||
outerRadius += halfWidth;
|
||||
bounds.outset(halfWidth, halfWidth);
|
||||
}
|
||||
|
||||
isStroked = (isStroked && innerRadius > 0);
|
||||
|
||||
GrEffectRef* effect = CircleEdgeEffect::Create(isStroked);
|
||||
static const int kCircleEdgeAttrIndex = 1;
|
||||
drawState->addCoverageEffect(effect, kCircleEdgeAttrIndex)->unref();
|
||||
@ -776,7 +776,6 @@ bool GrOvalRenderer::drawSimpleRRect(GrDrawTarget* target, GrContext* context, b
|
||||
if (isStroked) {
|
||||
innerXRadius = xRadius - scaledStroke.fX;
|
||||
innerYRadius = yRadius - scaledStroke.fY;
|
||||
isStroked = (innerXRadius > 0 && innerYRadius > 0);
|
||||
}
|
||||
|
||||
xRadius += scaledStroke.fX;
|
||||
@ -784,6 +783,8 @@ bool GrOvalRenderer::drawSimpleRRect(GrDrawTarget* target, GrContext* context, b
|
||||
bounds.outset(scaledStroke.fX, scaledStroke.fY);
|
||||
}
|
||||
|
||||
isStroked = (isStroked && innerXRadius > 0 && innerYRadius > 0);
|
||||
|
||||
GrDrawTarget::AutoReleaseGeometry geo(target, 16, 0);
|
||||
if (!geo.succeeded()) {
|
||||
GrPrintf("Failed to get space for vertices!\n");
|
||||
|
Loading…
Reference in New Issue
Block a user