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) 2353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/InlineFlowBox.h" 2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/PaintInfo.h" 2551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/rendering/RenderBlockFlow.h" 2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RootInlineBox.h" 271e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/Partitions.h" 28f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "platform/fonts/FontMetrics.h" 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <stdio.h> 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace std; 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 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; 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG 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) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG 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) 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::remove() 6202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (parent()) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) parent()->removeChild(this); 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){ 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_renderer) 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_renderer->showTreeForThis(); 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::showLineTreeForThis() const 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_renderer) 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_renderer->containingBlock()->showLineTreeAndMark(this, "*"); 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::showLineTreeAndMark(const InlineBox* markedBox1, const char* markedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const RenderObject* obj, int depth) const 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int printedCharacters = 0; 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this == markedBox1) 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printedCharacters += fprintf(stderr, "%s", markedLabel1); 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this == markedBox2) 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printedCharacters += fprintf(stderr, "%s", markedLabel2); 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (renderer() == obj) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printedCharacters += fprintf(stderr, "*"); 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (; printedCharacters < depth * 2; printedCharacters++) 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fputc(' ', stderr); 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) showBox(printedCharacters); 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::showBox(int printedCharacters) const 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) printedCharacters += fprintf(stderr, "%s\t%p", boxName(), this); 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (; printedCharacters < showTreeCharacterOffset; printedCharacters++) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fputc(' ', stderr); 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fprintf(stderr, "\t%s %p\n", renderer() ? renderer()->renderName() : "No Renderer", renderer()); 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float InlineBox::logicalHeight() const 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (hasVirtualLogicalHeight()) 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return virtualLogicalHeight(); 12302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (renderer()->isText()) 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_bitfields.isText() ? renderer()->style(isFirstLineStyle())->fontMetrics().height() : 0; 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (renderer()->isBox() && parent()) 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isHorizontal() ? toRenderBox(m_renderer)->height() : toRenderBox(m_renderer)->width(); 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(isInlineFlowBox()); 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderBoxModelObject* flowObject = boxModelObject(); 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const FontMetrics& fontMetrics = renderer()->style(isFirstLineStyle())->fontMetrics(); 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float result = fontMetrics.height(); 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (parent()) 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result += flowObject->borderAndPaddingLogicalHeight(); 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int InlineBox::baselinePosition(FontBaseline baselineType) const 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return boxModelObject()->baselinePosition(baselineType, m_bitfields.firstLine(), isHorizontal() ? HorizontalLine : VerticalLine, PositionOnContainingLine); 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutUnit InlineBox::lineHeight() const 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return boxModelObject()->lineHeight(m_bitfields.firstLine(), isHorizontal() ? HorizontalLine : VerticalLine, PositionOnContainingLine); 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochint InlineBox::caretMinOffset() const 14902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 15002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch return m_renderer->caretMinOffset(); 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochint InlineBox::caretMaxOffset() const 15402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 15502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch return m_renderer->caretMaxOffset(); 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::dirtyLineBoxes() 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) markDirty(); 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (InlineFlowBox* curr = parent(); curr && !curr->isDirty(); curr = curr->parent()) 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) curr->markDirty(); 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 165f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void InlineBox::deleteLine() 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_bitfields.extracted() && m_renderer->isBox()) 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) toRenderBox(m_renderer)->setInlineBoxWrapper(0); 169f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) destroy(); 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::extractLine() 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bitfields.setExtracted(true); 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_renderer->isBox()) 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) toRenderBox(m_renderer)->setInlineBoxWrapper(0); 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::attachLine() 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bitfields.setExtracted(false); 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_renderer->isBox()) 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) toRenderBox(m_renderer)->setInlineBoxWrapper(this); 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::adjustPosition(float dx, float dy) 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_topLeft.move(dx, dy); 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch if (m_renderer->isReplaced()) 19102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch toRenderBox(m_renderer)->move(dx, dy); 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset, LayoutUnit /* lineTop */, LayoutUnit /*lineBottom*/) 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!paintInfo.shouldPaintWithinRoot(renderer()) || (paintInfo.phase != PaintPhaseForeground && paintInfo.phase != PaintPhaseSelection)) 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutPoint childPoint = paintOffset; 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (parent()->renderer()->style()->isFlippedBlocksWritingMode()) // Faster than calling containingBlock(). 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) childPoint = renderer()->containingBlock()->flipForWritingModeForChild(toRenderBox(renderer()), childPoint); 20202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 2038abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) RenderBlock::paintAsInlineBlock(renderer(), paintInfo, childPoint); 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool InlineBox::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, LayoutUnit /* lineTop */, LayoutUnit /*lineBottom*/) 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Hit test all phases of replaced elements atomically, as though the replaced element established its 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // own stacking context. (See Appendix E.2, section 6.4 on inline block/table elements in the CSS2.1 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // specification.) 211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LayoutPoint childPoint = accumulatedOffset; 212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (parent()->renderer()->style()->isFlippedBlocksWritingMode()) // Faster than calling containingBlock(). 213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) childPoint = renderer()->containingBlock()->flipForWritingModeForChild(toRenderBox(renderer()), childPoint); 21402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return renderer()->hitTest(request, result, locationInContainer, childPoint); 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const RootInlineBox* InlineBox::root() const 21902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_parent) 22102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch return m_parent->root(); 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(isRootInlineBox()); 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return static_cast<const RootInlineBox*>(this); 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RootInlineBox* InlineBox::root() 22702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_parent) 22902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch return m_parent->root(); 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(isRootInlineBox()); 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return static_cast<RootInlineBox*>(this); 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool InlineBox::nextOnLineExists() const 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_bitfields.determinedIfNextOnLineExists()) { 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bitfields.setDeterminedIfNextOnLineExists(true); 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!parent()) 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bitfields.setNextOnLineExists(false); 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (nextOnLine()) 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bitfields.setNextOnLineExists(true); 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bitfields.setNextOnLineExists(parent()->nextOnLineExists()); 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_bitfields.nextOnLineExists(); 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InlineBox* InlineBox::nextLeafChild() const 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InlineBox* leaf = 0; 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (InlineBox* box = nextOnLine(); box && !leaf; box = box->nextOnLine()) 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) leaf = box->isLeaf() ? box : toInlineFlowBox(box)->firstLeafChild(); 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!leaf && parent()) 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) leaf = parent()->nextLeafChild(); 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return leaf; 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 25802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InlineBox* InlineBox::prevLeafChild() const 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InlineBox* leaf = 0; 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (InlineBox* box = prevOnLine(); box && !leaf; box = box->prevOnLine()) 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) leaf = box->isLeaf() ? box : toInlineFlowBox(box)->lastLeafChild(); 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!leaf && parent()) 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) leaf = parent()->prevLeafChild(); 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return leaf; 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InlineBox* InlineBox::nextLeafChildIgnoringLineBreak() const 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InlineBox* leaf = nextLeafChild(); 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (leaf && leaf->isLineBreak()) 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return leaf; 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InlineBox* InlineBox::prevLeafChildIgnoringLineBreak() const 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InlineBox* leaf = prevLeafChild(); 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (leaf && leaf->isLineBreak()) 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return leaf; 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderObject::SelectionState InlineBox::selectionState() 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return renderer()->selectionState(); 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool InlineBox::canAccommodateEllipsis(bool ltr, int blockEdge, int ellipsisWidth) const 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Non-replaced elements can always accommodate an ellipsis. 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_renderer || !m_renderer->isReplaced()) 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 29502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect boxRect(left(), 0, m_logicalWidth, 10); 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect ellipsisRect(ltr ? blockEdge - ellipsisWidth : blockEdge, 0, ellipsisWidth, 10); 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !(boxRect.intersects(ellipsisRect)); 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float InlineBox::placeEllipsisBox(bool, float, float, float, float& truncatedWidth, bool&) 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Use -1 to mean "we didn't set the position." 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) truncatedWidth += logicalWidth(); 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return -1; 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::clearKnownToHaveNoOverflow() 30902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_bitfields.setKnownToHaveNoOverflow(false); 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (parent() && parent()->knownToHaveNoOverflow()) 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) parent()->clearKnownToHaveNoOverflow(); 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FloatPoint InlineBox::locationIncludingFlipping() 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!renderer()->style()->isFlippedBlocksWritingMode()) 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return FloatPoint(x(), y()); 31951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) RenderBlockFlow* block = root()->block(); 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (block->style()->isHorizontalWritingMode()) 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return FloatPoint(x(), block->height() - height() - y()); 3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return FloatPoint(block->width() - width() - x(), y()); 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::flipForWritingMode(FloatRect& rect) 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!renderer()->style()->isFlippedBlocksWritingMode()) 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) root()->block()->flipForWritingMode(rect); 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FloatPoint InlineBox::flipForWritingMode(const FloatPoint& point) 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!renderer()->style()->isFlippedBlocksWritingMode()) 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return point; 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return root()->block()->flipForWritingMode(point); 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InlineBox::flipForWritingMode(LayoutRect& rect) 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!renderer()->style()->isFlippedBlocksWritingMode()) 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) root()->block()->flipForWritingMode(rect); 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutPoint InlineBox::flipForWritingMode(const LayoutPoint& point) 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!renderer()->style()->isFlippedBlocksWritingMode()) 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return point; 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return root()->block()->flipForWritingMode(point); 3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void showTree(const WebCore::InlineBox* b) 3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (b) 3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) b->showTreeForThis(); 3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void showLineTree(const WebCore::InlineBox* b) 3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (b) 3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) b->showLineTreeForThis(); 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 371