1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 #ifndef GrPathRenderer_DEFINED 11 #define GrPathRenderer_DEFINED 12 13 #include "GrDrawTarget.h" 14 #include "GrPathRendererChain.h" 15 16 #include "SkTArray.h" 17 18 class SkPath; 19 20 struct GrPoint; 21 22 /** 23 * Base class for drawing paths into a GrDrawTarget. 24 * Paths may be drawn multiple times as when tiling for supersampling. The 25 * calls on GrPathRenderer to draw a path will look like this: 26 * 27 * pr->setPath(target, path, fill, aa, translate); // sets the path to draw 28 * pr->drawPath(...); // draw the path 29 * pr->drawPath(...); 30 * ... 31 * pr->clearPath(); // finished with the path 32 */ 33 class GR_API GrPathRenderer : public GrRefCnt { 34 public: 35 36 /** 37 * This is called to install custom path renderers in every GrContext at 38 * create time. The default implementation in GrCreatePathRenderer_none.cpp 39 * does not add any additional renderers. Link against another 40 * implementation to install your own. The first added is the most preferred 41 * path renderer, second is second most preferred, etc. 42 * 43 * @param context the context that will use the path renderer 44 * @param flags flags indicating how path renderers will be used 45 * @param prChain the chain to add path renderers to. 46 */ 47 static void AddPathRenderers(GrContext* context, 48 GrPathRendererChain::UsageFlags flags, 49 GrPathRendererChain* prChain); 50 51 52 GrPathRenderer(); 53 54 /** 55 * For complex clips Gr uses the stencil buffer. The path renderer must be 56 * able to render paths into the stencil buffer. However, the path renderer 57 * itself may require the stencil buffer to resolve the path fill rule. 58 * This function queries whether the path render needs its own stencil 59 * pass. If this returns false then drawPath() should not modify the 60 * the target's stencil settings but use those already set on target. The 61 * target is passed as a param in case the answer depends upon draw state. 62 * The view matrix and render target set on the draw target may change 63 * before setPath/drawPath is called and so shouldn't be considered. 64 * 65 * @param target target that the path will be rendered to 66 * @param path the path that will be drawn 67 * @param fill the fill rule that will be used, will never be an inverse 68 * rule. 69 * 70 * @return false if this path renderer can generate interior-only fragments 71 * without changing the stencil settings on the target. If it 72 * returns true the drawPathToStencil will be used when rendering 73 * clips. 74 */ 75 virtual bool requiresStencilPass(const SkPath& path, 76 GrPathFill fill, 77 const GrDrawTarget* target) const { 78 return false; 79 } 80 81 virtual bool canDrawPath(const SkPath& path, 82 GrPathFill fill, 83 const GrDrawTarget* target, 84 bool antiAlias) const = 0; 85 /** 86 * Draws the path into the draw target. If requiresStencilBuffer returned 87 * false then the target may be setup for stencil rendering (since the 88 * path renderer didn't claim that it needs to use the stencil internally). 89 * 90 * @param stages bitfield that indicates which stages are 91 * in use. All enabled stages expect positions 92 * as texture coordinates. The path renderer 93 * use the remaining stages for its path 94 * filling algorithm. 95 */ 96 virtual bool drawPath(const SkPath& path, 97 GrPathFill fill, 98 const GrVec* translate, 99 GrDrawTarget* target, 100 GrDrawState::StageMask stageMask, 101 bool antiAlias) { 102 GrAssert(this->canDrawPath(path, fill, target, antiAlias)); 103 return this->onDrawPath(path, fill, translate, 104 target, stageMask, antiAlias); 105 } 106 107 /** 108 * Draws the path to the stencil buffer. Assume the writable stencil bits 109 * are already initialized to zero. Fill will always be either 110 * kWinding_PathFill or kEvenOdd_PathFill. 111 * 112 * Only called if requiresStencilPass returns true for the same combo of 113 * target, path, and fill. Never called with an inverse fill. 114 * 115 * The default implementation assumes the path filling algorithm doesn't 116 * require a separate stencil pass and so crashes. 117 * 118 */ 119 virtual void drawPathToStencil(const SkPath& path, 120 GrPathFill fill, 121 GrDrawTarget* target) { 122 GrCrash("Unexpected call to drawPathToStencil."); 123 } 124 125 protected: 126 virtual bool onDrawPath(const SkPath& path, 127 GrPathFill fill, 128 const GrVec* translate, 129 GrDrawTarget* target, 130 GrDrawState::StageMask stageMask, 131 bool antiAlias) = 0; 132 133 private: 134 135 typedef GrRefCnt INHERITED; 136 }; 137 138 #endif 139 140