/*
 * Copyright (C) 2003, 2009, 2012 Apple Inc. All rights reserved.
 * Copyright (C) 2013 Intel Corporation. All rights reserved.
 *
 * Portions are Copyright (C) 1998 Netscape Communications Corporation.
 *
 * Other contributors:
 *   Robert O'Callahan <roc+@cs.cmu.edu>
 *   David Baron <dbaron@fas.harvard.edu>
 *   Christian Biesinger <cbiesinger@web.de>
 *   Randall Jesup <rjesup@wgate.com>
 *   Roland Mainz <roland.mainz@informatik.med.uni-giessen.de>
 *   Josh Soref <timeless@mac.com>
 *   Boris Zbarsky <bzbarsky@mit.edu>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * Alternatively, the contents of this file may be used under the terms
 * of either the Mozilla Public License Version 1.1, found at
 * http://www.mozilla.org/MPL/ (the "MPL") or the GNU General Public
 * License Version 2.0, found at http://www.fsf.org/copyleft/gpl.html
 * (the "GPL"), in which case the provisions of the MPL or the GPL are
 * applicable instead of those above.  If you wish to allow use of your
 * version of this file only under the terms of one of those two
 * licenses (the MPL or the GPL) and not to allow others to use your
 * version of this file under the LGPL, indicate your decision by
 * deletingthe provisions above and replace them with the notice and
 * other provisions required by the MPL or the GPL, as the case may be.
 * If you do not delete the provisions above, a recipient may use your
 * version of this file under any of the LGPL, the MPL or the GPL.
 */

#ifndef LayerPaintingInfo_h
#define LayerPaintingInfo_h

#include "core/rendering/PaintInfo.h"
#include "platform/geometry/LayoutRect.h"

namespace blink {

class RenderLayer;

enum PaintLayerFlag {
    PaintLayerHaveTransparency = 1,
    PaintLayerAppliedTransform = 1 << 1,
    PaintLayerUncachedClipRects = 1 << 2,
    PaintLayerPaintingOverlayScrollbars = 1 << 4,
    PaintLayerPaintingCompositingBackgroundPhase = 1 << 5,
    PaintLayerPaintingCompositingForegroundPhase = 1 << 6,
    PaintLayerPaintingCompositingMaskPhase = 1 << 7,
    PaintLayerPaintingCompositingScrollingPhase = 1 << 8,
    PaintLayerPaintingOverflowContents = 1 << 9,
    PaintLayerPaintingRootBackgroundOnly = 1 << 10,
    PaintLayerPaintingSkipRootBackground = 1 << 11,
    PaintLayerPaintingChildClippingMaskPhase = 1 << 12,
    PaintLayerPaintingCompositingAllPhases = (PaintLayerPaintingCompositingBackgroundPhase | PaintLayerPaintingCompositingForegroundPhase | PaintLayerPaintingCompositingMaskPhase)
};

typedef unsigned PaintLayerFlags;

struct LayerPaintingInfo {
    LayerPaintingInfo(RenderLayer* inRootLayer, const LayoutRect& inDirtyRect,
        PaintBehavior inPaintBehavior, const LayoutSize& inSubPixelAccumulation,
        RenderObject* inPaintingRoot = 0)
        : rootLayer(inRootLayer)
        , paintingRoot(inPaintingRoot)
        , paintDirtyRect(inDirtyRect)
        , subPixelAccumulation(inSubPixelAccumulation)
        , paintBehavior(inPaintBehavior)
        , clipToDirtyRect(true)
    { }
    RenderLayer* rootLayer;
    RenderObject* paintingRoot; // only paint descendants of this object
    LayoutRect paintDirtyRect; // relative to rootLayer;
    LayoutSize subPixelAccumulation;
    PaintBehavior paintBehavior;
    bool clipToDirtyRect;
};

} // namespace blink

#endif // LayerPaintingInfo_h
