15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2003, 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/InlineBox.h" 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/paint/BlockPainter.h" 2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/InlineFlowBox.h" 2553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/PaintInfo.h" 2651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/rendering/RenderBlockFlow.h" 27197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/rendering/RenderObjectInlines.h" 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RootInlineBox.h" 291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/Partitions.h" 30f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "platform/fonts/FontMetrics.h" 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <stdio.h> 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct SameSizeAsInlineBox { 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ~SameSizeAsInlineBox() { } 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void* a[4]; 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FloatPoint b; 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float c; 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uint32_t d : 32; 44197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool f; 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)COMPILE_ASSERT(sizeof(InlineBox) == sizeof(SameSizeAsInlineBox), InlineBox_size_guard); 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 51197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InlineBox::~InlineBox() 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_hasBadParent && m_parent) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_parent->setHasBadChildList(); 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 61f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid InlineBox::remove(MarkLineBoxes markLineBoxes) 6202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (parent()) 64f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu parent()->removeChild(this, markLineBoxes); 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 67f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void* InlineBox::operator new(size_t sz) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 69f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) return partitionAlloc(Partitions::getRenderingPartition(), sz); 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 72f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void InlineBox::operator delete(void* ptr) 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 74f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) partitionFree(ptr); 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const char* InlineBox::boxName() const 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return "InlineBox"; 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::showTreeForThis() const 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 85d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) renderer().showTreeForThis(); 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::showLineTreeForThis() const 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 90d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) renderer().containingBlock()->showLineTreeAndMark(this, "*"); 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::showLineTreeAndMark(const InlineBox* markedBox1, const char* markedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const RenderObject* obj, int depth) const 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int printedCharacters = 0; 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this == markedBox1) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printedCharacters += fprintf(stderr, "%s", markedLabel1); 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this == markedBox2) 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printedCharacters += fprintf(stderr, "%s", markedLabel2); 100d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (&renderer() == obj) 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printedCharacters += fprintf(stderr, "*"); 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (; printedCharacters < depth * 2; printedCharacters++) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fputc(' ', stderr); 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) showBox(printedCharacters); 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::showBox(int printedCharacters) const 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printedCharacters += fprintf(stderr, "%s\t%p", boxName(), this); 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (; printedCharacters < showTreeCharacterOffset; printedCharacters++) 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fputc(' ', stderr); 11307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch fprintf(stderr, "\t%s %p {pos=%g,%g size=%g,%g} baseline=%i/%i\n", 11407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch renderer().renderName(), &renderer(), x(), y(), width(), height(), 11507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch baselinePosition(AlphabeticBaseline), 11607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch baselinePosition(IdeographicBaseline)); 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float InlineBox::logicalHeight() const 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (hasVirtualLogicalHeight()) 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return virtualLogicalHeight(); 12402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 125d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (renderer().isText()) 126d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return m_bitfields.isText() ? renderer().style(isFirstLineStyle())->fontMetrics().height() : 0; 127d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (renderer().isBox() && parent()) 128d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return isHorizontal() ? toRenderBox(renderer()).height().toFloat() : toRenderBox(renderer()).width().toFloat(); 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(isInlineFlowBox()); 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderBoxModelObject* flowObject = boxModelObject(); 132d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const FontMetrics& fontMetrics = renderer().style(isFirstLineStyle())->fontMetrics(); 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float result = fontMetrics.height(); 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (parent()) 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result += flowObject->borderAndPaddingLogicalHeight(); 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int InlineBox::baselinePosition(FontBaseline baselineType) const 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return boxModelObject()->baselinePosition(baselineType, m_bitfields.firstLine(), isHorizontal() ? HorizontalLine : VerticalLine, PositionOnContainingLine); 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutUnit InlineBox::lineHeight() const 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return boxModelObject()->lineHeight(m_bitfields.firstLine(), isHorizontal() ? HorizontalLine : VerticalLine, PositionOnContainingLine); 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochint InlineBox::caretMinOffset() const 15002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 151d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return renderer().caretMinOffset(); 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochint InlineBox::caretMaxOffset() const 15502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 156d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return renderer().caretMaxOffset(); 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::dirtyLineBoxes() 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) markDirty(); 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (InlineFlowBox* curr = parent(); curr && !curr->isDirty(); curr = curr->parent()) 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) curr->markDirty(); 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 166f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void InlineBox::deleteLine() 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 168d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!m_bitfields.extracted() && renderer().isBox()) 169d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) toRenderBox(renderer()).setInlineBoxWrapper(0); 170f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) destroy(); 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::extractLine() 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bitfields.setExtracted(true); 176d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (renderer().isBox()) 177d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) toRenderBox(renderer()).setInlineBoxWrapper(0); 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::attachLine() 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bitfields.setExtracted(false); 183d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (renderer().isBox()) 184d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) toRenderBox(renderer()).setInlineBoxWrapper(this); 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::adjustPosition(float dx, float dy) 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_topLeft.move(dx, dy); 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 191d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (renderer().isReplaced()) 192d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) toRenderBox(renderer()).move(dx, dy); 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset, LayoutUnit /* lineTop */, LayoutUnit /*lineBottom*/) 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci BlockPainter::paintInlineBox(*this, paintInfo, paintOffset); 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool InlineBox::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, LayoutUnit /* lineTop */, LayoutUnit /*lineBottom*/) 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Hit test all phases of replaced elements atomically, as though the replaced element established its 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // own stacking context. (See Appendix E.2, section 6.4 on inline block/table elements in the CSS2.1 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // specification.) 205926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LayoutPoint childPoint = accumulatedOffset; 206d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (parent()->renderer().style()->isFlippedBlocksWritingMode()) // Faster than calling containingBlock(). 207d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) childPoint = renderer().containingBlock()->flipForWritingModeForChild(&toRenderBox(renderer()), childPoint); 20802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 209d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return renderer().hitTest(request, result, locationInContainer, childPoint); 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 212d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)const RootInlineBox& InlineBox::root() const 21302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_parent) 21502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch return m_parent->root(); 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(isRootInlineBox()); 217d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return static_cast<const RootInlineBox&>(*this); 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 220d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)RootInlineBox& InlineBox::root() 22102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_parent) 22302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch return m_parent->root(); 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(isRootInlineBox()); 225d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return static_cast<RootInlineBox&>(*this); 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool InlineBox::nextOnLineExists() const 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_bitfields.determinedIfNextOnLineExists()) { 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bitfields.setDeterminedIfNextOnLineExists(true); 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!parent()) 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bitfields.setNextOnLineExists(false); 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (nextOnLine()) 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bitfields.setNextOnLineExists(true); 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bitfields.setNextOnLineExists(parent()->nextOnLineExists()); 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_bitfields.nextOnLineExists(); 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InlineBox* InlineBox::nextLeafChild() const 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InlineBox* leaf = 0; 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (InlineBox* box = nextOnLine(); box && !leaf; box = box->nextOnLine()) 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) leaf = box->isLeaf() ? box : toInlineFlowBox(box)->firstLeafChild(); 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!leaf && parent()) 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) leaf = parent()->nextLeafChild(); 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return leaf; 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 25202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InlineBox* InlineBox::prevLeafChild() const 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InlineBox* leaf = 0; 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (InlineBox* box = prevOnLine(); box && !leaf; box = box->prevOnLine()) 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) leaf = box->isLeaf() ? box : toInlineFlowBox(box)->lastLeafChild(); 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!leaf && parent()) 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) leaf = parent()->prevLeafChild(); 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return leaf; 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InlineBox* InlineBox::nextLeafChildIgnoringLineBreak() const 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InlineBox* leaf = nextLeafChild(); 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (leaf && leaf->isLineBreak()) 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return leaf; 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InlineBox* InlineBox::prevLeafChildIgnoringLineBreak() const 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InlineBox* leaf = prevLeafChild(); 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (leaf && leaf->isLineBreak()) 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return leaf; 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciRenderObject::SelectionState InlineBox::selectionState() const 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 281d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return renderer().selectionState(); 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool InlineBox::canAccommodateEllipsis(bool ltr, int blockEdge, int ellipsisWidth) const 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Non-replaced elements can always accommodate an ellipsis. 287d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!renderer().isReplaced()) 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 28902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect boxRect(left(), 0, m_logicalWidth, 10); 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect ellipsisRect(ltr ? blockEdge - ellipsisWidth : blockEdge, 0, ellipsisWidth, 10); 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !(boxRect.intersects(ellipsisRect)); 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float InlineBox::placeEllipsisBox(bool, float, float, float, float& truncatedWidth, bool&) 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Use -1 to mean "we didn't set the position." 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) truncatedWidth += logicalWidth(); 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return -1; 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::clearKnownToHaveNoOverflow() 30302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bitfields.setKnownToHaveNoOverflow(false); 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (parent() && parent()->knownToHaveNoOverflow()) 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) parent()->clearKnownToHaveNoOverflow(); 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FloatPoint InlineBox::locationIncludingFlipping() 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 311d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!renderer().style()->isFlippedBlocksWritingMode()) 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return FloatPoint(x(), y()); 313d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) RenderBlockFlow& block = root().block(); 314d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (block.style()->isHorizontalWritingMode()) 315d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return FloatPoint(x(), block.height() - height() - y()); 316d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 317d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return FloatPoint(block.width() - width() - x(), y()); 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::flipForWritingMode(FloatRect& rect) 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 322d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!renderer().style()->isFlippedBlocksWritingMode()) 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 324d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) root().block().flipForWritingMode(rect); 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FloatPoint InlineBox::flipForWritingMode(const FloatPoint& point) 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 329d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!renderer().style()->isFlippedBlocksWritingMode()) 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return point; 331d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return root().block().flipForWritingMode(point); 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::flipForWritingMode(LayoutRect& rect) 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 336d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!renderer().style()->isFlippedBlocksWritingMode()) 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 338d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) root().block().flipForWritingMode(rect); 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutPoint InlineBox::flipForWritingMode(const LayoutPoint& point) 3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 343d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!renderer().style()->isFlippedBlocksWritingMode()) 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return point; 345d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return root().block().flipForWritingMode(point); 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 348c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 352c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void showTree(const blink::InlineBox* b) 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (b) 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) b->showTreeForThis(); 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 358c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void showLineTree(const blink::InlineBox* b) 3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (b) 3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) b->showLineTreeForThis(); 3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 365