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