Use a prioritized list of path renderers in Gr.
http://codereview.appspot.com/4867058
git-svn-id: http://skia.googlecode.com/svn/trunk@2143 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrPathRendererChain.cpp b/gpu/src/GrPathRendererChain.cpp
new file mode 100644
index 0000000..afae912
--- /dev/null
+++ b/gpu/src/GrPathRendererChain.cpp
@@ -0,0 +1,65 @@
+
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+
+#include "GrPathRendererChain.h"
+
+#include "GrContext.h"
+#include "GrDefaultPathRenderer.h"
+#include "GrGpu.h"
+
+GrPathRendererChain::GrPathRendererChain(GrContext* context, UsageFlags flags)
+ : fInit(false)
+ , fFlags(flags)
+ , fOwner(context)
+ , fChain(fStorage.get(), kPreAllocCount) {
+ fInit = false;
+}
+
+GrPathRendererChain::~GrPathRendererChain() {
+ for (int i = 0; i < fChain.count(); ++i) {
+ fChain[i]->unref();
+ }
+}
+
+GrPathRenderer* GrPathRendererChain::addPathRenderer(GrPathRenderer* pr) {
+ fChain.push_back() = pr;
+ pr->ref();
+ return pr;
+}
+
+GrPathRenderer* GrPathRendererChain::getPathRenderer(const GrDrawTarget* target,
+ const GrPath& path,
+ GrPathFill fill) {
+ if (!fInit) {
+ this->init();
+ }
+ bool preferAA = target->isAntialiasState() &&
+ !target->getRenderTarget()->isMultisampled();
+ GrPathRenderer* nonAAPR = NULL;
+ for (int i = 0; i < fChain.count(); ++i) {
+ if (fChain[i]->canDrawPath(path, fill)) {
+ if (!preferAA || fChain[i]->supportsAA(target, path, fill)) {
+ return fChain[i];
+ } else {
+ nonAAPR = fChain[i];
+ }
+ }
+ }
+ return nonAAPR;
+}
+
+void GrPathRendererChain::init() {
+ GrAssert(!fInit);
+ GrGpu* gpu = fOwner->getGpu();
+ this->addPathRenderer(
+ new GrDefaultPathRenderer(gpu->supportsTwoSidedStencil(),
+ gpu->supportsStencilWrapOps()))->unref();
+ GrPathRenderer::AddPathRenderers(fOwner, fFlags, this);
+ fInit = true;
+}