OLD | NEW |
1 /* | 1 /* |
2 * This file is part of the layout object implementation for KHTML. | 2 * This file is part of the layout object implementation for KHTML. |
3 * | 3 * |
4 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 4 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
5 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 5 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
6 * Copyright (C) 2003 Apple Computer, Inc. | 6 * Copyright (C) 2003 Apple Computer, Inc. |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
469 LayoutUnit maxAscent; | 469 LayoutUnit maxAscent; |
470 LayoutUnit maxDescent; | 470 LayoutUnit maxDescent; |
471 for (LayoutBox* child = iterator.first(); child; child = iterator.next()) { | 471 for (LayoutBox* child = iterator.first(); child; child = iterator.next()) { |
472 if (child->isOutOfFlowPositioned()) | 472 if (child->isOutOfFlowPositioned()) |
473 continue; | 473 continue; |
474 | 474 |
475 SubtreeLayoutScope layoutScope(*child); | 475 SubtreeLayoutScope layoutScope(*child); |
476 // TODO(jchaffraix): It seems incorrect to check isAtomicInlineLevel in | 476 // TODO(jchaffraix): It seems incorrect to check isAtomicInlineLevel in |
477 // this file. | 477 // this file. |
478 // We probably want to check if the element is replaced. | 478 // We probably want to check if the element is replaced. |
479 if (relayoutChildren || (child->isAtomicInlineLevel() && | 479 if (relayoutChildren || |
480 (child->style()->width().isPercentOrCalc() || | 480 (child->isAtomicInlineLevel() && |
481 child->style()->height().isPercentOrCalc()))) | 481 (child->style()->width().isPercentOrCalc() || |
| 482 child->style()->height().isPercentOrCalc()))) |
482 layoutScope.setChildNeedsLayout(child); | 483 layoutScope.setChildNeedsLayout(child); |
483 | 484 |
484 // Compute the child's vertical margins. | 485 // Compute the child's vertical margins. |
485 child->computeAndSetBlockDirectionMargins(this); | 486 child->computeAndSetBlockDirectionMargins(this); |
486 | 487 |
487 if (!child->needsLayout()) | 488 if (!child->needsLayout()) |
488 markChildForPaginationRelayoutIfNeeded(*child, layoutScope); | 489 markChildForPaginationRelayoutIfNeeded(*child, layoutScope); |
489 | 490 |
490 // Now do the layout. | 491 // Now do the layout. |
491 child->layoutIfNeeded(); | 492 child->layoutIfNeeded(); |
492 | 493 |
493 // Update our height and overflow height. | 494 // Update our height and overflow height. |
494 if (style()->boxAlign() == BBASELINE) { | 495 if (style()->boxAlign() == BBASELINE) { |
495 LayoutUnit ascent(child->firstLineBoxBaseline()); | 496 LayoutUnit ascent(child->firstLineBoxBaseline()); |
496 if (ascent == -1) | 497 if (ascent == -1) |
497 ascent = child->size().height() + child->marginBottom(); | 498 ascent = child->size().height() + child->marginBottom(); |
498 ascent += child->marginTop(); | 499 ascent += child->marginTop(); |
499 LayoutUnit descent = | 500 LayoutUnit descent = |
500 (child->size().height() + child->marginHeight()) - ascent; | 501 (child->size().height() + child->marginHeight()) - ascent; |
501 | 502 |
502 // Update our maximum ascent. | 503 // Update our maximum ascent. |
503 maxAscent = std::max(maxAscent, ascent); | 504 maxAscent = std::max(maxAscent, ascent); |
504 | 505 |
505 // Update our maximum descent. | 506 // Update our maximum descent. |
506 maxDescent = std::max(maxDescent, descent); | 507 maxDescent = std::max(maxDescent, descent); |
507 | 508 |
508 // Now update our height. | 509 // Now update our height. |
509 setHeight(std::max(yPos + maxAscent + maxDescent, size().height())); | 510 setHeight(std::max(yPos + maxAscent + maxDescent, size().height())); |
510 } else { | 511 } else { |
511 setHeight(std::max(size().height(), yPos + child->size().height() + | 512 setHeight( |
512 child->marginHeight())); | 513 std::max(size().height(), |
| 514 yPos + child->size().height() + child->marginHeight())); |
513 } | 515 } |
514 | 516 |
515 if (paginated) | 517 if (paginated) |
516 updateFragmentationInfoForChild(*child); | 518 updateFragmentationInfoForChild(*child); |
517 } | 519 } |
518 | 520 |
519 if (!iterator.first() && hasLineIfEmpty()) | 521 if (!iterator.first() && hasLineIfEmpty()) |
520 setHeight(size().height() + lineHeight(true, | 522 setHeight(size().height() + |
521 style()->isHorizontalWritingMode() | 523 lineHeight(true, |
522 ? HorizontalLine | 524 style()->isHorizontalWritingMode() ? HorizontalLine |
523 : VerticalLine, | 525 : VerticalLine, |
524 PositionOfInteriorLineBoxes)); | 526 PositionOfInteriorLineBoxes)); |
525 | 527 |
526 setHeight(size().height() + toAdd); | 528 setHeight(size().height() + toAdd); |
527 | 529 |
528 oldHeight = size().height(); | 530 oldHeight = size().height(); |
529 updateLogicalHeight(); | 531 updateLogicalHeight(); |
530 | 532 |
531 relayoutChildren = false; | 533 relayoutChildren = false; |
532 if (oldHeight != size().height()) | 534 if (oldHeight != size().height()) |
533 heightSpecified = true; | 535 heightSpecified = true; |
534 | 536 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
576 child->layoutIfNeeded(); | 578 child->layoutIfNeeded(); |
577 | 579 |
578 // We can place the child now, using our value of box-align. | 580 // We can place the child now, using our value of box-align. |
579 xPos += child->marginLeft(); | 581 xPos += child->marginLeft(); |
580 LayoutUnit childY = yPos; | 582 LayoutUnit childY = yPos; |
581 switch (style()->boxAlign()) { | 583 switch (style()->boxAlign()) { |
582 case BCENTER: | 584 case BCENTER: |
583 childY += child->marginTop() + | 585 childY += child->marginTop() + |
584 ((contentHeight() - | 586 ((contentHeight() - |
585 (child->size().height() + child->marginHeight())) / | 587 (child->size().height() + child->marginHeight())) / |
586 2).clampNegativeToZero(); | 588 2) |
| 589 .clampNegativeToZero(); |
587 break; | 590 break; |
588 case BBASELINE: { | 591 case BBASELINE: { |
589 LayoutUnit ascent(child->firstLineBoxBaseline()); | 592 LayoutUnit ascent(child->firstLineBoxBaseline()); |
590 if (ascent == -1) | 593 if (ascent == -1) |
591 ascent = child->size().height() + child->marginBottom(); | 594 ascent = child->size().height() + child->marginBottom(); |
592 ascent += child->marginTop(); | 595 ascent += child->marginTop(); |
593 childY += child->marginTop() + (maxAscent - ascent); | 596 childY += child->marginTop() + (maxAscent - ascent); |
594 break; | 597 break; |
595 } | 598 } |
596 case BEND: | 599 case BEND: |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
711 } | 714 } |
712 } while (absoluteValue(groupRemainingSpace) >= 1); | 715 } while (absoluteValue(groupRemainingSpace) >= 1); |
713 } | 716 } |
714 | 717 |
715 // We didn't find any children that could grow. | 718 // We didn't find any children that could grow. |
716 if (haveFlex && !flexingChildren) | 719 if (haveFlex && !flexingChildren) |
717 haveFlex = false; | 720 haveFlex = false; |
718 } | 721 } |
719 } while (haveFlex); | 722 } while (haveFlex); |
720 | 723 |
721 if (remainingSpace > 0 && ((style()->isLeftToRightDirection() && | 724 if (remainingSpace > 0 && |
722 style()->boxPack() != BoxPackStart) || | 725 ((style()->isLeftToRightDirection() && |
723 (!style()->isLeftToRightDirection() && | 726 style()->boxPack() != BoxPackStart) || |
724 style()->boxPack() != BoxPackEnd))) { | 727 (!style()->isLeftToRightDirection() && |
| 728 style()->boxPack() != BoxPackEnd))) { |
725 // Children must be repositioned. | 729 // Children must be repositioned. |
726 LayoutUnit offset; | 730 LayoutUnit offset; |
727 if (style()->boxPack() == BoxPackJustify) { | 731 if (style()->boxPack() == BoxPackJustify) { |
728 // Determine the total number of children. | 732 // Determine the total number of children. |
729 int totalChildren = 0; | 733 int totalChildren = 0; |
730 for (LayoutBox* child = iterator.first(); child; | 734 for (LayoutBox* child = iterator.first(); child; |
731 child = iterator.next()) { | 735 child = iterator.next()) { |
732 if (childDoesNotAffectWidthOrFlexing(child)) | 736 if (childDoesNotAffectWidthOrFlexing(child)) |
733 continue; | 737 continue; |
734 ++totalChildren; | 738 ++totalChildren; |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
822 childLayer->setStaticBlockPosition(size().height()); | 826 childLayer->setStaticBlockPosition(size().height()); |
823 if (child->style()->hasStaticBlockPosition( | 827 if (child->style()->hasStaticBlockPosition( |
824 style()->isHorizontalWritingMode())) | 828 style()->isHorizontalWritingMode())) |
825 child->setChildNeedsLayout(MarkOnlyThis); | 829 child->setChildNeedsLayout(MarkOnlyThis); |
826 } | 830 } |
827 continue; | 831 continue; |
828 } | 832 } |
829 | 833 |
830 SubtreeLayoutScope layoutScope(*child); | 834 SubtreeLayoutScope layoutScope(*child); |
831 if (!haveLineClamp && | 835 if (!haveLineClamp && |
832 (relayoutChildren || (child->isAtomicInlineLevel() && | 836 (relayoutChildren || |
833 (child->style()->width().isPercentOrCalc() || | 837 (child->isAtomicInlineLevel() && |
834 child->style()->height().isPercentOrCalc())))) | 838 (child->style()->width().isPercentOrCalc() || |
| 839 child->style()->height().isPercentOrCalc())))) |
835 layoutScope.setChildNeedsLayout(child); | 840 layoutScope.setChildNeedsLayout(child); |
836 | 841 |
837 if (child->style()->visibility() == EVisibility::kCollapse) { | 842 if (child->style()->visibility() == EVisibility::kCollapse) { |
838 // visibility: collapsed children do not participate in our positioning. | 843 // visibility: collapsed children do not participate in our positioning. |
839 // But we need to lay them down. | 844 // But we need to lay them down. |
840 child->layoutIfNeeded(); | 845 child->layoutIfNeeded(); |
841 continue; | 846 continue; |
842 } | 847 } |
843 | 848 |
844 // Compute the child's vertical margins. | 849 // Compute the child's vertical margins. |
845 child->computeAndSetBlockDirectionMargins(this); | 850 child->computeAndSetBlockDirectionMargins(this); |
846 | 851 |
847 // Add in the child's marginTop to our height. | 852 // Add in the child's marginTop to our height. |
848 setHeight(size().height() + child->marginTop()); | 853 setHeight(size().height() + child->marginTop()); |
849 | 854 |
850 if (!child->needsLayout()) | 855 if (!child->needsLayout()) |
851 markChildForPaginationRelayoutIfNeeded(*child, layoutScope); | 856 markChildForPaginationRelayoutIfNeeded(*child, layoutScope); |
852 | 857 |
853 // Now do a layout. | 858 // Now do a layout. |
854 child->layoutIfNeeded(); | 859 child->layoutIfNeeded(); |
855 | 860 |
856 // We can place the child now, using our value of box-align. | 861 // We can place the child now, using our value of box-align. |
857 LayoutUnit childX = borderLeft() + paddingLeft(); | 862 LayoutUnit childX = borderLeft() + paddingLeft(); |
858 switch (style()->boxAlign()) { | 863 switch (style()->boxAlign()) { |
859 case BCENTER: | 864 case BCENTER: |
860 case BBASELINE: // Baseline just maps to center for vertical boxes | 865 case BBASELINE: // Baseline just maps to center for vertical boxes |
861 childX += child->marginLeft() + | 866 childX += child->marginLeft() + |
862 ((contentWidth() - | 867 ((contentWidth() - |
863 (child->size().width() + child->marginWidth())) / | 868 (child->size().width() + child->marginWidth())) / |
864 2).clampNegativeToZero(); | 869 2) |
| 870 .clampNegativeToZero(); |
865 break; | 871 break; |
866 case BEND: | 872 case BEND: |
867 if (!style()->isLeftToRightDirection()) | 873 if (!style()->isLeftToRightDirection()) |
868 childX += child->marginLeft(); | 874 childX += child->marginLeft(); |
869 else | 875 else |
870 childX += | 876 childX += |
871 contentWidth() - child->marginRight() - child->size().width(); | 877 contentWidth() - child->marginRight() - child->size().width(); |
872 break; | 878 break; |
873 default: // BSTART/BSTRETCH | 879 default: // BSTART/BSTRETCH |
874 if (style()->isLeftToRightDirection()) | 880 if (style()->isLeftToRightDirection()) |
875 childX += child->marginLeft(); | 881 childX += child->marginLeft(); |
876 else | 882 else |
877 childX += | 883 childX += |
878 contentWidth() - child->marginRight() - child->size().width(); | 884 contentWidth() - child->marginRight() - child->size().width(); |
879 break; | 885 break; |
880 } | 886 } |
881 | 887 |
882 // Place the child. | 888 // Place the child. |
883 placeChild(child, LayoutPoint(childX, size().height())); | 889 placeChild(child, LayoutPoint(childX, size().height())); |
884 setHeight(size().height() + child->size().height() + | 890 setHeight(size().height() + child->size().height() + |
885 child->marginBottom()); | 891 child->marginBottom()); |
886 | 892 |
887 if (paginated) | 893 if (paginated) |
888 updateFragmentationInfoForChild(*child); | 894 updateFragmentationInfoForChild(*child); |
889 } | 895 } |
890 | 896 |
891 yPos = size().height(); | 897 yPos = size().height(); |
892 | 898 |
893 if (!iterator.first() && hasLineIfEmpty()) | 899 if (!iterator.first() && hasLineIfEmpty()) |
894 setHeight(size().height() + lineHeight(true, | 900 setHeight(size().height() + |
895 style()->isHorizontalWritingMode() | 901 lineHeight(true, |
896 ? HorizontalLine | 902 style()->isHorizontalWritingMode() ? HorizontalLine |
897 : VerticalLine, | 903 : VerticalLine, |
898 PositionOfInteriorLineBoxes)); | 904 PositionOfInteriorLineBoxes)); |
899 | 905 |
900 setHeight(size().height() + toAdd); | 906 setHeight(size().height() + toAdd); |
901 | 907 |
902 // Negative margins can cause our height to shrink below our minimal height | 908 // Negative margins can cause our height to shrink below our minimal height |
903 // (border/padding). If this happens, ensure that the computed height is | 909 // (border/padding). If this happens, ensure that the computed height is |
904 // increased to the minimal height. | 910 // increased to the minimal height. |
905 if (size().height() < minHeight) | 911 if (size().height() < minHeight) |
906 setHeight(minHeight); | 912 setHeight(minHeight); |
907 | 913 |
908 // Now we have to calc our height, so we know how much space we have | 914 // Now we have to calc our height, so we know how much space we have |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1080 void LayoutDeprecatedFlexibleBox::applyLineClamp(FlexBoxIterator& iterator, | 1086 void LayoutDeprecatedFlexibleBox::applyLineClamp(FlexBoxIterator& iterator, |
1081 bool relayoutChildren) { | 1087 bool relayoutChildren) { |
1082 UseCounter::count(document(), UseCounter::LineClamp); | 1088 UseCounter::count(document(), UseCounter::LineClamp); |
1083 | 1089 |
1084 int maxLineCount = 0; | 1090 int maxLineCount = 0; |
1085 for (LayoutBox* child = iterator.first(); child; child = iterator.next()) { | 1091 for (LayoutBox* child = iterator.first(); child; child = iterator.next()) { |
1086 if (childDoesNotAffectWidthOrFlexing(child)) | 1092 if (childDoesNotAffectWidthOrFlexing(child)) |
1087 continue; | 1093 continue; |
1088 | 1094 |
1089 child->clearOverrideSize(); | 1095 child->clearOverrideSize(); |
1090 if (relayoutChildren || (child->isAtomicInlineLevel() && | 1096 if (relayoutChildren || |
1091 (child->style()->width().isPercentOrCalc() || | 1097 (child->isAtomicInlineLevel() && |
1092 child->style()->height().isPercentOrCalc())) || | 1098 (child->style()->width().isPercentOrCalc() || |
| 1099 child->style()->height().isPercentOrCalc())) || |
1093 (child->style()->height().isAuto() && child->isLayoutBlock())) { | 1100 (child->style()->height().isAuto() && child->isLayoutBlock())) { |
1094 child->setChildNeedsLayout(MarkOnlyThis); | 1101 child->setChildNeedsLayout(MarkOnlyThis); |
1095 | 1102 |
1096 // Dirty all the positioned objects. | 1103 // Dirty all the positioned objects. |
1097 if (child->isLayoutBlockFlow()) { | 1104 if (child->isLayoutBlockFlow()) { |
1098 toLayoutBlockFlow(child)->markPositionedObjectsForLayout(); | 1105 toLayoutBlockFlow(child)->markPositionedObjectsForLayout(); |
1099 clearTruncation(toLayoutBlockFlow(child)); | 1106 clearTruncation(toLayoutBlockFlow(child)); |
1100 } | 1107 } |
1101 } | 1108 } |
1102 child->layoutIfNeeded(); | 1109 child->layoutIfNeeded(); |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1265 if (minHeight.isFixed() || minHeight.isAuto()) { | 1272 if (minHeight.isFixed() || minHeight.isAuto()) { |
1266 LayoutUnit minHeight(child->style()->minHeight().value()); | 1273 LayoutUnit minHeight(child->style()->minHeight().value()); |
1267 LayoutUnit height = contentHeightForChild(child); | 1274 LayoutUnit height = contentHeightForChild(child); |
1268 LayoutUnit allowedShrinkage = (minHeight - height).clampPositiveToZero(); | 1275 LayoutUnit allowedShrinkage = (minHeight - height).clampPositiveToZero(); |
1269 return allowedShrinkage; | 1276 return allowedShrinkage; |
1270 } | 1277 } |
1271 return LayoutUnit(); | 1278 return LayoutUnit(); |
1272 } | 1279 } |
1273 | 1280 |
1274 } // namespace blink | 1281 } // namespace blink |
OLD | NEW |