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