1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef ClipRectsCache_h
6#define ClipRectsCache_h
7
8#include "core/rendering/ClipRects.h"
9
10#if ENABLE(ASSERT)
11#include "core/rendering/RenderBox.h" // For OverlayScrollbarSizeRelevancy.
12#endif
13
14namespace blink {
15
16enum ClipRectsCacheSlot {
17    // Relative to the ancestor treated as the root (e.g. transformed layer). Used for hit testing.
18    RootRelativeClipRects,
19
20    // Relative to the RenderView's layer. Used for compositing overlap testing.
21    AbsoluteClipRects,
22
23    // Relative to painting ancestor. Used for painting.
24    PaintingClipRects,
25    PaintingClipRectsIgnoringOverflowClip,
26
27    NumberOfClipRectsCacheSlots,
28    UncachedClipRects,
29};
30
31class ClipRectsCache {
32    WTF_MAKE_FAST_ALLOCATED;
33public:
34    struct Entry {
35        Entry()
36            : root(0)
37#if ENABLE(ASSERT)
38            , scrollbarRelevancy(IgnoreOverlayScrollbarSize)
39#endif
40        {
41        }
42
43        const RenderLayer* root;
44        RefPtr<ClipRects> clipRects;
45#if ENABLE(ASSERT)
46        OverlayScrollbarSizeRelevancy scrollbarRelevancy;
47#endif
48    };
49
50    Entry& get(ClipRectsCacheSlot slot)
51    {
52        ASSERT(slot < NumberOfClipRectsCacheSlots);
53        return m_entries[slot];
54    }
55
56    void clear(ClipRectsCacheSlot slot)
57    {
58        ASSERT(slot < NumberOfClipRectsCacheSlots);
59        m_entries[slot] = Entry();
60    }
61
62private:
63    Entry m_entries[NumberOfClipRectsCacheSlots];
64};
65
66} // namespace blink
67
68#endif // ClipRectsCache_h
69