Add way to determine at link time what path renderer will be used.
Added mechanism for a custom path renderer to punt and fallback to default path renderer
git-svn-id: http://skia.googlecode.com/svn/trunk@1005 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrGpu.cpp b/gpu/src/GrGpu.cpp
index d60287b..4b52fd8 100644
--- a/gpu/src/GrGpu.cpp
+++ b/gpu/src/GrGpu.cpp
@@ -78,7 +78,8 @@
fIndexPool(NULL),
fQuadIndexBuffer(NULL),
fUnitSquareVertexBuffer(NULL),
- fPathRenderer(NULL),
+ fDefaultPathRenderer(NULL),
+ fClientPathRenderer(NULL),
fContextIsDirty(true),
fVertexPoolInUse(false),
fIndexPoolInUse(false) {
@@ -93,7 +94,8 @@
GrSafeUnref(fUnitSquareVertexBuffer);
delete fVertexPool;
delete fIndexPool;
- delete fPathRenderer;
+ GrSafeUnref(fClientPathRenderer);
+ GrSafeUnref(fDefaultPathRenderer);
}
void GrGpu::resetContext() {
@@ -418,15 +420,20 @@
// directly to the stencil buffer
// with a non-inverted fill rule
// without extra passes to
- // resolve in/out status.
+ // resolve in/out status.
+
+ GrPathRenderer* pr = NULL;
+ GrPath::Iter pathIter;
if (kRect_ClipType == clip.getElementType(c)) {
canRenderDirectToStencil = true;
fill = kEvenOdd_PathFill;
} else {
fill = clip.getPathFill(c);
- GrPathRenderer* pr = this->getPathRenderer();
+ const GrPath& path = clip.getPath(c);
+ pathIter.reset(path);
+ pr = this->getClipPathRenderer(&pathIter, NonInvertedFill(fill));
canRenderDirectToStencil =
- !pr->requiresStencilPass(this, clip.getPath(c),
+ !pr->requiresStencilPass(this, &pathIter,
NonInvertedFill(fill));
}
@@ -462,14 +469,14 @@
} else {
if (canRenderDirectToStencil) {
this->setStencil(gDrawToStencil);
- getPathRenderer()->drawPath(this, 0,
- clip.getPath(c),
- NonInvertedFill(fill),
- NULL);
+ pr->drawPath(this, 0,
+ &pathIter,
+ NonInvertedFill(fill),
+ NULL);
} else {
- getPathRenderer()->drawPathToStencil(this, clip.getPath(c),
- NonInvertedFill(fill),
- NULL);
+ pr->drawPathToStencil(this, &pathIter,
+ NonInvertedFill(fill),
+ NULL);
}
}
}
@@ -486,9 +493,7 @@
} else {
SET_RANDOM_COLOR
GrAssert(!IsFillInverted(fill));
- getPathRenderer()->drawPath(this, 0,
- clip.getPath(c),
- fill, NULL);
+ pr->drawPath(this, 0, &pathIter, fill, NULL);
}
} else {
SET_RANDOM_COLOR
@@ -512,6 +517,23 @@
return true;
}
+GrPathRenderer* GrGpu::getClipPathRenderer(GrPathIter* path,
+ GrPathFill fill) {
+ if (NULL != fClientPathRenderer &&
+ fClientPathRenderer->canDrawPath(this, path, fill)) {
+ return fClientPathRenderer;
+ } else {
+ if (NULL == fDefaultPathRenderer) {
+ fDefaultPathRenderer =
+ new GrDefaultPathRenderer(this->supportsTwoSidedStencil(),
+ this->supportsStencilWrapOps());
+ }
+ GrAssert(fDefaultPathRenderer->canDrawPath(this, path, fill));
+ return fDefaultPathRenderer;
+ }
+}
+
+
////////////////////////////////////////////////////////////////////////////////
void GrGpu::drawIndexed(GrPrimitiveType type,
@@ -665,16 +687,6 @@
////////////////////////////////////////////////////////////////////////////////
-GrPathRenderer* GrGpu::getPathRenderer() {
- if (NULL == fPathRenderer) {
- fPathRenderer = new GrDefaultPathRenderer(this->supportsTwoSidedStencil(),
- this->supportsStencilWrapOps());
- }
- return fPathRenderer;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
const GrGpu::Stats& GrGpu::getStats() const {
return fStats;
}