1e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)/*
2e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) *           (C) 2007 David Smith (catfish.man@gmail.com)
5e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
6e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * Copyright (C) Research In Motion Limited 2010. All rights reserved.
7e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) *
8e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * This library is free software; you can redistribute it and/or
9e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * modify it under the terms of the GNU Library General Public
10e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * License as published by the Free Software Foundation; either
11e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * version 2 of the License, or (at your option) any later version.
12e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) *
13e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * This library is distributed in the hope that it will be useful,
14e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
15e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * Library General Public License for more details.
17e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) *
18e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * You should have received a copy of the GNU Library General Public License
19e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
20e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) * Boston, MA 02110-1301, USA.
22e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) */
23e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
24e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "config.h"
25e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/rendering/FloatingObjects.h"
26e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
27f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "core/rendering/RenderBlockFlow.h"
28e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/rendering/RenderBox.h"
29e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/rendering/RenderView.h"
30e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
31e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)using namespace WTF;
32e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
33c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
34e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
35e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)struct SameSizeAsFloatingObject {
36e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    void* pointers[2];
37e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    LayoutRect rect;
38e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    int paginationStrut;
39e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    uint32_t bitfields : 8;
40e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)};
41e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
42e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)COMPILE_ASSERT(sizeof(FloatingObject) == sizeof(SameSizeAsFloatingObject), FloatingObject_should_stay_small);
43e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
449bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)FloatingObject::FloatingObject(RenderBox* renderer)
459bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    : m_renderer(renderer)
469bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    , m_originatingLine(0)
479bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    , m_paginationStrut(0)
489bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    , m_shouldPaint(true)
499bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    , m_isDescendant(false)
509bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    , m_isPlaced(false)
51197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
529bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    , m_isInPlacedTree(false)
539bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#endif
549bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
559bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    EFloat type = renderer->style()->floating();
569bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    ASSERT(type != NoFloat);
579bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (type == LeftFloat)
589bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        m_type = FloatLeft;
599bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    else if (type == RightFloat)
609bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        m_type = FloatRight;
619bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
629bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
639bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)FloatingObject::FloatingObject(RenderBox* renderer, Type type, const LayoutRect& frameRect, bool shouldPaint, bool isDescendant)
649bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    : m_renderer(renderer)
659bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    , m_originatingLine(0)
669bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    , m_frameRect(frameRect)
679bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    , m_paginationStrut(0)
689bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    , m_type(type)
699bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    , m_shouldPaint(shouldPaint)
709bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    , m_isDescendant(isDescendant)
719bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    , m_isPlaced(true)
72197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
739bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    , m_isInPlacedTree(false)
749bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#endif
759bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
769bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
779bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
789bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)PassOwnPtr<FloatingObject> FloatingObject::create(RenderBox* renderer)
799bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
809bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    OwnPtr<FloatingObject> newObj = adoptPtr(new FloatingObject(renderer));
819bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    newObj->setShouldPaint(!renderer->hasSelfPaintingLayer()); // If a layer exists, the float will paint itself. Otherwise someone else will.
829bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    newObj->setIsDescendant(true);
839bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
849bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    return newObj.release();
859bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
869bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
879bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)PassOwnPtr<FloatingObject> FloatingObject::copyToNewContainer(LayoutSize offset, bool shouldPaint, bool isDescendant) const
889bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
899bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    return adoptPtr(new FloatingObject(renderer(), type(), LayoutRect(frameRect().location() - offset, frameRect().size()), shouldPaint, isDescendant));
909bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
919bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
929bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)PassOwnPtr<FloatingObject> FloatingObject::unsafeClone() const
939bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
949bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    OwnPtr<FloatingObject> cloneObject = adoptPtr(new FloatingObject(renderer(), type(), m_frameRect, m_shouldPaint, m_isDescendant));
959bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    cloneObject->m_paginationStrut = m_paginationStrut;
969bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    cloneObject->m_isPlaced = m_isPlaced;
979bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    return cloneObject.release();
989bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
999bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
100e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)template <FloatingObject::Type FloatTypeValue>
101e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)class ComputeFloatOffsetAdapter {
102e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)public:
103e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    typedef FloatingObjectInterval IntervalType;
104e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
10551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ComputeFloatOffsetAdapter(const RenderBlockFlow* renderer, int lineTop, int lineBottom, LayoutUnit offset)
106e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        : m_renderer(renderer)
107e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        , m_lineTop(lineTop)
108e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        , m_lineBottom(lineBottom)
109e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        , m_offset(offset)
110e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        , m_outermostFloat(0)
111e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    {
112e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
113e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
114d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    virtual ~ComputeFloatOffsetAdapter() { }
115d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
116e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    int lowValue() const { return m_lineTop; }
117e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    int highValue() const { return m_lineBottom; }
118e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    void collectIfNeeded(const IntervalType&);
119e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
12051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    LayoutUnit offset() const { return m_offset; }
121e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
122d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)protected:
1239e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    virtual bool updateOffsetIfNeeded(const FloatingObject&) = 0;
124e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
125f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    const RenderBlockFlow* m_renderer;
126e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    int m_lineTop;
127e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    int m_lineBottom;
12851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    LayoutUnit m_offset;
129e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    const FloatingObject* m_outermostFloat;
130e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)};
131e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
132d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)template <FloatingObject::Type FloatTypeValue>
133d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class ComputeFloatOffsetForFloatLayoutAdapter : public ComputeFloatOffsetAdapter<FloatTypeValue> {
134d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)public:
135d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ComputeFloatOffsetForFloatLayoutAdapter(const RenderBlockFlow* renderer, LayoutUnit lineTop, LayoutUnit lineBottom, LayoutUnit offset)
136d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        : ComputeFloatOffsetAdapter<FloatTypeValue>(renderer, lineTop, lineBottom, offset)
137d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
138d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
139d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
140d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    virtual ~ComputeFloatOffsetForFloatLayoutAdapter() { }
141d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
142d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LayoutUnit heightRemaining() const;
143d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
144d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)protected:
1459e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    virtual bool updateOffsetIfNeeded(const FloatingObject&) OVERRIDE FINAL;
146d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)};
147d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
148d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)template <FloatingObject::Type FloatTypeValue>
149d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class ComputeFloatOffsetForLineLayoutAdapter : public ComputeFloatOffsetAdapter<FloatTypeValue> {
150d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)public:
151d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ComputeFloatOffsetForLineLayoutAdapter(const RenderBlockFlow* renderer, LayoutUnit lineTop, LayoutUnit lineBottom, LayoutUnit offset)
152d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        : ComputeFloatOffsetAdapter<FloatTypeValue>(renderer, lineTop, lineBottom, offset)
153d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
154d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
155d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
156d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    virtual ~ComputeFloatOffsetForLineLayoutAdapter() { }
157d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
158d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)protected:
1599e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    virtual bool updateOffsetIfNeeded(const FloatingObject&) OVERRIDE FINAL;
160d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)};
161d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
162e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
163e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)FloatingObjects::~FloatingObjects()
164e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
165e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
166e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void FloatingObjects::clearLineBoxTreePointers()
167e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
168e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // Clear references to originating lines, since the lines are being deleted
169e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    FloatingObjectSetIterator end = m_set.end();
170e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    for (FloatingObjectSetIterator it = m_set.begin(); it != end; ++it) {
171e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        ASSERT(!((*it)->originatingLine()) || (*it)->originatingLine()->renderer() == m_renderer);
172e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        (*it)->setOriginatingLine(0);
173e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
174e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
175e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
176f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)FloatingObjects::FloatingObjects(const RenderBlockFlow* renderer, bool horizontalWritingMode)
177e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    : m_placedFloatsTree(UninitializedTree)
178e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    , m_leftObjectsCount(0)
179e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    , m_rightObjectsCount(0)
180e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    , m_horizontalWritingMode(horizontalWritingMode)
181e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    , m_renderer(renderer)
18206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    , m_cachedHorizontalWritingMode(false)
183e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
184e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
185e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
186e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void FloatingObjects::clear()
187e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
188e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    m_set.clear();
189e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    m_placedFloatsTree.clear();
190e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    m_leftObjectsCount = 0;
191e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    m_rightObjectsCount = 0;
1929bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    markLowestFloatLogicalBottomCacheAsDirty();
1939bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
1949bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
1959bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)LayoutUnit FloatingObjects::lowestFloatLogicalBottom(FloatingObject::Type floatType)
1969bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
1979bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    bool isInHorizontalWritingMode = m_horizontalWritingMode;
1989bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (floatType != FloatingObject::FloatLeftRight) {
1999bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        if (hasLowestFloatLogicalBottomCached(isInHorizontalWritingMode, floatType))
2009bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            return getCachedlowestFloatLogicalBottom(floatType);
2019bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    } else {
2029bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        if (hasLowestFloatLogicalBottomCached(isInHorizontalWritingMode, FloatingObject::FloatLeft) && hasLowestFloatLogicalBottomCached(isInHorizontalWritingMode, FloatingObject::FloatRight)) {
203197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return std::max(getCachedlowestFloatLogicalBottom(FloatingObject::FloatLeft),
2049bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                getCachedlowestFloatLogicalBottom(FloatingObject::FloatRight));
2059bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        }
2069bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
2079bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
2089bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    LayoutUnit lowestFloatBottom = 0;
2099bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    const FloatingObjectSet& floatingObjectSet = set();
2109bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    FloatingObjectSetIterator end = floatingObjectSet.end();
2119bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (floatType == FloatingObject::FloatLeftRight) {
2129bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        LayoutUnit lowestFloatBottomLeft = 0;
2139bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        LayoutUnit lowestFloatBottomRight = 0;
2149bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) {
215d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            FloatingObject* floatingObject = it->get();
216f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            if (floatingObject->isPlaced()) {
217f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)                FloatingObject::Type curType = floatingObject->type();
218f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)                LayoutUnit curFloatLogicalBottom = m_renderer->logicalBottomForFloat(floatingObject);
2199bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                if (curType & FloatingObject::FloatLeft)
220197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                    lowestFloatBottomLeft = std::max(lowestFloatBottomLeft, curFloatLogicalBottom);
2219bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)                if (curType & FloatingObject::FloatRight)
222197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                    lowestFloatBottomRight = std::max(lowestFloatBottomRight, curFloatLogicalBottom);
2239bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            }
2249bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        }
225197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        lowestFloatBottom = std::max(lowestFloatBottomLeft, lowestFloatBottomRight);
2269bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        setCachedLowestFloatLogicalBottom(isInHorizontalWritingMode, FloatingObject::FloatLeft, lowestFloatBottomLeft);
2279bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        setCachedLowestFloatLogicalBottom(isInHorizontalWritingMode, FloatingObject::FloatRight, lowestFloatBottomRight);
2289bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    } else {
2299bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) {
230d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            FloatingObject* floatingObject = it->get();
231f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            if (floatingObject->isPlaced() && floatingObject->type() == floatType)
232197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                lowestFloatBottom = std::max(lowestFloatBottom, m_renderer->logicalBottomForFloat(floatingObject));
2339bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        }
2349bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        setCachedLowestFloatLogicalBottom(isInHorizontalWritingMode, floatType, lowestFloatBottom);
2359bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
2369bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
2379bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    return lowestFloatBottom;
2389bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
2399bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
2409bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)bool FloatingObjects::hasLowestFloatLogicalBottomCached(bool isHorizontal, FloatingObject::Type type) const
2419bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
2429bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    int floatIndex = static_cast<int>(type) - 1;
243f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT(floatIndex < static_cast<int>(sizeof(m_lowestFloatBottomCache) / sizeof(FloatBottomCachedValue)));
2449bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    ASSERT(floatIndex >= 0);
2459bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    return (m_cachedHorizontalWritingMode == isHorizontal && !m_lowestFloatBottomCache[floatIndex].dirty);
2469bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
2479bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
2489bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)LayoutUnit FloatingObjects::getCachedlowestFloatLogicalBottom(FloatingObject::Type type) const
2499bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
2509bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    int floatIndex = static_cast<int>(type) - 1;
251f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT(floatIndex < static_cast<int>(sizeof(m_lowestFloatBottomCache) / sizeof(FloatBottomCachedValue)));
2529bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    ASSERT(floatIndex >= 0);
2539bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    return m_lowestFloatBottomCache[floatIndex].value;
2549bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
2559bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
2569bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)void FloatingObjects::setCachedLowestFloatLogicalBottom(bool isHorizontal, FloatingObject::Type type, LayoutUnit value)
2579bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
2589bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    int floatIndex = static_cast<int>(type) - 1;
259f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT(floatIndex < static_cast<int>(sizeof(m_lowestFloatBottomCache) / sizeof(FloatBottomCachedValue)));
2609bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    ASSERT(floatIndex >= 0);
2619bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_cachedHorizontalWritingMode = isHorizontal;
2629bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_lowestFloatBottomCache[floatIndex].value = value;
2639bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_lowestFloatBottomCache[floatIndex].dirty = false;
2649bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
2659bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
2669bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)void FloatingObjects::markLowestFloatLogicalBottomCacheAsDirty()
2679bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
268f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    for (size_t i = 0; i < sizeof(m_lowestFloatBottomCache) / sizeof(FloatBottomCachedValue); ++i)
2699bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        m_lowestFloatBottomCache[i].dirty = true;
2709bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
2719bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
2729bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)void FloatingObjects::moveAllToFloatInfoMap(RendererToFloatInfoMap& map)
2739bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
274d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    while (!m_set.isEmpty()) {
275d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        OwnPtr<FloatingObject> floatingObject = m_set.takeFirst();
276d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        RenderBox* renderer = floatingObject->renderer();
277d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        map.add(renderer, floatingObject.release());
278d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    }
2799bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    clear();
280e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
281e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
282e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)inline void FloatingObjects::increaseObjectsCount(FloatingObject::Type type)
283e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
284e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (type == FloatingObject::FloatLeft)
285e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        m_leftObjectsCount++;
286e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    else
287e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        m_rightObjectsCount++;
288e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
289e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
290e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)inline void FloatingObjects::decreaseObjectsCount(FloatingObject::Type type)
291e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
292e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (type == FloatingObject::FloatLeft)
293e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        m_leftObjectsCount--;
294e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    else
295e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        m_rightObjectsCount--;
296e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
297e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
298e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)inline FloatingObjectInterval FloatingObjects::intervalForFloatingObject(FloatingObject* floatingObject)
299e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
300e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (m_horizontalWritingMode)
301e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return FloatingObjectInterval(floatingObject->frameRect().pixelSnappedY(), floatingObject->frameRect().pixelSnappedMaxY(), floatingObject);
302e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return FloatingObjectInterval(floatingObject->frameRect().pixelSnappedX(), floatingObject->frameRect().pixelSnappedMaxX(), floatingObject);
303e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
304e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
305e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void FloatingObjects::addPlacedObject(FloatingObject* floatingObject)
306e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
307e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    ASSERT(!floatingObject->isInPlacedTree());
308e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
309e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    floatingObject->setIsPlaced(true);
310e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (m_placedFloatsTree.isInitialized())
311e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        m_placedFloatsTree.add(intervalForFloatingObject(floatingObject));
312e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
313197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
314e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    floatingObject->setIsInPlacedTree(true);
315e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#endif
3169bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    markLowestFloatLogicalBottomCacheAsDirty();
317e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
318e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
319e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void FloatingObjects::removePlacedObject(FloatingObject* floatingObject)
320e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
321e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    ASSERT(floatingObject->isPlaced() && floatingObject->isInPlacedTree());
322e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
323e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (m_placedFloatsTree.isInitialized()) {
324e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        bool removed = m_placedFloatsTree.remove(intervalForFloatingObject(floatingObject));
325e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        ASSERT_UNUSED(removed, removed);
326e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
327e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
328e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    floatingObject->setIsPlaced(false);
329197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
330e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    floatingObject->setIsInPlacedTree(false);
331e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#endif
3329bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    markLowestFloatLogicalBottomCacheAsDirty();
333e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
334e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
3359bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)FloatingObject* FloatingObjects::add(PassOwnPtr<FloatingObject> floatingObject)
336e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
3379bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    FloatingObject* newObject = floatingObject.leakPtr();
3389bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    increaseObjectsCount(newObject->type());
339d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    m_set.add(adoptPtr(newObject));
3409bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (newObject->isPlaced())
3419bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        addPlacedObject(newObject);
3429bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    markLowestFloatLogicalBottomCacheAsDirty();
3439bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    return newObject;
344e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
345e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
346d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void FloatingObjects::remove(FloatingObject* toBeRemoved)
347e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
348d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    decreaseObjectsCount(toBeRemoved->type());
349d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    OwnPtr<FloatingObject> floatingObject = m_set.take(toBeRemoved);
350e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    ASSERT(floatingObject->isPlaced() || !floatingObject->isInPlacedTree());
351e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (floatingObject->isPlaced())
352d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        removePlacedObject(floatingObject.get());
3539bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    markLowestFloatLogicalBottomCacheAsDirty();
3549bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    ASSERT(!floatingObject->originatingLine());
355e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
356e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
357e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void FloatingObjects::computePlacedFloatsTree()
358e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
359e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    ASSERT(!m_placedFloatsTree.isInitialized());
360e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (m_set.isEmpty())
361e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return;
362e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    m_placedFloatsTree.initIfNeeded(m_renderer->view()->intervalArena());
363e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    FloatingObjectSetIterator it = m_set.begin();
364e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    FloatingObjectSetIterator end = m_set.end();
365e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    for (; it != end; ++it) {
366d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        FloatingObject* floatingObject = it->get();
367e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        if (floatingObject->isPlaced())
368e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            m_placedFloatsTree.add(intervalForFloatingObject(floatingObject));
369e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
370e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
371e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
37251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)LayoutUnit FloatingObjects::logicalLeftOffsetForPositioningFloat(LayoutUnit fixedOffset, LayoutUnit logicalTop, LayoutUnit *heightRemaining)
37351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
37451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    int logicalTopAsInt = roundToInt(logicalTop);
375d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ComputeFloatOffsetForFloatLayoutAdapter<FloatingObject::FloatLeft> adapter(m_renderer, logicalTopAsInt, logicalTopAsInt, fixedOffset);
376e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    placedFloatsTree().allOverlapsWithAdapter(adapter);
377e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
378e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (heightRemaining)
37951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        *heightRemaining = adapter.heightRemaining();
380e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
38151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return adapter.offset();
382e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
383e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
38451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)LayoutUnit FloatingObjects::logicalRightOffsetForPositioningFloat(LayoutUnit fixedOffset, LayoutUnit logicalTop, LayoutUnit *heightRemaining)
385e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
38651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    int logicalTopAsInt = roundToInt(logicalTop);
387d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ComputeFloatOffsetForFloatLayoutAdapter<FloatingObject::FloatRight> adapter(m_renderer, logicalTopAsInt, logicalTopAsInt, fixedOffset);
388e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    placedFloatsTree().allOverlapsWithAdapter(adapter);
389e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
390e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (heightRemaining)
39151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        *heightRemaining = adapter.heightRemaining();
392e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
393197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return std::min(fixedOffset, adapter.offset());
39451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
39551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
39651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)LayoutUnit FloatingObjects::logicalLeftOffset(LayoutUnit fixedOffset, LayoutUnit logicalTop, LayoutUnit logicalHeight)
39751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
398d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ComputeFloatOffsetForLineLayoutAdapter<FloatingObject::FloatLeft> adapter(m_renderer, roundToInt(logicalTop), roundToInt(logicalTop + logicalHeight), fixedOffset);
39951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    placedFloatsTree().allOverlapsWithAdapter(adapter);
40051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
401d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return adapter.offset();
40251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
40351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
40451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)LayoutUnit FloatingObjects::logicalRightOffset(LayoutUnit fixedOffset, LayoutUnit logicalTop, LayoutUnit logicalHeight)
40551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
406d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ComputeFloatOffsetForLineLayoutAdapter<FloatingObject::FloatRight> adapter(m_renderer, roundToInt(logicalTop), roundToInt(logicalTop + logicalHeight), fixedOffset);
40751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    placedFloatsTree().allOverlapsWithAdapter(adapter);
408e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
409197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return std::min(fixedOffset, adapter.offset());
410e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
411e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
4129bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)FloatingObjects::FloatBottomCachedValue::FloatBottomCachedValue()
4139bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    : value(0)
4149bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    , dirty(true)
4159bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
4169bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
4179bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
418e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)inline static bool rangesIntersect(int floatTop, int floatBottom, int objectTop, int objectBottom)
419e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
420e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (objectTop >= floatBottom || objectBottom < floatTop)
421e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return false;
422e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
423e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // The top of the object overlaps the float
424e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (objectTop >= floatTop)
425e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return true;
426e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
427e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // The object encloses the float
428e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (objectTop < floatTop && objectBottom > floatBottom)
429e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return true;
430e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
431e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // The bottom of the object overlaps the float
432e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (objectBottom > objectTop && objectBottom > floatTop && objectBottom <= floatBottom)
433e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return true;
434e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
435e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return false;
436e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
437e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
438e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)template<>
4399e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)inline bool ComputeFloatOffsetForFloatLayoutAdapter<FloatingObject::FloatLeft>::updateOffsetIfNeeded(const FloatingObject& floatingObject)
440d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
4419e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    LayoutUnit logicalRight = m_renderer->logicalRightForFloat(&floatingObject);
442d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (logicalRight > m_offset) {
443d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_offset = logicalRight;
444d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return true;
445d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
446d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return false;
447d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
448d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
449d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)template<>
4509e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)inline bool ComputeFloatOffsetForFloatLayoutAdapter<FloatingObject::FloatRight>::updateOffsetIfNeeded(const FloatingObject& floatingObject)
451e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
4529e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    LayoutUnit logicalLeft = m_renderer->logicalLeftForFloat(&floatingObject);
453e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (logicalLeft < m_offset) {
454e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        m_offset = logicalLeft;
455e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return true;
456e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
457e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return false;
458e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
459e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
460e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)template <FloatingObject::Type FloatTypeValue>
461d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)LayoutUnit ComputeFloatOffsetForFloatLayoutAdapter<FloatTypeValue>::heightRemaining() const
462d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
463d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return this->m_outermostFloat ? this->m_renderer->logicalBottomForFloat(this->m_outermostFloat) - this->m_lineTop : LayoutUnit(1);
464d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
465d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
466d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)template <FloatingObject::Type FloatTypeValue>
467e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)inline void ComputeFloatOffsetAdapter<FloatTypeValue>::collectIfNeeded(const IntervalType& interval)
468e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
469e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    const FloatingObject* floatingObject = interval.data();
470e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (floatingObject->type() != FloatTypeValue || !rangesIntersect(interval.low(), interval.high(), m_lineTop, m_lineBottom))
471e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return;
472e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
473e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // Make sure the float hasn't changed since it was added to the placed floats tree.
474e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    ASSERT(floatingObject->isPlaced());
475f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT(interval.low() == m_renderer->pixelSnappedLogicalTopForFloat(floatingObject));
476f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT(interval.high() == m_renderer->pixelSnappedLogicalBottomForFloat(floatingObject));
477e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
4789e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    bool floatIsNewExtreme = updateOffsetIfNeeded(*floatingObject);
479e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (floatIsNewExtreme)
480e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        m_outermostFloat = floatingObject;
481e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
482e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
483d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)template<>
4849e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)inline bool ComputeFloatOffsetForLineLayoutAdapter<FloatingObject::FloatLeft>::updateOffsetIfNeeded(const FloatingObject& floatingObject)
485e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
4869e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    LayoutUnit logicalRight = m_renderer->logicalRightForFloat(&floatingObject);
4879e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (ShapeOutsideInfo* shapeOutside = floatingObject.renderer()->shapeOutsideInfo()) {
4889e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        ShapeOutsideDeltas shapeDeltas = shapeOutside->computeDeltasForContainingBlockLine(*m_renderer, floatingObject, m_lineTop, m_lineBottom - m_lineTop);
4899e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        if (!shapeDeltas.lineOverlapsShape())
490d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
491d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
4929e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        logicalRight += shapeDeltas.rightMarginBoxDelta();
493d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
494d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (logicalRight > m_offset) {
495d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_offset = logicalRight;
496d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return true;
497d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
498d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
499d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return false;
500d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
501d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
502d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)template<>
5039e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)inline bool ComputeFloatOffsetForLineLayoutAdapter<FloatingObject::FloatRight>::updateOffsetIfNeeded(const FloatingObject& floatingObject)
504d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
5059e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    LayoutUnit logicalLeft = m_renderer->logicalLeftForFloat(&floatingObject);
5069e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (ShapeOutsideInfo* shapeOutside = floatingObject.renderer()->shapeOutsideInfo()) {
5079e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        ShapeOutsideDeltas shapeDeltas = shapeOutside->computeDeltasForContainingBlockLine(*m_renderer, floatingObject, m_lineTop, m_lineBottom - m_lineTop);
5089e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        if (!shapeDeltas.lineOverlapsShape())
509d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return false;
510d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5119e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        logicalLeft += shapeDeltas.leftMarginBoxDelta();
512d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
513d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (logicalLeft < m_offset) {
514d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_offset = logicalLeft;
515d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return true;
516d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
517d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
518d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return false;
519e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
520e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
521e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#ifndef NDEBUG
522e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)// These helpers are only used by the PODIntervalTree for debugging purposes.
523e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)String ValueToString<int>::string(const int value)
524e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
525e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return String::number(value);
526e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
527e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
528e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)String ValueToString<FloatingObject*>::string(const FloatingObject* floatingObject)
529e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
530e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return String::format("%p (%dx%d %dx%d)", floatingObject, floatingObject->frameRect().pixelSnappedX(), floatingObject->frameRect().pixelSnappedY(), floatingObject->frameRect().pixelSnappedMaxX(), floatingObject->frameRect().pixelSnappedMaxY());
531e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
532e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#endif
533e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
534e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
535c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
536