1363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger/* 2363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Copyright 2011 Google Inc. 3363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * 4363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be 5363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * found in the LICENSE file. 6363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */ 7363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 8363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifndef GrPathRendererChain_DEFINED 9363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#define GrPathRendererChain_DEFINED 10363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 110a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "SkRefCnt.h" 12363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkTArray.h" 13363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 14363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass GrContext; 15363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass GrDrawTarget; 16363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass GrPathRenderer; 17363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass SkPath; 18363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass SkStrokeRec; 19363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 20363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger/** 21363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Keeps track of an ordered list of path renderers. When a path needs to be 22363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * drawn this list is scanned to find the most preferred renderer. To add your 23363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * path renderer to the list implement the GrPathRenderer::AddPathRenderers 24363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * function. 25363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */ 26363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass GrPathRendererChain : public SkRefCnt { 27363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerpublic: 28363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // See comments in GrPathRenderer.h 29363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger enum StencilSupport { 30363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger kNoSupport_StencilSupport, 31363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger kStencilOnly_StencilSupport, 32363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger kNoRestriction_StencilSupport, 33363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger }; 34363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 35363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SK_DECLARE_INST_COUNT(GrPathRendererChain) 36363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 37363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger GrPathRendererChain(GrContext* context); 38363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 39363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger ~GrPathRendererChain(); 40363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 41363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // takes a ref and unrefs in destructor 42363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger GrPathRenderer* addPathRenderer(GrPathRenderer* pr); 43363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 44363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** Documents how the caller plans to use a GrPathRenderer to draw a path. It affects the PR 45363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger returned by getPathRenderer */ 46363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger enum DrawType { 47363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger kColor_DrawType, // draw to the color buffer, no AA 48363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger kColorAntiAlias_DrawType, // draw to color buffer, with partial coverage AA 49363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger kStencilOnly_DrawType, // draw just to the stencil buffer 50363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger kStencilAndColor_DrawType, // draw the stencil and color buffer, no AA 51363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger kStencilAndColorAntiAlias_DrawType // draw the stencil and color buffer, with partial 52363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // coverage AA. 53363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger }; 54363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** Returns a GrPathRenderer compatible with the request if one is available. If the caller 55363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger is drawing the path to the stencil buffer then stencilSupport can be used to determine 56363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger whether the path can be rendered with arbitrary stencil rules or not. See comments on 57363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger StencilSupport in GrPathRenderer.h. */ 58363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger GrPathRenderer* getPathRenderer(const SkPath& path, 59363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger const SkStrokeRec& rec, 60363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger const GrDrawTarget* target, 61363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger DrawType drawType, 62363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger StencilSupport* stencilSupport); 63363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 64363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprivate: 65363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger GrPathRendererChain(); 66363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 67363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger void init(); 68363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 69363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger enum { 70363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger kPreAllocCount = 8, 71363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger }; 72363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger bool fInit; 73363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger GrContext* fOwner; 74363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkSTArray<kPreAllocCount, GrPathRenderer*, true> fChain; 75363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 76363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger typedef SkRefCnt INHERITED; 77363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}; 78363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 79363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif 80