• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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