Index: src/gpu/GrAAHairLinePathRenderer.cpp |
diff --git a/src/gpu/GrAAHairLinePathRenderer.cpp b/src/gpu/GrAAHairLinePathRenderer.cpp |
index 319228e146a4f42a408298acebce968f5bea788b..eea6463702ce259f71ea93d615d84f99efc33ef5 100644 |
--- a/src/gpu/GrAAHairLinePathRenderer.cpp |
+++ b/src/gpu/GrAAHairLinePathRenderer.cpp |
@@ -644,6 +644,7 @@ void add_line(const SkPoint p[2], |
bool GrAAHairLinePathRenderer::createLineGeom(GrDrawTarget* target, |
GrDrawState* drawState, |
+ const SkMatrix& viewMatrix, |
uint8_t coverage, |
size_t vertexStride, |
GrDrawTarget::AutoReleaseGeometry* arg, |
@@ -651,8 +652,6 @@ bool GrAAHairLinePathRenderer::createLineGeom(GrDrawTarget* target, |
const SkPath& path, |
const PtArray& lines, |
int lineCnt) { |
- const SkMatrix& viewM = drawState->getViewMatrix(); |
- |
int vertCnt = kLineSegNumVertices * lineCnt; |
SkASSERT(vertexStride == sizeof(LineVertex)); |
@@ -665,8 +664,8 @@ bool GrAAHairLinePathRenderer::createLineGeom(GrDrawTarget* target, |
const SkMatrix* toSrc = NULL; |
SkMatrix ivm; |
- if (viewM.hasPerspective()) { |
- if (viewM.invert(&ivm)) { |
+ if (viewMatrix.hasPerspective()) { |
+ if (viewMatrix.invert(&ivm)) { |
toSrc = &ivm; |
} |
} |
@@ -685,6 +684,7 @@ bool GrAAHairLinePathRenderer::createLineGeom(GrDrawTarget* target, |
bool GrAAHairLinePathRenderer::createBezierGeom(GrDrawTarget* target, |
GrDrawState* drawState, |
+ const SkMatrix& viewMatrix, |
GrDrawTarget::AutoReleaseGeometry* arg, |
SkRect* devBounds, |
const SkPath& path, |
@@ -695,8 +695,6 @@ bool GrAAHairLinePathRenderer::createBezierGeom(GrDrawTarget* target, |
const IntArray& qSubdivs, |
const FloatArray& cWeights, |
size_t vertexStride) { |
- const SkMatrix& viewM = drawState->getViewMatrix(); |
- |
int vertCnt = kQuadNumVertices * quadCnt + kQuadNumVertices * conicCnt; |
if (!arg->set(target, vertCnt, vertexStride, 0)) { |
@@ -709,9 +707,9 @@ bool GrAAHairLinePathRenderer::createBezierGeom(GrDrawTarget* target, |
const SkMatrix* toSrc = NULL; |
SkMatrix ivm; |
- if (viewM.hasPerspective()) { |
- if (viewM.invert(&ivm)) { |
- toDevice = &viewM; |
+ if (viewMatrix.hasPerspective()) { |
+ if (viewMatrix.invert(&ivm)) { |
+ toDevice = &viewMatrix; |
toSrc = &ivm; |
} |
} |
@@ -746,6 +744,7 @@ bool GrAAHairLinePathRenderer::createBezierGeom(GrDrawTarget* target, |
bool GrAAHairLinePathRenderer::canDrawPath(const GrDrawTarget* target, |
const GrDrawState* drawState, |
+ const SkMatrix& viewMatrix, |
const SkPath& path, |
const SkStrokeRec& stroke, |
bool antiAlias) const { |
@@ -753,9 +752,7 @@ bool GrAAHairLinePathRenderer::canDrawPath(const GrDrawTarget* target, |
return false; |
} |
- if (!IsStrokeHairlineOrEquivalent(stroke, |
- drawState->getViewMatrix(), |
- NULL)) { |
+ if (!IsStrokeHairlineOrEquivalent(stroke, viewMatrix, NULL)) { |
return false; |
} |
@@ -767,16 +764,16 @@ bool GrAAHairLinePathRenderer::canDrawPath(const GrDrawTarget* target, |
} |
template <class VertexType> |
-bool check_bounds(GrDrawState* drawState, const SkRect& devBounds, void* vertices, int vCount) |
+bool check_bounds(const SkMatrix& viewMatrix, const SkRect& devBounds, void* vertices, int vCount) |
{ |
SkRect tolDevBounds = devBounds; |
// The bounds ought to be tight, but in perspective the below code runs the verts |
// through the view matrix to get back to dev coords, which can introduce imprecision. |
- if (drawState->getViewMatrix().hasPerspective()) { |
+ if (viewMatrix.hasPerspective()) { |
tolDevBounds.outset(SK_Scalar1 / 1000, SK_Scalar1 / 1000); |
} else { |
// Non-persp matrices cause this path renderer to draw in device space. |
- SkASSERT(drawState->getViewMatrix().isIdentity()); |
+ SkASSERT(viewMatrix.isIdentity()); |
} |
SkRect actualBounds; |
@@ -788,7 +785,7 @@ bool check_bounds(GrDrawState* drawState, const SkRect& devBounds, void* vertice |
if (SK_ScalarMax == pos.fX) { |
continue; |
} |
- drawState->getViewMatrix().mapPoints(&pos, 1); |
+ viewMatrix.mapPoints(&pos, 1); |
if (first) { |
actualBounds.set(pos.fX, pos.fY, pos.fX, pos.fY); |
first = false; |
@@ -806,13 +803,13 @@ bool check_bounds(GrDrawState* drawState, const SkRect& devBounds, void* vertice |
bool GrAAHairLinePathRenderer::onDrawPath(GrDrawTarget* target, |
GrDrawState* drawState, |
GrColor color, |
+ const SkMatrix& viewMatrix, |
const SkPath& path, |
const SkStrokeRec& stroke, |
bool antiAlias) { |
SkScalar hairlineCoverage; |
uint8_t newCoverage = 0xff; |
- if (IsStrokeHairlineOrEquivalent(stroke, drawState->getViewMatrix(), |
- &hairlineCoverage)) { |
+ if (IsStrokeHairlineOrEquivalent(stroke, viewMatrix, &hairlineCoverage)) { |
newCoverage = SkScalarRoundToInt(hairlineCoverage * 0xff); |
} |
@@ -827,18 +824,18 @@ bool GrAAHairLinePathRenderer::onDrawPath(GrDrawTarget* target, |
PREALLOC_PTARRAY(128) conics; |
IntArray qSubdivs; |
FloatArray cWeights; |
- quadCnt = generate_lines_and_quads(path, drawState->getViewMatrix(), devClipBounds, |
+ quadCnt = generate_lines_and_quads(path, viewMatrix, devClipBounds, |
&lines, &quads, &conics, &qSubdivs, &cWeights); |
lineCnt = lines.count() / 2; |
conicCnt = conics.count() / 3; |
// createGeom transforms the geometry to device space when the matrix does not have |
// perspective. |
- GrDrawState::AutoViewMatrixRestore avmr; |
+ SkMatrix vm = viewMatrix; |
SkMatrix invert = SkMatrix::I(); |
- if (!drawState->getViewMatrix().hasPerspective()) { |
- avmr.setIdentity(drawState); |
- if (!drawState->getViewMatrix().invert(&invert)) { |
+ if (!viewMatrix.hasPerspective()) { |
+ vm = SkMatrix::I(); |
+ if (!viewMatrix.invert(&invert)) { |
return false; |
} |
} |
@@ -851,14 +848,16 @@ bool GrAAHairLinePathRenderer::onDrawPath(GrDrawTarget* target, |
GrDrawState::AutoRestoreEffects are(drawState); |
uint32_t gpFlags = GrDefaultGeoProcFactory::kPosition_GPType | |
GrDefaultGeoProcFactory::kCoverage_GPType; |
- SkAutoTUnref<const GrGeometryProcessor> gp(GrDefaultGeoProcFactory::Create(color, |
- gpFlags, |
+ SkAutoTUnref<const GrGeometryProcessor> gp(GrDefaultGeoProcFactory::Create(gpFlags, |
+ color, |
+ vm, |
+ invert, |
false, |
- newCoverage, |
- invert)); |
+ newCoverage)); |
if (!this->createLineGeom(target, |
drawState, |
+ viewMatrix, |
newCoverage, |
gp->getVertexStride(), |
&arg, |
@@ -870,7 +869,9 @@ bool GrAAHairLinePathRenderer::onDrawPath(GrDrawTarget* target, |
} |
// Check devBounds |
- SkASSERT(check_bounds<LineVertex>(drawState, devBounds, arg.vertices(), |
+ SkASSERT(check_bounds<LineVertex>(viewMatrix.hasPerspective() ? viewMatrix : SkMatrix::I(), |
+ devBounds, |
+ arg.vertices(), |
kLineSegNumVertices * lineCnt)); |
{ |
@@ -898,6 +899,7 @@ bool GrAAHairLinePathRenderer::onDrawPath(GrDrawTarget* target, |
if (!this->createBezierGeom(target, |
drawState, |
+ viewMatrix, |
&arg, |
&devBounds, |
path, |
@@ -912,12 +914,17 @@ bool GrAAHairLinePathRenderer::onDrawPath(GrDrawTarget* target, |
} |
// Check devBounds |
- SkASSERT(check_bounds<BezierVertex>(drawState, devBounds, arg.vertices(), |
- kQuadNumVertices * quadCnt + kQuadNumVertices * conicCnt)); |
+ SkASSERT(check_bounds<BezierVertex>(viewMatrix.hasPerspective() ? viewMatrix : |
+ SkMatrix::I(), |
+ devBounds, |
+ arg.vertices(), |
+ kQuadNumVertices * quadCnt + |
+ kQuadNumVertices * conicCnt)); |
if (quadCnt > 0) { |
SkAutoTUnref<GrGeometryProcessor> hairQuadProcessor( |
GrQuadEffect::Create(color, |
+ vm, |
kHairlineAA_GrProcessorEdgeType, |
*target->caps(), |
invert, |
@@ -943,8 +950,8 @@ bool GrAAHairLinePathRenderer::onDrawPath(GrDrawTarget* target, |
if (conicCnt > 0) { |
SkAutoTUnref<GrGeometryProcessor> hairConicProcessor( |
- GrConicEffect::Create(color, kHairlineAA_GrProcessorEdgeType, *target->caps(), |
- invert, newCoverage)); |
+ GrConicEffect::Create(color, vm, kHairlineAA_GrProcessorEdgeType, |
+ *target->caps(), invert, newCoverage)); |
SkASSERT(hairConicProcessor); |
GrDrawState::AutoRestoreEffects are(drawState); |
target->setIndexSourceToBuffer(fQuadsIndexBuffer); |