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 "LayoutRect.h" 25#include <wtf/RefCounted.h> 26 27namespace WebCore 28{ 29// RenderOverflow is a class for tracking content that spills out of a box. This class is used by RenderBox and 30// InlineFlowBox. 31// 32// There are two types of overflow: layout overflow (which is expected to be reachable via scrolling mechanisms) and 33// visual overflow (which is not expected to be reachable via scrolling mechanisms). 34// 35// Layout overflow examples include other boxes that spill out of our box, For example, in the inline case a tall image 36// could spill out of a line box. 37 38// Examples of visual overflow are shadows, text stroke (and eventually outline and border-image). 39 40// This object is allocated only when some of these fields have non-default values in the owning box. 41class RenderOverflow : public WTF::RefCounted<RenderOverflow> { 42 WTF_MAKE_NONCOPYABLE(RenderOverflow); WTF_MAKE_FAST_ALLOCATED; 43public: 44 RenderOverflow(const LayoutRect& layoutRect, const LayoutRect& visualRect) 45 : m_layoutOverflow(layoutRect) 46 , m_visualOverflow(visualRect) 47 { 48 } 49 50 const LayoutRect layoutOverflowRect() const { return m_layoutOverflow; } 51 const LayoutRect visualOverflowRect() const { return m_visualOverflow; } 52 53 void move(LayoutUnit dx, LayoutUnit dy); 54 55 void addLayoutOverflow(const LayoutRect&); 56 void addVisualOverflow(const LayoutRect&); 57 58 void setLayoutOverflow(const LayoutRect&); 59 void setVisualOverflow(const LayoutRect&); 60 61 LayoutUnit layoutClientAfterEdge() const { return m_layoutClientAfterEdge; } 62 void setLayoutClientAfterEdge(LayoutUnit clientAfterEdge) { m_layoutClientAfterEdge = clientAfterEdge; } 63 64private: 65 LayoutRect m_layoutOverflow; 66 LayoutRect m_visualOverflow; 67 68 LayoutUnit m_layoutClientAfterEdge; 69}; 70 71inline void RenderOverflow::move(LayoutUnit dx, LayoutUnit dy) 72{ 73 m_layoutOverflow.move(dx, dy); 74 m_visualOverflow.move(dx, dy); 75} 76 77inline void RenderOverflow::addLayoutOverflow(const LayoutRect& rect) 78{ 79 LayoutUnit maxX = std::max(rect.maxX(), m_layoutOverflow.maxX()); 80 LayoutUnit maxY = std::max(rect.maxY(), m_layoutOverflow.maxY()); 81 m_layoutOverflow.setX(std::min(rect.x(), m_layoutOverflow.x())); 82 m_layoutOverflow.setY(std::min(rect.y(), m_layoutOverflow.y())); 83 m_layoutOverflow.setWidth(maxX - m_layoutOverflow.x()); 84 m_layoutOverflow.setHeight(maxY - m_layoutOverflow.y()); 85} 86 87inline void RenderOverflow::addVisualOverflow(const LayoutRect& rect) 88{ 89 LayoutUnit maxX = std::max(rect.maxX(), m_visualOverflow.maxX()); 90 LayoutUnit maxY = std::max(rect.maxY(), m_visualOverflow.maxY()); 91 m_visualOverflow.setX(std::min(rect.x(), m_visualOverflow.x())); 92 m_visualOverflow.setY(std::min(rect.y(), m_visualOverflow.y())); 93 m_visualOverflow.setWidth(maxX - m_visualOverflow.x()); 94 m_visualOverflow.setHeight(maxY - m_visualOverflow.y()); 95} 96 97inline void RenderOverflow::setLayoutOverflow(const LayoutRect& rect) 98{ 99 m_layoutOverflow = rect; 100} 101 102inline void RenderOverflow::setVisualOverflow(const LayoutRect& rect) 103{ 104 m_visualOverflow = rect; 105} 106 107} // namespace WebCore 108 109#endif // RenderOverflow_h 110