Index: src/gpu/GrOvalRenderer.cpp |
diff --git a/src/gpu/GrOvalRenderer.cpp b/src/gpu/GrOvalRenderer.cpp |
index 05838cf6e503a8ce0ee6f56c82bdb92850352e8d..ac088b93e68cf889500f5ac3885fa44decda39b9 100644 |
--- a/src/gpu/GrOvalRenderer.cpp |
+++ b/src/gpu/GrOvalRenderer.cpp |
@@ -65,8 +65,8 @@ inline bool circle_stays_circle(const SkMatrix& m) { |
class CircleEdgeEffect : public GrGeometryProcessor { |
public: |
- static GrGeometryProcessor* Create(GrColor color, bool stroke) { |
- return SkNEW_ARGS(CircleEdgeEffect, (color, stroke)); |
+ static GrGeometryProcessor* Create(GrColor color, bool stroke, const SkMatrix& localMatrix) { |
+ return SkNEW_ARGS(CircleEdgeEffect, (color, stroke, localMatrix)); |
} |
const GrAttribute* inPosition() const { return fInPosition; } |
@@ -174,7 +174,8 @@ public: |
} |
private: |
- CircleEdgeEffect(GrColor color, bool stroke) : INHERITED(color) { |
+ CircleEdgeEffect(GrColor color, bool stroke, const SkMatrix& localMatrix) |
+ : INHERITED(color, false, localMatrix) { |
this->initClassID<CircleEdgeEffect>(); |
fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType)); |
fInCircleEdge = &this->addVertexAttrib(GrAttribute("inCircleEdge", |
@@ -212,7 +213,8 @@ GrGeometryProcessor* CircleEdgeEffect::TestCreate(SkRandom* random, |
GrContext* context, |
const GrDrawTargetCaps&, |
GrTexture* textures[]) { |
- return CircleEdgeEffect::Create(GrRandomColor(random), random->nextBool()); |
+ return CircleEdgeEffect::Create(GrRandomColor(random), random->nextBool(), |
+ GrProcessorUnitTest::TestMatrix(random)); |
} |
/////////////////////////////////////////////////////////////////////////////// |
@@ -227,8 +229,8 @@ GrGeometryProcessor* CircleEdgeEffect::TestCreate(SkRandom* random, |
class EllipseEdgeEffect : public GrGeometryProcessor { |
public: |
- static GrGeometryProcessor* Create(GrColor color, bool stroke) { |
- return SkNEW_ARGS(EllipseEdgeEffect, (color, stroke)); |
+ static GrGeometryProcessor* Create(GrColor color, bool stroke, const SkMatrix& localMatrix) { |
+ return SkNEW_ARGS(EllipseEdgeEffect, (color, stroke, localMatrix)); |
} |
virtual ~EllipseEdgeEffect() {} |
@@ -360,7 +362,8 @@ public: |
} |
private: |
- EllipseEdgeEffect(GrColor color, bool stroke) : INHERITED(color) { |
+ EllipseEdgeEffect(GrColor color, bool stroke, const SkMatrix& localMatrix) |
+ : INHERITED(color, false, localMatrix) { |
this->initClassID<EllipseEdgeEffect>(); |
fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVertexAttribType)); |
fInEllipseOffset = &this->addVertexAttrib(GrAttribute("inEllipseOffset", |
@@ -401,7 +404,8 @@ GrGeometryProcessor* EllipseEdgeEffect::TestCreate(SkRandom* random, |
GrContext* context, |
const GrDrawTargetCaps&, |
GrTexture* textures[]) { |
- return EllipseEdgeEffect::Create(GrRandomColor(random), random->nextBool()); |
+ return EllipseEdgeEffect::Create(GrRandomColor(random), random->nextBool(), |
+ GrProcessorUnitTest::TestMatrix(random)); |
} |
/////////////////////////////////////////////////////////////////////////////// |
@@ -667,11 +671,13 @@ void GrOvalRenderer::drawCircle(GrDrawTarget* target, |
SkScalar radius = vm.mapRadius(SkScalarHalf(circle.width())); |
SkScalar strokeWidth = vm.mapRadius(stroke.getWidth()); |
- GrDrawState::AutoViewMatrixRestore avmr; |
- if (!avmr.setIdentity(drawState)) { |
+ SkMatrix invert; |
+ if (!vm.invert(&invert)) { |
return; |
} |
+ GrDrawState::AutoViewMatrixRestore avmr(drawState); |
+ |
SkStrokeRec::Style style = stroke.getStyle(); |
bool isStrokeOnly = SkStrokeRec::kStroke_Style == style || |
SkStrokeRec::kHairline_Style == style; |
@@ -694,7 +700,7 @@ void GrOvalRenderer::drawCircle(GrDrawTarget* target, |
} |
SkAutoTUnref<GrGeometryProcessor> gp( |
- CircleEdgeEffect::Create(color, isStrokeOnly && innerRadius > 0)); |
+ CircleEdgeEffect::Create(color, isStrokeOnly && innerRadius > 0, invert)); |
GrDrawTarget::AutoReleaseGeometry geo(target, 4, gp->getVertexStride(), 0); |
SkASSERT(gp->getVertexStride() == sizeof(CircleVertex)); |
@@ -816,13 +822,16 @@ bool GrOvalRenderer::drawEllipse(GrDrawTarget* target, |
yRadius += scaledStroke.fY; |
} |
- GrDrawState::AutoViewMatrixRestore avmr; |
- if (!avmr.setIdentity(drawState)) { |
+ SkMatrix invert; |
+ if (!vm.invert(&invert)) { |
return false; |
} |
+ GrDrawState::AutoViewMatrixRestore avmr(drawState); |
+ |
SkAutoTUnref<GrGeometryProcessor> gp( |
- EllipseEdgeEffect::Create(color, isStrokeOnly && innerXRadius > 0 && innerYRadius > 0)); |
+ EllipseEdgeEffect::Create(color, isStrokeOnly && innerXRadius > 0 && innerYRadius > 0, |
+ invert)); |
GrDrawTarget::AutoReleaseGeometry geo(target, 4, gp->getVertexStride(), 0); |
SkASSERT(gp->getVertexStride() == sizeof(EllipseVertex)); |
@@ -1084,16 +1093,19 @@ bool GrOvalRenderer::drawDRRect(GrDrawTarget* target, |
if (!are.isSet()) { |
are.set(drawState); |
} |
- GrDrawState::AutoViewMatrixRestore avmr; |
- if (!avmr.setIdentity(drawState)) { |
+ |
+ SkMatrix invert; |
+ if (!drawState->getViewMatrix().invert(&invert)) { |
return false; |
} |
+ |
+ GrDrawState::AutoViewMatrixRestore avmr(drawState); |
drawState->addCoverageProcessor(effect)->unref(); |
SkRect bounds = outer->getBounds(); |
if (applyAA) { |
bounds.outset(SK_ScalarHalf, SK_ScalarHalf); |
} |
- target->drawSimpleRect(drawState, color, bounds); |
+ target->drawRect(drawState, color, bounds, NULL, &invert); |
return true; |
} |
@@ -1169,11 +1181,14 @@ bool GrOvalRenderer::drawRRect(GrDrawTarget* target, |
} |
// reset to device coordinates |
- GrDrawState::AutoViewMatrixRestore avmr; |
- if (!avmr.setIdentity(drawState)) { |
+ SkMatrix invert; |
+ if (!vm.invert(&invert)) { |
+ SkDebugf("Failed to invert\n"); |
return false; |
} |
+ GrDrawState::AutoViewMatrixRestore avmr(drawState); |
+ |
GrIndexBuffer* indexBuffer = this->rRectIndexBuffer(isStrokeOnly); |
if (NULL == indexBuffer) { |
SkDebugf("Failed to create index buffer!\n"); |
@@ -1201,7 +1216,8 @@ bool GrOvalRenderer::drawRRect(GrDrawTarget* target, |
isStrokeOnly = (isStrokeOnly && innerRadius >= 0); |
- SkAutoTUnref<GrGeometryProcessor> effect(CircleEdgeEffect::Create(color, isStrokeOnly)); |
+ SkAutoTUnref<GrGeometryProcessor> effect(CircleEdgeEffect::Create(color, isStrokeOnly, |
+ invert)); |
GrDrawTarget::AutoReleaseGeometry geo(target, 16, effect->getVertexStride(), 0); |
SkASSERT(effect->getVertexStride() == sizeof(CircleVertex)); |
@@ -1300,7 +1316,8 @@ bool GrOvalRenderer::drawRRect(GrDrawTarget* target, |
isStrokeOnly = (isStrokeOnly && innerXRadius >= 0 && innerYRadius >= 0); |
- SkAutoTUnref<GrGeometryProcessor> effect(EllipseEdgeEffect::Create(color, isStrokeOnly)); |
+ SkAutoTUnref<GrGeometryProcessor> effect(EllipseEdgeEffect::Create(color, isStrokeOnly, |
+ invert)); |
GrDrawTarget::AutoReleaseGeometry geo(target, 16, effect->getVertexStride(), 0); |
SkASSERT(effect->getVertexStride() == sizeof(EllipseVertex)); |