180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc. 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrPathRendererChain.h" 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrContext.h" 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrDefaultPathRenderer.h" 147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "GrDrawTargetCaps.h" 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrGpu.h" 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 17363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek SollenbergerGrPathRendererChain::GrPathRendererChain(GrContext* context) 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru : fInit(false) 19363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger , fOwner(context) { 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrPathRendererChain::~GrPathRendererChain() { 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int i = 0; i < fChain.count(); ++i) { 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fChain[i]->unref(); 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrPathRenderer* GrPathRendererChain::addPathRenderer(GrPathRenderer* pr) { 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fChain.push_back() = pr; 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru pr->ref(); 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return pr; 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrPathRenderer* GrPathRendererChain::getPathRenderer(const SkPath& path, 35363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger const SkStrokeRec& stroke, 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const GrDrawTarget* target, 37363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger DrawType drawType, 38363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger StencilSupport* stencilSupport) { 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (!fInit) { 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->init(); 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 42363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger bool antiAlias = (kColorAntiAlias_DrawType == drawType || 43363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger kStencilAndColorAntiAlias_DrawType == drawType); 44363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 45363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger GR_STATIC_ASSERT(GrPathRenderer::kNoSupport_StencilSupport < 46363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger GrPathRenderer::kStencilOnly_StencilSupport); 47363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger GR_STATIC_ASSERT(GrPathRenderer::kStencilOnly_StencilSupport < 48363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger GrPathRenderer::kNoRestriction_StencilSupport); 49363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger GrPathRenderer::StencilSupport minStencilSupport; 50363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger if (kStencilOnly_DrawType == drawType) { 51363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger minStencilSupport = GrPathRenderer::kStencilOnly_StencilSupport; 52363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } else if (kStencilAndColor_DrawType == drawType || 53363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger kStencilAndColorAntiAlias_DrawType == drawType) { 54363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger minStencilSupport = GrPathRenderer::kNoRestriction_StencilSupport; 55363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } else { 56363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger minStencilSupport = GrPathRenderer::kNoSupport_StencilSupport; 57363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 58363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 59363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int i = 0; i < fChain.count(); ++i) { 61363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger if (fChain[i]->canDrawPath(path, stroke, target, antiAlias)) { 62363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger if (GrPathRenderer::kNoSupport_StencilSupport != minStencilSupport) { 63363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger GrPathRenderer::StencilSupport support = fChain[i]->getStencilSupport(path, 64363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger stroke, 65363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger target); 66363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger if (support < minStencilSupport) { 67363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger continue; 68363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } else if (NULL != stencilSupport) { 69363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger *stencilSupport = support; 70363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 71363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fChain[i]; 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return NULL; 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid GrPathRendererChain::init() { 790a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkASSERT(!fInit); 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrGpu* gpu = fOwner->getGpu(); 817839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger bool twoSided = gpu->caps()->twoSidedStencilSupport(); 827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger bool wrapOp = gpu->caps()->stencilWrapOpsSupport(); 83363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger GrPathRenderer::AddPathRenderers(fOwner, this); 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->addPathRenderer(SkNEW_ARGS(GrDefaultPathRenderer, 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru (twoSided, wrapOp)))->unref(); 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fInit = true; 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 88