Index: src/gpu/GrContext.cpp |
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp |
index d6431f07503ec4c98da7009ac7ffa652154edac0..cb68374c72f64ac48d70857bee38d2b8ebfb801b 100755 |
--- a/src/gpu/GrContext.cpp |
+++ b/src/gpu/GrContext.cpp |
@@ -103,7 +103,6 @@ GrContext::GrContext(const Options& opts) : fOptions(opts) { |
fFlushToReduceCacheSize = false; |
fAARectRenderer = NULL; |
fOvalRenderer = NULL; |
- fViewMatrix.reset(); |
fMaxTextureSizeOverride = 1 << 20; |
} |
@@ -127,7 +126,7 @@ void GrContext::initCommon() { |
fLayerCache.reset(SkNEW_ARGS(GrLayerCache, (this))); |
fAARectRenderer = SkNEW_ARGS(GrAARectRenderer, (fGpu)); |
- fOvalRenderer = SkNEW(GrOvalRenderer); |
+ fOvalRenderer = SkNEW_ARGS(GrOvalRenderer, (fGpu)); |
fDidTestPMConversions = false; |
@@ -541,36 +540,35 @@ void GrContext::clear(const SkIRect* rect, |
AutoCheckFlush acf(this); |
GR_CREATE_TRACE_MARKER_CONTEXT("GrContext::clear", this); |
- GrDrawTarget* target = this->prepareToDraw(NULL, NULL, &acf); |
+ GrDrawTarget* target = this->prepareToDraw(NULL, NULL, NULL, &acf); |
if (NULL == target) { |
return; |
} |
target->clear(rect, color, canIgnoreRect, renderTarget); |
} |
-void GrContext::drawPaint(const GrPaint& origPaint) { |
+void GrContext::drawPaint(const GrPaint& origPaint, const SkMatrix& viewMatrix) { |
// set rect to be big enough to fill the space, but not super-huge, so we |
// don't overflow fixed-point implementations |
SkRect r; |
r.setLTRB(0, 0, |
SkIntToScalar(getRenderTarget()->width()), |
SkIntToScalar(getRenderTarget()->height())); |
- SkMatrix inverse; |
SkTCopyOnFirstWrite<GrPaint> paint(origPaint); |
- AutoMatrix am; |
GR_CREATE_TRACE_MARKER_CONTEXT("GrContext::drawPaint", this); |
// We attempt to map r by the inverse matrix and draw that. mapRect will |
// map the four corners and bound them with a new rect. This will not |
// produce a correct result for some perspective matrices. |
- if (!this->getMatrix().hasPerspective()) { |
- if (!fViewMatrix.invert(&inverse)) { |
+ if (!viewMatrix.hasPerspective()) { |
+ SkMatrix inverse; |
+ if (!viewMatrix.invert(&inverse)) { |
SkDebugf("Could not invert matrix\n"); |
return; |
} |
inverse.mapRect(&r); |
} else { |
- if (!am.setIdentity(this, paint.writable())) { |
+ if (!paint.writable()->localCoordChangeInverse(viewMatrix)) { |
SkDebugf("Could not invert matrix\n"); |
return; |
} |
@@ -579,7 +577,7 @@ void GrContext::drawPaint(const GrPaint& origPaint) { |
if (paint->isAntiAlias()) { |
paint.writable()->setAntiAlias(false); |
} |
- this->drawRect(*paint, r); |
+ this->drawRect(*paint, viewMatrix.hasPerspective() ? SkMatrix::I() : viewMatrix, r); |
} |
#ifdef SK_DEVELOPER |
@@ -669,18 +667,19 @@ static inline bool rect_contains_inclusive(const SkRect& rect, const SkPoint& po |
} |
void GrContext::drawRect(const GrPaint& paint, |
+ const SkMatrix& viewMatrix, |
const SkRect& rect, |
const GrStrokeInfo* strokeInfo) { |
if (strokeInfo && strokeInfo->isDashed()) { |
SkPath path; |
path.addRect(rect); |
- this->drawPath(paint, path, *strokeInfo); |
+ this->drawPath(paint, viewMatrix, path, *strokeInfo); |
return; |
} |
AutoCheckFlush acf(this); |
GrDrawState drawState; |
- GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); |
+ GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf); |
if (NULL == target) { |
return; |
} |
@@ -797,19 +796,19 @@ void GrContext::drawRect(const GrPaint& paint, |
} |
void GrContext::drawRectToRect(const GrPaint& paint, |
+ const SkMatrix& viewMatrix, |
const SkRect& dstRect, |
- const SkRect& localRect, |
- const SkMatrix* localMatrix) { |
+ const SkRect& localRect) { |
AutoCheckFlush acf(this); |
GrDrawState drawState; |
- GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); |
+ GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf); |
if (NULL == target) { |
return; |
} |
GR_CREATE_TRACE_MARKER("GrContext::drawRectToRect", target); |
- target->drawRect(&drawState, paint.getColor(), dstRect, &localRect, localMatrix); |
+ target->drawRect(&drawState, paint.getColor(), dstRect, &localRect, NULL); |
} |
static const GrGeometryProcessor* set_vertex_attributes(const SkPoint* texCoords, |
@@ -836,6 +835,7 @@ static const GrGeometryProcessor* set_vertex_attributes(const SkPoint* texCoords |
} |
void GrContext::drawVertices(const GrPaint& paint, |
+ const SkMatrix& viewMatrix, |
GrPrimitiveType primitiveType, |
int vertexCount, |
const SkPoint positions[], |
@@ -847,7 +847,7 @@ void GrContext::drawVertices(const GrPaint& paint, |
GrDrawState drawState; |
GrDrawTarget::AutoReleaseGeometry geo; // must be inside AutoCheckFlush scope |
- GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); |
+ GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf); |
if (NULL == target) { |
return; |
} |
@@ -895,6 +895,7 @@ void GrContext::drawVertices(const GrPaint& paint, |
/////////////////////////////////////////////////////////////////////////////// |
void GrContext::drawRRect(const GrPaint& paint, |
+ const SkMatrix& viewMatrix, |
const SkRRect& rrect, |
const GrStrokeInfo& strokeInfo) { |
if (rrect.isEmpty()) { |
@@ -904,13 +905,13 @@ void GrContext::drawRRect(const GrPaint& paint, |
if (strokeInfo.isDashed()) { |
SkPath path; |
path.addRRect(rrect); |
- this->drawPath(paint, path, strokeInfo); |
+ this->drawPath(paint, viewMatrix, path, strokeInfo); |
return; |
} |
AutoCheckFlush acf(this); |
GrDrawState drawState; |
- GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); |
+ GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf); |
if (NULL == target) { |
return; |
} |
@@ -920,17 +921,19 @@ void GrContext::drawRRect(const GrPaint& paint, |
const SkStrokeRec& strokeRec = strokeInfo.getStrokeRec(); |
GrColor color = paint.getColor(); |
- if (!fOvalRenderer->drawRRect(target, &drawState, color, this, paint.isAntiAlias(), rrect, |
+ if (!fOvalRenderer->drawRRect(target, &drawState, color, paint.isAntiAlias(), rrect, |
strokeRec)) { |
SkPath path; |
path.addRRect(rrect); |
- this->internalDrawPath(target, &drawState, color, paint.isAntiAlias(), path, strokeInfo); |
+ this->internalDrawPath(target, &drawState, viewMatrix, color, paint.isAntiAlias(), path, |
+ strokeInfo); |
} |
} |
/////////////////////////////////////////////////////////////////////////////// |
void GrContext::drawDRRect(const GrPaint& paint, |
+ const SkMatrix& viewMatrix, |
const SkRRect& outer, |
const SkRRect& inner) { |
if (outer.isEmpty()) { |
@@ -939,26 +942,27 @@ void GrContext::drawDRRect(const GrPaint& paint, |
AutoCheckFlush acf(this); |
GrDrawState drawState; |
- GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); |
+ GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf); |
GR_CREATE_TRACE_MARKER("GrContext::drawDRRect", target); |
GrColor color = paint.getColor(); |
- if (!fOvalRenderer->drawDRRect(target, &drawState, color, this, paint.isAntiAlias(), outer, |
- inner)) { |
+ if (!fOvalRenderer->drawDRRect(target, &drawState, color, paint.isAntiAlias(), outer, inner)) { |
SkPath path; |
path.addRRect(inner); |
path.addRRect(outer); |
path.setFillType(SkPath::kEvenOdd_FillType); |
GrStrokeInfo fillRec(SkStrokeRec::kFill_InitStyle); |
- this->internalDrawPath(target, &drawState, color, paint.isAntiAlias(), path, fillRec); |
+ this->internalDrawPath(target, &drawState, viewMatrix, color, paint.isAntiAlias(), path, |
+ fillRec); |
} |
} |
/////////////////////////////////////////////////////////////////////////////// |
void GrContext::drawOval(const GrPaint& paint, |
+ const SkMatrix& viewMatrix, |
const SkRect& oval, |
const GrStrokeInfo& strokeInfo) { |
if (oval.isEmpty()) { |
@@ -968,13 +972,13 @@ void GrContext::drawOval(const GrPaint& paint, |
if (strokeInfo.isDashed()) { |
SkPath path; |
path.addOval(oval); |
- this->drawPath(paint, path, strokeInfo); |
+ this->drawPath(paint, viewMatrix, path, strokeInfo); |
return; |
} |
AutoCheckFlush acf(this); |
GrDrawState drawState; |
- GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); |
+ GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf); |
if (NULL == target) { |
return; |
} |
@@ -984,11 +988,11 @@ void GrContext::drawOval(const GrPaint& paint, |
const SkStrokeRec& strokeRec = strokeInfo.getStrokeRec(); |
GrColor color = paint.getColor(); |
- if (!fOvalRenderer->drawOval(target, &drawState, color, this, paint.isAntiAlias(), oval, |
- strokeRec)) { |
+ if (!fOvalRenderer->drawOval(target, &drawState, color, paint.isAntiAlias(), oval, strokeRec)) { |
SkPath path; |
path.addOval(oval); |
- this->internalDrawPath(target, &drawState, color, paint.isAntiAlias(), path, strokeInfo); |
+ this->internalDrawPath(target, &drawState, viewMatrix, color, paint.isAntiAlias(), path, |
+ strokeInfo); |
} |
} |
@@ -1049,11 +1053,14 @@ static bool is_nested_rects(GrDrawTarget* target, |
return allEq || allGoE1; |
} |
-void GrContext::drawPath(const GrPaint& paint, const SkPath& path, const GrStrokeInfo& strokeInfo) { |
+void GrContext::drawPath(const GrPaint& paint, |
+ const SkMatrix& viewMatrix, |
+ const SkPath& path, |
+ const GrStrokeInfo& strokeInfo) { |
if (path.isEmpty()) { |
if (path.isInverseFillType()) { |
- this->drawPaint(paint); |
+ this->drawPaint(paint, viewMatrix); |
} |
return; |
} |
@@ -1064,7 +1071,7 @@ void GrContext::drawPath(const GrPaint& paint, const SkPath& path, const GrStrok |
if (path.isLine(pts)) { |
AutoCheckFlush acf(this); |
GrDrawState drawState; |
- GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); |
+ GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf); |
if (NULL == target) { |
return; |
}; |
@@ -1085,11 +1092,11 @@ void GrContext::drawPath(const GrPaint& paint, const SkPath& path, const GrStrok |
GrStrokeInfo newStrokeInfo(strokeInfo, false); |
SkStrokeRec* stroke = newStrokeInfo.getStrokeRecPtr(); |
if (SkDashPath::FilterDashPath(effectPath.init(), path, stroke, NULL, info)) { |
- this->drawPath(paint, *effectPath.get(), newStrokeInfo); |
+ this->drawPath(paint, viewMatrix, *effectPath.get(), newStrokeInfo); |
return; |
} |
- this->drawPath(paint, path, newStrokeInfo); |
+ this->drawPath(paint, viewMatrix, path, newStrokeInfo); |
return; |
} |
@@ -1100,7 +1107,7 @@ void GrContext::drawPath(const GrPaint& paint, const SkPath& path, const GrStrok |
// OK. |
AutoCheckFlush acf(this); |
GrDrawState drawState; |
- GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &acf); |
+ GrDrawTarget* target = this->prepareToDraw(&drawState, &paint, &viewMatrix, &acf); |
if (NULL == target) { |
return; |
} |
@@ -1131,14 +1138,16 @@ void GrContext::drawPath(const GrPaint& paint, const SkPath& path, const GrStrok |
bool isOval = path.isOval(&ovalRect); |
if (!isOval || path.isInverseFillType() |
- || !fOvalRenderer->drawOval(target, &drawState, color, this, paint.isAntiAlias(), ovalRect, |
+ || !fOvalRenderer->drawOval(target, &drawState, color, paint.isAntiAlias(), ovalRect, |
strokeRec)) { |
- this->internalDrawPath(target, &drawState, color, paint.isAntiAlias(), path, strokeInfo); |
+ this->internalDrawPath(target, &drawState, viewMatrix, color, paint.isAntiAlias(), path, |
+ strokeInfo); |
} |
} |
void GrContext::internalDrawPath(GrDrawTarget* target, |
GrDrawState* drawState, |
+ const SkMatrix& viewMatrix, |
GrColor color, |
bool useAA, |
const SkPath& path, |
@@ -1169,7 +1178,7 @@ void GrContext::internalDrawPath(GrDrawTarget* target, |
GrPathRenderer* pr = this->getPathRenderer(target, drawState, *pathPtr, *stroke, false, type); |
if (NULL == pr) { |
- if (!GrPathRenderer::IsStrokeHairlineOrEquivalent(*stroke, this->getMatrix(), NULL)) { |
+ if (!GrPathRenderer::IsStrokeHairlineOrEquivalent(*stroke, viewMatrix, NULL)) { |
// It didn't work the 1st time, so try again with the stroked path |
if (stroke->applyToPath(tmpPath.init(), *pathPtr)) { |
pathPtr = tmpPath.get(); |
@@ -1326,7 +1335,7 @@ bool GrContext::writeSurfacePixels(GrSurface* surface, |
// drawing a rect to the render target. |
// The bracket ensures we pop the stack if we wind up flushing below. |
{ |
- GrDrawTarget* drawTarget = this->prepareToDraw(NULL, NULL, NULL); |
+ GrDrawTarget* drawTarget = this->prepareToDraw(NULL, NULL, NULL, NULL); |
GrDrawTarget::AutoGeometryPush agp(drawTarget); |
GrDrawState drawState(matrix); |
@@ -1507,7 +1516,7 @@ void GrContext::discardRenderTarget(GrRenderTarget* renderTarget) { |
SkASSERT(renderTarget); |
ASSERT_OWNED_RESOURCE(renderTarget); |
AutoCheckFlush acf(this); |
- GrDrawTarget* target = this->prepareToDraw(NULL, NULL, &acf); |
+ GrDrawTarget* target = this->prepareToDraw(NULL, NULL, NULL, &acf); |
if (NULL == target) { |
return; |
} |
@@ -1525,7 +1534,7 @@ void GrContext::copySurface(GrSurface* dst, GrSurface* src, const SkIRect& srcRe |
// Since we're going to the draw target and not GPU, no need to check kNoFlush |
// here. |
- GrDrawTarget* target = this->prepareToDraw(NULL, NULL, NULL); |
+ GrDrawTarget* target = this->prepareToDraw(NULL, NULL, NULL, NULL); |
if (NULL == target) { |
return; |
} |
@@ -1544,6 +1553,7 @@ void GrContext::flushSurfaceWrites(GrSurface* surface) { |
GrDrawTarget* GrContext::prepareToDraw(GrDrawState* ds, |
const GrPaint* paint, |
+ const SkMatrix* viewMatrix, |
const AutoCheckFlush* acf) { |
if (NULL == fGpu) { |
return NULL; |
@@ -1551,9 +1561,10 @@ GrDrawTarget* GrContext::prepareToDraw(GrDrawState* ds, |
ASSERT_OWNED_RESOURCE(fRenderTarget.get()); |
if (ds) { |
+ SkASSERT(viewMatrix); |
if (paint) { |
SkASSERT(acf); |
- ds->setFromPaint(*paint, fViewMatrix, fRenderTarget.get()); |
+ ds->setFromPaint(*paint, *viewMatrix, fRenderTarget.get()); |
#if GR_DEBUG_PARTIAL_COVERAGE_CHECK |
if ((paint->hasMask()) && |
!fDrawState->canUseFracCoveragePrimProc(paint.getColor(), fGpu->caps())) { |
@@ -1561,7 +1572,7 @@ GrDrawTarget* GrContext::prepareToDraw(GrDrawState* ds, |
} |
#endif |
} else { |
- ds->reset(fViewMatrix); |
+ ds->reset(*viewMatrix); |
ds->setRenderTarget(fRenderTarget.get()); |
} |
ds->setState(GrDrawState::kClip_StateBit, fClip && !fClip->fClipStack->isWideOpen()); |
@@ -1647,7 +1658,7 @@ void GrContext::setupDrawBuffer() { |
} |
GrDrawTarget* GrContext::getTextTarget() { |
- return this->prepareToDraw(NULL, NULL, NULL); |
+ return this->prepareToDraw(NULL, NULL, NULL, NULL); |
} |
const GrIndexBuffer* GrContext::getQuadIndexBuffer() const { |