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