/* * Copyright 2010 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "GrFixedClip.h" #include "GrAppliedClip.h" #include "GrRenderTargetContext.h" bool GrFixedClip::quickContains(const SkRect& rect) const { if (fWindowRectsState.enabled()) { return false; } return !fScissorState.enabled() || GrClip::IsInsideClip(fScissorState.rect(), rect); } void GrFixedClip::getConservativeBounds(int w, int h, SkIRect* devResult, bool* iior) const { devResult->setXYWH(0, 0, w, h); if (fScissorState.enabled()) { if (!devResult->intersect(fScissorState.rect())) { devResult->setEmpty(); } } if (iior) { *iior = true; } } bool GrFixedClip::isRRect(const SkRect& rtBounds, SkRRect* rr, GrAA* aa) const { if (fWindowRectsState.enabled()) { return false; } if (fScissorState.enabled()) { SkRect rect = SkRect::Make(fScissorState.rect()); if (!rect.intersects(rtBounds)) { return false; } rr->setRect(rect); *aa = GrAA::kNo; return true; } return false; }; bool GrFixedClip::apply(int rtWidth, int rtHeight, GrAppliedHardClip* out, SkRect* bounds) const { if (fScissorState.enabled()) { SkIRect tightScissor = SkIRect::MakeWH(rtWidth, rtHeight); if (!tightScissor.intersect(fScissorState.rect())) { return false; } if (IsOutsideClip(tightScissor, *bounds)) { return false; } if (!IsInsideClip(fScissorState.rect(), *bounds)) { out->addScissor(tightScissor, bounds); } } if (fWindowRectsState.enabled()) { out->addWindowRectangles(fWindowRectsState); } return true; } const GrFixedClip& GrFixedClip::Disabled() { static const GrFixedClip disabled = GrFixedClip(); return disabled; }