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