15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef RenderOverflow_h 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define RenderOverflow_h 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 241e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/LayoutRect.h" 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// RenderOverflow is a class for tracking content that spills out of a box. This class is used by RenderBox and 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// InlineFlowBox. 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// There are two types of overflow: layout overflow (which is expected to be reachable via scrolling mechanisms) and 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// visual overflow (which is not expected to be reachable via scrolling mechanisms). 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Layout overflow examples include other boxes that spill out of our box, For example, in the inline case a tall image 3502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// could spill out of a line box. 3602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Examples of visual overflow are shadows, text stroke (and eventually outline and border-image). 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This object is allocated only when some of these fields have non-default values in the owning box. 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderOverflow { 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(RenderOverflow); WTF_MAKE_FAST_ALLOCATED; 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 4302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch RenderOverflow(const LayoutRect& layoutRect, const LayoutRect& visualRect) 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_layoutOverflow(layoutRect) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_visualOverflow(visualRect) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const LayoutRect layoutOverflowRect() const { return m_layoutOverflow; } 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const LayoutRect visualOverflowRect() const { return m_visualOverflow; } 513c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch LayoutRect contentsVisualOverflowRect() const { return m_contentsVisualOverflow; } 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void move(LayoutUnit dx, LayoutUnit dy); 5402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void addLayoutOverflow(const LayoutRect&); 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void addVisualOverflow(const LayoutRect&); 573c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch void addContentsVisualOverflow(const LayoutRect& rect) { m_contentsVisualOverflow.unite(rect); } 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setLayoutOverflow(const LayoutRect&); 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setVisualOverflow(const LayoutRect&); 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LayoutUnit layoutClientAfterEdge() const { return m_layoutClientAfterEdge; } 63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void setLayoutClientAfterEdge(LayoutUnit clientAfterEdge) { m_layoutClientAfterEdge = clientAfterEdge; } 64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutRect m_layoutOverflow; 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutRect m_visualOverflow; 683c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch LayoutRect m_contentsVisualOverflow; 69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LayoutUnit m_layoutClientAfterEdge; 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void RenderOverflow::move(LayoutUnit dx, LayoutUnit dy) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_layoutOverflow.move(dx, dy); 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_visualOverflow.move(dx, dy); 773c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch m_contentsVisualOverflow.move(dx, dy); 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void RenderOverflow::addLayoutOverflow(const LayoutRect& rect) 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit maxX = std::max(rect.maxX(), m_layoutOverflow.maxX()); 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit maxY = std::max(rect.maxY(), m_layoutOverflow.maxY()); 84e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) LayoutUnit minX = std::min(rect.x(), m_layoutOverflow.x()); 85e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) LayoutUnit minY = std::min(rect.y(), m_layoutOverflow.y()); 86e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) // In case the width/height is larger than LayoutUnit can represent, fix the right/bottom edge and shift the top/left ones 87e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_layoutOverflow.setWidth(maxX - minX); 88e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_layoutOverflow.setHeight(maxY - minY); 89e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_layoutOverflow.setX(maxX - m_layoutOverflow.width()); 90e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_layoutOverflow.setY(maxY - m_layoutOverflow.height()); 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void RenderOverflow::addVisualOverflow(const LayoutRect& rect) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit maxX = std::max(rect.maxX(), m_visualOverflow.maxX()); 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit maxY = std::max(rect.maxY(), m_visualOverflow.maxY()); 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_visualOverflow.setX(std::min(rect.x(), m_visualOverflow.x())); 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_visualOverflow.setY(std::min(rect.y(), m_visualOverflow.y())); 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_visualOverflow.setWidth(maxX - m_visualOverflow.x()); 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_visualOverflow.setHeight(maxY - m_visualOverflow.y()); 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void RenderOverflow::setLayoutOverflow(const LayoutRect& rect) 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_layoutOverflow = rect; 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void RenderOverflow::setVisualOverflow(const LayoutRect& rect) 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_visualOverflow = rect; 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // RenderOverflow_h 116