/* | |
* Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. | |
* | |
* This library is free software; you can redistribute it and/or | |
* modify it under the terms of the GNU Library General Public | |
* License as published by the Free Software Foundation; either | |
* version 2 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 | |
* Library General Public License for more details. | |
* | |
* You should have received a copy of the GNU Library General Public License | |
* along with this library; see the file COPYING.LIB. If not, write to | |
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | |
* Boston, MA 02110-1301, USA. | |
* | |
*/ | |
#ifndef RenderOverflow_h | |
#define RenderOverflow_h | |
#include "IntRect.h" | |
namespace WebCore | |
{ | |
// RenderOverflow is a class for tracking content that spills out of a box. This class is used by RenderBox and | |
// InlineFlowBox. | |
// | |
// There are two types of overflow: layout overflow (which is expected to be reachable via scrolling mechanisms) and | |
// visual overflow (which is not expected to be reachable via scrolling mechanisms). | |
// | |
// Layout overflow examples include other boxes that spill out of our box, For example, in the inline case a tall image | |
// could spill out of a line box. | |
// Examples of visual overflow are shadows, text stroke (and eventually outline and border-image). | |
// This object is allocated only when some of these fields have non-default values in the owning box. | |
class RenderOverflow : public Noncopyable { | |
public: | |
RenderOverflow(const IntRect& defaultRect = IntRect()) | |
: m_topLayoutOverflow(defaultRect.y()) | |
, m_bottomLayoutOverflow(defaultRect.bottom()) | |
, m_leftLayoutOverflow(defaultRect.x()) | |
, m_rightLayoutOverflow(defaultRect.right()) | |
, m_topVisualOverflow(defaultRect.y()) | |
, m_bottomVisualOverflow(defaultRect.bottom()) | |
, m_leftVisualOverflow(defaultRect.x()) | |
, m_rightVisualOverflow(defaultRect.right()) | |
{ | |
} | |
int topLayoutOverflow() const { return m_topLayoutOverflow; } | |
int bottomLayoutOverflow() const { return m_bottomLayoutOverflow; } | |
int leftLayoutOverflow() const { return m_leftLayoutOverflow; } | |
int rightLayoutOverflow() const { return m_rightLayoutOverflow; } | |
IntRect layoutOverflowRect() const; | |
int topVisualOverflow() const { return m_topVisualOverflow; } | |
int bottomVisualOverflow() const { return m_bottomVisualOverflow; } | |
int leftVisualOverflow() const { return m_leftVisualOverflow; } | |
int rightVisualOverflow() const { return m_rightVisualOverflow; } | |
IntRect visualOverflowRect() const; | |
IntRect visibleOverflowRect() const; | |
void setTopLayoutOverflow(int overflow) { m_topLayoutOverflow = overflow; } | |
void setBottomLayoutOverflow(int overflow) { m_bottomLayoutOverflow = overflow; } | |
void setLeftLayoutOverflow(int overflow) { m_leftLayoutOverflow = overflow; } | |
void setRightLayoutOverflow(int overflow) { m_rightLayoutOverflow = overflow; } | |
void setTopVisualOverflow(int overflow) { m_topVisualOverflow = overflow; } | |
void setBottomVisualOverflow(int overflow) { m_bottomVisualOverflow = overflow; } | |
void setLeftVisualOverflow(int overflow) { m_leftVisualOverflow = overflow; } | |
void setRightVisualOverflow(int overflow) { m_rightVisualOverflow = overflow; } | |
void move(int dx, int dy); | |
void addLayoutOverflow(const IntRect&); | |
void addVisualOverflow(const IntRect&); | |
void resetLayoutOverflow(const IntRect& defaultRect); | |
private: | |
int m_topLayoutOverflow; | |
int m_bottomLayoutOverflow; | |
int m_leftLayoutOverflow; | |
int m_rightLayoutOverflow; | |
int m_topVisualOverflow; | |
int m_bottomVisualOverflow; | |
int m_leftVisualOverflow; | |
int m_rightVisualOverflow; | |
}; | |
inline IntRect RenderOverflow::layoutOverflowRect() const | |
{ | |
return IntRect(m_leftLayoutOverflow, m_topLayoutOverflow, m_rightLayoutOverflow - m_leftLayoutOverflow, m_bottomLayoutOverflow - m_topLayoutOverflow); | |
} | |
inline IntRect RenderOverflow::visualOverflowRect() const | |
{ | |
return IntRect(m_leftVisualOverflow, m_topVisualOverflow, m_rightVisualOverflow - m_leftVisualOverflow, m_bottomVisualOverflow - m_topVisualOverflow); | |
} | |
inline IntRect RenderOverflow::visibleOverflowRect() const | |
{ | |
IntRect combinedRect(layoutOverflowRect()); | |
combinedRect.unite(visualOverflowRect()); | |
return combinedRect; | |
} | |
inline void RenderOverflow::move(int dx, int dy) | |
{ | |
m_topLayoutOverflow += dy; | |
m_bottomLayoutOverflow += dy; | |
m_leftLayoutOverflow += dx; | |
m_rightLayoutOverflow += dx; | |
m_topVisualOverflow += dy; | |
m_bottomVisualOverflow += dy; | |
m_leftVisualOverflow += dx; | |
m_rightVisualOverflow += dx; | |
} | |
inline void RenderOverflow::addLayoutOverflow(const IntRect& rect) | |
{ | |
m_topLayoutOverflow = std::min(rect.y(), m_topLayoutOverflow); | |
m_bottomLayoutOverflow = std::max(rect.bottom(), m_bottomLayoutOverflow); | |
m_leftLayoutOverflow = std::min(rect.x(), m_leftLayoutOverflow); | |
m_rightLayoutOverflow = std::max(rect.right(), m_rightLayoutOverflow); | |
} | |
inline void RenderOverflow::addVisualOverflow(const IntRect& rect) | |
{ | |
m_topVisualOverflow = std::min(rect.y(), m_topVisualOverflow); | |
m_bottomVisualOverflow = std::max(rect.bottom(), m_bottomVisualOverflow); | |
m_leftVisualOverflow = std::min(rect.x(), m_leftVisualOverflow); | |
m_rightVisualOverflow = std::max(rect.right(), m_rightVisualOverflow); | |
} | |
inline void RenderOverflow::resetLayoutOverflow(const IntRect& rect) | |
{ | |
m_topLayoutOverflow = rect.y(); | |
m_bottomLayoutOverflow = rect.bottom(); | |
m_leftLayoutOverflow = rect.x(); | |
m_rightLayoutOverflow = rect.right(); | |
} | |
} // namespace WebCore | |
#endif // RenderOverflow_h |