blob: d16f52a946f894079e42b533ffd97a074fa43d99 [file] [log] [blame]
/*
* 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 "src/gpu/GrFixedClip.h"
#include "src/gpu/GrAppliedClip.h"
SkIRect GrFixedClip::getConservativeBounds() const {
return fScissorState.rect();
}
GrClip::PreClipResult GrFixedClip::preApply(const SkRect& drawBounds, GrAA aa) const {
SkIRect pixelBounds = GetPixelIBounds(drawBounds, aa);
if (!SkIRect::Intersects(fScissorState.rect(), pixelBounds)) {
return Effect::kClippedOut;
}
if (fWindowRectsState.enabled()) {
return Effect::kClipped;
}
if (!fScissorState.enabled() || fScissorState.rect().contains(pixelBounds)) {
// Either no scissor or the scissor doesn't clip the draw
return Effect::kUnclipped;
}
// Report the scissor as a degenerate round rect
return {SkRect::Make(fScissorState.rect()), GrAA::kNo};
}
GrClip::Effect GrFixedClip::apply(GrAppliedHardClip* out, SkIRect* bounds) const {
if (!SkIRect::Intersects(fScissorState.rect(), *bounds)) {
return Effect::kClippedOut;
}
Effect effect = Effect::kUnclipped;
if (fScissorState.enabled() && !fScissorState.rect().contains(*bounds)) {
SkAssertResult(bounds->intersect(fScissorState.rect()));
out->setScissor(*bounds);
effect = Effect::kClipped;
}
if (fWindowRectsState.enabled()) {
out->addWindowRectangles(fWindowRectsState);
// We could iterate each window rectangle to check for intersection, but be conservative
// and report that it's clipped
effect = Effect::kClipped;
}
return effect;
}