1 /* 2 * Copyright 2016 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 GrClearStencilClipOp_DEFINED 9 #define GrClearStencilClipOp_DEFINED 10 11 #include "GrFixedClip.h" 12 #include "GrGpuCommandBuffer.h" 13 #include "GrOp.h" 14 #include "GrOpFlushState.h" 15 #include "GrRenderTargetProxy.h" 16 17 class GrClearStencilClipOp final : public GrOp { 18 public: 19 DEFINE_OP_CLASS_ID 20 21 static std::unique_ptr<GrOp> Make(const GrFixedClip& clip, bool insideStencilMask, 22 GrRenderTargetProxy* proxy) { 23 return std::unique_ptr<GrOp>(new GrClearStencilClipOp(clip, insideStencilMask, proxy)); 24 } 25 26 const char* name() const override { return "ClearStencilClip"; } 27 28 SkString dumpInfo() const override { 29 SkString string("Scissor ["); 30 if (fClip.scissorEnabled()) { 31 const SkIRect& r = fClip.scissorRect(); 32 string.appendf("L: %d, T: %d, R: %d, B: %d", r.fLeft, r.fTop, r.fRight, r.fBottom); 33 } else { 34 string.append("disabled"); 35 } 36 string.appendf("], insideMask: %s\n", fInsideStencilMask ? "true" : "false"); 37 string.append(INHERITED::dumpInfo()); 38 return string; 39 } 40 41 private: 42 GrClearStencilClipOp(const GrFixedClip& clip, bool insideStencilMask, 43 GrRenderTargetProxy* proxy) 44 : INHERITED(ClassID()) 45 , fClip(clip) 46 , fInsideStencilMask(insideStencilMask) { 47 const SkRect& bounds = fClip.scissorEnabled() 48 ? SkRect::Make(fClip.scissorRect()) 49 : SkRect::MakeIWH(proxy->width(), proxy->height()); 50 this->setBounds(bounds, HasAABloat::kNo, IsZeroArea::kNo); 51 } 52 53 bool onCombineIfPossible(GrOp* t, const GrCaps& caps) override { return false; } 54 55 void onPrepare(GrOpFlushState*) override {} 56 57 void onExecute(GrOpFlushState* state) override { 58 SkASSERT(state->rtCommandBuffer()); 59 state->rtCommandBuffer()->clearStencilClip(fClip, fInsideStencilMask); 60 } 61 62 const GrFixedClip fClip; 63 const bool fInsideStencilMask; 64 65 typedef GrOp INHERITED; 66 }; 67 68 #endif 69