OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights
reserved. | 2 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights
reserved. |
3 * | 3 * |
4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
8 * | 8 * |
9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 m_firstChild = child; | 104 m_firstChild = child; |
105 m_lastChild = child; | 105 m_lastChild = child; |
106 } else { | 106 } else { |
107 m_lastChild->setNextOnLine(child); | 107 m_lastChild->setNextOnLine(child); |
108 child->setPrevOnLine(m_lastChild); | 108 child->setPrevOnLine(m_lastChild); |
109 m_lastChild = child; | 109 m_lastChild = child; |
110 } | 110 } |
111 child->setFirstLineStyleBit(isFirstLineStyle()); | 111 child->setFirstLineStyleBit(isFirstLineStyle()); |
112 child->setIsHorizontal(isHorizontal()); | 112 child->setIsHorizontal(isHorizontal()); |
113 if (child->isText()) { | 113 if (child->isText()) { |
114 if (child->renderer().parent() == renderer()) | 114 if (child->layoutObject().parent() == layoutObject()) |
115 m_hasTextChildren = true; | 115 m_hasTextChildren = true; |
116 setHasTextDescendantsOnAncestors(this); | 116 setHasTextDescendantsOnAncestors(this); |
117 } else if (child->isInlineFlowBox()) { | 117 } else if (child->isInlineFlowBox()) { |
118 if (toInlineFlowBox(child)->hasTextDescendants()) | 118 if (toInlineFlowBox(child)->hasTextDescendants()) |
119 setHasTextDescendantsOnAncestors(this); | 119 setHasTextDescendantsOnAncestors(this); |
120 } | 120 } |
121 | 121 |
122 if (descendantsHaveSameLineHeightAndBaseline() && !child->renderer().isOutOf
FlowPositioned()) { | 122 if (descendantsHaveSameLineHeightAndBaseline() && !child->layoutObject().isO
utOfFlowPositioned()) { |
123 const LayoutStyle& parentStyle = renderer().styleRef(isFirstLineStyle())
; | 123 const LayoutStyle& parentStyle = layoutObject().styleRef(isFirstLineStyl
e()); |
124 const LayoutStyle& childStyle = child->renderer().styleRef(isFirstLineSt
yle()); | 124 const LayoutStyle& childStyle = child->layoutObject().styleRef(isFirstLi
neStyle()); |
125 bool shouldClearDescendantsHaveSameLineHeightAndBaseline = false; | 125 bool shouldClearDescendantsHaveSameLineHeightAndBaseline = false; |
126 if (child->renderer().isReplaced()) { | 126 if (child->layoutObject().isReplaced()) { |
127 shouldClearDescendantsHaveSameLineHeightAndBaseline = true; | 127 shouldClearDescendantsHaveSameLineHeightAndBaseline = true; |
128 } else if (child->isText()) { | 128 } else if (child->isText()) { |
129 if (child->renderer().isBR() || child->renderer().parent() != render
er()) { | 129 if (child->layoutObject().isBR() || child->layoutObject().parent() !
= layoutObject()) { |
130 if (!parentStyle.font().fontMetrics().hasIdenticalAscentDescentA
ndLineGap(childStyle.font().fontMetrics()) | 130 if (!parentStyle.font().fontMetrics().hasIdenticalAscentDescentA
ndLineGap(childStyle.font().fontMetrics()) |
131 || parentStyle.lineHeight() != childStyle.lineHeight() | 131 || parentStyle.lineHeight() != childStyle.lineHeight() |
132 || (parentStyle.verticalAlign() != BASELINE && !isRootInline
Box()) || childStyle.verticalAlign() != BASELINE) | 132 || (parentStyle.verticalAlign() != BASELINE && !isRootInline
Box()) || childStyle.verticalAlign() != BASELINE) |
133 shouldClearDescendantsHaveSameLineHeightAndBaseline = true; | 133 shouldClearDescendantsHaveSameLineHeightAndBaseline = true; |
134 } | 134 } |
135 if (childStyle.hasTextCombine() || childStyle.textEmphasisMark() !=
TextEmphasisMarkNone) | 135 if (childStyle.hasTextCombine() || childStyle.textEmphasisMark() !=
TextEmphasisMarkNone) |
136 shouldClearDescendantsHaveSameLineHeightAndBaseline = true; | 136 shouldClearDescendantsHaveSameLineHeightAndBaseline = true; |
137 } else { | 137 } else { |
138 if (child->renderer().isBR()) { | 138 if (child->layoutObject().isBR()) { |
139 // FIXME: This is dumb. We only turn off because current layout
test results expect the <br> to be 0-height on the baseline. | 139 // FIXME: This is dumb. We only turn off because current layout
test results expect the <br> to be 0-height on the baseline. |
140 // Other than making a zillion tests have to regenerate results,
there's no reason to ditch the optimization here. | 140 // Other than making a zillion tests have to regenerate results,
there's no reason to ditch the optimization here. |
141 shouldClearDescendantsHaveSameLineHeightAndBaseline = true; | 141 shouldClearDescendantsHaveSameLineHeightAndBaseline = true; |
142 } else { | 142 } else { |
143 ASSERT(isInlineFlowBox()); | 143 ASSERT(isInlineFlowBox()); |
144 InlineFlowBox* childFlowBox = toInlineFlowBox(child); | 144 InlineFlowBox* childFlowBox = toInlineFlowBox(child); |
145 // Check the child's bit, and then also check for differences in
font, line-height, vertical-align | 145 // Check the child's bit, and then also check for differences in
font, line-height, vertical-align |
146 if (!childFlowBox->descendantsHaveSameLineHeightAndBaseline() | 146 if (!childFlowBox->descendantsHaveSameLineHeightAndBaseline() |
147 || !parentStyle.font().fontMetrics().hasIdenticalAscentDesce
ntAndLineGap(childStyle.font().fontMetrics()) | 147 || !parentStyle.font().fontMetrics().hasIdenticalAscentDesce
ntAndLineGap(childStyle.font().fontMetrics()) |
148 || parentStyle.lineHeight() != childStyle.lineHeight() | 148 || parentStyle.lineHeight() != childStyle.lineHeight() |
149 || (parentStyle.verticalAlign() != BASELINE && !isRootInline
Box()) || childStyle.verticalAlign() != BASELINE | 149 || (parentStyle.verticalAlign() != BASELINE && !isRootInline
Box()) || childStyle.verticalAlign() != BASELINE |
150 || childStyle.hasBorder() || childStyle.hasPadding() || chil
dStyle.hasTextCombine()) | 150 || childStyle.hasBorder() || childStyle.hasPadding() || chil
dStyle.hasTextCombine()) |
151 shouldClearDescendantsHaveSameLineHeightAndBaseline = true; | 151 shouldClearDescendantsHaveSameLineHeightAndBaseline = true; |
152 } | 152 } |
153 } | 153 } |
154 | 154 |
155 if (shouldClearDescendantsHaveSameLineHeightAndBaseline) | 155 if (shouldClearDescendantsHaveSameLineHeightAndBaseline) |
156 clearDescendantsHaveSameLineHeightAndBaseline(); | 156 clearDescendantsHaveSameLineHeightAndBaseline(); |
157 } | 157 } |
158 | 158 |
159 if (!child->renderer().isOutOfFlowPositioned()) { | 159 if (!child->layoutObject().isOutOfFlowPositioned()) { |
160 if (child->isText()) { | 160 if (child->isText()) { |
161 const LayoutStyle& childStyle = child->renderer().styleRef(isFirstLi
neStyle()); | 161 const LayoutStyle& childStyle = child->layoutObject().styleRef(isFir
stLineStyle()); |
162 if (childStyle.letterSpacing() < 0 || childStyle.textShadow() || chi
ldStyle.textEmphasisMark() != TextEmphasisMarkNone || childStyle.textStrokeWidth
()) | 162 if (childStyle.letterSpacing() < 0 || childStyle.textShadow() || chi
ldStyle.textEmphasisMark() != TextEmphasisMarkNone || childStyle.textStrokeWidth
()) |
163 child->clearKnownToHaveNoOverflow(); | 163 child->clearKnownToHaveNoOverflow(); |
164 } else if (child->renderer().isReplaced()) { | 164 } else if (child->layoutObject().isReplaced()) { |
165 LayoutBox& box = toLayoutBox(child->renderer()); | 165 LayoutBox& box = toLayoutBox(child->layoutObject()); |
166 if (box.hasOverflowModel() || box.hasSelfPaintingLayer()) | 166 if (box.hasOverflowModel() || box.hasSelfPaintingLayer()) |
167 child->clearKnownToHaveNoOverflow(); | 167 child->clearKnownToHaveNoOverflow(); |
168 } else if (!child->renderer().isBR() && (child->renderer().style(isFirst
LineStyle())->boxShadow() || child->boxModelObject()->hasSelfPaintingLayer() | 168 } else if (!child->layoutObject().isBR() && (child->layoutObject().style
(isFirstLineStyle())->boxShadow() || child->boxModelObject()->hasSelfPaintingLay
er() |
169 || (child->renderer().isListMarker() && !toLayoutListMarker(child->r
enderer()).isInside()) | 169 || (child->layoutObject().isListMarker() && !toLayoutListMarker(chil
d->layoutObject()).isInside()) |
170 || child->renderer().style(isFirstLineStyle())->hasBorderImageOutset
s() | 170 || child->layoutObject().style(isFirstLineStyle())->hasBorderImageOu
tsets() |
171 || child->renderer().style(isFirstLineStyle())->hasOutline())) { | 171 || child->layoutObject().style(isFirstLineStyle())->hasOutline())) { |
172 child->clearKnownToHaveNoOverflow(); | 172 child->clearKnownToHaveNoOverflow(); |
173 } | 173 } |
174 | 174 |
175 if (knownToHaveNoOverflow() && child->isInlineFlowBox() && !toInlineFlow
Box(child)->knownToHaveNoOverflow()) | 175 if (knownToHaveNoOverflow() && child->isInlineFlowBox() && !toInlineFlow
Box(child)->knownToHaveNoOverflow()) |
176 clearKnownToHaveNoOverflow(); | 176 clearKnownToHaveNoOverflow(); |
177 } | 177 } |
178 | 178 |
179 checkConsistency(); | 179 checkConsistency(); |
180 } | 180 } |
181 | 181 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 { | 259 { |
260 InlineBox::adjustPosition(dx, dy); | 260 InlineBox::adjustPosition(dx, dy); |
261 for (InlineBox* child = firstChild(); child; child = child->nextOnLine()) | 261 for (InlineBox* child = firstChild(); child; child = child->nextOnLine()) |
262 child->adjustPosition(dx, dy); | 262 child->adjustPosition(dx, dy); |
263 if (m_overflow) | 263 if (m_overflow) |
264 m_overflow->move(dx, dy); // FIXME: Rounding error here since overflow w
as pixel snapped, but nobody other than list markers passes non-integral values
here. | 264 m_overflow->move(dx, dy); // FIXME: Rounding error here since overflow w
as pixel snapped, but nobody other than list markers passes non-integral values
here. |
265 } | 265 } |
266 | 266 |
267 LineBoxList* InlineFlowBox::lineBoxes() const | 267 LineBoxList* InlineFlowBox::lineBoxes() const |
268 { | 268 { |
269 return toLayoutInline(renderer()).lineBoxes(); | 269 return toLayoutInline(layoutObject()).lineBoxes(); |
270 } | 270 } |
271 | 271 |
272 static inline bool isLastChildForRenderer(LayoutObject* ancestor, LayoutObject*
child) | 272 static inline bool isLastChildForRenderer(LayoutObject* ancestor, LayoutObject*
child) |
273 { | 273 { |
274 if (!child) | 274 if (!child) |
275 return false; | 275 return false; |
276 | 276 |
277 if (child == ancestor) | 277 if (child == ancestor) |
278 return true; | 278 return true; |
279 | 279 |
(...skipping 25 matching lines...) Expand all Loading... |
305 | 305 |
306 void InlineFlowBox::determineSpacingForFlowBoxes(bool lastLine, bool isLogically
LastRunWrapped, LayoutObject* logicallyLastRunRenderer) | 306 void InlineFlowBox::determineSpacingForFlowBoxes(bool lastLine, bool isLogically
LastRunWrapped, LayoutObject* logicallyLastRunRenderer) |
307 { | 307 { |
308 // All boxes start off open. They will not apply any margins/border/padding
on | 308 // All boxes start off open. They will not apply any margins/border/padding
on |
309 // any side. | 309 // any side. |
310 bool includeLeftEdge = false; | 310 bool includeLeftEdge = false; |
311 bool includeRightEdge = false; | 311 bool includeRightEdge = false; |
312 | 312 |
313 // The root inline box never has borders/margins/padding. | 313 // The root inline box never has borders/margins/padding. |
314 if (parent()) { | 314 if (parent()) { |
315 bool ltr = renderer().style()->isLeftToRightDirection(); | 315 bool ltr = layoutObject().style()->isLeftToRightDirection(); |
316 | 316 |
317 // Check to see if all initial lines are unconstructed. If so, then | 317 // Check to see if all initial lines are unconstructed. If so, then |
318 // we know the inline began on this line (unless we are a continuation). | 318 // we know the inline began on this line (unless we are a continuation). |
319 LineBoxList* lineBoxList = lineBoxes(); | 319 LineBoxList* lineBoxList = lineBoxes(); |
320 if (!lineBoxList->firstLineBox()->isConstructed() && !renderer().isInlin
eElementContinuation()) { | 320 if (!lineBoxList->firstLineBox()->isConstructed() && !layoutObject().isI
nlineElementContinuation()) { |
321 if (renderer().style()->boxDecorationBreak() == DCLONE) | 321 if (layoutObject().style()->boxDecorationBreak() == DCLONE) |
322 includeLeftEdge = includeRightEdge = true; | 322 includeLeftEdge = includeRightEdge = true; |
323 else if (ltr && lineBoxList->firstLineBox() == this) | 323 else if (ltr && lineBoxList->firstLineBox() == this) |
324 includeLeftEdge = true; | 324 includeLeftEdge = true; |
325 else if (!ltr && lineBoxList->lastLineBox() == this) | 325 else if (!ltr && lineBoxList->lastLineBox() == this) |
326 includeRightEdge = true; | 326 includeRightEdge = true; |
327 } | 327 } |
328 | 328 |
329 if (!lineBoxList->lastLineBox()->isConstructed()) { | 329 if (!lineBoxList->lastLineBox()->isConstructed()) { |
330 LayoutInline& inlineFlow = toLayoutInline(renderer()); | 330 LayoutInline& inlineFlow = toLayoutInline(layoutObject()); |
331 bool isLastObjectOnLine = !isAnsectorAndWithinBlock(&renderer(), log
icallyLastRunRenderer) || (isLastChildForRenderer(&renderer(), logicallyLastRunR
enderer) && !isLogicallyLastRunWrapped); | 331 bool isLastObjectOnLine = !isAnsectorAndWithinBlock(&layoutObject(),
logicallyLastRunRenderer) || (isLastChildForRenderer(&layoutObject(), logically
LastRunRenderer) && !isLogicallyLastRunWrapped); |
332 | 332 |
333 // We include the border under these conditions: | 333 // We include the border under these conditions: |
334 // (1) The next line was not created, or it is constructed. We check
the previous line for rtl. | 334 // (1) The next line was not created, or it is constructed. We check
the previous line for rtl. |
335 // (2) The logicallyLastRun is not a descendant of this renderer. | 335 // (2) The logicallyLastRun is not a descendant of this renderer. |
336 // (3) The logicallyLastRun is a descendant of this renderer, but it
is the last child of this renderer and it does not wrap to the next line. | 336 // (3) The logicallyLastRun is a descendant of this renderer, but it
is the last child of this renderer and it does not wrap to the next line. |
337 // (4) The decoration break is set to clone therefore there will be
borders on every sides. | 337 // (4) The decoration break is set to clone therefore there will be
borders on every sides. |
338 if (renderer().style()->boxDecorationBreak() == DCLONE) { | 338 if (layoutObject().style()->boxDecorationBreak() == DCLONE) { |
339 includeLeftEdge = includeRightEdge = true; | 339 includeLeftEdge = includeRightEdge = true; |
340 } else if (ltr) { | 340 } else if (ltr) { |
341 if (!nextLineBox() | 341 if (!nextLineBox() |
342 && ((lastLine || isLastObjectOnLine) && !inlineFlow.continua
tion())) | 342 && ((lastLine || isLastObjectOnLine) && !inlineFlow.continua
tion())) |
343 includeRightEdge = true; | 343 includeRightEdge = true; |
344 } else { | 344 } else { |
345 if ((!prevLineBox() || prevLineBox()->isConstructed()) | 345 if ((!prevLineBox() || prevLineBox()->isConstructed()) |
346 && ((lastLine || isLastObjectOnLine) && !inlineFlow.continua
tion())) | 346 && ((lastLine || isLastObjectOnLine) && !inlineFlow.continua
tion())) |
347 includeLeftEdge = true; | 347 includeLeftEdge = true; |
348 } | 348 } |
(...skipping 26 matching lines...) Expand all Loading... |
375 | 375 |
376 logicalLeft += borderLogicalRight() + paddingLogicalRight(); | 376 logicalLeft += borderLogicalRight() + paddingLogicalRight(); |
377 endPlacingBoxRangesInInlineDirection(startLogicalLeft, logicalLeft, minLogic
alLeft, maxLogicalRight); | 377 endPlacingBoxRangesInInlineDirection(startLogicalLeft, logicalLeft, minLogic
alLeft, maxLogicalRight); |
378 return logicalLeft; | 378 return logicalLeft; |
379 } | 379 } |
380 | 380 |
381 FloatWillBeLayoutUnit InlineFlowBox::placeBoxRangeInInlineDirection(InlineBox* f
irstChild, InlineBox* lastChild, | 381 FloatWillBeLayoutUnit InlineFlowBox::placeBoxRangeInInlineDirection(InlineBox* f
irstChild, InlineBox* lastChild, |
382 FloatWillBeLayoutUnit& logicalLeft, FloatWillBeLayoutUnit& minLogicalLeft, F
loatWillBeLayoutUnit& maxLogicalRight, bool& needsWordSpacing) | 382 FloatWillBeLayoutUnit& logicalLeft, FloatWillBeLayoutUnit& minLogicalLeft, F
loatWillBeLayoutUnit& maxLogicalRight, bool& needsWordSpacing) |
383 { | 383 { |
384 for (InlineBox* curr = firstChild; curr && curr != lastChild; curr = curr->n
extOnLine()) { | 384 for (InlineBox* curr = firstChild; curr && curr != lastChild; curr = curr->n
extOnLine()) { |
385 if (curr->renderer().isText()) { | 385 if (curr->layoutObject().isText()) { |
386 InlineTextBox* text = toInlineTextBox(curr); | 386 InlineTextBox* text = toInlineTextBox(curr); |
387 LayoutText& rt = text->renderer(); | 387 LayoutText& rt = text->layoutObject(); |
388 FloatWillBeLayoutUnit space; | 388 FloatWillBeLayoutUnit space; |
389 if (rt.textLength()) { | 389 if (rt.textLength()) { |
390 if (needsWordSpacing && isSpaceOrNewline(rt.characterAt(text->st
art()))) | 390 if (needsWordSpacing && isSpaceOrNewline(rt.characterAt(text->st
art()))) |
391 space = rt.style(isFirstLineStyle())->font().fontDescription
().wordSpacing(); | 391 space = rt.style(isFirstLineStyle())->font().fontDescription
().wordSpacing(); |
392 needsWordSpacing = !isSpaceOrNewline(rt.characterAt(text->end())
); | 392 needsWordSpacing = !isSpaceOrNewline(rt.characterAt(text->end())
); |
393 } | 393 } |
394 if (isLeftToRightDirection()) { | 394 if (isLeftToRightDirection()) { |
395 logicalLeft += space; | 395 logicalLeft += space; |
396 text->setLogicalLeft(logicalLeft); | 396 text->setLogicalLeft(logicalLeft); |
397 } else { | 397 } else { |
398 text->setLogicalLeft(logicalLeft); | 398 text->setLogicalLeft(logicalLeft); |
399 logicalLeft += space; | 399 logicalLeft += space; |
400 } | 400 } |
401 if (knownToHaveNoOverflow()) | 401 if (knownToHaveNoOverflow()) |
402 minLogicalLeft = std::min(logicalLeft, minLogicalLeft); | 402 minLogicalLeft = std::min(logicalLeft, minLogicalLeft); |
403 logicalLeft += text->logicalWidth(); | 403 logicalLeft += text->logicalWidth(); |
404 if (knownToHaveNoOverflow()) | 404 if (knownToHaveNoOverflow()) |
405 maxLogicalRight = std::max(logicalLeft, maxLogicalRight); | 405 maxLogicalRight = std::max(logicalLeft, maxLogicalRight); |
406 } else { | 406 } else { |
407 if (curr->renderer().isOutOfFlowPositioned()) { | 407 if (curr->layoutObject().isOutOfFlowPositioned()) { |
408 if (curr->renderer().parent()->style()->isLeftToRightDirection()
) { | 408 if (curr->layoutObject().parent()->style()->isLeftToRightDirecti
on()) { |
409 curr->setLogicalLeft(logicalLeft); | 409 curr->setLogicalLeft(logicalLeft); |
410 } else { | 410 } else { |
411 // Our offset that we cache needs to be from the edge of the
right border box and | 411 // Our offset that we cache needs to be from the edge of the
right border box and |
412 // not the left border box. We have to subtract |x| from th
e width of the block | 412 // not the left border box. We have to subtract |x| from th
e width of the block |
413 // (which can be obtained from the root line box). | 413 // (which can be obtained from the root line box). |
414 curr->setLogicalLeft(root().block().logicalWidth() - logical
Left); | 414 curr->setLogicalLeft(root().block().logicalWidth() - logical
Left); |
415 } | 415 } |
416 continue; // The positioned object has no effect on the width. | 416 continue; // The positioned object has no effect on the width. |
417 } | 417 } |
418 if (curr->renderer().isLayoutInline()) { | 418 if (curr->layoutObject().isLayoutInline()) { |
419 InlineFlowBox* flow = toInlineFlowBox(curr); | 419 InlineFlowBox* flow = toInlineFlowBox(curr); |
420 logicalLeft += flow->marginLogicalLeft(); | 420 logicalLeft += flow->marginLogicalLeft(); |
421 if (knownToHaveNoOverflow()) | 421 if (knownToHaveNoOverflow()) |
422 minLogicalLeft = std::min(logicalLeft, minLogicalLeft); | 422 minLogicalLeft = std::min(logicalLeft, minLogicalLeft); |
423 logicalLeft = flow->placeBoxesInInlineDirection(logicalLeft, nee
dsWordSpacing); | 423 logicalLeft = flow->placeBoxesInInlineDirection(logicalLeft, nee
dsWordSpacing); |
424 if (knownToHaveNoOverflow()) | 424 if (knownToHaveNoOverflow()) |
425 maxLogicalRight = std::max(logicalLeft, maxLogicalRight); | 425 maxLogicalRight = std::max(logicalLeft, maxLogicalRight); |
426 logicalLeft += flow->marginLogicalRight(); | 426 logicalLeft += flow->marginLogicalRight(); |
427 } else if (!curr->renderer().isListMarker() || toLayoutListMarker(cu
rr->renderer()).isInside()) { | 427 } else if (!curr->layoutObject().isListMarker() || toLayoutListMarke
r(curr->layoutObject()).isInside()) { |
428 // The box can have a different writing-mode than the overall li
ne, so this is a bit complicated. | 428 // The box can have a different writing-mode than the overall li
ne, so this is a bit complicated. |
429 // Just get all the physical margin and overflow values by hand
based off |isVertical|. | 429 // Just get all the physical margin and overflow values by hand
based off |isVertical|. |
430 LayoutUnit logicalLeftMargin = isHorizontal() ? curr->boxModelOb
ject()->marginLeft() : curr->boxModelObject()->marginTop(); | 430 LayoutUnit logicalLeftMargin = isHorizontal() ? curr->boxModelOb
ject()->marginLeft() : curr->boxModelObject()->marginTop(); |
431 LayoutUnit logicalRightMargin = isHorizontal() ? curr->boxModelO
bject()->marginRight() : curr->boxModelObject()->marginBottom(); | 431 LayoutUnit logicalRightMargin = isHorizontal() ? curr->boxModelO
bject()->marginRight() : curr->boxModelObject()->marginBottom(); |
432 | 432 |
433 logicalLeft += logicalLeftMargin; | 433 logicalLeft += logicalLeftMargin; |
434 curr->setLogicalLeft(logicalLeft); | 434 curr->setLogicalLeft(logicalLeft); |
435 if (knownToHaveNoOverflow()) | 435 if (knownToHaveNoOverflow()) |
436 minLogicalLeft = std::min(logicalLeft, minLogicalLeft); | 436 minLogicalLeft = std::min(logicalLeft, minLogicalLeft); |
437 logicalLeft += curr->logicalWidth(); | 437 logicalLeft += curr->logicalWidth(); |
438 if (knownToHaveNoOverflow()) | 438 if (knownToHaveNoOverflow()) |
439 maxLogicalRight = std::max(logicalLeft, maxLogicalRight); | 439 maxLogicalRight = std::max(logicalLeft, maxLogicalRight); |
440 logicalLeft += logicalRightMargin; | 440 logicalLeft += logicalRightMargin; |
441 // If we encounter any space after this inline block then ensure
it is treated as the space between two words. | 441 // If we encounter any space after this inline block then ensure
it is treated as the space between two words. |
442 needsWordSpacing = true; | 442 needsWordSpacing = true; |
443 } | 443 } |
444 } | 444 } |
445 } | 445 } |
446 return logicalLeft; | 446 return logicalLeft; |
447 } | 447 } |
448 | 448 |
449 bool InlineFlowBox::requiresIdeographicBaseline(const GlyphOverflowAndFallbackFo
ntsMap& textBoxDataMap) const | 449 bool InlineFlowBox::requiresIdeographicBaseline(const GlyphOverflowAndFallbackFo
ntsMap& textBoxDataMap) const |
450 { | 450 { |
451 if (isHorizontal()) | 451 if (isHorizontal()) |
452 return false; | 452 return false; |
453 | 453 |
454 // FIXME: primaryFont should never be 0 here but can be in some | 454 // FIXME: primaryFont should never be 0 here but can be in some |
455 // cases. crbug.com/445450 | 455 // cases. crbug.com/445450 |
456 RELEASE_ASSERT(renderer().style(isFirstLineStyle())->font().primaryFont()); | 456 RELEASE_ASSERT(layoutObject().style(isFirstLineStyle())->font().primaryFont(
)); |
457 | 457 |
458 if (renderer().style(isFirstLineStyle())->fontDescription().nonCJKGlyphOrien
tation() == NonCJKGlyphOrientationUpright | 458 if (layoutObject().style(isFirstLineStyle())->fontDescription().nonCJKGlyphO
rientation() == NonCJKGlyphOrientationUpright |
459 || renderer().style(isFirstLineStyle())->font().primaryFont()->hasVertic
alGlyphs()) | 459 || layoutObject().style(isFirstLineStyle())->font().primaryFont()->hasVe
rticalGlyphs()) |
460 return true; | 460 return true; |
461 | 461 |
462 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { | 462 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { |
463 if (curr->renderer().isOutOfFlowPositioned()) | 463 if (curr->layoutObject().isOutOfFlowPositioned()) |
464 continue; // Positioned placeholders don't affect calculations. | 464 continue; // Positioned placeholders don't affect calculations. |
465 | 465 |
466 if (curr->isInlineFlowBox()) { | 466 if (curr->isInlineFlowBox()) { |
467 if (toInlineFlowBox(curr)->requiresIdeographicBaseline(textBoxDataMa
p)) | 467 if (toInlineFlowBox(curr)->requiresIdeographicBaseline(textBoxDataMa
p)) |
468 return true; | 468 return true; |
469 } else { | 469 } else { |
470 if (curr->renderer().style(isFirstLineStyle())->font().primaryFont()
->hasVerticalGlyphs()) | 470 if (curr->layoutObject().style(isFirstLineStyle())->font().primaryFo
nt()->hasVerticalGlyphs()) |
471 return true; | 471 return true; |
472 | 472 |
473 const Vector<const SimpleFontData*>* usedFonts = 0; | 473 const Vector<const SimpleFontData*>* usedFonts = 0; |
474 if (curr->isInlineTextBox()) { | 474 if (curr->isInlineTextBox()) { |
475 GlyphOverflowAndFallbackFontsMap::const_iterator it = textBoxDat
aMap.find(toInlineTextBox(curr)); | 475 GlyphOverflowAndFallbackFontsMap::const_iterator it = textBoxDat
aMap.find(toInlineTextBox(curr)); |
476 usedFonts = it == textBoxDataMap.end() ? 0 : &it->value.first; | 476 usedFonts = it == textBoxDataMap.end() ? 0 : &it->value.first; |
477 } | 477 } |
478 | 478 |
479 if (usedFonts) { | 479 if (usedFonts) { |
480 for (size_t i = 0; i < usedFonts->size(); ++i) { | 480 for (size_t i = 0; i < usedFonts->size(); ++i) { |
481 if (usedFonts->at(i)->hasVerticalGlyphs()) | 481 if (usedFonts->at(i)->hasVerticalGlyphs()) |
482 return true; | 482 return true; |
483 } | 483 } |
484 } | 484 } |
485 } | 485 } |
486 } | 486 } |
487 | 487 |
488 return false; | 488 return false; |
489 } | 489 } |
490 | 490 |
491 void InlineFlowBox::adjustMaxAscentAndDescent(int& maxAscent, int& maxDescent, i
nt maxPositionTop, int maxPositionBottom) | 491 void InlineFlowBox::adjustMaxAscentAndDescent(int& maxAscent, int& maxDescent, i
nt maxPositionTop, int maxPositionBottom) |
492 { | 492 { |
493 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { | 493 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { |
494 // The computed lineheight needs to be extended for the | 494 // The computed lineheight needs to be extended for the |
495 // positioned elements | 495 // positioned elements |
496 if (curr->renderer().isOutOfFlowPositioned()) | 496 if (curr->layoutObject().isOutOfFlowPositioned()) |
497 continue; // Positioned placeholders don't affect calculations. | 497 continue; // Positioned placeholders don't affect calculations. |
498 if (curr->verticalAlign() == TOP || curr->verticalAlign() == BOTTOM) { | 498 if (curr->verticalAlign() == TOP || curr->verticalAlign() == BOTTOM) { |
499 int lineHeight = curr->lineHeight(); | 499 int lineHeight = curr->lineHeight(); |
500 if (curr->verticalAlign() == TOP) { | 500 if (curr->verticalAlign() == TOP) { |
501 if (maxAscent + maxDescent < lineHeight) | 501 if (maxAscent + maxDescent < lineHeight) |
502 maxDescent = lineHeight - maxAscent; | 502 maxDescent = lineHeight - maxAscent; |
503 } else { | 503 } else { |
504 if (maxAscent + maxDescent < lineHeight) | 504 if (maxAscent + maxDescent < lineHeight) |
505 maxAscent = lineHeight - maxDescent; | 505 maxAscent = lineHeight - maxDescent; |
506 } | 506 } |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
549 maxDescent = descent; | 549 maxDescent = descent; |
550 setMaxDescent = true; | 550 setMaxDescent = true; |
551 } | 551 } |
552 } | 552 } |
553 } | 553 } |
554 | 554 |
555 if (!checkChildren) | 555 if (!checkChildren) |
556 return; | 556 return; |
557 | 557 |
558 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { | 558 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { |
559 if (curr->renderer().isOutOfFlowPositioned()) | 559 if (curr->layoutObject().isOutOfFlowPositioned()) |
560 continue; // Positioned placeholders don't affect calculations. | 560 continue; // Positioned placeholders don't affect calculations. |
561 | 561 |
562 InlineFlowBox* inlineFlowBox = curr->isInlineFlowBox() ? toInlineFlowBox
(curr) : 0; | 562 InlineFlowBox* inlineFlowBox = curr->isInlineFlowBox() ? toInlineFlowBox
(curr) : 0; |
563 | 563 |
564 bool affectsAscent = false; | 564 bool affectsAscent = false; |
565 bool affectsDescent = false; | 565 bool affectsDescent = false; |
566 | 566 |
567 // The verticalPositionForBox function returns the distance between the
child box's baseline | 567 // The verticalPositionForBox function returns the distance between the
child box's baseline |
568 // and the root box's baseline. The value is negative if the child box'
s baseline is above the | 568 // and the root box's baseline. The value is negative if the child box'
s baseline is above the |
569 // root box's baseline, and it is positive if the child box's baseline i
s below the root box's baseline. | 569 // root box's baseline, and it is positive if the child box's baseline i
s below the root box's baseline. |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
602 | 602 |
603 if (inlineFlowBox) | 603 if (inlineFlowBox) |
604 inlineFlowBox->computeLogicalBoxHeights(rootBox, maxPositionTop, max
PositionBottom, maxAscent, maxDescent, setMaxAscent, setMaxDescent, strictMode,
textBoxDataMap, baselineType, verticalPositionCache); | 604 inlineFlowBox->computeLogicalBoxHeights(rootBox, maxPositionTop, max
PositionBottom, maxAscent, maxDescent, setMaxAscent, setMaxDescent, strictMode,
textBoxDataMap, baselineType, verticalPositionCache); |
605 } | 605 } |
606 } | 606 } |
607 | 607 |
608 void InlineFlowBox::placeBoxesInBlockDirection(LayoutUnit top, LayoutUnit maxHei
ght, int maxAscent, bool strictMode, LayoutUnit& lineTop, LayoutUnit& lineBottom
, LayoutUnit& selectionBottom, bool& setLineTop, LayoutUnit& lineTopIncludingMar
gins, LayoutUnit& lineBottomIncludingMargins, bool& hasAnnotationsBefore, bool&
hasAnnotationsAfter, FontBaseline baselineType) | 608 void InlineFlowBox::placeBoxesInBlockDirection(LayoutUnit top, LayoutUnit maxHei
ght, int maxAscent, bool strictMode, LayoutUnit& lineTop, LayoutUnit& lineBottom
, LayoutUnit& selectionBottom, bool& setLineTop, LayoutUnit& lineTopIncludingMar
gins, LayoutUnit& lineBottomIncludingMargins, bool& hasAnnotationsBefore, bool&
hasAnnotationsAfter, FontBaseline baselineType) |
609 { | 609 { |
610 bool isRootBox = isRootInlineBox(); | 610 bool isRootBox = isRootInlineBox(); |
611 if (isRootBox) { | 611 if (isRootBox) { |
612 const FontMetrics& fontMetrics = renderer().style(isFirstLineStyle())->f
ontMetrics(); | 612 const FontMetrics& fontMetrics = layoutObject().style(isFirstLineStyle()
)->fontMetrics(); |
613 // RootInlineBoxes are always placed on at pixel boundaries in their log
ical y direction. Not doing | 613 // RootInlineBoxes are always placed on at pixel boundaries in their log
ical y direction. Not doing |
614 // so results in incorrect rendering of text decorations, most notably u
nderlines. | 614 // so results in incorrect rendering of text decorations, most notably u
nderlines. |
615 setLogicalTop(roundToInt(top + maxAscent - fontMetrics.ascent(baselineTy
pe))); | 615 setLogicalTop(roundToInt(top + maxAscent - fontMetrics.ascent(baselineTy
pe))); |
616 } | 616 } |
617 | 617 |
618 LayoutUnit adjustmentForChildrenWithSameLineHeightAndBaseline = 0; | 618 LayoutUnit adjustmentForChildrenWithSameLineHeightAndBaseline = 0; |
619 if (descendantsHaveSameLineHeightAndBaseline()) { | 619 if (descendantsHaveSameLineHeightAndBaseline()) { |
620 adjustmentForChildrenWithSameLineHeightAndBaseline = logicalTop(); | 620 adjustmentForChildrenWithSameLineHeightAndBaseline = logicalTop(); |
621 if (parent()) | 621 if (parent()) |
622 adjustmentForChildrenWithSameLineHeightAndBaseline += (boxModelObjec
t()->borderBefore() + boxModelObject()->paddingBefore()); | 622 adjustmentForChildrenWithSameLineHeightAndBaseline += (boxModelObjec
t()->borderBefore() + boxModelObject()->paddingBefore()); |
623 } | 623 } |
624 | 624 |
625 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { | 625 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { |
626 if (curr->renderer().isOutOfFlowPositioned()) | 626 if (curr->layoutObject().isOutOfFlowPositioned()) |
627 continue; // Positioned placeholders don't affect calculations. | 627 continue; // Positioned placeholders don't affect calculations. |
628 | 628 |
629 if (descendantsHaveSameLineHeightAndBaseline()) { | 629 if (descendantsHaveSameLineHeightAndBaseline()) { |
630 curr->adjustBlockDirectionPosition(adjustmentForChildrenWithSameLine
HeightAndBaseline.toFloat()); | 630 curr->adjustBlockDirectionPosition(adjustmentForChildrenWithSameLine
HeightAndBaseline.toFloat()); |
631 continue; | 631 continue; |
632 } | 632 } |
633 | 633 |
634 InlineFlowBox* inlineFlowBox = curr->isInlineFlowBox() ? toInlineFlowBox
(curr) : 0; | 634 InlineFlowBox* inlineFlowBox = curr->isInlineFlowBox() ? toInlineFlowBox
(curr) : 0; |
635 bool childAffectsTopBottomPos = true; | 635 bool childAffectsTopBottomPos = true; |
636 if (curr->verticalAlign() == TOP) { | 636 if (curr->verticalAlign() == TOP) { |
637 curr->setLogicalTop(top.toFloat()); | 637 curr->setLogicalTop(top.toFloat()); |
638 } else if (curr->verticalAlign() == BOTTOM) { | 638 } else if (curr->verticalAlign() == BOTTOM) { |
639 curr->setLogicalTop((top + maxHeight - curr->lineHeight()).toFloat()
); | 639 curr->setLogicalTop((top + maxHeight - curr->lineHeight()).toFloat()
); |
640 } else { | 640 } else { |
641 if (!strictMode && inlineFlowBox && !inlineFlowBox->hasTextChildren(
) && !curr->boxModelObject()->hasInlineDirectionBordersOrPadding() | 641 if (!strictMode && inlineFlowBox && !inlineFlowBox->hasTextChildren(
) && !curr->boxModelObject()->hasInlineDirectionBordersOrPadding() |
642 && !(inlineFlowBox->descendantsHaveSameLineHeightAndBaseline() &
& inlineFlowBox->hasTextDescendants())) | 642 && !(inlineFlowBox->descendantsHaveSameLineHeightAndBaseline() &
& inlineFlowBox->hasTextDescendants())) |
643 childAffectsTopBottomPos = false; | 643 childAffectsTopBottomPos = false; |
644 LayoutUnit posAdjust = maxAscent - curr->baselinePosition(baselineTy
pe); | 644 LayoutUnit posAdjust = maxAscent - curr->baselinePosition(baselineTy
pe); |
645 curr->setLogicalTop(curr->logicalTop() + top + posAdjust); | 645 curr->setLogicalTop(curr->logicalTop() + top + posAdjust); |
646 } | 646 } |
647 | 647 |
648 LayoutUnit newLogicalTop = curr->logicalTop(); | 648 LayoutUnit newLogicalTop = curr->logicalTop(); |
649 LayoutUnit newLogicalTopIncludingMargins = newLogicalTop; | 649 LayoutUnit newLogicalTopIncludingMargins = newLogicalTop; |
650 LayoutUnit boxHeight = curr->logicalHeight(); | 650 LayoutUnit boxHeight = curr->logicalHeight(); |
651 LayoutUnit boxHeightIncludingMargins = boxHeight; | 651 LayoutUnit boxHeightIncludingMargins = boxHeight; |
652 LayoutUnit borderPaddingHeight = 0; | 652 LayoutUnit borderPaddingHeight = 0; |
653 if (curr->isText() || curr->isInlineFlowBox()) { | 653 if (curr->isText() || curr->isInlineFlowBox()) { |
654 const FontMetrics& fontMetrics = curr->renderer().style(isFirstLineS
tyle())->fontMetrics(); | 654 const FontMetrics& fontMetrics = curr->layoutObject().style(isFirstL
ineStyle())->fontMetrics(); |
655 newLogicalTop += curr->baselinePosition(baselineType) - fontMetrics.
ascent(baselineType); | 655 newLogicalTop += curr->baselinePosition(baselineType) - fontMetrics.
ascent(baselineType); |
656 if (curr->isInlineFlowBox()) { | 656 if (curr->isInlineFlowBox()) { |
657 LayoutBoxModelObject& boxObject = toLayoutBoxModelObject(curr->r
enderer()); | 657 LayoutBoxModelObject& boxObject = toLayoutBoxModelObject(curr->l
ayoutObject()); |
658 newLogicalTop -= boxObject.style(isFirstLineStyle())->isHorizont
alWritingMode() ? boxObject.borderTop() + boxObject.paddingTop() : | 658 newLogicalTop -= boxObject.style(isFirstLineStyle())->isHorizont
alWritingMode() ? boxObject.borderTop() + boxObject.paddingTop() : |
659 boxObject.borderRight() + boxObject.paddingRight(); | 659 boxObject.borderRight() + boxObject.paddingRight(); |
660 borderPaddingHeight = boxObject.borderAndPaddingLogicalHeight(); | 660 borderPaddingHeight = boxObject.borderAndPaddingLogicalHeight(); |
661 } | 661 } |
662 newLogicalTopIncludingMargins = newLogicalTop; | 662 newLogicalTopIncludingMargins = newLogicalTop; |
663 } else if (!curr->renderer().isBR()) { | 663 } else if (!curr->layoutObject().isBR()) { |
664 LayoutBox& box = toLayoutBox(curr->renderer()); | 664 LayoutBox& box = toLayoutBox(curr->layoutObject()); |
665 newLogicalTopIncludingMargins = newLogicalTop; | 665 newLogicalTopIncludingMargins = newLogicalTop; |
666 LayoutUnit overSideMargin = curr->isHorizontal() ? box.marginTop() :
box.marginRight(); | 666 LayoutUnit overSideMargin = curr->isHorizontal() ? box.marginTop() :
box.marginRight(); |
667 LayoutUnit underSideMargin = curr->isHorizontal() ? box.marginBottom
() : box.marginLeft(); | 667 LayoutUnit underSideMargin = curr->isHorizontal() ? box.marginBottom
() : box.marginLeft(); |
668 newLogicalTop += overSideMargin; | 668 newLogicalTop += overSideMargin; |
669 boxHeightIncludingMargins += overSideMargin + underSideMargin; | 669 boxHeightIncludingMargins += overSideMargin + underSideMargin; |
670 } | 670 } |
671 | 671 |
672 curr->setLogicalTop(newLogicalTop.toFloat()); | 672 curr->setLogicalTop(newLogicalTop.toFloat()); |
673 | 673 |
674 if (childAffectsTopBottomPos) { | 674 if (childAffectsTopBottomPos) { |
675 if (curr->renderer().isRubyRun()) { | 675 if (curr->layoutObject().isRubyRun()) { |
676 // Treat the leading on the first and last lines of ruby runs as
not being part of the overall lineTop/lineBottom. | 676 // Treat the leading on the first and last lines of ruby runs as
not being part of the overall lineTop/lineBottom. |
677 // Really this is a workaround hack for the fact that ruby shoul
d have been done as line layout and not done using | 677 // Really this is a workaround hack for the fact that ruby shoul
d have been done as line layout and not done using |
678 // inline-block. | 678 // inline-block. |
679 if (renderer().style()->isFlippedLinesWritingMode() == (curr->re
nderer().style()->rubyPosition() == RubyPositionAfter)) | 679 if (layoutObject().style()->isFlippedLinesWritingMode() == (curr
->layoutObject().style()->rubyPosition() == RubyPositionAfter)) |
680 hasAnnotationsBefore = true; | 680 hasAnnotationsBefore = true; |
681 else | 681 else |
682 hasAnnotationsAfter = true; | 682 hasAnnotationsAfter = true; |
683 | 683 |
684 LayoutRubyRun& rubyRun = toLayoutRubyRun(curr->renderer()); | 684 LayoutRubyRun& rubyRun = toLayoutRubyRun(curr->layoutObject()); |
685 if (LayoutRubyBase* rubyBase = rubyRun.rubyBase()) { | 685 if (LayoutRubyBase* rubyBase = rubyRun.rubyBase()) { |
686 LayoutUnit bottomRubyBaseLeading = (curr->logicalHeight() -
rubyBase->logicalBottom()) + rubyBase->logicalHeight() - (rubyBase->lastRootBox(
) ? rubyBase->lastRootBox()->lineBottom() : LayoutUnit()); | 686 LayoutUnit bottomRubyBaseLeading = (curr->logicalHeight() -
rubyBase->logicalBottom()) + rubyBase->logicalHeight() - (rubyBase->lastRootBox(
) ? rubyBase->lastRootBox()->lineBottom() : LayoutUnit()); |
687 LayoutUnit topRubyBaseLeading = rubyBase->logicalTop() + (ru
byBase->firstRootBox() ? rubyBase->firstRootBox()->lineTop() : LayoutUnit()); | 687 LayoutUnit topRubyBaseLeading = rubyBase->logicalTop() + (ru
byBase->firstRootBox() ? rubyBase->firstRootBox()->lineTop() : LayoutUnit()); |
688 newLogicalTop += !renderer().style()->isFlippedLinesWritingM
ode() ? topRubyBaseLeading : bottomRubyBaseLeading; | 688 newLogicalTop += !layoutObject().style()->isFlippedLinesWrit
ingMode() ? topRubyBaseLeading : bottomRubyBaseLeading; |
689 boxHeight -= (topRubyBaseLeading + bottomRubyBaseLeading); | 689 boxHeight -= (topRubyBaseLeading + bottomRubyBaseLeading); |
690 } | 690 } |
691 } | 691 } |
692 if (curr->isInlineTextBox()) { | 692 if (curr->isInlineTextBox()) { |
693 TextEmphasisPosition emphasisMarkPosition; | 693 TextEmphasisPosition emphasisMarkPosition; |
694 if (toInlineTextBox(curr)->getEmphasisMarkPosition(curr->rendere
r().styleRef(isFirstLineStyle()), emphasisMarkPosition)) { | 694 if (toInlineTextBox(curr)->getEmphasisMarkPosition(curr->layoutO
bject().styleRef(isFirstLineStyle()), emphasisMarkPosition)) { |
695 bool emphasisMarkIsOver = emphasisMarkPosition == TextEmphas
isPositionOver; | 695 bool emphasisMarkIsOver = emphasisMarkPosition == TextEmphas
isPositionOver; |
696 if (emphasisMarkIsOver != curr->renderer().style(isFirstLine
Style())->isFlippedLinesWritingMode()) | 696 if (emphasisMarkIsOver != curr->layoutObject().style(isFirst
LineStyle())->isFlippedLinesWritingMode()) |
697 hasAnnotationsBefore = true; | 697 hasAnnotationsBefore = true; |
698 else | 698 else |
699 hasAnnotationsAfter = true; | 699 hasAnnotationsAfter = true; |
700 } | 700 } |
701 } | 701 } |
702 | 702 |
703 if (!setLineTop) { | 703 if (!setLineTop) { |
704 setLineTop = true; | 704 setLineTop = true; |
705 lineTop = newLogicalTop; | 705 lineTop = newLogicalTop; |
706 lineTopIncludingMargins = std::min(lineTop, newLogicalTopIncludi
ngMargins); | 706 lineTopIncludingMargins = std::min(lineTop, newLogicalTopIncludi
ngMargins); |
(...skipping 20 matching lines...) Expand all Loading... |
727 lineTopIncludingMargins = lineTop; | 727 lineTopIncludingMargins = lineTop; |
728 } else { | 728 } else { |
729 lineTop = std::min<LayoutUnit>(lineTop, pixelSnappedLogicalTop()
); | 729 lineTop = std::min<LayoutUnit>(lineTop, pixelSnappedLogicalTop()
); |
730 lineTopIncludingMargins = std::min(lineTop, lineTopIncludingMarg
ins); | 730 lineTopIncludingMargins = std::min(lineTop, lineTopIncludingMarg
ins); |
731 } | 731 } |
732 selectionBottom = std::max<LayoutUnit>(selectionBottom, pixelSnapped
LogicalBottom()); | 732 selectionBottom = std::max<LayoutUnit>(selectionBottom, pixelSnapped
LogicalBottom()); |
733 lineBottom = std::max<LayoutUnit>(lineBottom, pixelSnappedLogicalBot
tom()); | 733 lineBottom = std::max<LayoutUnit>(lineBottom, pixelSnappedLogicalBot
tom()); |
734 lineBottomIncludingMargins = std::max(lineBottom, lineBottomIncludin
gMargins); | 734 lineBottomIncludingMargins = std::max(lineBottom, lineBottomIncludin
gMargins); |
735 } | 735 } |
736 | 736 |
737 if (renderer().style()->isFlippedLinesWritingMode()) | 737 if (layoutObject().style()->isFlippedLinesWritingMode()) |
738 flipLinesInBlockDirection(lineTopIncludingMargins, lineBottomIncludi
ngMargins); | 738 flipLinesInBlockDirection(lineTopIncludingMargins, lineBottomIncludi
ngMargins); |
739 } | 739 } |
740 } | 740 } |
741 | 741 |
742 void InlineFlowBox::computeMaxLogicalTop(FloatWillBeLayoutUnit& maxLogicalTop) c
onst | 742 void InlineFlowBox::computeMaxLogicalTop(FloatWillBeLayoutUnit& maxLogicalTop) c
onst |
743 { | 743 { |
744 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { | 744 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { |
745 if (curr->renderer().isOutOfFlowPositioned()) | 745 if (curr->layoutObject().isOutOfFlowPositioned()) |
746 continue; // Positioned placeholders don't affect calculations. | 746 continue; // Positioned placeholders don't affect calculations. |
747 | 747 |
748 if (descendantsHaveSameLineHeightAndBaseline()) | 748 if (descendantsHaveSameLineHeightAndBaseline()) |
749 continue; | 749 continue; |
750 | 750 |
751 maxLogicalTop = std::max<FloatWillBeLayoutUnit>(maxLogicalTop, curr->y()
); | 751 maxLogicalTop = std::max<FloatWillBeLayoutUnit>(maxLogicalTop, curr->y()
); |
752 FloatWillBeLayoutUnit localMaxLogicalTop; | 752 FloatWillBeLayoutUnit localMaxLogicalTop; |
753 if (curr->isInlineFlowBox()) | 753 if (curr->isInlineFlowBox()) |
754 toInlineFlowBox(curr)->computeMaxLogicalTop(localMaxLogicalTop); | 754 toInlineFlowBox(curr)->computeMaxLogicalTop(localMaxLogicalTop); |
755 maxLogicalTop = std::max<FloatWillBeLayoutUnit>(maxLogicalTop, localMaxL
ogicalTop); | 755 maxLogicalTop = std::max<FloatWillBeLayoutUnit>(maxLogicalTop, localMaxL
ogicalTop); |
756 } | 756 } |
757 } | 757 } |
758 | 758 |
759 void InlineFlowBox::flipLinesInBlockDirection(LayoutUnit lineTop, LayoutUnit lin
eBottom) | 759 void InlineFlowBox::flipLinesInBlockDirection(LayoutUnit lineTop, LayoutUnit lin
eBottom) |
760 { | 760 { |
761 // Flip the box on the line such that the top is now relative to the lineBot
tom instead of the lineTop. | 761 // Flip the box on the line such that the top is now relative to the lineBot
tom instead of the lineTop. |
762 setLogicalTop(lineBottom - (logicalTop() - lineTop) - logicalHeight()); | 762 setLogicalTop(lineBottom - (logicalTop() - lineTop) - logicalHeight()); |
763 | 763 |
764 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { | 764 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { |
765 if (curr->renderer().isOutOfFlowPositioned()) | 765 if (curr->layoutObject().isOutOfFlowPositioned()) |
766 continue; // Positioned placeholders aren't affected here. | 766 continue; // Positioned placeholders aren't affected here. |
767 | 767 |
768 if (curr->isInlineFlowBox()) | 768 if (curr->isInlineFlowBox()) |
769 toInlineFlowBox(curr)->flipLinesInBlockDirection(lineTop, lineBottom
); | 769 toInlineFlowBox(curr)->flipLinesInBlockDirection(lineTop, lineBottom
); |
770 else | 770 else |
771 curr->setLogicalTop(lineBottom - (curr->logicalTop() - lineTop) - cu
rr->logicalHeight()); | 771 curr->setLogicalTop(lineBottom - (curr->logicalTop() - lineTop) - cu
rr->logicalHeight()); |
772 } | 772 } |
773 } | 773 } |
774 | 774 |
775 inline void InlineFlowBox::addBoxShadowVisualOverflow(LayoutRect& logicalVisualO
verflow) | 775 inline void InlineFlowBox::addBoxShadowVisualOverflow(LayoutRect& logicalVisualO
verflow) |
776 { | 776 { |
777 // box-shadow on root line boxes is applying to the block and not to the lin
es. | 777 // box-shadow on root line boxes is applying to the block and not to the lin
es. |
778 if (!parent()) | 778 if (!parent()) |
779 return; | 779 return; |
780 | 780 |
781 const LayoutStyle& style = renderer().styleRef(isFirstLineStyle()); | 781 const LayoutStyle& style = layoutObject().styleRef(isFirstLineStyle()); |
782 WritingMode writingMode = style.writingMode(); | 782 WritingMode writingMode = style.writingMode(); |
783 ShadowList* boxShadow = style.boxShadow(); | 783 ShadowList* boxShadow = style.boxShadow(); |
784 if (!boxShadow) | 784 if (!boxShadow) |
785 return; | 785 return; |
786 | 786 |
787 LayoutRectOutsets outsets(boxShadow->rectOutsetsIncludingOriginal()); | 787 LayoutRectOutsets outsets(boxShadow->rectOutsetsIncludingOriginal()); |
788 // Similar to how glyph overflow works, if our lines are flipped, then it's
actually the opposite shadow that applies, since | 788 // Similar to how glyph overflow works, if our lines are flipped, then it's
actually the opposite shadow that applies, since |
789 // the line is "upside down" in terms of block coordinates. | 789 // the line is "upside down" in terms of block coordinates. |
790 LayoutRectOutsets logicalOutsets(outsets.logicalOutsetsWithFlippedLines(writ
ingMode)); | 790 LayoutRectOutsets logicalOutsets(outsets.logicalOutsetsWithFlippedLines(writ
ingMode)); |
791 | 791 |
792 LayoutRect shadowBounds(logicalFrameRect().toLayoutRect()); | 792 LayoutRect shadowBounds(logicalFrameRect().toLayoutRect()); |
793 shadowBounds.expand(logicalOutsets); | 793 shadowBounds.expand(logicalOutsets); |
794 logicalVisualOverflow.unite(shadowBounds); | 794 logicalVisualOverflow.unite(shadowBounds); |
795 } | 795 } |
796 | 796 |
797 inline void InlineFlowBox::addBorderOutsetVisualOverflow(LayoutRect& logicalVisu
alOverflow) | 797 inline void InlineFlowBox::addBorderOutsetVisualOverflow(LayoutRect& logicalVisu
alOverflow) |
798 { | 798 { |
799 // border-image-outset on root line boxes is applying to the block and not t
o the lines. | 799 // border-image-outset on root line boxes is applying to the block and not t
o the lines. |
800 if (!parent()) | 800 if (!parent()) |
801 return; | 801 return; |
802 | 802 |
803 const LayoutStyle& style = renderer().styleRef(isFirstLineStyle()); | 803 const LayoutStyle& style = layoutObject().styleRef(isFirstLineStyle()); |
804 if (!style.hasBorderImageOutsets()) | 804 if (!style.hasBorderImageOutsets()) |
805 return; | 805 return; |
806 | 806 |
807 // Similar to how glyph overflow works, if our lines are flipped, then it's
actually the opposite border that applies, since | 807 // Similar to how glyph overflow works, if our lines are flipped, then it's
actually the opposite border that applies, since |
808 // the line is "upside down" in terms of block coordinates. vertical-rl and
horizontal-bt are the flipped line modes. | 808 // the line is "upside down" in terms of block coordinates. vertical-rl and
horizontal-bt are the flipped line modes. |
809 LayoutRectOutsets logicalOutsets = style.borderImageOutsets().logicalOutsets
WithFlippedLines(style.writingMode()); | 809 LayoutRectOutsets logicalOutsets = style.borderImageOutsets().logicalOutsets
WithFlippedLines(style.writingMode()); |
810 | 810 |
811 if (!includeLogicalLeftEdge()) | 811 if (!includeLogicalLeftEdge()) |
812 logicalOutsets.setLeft(LayoutUnit()); | 812 logicalOutsets.setLeft(LayoutUnit()); |
813 if (!includeLogicalRightEdge()) | 813 if (!includeLogicalRightEdge()) |
814 logicalOutsets.setRight(LayoutUnit()); | 814 logicalOutsets.setRight(LayoutUnit()); |
815 | 815 |
816 LayoutRect borderOutsetBounds(logicalFrameRect().toLayoutRect()); | 816 LayoutRect borderOutsetBounds(logicalFrameRect().toLayoutRect()); |
817 borderOutsetBounds.expand(logicalOutsets); | 817 borderOutsetBounds.expand(logicalOutsets); |
818 logicalVisualOverflow.unite(borderOutsetBounds); | 818 logicalVisualOverflow.unite(borderOutsetBounds); |
819 } | 819 } |
820 | 820 |
821 inline void InlineFlowBox::addOutlineVisualOverflow(LayoutRect& logicalVisualOve
rflow) | 821 inline void InlineFlowBox::addOutlineVisualOverflow(LayoutRect& logicalVisualOve
rflow) |
822 { | 822 { |
823 // Outline on root line boxes is applied to the block and not to the lines. | 823 // Outline on root line boxes is applied to the block and not to the lines. |
824 if (!parent()) | 824 if (!parent()) |
825 return; | 825 return; |
826 | 826 |
827 const LayoutStyle& style = renderer().styleRef(isFirstLineStyle()); | 827 const LayoutStyle& style = layoutObject().styleRef(isFirstLineStyle()); |
828 if (!style.hasOutline()) | 828 if (!style.hasOutline()) |
829 return; | 829 return; |
830 | 830 |
831 logicalVisualOverflow.inflate(style.outlineSize()); | 831 logicalVisualOverflow.inflate(style.outlineSize()); |
832 } | 832 } |
833 | 833 |
834 inline void InlineFlowBox::addTextBoxVisualOverflow(InlineTextBox* textBox, Glyp
hOverflowAndFallbackFontsMap& textBoxDataMap, LayoutRect& logicalVisualOverflow) | 834 inline void InlineFlowBox::addTextBoxVisualOverflow(InlineTextBox* textBox, Glyp
hOverflowAndFallbackFontsMap& textBoxDataMap, LayoutRect& logicalVisualOverflow) |
835 { | 835 { |
836 if (textBox->knownToHaveNoOverflow()) | 836 if (textBox->knownToHaveNoOverflow()) |
837 return; | 837 return; |
838 | 838 |
839 const LayoutStyle& style = textBox->renderer().styleRef(isFirstLineStyle()); | 839 const LayoutStyle& style = textBox->layoutObject().styleRef(isFirstLineStyle
()); |
840 | 840 |
841 GlyphOverflowAndFallbackFontsMap::iterator it = textBoxDataMap.find(textBox)
; | 841 GlyphOverflowAndFallbackFontsMap::iterator it = textBoxDataMap.find(textBox)
; |
842 GlyphOverflow* glyphOverflow = it == textBoxDataMap.end() ? 0 : &it->value.s
econd; | 842 GlyphOverflow* glyphOverflow = it == textBoxDataMap.end() ? 0 : &it->value.s
econd; |
843 bool isFlippedLine = style.isFlippedLinesWritingMode(); | 843 bool isFlippedLine = style.isFlippedLinesWritingMode(); |
844 | 844 |
845 int topGlyphEdge = glyphOverflow ? (isFlippedLine ? glyphOverflow->bottom :
glyphOverflow->top) : 0; | 845 int topGlyphEdge = glyphOverflow ? (isFlippedLine ? glyphOverflow->bottom :
glyphOverflow->top) : 0; |
846 int bottomGlyphEdge = glyphOverflow ? (isFlippedLine ? glyphOverflow->top :
glyphOverflow->bottom) : 0; | 846 int bottomGlyphEdge = glyphOverflow ? (isFlippedLine ? glyphOverflow->top :
glyphOverflow->bottom) : 0; |
847 int leftGlyphEdge = glyphOverflow ? glyphOverflow->left : 0; | 847 int leftGlyphEdge = glyphOverflow ? glyphOverflow->left : 0; |
848 int rightGlyphEdge = glyphOverflow ? glyphOverflow->right : 0; | 848 int rightGlyphEdge = glyphOverflow ? glyphOverflow->right : 0; |
849 | 849 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
887 LayoutUnit logicalLeftVisualOverflow = std::min(textBox->pixelSnappedLogical
Left() + childOverflowLogicalLeft, logicalVisualOverflow.x()); | 887 LayoutUnit logicalLeftVisualOverflow = std::min(textBox->pixelSnappedLogical
Left() + childOverflowLogicalLeft, logicalVisualOverflow.x()); |
888 LayoutUnit logicalRightVisualOverflow = std::max(textBox->pixelSnappedLogica
lRight() + childOverflowLogicalRight, logicalVisualOverflow.maxX()); | 888 LayoutUnit logicalRightVisualOverflow = std::max(textBox->pixelSnappedLogica
lRight() + childOverflowLogicalRight, logicalVisualOverflow.maxX()); |
889 | 889 |
890 logicalVisualOverflow = LayoutRect(logicalLeftVisualOverflow, logicalTopVisu
alOverflow, logicalRightVisualOverflow - logicalLeftVisualOverflow, logicalBotto
mVisualOverflow - logicalTopVisualOverflow); | 890 logicalVisualOverflow = LayoutRect(logicalLeftVisualOverflow, logicalTopVisu
alOverflow, logicalRightVisualOverflow - logicalLeftVisualOverflow, logicalBotto
mVisualOverflow - logicalTopVisualOverflow); |
891 | 891 |
892 textBox->setLogicalOverflowRect(logicalVisualOverflow); | 892 textBox->setLogicalOverflowRect(logicalVisualOverflow); |
893 } | 893 } |
894 | 894 |
895 inline void InlineFlowBox::addReplacedChildOverflow(const InlineBox* inlineBox,
LayoutRect& logicalLayoutOverflow, LayoutRect& logicalVisualOverflow) | 895 inline void InlineFlowBox::addReplacedChildOverflow(const InlineBox* inlineBox,
LayoutRect& logicalLayoutOverflow, LayoutRect& logicalVisualOverflow) |
896 { | 896 { |
897 LayoutBox& box = toLayoutBox(inlineBox->renderer()); | 897 LayoutBox& box = toLayoutBox(inlineBox->layoutObject()); |
898 | 898 |
899 // Visual overflow only propagates if the box doesn't have a self-painting l
ayer. This rectangle does not include | 899 // Visual overflow only propagates if the box doesn't have a self-painting l
ayer. This rectangle does not include |
900 // transforms or relative positioning (since those objects always have self-
painting layers), but it does need to be adjusted | 900 // transforms or relative positioning (since those objects always have self-
painting layers), but it does need to be adjusted |
901 // for writing-mode differences. | 901 // for writing-mode differences. |
902 if (!box.hasSelfPaintingLayer()) { | 902 if (!box.hasSelfPaintingLayer()) { |
903 LayoutRect childLogicalVisualOverflow = box.logicalVisualOverflowRectFor
Propagation(renderer().styleRef()); | 903 LayoutRect childLogicalVisualOverflow = box.logicalVisualOverflowRectFor
Propagation(layoutObject().styleRef()); |
904 childLogicalVisualOverflow.move(inlineBox->logicalLeft(), inlineBox->log
icalTop()); | 904 childLogicalVisualOverflow.move(inlineBox->logicalLeft(), inlineBox->log
icalTop()); |
905 logicalVisualOverflow.unite(childLogicalVisualOverflow); | 905 logicalVisualOverflow.unite(childLogicalVisualOverflow); |
906 } | 906 } |
907 | 907 |
908 // Layout overflow internal to the child box only propagates if the child bo
x doesn't have overflow clip set. | 908 // Layout overflow internal to the child box only propagates if the child bo
x doesn't have overflow clip set. |
909 // Otherwise the child border box propagates as layout overflow. This recta
ngle must include transforms and relative positioning | 909 // Otherwise the child border box propagates as layout overflow. This recta
ngle must include transforms and relative positioning |
910 // and be adjusted for writing-mode differences. | 910 // and be adjusted for writing-mode differences. |
911 LayoutRect childLogicalLayoutOverflow = box.logicalLayoutOverflowRectForProp
agation(renderer().styleRef()); | 911 LayoutRect childLogicalLayoutOverflow = box.logicalLayoutOverflowRectForProp
agation(layoutObject().styleRef()); |
912 childLogicalLayoutOverflow.move(inlineBox->logicalLeft(), inlineBox->logical
Top()); | 912 childLogicalLayoutOverflow.move(inlineBox->logicalLeft(), inlineBox->logical
Top()); |
913 logicalLayoutOverflow.unite(childLogicalLayoutOverflow); | 913 logicalLayoutOverflow.unite(childLogicalLayoutOverflow); |
914 } | 914 } |
915 | 915 |
916 void InlineFlowBox::computeOverflow(LayoutUnit lineTop, LayoutUnit lineBottom, G
lyphOverflowAndFallbackFontsMap& textBoxDataMap) | 916 void InlineFlowBox::computeOverflow(LayoutUnit lineTop, LayoutUnit lineBottom, G
lyphOverflowAndFallbackFontsMap& textBoxDataMap) |
917 { | 917 { |
918 // If we know we have no overflow, we can just bail. | 918 // If we know we have no overflow, we can just bail. |
919 if (knownToHaveNoOverflow()) { | 919 if (knownToHaveNoOverflow()) { |
920 ASSERT(!m_overflow); | 920 ASSERT(!m_overflow); |
921 return; | 921 return; |
922 } | 922 } |
923 | 923 |
924 if (m_overflow) | 924 if (m_overflow) |
925 m_overflow.clear(); | 925 m_overflow.clear(); |
926 | 926 |
927 // Visual overflow just includes overflow for stuff we need to issues paint
invalidations for ourselves. Self-painting layers are ignored. | 927 // Visual overflow just includes overflow for stuff we need to issues paint
invalidations for ourselves. Self-painting layers are ignored. |
928 // Layout overflow is used to determine scrolling extent, so it still includ
es child layers and also factors in | 928 // Layout overflow is used to determine scrolling extent, so it still includ
es child layers and also factors in |
929 // transforms, relative positioning, etc. | 929 // transforms, relative positioning, etc. |
930 // FIXME: the call to enclosingLayoutRect() below is temporary and should be
removed once | 930 // FIXME: the call to enclosingLayoutRect() below is temporary and should be
removed once |
931 // the transition to LayoutUnit-based types is complete (crbug.com/321237) | 931 // the transition to LayoutUnit-based types is complete (crbug.com/321237) |
932 LayoutRect logicalLayoutOverflow(logicalFrameRectIncludingLineHeight(lineTop
, lineBottom).enclosingLayoutRect()); | 932 LayoutRect logicalLayoutOverflow(logicalFrameRectIncludingLineHeight(lineTop
, lineBottom).enclosingLayoutRect()); |
933 LayoutRect logicalVisualOverflow(logicalLayoutOverflow); | 933 LayoutRect logicalVisualOverflow(logicalLayoutOverflow); |
934 | 934 |
935 addBoxShadowVisualOverflow(logicalVisualOverflow); | 935 addBoxShadowVisualOverflow(logicalVisualOverflow); |
936 addBorderOutsetVisualOverflow(logicalVisualOverflow); | 936 addBorderOutsetVisualOverflow(logicalVisualOverflow); |
937 addOutlineVisualOverflow(logicalVisualOverflow); | 937 addOutlineVisualOverflow(logicalVisualOverflow); |
938 | 938 |
939 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { | 939 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { |
940 if (curr->renderer().isOutOfFlowPositioned()) | 940 if (curr->layoutObject().isOutOfFlowPositioned()) |
941 continue; // Positioned placeholders don't affect calculations. | 941 continue; // Positioned placeholders don't affect calculations. |
942 | 942 |
943 if (curr->renderer().isText()) { | 943 if (curr->layoutObject().isText()) { |
944 InlineTextBox* text = toInlineTextBox(curr); | 944 InlineTextBox* text = toInlineTextBox(curr); |
945 LayoutText& rt = text->renderer(); | 945 LayoutText& rt = text->layoutObject(); |
946 if (rt.isBR()) | 946 if (rt.isBR()) |
947 continue; | 947 continue; |
948 // FIXME: the call to enclosingLayoutRect() below is temporary and s
hould be removed once | 948 // FIXME: the call to enclosingLayoutRect() below is temporary and s
hould be removed once |
949 // the transition to LayoutUnit-based types is complete (crbug.com/3
21237) | 949 // the transition to LayoutUnit-based types is complete (crbug.com/3
21237) |
950 LayoutRect textBoxOverflow(text->logicalFrameRect().enclosingLayoutR
ect()); | 950 LayoutRect textBoxOverflow(text->logicalFrameRect().enclosingLayoutR
ect()); |
951 addTextBoxVisualOverflow(text, textBoxDataMap, textBoxOverflow); | 951 addTextBoxVisualOverflow(text, textBoxDataMap, textBoxOverflow); |
952 logicalVisualOverflow.unite(textBoxOverflow); | 952 logicalVisualOverflow.unite(textBoxOverflow); |
953 } else if (curr->renderer().isLayoutInline()) { | 953 } else if (curr->layoutObject().isLayoutInline()) { |
954 InlineFlowBox* flow = toInlineFlowBox(curr); | 954 InlineFlowBox* flow = toInlineFlowBox(curr); |
955 flow->computeOverflow(lineTop, lineBottom, textBoxDataMap); | 955 flow->computeOverflow(lineTop, lineBottom, textBoxDataMap); |
956 if (!flow->boxModelObject()->hasSelfPaintingLayer()) | 956 if (!flow->boxModelObject()->hasSelfPaintingLayer()) |
957 logicalVisualOverflow.unite(flow->logicalVisualOverflowRect(line
Top, lineBottom)); | 957 logicalVisualOverflow.unite(flow->logicalVisualOverflowRect(line
Top, lineBottom)); |
958 LayoutRect childLayoutOverflow = flow->logicalLayoutOverflowRect(lin
eTop, lineBottom); | 958 LayoutRect childLayoutOverflow = flow->logicalLayoutOverflowRect(lin
eTop, lineBottom); |
959 childLayoutOverflow.move(flow->boxModelObject()->relativePositionLog
icalOffset()); | 959 childLayoutOverflow.move(flow->boxModelObject()->relativePositionLog
icalOffset()); |
960 logicalLayoutOverflow.unite(childLayoutOverflow); | 960 logicalLayoutOverflow.unite(childLayoutOverflow); |
961 } else { | 961 } else { |
962 addReplacedChildOverflow(curr, logicalLayoutOverflow, logicalVisualO
verflow); | 962 addReplacedChildOverflow(curr, logicalLayoutOverflow, logicalVisualO
verflow); |
963 } | 963 } |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1006 LayoutRect overflowRect(visualOverflowRect(lineTop, lineBottom)); | 1006 LayoutRect overflowRect(visualOverflowRect(lineTop, lineBottom)); |
1007 flipForWritingMode(overflowRect); | 1007 flipForWritingMode(overflowRect); |
1008 overflowRect.moveBy(accumulatedOffset); | 1008 overflowRect.moveBy(accumulatedOffset); |
1009 if (!locationInContainer.intersects(overflowRect)) | 1009 if (!locationInContainer.intersects(overflowRect)) |
1010 return false; | 1010 return false; |
1011 | 1011 |
1012 // Check children first. | 1012 // Check children first. |
1013 // We need to account for culled inline parents of the hit-tested nodes, so
that they may also get included in area-based hit-tests. | 1013 // We need to account for culled inline parents of the hit-tested nodes, so
that they may also get included in area-based hit-tests. |
1014 LayoutObject* culledParent = 0; | 1014 LayoutObject* culledParent = 0; |
1015 for (InlineBox* curr = lastChild(); curr; curr = curr->prevOnLine()) { | 1015 for (InlineBox* curr = lastChild(); curr; curr = curr->prevOnLine()) { |
1016 if (curr->renderer().isText() || !curr->boxModelObject()->hasSelfPaintin
gLayer()) { | 1016 if (curr->layoutObject().isText() || !curr->boxModelObject()->hasSelfPai
ntingLayer()) { |
1017 LayoutObject* newParent = 0; | 1017 LayoutObject* newParent = 0; |
1018 // Culled parents are only relevant for area-based hit-tests, so ign
ore it in point-based ones. | 1018 // Culled parents are only relevant for area-based hit-tests, so ign
ore it in point-based ones. |
1019 if (locationInContainer.isRectBasedTest()) { | 1019 if (locationInContainer.isRectBasedTest()) { |
1020 newParent = curr->renderer().parent(); | 1020 newParent = curr->layoutObject().parent(); |
1021 if (newParent == renderer()) | 1021 if (newParent == layoutObject()) |
1022 newParent = 0; | 1022 newParent = 0; |
1023 } | 1023 } |
1024 // Check the culled parent after all its children have been checked,
to do this we wait until | 1024 // Check the culled parent after all its children have been checked,
to do this we wait until |
1025 // we are about to test an element with a different parent. | 1025 // we are about to test an element with a different parent. |
1026 if (newParent != culledParent) { | 1026 if (newParent != culledParent) { |
1027 if (!newParent || !newParent->isDescendantOf(culledParent)) { | 1027 if (!newParent || !newParent->isDescendantOf(culledParent)) { |
1028 while (culledParent && culledParent != renderer() && culledP
arent != newParent) { | 1028 while (culledParent && culledParent != layoutObject() && cul
ledParent != newParent) { |
1029 if (culledParent->isLayoutInline() && toLayoutInline(cul
ledParent)->hitTestCulledInline(request, result, locationInContainer, accumulate
dOffset)) | 1029 if (culledParent->isLayoutInline() && toLayoutInline(cul
ledParent)->hitTestCulledInline(request, result, locationInContainer, accumulate
dOffset)) |
1030 return true; | 1030 return true; |
1031 culledParent = culledParent->parent(); | 1031 culledParent = culledParent->parent(); |
1032 } | 1032 } |
1033 } | 1033 } |
1034 culledParent = newParent; | 1034 culledParent = newParent; |
1035 } | 1035 } |
1036 if (curr->nodeAtPoint(request, result, locationInContainer, accumula
tedOffset, lineTop, lineBottom)) { | 1036 if (curr->nodeAtPoint(request, result, locationInContainer, accumula
tedOffset, lineTop, lineBottom)) { |
1037 renderer().updateHitTestResult(result, locationInContainer.point
() - toLayoutSize(accumulatedOffset)); | 1037 layoutObject().updateHitTestResult(result, locationInContainer.p
oint() - toLayoutSize(accumulatedOffset)); |
1038 return true; | 1038 return true; |
1039 } | 1039 } |
1040 } | 1040 } |
1041 } | 1041 } |
1042 // Check any culled ancestor of the final children tested. | 1042 // Check any culled ancestor of the final children tested. |
1043 while (culledParent && culledParent != renderer()) { | 1043 while (culledParent && culledParent != layoutObject()) { |
1044 if (culledParent->isLayoutInline() && toLayoutInline(culledParent)->hitT
estCulledInline(request, result, locationInContainer, accumulatedOffset)) | 1044 if (culledParent->isLayoutInline() && toLayoutInline(culledParent)->hitT
estCulledInline(request, result, locationInContainer, accumulatedOffset)) |
1045 return true; | 1045 return true; |
1046 culledParent = culledParent->parent(); | 1046 culledParent = culledParent->parent(); |
1047 } | 1047 } |
1048 | 1048 |
1049 // Now check ourselves. Pixel snap hit testing. | 1049 // Now check ourselves. Pixel snap hit testing. |
1050 LayoutRect frameRect(roundedFrameRect()); | 1050 LayoutRect frameRect(roundedFrameRect()); |
1051 LayoutUnit minX = frameRect.x(); | 1051 LayoutUnit minX = frameRect.x(); |
1052 LayoutUnit minY = frameRect.y(); | 1052 LayoutUnit minY = frameRect.y(); |
1053 LayoutUnit width = frameRect.width(); | 1053 LayoutUnit width = frameRect.width(); |
1054 LayoutUnit height = frameRect.height(); | 1054 LayoutUnit height = frameRect.height(); |
1055 | 1055 |
1056 // Constrain our hit testing to the line top and bottom if necessary. | 1056 // Constrain our hit testing to the line top and bottom if necessary. |
1057 bool noQuirksMode = renderer().document().inNoQuirksMode(); | 1057 bool noQuirksMode = layoutObject().document().inNoQuirksMode(); |
1058 if (!noQuirksMode && !hasTextChildren() && !(descendantsHaveSameLineHeightAn
dBaseline() && hasTextDescendants())) { | 1058 if (!noQuirksMode && !hasTextChildren() && !(descendantsHaveSameLineHeightAn
dBaseline() && hasTextDescendants())) { |
1059 RootInlineBox& rootBox = root(); | 1059 RootInlineBox& rootBox = root(); |
1060 LayoutUnit& top = isHorizontal() ? minY : minX; | 1060 LayoutUnit& top = isHorizontal() ? minY : minX; |
1061 LayoutUnit& logicalHeight = isHorizontal() ? height : width; | 1061 LayoutUnit& logicalHeight = isHorizontal() ? height : width; |
1062 LayoutUnit bottom = std::min(rootBox.lineBottom(), top + logicalHeight); | 1062 LayoutUnit bottom = std::min(rootBox.lineBottom(), top + logicalHeight); |
1063 top = std::max(rootBox.lineTop(), top); | 1063 top = std::max(rootBox.lineTop(), top); |
1064 logicalHeight = bottom - top; | 1064 logicalHeight = bottom - top; |
1065 } | 1065 } |
1066 | 1066 |
1067 // Move x/y to our coordinates. | 1067 // Move x/y to our coordinates. |
1068 LayoutRect rect(minX, minY, width, height); | 1068 LayoutRect rect(minX, minY, width, height); |
1069 flipForWritingMode(rect); | 1069 flipForWritingMode(rect); |
1070 rect.moveBy(accumulatedOffset); | 1070 rect.moveBy(accumulatedOffset); |
1071 | 1071 |
1072 if (visibleToHitTestRequest(request) && locationInContainer.intersects(rect)
) { | 1072 if (visibleToHitTestRequest(request) && locationInContainer.intersects(rect)
) { |
1073 renderer().updateHitTestResult(result, flipForWritingMode(locationInCont
ainer.point() - toLayoutSize(accumulatedOffset))); // Don't add in m_x or m_y he
re, we want coords in the containing block's space. | 1073 layoutObject().updateHitTestResult(result, flipForWritingMode(locationIn
Container.point() - toLayoutSize(accumulatedOffset))); // Don't add in m_x or m_
y here, we want coords in the containing block's space. |
1074 if (!result.addNodeToListBasedTestResult(renderer().node(), request, loc
ationInContainer, rect)) | 1074 if (!result.addNodeToListBasedTestResult(layoutObject().node(), request,
locationInContainer, rect)) |
1075 return true; | 1075 return true; |
1076 } | 1076 } |
1077 | 1077 |
1078 return false; | 1078 return false; |
1079 } | 1079 } |
1080 | 1080 |
1081 void InlineFlowBox::paint(const PaintInfo& paintInfo, const LayoutPoint& paintOf
fset, LayoutUnit lineTop, LayoutUnit lineBottom) | 1081 void InlineFlowBox::paint(const PaintInfo& paintInfo, const LayoutPoint& paintOf
fset, LayoutUnit lineTop, LayoutUnit lineBottom) |
1082 { | 1082 { |
1083 InlineFlowBoxPainter(*this).paint(paintInfo, paintOffset, lineTop, lineBotto
m); | 1083 InlineFlowBoxPainter(*this).paint(paintInfo, paintOffset, lineTop, lineBotto
m); |
1084 } | 1084 } |
1085 | 1085 |
1086 bool InlineFlowBox::boxShadowCanBeAppliedToBackground(const FillLayer& lastBackg
roundLayer) const | 1086 bool InlineFlowBox::boxShadowCanBeAppliedToBackground(const FillLayer& lastBackg
roundLayer) const |
1087 { | 1087 { |
1088 // The checks here match how paintFillLayer() decides whether to clip (if it
does, the shadow | 1088 // The checks here match how paintFillLayer() decides whether to clip (if it
does, the shadow |
1089 // would be clipped out, so it has to be drawn separately). | 1089 // would be clipped out, so it has to be drawn separately). |
1090 StyleImage* image = lastBackgroundLayer.image(); | 1090 StyleImage* image = lastBackgroundLayer.image(); |
1091 bool hasFillImage = image && image->canRender(renderer(), renderer().style()
->effectiveZoom()); | 1091 bool hasFillImage = image && image->canRender(layoutObject(), layoutObject()
.style()->effectiveZoom()); |
1092 return (!hasFillImage && !renderer().style()->hasBorderRadius()) || (!prevLi
neBox() && !nextLineBox()) || !parent(); | 1092 return (!hasFillImage && !layoutObject().style()->hasBorderRadius()) || (!pr
evLineBox() && !nextLineBox()) || !parent(); |
1093 } | 1093 } |
1094 | 1094 |
1095 InlineBox* InlineFlowBox::firstLeafChild() const | 1095 InlineBox* InlineFlowBox::firstLeafChild() const |
1096 { | 1096 { |
1097 InlineBox* leaf = 0; | 1097 InlineBox* leaf = 0; |
1098 for (InlineBox* child = firstChild(); child && !leaf; child = child->nextOnL
ine()) | 1098 for (InlineBox* child = firstChild(); child && !leaf; child = child->nextOnL
ine()) |
1099 leaf = child->isLeaf() ? child : toInlineFlowBox(child)->firstLeafChild(
); | 1099 leaf = child->isLeaf() ? child : toInlineFlowBox(child)->firstLeafChild(
); |
1100 return leaf; | 1100 return leaf; |
1101 } | 1101 } |
1102 | 1102 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1154 void InlineFlowBox::clearTruncation() | 1154 void InlineFlowBox::clearTruncation() |
1155 { | 1155 { |
1156 for (InlineBox *box = firstChild(); box; box = box->nextOnLine()) | 1156 for (InlineBox *box = firstChild(); box; box = box->nextOnLine()) |
1157 box->clearTruncation(); | 1157 box->clearTruncation(); |
1158 } | 1158 } |
1159 | 1159 |
1160 LayoutUnit InlineFlowBox::computeOverAnnotationAdjustment(LayoutUnit allowedPosi
tion) const | 1160 LayoutUnit InlineFlowBox::computeOverAnnotationAdjustment(LayoutUnit allowedPosi
tion) const |
1161 { | 1161 { |
1162 LayoutUnit result = 0; | 1162 LayoutUnit result = 0; |
1163 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { | 1163 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { |
1164 if (curr->renderer().isOutOfFlowPositioned()) | 1164 if (curr->layoutObject().isOutOfFlowPositioned()) |
1165 continue; // Positioned placeholders don't affect calculations. | 1165 continue; // Positioned placeholders don't affect calculations. |
1166 | 1166 |
1167 if (curr->isInlineFlowBox()) | 1167 if (curr->isInlineFlowBox()) |
1168 result = std::max(result, toInlineFlowBox(curr)->computeOverAnnotati
onAdjustment(allowedPosition)); | 1168 result = std::max(result, toInlineFlowBox(curr)->computeOverAnnotati
onAdjustment(allowedPosition)); |
1169 | 1169 |
1170 if (curr->renderer().isReplaced() && curr->renderer().isRubyRun() && cur
r->renderer().style()->rubyPosition() == RubyPositionBefore) { | 1170 if (curr->layoutObject().isReplaced() && curr->layoutObject().isRubyRun(
) && curr->layoutObject().style()->rubyPosition() == RubyPositionBefore) { |
1171 LayoutRubyRun& rubyRun = toLayoutRubyRun(curr->renderer()); | 1171 LayoutRubyRun& rubyRun = toLayoutRubyRun(curr->layoutObject()); |
1172 LayoutRubyText* rubyText = rubyRun.rubyText(); | 1172 LayoutRubyText* rubyText = rubyRun.rubyText(); |
1173 if (!rubyText) | 1173 if (!rubyText) |
1174 continue; | 1174 continue; |
1175 | 1175 |
1176 if (!rubyRun.style()->isFlippedLinesWritingMode()) { | 1176 if (!rubyRun.style()->isFlippedLinesWritingMode()) { |
1177 LayoutUnit topOfFirstRubyTextLine = rubyText->logicalTop() + (ru
byText->firstRootBox() ? rubyText->firstRootBox()->lineTop() : LayoutUnit()); | 1177 LayoutUnit topOfFirstRubyTextLine = rubyText->logicalTop() + (ru
byText->firstRootBox() ? rubyText->firstRootBox()->lineTop() : LayoutUnit()); |
1178 if (topOfFirstRubyTextLine >= 0) | 1178 if (topOfFirstRubyTextLine >= 0) |
1179 continue; | 1179 continue; |
1180 topOfFirstRubyTextLine += curr->logicalTop(); | 1180 topOfFirstRubyTextLine += curr->logicalTop(); |
1181 result = std::max(result, allowedPosition - topOfFirstRubyTextLi
ne); | 1181 result = std::max(result, allowedPosition - topOfFirstRubyTextLi
ne); |
1182 } else { | 1182 } else { |
1183 LayoutUnit bottomOfLastRubyTextLine = rubyText->logicalTop() + (
rubyText->lastRootBox() ? rubyText->lastRootBox()->lineBottom() : rubyText->logi
calHeight()); | 1183 LayoutUnit bottomOfLastRubyTextLine = rubyText->logicalTop() + (
rubyText->lastRootBox() ? rubyText->lastRootBox()->lineBottom() : rubyText->logi
calHeight()); |
1184 if (bottomOfLastRubyTextLine <= curr->logicalHeight()) | 1184 if (bottomOfLastRubyTextLine <= curr->logicalHeight()) |
1185 continue; | 1185 continue; |
1186 bottomOfLastRubyTextLine += curr->logicalTop(); | 1186 bottomOfLastRubyTextLine += curr->logicalTop(); |
1187 result = std::max(result, bottomOfLastRubyTextLine - allowedPosi
tion); | 1187 result = std::max(result, bottomOfLastRubyTextLine - allowedPosi
tion); |
1188 } | 1188 } |
1189 } | 1189 } |
1190 | 1190 |
1191 if (curr->isInlineTextBox()) { | 1191 if (curr->isInlineTextBox()) { |
1192 const LayoutStyle& style = curr->renderer().styleRef(isFirstLineStyl
e()); | 1192 const LayoutStyle& style = curr->layoutObject().styleRef(isFirstLine
Style()); |
1193 TextEmphasisPosition emphasisMarkPosition; | 1193 TextEmphasisPosition emphasisMarkPosition; |
1194 if (style.textEmphasisMark() != TextEmphasisMarkNone && toInlineText
Box(curr)->getEmphasisMarkPosition(style, emphasisMarkPosition) && emphasisMarkP
osition == TextEmphasisPositionOver) { | 1194 if (style.textEmphasisMark() != TextEmphasisMarkNone && toInlineText
Box(curr)->getEmphasisMarkPosition(style, emphasisMarkPosition) && emphasisMarkP
osition == TextEmphasisPositionOver) { |
1195 if (!style.isFlippedLinesWritingMode()) { | 1195 if (!style.isFlippedLinesWritingMode()) { |
1196 int topOfEmphasisMark = curr->logicalTop() - style.font().em
phasisMarkHeight(style.textEmphasisMarkString()); | 1196 int topOfEmphasisMark = curr->logicalTop() - style.font().em
phasisMarkHeight(style.textEmphasisMarkString()); |
1197 result = std::max(result, allowedPosition - topOfEmphasisMar
k); | 1197 result = std::max(result, allowedPosition - topOfEmphasisMar
k); |
1198 } else { | 1198 } else { |
1199 int bottomOfEmphasisMark = curr->logicalBottom() + style.fon
t().emphasisMarkHeight(style.textEmphasisMarkString()); | 1199 int bottomOfEmphasisMark = curr->logicalBottom() + style.fon
t().emphasisMarkHeight(style.textEmphasisMarkString()); |
1200 result = std::max(result, bottomOfEmphasisMark - allowedPosi
tion); | 1200 result = std::max(result, bottomOfEmphasisMark - allowedPosi
tion); |
1201 } | 1201 } |
1202 } | 1202 } |
1203 } | 1203 } |
1204 } | 1204 } |
1205 return result; | 1205 return result; |
1206 } | 1206 } |
1207 | 1207 |
1208 LayoutUnit InlineFlowBox::computeUnderAnnotationAdjustment(LayoutUnit allowedPos
ition) const | 1208 LayoutUnit InlineFlowBox::computeUnderAnnotationAdjustment(LayoutUnit allowedPos
ition) const |
1209 { | 1209 { |
1210 LayoutUnit result = 0; | 1210 LayoutUnit result = 0; |
1211 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { | 1211 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { |
1212 if (curr->renderer().isOutOfFlowPositioned()) | 1212 if (curr->layoutObject().isOutOfFlowPositioned()) |
1213 continue; // Positioned placeholders don't affect calculations. | 1213 continue; // Positioned placeholders don't affect calculations. |
1214 | 1214 |
1215 if (curr->isInlineFlowBox()) | 1215 if (curr->isInlineFlowBox()) |
1216 result = std::max(result, toInlineFlowBox(curr)->computeUnderAnnotat
ionAdjustment(allowedPosition)); | 1216 result = std::max(result, toInlineFlowBox(curr)->computeUnderAnnotat
ionAdjustment(allowedPosition)); |
1217 | 1217 |
1218 if (curr->renderer().isReplaced() && curr->renderer().isRubyRun() && cur
r->renderer().style()->rubyPosition() == RubyPositionAfter) { | 1218 if (curr->layoutObject().isReplaced() && curr->layoutObject().isRubyRun(
) && curr->layoutObject().style()->rubyPosition() == RubyPositionAfter) { |
1219 LayoutRubyRun& rubyRun = toLayoutRubyRun(curr->renderer()); | 1219 LayoutRubyRun& rubyRun = toLayoutRubyRun(curr->layoutObject()); |
1220 LayoutRubyText* rubyText = rubyRun.rubyText(); | 1220 LayoutRubyText* rubyText = rubyRun.rubyText(); |
1221 if (!rubyText) | 1221 if (!rubyText) |
1222 continue; | 1222 continue; |
1223 | 1223 |
1224 if (rubyRun.style()->isFlippedLinesWritingMode()) { | 1224 if (rubyRun.style()->isFlippedLinesWritingMode()) { |
1225 LayoutUnit topOfFirstRubyTextLine = rubyText->logicalTop() + (ru
byText->firstRootBox() ? rubyText->firstRootBox()->lineTop() : LayoutUnit()); | 1225 LayoutUnit topOfFirstRubyTextLine = rubyText->logicalTop() + (ru
byText->firstRootBox() ? rubyText->firstRootBox()->lineTop() : LayoutUnit()); |
1226 if (topOfFirstRubyTextLine >= 0) | 1226 if (topOfFirstRubyTextLine >= 0) |
1227 continue; | 1227 continue; |
1228 topOfFirstRubyTextLine += curr->logicalTop(); | 1228 topOfFirstRubyTextLine += curr->logicalTop(); |
1229 result = std::max(result, allowedPosition - topOfFirstRubyTextLi
ne); | 1229 result = std::max(result, allowedPosition - topOfFirstRubyTextLi
ne); |
1230 } else { | 1230 } else { |
1231 LayoutUnit bottomOfLastRubyTextLine = rubyText->logicalTop() + (
rubyText->lastRootBox() ? rubyText->lastRootBox()->lineBottom() : rubyText->logi
calHeight()); | 1231 LayoutUnit bottomOfLastRubyTextLine = rubyText->logicalTop() + (
rubyText->lastRootBox() ? rubyText->lastRootBox()->lineBottom() : rubyText->logi
calHeight()); |
1232 if (bottomOfLastRubyTextLine <= curr->logicalHeight()) | 1232 if (bottomOfLastRubyTextLine <= curr->logicalHeight()) |
1233 continue; | 1233 continue; |
1234 bottomOfLastRubyTextLine += curr->logicalTop(); | 1234 bottomOfLastRubyTextLine += curr->logicalTop(); |
1235 result = std::max(result, bottomOfLastRubyTextLine - allowedPosi
tion); | 1235 result = std::max(result, bottomOfLastRubyTextLine - allowedPosi
tion); |
1236 } | 1236 } |
1237 } | 1237 } |
1238 | 1238 |
1239 if (curr->isInlineTextBox()) { | 1239 if (curr->isInlineTextBox()) { |
1240 const LayoutStyle& style = curr->renderer().styleRef(isFirstLineStyl
e()); | 1240 const LayoutStyle& style = curr->layoutObject().styleRef(isFirstLine
Style()); |
1241 if (style.textEmphasisMark() != TextEmphasisMarkNone && style.textEm
phasisPosition() == TextEmphasisPositionUnder) { | 1241 if (style.textEmphasisMark() != TextEmphasisMarkNone && style.textEm
phasisPosition() == TextEmphasisPositionUnder) { |
1242 if (!style.isFlippedLinesWritingMode()) { | 1242 if (!style.isFlippedLinesWritingMode()) { |
1243 LayoutUnit bottomOfEmphasisMark = curr->logicalBottom() + st
yle.font().emphasisMarkHeight(style.textEmphasisMarkString()); | 1243 LayoutUnit bottomOfEmphasisMark = curr->logicalBottom() + st
yle.font().emphasisMarkHeight(style.textEmphasisMarkString()); |
1244 result = std::max(result, bottomOfEmphasisMark - allowedPosi
tion); | 1244 result = std::max(result, bottomOfEmphasisMark - allowedPosi
tion); |
1245 } else { | 1245 } else { |
1246 LayoutUnit topOfEmphasisMark = curr->logicalTop() - style.fo
nt().emphasisMarkHeight(style.textEmphasisMarkString()); | 1246 LayoutUnit topOfEmphasisMark = curr->logicalTop() - style.fo
nt().emphasisMarkHeight(style.textEmphasisMarkString()); |
1247 result = std::max(result, allowedPosition - topOfEmphasisMar
k); | 1247 result = std::max(result, allowedPosition - topOfEmphasisMar
k); |
1248 } | 1248 } |
1249 } | 1249 } |
1250 } | 1250 } |
(...skipping 10 matching lines...) Expand all Loading... |
1261 unsigned char minLevel = 128; | 1261 unsigned char minLevel = 128; |
1262 unsigned char maxLevel = 0; | 1262 unsigned char maxLevel = 0; |
1263 | 1263 |
1264 // First find highest and lowest levels, and initialize leafBoxesInLogicalOr
der with the leaf boxes in visual order. | 1264 // First find highest and lowest levels, and initialize leafBoxesInLogicalOr
der with the leaf boxes in visual order. |
1265 for (; leaf; leaf = leaf->nextLeafChild()) { | 1265 for (; leaf; leaf = leaf->nextLeafChild()) { |
1266 minLevel = std::min(minLevel, leaf->bidiLevel()); | 1266 minLevel = std::min(minLevel, leaf->bidiLevel()); |
1267 maxLevel = std::max(maxLevel, leaf->bidiLevel()); | 1267 maxLevel = std::max(maxLevel, leaf->bidiLevel()); |
1268 leafBoxesInLogicalOrder.append(leaf); | 1268 leafBoxesInLogicalOrder.append(leaf); |
1269 } | 1269 } |
1270 | 1270 |
1271 if (renderer().style()->rtlOrdering() == VisualOrder) | 1271 if (layoutObject().style()->rtlOrdering() == VisualOrder) |
1272 return; | 1272 return; |
1273 | 1273 |
1274 // Reverse of reordering of the line (L2 according to Bidi spec): | 1274 // Reverse of reordering of the line (L2 according to Bidi spec): |
1275 // L2. From the highest level found in the text to the lowest odd level on e
ach line, | 1275 // L2. From the highest level found in the text to the lowest odd level on e
ach line, |
1276 // reverse any contiguous sequence of characters that are at that level or h
igher. | 1276 // reverse any contiguous sequence of characters that are at that level or h
igher. |
1277 | 1277 |
1278 // Reversing the reordering of the line is only done up to the lowest odd le
vel. | 1278 // Reversing the reordering of the line is only done up to the lowest odd le
vel. |
1279 if (!(minLevel % 2)) | 1279 if (!(minLevel % 2)) |
1280 ++minLevel; | 1280 ++minLevel; |
1281 | 1281 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1333 ASSERT(child->prevOnLine() == prev); | 1333 ASSERT(child->prevOnLine() == prev); |
1334 prev = child; | 1334 prev = child; |
1335 } | 1335 } |
1336 ASSERT(prev == m_lastChild); | 1336 ASSERT(prev == m_lastChild); |
1337 #endif | 1337 #endif |
1338 } | 1338 } |
1339 | 1339 |
1340 #endif | 1340 #endif |
1341 | 1341 |
1342 } // namespace blink | 1342 } // namespace blink |
OLD | NEW |