1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2010 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "src/gpu/GrFixedClip.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "src/gpu/GrAppliedClip.h" 11cb93a386Sopenharmony_ci 12cb93a386Sopenharmony_ciSkIRect GrFixedClip::getConservativeBounds() const { 13cb93a386Sopenharmony_ci return fScissorState.rect(); 14cb93a386Sopenharmony_ci} 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_ciGrClip::PreClipResult GrFixedClip::preApply(const SkRect& drawBounds, GrAA aa) const { 17cb93a386Sopenharmony_ci SkIRect pixelBounds = GetPixelIBounds(drawBounds, aa); 18cb93a386Sopenharmony_ci if (!SkIRect::Intersects(fScissorState.rect(), pixelBounds)) { 19cb93a386Sopenharmony_ci return Effect::kClippedOut; 20cb93a386Sopenharmony_ci } 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_ci if (fWindowRectsState.enabled()) { 23cb93a386Sopenharmony_ci return Effect::kClipped; 24cb93a386Sopenharmony_ci } 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ci if (!fScissorState.enabled() || fScissorState.rect().contains(pixelBounds)) { 27cb93a386Sopenharmony_ci // Either no scissor or the scissor doesn't clip the draw 28cb93a386Sopenharmony_ci return Effect::kUnclipped; 29cb93a386Sopenharmony_ci } 30cb93a386Sopenharmony_ci // Report the scissor as a degenerate round rect 31cb93a386Sopenharmony_ci return {SkRect::Make(fScissorState.rect()), GrAA::kNo}; 32cb93a386Sopenharmony_ci} 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ciGrClip::Effect GrFixedClip::apply(GrAppliedHardClip* out, SkIRect* bounds) const { 35cb93a386Sopenharmony_ci if (!SkIRect::Intersects(fScissorState.rect(), *bounds)) { 36cb93a386Sopenharmony_ci return Effect::kClippedOut; 37cb93a386Sopenharmony_ci } 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ci Effect effect = Effect::kUnclipped; 40cb93a386Sopenharmony_ci if (fScissorState.enabled() && !fScissorState.rect().contains(*bounds)) { 41cb93a386Sopenharmony_ci SkAssertResult(bounds->intersect(fScissorState.rect())); 42cb93a386Sopenharmony_ci out->setScissor(*bounds); 43cb93a386Sopenharmony_ci effect = Effect::kClipped; 44cb93a386Sopenharmony_ci } 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_ci if (fWindowRectsState.enabled()) { 47cb93a386Sopenharmony_ci out->addWindowRectangles(fWindowRectsState); 48cb93a386Sopenharmony_ci // We could iterate each window rectangle to check for intersection, but be conservative 49cb93a386Sopenharmony_ci // and report that it's clipped 50cb93a386Sopenharmony_ci effect = Effect::kClipped; 51cb93a386Sopenharmony_ci } 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ci return effect; 54cb93a386Sopenharmony_ci} 55