1 /* 2 * Copyright 2015 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef GrDrawPathOp_DEFINED 9 #define GrDrawPathOp_DEFINED 10 11 #include "GrDrawOp.h" 12 #include "GrOpFlushState.h" 13 #include "GrPath.h" 14 #include "GrPathProcessor.h" 15 #include "GrPathRendering.h" 16 #include "GrProcessorSet.h" 17 #include "GrStencilSettings.h" 18 19 class GrPaint; 20 21 class GrDrawPathOpBase : public GrDrawOp { 22 protected: 23 GrDrawPathOpBase(uint32_t classID, const SkMatrix& viewMatrix, GrPaint&&, 24 GrPathRendering::FillType, GrAAType); 25 fixedFunctionFlags()26 FixedFunctionFlags fixedFunctionFlags() const override { 27 if (GrAATypeIsHW(fAAType)) { 28 return FixedFunctionFlags::kUsesHWAA | FixedFunctionFlags::kUsesStencil; 29 } 30 return FixedFunctionFlags::kUsesStencil; 31 } finalize(const GrCaps & caps,const GrAppliedClip * clip)32 GrProcessorSet::Analysis finalize(const GrCaps& caps, const GrAppliedClip* clip) override { 33 return this->doProcessorAnalysis(caps, clip); 34 } 35 visitProxies(const VisitProxyFunc & func,VisitorType)36 void visitProxies(const VisitProxyFunc& func, VisitorType) const override { 37 fProcessorSet.visitProxies(func); 38 } 39 40 protected: viewMatrix()41 const SkMatrix& viewMatrix() const { return fViewMatrix; } color()42 const SkPMColor4f& color() const { return fInputColor; } fillType()43 GrPathRendering::FillType fillType() const { return fFillType; } processors()44 const GrProcessorSet& processors() const { return fProcessorSet; } detachProcessors()45 GrProcessorSet detachProcessors() { return std::move(fProcessorSet); } 46 inline GrPipeline::InitArgs pipelineInitArgs(const GrOpFlushState&); doProcessorAnalysis(const GrCaps & caps,const GrAppliedClip * clip)47 const GrProcessorSet::Analysis& doProcessorAnalysis(const GrCaps& caps, 48 const GrAppliedClip* clip) { 49 bool isMixedSamples = GrAAType::kMixedSamples == fAAType; 50 fAnalysis = fProcessorSet.finalize(fInputColor, GrProcessorAnalysisCoverage::kNone, clip, 51 isMixedSamples, caps, &fInputColor); 52 return fAnalysis; 53 } processorAnalysis()54 const GrProcessorSet::Analysis& processorAnalysis() const { 55 SkASSERT(fAnalysis.isInitialized()); 56 return fAnalysis; 57 } 58 59 private: onPrepare(GrOpFlushState *)60 void onPrepare(GrOpFlushState*) final {} 61 62 SkMatrix fViewMatrix; 63 SkPMColor4f fInputColor; 64 GrProcessorSet::Analysis fAnalysis; 65 GrPathRendering::FillType fFillType; 66 GrAAType fAAType; 67 GrProcessorSet fProcessorSet; 68 69 typedef GrDrawOp INHERITED; 70 }; 71 72 class GrDrawPathOp final : public GrDrawPathOpBase { 73 public: 74 DEFINE_OP_CLASS_ID 75 76 static std::unique_ptr<GrDrawOp> Make(GrContext*, 77 const SkMatrix& viewMatrix, 78 GrPaint&&, 79 GrAAType, 80 GrPath*); 81 name()82 const char* name() const override { return "DrawPath"; } 83 84 #ifdef SK_DEBUG 85 SkString dumpInfo() const override; 86 #endif 87 88 private: 89 friend class GrOpMemoryPool; // for ctor 90 GrDrawPathOp(const SkMatrix & viewMatrix,GrPaint && paint,GrAAType aaType,const GrPath * path)91 GrDrawPathOp(const SkMatrix& viewMatrix, GrPaint&& paint, GrAAType aaType, const GrPath* path) 92 : GrDrawPathOpBase(ClassID(), viewMatrix, std::move(paint), path->getFillType(), aaType) 93 , fPath(path) { 94 this->setTransformedBounds(path->getBounds(), viewMatrix, HasAABloat::kNo, IsZeroArea::kNo); 95 } 96 97 void onExecute(GrOpFlushState*, const SkRect& chainBounds) override; 98 99 GrPendingIOResource<const GrPath, kRead_GrIOType> fPath; 100 101 typedef GrDrawPathOpBase INHERITED; 102 }; 103 104 #endif 105