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 GrStencilPathOp_DEFINED 9 #define GrStencilPathOp_DEFINED 10 11 #include "GrGpu.h" 12 #include "GrOp.h" 13 #include "GrOpFlushState.h" 14 #include "GrPath.h" 15 #include "GrPathRendering.h" 16 #include "GrRenderTarget.h" 17 #include "GrStencilSettings.h" 18 19 class GrStencilPathOp final : public GrOp { 20 public: 21 DEFINE_OP_CLASS_ID 22 Make(const SkMatrix & viewMatrix,bool useHWAA,GrPathRendering::FillType fillType,bool hasStencilClip,int numStencilBits,const GrScissorState & scissor,GrRenderTarget * renderTarget,const GrPath * path)23 static std::unique_ptr<GrOp> Make(const SkMatrix& viewMatrix, 24 bool useHWAA, 25 GrPathRendering::FillType fillType, 26 bool hasStencilClip, 27 int numStencilBits, 28 const GrScissorState& scissor, 29 GrRenderTarget* renderTarget, 30 const GrPath* path) { 31 return std::unique_ptr<GrOp>(new GrStencilPathOp(viewMatrix, useHWAA, fillType, 32 hasStencilClip, numStencilBits, scissor, 33 renderTarget, path)); 34 } 35 name()36 const char* name() const override { return "StencilPathOp"; } 37 dumpInfo()38 SkString dumpInfo() const override { 39 SkString string; 40 string.printf("PATH: 0x%p, AA:%d", fPath.get(), fUseHWAA); 41 string.append(INHERITED::dumpInfo()); 42 return string; 43 } 44 45 private: GrStencilPathOp(const SkMatrix & viewMatrix,bool useHWAA,GrPathRendering::FillType fillType,bool hasStencilClip,int numStencilBits,const GrScissorState & scissor,GrRenderTarget * renderTarget,const GrPath * path)46 GrStencilPathOp(const SkMatrix& viewMatrix, 47 bool useHWAA, 48 GrPathRendering::FillType fillType, 49 bool hasStencilClip, 50 int numStencilBits, 51 const GrScissorState& scissor, 52 GrRenderTarget* renderTarget, 53 const GrPath* path) 54 : INHERITED(ClassID()) 55 , fViewMatrix(viewMatrix) 56 , fUseHWAA(useHWAA) 57 , fStencil(GrPathRendering::GetStencilPassSettings(fillType), hasStencilClip, 58 numStencilBits) 59 , fScissor(scissor) 60 , fRenderTarget(renderTarget) 61 , fPath(path) { 62 this->setBounds(path->getBounds(), HasAABloat::kNo, IsZeroArea::kNo); 63 } 64 onCombineIfPossible(GrOp * t,const GrCaps & caps)65 bool onCombineIfPossible(GrOp* t, const GrCaps& caps) override { return false; } 66 onPrepare(GrOpFlushState *)67 void onPrepare(GrOpFlushState*) override {} 68 onExecute(GrOpFlushState * state)69 void onExecute(GrOpFlushState* state) override { 70 GrPathRendering::StencilPathArgs args(fUseHWAA, fRenderTarget.get(), &fViewMatrix, 71 &fScissor, &fStencil); 72 state->gpu()->pathRendering()->stencilPath(args, fPath.get()); 73 } 74 75 SkMatrix fViewMatrix; 76 bool fUseHWAA; 77 GrStencilSettings fStencil; 78 GrScissorState fScissor; 79 GrPendingIOResource<GrRenderTarget, kWrite_GrIOType> fRenderTarget; 80 GrPendingIOResource<const GrPath, kRead_GrIOType> fPath; 81 82 typedef GrOp INHERITED; 83 }; 84 85 #endif 86