| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) |
| 3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ight reserved. | 3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ight reserved. |
| 4 * Copyright (C) 2010 Google Inc. All rights reserved. | 4 * Copyright (C) 2010 Google Inc. All rights reserved. |
| 5 * Copyright (C) 2013 Adobe Systems Incorporated. | 5 * Copyright (C) 2013 Adobe Systems Incorporated. |
| 6 * | 6 * |
| 7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
| 9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
| 10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 | 23 |
| 24 #ifndef BreakingContextInlineHeaders_h | 24 #ifndef BreakingContextInlineHeaders_h |
| 25 #define BreakingContextInlineHeaders_h | 25 #define BreakingContextInlineHeaders_h |
| 26 | 26 |
| 27 #include "core/layout/LayoutInline.h" | 27 #include "core/layout/LayoutInline.h" |
| 28 #include "core/layout/LayoutListMarker.h" | 28 #include "core/layout/LayoutListMarker.h" |
| 29 #include "core/layout/LayoutObject.h" | 29 #include "core/layout/LayoutObject.h" |
| 30 #include "core/layout/LayoutRubyRun.h" | 30 #include "core/layout/LayoutRubyRun.h" |
| 31 #include "core/layout/LayoutTextCombine.h" | 31 #include "core/layout/LayoutTextCombine.h" |
| 32 #include "core/layout/TextRunConstructor.h" | 32 #include "core/layout/TextRunConstructor.h" |
| 33 #include "core/layout/api/LineLayoutBox.h" |
| 33 #include "core/layout/line/InlineIterator.h" | 34 #include "core/layout/line/InlineIterator.h" |
| 34 #include "core/layout/line/InlineTextBox.h" | 35 #include "core/layout/line/InlineTextBox.h" |
| 35 #include "core/layout/line/LayoutTextInfo.h" | 36 #include "core/layout/line/LayoutTextInfo.h" |
| 36 #include "core/layout/line/LineBreaker.h" | 37 #include "core/layout/line/LineBreaker.h" |
| 37 #include "core/layout/line/LineInfo.h" | 38 #include "core/layout/line/LineInfo.h" |
| 38 #include "core/layout/line/LineWidth.h" | 39 #include "core/layout/line/LineWidth.h" |
| 39 #include "core/layout/line/TrailingObjects.h" | 40 #include "core/layout/line/TrailingObjects.h" |
| 40 #include "core/layout/line/WordMeasurement.h" | 41 #include "core/layout/line/WordMeasurement.h" |
| 41 #include "core/layout/svg/LayoutSVGInlineText.h" | 42 #include "core/layout/svg/LayoutSVGInlineText.h" |
| 42 #include "core/paint/DeprecatedPaintLayer.h" | 43 #include "core/paint/DeprecatedPaintLayer.h" |
| 43 #include "platform/text/TextBreakIterator.h" | 44 #include "platform/text/TextBreakIterator.h" |
| 44 | 45 |
| 45 namespace blink { | 46 namespace blink { |
| 46 | 47 |
| 47 // We don't let our line box tree for a single line get any deeper than this. | 48 // We don't let our line box tree for a single line get any deeper than this. |
| 48 const unsigned cMaxLineDepth = 200; | 49 const unsigned cMaxLineDepth = 200; |
| 49 | 50 |
| 50 class BreakingContext { | 51 class BreakingContext { |
| 51 public: | 52 public: |
| 52 BreakingContext(InlineBidiResolver& resolver, LineInfo& inLineInfo, LineWidt
h& lineWidth, LayoutTextInfo& inLayoutTextInfo, FloatingObject* inLastFloatFromP
reviousLine, bool appliedStartWidth, LayoutBlockFlow* block) | 53 BreakingContext(InlineBidiResolver& resolver, LineInfo& inLineInfo, LineWidt
h& lineWidth, LayoutTextInfo& inLayoutTextInfo, FloatingObject* inLastFloatFromP
reviousLine, bool appliedStartWidth, LineLayoutBlockFlow block) |
| 53 : m_resolver(resolver) | 54 : m_resolver(resolver) |
| 54 , m_current(resolver.position()) | 55 , m_current(resolver.position()) |
| 55 , m_lineBreak(resolver.position()) | 56 , m_lineBreak(resolver.position()) |
| 56 , m_block(block) | 57 , m_block(block) |
| 57 , m_lastObject(m_current.object()) | 58 , m_lastObject(m_current.object()) |
| 58 , m_nextObject(0) | 59 , m_nextObject(0) |
| 59 , m_currentStyle(0) | 60 , m_currentStyle(0) |
| 60 , m_blockStyle(block->style()) | 61 , m_blockStyle(block->style()) |
| 61 , m_lineInfo(inLineInfo) | 62 , m_lineInfo(inLineInfo) |
| 62 , m_layoutTextInfo(inLayoutTextInfo) | 63 , m_layoutTextInfo(inLayoutTextInfo) |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 108 | 109 |
| 109 private: | 110 private: |
| 110 void skipTrailingWhitespace(InlineIterator&, const LineInfo&); | 111 void skipTrailingWhitespace(InlineIterator&, const LineInfo&); |
| 111 | 112 |
| 112 InlineBidiResolver& m_resolver; | 113 InlineBidiResolver& m_resolver; |
| 113 | 114 |
| 114 InlineIterator m_current; | 115 InlineIterator m_current; |
| 115 InlineIterator m_lineBreak; | 116 InlineIterator m_lineBreak; |
| 116 InlineIterator m_startOfIgnoredSpaces; | 117 InlineIterator m_startOfIgnoredSpaces; |
| 117 | 118 |
| 118 LayoutBlockFlow* m_block; | 119 LineLayoutBlockFlow m_block; |
| 119 LayoutObject* m_lastObject; | 120 LayoutObject* m_lastObject; |
| 120 LayoutObject* m_nextObject; | 121 LayoutObject* m_nextObject; |
| 121 | 122 |
| 122 const ComputedStyle* m_currentStyle; | 123 const ComputedStyle* m_currentStyle; |
| 123 const ComputedStyle* m_blockStyle; | 124 const ComputedStyle* m_blockStyle; |
| 124 | 125 |
| 125 LineInfo& m_lineInfo; | 126 LineInfo& m_lineInfo; |
| 126 | 127 |
| 127 LayoutTextInfo& m_layoutTextInfo; | 128 LayoutTextInfo& m_layoutTextInfo; |
| 128 | 129 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 return false; | 192 return false; |
| 192 | 193 |
| 193 if (!shouldCollapseWhiteSpace(it.object()->styleRef(), lineInfo, whitespaceP
osition) || it.object()->isBR()) | 194 if (!shouldCollapseWhiteSpace(it.object()->styleRef(), lineInfo, whitespaceP
osition) || it.object()->isBR()) |
| 194 return true; | 195 return true; |
| 195 | 196 |
| 196 UChar current = it.current(); | 197 UChar current = it.current(); |
| 197 bool notJustWhitespace = current != spaceCharacter && current != tabulationC
haracter && current != softHyphenCharacter && (current != newlineCharacter || it
.object()->preservesNewline()); | 198 bool notJustWhitespace = current != spaceCharacter && current != tabulationC
haracter && current != softHyphenCharacter && (current != newlineCharacter || it
.object()->preservesNewline()); |
| 198 return notJustWhitespace || isEmptyInline(it.object()); | 199 return notJustWhitespace || isEmptyInline(it.object()); |
| 199 } | 200 } |
| 200 | 201 |
| 201 inline void setStaticPositions(LayoutBlockFlow* block, LayoutBox* child) | 202 inline void setStaticPositions(LineLayoutBlockFlow block, LayoutBox* child) |
| 202 { | 203 { |
| 203 ASSERT(child->isOutOfFlowPositioned()); | 204 ASSERT(child->isOutOfFlowPositioned()); |
| 204 // FIXME: The math here is actually not really right. It's a best-guess appr
oximation that | 205 // FIXME: The math here is actually not really right. It's a best-guess appr
oximation that |
| 205 // will work for the common cases | 206 // will work for the common cases |
| 206 LayoutObject* containerBlock = child->container(); | 207 LayoutObject* containerBlock = child->container(); |
| 207 LayoutUnit blockHeight = block->logicalHeight(); | 208 LayoutUnit blockHeight = block.logicalHeight(); |
| 208 if (containerBlock->isLayoutInline()) { | 209 if (containerBlock->isLayoutInline()) { |
| 209 // A relative positioned inline encloses us. In this case, we also have
to determine our | 210 // A relative positioned inline encloses us. In this case, we also have
to determine our |
| 210 // position as though we were an inline. Set |staticInlinePosition| and
|staticBlockPosition| on the relative positioned | 211 // position as though we were an inline. Set |staticInlinePosition| and
|staticBlockPosition| on the relative positioned |
| 211 // inline so that we can obtain the value later. | 212 // inline so that we can obtain the value later. |
| 212 toLayoutInline(containerBlock)->layer()->setStaticInlinePosition(block->
startAlignedOffsetForLine(blockHeight, false)); | 213 toLayoutInline(containerBlock)->layer()->setStaticInlinePosition(block.s
tartAlignedOffsetForLine(blockHeight, false)); |
| 213 toLayoutInline(containerBlock)->layer()->setStaticBlockPosition(blockHei
ght); | 214 toLayoutInline(containerBlock)->layer()->setStaticBlockPosition(blockHei
ght); |
| 214 | 215 |
| 215 // If |child| is a leading or trailing positioned object this is its onl
y opportunity to ensure it moves with an inline | 216 // If |child| is a leading or trailing positioned object this is its onl
y opportunity to ensure it moves with an inline |
| 216 // container changing width. | 217 // container changing width. |
| 217 child->moveWithEdgeOfInlineContainerIfNecessary(child->isHorizontalWriti
ngMode()); | 218 child->moveWithEdgeOfInlineContainerIfNecessary(child->isHorizontalWriti
ngMode()); |
| 218 } | 219 } |
| 219 block->updateStaticInlinePositionForChild(*child, blockHeight); | 220 block.updateStaticInlinePositionForChild(*child, blockHeight); |
| 220 child->layer()->setStaticBlockPosition(blockHeight); | 221 child->layer()->setStaticBlockPosition(blockHeight); |
| 221 } | 222 } |
| 222 | 223 |
| 223 // FIXME: The entire concept of the skipTrailingWhitespace function is flawed, s
ince we really need to be building | 224 // FIXME: The entire concept of the skipTrailingWhitespace function is flawed, s
ince we really need to be building |
| 224 // line boxes even for containers that may ultimately collapse away. Otherwise w
e'll never get positioned | 225 // line boxes even for containers that may ultimately collapse away. Otherwise w
e'll never get positioned |
| 225 // elements quite right. In other words, we need to build this function's work i
nto the normal line | 226 // elements quite right. In other words, we need to build this function's work i
nto the normal line |
| 226 // object iteration process. | 227 // object iteration process. |
| 227 // NB. this function will insert any floating elements that would otherwise | 228 // NB. this function will insert any floating elements that would otherwise |
| 228 // be skipped but it will not position them. | 229 // be skipped but it will not position them. |
| 229 inline void BreakingContext::skipTrailingWhitespace(InlineIterator& iterator, co
nst LineInfo& lineInfo) | 230 inline void BreakingContext::skipTrailingWhitespace(InlineIterator& iterator, co
nst LineInfo& lineInfo) |
| 230 { | 231 { |
| 231 while (!iterator.atEnd() && !requiresLineBox(iterator, lineInfo, TrailingWhi
tespace)) { | 232 while (!iterator.atEnd() && !requiresLineBox(iterator, lineInfo, TrailingWhi
tespace)) { |
| 232 LayoutObject* object = iterator.object(); | 233 LayoutObject* object = iterator.object(); |
| 233 if (object->isOutOfFlowPositioned()) | 234 if (object->isOutOfFlowPositioned()) |
| 234 setStaticPositions(m_block, toLayoutBox(object)); | 235 setStaticPositions(m_block, toLayoutBox(object)); |
| 235 else if (object->isFloating()) | 236 else if (object->isFloating()) |
| 236 m_block->insertFloatingObject(*toLayoutBox(object)); | 237 m_block.insertFloatingObject(*toLayoutBox(object)); |
| 237 iterator.increment(); | 238 iterator.increment(); |
| 238 } | 239 } |
| 239 } | 240 } |
| 240 | 241 |
| 241 inline void BreakingContext::initializeForCurrentObject() | 242 inline void BreakingContext::initializeForCurrentObject() |
| 242 { | 243 { |
| 243 m_currentStyle = m_current.object()->style(); | 244 m_currentStyle = m_current.object()->style(); |
| 244 m_nextObject = bidiNextSkippingEmptyInlines(m_block, m_current.object()); | 245 m_nextObject = bidiNextSkippingEmptyInlines(m_block, m_current.object()); |
| 245 if (m_nextObject && m_nextObject->parent() && !m_nextObject->parent()->isDes
cendantOf(m_current.object()->parent())) | 246 if (m_nextObject && m_nextObject->parent() && !m_nextObject->parent()->isDes
cendantOf(m_current.object()->parent())) |
| 246 m_includeEndWidth = true; | 247 m_includeEndWidth = true; |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 336 return extraWidth; | 337 return extraWidth; |
| 337 } | 338 } |
| 338 | 339 |
| 339 inline void BreakingContext::handleOutOfFlowPositioned(Vector<LayoutBox*>& posit
ionedObjects) | 340 inline void BreakingContext::handleOutOfFlowPositioned(Vector<LayoutBox*>& posit
ionedObjects) |
| 340 { | 341 { |
| 341 // If our original display wasn't an inline type, then we can | 342 // If our original display wasn't an inline type, then we can |
| 342 // go ahead and determine our static inline position now. | 343 // go ahead and determine our static inline position now. |
| 343 LayoutBox* box = toLayoutBox(m_current.object()); | 344 LayoutBox* box = toLayoutBox(m_current.object()); |
| 344 bool isInlineType = box->style()->isOriginalDisplayInlineType(); | 345 bool isInlineType = box->style()->isOriginalDisplayInlineType(); |
| 345 if (!isInlineType) { | 346 if (!isInlineType) { |
| 346 m_block->setStaticInlinePositionForChild(*box, m_block->startOffsetForCo
ntent()); | 347 m_block.setStaticInlinePositionForChild(*box, m_block.startOffsetForCont
ent()); |
| 347 } else { | 348 } else { |
| 348 // If our original display was an INLINE type, then we can go ahead | 349 // If our original display was an INLINE type, then we can go ahead |
| 349 // and determine our static y position now. | 350 // and determine our static y position now. |
| 350 box->layer()->setStaticBlockPosition(m_block->logicalHeight()); | 351 box->layer()->setStaticBlockPosition(m_block.logicalHeight()); |
| 351 } | 352 } |
| 352 | 353 |
| 353 // If we're ignoring spaces, we have to stop and include this object and | 354 // If we're ignoring spaces, we have to stop and include this object and |
| 354 // then start ignoring spaces again. | 355 // then start ignoring spaces again. |
| 355 if (isInlineType || box->container()->isLayoutInline()) { | 356 if (isInlineType || box->container()->isLayoutInline()) { |
| 356 if (m_ignoringSpaces) | 357 if (m_ignoringSpaces) |
| 357 m_lineMidpointState.ensureLineBoxInsideIgnoredSpaces(box); | 358 m_lineMidpointState.ensureLineBoxInsideIgnoredSpaces(box); |
| 358 m_trailingObjects.appendObjectIfNeeded(box); | 359 m_trailingObjects.appendObjectIfNeeded(box); |
| 359 } else { | 360 } else { |
| 360 positionedObjects.append(box); | 361 positionedObjects.append(box); |
| 361 } | 362 } |
| 362 m_width.addUncommittedWidth(inlineLogicalWidth(box).toFloat()); | 363 m_width.addUncommittedWidth(inlineLogicalWidth(box).toFloat()); |
| 363 // Reset prior line break context characters. | 364 // Reset prior line break context characters. |
| 364 m_layoutTextInfo.m_lineBreakIterator.resetPriorContext(); | 365 m_layoutTextInfo.m_lineBreakIterator.resetPriorContext(); |
| 365 } | 366 } |
| 366 | 367 |
| 367 inline void BreakingContext::handleFloat() | 368 inline void BreakingContext::handleFloat() |
| 368 { | 369 { |
| 369 LayoutBox* floatBox = toLayoutBox(m_current.object()); | 370 LayoutBox* floatBox = toLayoutBox(m_current.object()); |
| 370 FloatingObject* floatingObject = m_block->insertFloatingObject(*floatBox); | 371 FloatingObject* floatingObject = m_block.insertFloatingObject(*floatBox); |
| 371 // check if it fits in the current line. | 372 // check if it fits in the current line. |
| 372 // If it does, position it now, otherwise, position | 373 // If it does, position it now, otherwise, position |
| 373 // it after moving to next line (in newLine() func) | 374 // it after moving to next line (in newLine() func) |
| 374 // FIXME: Bug 110372: Properly position multiple stacked floats with non-rec
tangular shape outside. | 375 // FIXME: Bug 110372: Properly position multiple stacked floats with non-rec
tangular shape outside. |
| 375 if (m_floatsFitOnLine && m_width.fitsOnLine(m_block->logicalWidthForFloat(fl
oatingObject).toFloat(), ExcludeWhitespace)) { | 376 if (m_floatsFitOnLine && m_width.fitsOnLine(m_block.logicalWidthForFloat(flo
atingObject).toFloat(), ExcludeWhitespace)) { |
| 376 m_block->positionNewFloatOnLine(floatingObject, m_lastFloatFromPreviousL
ine, m_lineInfo, m_width); | 377 m_block.positionNewFloatOnLine(floatingObject, m_lastFloatFromPreviousLi
ne, m_lineInfo, m_width); |
| 377 if (m_lineBreak.object() == m_current.object()) { | 378 if (m_lineBreak.object() == m_current.object()) { |
| 378 ASSERT(!m_lineBreak.offset()); | 379 ASSERT(!m_lineBreak.offset()); |
| 379 m_lineBreak.increment(); | 380 m_lineBreak.increment(); |
| 380 } | 381 } |
| 381 } else { | 382 } else { |
| 382 m_floatsFitOnLine = false; | 383 m_floatsFitOnLine = false; |
| 383 } | 384 } |
| 384 // Update prior line break context characters, using U+FFFD (OBJECT REPLACEM
ENT CHARACTER) for floating element. | 385 // Update prior line break context characters, using U+FFFD (OBJECT REPLACEM
ENT CHARACTER) for floating element. |
| 385 m_layoutTextInfo.m_lineBreakIterator.updatePriorContext(replacementCharacter
); | 386 m_layoutTextInfo.m_lineBreakIterator.updatePriorContext(replacementCharacter
); |
| 386 } | 387 } |
| 387 | 388 |
| 388 // This is currently just used for list markers and inline flows that have line
boxes. Neither should | 389 // This is currently just used for list markers and inline flows that have line
boxes. Neither should |
| 389 // have an effect on whitespace at the start of the line. | 390 // have an effect on whitespace at the start of the line. |
| 390 inline bool shouldSkipWhitespaceAfterStartObject(LayoutBlockFlow* block, LayoutO
bject* o, LineMidpointState& lineMidpointState) | 391 inline bool shouldSkipWhitespaceAfterStartObject(LineLayoutBlockFlow block, Layo
utObject* o, LineMidpointState& lineMidpointState) |
| 391 { | 392 { |
| 392 LayoutObject* next = bidiNextSkippingEmptyInlines(block, o); | 393 LayoutObject* next = bidiNextSkippingEmptyInlines(block, o); |
| 393 while (next && next->isFloatingOrOutOfFlowPositioned()) | 394 while (next && next->isFloatingOrOutOfFlowPositioned()) |
| 394 next = bidiNextSkippingEmptyInlines(block, next); | 395 next = bidiNextSkippingEmptyInlines(block, next); |
| 395 | 396 |
| 396 if (next && !next->isBR() && next->isText() && toLayoutText(next)->textLengt
h() > 0) { | 397 if (next && !next->isBR() && next->isText() && toLayoutText(next)->textLengt
h() > 0) { |
| 397 LayoutText* nextText = toLayoutText(next); | 398 LayoutText* nextText = toLayoutText(next); |
| 398 UChar nextChar = nextText->characterAt(0); | 399 UChar nextChar = nextText->characterAt(0); |
| 399 if (nextText->style()->isCollapsibleWhiteSpace(nextChar)) { | 400 if (nextText->style()->isCollapsibleWhiteSpace(nextChar)) { |
| 400 lineMidpointState.startIgnoringSpaces(InlineIterator(0, o, 0)); | 401 lineMidpointState.startIgnoringSpaces(InlineIterator(0, o, 0)); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 455 if (m_ignoringSpaces) | 456 if (m_ignoringSpaces) |
| 456 m_lineMidpointState.stopIgnoringSpaces(InlineIterator(0, m_current.objec
t(), 0)); | 457 m_lineMidpointState.stopIgnoringSpaces(InlineIterator(0, m_current.objec
t(), 0)); |
| 457 | 458 |
| 458 m_lineInfo.setEmpty(false, m_block, &m_width); | 459 m_lineInfo.setEmpty(false, m_block, &m_width); |
| 459 m_ignoringSpaces = false; | 460 m_ignoringSpaces = false; |
| 460 m_currentCharacterShouldCollapseIfPreWap = m_currentCharacterIsSpace = false
; | 461 m_currentCharacterShouldCollapseIfPreWap = m_currentCharacterIsSpace = false
; |
| 461 m_trailingObjects.clear(); | 462 m_trailingObjects.clear(); |
| 462 | 463 |
| 463 // Optimize for a common case. If we can't find whitespace after the list | 464 // Optimize for a common case. If we can't find whitespace after the list |
| 464 // item, then this is all moot. | 465 // item, then this is all moot. |
| 465 LayoutUnit replacedLogicalWidth = m_block->logicalWidthForChild(*replacedBox
) + m_block->marginStartForChild(*replacedBox) + m_block->marginEndForChild(*rep
lacedBox) + inlineLogicalWidth(m_current.object()); | 466 LayoutUnit replacedLogicalWidth = m_block.logicalWidthForChild(*replacedBox)
+ m_block.marginStartForChild(*replacedBox) + m_block.marginEndForChild(*replac
edBox) + inlineLogicalWidth(m_current.object()); |
| 466 if (m_current.object()->isListMarker()) { | 467 if (m_current.object()->isListMarker()) { |
| 467 if (m_blockStyle->collapseWhiteSpace() && shouldSkipWhitespaceAfterStart
Object(m_block, m_current.object(), m_lineMidpointState)) { | 468 if (m_blockStyle->collapseWhiteSpace() && shouldSkipWhitespaceAfterStart
Object(m_block, m_current.object(), m_lineMidpointState)) { |
| 468 // Like with inline flows, we start ignoring spaces to make sure tha
t any | 469 // Like with inline flows, we start ignoring spaces to make sure tha
t any |
| 469 // additional spaces we see will be discarded. | 470 // additional spaces we see will be discarded. |
| 470 m_currentCharacterShouldCollapseIfPreWap = m_currentCharacterIsSpace
= true; | 471 m_currentCharacterShouldCollapseIfPreWap = m_currentCharacterIsSpace
= true; |
| 471 m_ignoringSpaces = true; | 472 m_ignoringSpaces = true; |
| 472 } | 473 } |
| 473 if (toLayoutListMarker(m_current.object())->isInside()) | 474 if (toLayoutListMarker(m_current.object())->isInside()) |
| 474 m_width.addUncommittedWidth(replacedLogicalWidth.toFloat()); | 475 m_width.addUncommittedWidth(replacedLogicalWidth.toFloat()); |
| 475 } else { | 476 } else { |
| (...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 899 | 900 |
| 900 if (style.textIndentType() == TextIndentHanging) | 901 if (style.textIndentType() == TextIndentHanging) |
| 901 shouldIndentText = shouldIndentText == IndentText ? DoNotIndentText : In
dentText; | 902 shouldIndentText = shouldIndentText == IndentText ? DoNotIndentText : In
dentText; |
| 902 | 903 |
| 903 return shouldIndentText; | 904 return shouldIndentText; |
| 904 } | 905 } |
| 905 | 906 |
| 906 } | 907 } |
| 907 | 908 |
| 908 #endif // BreakingContextInlineHeaders_h | 909 #endif // BreakingContextInlineHeaders_h |
| OLD | NEW |