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