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

#include "SkClipStack.h"
#include "SkTLList.h"

namespace GrReducedClip {

typedef SkTLList<SkClipStack::Element> ElementList;

enum InitialState {
    kAllIn_InitialState,
    kAllOut_InitialState,
};

/**
 * This function takes a clip stack and a query rectangle and it produces a reduced set of
 * SkClipStack::Elements that are equivalent to applying the full stack to the rectangle. The clip
 * stack generation id that represents the list of elements is returned in resultGenID. The
 * initial state of the query rectangle before the first clip element is applied is returned via
 * initialState. Optionally, the caller can request a tighter bounds on the clip be returned via
 * tighterBounds. If not NULL, tighterBounds will always be contained by queryBounds after return.
 * If tighterBounds is specified then it is assumed that the caller will implicitly clip against it.
 * If the caller specifies non-NULL for requiresAA then it will indicate whether anti-aliasing is
 * required to process any of the elements in the result.
 *
 * This may become a member function of SkClipStack when its interface is determined to be stable.
 * Marked SK_API so that SkLua can call this in a shared library build.
 */
SK_API void ReduceClipStack(const SkClipStack& stack,
                            const SkIRect& queryBounds,
                            ElementList* result,
                            int32_t* resultGenID,
                            InitialState* initialState,
                            SkIRect* tighterBounds = NULL,
                            bool* requiresAA = NULL);

} // namespace GrReducedClip
