| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2003, 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. | 2 * Copyright (C) 2003, 2004, 2005, 2006, 2007 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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 for (InlineBox* child = firstChild(); child; child = child->nextOnLine()
) | 48 for (InlineBox* child = firstChild(); child; child = child->nextOnLine()
) |
| 49 child->setHasBadParent(); | 49 child->setHasBadParent(); |
| 50 } | 50 } |
| 51 | 51 |
| 52 #endif | 52 #endif |
| 53 | 53 |
| 54 int InlineFlowBox::marginLeft() | 54 int InlineFlowBox::marginLeft() |
| 55 { | 55 { |
| 56 if (!includeLeftEdge()) | 56 if (!includeLeftEdge()) |
| 57 return 0; | 57 return 0; |
| 58 | 58 return boxModelObject()->marginLeft(); |
| 59 Length margin = object()->style()->marginLeft(); | |
| 60 if (margin.isAuto()) | |
| 61 return 0; | |
| 62 if (margin.isFixed()) | |
| 63 return margin.value(); | |
| 64 return renderBox()->marginLeft(); | |
| 65 } | 59 } |
| 66 | 60 |
| 67 int InlineFlowBox::marginRight() | 61 int InlineFlowBox::marginRight() |
| 68 { | 62 { |
| 69 if (!includeRightEdge()) | 63 if (!includeRightEdge()) |
| 70 return 0; | 64 return 0; |
| 71 | 65 return boxModelObject()->marginRight(); |
| 72 Length margin = object()->style()->marginRight(); | |
| 73 if (margin.isAuto()) | |
| 74 return 0; | |
| 75 if (margin.isFixed()) | |
| 76 return margin.value(); | |
| 77 return renderBox()->marginRight(); | |
| 78 } | 66 } |
| 79 | 67 |
| 80 int InlineFlowBox::marginBorderPaddingLeft() | 68 int InlineFlowBox::marginBorderPaddingLeft() |
| 81 { | 69 { |
| 82 return marginLeft() + borderLeft() + paddingLeft(); | 70 return marginLeft() + borderLeft() + paddingLeft(); |
| 83 } | 71 } |
| 84 | 72 |
| 85 int InlineFlowBox::marginBorderPaddingRight() | 73 int InlineFlowBox::marginBorderPaddingRight() |
| 86 { | 74 { |
| 87 return marginRight() + borderRight() + paddingRight(); | 75 return marginRight() + borderRight() + paddingRight(); |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 | 311 |
| 324 int visualOverflowLeft = leftGlyphOverflow; | 312 int visualOverflowLeft = leftGlyphOverflow; |
| 325 int visualOverflowRight = rightGlyphOverflow; | 313 int visualOverflowRight = rightGlyphOverflow; |
| 326 for (ShadowData* shadow = rt->style()->textShadow(); shadow; shadow
= shadow->next) { | 314 for (ShadowData* shadow = rt->style()->textShadow(); shadow; shadow
= shadow->next) { |
| 327 visualOverflowLeft = min(visualOverflowLeft, shadow->x - shadow-
>blur + leftGlyphOverflow); | 315 visualOverflowLeft = min(visualOverflowLeft, shadow->x - shadow-
>blur + leftGlyphOverflow); |
| 328 visualOverflowRight = max(visualOverflowRight, shadow->x + shado
w->blur + rightGlyphOverflow); | 316 visualOverflowRight = max(visualOverflowRight, shadow->x + shado
w->blur + rightGlyphOverflow); |
| 329 } | 317 } |
| 330 | 318 |
| 331 leftPosition = min(x + visualOverflowLeft, leftPosition); | 319 leftPosition = min(x + visualOverflowLeft, leftPosition); |
| 332 rightPosition = max(x + text->width() + visualOverflowRight, rightPo
sition); | 320 rightPosition = max(x + text->width() + visualOverflowRight, rightPo
sition); |
| 333 m_maxHorizontalVisualOverflow = max(max(visualOverflowRight, -visual
OverflowLeft), m_maxHorizontalVisualOverflow); | 321 m_maxHorizontalVisualOverflow = max(max(visualOverflowRight, -visual
OverflowLeft), (int)m_maxHorizontalVisualOverflow); |
| 334 x += text->width(); | 322 x += text->width(); |
| 335 } else { | 323 } else { |
| 336 if (curr->object()->isPositioned()) { | 324 if (curr->object()->isPositioned()) { |
| 337 if (curr->object()->parent()->style()->direction() == LTR) | 325 if (curr->object()->parent()->style()->direction() == LTR) |
| 338 curr->setXPos(x); | 326 curr->setXPos(x); |
| 339 else | 327 else |
| 340 // Our offset that we cache needs to be from the edge of the
right border box and | 328 // Our offset that we cache needs to be from the edge of the
right border box and |
| 341 // not the left border box. We have to subtract |x| from th
e width of the block | 329 // not the left border box. We have to subtract |x| from th
e width of the block |
| 342 // (which can be obtained from the root line box). | 330 // (which can be obtained from the root line box). |
| 343 curr->setXPos(root()->block()->width()-x); | 331 curr->setXPos(root()->block()->width()-x); |
| 344 continue; // The positioned object has no effect on the width. | 332 continue; // The positioned object has no effect on the width. |
| 345 } | 333 } |
| 346 if (curr->object()->isRenderInline()) { | 334 if (curr->object()->isRenderInline()) { |
| 347 InlineFlowBox* flow = static_cast<InlineFlowBox*>(curr); | 335 InlineFlowBox* flow = static_cast<InlineFlowBox*>(curr); |
| 348 x += flow->marginLeft(); | 336 x += flow->marginLeft(); |
| 349 x = flow->placeBoxesHorizontally(x, leftPosition, rightPosition,
needsWordSpacing); | 337 x = flow->placeBoxesHorizontally(x, leftPosition, rightPosition,
needsWordSpacing); |
| 350 x += flow->marginRight(); | 338 x += flow->marginRight(); |
| 351 } else if (!curr->object()->isListMarker() || static_cast<RenderList
Marker*>(curr->object())->isInside()) { | 339 } else if (!curr->object()->isListMarker() || static_cast<RenderList
Marker*>(curr->object())->isInside()) { |
| 352 x += curr->renderBox()->marginLeft(); | 340 x += curr->boxModelObject()->marginLeft(); |
| 353 curr->setXPos(x); | 341 curr->setXPos(x); |
| 354 leftPosition = min(x + curr->renderBox()->overflowLeft(false), l
eftPosition); | 342 leftPosition = min(x + toRenderBox(curr->object())->overflowLeft
(false), leftPosition); |
| 355 rightPosition = max(x + curr->renderBox()->overflowWidth(false),
rightPosition); | 343 rightPosition = max(x + toRenderBox(curr->object())->overflowWid
th(false), rightPosition); |
| 356 x += curr->width() + curr->renderBox()->marginRight(); | 344 x += curr->width() + curr->boxModelObject()->marginRight(); |
| 357 } | 345 } |
| 358 } | 346 } |
| 359 } | 347 } |
| 360 | 348 |
| 361 x += borderRight() + paddingRight(); | 349 x += borderRight() + paddingRight(); |
| 362 setWidth(x - startX); | 350 setWidth(x - startX); |
| 363 rightPosition = max(xPos() + width() + boxShadowRight, rightPosition); | 351 rightPosition = max(xPos() + width() + boxShadowRight, rightPosition); |
| 364 | 352 |
| 365 return x; | 353 return x; |
| 366 } | 354 } |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 450 maxAscent = ascent; | 438 maxAscent = ascent; |
| 451 if (maxDescent < descent) | 439 if (maxDescent < descent) |
| 452 maxDescent = descent; | 440 maxDescent = descent; |
| 453 } | 441 } |
| 454 } | 442 } |
| 455 | 443 |
| 456 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { | 444 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { |
| 457 if (curr->object()->isPositioned()) | 445 if (curr->object()->isPositioned()) |
| 458 continue; // Positioned placeholders don't affect calculations. | 446 continue; // Positioned placeholders don't affect calculations. |
| 459 | 447 |
| 448 bool isInlineFlow = curr->isInlineFlowBox(); |
| 449 |
| 460 curr->setHeight(curr->object()->lineHeight(m_firstLine)); | 450 curr->setHeight(curr->object()->lineHeight(m_firstLine)); |
| 461 curr->setBaseline(curr->object()->baselinePosition(m_firstLine)); | 451 curr->setBaseline(curr->object()->baselinePosition(m_firstLine)); |
| 462 curr->setYPos(curr->object()->verticalPositionHint(m_firstLine)); | 452 curr->setYPos(curr->object()->verticalPositionHint(m_firstLine)); |
| 463 if (curr->yPos() == PositionTop) { | 453 if (curr->yPos() == PositionTop) { |
| 464 if (maxPositionTop < curr->height()) | 454 if (maxPositionTop < curr->height()) |
| 465 maxPositionTop = curr->height(); | 455 maxPositionTop = curr->height(); |
| 466 } | 456 } |
| 467 else if (curr->yPos() == PositionBottom) { | 457 else if (curr->yPos() == PositionBottom) { |
| 468 if (maxPositionBottom < curr->height()) | 458 if (maxPositionBottom < curr->height()) |
| 469 maxPositionBottom = curr->height(); | 459 maxPositionBottom = curr->height(); |
| 470 } | 460 } |
| 471 else if (curr->hasTextChildren() || curr->renderBox()->hasHorizontalBord
ersOrPadding() || strictMode) { | 461 else if ((!isInlineFlow || static_cast<InlineFlowBox*>(curr)->hasTextChi
ldren()) || curr->boxModelObject()->hasHorizontalBordersOrPadding() || strictMod
e) { |
| 472 int ascent = curr->baseline() - curr->yPos(); | 462 int ascent = curr->baseline() - curr->yPos(); |
| 473 int descent = curr->height() - ascent; | 463 int descent = curr->height() - ascent; |
| 474 if (maxAscent < ascent) | 464 if (maxAscent < ascent) |
| 475 maxAscent = ascent; | 465 maxAscent = ascent; |
| 476 if (maxDescent < descent) | 466 if (maxDescent < descent) |
| 477 maxDescent = descent; | 467 maxDescent = descent; |
| 478 } | 468 } |
| 479 | 469 |
| 480 if (curr->isInlineFlowBox()) | 470 if (curr->isInlineFlowBox()) |
| 481 static_cast<InlineFlowBox*>(curr)->computeLogicalBoxHeights(maxPosit
ionTop, maxPositionBottom, maxAscent, maxDescent, strictMode); | 471 static_cast<InlineFlowBox*>(curr)->computeLogicalBoxHeights(maxPosit
ionTop, maxPositionBottom, maxAscent, maxDescent, strictMode); |
| 482 } | 472 } |
| 483 } | 473 } |
| 484 | 474 |
| 485 void InlineFlowBox::placeBoxesVertically(int y, int maxHeight, int maxAscent, bo
ol strictMode, | 475 void InlineFlowBox::placeBoxesVertically(int y, int maxHeight, int maxAscent, bo
ol strictMode, |
| 486 int& topPosition, int& bottomPosition,
int& selectionTop, int& selectionBottom) | 476 int& topPosition, int& bottomPosition,
int& selectionTop, int& selectionBottom) |
| 487 { | 477 { |
| 488 if (isRootInlineBox()) | 478 if (isRootInlineBox()) |
| 489 setYPos(y + maxAscent - baseline());// Place our root box. | 479 setYPos(y + maxAscent - baseline());// Place our root box. |
| 490 | 480 |
| 491 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { | 481 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { |
| 492 if (curr->object()->isPositioned()) | 482 if (curr->object()->isPositioned()) |
| 493 continue; // Positioned placeholders don't affect calculations. | 483 continue; // Positioned placeholders don't affect calculations. |
| 494 | 484 |
| 495 // Adjust boxes to use their real box y/height and not the logical heigh
t (as dictated by | 485 // Adjust boxes to use their real box y/height and not the logical heigh
t (as dictated by |
| 496 // line-height). | 486 // line-height). |
| 497 if (curr->isInlineFlowBox()) | 487 bool isInlineFlow = curr->isInlineFlowBox(); |
| 488 if (isInlineFlow) |
| 498 static_cast<InlineFlowBox*>(curr)->placeBoxesVertically(y, maxHeight
, maxAscent, strictMode, topPosition, bottomPosition, selectionTop, selectionBot
tom); | 489 static_cast<InlineFlowBox*>(curr)->placeBoxesVertically(y, maxHeight
, maxAscent, strictMode, topPosition, bottomPosition, selectionTop, selectionBot
tom); |
| 499 | 490 |
| 500 bool childAffectsTopBottomPos = true; | 491 bool childAffectsTopBottomPos = true; |
| 501 if (curr->yPos() == PositionTop) | 492 if (curr->yPos() == PositionTop) |
| 502 curr->setYPos(y); | 493 curr->setYPos(y); |
| 503 else if (curr->yPos() == PositionBottom) | 494 else if (curr->yPos() == PositionBottom) |
| 504 curr->setYPos(y + maxHeight - curr->height()); | 495 curr->setYPos(y + maxHeight - curr->height()); |
| 505 else { | 496 else { |
| 506 if (!curr->hasTextChildren() && !curr->renderBox()->hasHorizontalBor
dersOrPadding() && !strictMode) | 497 if ((isInlineFlow && !static_cast<InlineFlowBox*>(curr)->hasTextChil
dren()) && !curr->boxModelObject()->hasHorizontalBordersOrPadding() && !strictMo
de) |
| 507 childAffectsTopBottomPos = false; | 498 childAffectsTopBottomPos = false; |
| 508 curr->setYPos(curr->yPos() + y + maxAscent - curr->baseline()); | 499 curr->setYPos(curr->yPos() + y + maxAscent - curr->baseline()); |
| 509 } | 500 } |
| 510 | 501 |
| 511 int newY = curr->yPos(); | 502 int newY = curr->yPos(); |
| 512 int newHeight = curr->height(); | 503 int newHeight = curr->height(); |
| 513 int newBaseline = curr->baseline(); | 504 int newBaseline = curr->baseline(); |
| 514 int overflowTop = 0; | 505 int overflowTop = 0; |
| 515 int overflowBottom = 0; | 506 int overflowBottom = 0; |
| 516 if (curr->isText() || curr->isInlineFlowBox()) { | 507 if (curr->isText() || curr->isInlineFlowBox()) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 527 overflowTop = min(overflowTop, boxShadow->y - boxShadow->blur); | 518 overflowTop = min(overflowTop, boxShadow->y - boxShadow->blur); |
| 528 overflowBottom = max(overflowBottom, boxShadow->y + boxShadow->b
lur); | 519 overflowBottom = max(overflowBottom, boxShadow->y + boxShadow->b
lur); |
| 529 } | 520 } |
| 530 | 521 |
| 531 for (ShadowData* textShadow = curr->object()->style(m_firstLine)->te
xtShadow(); textShadow; textShadow = textShadow->next) { | 522 for (ShadowData* textShadow = curr->object()->style(m_firstLine)->te
xtShadow(); textShadow; textShadow = textShadow->next) { |
| 532 overflowTop = min(overflowTop, textShadow->y - textShadow->blur)
; | 523 overflowTop = min(overflowTop, textShadow->y - textShadow->blur)
; |
| 533 overflowBottom = max(overflowBottom, textShadow->y + textShadow-
>blur); | 524 overflowBottom = max(overflowBottom, textShadow->y + textShadow-
>blur); |
| 534 } | 525 } |
| 535 | 526 |
| 536 if (curr->object()->hasReflection()) { | 527 if (curr->object()->hasReflection()) { |
| 537 overflowTop = min(overflowTop, curr->renderBox()->reflectionBox(
).y()); | 528 RenderBox* box = toRenderBox(curr->object()); |
| 538 overflowBottom = max(overflowBottom, curr->renderBox()->reflecti
onBox().bottom()); | 529 overflowTop = min(overflowTop, box->reflectionBox().y()); |
| 530 overflowBottom = max(overflowBottom, box->reflectionBox().bottom
()); |
| 539 } | 531 } |
| 540 | 532 |
| 541 if (curr->isInlineFlowBox()) { | 533 if (curr->isInlineFlowBox()) { |
| 542 newHeight += curr->renderBox()->borderTop() + curr->renderBox()-
>paddingTop() + | 534 newHeight += curr->boxModelObject()->borderTop() + curr->boxMode
lObject()->paddingTop() + |
| 543 curr->renderBox()->borderBottom() + curr->renderBox(
)->paddingBottom(); | 535 curr->boxModelObject()->borderBottom() + curr->boxMo
delObject()->paddingBottom(); |
| 544 newY -= curr->renderBox()->borderTop() + curr->renderBox()->padd
ingTop(); | 536 newY -= curr->boxModelObject()->borderTop() + curr->boxModelObje
ct()->paddingTop(); |
| 545 newBaseline += curr->renderBox()->borderTop() + curr->renderBox(
)->paddingTop(); | 537 newBaseline += curr->boxModelObject()->borderTop() + curr->boxMo
delObject()->paddingTop(); |
| 546 } | 538 } |
| 547 } else if (!curr->object()->isBR()) { | 539 } else if (!curr->object()->isBR()) { |
| 548 newY += curr->renderBox()->marginTop(); | 540 RenderBox* box = toRenderBox(curr->object()); |
| 549 newHeight = curr->height() - (curr->renderBox()->marginTop() + curr-
>renderBox()->marginBottom()); | 541 newY += box->marginTop(); |
| 550 overflowTop = curr->renderBox()->overflowTop(false); | 542 newHeight = curr->height() - (box->marginTop() + box->marginBottom()
); |
| 551 overflowBottom = curr->renderBox()->overflowHeight(false) - newHeigh
t; | 543 overflowTop = box->overflowTop(false); |
| 544 overflowBottom = box->overflowHeight(false) - newHeight; |
| 552 } | 545 } |
| 553 | 546 |
| 554 curr->setYPos(newY); | 547 curr->setYPos(newY); |
| 555 curr->setHeight(newHeight); | 548 curr->setHeight(newHeight); |
| 556 curr->setBaseline(newBaseline); | 549 curr->setBaseline(newBaseline); |
| 557 | 550 |
| 558 if (childAffectsTopBottomPos) { | 551 if (childAffectsTopBottomPos) { |
| 559 selectionTop = min(selectionTop, newY); | 552 selectionTop = min(selectionTop, newY); |
| 560 selectionBottom = max(selectionBottom, newY + newHeight); | 553 selectionBottom = max(selectionBottom, newY + newHeight); |
| 561 topPosition = min(topPosition, newY + overflowTop); | 554 topPosition = min(topPosition, newY + overflowTop); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 580 // First shrink our kids. | 573 // First shrink our kids. |
| 581 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { | 574 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { |
| 582 if (curr->object()->isPositioned()) | 575 if (curr->object()->isPositioned()) |
| 583 continue; // Positioned placeholders don't affect calculations. | 576 continue; // Positioned placeholders don't affect calculations. |
| 584 | 577 |
| 585 if (curr->isInlineFlowBox()) | 578 if (curr->isInlineFlowBox()) |
| 586 static_cast<InlineFlowBox*>(curr)->shrinkBoxesWithNoTextChildren(top
Pos, bottomPos); | 579 static_cast<InlineFlowBox*>(curr)->shrinkBoxesWithNoTextChildren(top
Pos, bottomPos); |
| 587 } | 580 } |
| 588 | 581 |
| 589 // See if we have text children. If not, then we need to shrink ourselves to
fit on the line. | 582 // See if we have text children. If not, then we need to shrink ourselves to
fit on the line. |
| 590 if (!hasTextChildren() && !renderBox()->hasHorizontalBordersOrPadding()) { | 583 if (!hasTextChildren() && !boxModelObject()->hasHorizontalBordersOrPadding()
) { |
| 591 if (yPos() < topPos) | 584 if (yPos() < topPos) |
| 592 setYPos(topPos); | 585 setYPos(topPos); |
| 593 if (yPos() + height() > bottomPos) | 586 if (yPos() + height() > bottomPos) |
| 594 setHeight(bottomPos - yPos()); | 587 setHeight(bottomPos - yPos()); |
| 595 if (baseline() > height()) | 588 if (baseline() > height()) |
| 596 setBaseline(height()); | 589 setBaseline(height()); |
| 597 } | 590 } |
| 598 } | 591 } |
| 599 | 592 |
| 600 bool InlineFlowBox::nodeAtPoint(const HitTestRequest& request, HitTestResult& re
sult, int x, int y, int tx, int ty) | 593 bool InlineFlowBox::nodeAtPoint(const HitTestRequest& request, HitTestResult& re
sult, int x, int y, int tx, int ty) |
| (...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1068 ASSERT(child->prevOnLine() == prev); | 1061 ASSERT(child->prevOnLine() == prev); |
| 1069 prev = child; | 1062 prev = child; |
| 1070 } | 1063 } |
| 1071 ASSERT(prev == m_lastChild); | 1064 ASSERT(prev == m_lastChild); |
| 1072 #endif | 1065 #endif |
| 1073 } | 1066 } |
| 1074 | 1067 |
| 1075 #endif | 1068 #endif |
| 1076 | 1069 |
| 1077 } // namespace WebCore | 1070 } // namespace WebCore |
| OLD | NEW |