/*
 * Copyright 2016 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef GrFixedClip_DEFINED
#define GrFixedClip_DEFINED

#include "GrClip.h"
#include "GrScissorState.h"
#include "GrWindowRectsState.h"

/**
 * Implements GrHardClip with scissor and window rectangles.
 */
class GrFixedClip final : public GrHardClip {
public:
    GrFixedClip() = default;
    explicit GrFixedClip(const SkIRect& scissorRect) : fScissorState(scissorRect) {}

    const GrScissorState& scissorState() const { return fScissorState; }
    bool scissorEnabled() const { return fScissorState.enabled(); }
    const SkIRect& scissorRect() const { SkASSERT(scissorEnabled()); return fScissorState.rect(); }

    void disableScissor() { fScissorState.setDisabled(); }

    void setScissor(const SkIRect& irect) {
        fScissorState.set(irect);
    }
    bool SK_WARN_UNUSED_RESULT intersect(const SkIRect& irect) {
        return fScissorState.intersect(irect);
    }

    const GrWindowRectsState& windowRectsState() const { return fWindowRectsState; }
    bool hasWindowRectangles() const { return fWindowRectsState.enabled(); }

    void disableWindowRectangles() { fWindowRectsState.setDisabled(); }

    void setWindowRectangles(const GrWindowRectangles& windows, GrWindowRectsState::Mode mode) {
        fWindowRectsState.set(windows, mode);
    }

    bool quickContains(const SkRect&) const override;
    void getConservativeBounds(int w, int h, SkIRect* devResult, bool* iior) const override;
    bool isRRect(const SkRect& rtBounds, SkRRect* rr, GrAA*) const override;
    bool apply(int rtWidth, int rtHeight, GrAppliedHardClip*, SkRect*) const override;

    static const GrFixedClip& Disabled();

private:
    GrScissorState       fScissorState;
    GrWindowRectsState   fWindowRectsState;
};

#endif
