| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) | 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) |
| 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) | 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) |
| 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv
ed. | 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv
ed. |
| 7 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. | 7 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. |
| 8 * | 8 * |
| 9 * This library is free software; you can redistribute it and/or | 9 * This library is free software; you can redistribute it and/or |
| 10 * modify it under the terms of the GNU Library General Public | 10 * modify it under the terms of the GNU Library General Public |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 110 && parent() && !parent()->normalChildNeedsLayout()) | 110 && parent() && !parent()->normalChildNeedsLayout()) |
| 111 parent()->setChildNeedsLayout(); | 111 parent()->setChildNeedsLayout(); |
| 112 } | 112 } |
| 113 } | 113 } |
| 114 | 114 |
| 115 void RenderBox::updateFromStyle() | 115 void RenderBox::updateFromStyle() |
| 116 { | 116 { |
| 117 RenderBoxModelObject::updateFromStyle(); | 117 RenderBoxModelObject::updateFromStyle(); |
| 118 | 118 |
| 119 RenderStyle* styleToUse = style(); | 119 RenderStyle* styleToUse = style(); |
| 120 bool isRootObject = isDocumentElement(); | |
| 121 bool isViewObject = isRenderView(); | |
| 122 | 120 |
| 123 // The root and the RenderView always paint their backgrounds/borders. | 121 if (isRenderView()) { |
| 124 if (isRootObject || isViewObject) | |
| 125 setHasBoxDecorationBackground(true); | 122 setHasBoxDecorationBackground(true); |
| 126 | 123 } else if (isRenderBlock()) { |
| 127 // TODO(esprehn): Why do we not want to set this on the RenderView? | 124 // TODO(esprehn): Why do we not want to set this on the RenderView? |
| 128 if (isRenderBlock() && !isViewObject) | |
| 129 setHasOverflowClip(!styleToUse->isOverflowVisible()); | 125 setHasOverflowClip(!styleToUse->isOverflowVisible()); |
| 126 } |
| 130 | 127 |
| 131 setHasTransform(styleToUse->hasTransformRelatedProperty()); | 128 setHasTransform(styleToUse->hasTransformRelatedProperty()); |
| 132 } | 129 } |
| 133 | 130 |
| 134 void RenderBox::layout() | 131 void RenderBox::layout() |
| 135 { | 132 { |
| 136 ASSERT(needsLayout()); | 133 ASSERT(needsLayout()); |
| 137 | 134 |
| 138 RenderObject* child = slowFirstChild(); | 135 RenderObject* child = slowFirstChild(); |
| 139 if (!child) { | 136 if (!child) { |
| (...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 671 paintBackground(paintInfo, paintRect, boxDecorationData.backgroundColor, ble
edAvoidance); | 668 paintBackground(paintInfo, paintRect, boxDecorationData.backgroundColor, ble
edAvoidance); |
| 672 paintBoxShadow(paintInfo, paintRect, style, Inset); | 669 paintBoxShadow(paintInfo, paintRect, style, Inset); |
| 673 | 670 |
| 674 // The theme will tell us whether or not we should also paint the CSS border
. | 671 // The theme will tell us whether or not we should also paint the CSS border
. |
| 675 if (boxDecorationData.hasBorder && bleedAvoidance != BackgroundBleedBackgrou
ndOverBorder) | 672 if (boxDecorationData.hasBorder && bleedAvoidance != BackgroundBleedBackgrou
ndOverBorder) |
| 676 paintBorder(paintInfo, paintRect, style, bleedAvoidance); | 673 paintBorder(paintInfo, paintRect, style, bleedAvoidance); |
| 677 } | 674 } |
| 678 | 675 |
| 679 void RenderBox::paintBackground(const PaintInfo& paintInfo, const LayoutRect& pa
intRect, const Color& backgroundColor, BackgroundBleedAvoidance bleedAvoidance) | 676 void RenderBox::paintBackground(const PaintInfo& paintInfo, const LayoutRect& pa
intRect, const Color& backgroundColor, BackgroundBleedAvoidance bleedAvoidance) |
| 680 { | 677 { |
| 681 if (isDocumentElement()) { | |
| 682 paintRootBoxFillLayers(paintInfo); | |
| 683 return; | |
| 684 } | |
| 685 paintFillLayers(paintInfo, backgroundColor, style()->backgroundLayers(), pai
ntRect, bleedAvoidance); | 678 paintFillLayers(paintInfo, backgroundColor, style()->backgroundLayers(), pai
ntRect, bleedAvoidance); |
| 686 } | 679 } |
| 687 | 680 |
| 688 bool RenderBox::backgroundHasOpaqueTopLayer() const | 681 bool RenderBox::backgroundHasOpaqueTopLayer() const |
| 689 { | 682 { |
| 690 const FillLayer& fillLayer = style()->backgroundLayers(); | 683 const FillLayer& fillLayer = style()->backgroundLayers(); |
| 691 if (fillLayer.clip() != BorderFillBox) | 684 if (fillLayer.clip() != BorderFillBox) |
| 692 return false; | 685 return false; |
| 693 | 686 |
| 694 if (fillLayer.hasOpaqueImage(this) && fillLayer.hasRepeatXY() && fillLayer.i
mage()->canRender(*this)) | 687 if (fillLayer.hasOpaqueImage(this) && fillLayer.hasRepeatXY() && fillLayer.i
mage()->canRender(*this)) |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 730 curLayer = curLayer->next(); | 723 curLayer = curLayer->next(); |
| 731 } | 724 } |
| 732 | 725 |
| 733 if (layers.size() > 0 && (**layers.rbegin()).next()) | 726 if (layers.size() > 0 && (**layers.rbegin()).next()) |
| 734 isBottomLayerOccluded = true; | 727 isBottomLayerOccluded = true; |
| 735 | 728 |
| 736 GraphicsContext* context = paintInfo.context; | 729 GraphicsContext* context = paintInfo.context; |
| 737 if (!context) | 730 if (!context) |
| 738 shouldDrawBackgroundInSeparateBuffer = false; | 731 shouldDrawBackgroundInSeparateBuffer = false; |
| 739 | 732 |
| 733 // FIXME(sky): Propagate this constant. |
| 740 bool skipBaseColor = false; | 734 bool skipBaseColor = false; |
| 741 if (shouldDrawBackgroundInSeparateBuffer) { | 735 if (shouldDrawBackgroundInSeparateBuffer) |
| 742 bool isBaseColorVisible = !isBottomLayerOccluded && c.hasAlpha(); | |
| 743 | |
| 744 // Paint the document's base background color outside the transparency l
ayer, | |
| 745 // so that the background images don't blend with this color: http://crb
ug.com/389039. | |
| 746 if (isBaseColorVisible && isDocumentElementWithOpaqueBackground()) { | |
| 747 paintRootBackgroundColor(paintInfo, rect, Color()); | |
| 748 skipBaseColor = true; | |
| 749 } | |
| 750 context->beginTransparencyLayer(1); | 736 context->beginTransparencyLayer(1); |
| 751 } | |
| 752 | 737 |
| 753 Vector<const FillLayer*>::const_reverse_iterator topLayer = layers.rend(); | 738 Vector<const FillLayer*>::const_reverse_iterator topLayer = layers.rend(); |
| 754 for (Vector<const FillLayer*>::const_reverse_iterator it = layers.rbegin();
it != topLayer; ++it) | 739 for (Vector<const FillLayer*>::const_reverse_iterator it = layers.rbegin();
it != topLayer; ++it) |
| 755 paintFillLayer(paintInfo, c, **it, rect, bleedAvoidance, backgroundObjec
t, skipBaseColor); | 740 paintFillLayer(paintInfo, c, **it, rect, bleedAvoidance, backgroundObjec
t, skipBaseColor); |
| 756 | 741 |
| 757 if (shouldDrawBackgroundInSeparateBuffer) | 742 if (shouldDrawBackgroundInSeparateBuffer) |
| 758 context->endLayer(); | 743 context->endLayer(); |
| 759 } | 744 } |
| 760 | 745 |
| 761 void RenderBox::paintFillLayer(const PaintInfo& paintInfo, const Color& c, const
FillLayer& fillLayer, const LayoutRect& rect, | 746 void RenderBox::paintFillLayer(const PaintInfo& paintInfo, const Color& c, const
FillLayer& fillLayer, const LayoutRect& rect, |
| (...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1313 | 1298 |
| 1314 LayoutUnit RenderBox::computePercentageLogicalHeight(const Length& height) const | 1299 LayoutUnit RenderBox::computePercentageLogicalHeight(const Length& height) const |
| 1315 { | 1300 { |
| 1316 LayoutUnit availableHeight = -1; | 1301 LayoutUnit availableHeight = -1; |
| 1317 | 1302 |
| 1318 bool skippedAutoHeightContainingBlock = false; | 1303 bool skippedAutoHeightContainingBlock = false; |
| 1319 RenderBlock* cb = containingBlock(); | 1304 RenderBlock* cb = containingBlock(); |
| 1320 const RenderBox* containingBlockChild = this; | 1305 const RenderBox* containingBlockChild = this; |
| 1321 LayoutUnit rootMarginBorderPaddingHeight = 0; | 1306 LayoutUnit rootMarginBorderPaddingHeight = 0; |
| 1322 while (!cb->isRenderView() && skipContainingBlockForPercentHeightCalculation
(cb)) { | 1307 while (!cb->isRenderView() && skipContainingBlockForPercentHeightCalculation
(cb)) { |
| 1323 if (cb->isDocumentElement()) | |
| 1324 rootMarginBorderPaddingHeight += cb->marginBefore() + cb->marginAfte
r() + cb->borderAndPaddingLogicalHeight(); | |
| 1325 skippedAutoHeightContainingBlock = true; | 1308 skippedAutoHeightContainingBlock = true; |
| 1326 containingBlockChild = cb; | 1309 containingBlockChild = cb; |
| 1327 cb = cb->containingBlock(); | 1310 cb = cb->containingBlock(); |
| 1328 } | 1311 } |
| 1329 cb->addPercentHeightDescendant(const_cast<RenderBox*>(this)); | 1312 cb->addPercentHeightDescendant(const_cast<RenderBox*>(this)); |
| 1330 | 1313 |
| 1331 RenderStyle* cbstyle = cb->style(); | 1314 RenderStyle* cbstyle = cb->style(); |
| 1332 | 1315 |
| 1333 // A positioned element that specified both top/bottom or that specifies hei
ght should be treated as though it has a height | 1316 // A positioned element that specified both top/bottom or that specifies hei
ght should be treated as though it has a height |
| 1334 // explicitly specified that can be used for any percentage computations. | 1317 // explicitly specified that can be used for any percentage computations. |
| (...skipping 1470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2805 bool isOutOfFlowPositionedWithSpecifiedHeight = cb->isOutOfFlowPositioned()
&& (!cb->style()->logicalHeight().isAuto() || (!cb->style()->top().isAuto() && !
cb->style()->bottom().isAuto())); | 2788 bool isOutOfFlowPositionedWithSpecifiedHeight = cb->isOutOfFlowPositioned()
&& (!cb->style()->logicalHeight().isAuto() || (!cb->style()->top().isAuto() && !
cb->style()->bottom().isAuto())); |
| 2806 | 2789 |
| 2807 // Otherwise we only use our percentage height if our containing block had a
specified | 2790 // Otherwise we only use our percentage height if our containing block had a
specified |
| 2808 // height. | 2791 // height. |
| 2809 if (cb->style()->logicalHeight().isFixed()) | 2792 if (cb->style()->logicalHeight().isFixed()) |
| 2810 return true; | 2793 return true; |
| 2811 if (cb->style()->logicalHeight().isPercent() && !isOutOfFlowPositionedWithSp
ecifiedHeight) | 2794 if (cb->style()->logicalHeight().isPercent() && !isOutOfFlowPositionedWithSp
ecifiedHeight) |
| 2812 return percentageLogicalHeightIsResolvableFromBlock(cb->containingBlock(
), cb->isOutOfFlowPositioned()); | 2795 return percentageLogicalHeightIsResolvableFromBlock(cb->containingBlock(
), cb->isOutOfFlowPositioned()); |
| 2813 if (cb->isRenderView() || isOutOfFlowPositionedWithSpecifiedHeight) | 2796 if (cb->isRenderView() || isOutOfFlowPositionedWithSpecifiedHeight) |
| 2814 return true; | 2797 return true; |
| 2815 if (cb->isDocumentElement() && isOutOfFlowPositioned) { | |
| 2816 // Match the positioned objects behavior, which is that positioned objec
ts will fill their viewport | |
| 2817 // always. Note we could only hit this case by recurring into computePe
rcentageLogicalHeight on a positioned containing block. | |
| 2818 return true; | |
| 2819 } | |
| 2820 | |
| 2821 return false; | 2798 return false; |
| 2822 } | 2799 } |
| 2823 | 2800 |
| 2824 LayoutUnit RenderBox::lineHeight(bool /*firstLine*/, LineDirectionMode direction
, LinePositionMode /*linePositionMode*/) const | 2801 LayoutUnit RenderBox::lineHeight(bool /*firstLine*/, LineDirectionMode direction
, LinePositionMode /*linePositionMode*/) const |
| 2825 { | 2802 { |
| 2826 if (isReplaced()) | 2803 if (isReplaced()) |
| 2827 return direction == HorizontalLine ? m_marginBox.top() + height() + m_ma
rginBox.bottom() : m_marginBox.right() + width() + m_marginBox.left(); | 2804 return direction == HorizontalLine ? m_marginBox.top() + height() + m_ma
rginBox.bottom() : m_marginBox.right() + width() + m_marginBox.left(); |
| 2828 return 0; | 2805 return 0; |
| 2829 } | 2806 } |
| 2830 | 2807 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2893 | 2870 |
| 2894 RenderBox::BoxDecorationData::BoxDecorationData(const RenderStyle& style) | 2871 RenderBox::BoxDecorationData::BoxDecorationData(const RenderStyle& style) |
| 2895 { | 2872 { |
| 2896 backgroundColor = style.colorIncludingFallback(CSSPropertyBackgroundColor); | 2873 backgroundColor = style.colorIncludingFallback(CSSPropertyBackgroundColor); |
| 2897 hasBackground = backgroundColor.alpha() || style.hasBackgroundImage(); | 2874 hasBackground = backgroundColor.alpha() || style.hasBackgroundImage(); |
| 2898 ASSERT(hasBackground == style.hasBackground()); | 2875 ASSERT(hasBackground == style.hasBackground()); |
| 2899 hasBorder = style.hasBorder(); | 2876 hasBorder = style.hasBorder(); |
| 2900 } | 2877 } |
| 2901 | 2878 |
| 2902 } // namespace blink | 2879 } // namespace blink |
| OLD | NEW |