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