109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)/*
209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All right reserved.
409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved.
509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) *
609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * This library is free software; you can redistribute it and/or
709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * License as published by the Free Software Foundation; either
909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
1009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) *
1109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
1209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
1309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * Library General Public License for more details.
1509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) *
1609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
1709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
1809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
1909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * Boston, MA 02110-1301, USA.
2009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) *
2109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */
2209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
2309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "config.h"
2409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/rendering/line/LineBreaker.h"
2509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
2609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/rendering/line/BreakingContextInlineHeaders.h"
2709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
28c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
2909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
3009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void LineBreaker::skipLeadingWhitespace(InlineBidiResolver& resolver, LineInfo& lineInfo,
3109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    FloatingObject* lastFloatFromPreviousLine, LineWidth& width)
3209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
3309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    while (!resolver.position().atEnd() && !requiresLineBox(resolver.position(), lineInfo, LeadingWhitespace)) {
3409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        RenderObject* object = resolver.position().object();
3509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (object->isOutOfFlowPositioned()) {
3609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            setStaticPositions(m_block, toRenderBox(object));
3709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            if (object->style()->isOriginalDisplayInlineType()) {
3809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                resolver.runs().addRun(createRun(0, 1, object, resolver));
3909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                lineInfo.incrementRunsFromLeadingWhitespace();
4009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            }
4109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        } else if (object->isFloating()) {
4209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            m_block->positionNewFloatOnLine(m_block->insertFloatingObject(toRenderBox(object)), lastFloatFromPreviousLine, lineInfo, width);
4309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        } else if (object->isText() && object->style()->hasTextCombine() && object->isCombineText() && !toRenderCombineText(object)->isCombined()) {
4409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            toRenderCombineText(object)->combineText();
4509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            if (toRenderCombineText(object)->isCombined())
4609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                continue;
4709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        }
4809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        resolver.position().increment(&resolver);
4909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
50c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    resolver.commitExplicitEmbedding(resolver.runs());
5109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
5309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void LineBreaker::reset()
5409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
5509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_positionedObjects.clear();
5609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_hyphenated = false;
5709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_clear = CNONE;
5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
5909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
60c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)InlineIterator LineBreaker::nextLineBreak(InlineBidiResolver& resolver, LineInfo& lineInfo,
61c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RenderTextInfo& renderTextInfo, FloatingObject* lastFloatFromPreviousLine,
62c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    WordMeasurements& wordMeasurements)
6309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
6409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    reset();
6509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
6609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT(resolver.position().root() == m_block);
6709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
6809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    bool appliedStartWidth = resolver.position().offset() > 0;
6909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
7009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    LineWidth width(*m_block, lineInfo.isFirstLine(), requiresIndent(lineInfo.isFirstLine(), lineInfo.previousLineBrokeCleanly(), m_block->style()));
7109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
7209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    skipLeadingWhitespace(resolver, lineInfo, lastFloatFromPreviousLine, width);
7309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
7409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (resolver.position().atEnd())
7509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return resolver.position();
7609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    BreakingContext context(resolver, lineInfo, width, renderTextInfo, lastFloatFromPreviousLine, appliedStartWidth, m_block);
7809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
7909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    while (context.currentObject()) {
8009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        context.initializeForCurrentObject();
8109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (context.currentObject()->isBR()) {
8209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            context.handleBR(m_clear);
8309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        } else if (context.currentObject()->isOutOfFlowPositioned()) {
8409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            context.handleOutOfFlowPositioned(m_positionedObjects);
8509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        } else if (context.currentObject()->isFloating()) {
8609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            context.handleFloat();
8709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        } else if (context.currentObject()->isRenderInline()) {
8809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            context.handleEmptyInline();
8909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        } else if (context.currentObject()->isReplaced()) {
9009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            context.handleReplaced();
9109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        } else if (context.currentObject()->isText()) {
9209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            if (context.handleText(wordMeasurements, m_hyphenated)) {
9309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                // We've hit a hard text line break. Our line break iterator is updated, so go ahead and early return.
9409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                return context.lineBreak();
9509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            }
9609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        } else {
9709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            ASSERT_NOT_REACHED();
9809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        }
9909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
10009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (context.atEnd())
10109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return context.handleEndOfLine();
10209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
10309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        context.commitAndUpdateLineBreakIfNeeded();
10409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
10509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (context.atEnd())
10609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return context.handleEndOfLine();
10709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
10809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        context.increment();
10909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
11009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
11109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    context.clearLineBreakIfFitsOnLine();
11209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
11309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return context.handleEndOfLine();
11409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
11509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
11609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
117