/* * Copyright 2015 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "GrPipelineBuilder.h" #include "GrBlend.h" #include "GrPaint.h" #include "GrPipeline.h" #include "GrProcOptInfo.h" #include "GrXferProcessor.h" #include "batches/GrBatch.h" #include "effects/GrPorterDuffXferProcessor.h" GrPipelineBuilder::GrPipelineBuilder() : fFlags(0x0) , fUserStencilSettings(&GrUserStencilSettings::kUnused) , fDrawFace(GrDrawFace::kBoth) { SkDEBUGCODE(fBlockEffectRemovalCnt = 0;) } GrPipelineBuilder::GrPipelineBuilder(const GrPaint& paint, bool useHWAA) : GrPipelineBuilder() { SkDEBUGCODE(fBlockEffectRemovalCnt = 0;) for (int i = 0; i < paint.numColorFragmentProcessors(); ++i) { fColorFragmentProcessors.emplace_back(SkRef(paint.getColorFragmentProcessor(i))); } for (int i = 0; i < paint.numCoverageFragmentProcessors(); ++i) { fCoverageFragmentProcessors.emplace_back(SkRef(paint.getCoverageFragmentProcessor(i))); } fXPFactory.reset(SkSafeRef(paint.getXPFactory())); this->setState(GrPipelineBuilder::kHWAntialias_Flag, useHWAA); this->setState(GrPipelineBuilder::kDisableOutputConversionToSRGB_Flag, paint.getDisableOutputConversionToSRGB()); this->setState(GrPipelineBuilder::kAllowSRGBInputs_Flag, paint.getAllowSRGBInputs()); this->setState(GrPipelineBuilder::kUsesDistanceVectorField_Flag, paint.usesDistanceVectorField()); } //////////////////////////////////////////////////////////////////////////////s bool GrPipelineBuilder::willXPNeedDstTexture(const GrCaps& caps, const GrPipelineOptimizations& optimizations) const { if (this->getXPFactory()) { return this->getXPFactory()->willNeedDstTexture(caps, optimizations); } return GrPorterDuffXPFactory::SrcOverWillNeedDstTexture(caps, optimizations); } void GrPipelineBuilder::AutoRestoreFragmentProcessorState::set( const GrPipelineBuilder* pipelineBuilder) { if (fPipelineBuilder) { int m = fPipelineBuilder->numColorFragmentProcessors() - fColorEffectCnt; SkASSERT(m >= 0); fPipelineBuilder->fColorFragmentProcessors.pop_back_n(m); int n = fPipelineBuilder->numCoverageFragmentProcessors() - fCoverageEffectCnt; SkASSERT(n >= 0); fPipelineBuilder->fCoverageFragmentProcessors.pop_back_n(n); SkDEBUGCODE(--fPipelineBuilder->fBlockEffectRemovalCnt;) } fPipelineBuilder = const_cast(pipelineBuilder); if (nullptr != pipelineBuilder) { fColorEffectCnt = pipelineBuilder->numColorFragmentProcessors(); fCoverageEffectCnt = pipelineBuilder->numCoverageFragmentProcessors(); SkDEBUGCODE(++pipelineBuilder->fBlockEffectRemovalCnt;) } } //////////////////////////////////////////////////////////////////////////////// GrPipelineBuilder::~GrPipelineBuilder() { SkASSERT(0 == fBlockEffectRemovalCnt); }