1 /* 2 * Copyright 2010 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 #include "GrFixedClip.h" 9 10 #include "GrAppliedClip.h" 11 #include "GrRenderTargetContext.h" 12 13 bool GrFixedClip::quickContains(const SkRect& rect) const { 14 if (fWindowRectsState.enabled()) { 15 return false; 16 } 17 return !fScissorState.enabled() || GrClip::IsInsideClip(fScissorState.rect(), rect); 18 } 19 20 void GrFixedClip::getConservativeBounds(int w, int h, SkIRect* devResult, bool* iior) const { 21 devResult->setXYWH(0, 0, w, h); 22 if (fScissorState.enabled()) { 23 if (!devResult->intersect(fScissorState.rect())) { 24 devResult->setEmpty(); 25 } 26 } 27 if (iior) { 28 *iior = true; 29 } 30 } 31 32 bool GrFixedClip::isRRect(const SkRect& rtBounds, SkRRect* rr, GrAA* aa) const { 33 if (fWindowRectsState.enabled()) { 34 return false; 35 } 36 if (fScissorState.enabled()) { 37 SkRect rect = SkRect::Make(fScissorState.rect()); 38 if (!rect.intersects(rtBounds)) { 39 return false; 40 } 41 rr->setRect(rect); 42 *aa = GrAA::kNo; 43 return true; 44 } 45 return false; 46 }; 47 48 bool GrFixedClip::apply(int rtWidth, int rtHeight, GrAppliedHardClip* out, SkRect* bounds) const { 49 if (fScissorState.enabled()) { 50 SkIRect tightScissor = SkIRect::MakeWH(rtWidth, rtHeight); 51 if (!tightScissor.intersect(fScissorState.rect())) { 52 return false; 53 } 54 if (IsOutsideClip(tightScissor, *bounds)) { 55 return false; 56 } 57 if (!IsInsideClip(fScissorState.rect(), *bounds)) { 58 out->addScissor(tightScissor, bounds); 59 } 60 } 61 62 if (fWindowRectsState.enabled()) { 63 out->addWindowRectangles(fWindowRectsState); 64 } 65 66 return true; 67 } 68 69 const GrFixedClip& GrFixedClip::Disabled() { 70 static const GrFixedClip disabled = GrFixedClip(); 71 return disabled; 72 } 73