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;
+}