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"
2553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderOverflow.h"
2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/ShadowData.h"
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class HitTestRequest;
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class HitTestResult;
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class InlineTextBox;
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderLineBoxList;
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SimpleFontData;
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class VerticalPositionCache;
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct GlyphOverflow;
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef HashMap<const InlineTextBox*, pair<Vector<const SimpleFontData*>, GlyphOverflow> > GlyphOverflowAndFallbackFontsMap;
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class InlineFlowBox : public InlineBox {
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InlineFlowBox(RenderObject* obj)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : InlineBox(obj)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_firstChild(0)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_lastChild(0)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_prevLineBox(0)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_nextLineBox(0)
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_includeLogicalLeftEdge(false)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_includeLogicalRightEdge(false)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_descendantsHaveSameLineHeightAndBaseline(true)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_baselineType(AlphabeticBaseline)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_hasAnnotationsBefore(false)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_hasAnnotationsAfter(false)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_hasBadChildList(false)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (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
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (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
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (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
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (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
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // is an image, the line is still considered to be immune from the quirk.
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_hasTextChildren = obj->style()->display() == LIST_ITEM;
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_hasTextDescendants = m_hasTextChildren;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ~InlineFlowBox();
7002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void showLineTreeAndMark(const InlineBox* = 0, const char* = 0, const InlineBox* = 0, const char* = 0, const RenderObject* = 0, int = 0) const;
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual const char* boxName() const;
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InlineFlowBox* prevLineBox() const { return m_prevLineBox; }
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InlineFlowBox* nextLineBox() const { return m_nextLineBox; }
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setNextLineBox(InlineFlowBox* n) { m_nextLineBox = n; }
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setPreviousLineBox(InlineFlowBox* p) { m_prevLineBox = p; }
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InlineBox* firstChild() const { checkConsistency(); return m_firstChild; }
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InlineBox* lastChild() const { checkConsistency(); return m_lastChild; }
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    virtual bool isLeaf() const OVERRIDE FINAL { return false; }
8402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InlineBox* firstLeafChild() const;
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InlineBox* lastLeafChild() const;
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef void (*CustomInlineBoxRangeReverse)(void* userData, Vector<InlineBox*>::iterator first, Vector<InlineBox*>::iterator last);
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void collectLeafBoxesInLogicalOrder(Vector<InlineBox*>&, CustomInlineBoxRangeReverse customReverseImplementation = 0, void* userData = 0) const;
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    virtual void setConstructed() OVERRIDE FINAL
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        InlineBox::setConstructed();
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (InlineBox* child = firstChild(); child; child = child->nextOnLine())
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            child->setConstructed();
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void addToLine(InlineBox* child);
99f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    virtual void deleteLine() OVERRIDE FINAL;
10053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    virtual void extractLine() OVERRIDE FINAL;
10153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    virtual void attachLine() OVERRIDE FINAL;
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void adjustPosition(float dx, float dy);
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void extractLineBoxFromRenderObject();
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void attachLineBoxToRenderObject();
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void removeLineBoxFromRenderObject();
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void clearTruncation() OVERRIDE;
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect roundedFrameRect() const;
11102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
11253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    void paintBoxDecorations(PaintInfo&, const LayoutPoint&);
11353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    void paintMask(PaintInfo&, const LayoutPoint&);
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void paintFillLayers(const PaintInfo&, const Color&, const FillLayer*, const LayoutRect&, CompositeOperator = CompositeSourceOver);
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void paintFillLayer(const PaintInfo&, const Color&, const FillLayer*, const LayoutRect&, CompositeOperator = CompositeSourceOver);
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void paintBoxShadow(const PaintInfo&, RenderStyle*, ShadowStyle, const LayoutRect&);
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void paint(PaintInfo&, const LayoutPoint&, LayoutUnit lineTop, LayoutUnit lineBottom);
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, LayoutUnit lineTop, LayoutUnit lineBottom) OVERRIDE;
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool boxShadowCanBeAppliedToBackground(const FillLayer&) const;
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual RenderLineBoxList* rendererLineBoxes() const;
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // logicalLeft = left in a horizontal line and top in a vertical line.
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit marginBorderPaddingLogicalLeft() const { return marginLogicalLeft() + borderLogicalLeft() + paddingLogicalLeft(); }
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit marginBorderPaddingLogicalRight() const { return marginLogicalRight() + borderLogicalRight() + paddingLogicalRight(); }
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit marginLogicalLeft() const
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!includeLogicalLeftEdge())
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return isHorizontal() ? boxModelObject()->marginLeft() : boxModelObject()->marginTop();
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit marginLogicalRight() const
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!includeLogicalRightEdge())
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return isHorizontal() ? boxModelObject()->marginRight() : boxModelObject()->marginBottom();
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int borderLogicalLeft() const
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!includeLogicalLeftEdge())
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return isHorizontal() ? renderer()->style(isFirstLineStyle())->borderLeftWidth() : renderer()->style(isFirstLineStyle())->borderTopWidth();
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int borderLogicalRight() const
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!includeLogicalRightEdge())
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return isHorizontal() ? renderer()->style(isFirstLineStyle())->borderRightWidth() : renderer()->style(isFirstLineStyle())->borderBottomWidth();
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int paddingLogicalLeft() const
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!includeLogicalLeftEdge())
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return isHorizontal() ? boxModelObject()->paddingLeft() : boxModelObject()->paddingTop();
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int paddingLogicalRight() const
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!includeLogicalRightEdge())
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return isHorizontal() ? boxModelObject()->paddingRight() : boxModelObject()->paddingBottom();
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool includeLogicalLeftEdge() const { return m_includeLogicalLeftEdge; }
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool includeLogicalRightEdge() const { return m_includeLogicalRightEdge; }
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setEdges(bool includeLeft, bool includeRight)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_includeLogicalLeftEdge = includeLeft;
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_includeLogicalRightEdge = includeRight;
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Helper functions used during line construction and placement.
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void determineSpacingForFlowBoxes(bool lastLine, bool isLogicallyLastRunWrapped, RenderObject* logicallyLastRunRenderer);
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit getFlowSpacingLogicalWidth();
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float placeBoxesInInlineDirection(float logicalLeft, bool& needsWordSpacing, GlyphOverflowAndFallbackFontsMap&);
176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    float placeBoxRangeInInlineDirection(InlineBox* firstChild, InlineBox* lastChild, float& logicalLeft, float& minLogicalLeft, float& maxLogicalRight, bool& needsWordSpacing, GlyphOverflowAndFallbackFontsMap&);
177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void beginPlacingBoxRangesInInlineDirection(float logicalLeft) { setLogicalLeft(logicalLeft); }
178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void endPlacingBoxRangesInInlineDirection(float logicalLeft, float logicalRight, float minLogicalLeft, float maxLogicalRight)
179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setLogicalWidth(logicalRight - logicalLeft);
181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (knownToHaveNoOverflow() && (minLogicalLeft < logicalLeft || maxLogicalRight > logicalRight))
182926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            clearKnownToHaveNoOverflow();
183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
184926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void computeLogicalBoxHeights(RootInlineBox*, LayoutUnit& maxPositionTop, LayoutUnit& maxPositionBottom,
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                  int& maxAscent, int& maxDescent, bool& setMaxAscent, bool& setMaxDescent,
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                  bool strictMode, GlyphOverflowAndFallbackFontsMap&, FontBaseline, VerticalPositionCache&);
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void adjustMaxAscentAndDescent(int& maxAscent, int& maxDescent,
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                   int maxPositionTop, int maxPositionBottom);
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void placeBoxesInBlockDirection(LayoutUnit logicalTop, LayoutUnit maxHeight, int maxAscent, bool strictMode, LayoutUnit& lineTop, LayoutUnit& lineBottom, bool& setLineTop,
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                    LayoutUnit& lineTopIncludingMargins, LayoutUnit& lineBottomIncludingMargins, bool& hasAnnotationsBefore, bool& hasAnnotationsAfter, FontBaseline);
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void flipLinesInBlockDirection(LayoutUnit lineTop, LayoutUnit lineBottom);
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool requiresIdeographicBaseline(const GlyphOverflowAndFallbackFontsMap&) const;
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit computeOverAnnotationAdjustment(LayoutUnit allowedPosition) const;
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit computeUnderAnnotationAdjustment(LayoutUnit allowedPosition) const;
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void computeOverflow(LayoutUnit lineTop, LayoutUnit lineBottom, GlyphOverflowAndFallbackFontsMap&);
19902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void removeChild(InlineBox* child);
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual RenderObject::SelectionState selectionState();
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    virtual bool canAccommodateEllipsis(bool ltr, int blockEdge, int ellipsisWidth) const OVERRIDE FINAL;
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual float placeEllipsisBox(bool ltr, float blockLeftEdge, float blockRightEdge, float ellipsisWidth, float &truncatedWidth, bool&) OVERRIDE;
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasTextChildren() const { return m_hasTextChildren; }
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasTextDescendants() const { return m_hasTextDescendants; }
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setHasTextChildren() { m_hasTextChildren = true; setHasTextDescendants(); }
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setHasTextDescendants() { m_hasTextDescendants = true; }
21102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void checkConsistency() const;
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setHasBadChildList();
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Line visual and layout overflow are in the coordinate space of the block.  This means that they aren't purely physical directions.
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (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
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (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.
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect layoutOverflowRect(LayoutUnit lineTop, LayoutUnit lineBottom) const
21902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_overflow ? m_overflow->layoutOverflowRect() : enclosingLayoutRect(frameRectIncludingLineHeight(lineTop, lineBottom));
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit logicalLeftLayoutOverflow() const
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_overflow ? (isHorizontal() ? m_overflow->layoutOverflowRect().x() : m_overflow->layoutOverflowRect().y()) :
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            static_cast<LayoutUnit>(logicalLeft());
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit logicalRightLayoutOverflow() const
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_overflow ? (isHorizontal() ? m_overflow->layoutOverflowRect().maxX() : m_overflow->layoutOverflowRect().maxY()) :
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            static_cast<LayoutUnit>(ceilf(logicalRight()));
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit logicalTopLayoutOverflow(LayoutUnit lineTop) const
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_overflow)
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return isHorizontal() ? m_overflow->layoutOverflowRect().y() : m_overflow->layoutOverflowRect().x();
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return lineTop;
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit logicalBottomLayoutOverflow(LayoutUnit lineBottom) const
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_overflow)
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return isHorizontal() ? m_overflow->layoutOverflowRect().maxY() : m_overflow->layoutOverflowRect().maxX();
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return lineBottom;
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect logicalLayoutOverflowRect(LayoutUnit lineTop, LayoutUnit lineBottom) const
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutRect result = layoutOverflowRect(lineTop, lineBottom);
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!renderer()->isHorizontalWritingMode())
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result = result.transposedRect();
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return result;
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect visualOverflowRect(LayoutUnit lineTop, LayoutUnit lineBottom) const
25302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_overflow ? m_overflow->visualOverflowRect() : enclosingLayoutRect(frameRectIncludingLineHeight(lineTop, lineBottom));
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit logicalLeftVisualOverflow() const { return m_overflow ? (isHorizontal() ? m_overflow->visualOverflowRect().x() : m_overflow->visualOverflowRect().y()) : static_cast<LayoutUnit>(logicalLeft()); }
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit logicalRightVisualOverflow() const { return m_overflow ? (isHorizontal() ? m_overflow->visualOverflowRect().maxX() : m_overflow->visualOverflowRect().maxY()) : static_cast<LayoutUnit>(ceilf(logicalRight())); }
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit logicalTopVisualOverflow(LayoutUnit lineTop) const
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_overflow)
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return isHorizontal() ? m_overflow->visualOverflowRect().y() : m_overflow->visualOverflowRect().x();
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return lineTop;
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit logicalBottomVisualOverflow(LayoutUnit lineBottom) const
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_overflow)
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return isHorizontal() ? m_overflow->visualOverflowRect().maxY() : m_overflow->visualOverflowRect().maxX();
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return lineBottom;
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect logicalVisualOverflowRect(LayoutUnit lineTop, LayoutUnit lineBottom) const
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutRect result = visualOverflowRect(lineTop, lineBottom);
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!renderer()->isHorizontalWritingMode())
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result = result.transposedRect();
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return result;
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setOverflowFromLogicalRects(const LayoutRect& logicalLayoutOverflow, const LayoutRect& logicalVisualOverflow, LayoutUnit lineTop, LayoutUnit lineBottom);
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setLayoutOverflow(const LayoutRect&, LayoutUnit lineTop, LayoutUnit lineBottom);
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setVisualOverflow(const LayoutRect&, 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())
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return FloatRect(m_topLeft.x(), lineTop, width(), lineBottom - lineTop);
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return FloatRect(lineTop, m_topLeft.y(), lineBottom - lineTop, height());
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
28802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FloatRect logicalFrameRectIncludingLineHeight(LayoutUnit lineTop, LayoutUnit lineBottom) const
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return FloatRect(logicalLeft(), lineTop, logicalWidth(), lineBottom - lineTop);
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);
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void addTextBoxVisualOverflow(InlineTextBox*, GlyphOverflowAndFallbackFontsMap&, LayoutRect& logicalVisualOverflow);
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void addReplacedChildOverflow(const InlineBox*, LayoutRect& logicalLayoutOverflow, LayoutRect& logicalVisualOverflow);
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void constrainToLineTopAndBottomIfNeeded(LayoutRect&) const;
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    OwnPtr<RenderOverflow> m_overflow;
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    virtual bool isInlineFlowBox() const OVERRIDE FINAL { return true; }
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InlineBox* m_firstChild;
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InlineBox* m_lastChild;
31602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InlineFlowBox* m_prevLineBox; // The previous box that also uses our RenderObject
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InlineFlowBox* m_nextLineBox; // The next box that also uses our RenderObject
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
320926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#if ENABLE(CSS3_TEXT)
321926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Maximum logicalTop among all children of an InlineFlowBox. Used to
322926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // calculate the offset for TextUnderlinePositionUnder.
32393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void computeMaxLogicalTop(float& maxLogicalTop) const;
324926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif // CSS3_TEXT
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_includeLogicalLeftEdge : 1;
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_includeLogicalRightEdge : 1;
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_hasTextChildren : 1;
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_hasTextDescendants : 1;
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_descendantsHaveSameLineHeightAndBaseline : 1;
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The following members are only used by RootInlineBox but moved here to keep the bits packed.
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Whether or not this line uses alphabetic or ideographic baselines by default.
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_baselineType : 1; // FontBaseline
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the line contains any ruby runs, then this will be true.
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_hasAnnotationsBefore : 1;
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_hasAnnotationsAfter : 1;
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_lineBreakBidiStatusEor : 5; // WTF::Unicode::Direction
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_lineBreakBidiStatusLastStrong : 5; // WTF::Unicode::Direction
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_lineBreakBidiStatusLast : 5; // WTF::Unicode::Direction
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // End of RootInlineBox-specific members.
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_hasBadChildList : 1;
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline InlineFlowBox* toInlineFlowBox(InlineBox* object)
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
356926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_WITH_SECURITY_IMPLICATION(!object || object->isInlineFlowBox());
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<InlineFlowBox*>(object);
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline const InlineFlowBox* toInlineFlowBox(const InlineBox* object)
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
362926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_WITH_SECURITY_IMPLICATION(!object || object->isInlineFlowBox());
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<const InlineFlowBox*>(object);
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This will catch anyone doing an unnecessary cast.
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void toInlineFlowBox(const InlineFlowBox*);
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifdef NDEBUG
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void InlineFlowBox::checkConsistency() const
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void InlineFlowBox::setHasBadChildList()
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_hasBadChildList = true;
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Outside the WebCore namespace for ease of invocation from gdb.
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void showTree(const WebCore::InlineFlowBox*);
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // InlineFlowBox_h
390