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 class GrRecordingContext; 21 22 class GrDrawPathOpBase : public GrDrawOp { 23 protected: 24 GrDrawPathOpBase(uint32_t classID, const SkMatrix& viewMatrix, GrPaint&&, 25 GrPathRendering::FillType, GrAAType); 26 fixedFunctionFlags()27 FixedFunctionFlags fixedFunctionFlags() const override { 28 if (GrAATypeIsHW(fAAType)) { 29 return FixedFunctionFlags::kUsesHWAA | FixedFunctionFlags::kUsesStencil; 30 } 31 return FixedFunctionFlags::kUsesStencil; 32 } finalize(const GrCaps & caps,const GrAppliedClip * clip,GrFSAAType fsaaType,GrClampType clampType)33 GrProcessorSet::Analysis finalize(const GrCaps& caps, const GrAppliedClip* clip, 34 GrFSAAType fsaaType, GrClampType clampType) override { 35 return this->doProcessorAnalysis(caps, clip, fsaaType, clampType); 36 } 37 visitProxies(const VisitProxyFunc & func,VisitorType)38 void visitProxies(const VisitProxyFunc& func, VisitorType) const override { 39 fProcessorSet.visitProxies(func); 40 } 41 42 protected: viewMatrix()43 const SkMatrix& viewMatrix() const { return fViewMatrix; } color()44 const SkPMColor4f& color() const { return fInputColor; } fillType()45 GrPathRendering::FillType fillType() const { return fFillType; } processors()46 const GrProcessorSet& processors() const { return fProcessorSet; } detachProcessors()47 GrProcessorSet detachProcessors() { return std::move(fProcessorSet); } 48 inline GrPipeline::InitArgs pipelineInitArgs(const GrOpFlushState&); 49 const GrProcessorSet::Analysis& doProcessorAnalysis( 50 const GrCaps&, const GrAppliedClip*, GrFSAAType, GrClampType); processorAnalysis()51 const GrProcessorSet::Analysis& processorAnalysis() const { 52 SkASSERT(fAnalysis.isInitialized()); 53 return fAnalysis; 54 } 55 56 private: onPrepare(GrOpFlushState *)57 void onPrepare(GrOpFlushState*) final {} 58 59 SkMatrix fViewMatrix; 60 SkPMColor4f fInputColor; 61 GrProcessorSet::Analysis fAnalysis; 62 GrPathRendering::FillType fFillType; 63 GrAAType fAAType; 64 GrProcessorSet fProcessorSet; 65 66 typedef GrDrawOp INHERITED; 67 }; 68 69 class GrDrawPathOp final : public GrDrawPathOpBase { 70 public: 71 DEFINE_OP_CLASS_ID 72 73 static std::unique_ptr<GrDrawOp> Make(GrRecordingContext*, 74 const SkMatrix& viewMatrix, 75 GrPaint&&, 76 GrAAType, 77 GrPath*); 78 name()79 const char* name() const override { return "DrawPath"; } 80 81 #ifdef SK_DEBUG 82 SkString dumpInfo() const override; 83 #endif 84 85 private: 86 friend class GrOpMemoryPool; // for ctor 87 GrDrawPathOp(const SkMatrix & viewMatrix,GrPaint && paint,GrAAType aaType,const GrPath * path)88 GrDrawPathOp(const SkMatrix& viewMatrix, GrPaint&& paint, GrAAType aaType, const GrPath* path) 89 : GrDrawPathOpBase(ClassID(), viewMatrix, std::move(paint), path->getFillType(), aaType) 90 , fPath(path) { 91 this->setTransformedBounds(path->getBounds(), viewMatrix, HasAABloat::kNo, IsZeroArea::kNo); 92 } 93 94 void onExecute(GrOpFlushState*, const SkRect& chainBounds) override; 95 96 GrPendingIOResource<const GrPath, kRead_GrIOType> fPath; 97 98 typedef GrDrawPathOpBase INHERITED; 99 }; 100 101 #endif 102