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 * | 5 * |
6 * This library is free software; you can redistribute it and/or | 6 * This library is free software; you can redistribute it and/or |
7 * modify it under the terms of the GNU Library General Public | 7 * modify it under the terms of the GNU Library General Public |
8 * License as published by the Free Software Foundation; either | 8 * License as published by the Free Software Foundation; either |
9 * version 2 of the License, or (at your option) any later version. | 9 * version 2 of the License, or (at your option) any later version. |
10 * | 10 * |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 return false; | 101 return false; |
102 } | 102 } |
103 | 103 |
104 InlineFlowBox* LayoutBlockFlow::createLineBoxes(LayoutObject* obj, const LineInf
o& lineInfo, InlineBox* childBox) | 104 InlineFlowBox* LayoutBlockFlow::createLineBoxes(LayoutObject* obj, const LineInf
o& lineInfo, InlineBox* childBox) |
105 { | 105 { |
106 // See if we have an unconstructed line box for this object that is also | 106 // See if we have an unconstructed line box for this object that is also |
107 // the last item on the line. | 107 // the last item on the line. |
108 unsigned lineDepth = 1; | 108 unsigned lineDepth = 1; |
109 InlineFlowBox* parentBox = nullptr; | 109 InlineFlowBox* parentBox = nullptr; |
110 InlineFlowBox* result = nullptr; | 110 InlineFlowBox* result = nullptr; |
111 bool hasDefaultLineBoxContain = style()->lineBoxContain() == ComputedStyle::
initialLineBoxContain(); | |
112 do { | 111 do { |
113 ASSERT_WITH_SECURITY_IMPLICATION(obj->isLayoutInline() || obj == this); | 112 ASSERT_WITH_SECURITY_IMPLICATION(obj->isLayoutInline() || obj == this); |
114 | 113 |
115 LayoutInline* inlineFlow = (obj != this) ? toLayoutInline(obj) : 0; | 114 LayoutInline* inlineFlow = (obj != this) ? toLayoutInline(obj) : 0; |
116 | 115 |
117 // Get the last box we made for this layout object. | 116 // Get the last box we made for this layout object. |
118 parentBox = inlineFlow ? inlineFlow->lastLineBox() : toLayoutBlock(obj)-
>lastLineBox(); | 117 parentBox = inlineFlow ? inlineFlow->lastLineBox() : toLayoutBlock(obj)-
>lastLineBox(); |
119 | 118 |
120 // If this box or its ancestor is constructed then it is from a previous
line, and we need | 119 // If this box or its ancestor is constructed then it is from a previous
line, and we need |
121 // to make a new box for our line. If this box or its ancestor is uncon
structed but it has | 120 // to make a new box for our line. If this box or its ancestor is uncon
structed but it has |
122 // something following it on the line, then we know we have to make a ne
w box | 121 // something following it on the line, then we know we have to make a ne
w box |
123 // as well. In this situation our inline has actually been split in two
on | 122 // as well. In this situation our inline has actually been split in two
on |
124 // the same line (this can happen with very fancy language mixtures). | 123 // the same line (this can happen with very fancy language mixtures). |
125 bool constructedNewBox = false; | 124 bool constructedNewBox = false; |
126 bool allowedToConstructNewBox = !hasDefaultLineBoxContain || !inlineFlow
|| inlineFlow->alwaysCreateLineBoxes(); | 125 bool allowedToConstructNewBox = !inlineFlow || inlineFlow->alwaysCreateL
ineBoxes(); |
127 bool canUseExistingParentBox = parentBox && !parentIsConstructedOrHaveNe
xt(parentBox); | 126 bool canUseExistingParentBox = parentBox && !parentIsConstructedOrHaveNe
xt(parentBox); |
128 if (allowedToConstructNewBox && !canUseExistingParentBox) { | 127 if (allowedToConstructNewBox && !canUseExistingParentBox) { |
129 // We need to make a new box for this layout object. Once | 128 // We need to make a new box for this layout object. Once |
130 // made, we need to place it at the end of the current line. | 129 // made, we need to place it at the end of the current line. |
131 InlineBox* newBox = createInlineBoxForLayoutObject(obj, obj == this)
; | 130 InlineBox* newBox = createInlineBoxForLayoutObject(obj, obj == this)
; |
132 ASSERT_WITH_SECURITY_IMPLICATION(newBox->isInlineFlowBox()); | 131 ASSERT_WITH_SECURITY_IMPLICATION(newBox->isInlineFlowBox()); |
133 parentBox = toInlineFlowBox(newBox); | 132 parentBox = toInlineFlowBox(newBox); |
134 parentBox->setFirstLineStyleBit(lineInfo.isFirstLine()); | 133 parentBox->setFirstLineStyleBit(lineInfo.isFirstLine()); |
135 parentBox->setIsHorizontal(isHorizontalWritingMode()); | 134 parentBox->setIsHorizontal(isHorizontalWritingMode()); |
136 if (!hasDefaultLineBoxContain) | |
137 parentBox->clearDescendantsHaveSameLineHeightAndBaseline(); | |
138 constructedNewBox = true; | 135 constructedNewBox = true; |
139 } | 136 } |
140 | 137 |
141 if (constructedNewBox || canUseExistingParentBox) { | 138 if (constructedNewBox || canUseExistingParentBox) { |
142 if (!result) | 139 if (!result) |
143 result = parentBox; | 140 result = parentBox; |
144 | 141 |
145 // If we have hit the block itself, then |box| represents the root | 142 // If we have hit the block itself, then |box| represents the root |
146 // inline box for the line, and it doesn't have to be appended to an
y parent | 143 // inline box for the line, and it doesn't have to be appended to an
y parent |
147 // inline. | 144 // inline. |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 setMarginEndForChild(*layoutRubyRun, -endOverhang); | 364 setMarginEndForChild(*layoutRubyRun, -endOverhang); |
368 } | 365 } |
369 | 366 |
370 static inline void setLogicalWidthForTextRun(RootInlineBox* lineBox, BidiRun* ru
n, LayoutText* layoutText, LayoutUnit xPos, const LineInfo& lineInfo, | 367 static inline void setLogicalWidthForTextRun(RootInlineBox* lineBox, BidiRun* ru
n, LayoutText* layoutText, LayoutUnit xPos, const LineInfo& lineInfo, |
371 GlyphOverflowAndFallbackFontsMap& textBoxDataMap, VerticalPositionCache& ver
ticalPositionCache, WordMeasurements& wordMeasurements) | 368 GlyphOverflowAndFallbackFontsMap& textBoxDataMap, VerticalPositionCache& ver
ticalPositionCache, WordMeasurements& wordMeasurements) |
372 { | 369 { |
373 HashSet<const SimpleFontData*> fallbackFonts; | 370 HashSet<const SimpleFontData*> fallbackFonts; |
374 GlyphOverflow glyphOverflow; | 371 GlyphOverflow glyphOverflow; |
375 | 372 |
376 const Font& font = layoutText->style(lineInfo.isFirstLine())->font(); | 373 const Font& font = layoutText->style(lineInfo.isFirstLine())->font(); |
377 // Always compute glyph overflow bounds if the block's line-box-contain valu
e is "glyphs". | |
378 if (lineBox->fitsToGlyphs()) | |
379 glyphOverflow.computeBounds = true; | |
380 | 374 |
381 LayoutUnit hyphenWidth = 0; | 375 LayoutUnit hyphenWidth = 0; |
382 if (toInlineTextBox(run->m_box)->hasHyphen()) | 376 if (toInlineTextBox(run->m_box)->hasHyphen()) |
383 hyphenWidth = layoutText->hyphenWidth(font, run->direction()); | 377 hyphenWidth = layoutText->hyphenWidth(font, run->direction()); |
384 | 378 |
385 float measuredWidth = 0; | 379 float measuredWidth = 0; |
386 FloatRect glyphBounds; | 380 FloatRect glyphBounds; |
387 | 381 |
388 bool kerningIsEnabled = font.fontDescription().typesettingFeatures() & Kerni
ng; | 382 bool kerningIsEnabled = font.fontDescription().typesettingFeatures() & Kerni
ng; |
389 | 383 |
(...skipping 1649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2039 LayoutUnit logicalLeft = logicalLeftOffsetForLine(logicalHeight(), false); | 2033 LayoutUnit logicalLeft = logicalLeftOffsetForLine(logicalHeight(), false); |
2040 LayoutUnit availableLogicalWidth = logicalRightOffsetForLine(logicalHeight()
, false) - logicalLeft; | 2034 LayoutUnit availableLogicalWidth = logicalRightOffsetForLine(logicalHeight()
, false) - logicalLeft; |
2041 updateLogicalWidthForAlignment(textAlign, 0, 0, logicalLeft, totalLogicalWid
th, availableLogicalWidth, 0); | 2035 updateLogicalWidthForAlignment(textAlign, 0, 0, logicalLeft, totalLogicalWid
th, availableLogicalWidth, 0); |
2042 | 2036 |
2043 if (!style()->isLeftToRightDirection()) | 2037 if (!style()->isLeftToRightDirection()) |
2044 return logicalWidth() - logicalLeft; | 2038 return logicalWidth() - logicalLeft; |
2045 return logicalLeft; | 2039 return logicalLeft; |
2046 } | 2040 } |
2047 | 2041 |
2048 } | 2042 } |
OLD | NEW |