/*
 * 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, bool* 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 = false;
        return true;
    }
    return false;
};

bool GrFixedClip::apply(GrContext*, GrRenderTargetContext* rtc,
                        bool, bool, GrAppliedClip* out) const {
    if (fScissorState.enabled()) {
        SkIRect tightScissor = SkIRect::MakeWH(rtc->width(), rtc->height());
        if (!tightScissor.intersect(fScissorState.rect())) {
            return false;
        }
        if (IsOutsideClip(tightScissor, out->clippedDrawBounds())) {
            return false;
        }
        if (!IsInsideClip(fScissorState.rect(), out->clippedDrawBounds())) {
            out->addScissor(tightScissor);
        }
    }

    if (fWindowRectsState.enabled()) {
        out->addWindowRectangles(fWindowRectsState);
    }

    return true;
}

const GrFixedClip& GrFixedClip::Disabled() {
    static const GrFixedClip disabled = GrFixedClip();
    return disabled;
}
