• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  *
19  */
20 
21 #ifndef RenderOverflow_h
22 #define RenderOverflow_h
23 
24 #include "IntRect.h"
25 
26 namespace WebCore
27 {
28 // RenderOverflow is a class for tracking content that spills out of a box.  This class is used by RenderBox and
29 // InlineFlowBox.
30 //
31 // There are two types of overflow: layout overflow (which is expected to be reachable via scrolling mechanisms) and
32 // visual overflow (which is not expected to be reachable via scrolling mechanisms).
33 //
34 // Layout overflow examples include other boxes that spill out of our box,  For example, in the inline case a tall image
35 // could spill out of a line box.
36 
37 // Examples of visual overflow are shadows, text stroke (and eventually outline and border-image).
38 
39 // This object is allocated only when some of these fields have non-default values in the owning box.
40 class RenderOverflow {
41     WTF_MAKE_NONCOPYABLE(RenderOverflow); WTF_MAKE_FAST_ALLOCATED;
42 public:
RenderOverflow(const IntRect & layoutRect,const IntRect & visualRect)43     RenderOverflow(const IntRect& layoutRect, const IntRect& visualRect)
44         : m_minYLayoutOverflow(layoutRect.y())
45         , m_maxYLayoutOverflow(layoutRect.maxY())
46         , m_minXLayoutOverflow(layoutRect.x())
47         , m_maxXLayoutOverflow(layoutRect.maxX())
48         , m_minYVisualOverflow(visualRect.y())
49         , m_maxYVisualOverflow(visualRect.maxY())
50         , m_minXVisualOverflow(visualRect.x())
51         , m_maxXVisualOverflow(visualRect.maxX())
52     {
53     }
54 
minYLayoutOverflow()55     int minYLayoutOverflow() const { return m_minYLayoutOverflow; }
maxYLayoutOverflow()56     int maxYLayoutOverflow() const { return m_maxYLayoutOverflow; }
minXLayoutOverflow()57     int minXLayoutOverflow() const { return m_minXLayoutOverflow; }
maxXLayoutOverflow()58     int maxXLayoutOverflow() const { return m_maxXLayoutOverflow; }
59     IntRect layoutOverflowRect() const;
60 
minYVisualOverflow()61     int minYVisualOverflow() const { return m_minYVisualOverflow; }
maxYVisualOverflow()62     int maxYVisualOverflow() const { return m_maxYVisualOverflow; }
minXVisualOverflow()63     int minXVisualOverflow() const { return m_minXVisualOverflow; }
maxXVisualOverflow()64     int maxXVisualOverflow() const { return m_maxXVisualOverflow; }
65     IntRect visualOverflowRect() const;
66 
setMinYLayoutOverflow(int overflow)67     void setMinYLayoutOverflow(int overflow) { m_minYLayoutOverflow = overflow; }
setMaxYLayoutOverflow(int overflow)68     void setMaxYLayoutOverflow(int overflow) { m_maxYLayoutOverflow = overflow; }
setMinXLayoutOverflow(int overflow)69     void setMinXLayoutOverflow(int overflow) { m_minXLayoutOverflow = overflow; }
setMaxXLayoutOverflow(int overflow)70     void setMaxXLayoutOverflow(int overflow) { m_maxXLayoutOverflow = overflow; }
71 
setMinYVisualOverflow(int overflow)72     void setMinYVisualOverflow(int overflow) { m_minYVisualOverflow = overflow; }
setMaxYVisualOverflow(int overflow)73     void setMaxYVisualOverflow(int overflow) { m_maxYVisualOverflow = overflow; }
setMinXVisualOverflow(int overflow)74     void setMinXVisualOverflow(int overflow) { m_minXVisualOverflow = overflow; }
setMaxXVisualOverflow(int overflow)75     void setMaxXVisualOverflow(int overflow) { m_maxXVisualOverflow = overflow; }
76 
77     void move(int dx, int dy);
78 
79     void addLayoutOverflow(const IntRect&);
80     void addVisualOverflow(const IntRect&);
81 
82     void setLayoutOverflow(const IntRect&);
83     void setVisualOverflow(const IntRect&);
84 
85     void resetLayoutOverflow(const IntRect& defaultRect);
86 
87 private:
88     int m_minYLayoutOverflow;
89     int m_maxYLayoutOverflow;
90     int m_minXLayoutOverflow;
91     int m_maxXLayoutOverflow;
92 
93     int m_minYVisualOverflow;
94     int m_maxYVisualOverflow;
95     int m_minXVisualOverflow;
96     int m_maxXVisualOverflow;
97 };
98 
layoutOverflowRect()99 inline IntRect RenderOverflow::layoutOverflowRect() const
100 {
101     return IntRect(m_minXLayoutOverflow, m_minYLayoutOverflow, m_maxXLayoutOverflow - m_minXLayoutOverflow, m_maxYLayoutOverflow - m_minYLayoutOverflow);
102 }
103 
visualOverflowRect()104 inline IntRect RenderOverflow::visualOverflowRect() const
105 {
106     return IntRect(m_minXVisualOverflow, m_minYVisualOverflow, m_maxXVisualOverflow - m_minXVisualOverflow, m_maxYVisualOverflow - m_minYVisualOverflow);
107 }
108 
move(int dx,int dy)109 inline void RenderOverflow::move(int dx, int dy)
110 {
111     m_minYLayoutOverflow += dy;
112     m_maxYLayoutOverflow += dy;
113     m_minXLayoutOverflow += dx;
114     m_maxXLayoutOverflow += dx;
115 
116     m_minYVisualOverflow += dy;
117     m_maxYVisualOverflow += dy;
118     m_minXVisualOverflow += dx;
119     m_maxXVisualOverflow += dx;
120 }
121 
addLayoutOverflow(const IntRect & rect)122 inline void RenderOverflow::addLayoutOverflow(const IntRect& rect)
123 {
124     m_minYLayoutOverflow = std::min(rect.y(), m_minYLayoutOverflow);
125     m_maxYLayoutOverflow = std::max(rect.maxY(), m_maxYLayoutOverflow);
126     m_minXLayoutOverflow = std::min(rect.x(), m_minXLayoutOverflow);
127     m_maxXLayoutOverflow = std::max(rect.maxX(), m_maxXLayoutOverflow);
128 }
129 
addVisualOverflow(const IntRect & rect)130 inline void RenderOverflow::addVisualOverflow(const IntRect& rect)
131 {
132     m_minYVisualOverflow = std::min(rect.y(), m_minYVisualOverflow);
133     m_maxYVisualOverflow = std::max(rect.maxY(), m_maxYVisualOverflow);
134     m_minXVisualOverflow = std::min(rect.x(), m_minXVisualOverflow);
135     m_maxXVisualOverflow = std::max(rect.maxX(), m_maxXVisualOverflow);
136 }
137 
setLayoutOverflow(const IntRect & rect)138 inline void RenderOverflow::setLayoutOverflow(const IntRect& rect)
139 {
140     m_minYLayoutOverflow = rect.y();
141     m_maxYLayoutOverflow = rect.maxY();
142     m_minXLayoutOverflow = rect.x();
143     m_maxXLayoutOverflow = rect.maxX();
144 }
145 
setVisualOverflow(const IntRect & rect)146 inline void RenderOverflow::setVisualOverflow(const IntRect& rect)
147 {
148     m_minYVisualOverflow = rect.y();
149     m_maxYVisualOverflow = rect.maxY();
150     m_minXVisualOverflow = rect.x();
151     m_maxXVisualOverflow = rect.maxX();
152 }
153 
resetLayoutOverflow(const IntRect & rect)154 inline void RenderOverflow::resetLayoutOverflow(const IntRect& rect)
155 {
156     m_minYLayoutOverflow = rect.y();
157     m_maxYLayoutOverflow = rect.maxY();
158     m_minXLayoutOverflow = rect.x();
159     m_maxXLayoutOverflow = rect.maxX();
160 }
161 
162 } // namespace WebCore
163 
164 #endif // RenderOverflow_h
165