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