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)
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef InlineFlowBox_h
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define InlineFlowBox_h
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/InlineBox.h"
25197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/rendering/RenderObjectInlines.h"
2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderOverflow.h"
2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/ShadowData.h"
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class HitTestRequest;
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class HitTestResult;
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class InlineTextBox;
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderLineBoxList;
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SimpleFontData;
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class VerticalPositionCache;
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct GlyphOverflow;
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef HashMap<const InlineTextBox*, pair<Vector<const SimpleFontData*>, GlyphOverflow> > GlyphOverflowAndFallbackFontsMap;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class InlineFlowBox : public InlineBox {
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
44d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    InlineFlowBox(RenderObject& obj)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : InlineBox(obj)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_firstChild(0)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_lastChild(0)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_prevLineBox(0)
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_nextLineBox(0)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_includeLogicalLeftEdge(false)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_includeLogicalRightEdge(false)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_descendantsHaveSameLineHeightAndBaseline(true)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_baselineType(AlphabeticBaseline)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_hasAnnotationsBefore(false)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_hasAnnotationsAfter(false)
56f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        , m_lineBreakBidiStatusEor(WTF::Unicode::LeftToRight)
57f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        , m_lineBreakBidiStatusLastStrong(WTF::Unicode::LeftToRight)
58f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        , m_lineBreakBidiStatusLast(WTF::Unicode::LeftToRight)
59197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_hasBadChildList(false)
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Internet Explorer and Firefox always create a marker for list items, even when the list-style-type is none.  We do not make a marker
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // in the list-style-type: none case, since it is wasteful to do so.  However, in order to match other browsers we have to pretend like
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // an invisible marker exists.  The side effect of having an invisible marker is that the quirks mode behavior of shrinking lines with no
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // text children must not apply.  This change also means that gaps will exist between image bullet list items.  Even when the list bullet
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // is an image, the line is still considered to be immune from the quirk.
68d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_hasTextChildren = obj.style()->display() == LIST_ITEM;
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_hasTextDescendants = m_hasTextChildren;
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
72197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ~InlineFlowBox();
74197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#endif
7502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
76197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#ifndef NDEBUG
7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void showLineTreeAndMark(const InlineBox* = 0, const char* = 0, const InlineBox* = 0, const char* = 0, const RenderObject* = 0, int = 0) const OVERRIDE;
7809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual const char* boxName() const OVERRIDE;
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InlineFlowBox* prevLineBox() const { return m_prevLineBox; }
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InlineFlowBox* nextLineBox() const { return m_nextLineBox; }
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setNextLineBox(InlineFlowBox* n) { m_nextLineBox = n; }
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setPreviousLineBox(InlineFlowBox* p) { m_prevLineBox = p; }
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InlineBox* firstChild() const { checkConsistency(); return m_firstChild; }
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InlineBox* lastChild() const { checkConsistency(); return m_lastChild; }
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    virtual bool isLeaf() const OVERRIDE FINAL { return false; }
9002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InlineBox* firstLeafChild() const;
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InlineBox* lastLeafChild() const;
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef void (*CustomInlineBoxRangeReverse)(void* userData, Vector<InlineBox*>::iterator first, Vector<InlineBox*>::iterator last);
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void collectLeafBoxesInLogicalOrder(Vector<InlineBox*>&, CustomInlineBoxRangeReverse customReverseImplementation = 0, void* userData = 0) const;
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    virtual void setConstructed() OVERRIDE FINAL
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        InlineBox::setConstructed();
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (InlineBox* child = firstChild(); child; child = child->nextOnLine())
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            child->setConstructed();
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void addToLine(InlineBox* child);
105f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    virtual void deleteLine() OVERRIDE FINAL;
10653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    virtual void extractLine() OVERRIDE FINAL;
10753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    virtual void attachLine() OVERRIDE FINAL;
10809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void adjustPosition(float dx, float dy) OVERRIDE;
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void extractLineBoxFromRenderObject();
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void attachLineBoxToRenderObject();
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void removeLineBoxFromRenderObject();
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void clearTruncation() OVERRIDE;
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect roundedFrameRect() const;
11702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
11809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void paint(PaintInfo&, const LayoutPoint&, LayoutUnit lineTop, LayoutUnit lineBottom) OVERRIDE;
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, LayoutUnit lineTop, LayoutUnit lineBottom) OVERRIDE;
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool boxShadowCanBeAppliedToBackground(const FillLayer&) const;
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual RenderLineBoxList* rendererLineBoxes() const;
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // logicalLeft = left in a horizontal line and top in a vertical line.
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit marginBorderPaddingLogicalLeft() const { return marginLogicalLeft() + borderLogicalLeft() + paddingLogicalLeft(); }
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit marginBorderPaddingLogicalRight() const { return marginLogicalRight() + borderLogicalRight() + paddingLogicalRight(); }
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit marginLogicalLeft() const
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!includeLogicalLeftEdge())
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return isHorizontal() ? boxModelObject()->marginLeft() : boxModelObject()->marginTop();
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit marginLogicalRight() const
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!includeLogicalRightEdge())
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return isHorizontal() ? boxModelObject()->marginRight() : boxModelObject()->marginBottom();
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int borderLogicalLeft() const
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!includeLogicalLeftEdge())
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
144d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return isHorizontal() ? renderer().style(isFirstLineStyle())->borderLeftWidth() : renderer().style(isFirstLineStyle())->borderTopWidth();
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int borderLogicalRight() const
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!includeLogicalRightEdge())
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
150d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return isHorizontal() ? renderer().style(isFirstLineStyle())->borderRightWidth() : renderer().style(isFirstLineStyle())->borderBottomWidth();
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int paddingLogicalLeft() const
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!includeLogicalLeftEdge())
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return isHorizontal() ? boxModelObject()->paddingLeft() : boxModelObject()->paddingTop();
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int paddingLogicalRight() const
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!includeLogicalRightEdge())
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return isHorizontal() ? boxModelObject()->paddingRight() : boxModelObject()->paddingBottom();
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool includeLogicalLeftEdge() const { return m_includeLogicalLeftEdge; }
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool includeLogicalRightEdge() const { return m_includeLogicalRightEdge; }
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setEdges(bool includeLeft, bool includeRight)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_includeLogicalLeftEdge = includeLeft;
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_includeLogicalRightEdge = includeRight;
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Helper functions used during line construction and placement.
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void determineSpacingForFlowBoxes(bool lastLine, bool isLogicallyLastRunWrapped, RenderObject* logicallyLastRunRenderer);
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit getFlowSpacingLogicalWidth();
176c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    float placeBoxesInInlineDirection(float logicalLeft, bool& needsWordSpacing);
177c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    float placeBoxRangeInInlineDirection(InlineBox* firstChild, InlineBox* lastChild,
178c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        float& logicalLeft, float& minLogicalLeft, float& maxLogicalRight, bool& needsWordSpacing);
179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void beginPlacingBoxRangesInInlineDirection(float logicalLeft) { setLogicalLeft(logicalLeft); }
180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void endPlacingBoxRangesInInlineDirection(float logicalLeft, float logicalRight, float minLogicalLeft, float maxLogicalRight)
181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
182926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setLogicalWidth(logicalRight - logicalLeft);
183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (knownToHaveNoOverflow() && (minLogicalLeft < logicalLeft || maxLogicalRight > logicalRight))
184926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            clearKnownToHaveNoOverflow();
185926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
186926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void computeLogicalBoxHeights(RootInlineBox*, LayoutUnit& maxPositionTop, LayoutUnit& maxPositionBottom,
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                  int& maxAscent, int& maxDescent, bool& setMaxAscent, bool& setMaxDescent,
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                  bool strictMode, GlyphOverflowAndFallbackFontsMap&, FontBaseline, VerticalPositionCache&);
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void adjustMaxAscentAndDescent(int& maxAscent, int& maxDescent,
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                   int maxPositionTop, int maxPositionBottom);
192197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    void placeBoxesInBlockDirection(LayoutUnit logicalTop, LayoutUnit maxHeight, int maxAscent, bool strictMode, LayoutUnit& lineTop, LayoutUnit& lineBottom, LayoutUnit& selectionBottom, bool& setLineTop,
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                    LayoutUnit& lineTopIncludingMargins, LayoutUnit& lineBottomIncludingMargins, bool& hasAnnotationsBefore, bool& hasAnnotationsAfter, FontBaseline);
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void flipLinesInBlockDirection(LayoutUnit lineTop, LayoutUnit lineBottom);
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool requiresIdeographicBaseline(const GlyphOverflowAndFallbackFontsMap&) const;
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit computeOverAnnotationAdjustment(LayoutUnit allowedPosition) const;
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit computeUnderAnnotationAdjustment(LayoutUnit allowedPosition) const;
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void computeOverflow(LayoutUnit lineTop, LayoutUnit lineBottom, GlyphOverflowAndFallbackFontsMap&);
20102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
202f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    void removeChild(InlineBox* child, MarkLineBoxes);
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual RenderObject::SelectionState selectionState() const OVERRIDE;
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    virtual bool canAccommodateEllipsis(bool ltr, int blockEdge, int ellipsisWidth) const OVERRIDE FINAL;
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual float placeEllipsisBox(bool ltr, float blockLeftEdge, float blockRightEdge, float ellipsisWidth, float &truncatedWidth, bool&) OVERRIDE;
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasTextChildren() const { return m_hasTextChildren; }
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasTextDescendants() const { return m_hasTextDescendants; }
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setHasTextChildren() { m_hasTextChildren = true; setHasTextDescendants(); }
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setHasTextDescendants() { m_hasTextDescendants = true; }
21302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void checkConsistency() const;
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setHasBadChildList();
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Line visual and layout overflow are in the coordinate space of the block.  This means that they aren't purely physical directions.
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For horizontal-tb and vertical-lr they will match physical directions, but for horizontal-bt and vertical-rl, the top/bottom and left/right
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // respectively are flipped when compared to their physical counterparts.  For example minX is on the left in vertical-lr, but it is on the right in vertical-rl.
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect layoutOverflowRect(LayoutUnit lineTop, LayoutUnit lineBottom) const
22102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_overflow ? m_overflow->layoutOverflowRect() : enclosingLayoutRect(frameRectIncludingLineHeight(lineTop, lineBottom));
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit logicalLeftLayoutOverflow() const
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_overflow ? (isHorizontal() ? m_overflow->layoutOverflowRect().x() : m_overflow->layoutOverflowRect().y()) :
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            static_cast<LayoutUnit>(logicalLeft());
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit logicalRightLayoutOverflow() const
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_overflow ? (isHorizontal() ? m_overflow->layoutOverflowRect().maxX() : m_overflow->layoutOverflowRect().maxY()) :
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            static_cast<LayoutUnit>(ceilf(logicalRight()));
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit logicalTopLayoutOverflow(LayoutUnit lineTop) const
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_overflow)
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return isHorizontal() ? m_overflow->layoutOverflowRect().y() : m_overflow->layoutOverflowRect().x();
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return lineTop;
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit logicalBottomLayoutOverflow(LayoutUnit lineBottom) const
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_overflow)
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return isHorizontal() ? m_overflow->layoutOverflowRect().maxY() : m_overflow->layoutOverflowRect().maxX();
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return lineBottom;
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect logicalLayoutOverflowRect(LayoutUnit lineTop, LayoutUnit lineBottom) const
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutRect result = layoutOverflowRect(lineTop, lineBottom);
249d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!renderer().isHorizontalWritingMode())
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result = result.transposedRect();
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return result;
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect visualOverflowRect(LayoutUnit lineTop, LayoutUnit lineBottom) const
25502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_overflow ? m_overflow->visualOverflowRect() : enclosingLayoutRect(frameRectIncludingLineHeight(lineTop, lineBottom));
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit logicalLeftVisualOverflow() const { return m_overflow ? (isHorizontal() ? m_overflow->visualOverflowRect().x() : m_overflow->visualOverflowRect().y()) : static_cast<LayoutUnit>(logicalLeft()); }
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit logicalRightVisualOverflow() const { return m_overflow ? (isHorizontal() ? m_overflow->visualOverflowRect().maxX() : m_overflow->visualOverflowRect().maxY()) : static_cast<LayoutUnit>(ceilf(logicalRight())); }
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit logicalTopVisualOverflow(LayoutUnit lineTop) const
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_overflow)
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return isHorizontal() ? m_overflow->visualOverflowRect().y() : m_overflow->visualOverflowRect().x();
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return lineTop;
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit logicalBottomVisualOverflow(LayoutUnit lineBottom) const
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_overflow)
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return isHorizontal() ? m_overflow->visualOverflowRect().maxY() : m_overflow->visualOverflowRect().maxX();
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return lineBottom;
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect logicalVisualOverflowRect(LayoutUnit lineTop, LayoutUnit lineBottom) const
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutRect result = visualOverflowRect(lineTop, lineBottom);
275d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!renderer().isHorizontalWritingMode())
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result = result.transposedRect();
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return result;
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setOverflowFromLogicalRects(const LayoutRect& logicalLayoutOverflow, const LayoutRect& logicalVisualOverflow, LayoutUnit lineTop, LayoutUnit lineBottom);
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FloatRect frameRectIncludingLineHeight(LayoutUnit lineTop, LayoutUnit lineBottom) const
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isHorizontal())
285d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return FloatRect(m_topLeft.x(), lineTop.toFloat(), width(), (lineBottom - lineTop).toFloat());
286d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return FloatRect(lineTop.toFloat(), m_topLeft.y(), (lineBottom - lineTop).toFloat(), height());
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
28802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FloatRect logicalFrameRectIncludingLineHeight(LayoutUnit lineTop, LayoutUnit lineBottom) const
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
291d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return FloatRect(logicalLeft(), lineTop.toFloat(), logicalWidth(), (lineBottom - lineTop).toFloat());
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
29302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool descendantsHaveSameLineHeightAndBaseline() const { return m_descendantsHaveSameLineHeightAndBaseline; }
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clearDescendantsHaveSameLineHeightAndBaseline()
29602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_descendantsHaveSameLineHeightAndBaseline = false;
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (parent() && parent()->descendantsHaveSameLineHeightAndBaseline())
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            parent()->clearDescendantsHaveSameLineHeightAndBaseline();
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void addBoxShadowVisualOverflow(LayoutRect& logicalVisualOverflow);
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void addBorderOutsetVisualOverflow(LayoutRect& logicalVisualOverflow);
30507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void addOutlineVisualOverflow(LayoutRect& logicalVisualOverflow);
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void addTextBoxVisualOverflow(InlineTextBox*, GlyphOverflowAndFallbackFontsMap&, LayoutRect& logicalVisualOverflow);
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void addReplacedChildOverflow(const InlineBox*, LayoutRect& logicalLayoutOverflow, LayoutRect& logicalVisualOverflow);
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void constrainToLineTopAndBottomIfNeeded(LayoutRect&) const;
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
310d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setLayoutOverflow(const LayoutRect&, const LayoutRect&);
311d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setVisualOverflow(const LayoutRect&, const LayoutRect&);
312d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    OwnPtr<RenderOverflow> m_overflow;
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    virtual bool isInlineFlowBox() const OVERRIDE FINAL { return true; }
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InlineBox* m_firstChild;
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InlineBox* m_lastChild;
32002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InlineFlowBox* m_prevLineBox; // The previous box that also uses our RenderObject
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InlineFlowBox* m_nextLineBox; // The next box that also uses our RenderObject
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
324926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Maximum logicalTop among all children of an InlineFlowBox. Used to
325926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // calculate the offset for TextUnderlinePositionUnder.
32693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void computeMaxLogicalTop(float& maxLogicalTop) const;
32719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_includeLogicalLeftEdge : 1;
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_includeLogicalRightEdge : 1;
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_hasTextChildren : 1;
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_hasTextDescendants : 1;
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_descendantsHaveSameLineHeightAndBaseline : 1;
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The following members are only used by RootInlineBox but moved here to keep the bits packed.
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Whether or not this line uses alphabetic or ideographic baselines by default.
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_baselineType : 1; // FontBaseline
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the line contains any ruby runs, then this will be true.
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_hasAnnotationsBefore : 1;
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_hasAnnotationsAfter : 1;
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_lineBreakBidiStatusEor : 5; // WTF::Unicode::Direction
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_lineBreakBidiStatusLastStrong : 5; // WTF::Unicode::Direction
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_lineBreakBidiStatusLast : 5; // WTF::Unicode::Direction
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // End of RootInlineBox-specific members.
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
351197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_hasBadChildList : 1;
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
357a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)DEFINE_INLINE_BOX_TYPE_CASTS(InlineFlowBox);
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
359197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if !ENABLE(ASSERT)
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void InlineFlowBox::checkConsistency() const
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void InlineFlowBox::setHasBadChildList()
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
367197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_hasBadChildList = true;
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
372c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Outside the WebCore namespace for ease of invocation from gdb.
376c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void showTree(const blink::InlineFlowBox*);
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // InlineFlowBox_h
380