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 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. | 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. |
5 * | 5 * |
6 * This library is free software; you can redistribute it and/or | 6 * This library is free software; you can redistribute it and/or |
7 * modify it under the terms of the GNU Library General Public | 7 * modify it under the terms of the GNU Library General Public |
8 * License as published by the Free Software Foundation; either | 8 * License as published by the Free Software Foundation; either |
9 * version 2 of the License, or (at your option) any later version. | 9 * version 2 of the License, or (at your option) any later version. |
10 * | 10 * |
(...skipping 971 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
982 LayoutUnit logicalTop = firstLineBox()->logicalTopVisualOverflow(firstRootBo x.lineTop()); | 982 LayoutUnit logicalTop = firstLineBox()->logicalTopVisualOverflow(firstRootBo x.lineTop()); |
983 LayoutUnit logicalWidth = logicalRightSide - logicalLeftSide; | 983 LayoutUnit logicalWidth = logicalRightSide - logicalLeftSide; |
984 LayoutUnit logicalHeight = lastLineBox()->logicalBottomVisualOverflow(lastRo otBox.lineBottom()) - logicalTop; | 984 LayoutUnit logicalHeight = lastLineBox()->logicalBottomVisualOverflow(lastRo otBox.lineBottom()) - logicalTop; |
985 | 985 |
986 LayoutRect rect(logicalLeftSide, logicalTop, logicalWidth, logicalHeight); | 986 LayoutRect rect(logicalLeftSide, logicalTop, logicalWidth, logicalHeight); |
987 if (!style()->isHorizontalWritingMode()) | 987 if (!style()->isHorizontalWritingMode()) |
988 rect = rect.transposedRect(); | 988 rect = rect.transposedRect(); |
989 return rect; | 989 return rect; |
990 } | 990 } |
991 | 991 |
992 LayoutRect RenderInline::clippedOverflowRectForPaintInvalidation(const RenderLay erModelObject* paintInvalidationContainer) const | 992 LayoutRect RenderInline::clippedOverflowRectForPaintInvalidation(const RenderLay erModelObject* paintInvalidationContainer, const PaintInvalidationState* paintIn validationState) const |
993 { | 993 { |
994 ASSERT(!view() || !view()->layoutStateCachedOffsetsEnabled()); | |
995 | |
996 if (!firstLineBoxIncludingCulling() && !continuation()) | 994 if (!firstLineBoxIncludingCulling() && !continuation()) |
997 return LayoutRect(); | 995 return LayoutRect(); |
998 | 996 |
999 LayoutRect repaintRect(linesVisualOverflowBoundingBox()); | 997 LayoutRect repaintRect(linesVisualOverflowBoundingBox()); |
1000 bool hitRepaintContainer = false; | 998 bool hitRepaintContainer = false; |
1001 | 999 |
1002 // We need to add in the in-flow position offsets of any inlines (including us) up to our | 1000 // We need to add in the in-flow position offsets of any inlines (including us) up to our |
1003 // containing block. | 1001 // containing block. |
1004 RenderBlock* cb = containingBlock(); | 1002 RenderBlock* cb = containingBlock(); |
1005 for (const RenderObject* inlineFlow = this; inlineFlow && inlineFlow->isRend erInline() && inlineFlow != cb; | 1003 for (const RenderObject* inlineFlow = this; inlineFlow && inlineFlow->isRend erInline() && inlineFlow != cb; |
(...skipping 11 matching lines...) Expand all Loading... | |
1017 | 1015 |
1018 if (hitRepaintContainer || !cb) | 1016 if (hitRepaintContainer || !cb) |
1019 return repaintRect; | 1017 return repaintRect; |
1020 | 1018 |
1021 if (cb->hasColumns()) | 1019 if (cb->hasColumns()) |
1022 cb->adjustRectForColumns(repaintRect); | 1020 cb->adjustRectForColumns(repaintRect); |
1023 | 1021 |
1024 if (cb->hasOverflowClip()) | 1022 if (cb->hasOverflowClip()) |
1025 cb->applyCachedClipAndScrollOffsetForRepaint(repaintRect); | 1023 cb->applyCachedClipAndScrollOffsetForRepaint(repaintRect); |
1026 | 1024 |
1027 cb->mapRectToPaintInvalidationBacking(paintInvalidationContainer, repaintRec t); | 1025 cb->mapRectToPaintInvalidationBacking(paintInvalidationContainer, repaintRec t, paintInvalidationState); |
1028 | 1026 |
1029 if (outlineSize) { | 1027 if (outlineSize) { |
1030 for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling() ) { | 1028 for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling() ) { |
1031 if (!curr->isText()) | 1029 if (!curr->isText()) |
1032 repaintRect.unite(curr->rectWithOutlineForPaintInvalidation(pain tInvalidationContainer, outlineSize)); | 1030 repaintRect.unite(curr->rectWithOutlineForPaintInvalidation(pain tInvalidationContainer, outlineSize)); |
1033 } | 1031 } |
1034 | 1032 |
1035 if (continuation() && !continuation()->isInline() && continuation()->par ent()) | 1033 if (continuation() && !continuation()->isInline() && continuation()->par ent()) |
1036 repaintRect.unite(continuation()->rectWithOutlineForPaintInvalidatio n(paintInvalidationContainer, outlineSize)); | 1034 repaintRect.unite(continuation()->rectWithOutlineForPaintInvalidatio n(paintInvalidationContainer, outlineSize)); |
1037 } | 1035 } |
1038 | 1036 |
1039 return repaintRect; | 1037 return repaintRect; |
1040 } | 1038 } |
1041 | 1039 |
1042 LayoutRect RenderInline::rectWithOutlineForPaintInvalidation(const RenderLayerMo delObject* paintInvalidationContainer, LayoutUnit outlineWidth) const | 1040 LayoutRect RenderInline::rectWithOutlineForPaintInvalidation(const RenderLayerMo delObject* paintInvalidationContainer, LayoutUnit outlineWidth, const PaintInval idationState* paintInvalidationState) const |
1043 { | 1041 { |
1044 LayoutRect r(RenderBoxModelObject::rectWithOutlineForPaintInvalidation(paint InvalidationContainer, outlineWidth)); | 1042 LayoutRect r(RenderBoxModelObject::rectWithOutlineForPaintInvalidation(paint InvalidationContainer, outlineWidth, paintInvalidationState)); |
1045 for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling()) { | 1043 for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling()) { |
1046 if (!curr->isText()) | 1044 if (!curr->isText()) |
1047 r.unite(curr->rectWithOutlineForPaintInvalidation(paintInvalidationC ontainer, outlineWidth)); | 1045 r.unite(curr->rectWithOutlineForPaintInvalidation(paintInvalidationC ontainer, outlineWidth, paintInvalidationState)); |
1048 } | 1046 } |
1049 return r; | 1047 return r; |
1050 } | 1048 } |
1051 | 1049 |
1052 void RenderInline::mapRectToPaintInvalidationBacking(const RenderLayerModelObjec t* paintInvalidationContainer, LayoutRect& rect, bool fixed) const | 1050 void RenderInline::mapRectToPaintInvalidationBacking(const RenderLayerModelObjec t* paintInvalidationContainer, LayoutRect& rect, bool fixed, const PaintInvalida tionState* paintInvalidationState) const |
1053 { | 1051 { |
1054 if (RenderView* v = view()) { | 1052 if (paintInvalidationState && paintInvalidationState->canMapToContainer(pain tInvalidationContainer)) { |
1055 // LayoutState is only valid for root-relative repainting | 1053 if (style()->hasInFlowPosition() && layer()) |
1056 if (v->canMapUsingLayoutStateForContainer(paintInvalidationContainer)) { | 1054 rect.move(layer()->offsetForInFlowPosition()); |
1057 LayoutState* layoutState = v->layoutState(); | 1055 rect.move(paintInvalidationState->paintOffset()); |
1058 if (style()->hasInFlowPosition() && layer()) | 1056 if (paintInvalidationState->isClipped()) |
1059 rect.move(layer()->offsetForInFlowPosition()); | 1057 rect.intersect(paintInvalidationState->clipRect()); |
Julien - ping for review
2014/07/07 22:09:59
This code should be probably factored out into the
| |
1060 rect.move(layoutState->paintOffset()); | 1058 return; |
1061 if (layoutState->isClipped()) | |
1062 rect.intersect(layoutState->clipRect()); | |
1063 return; | |
1064 } | |
1065 } | 1059 } |
1066 | 1060 |
1067 if (paintInvalidationContainer == this) | 1061 if (paintInvalidationContainer == this) |
1068 return; | 1062 return; |
1069 | 1063 |
1070 bool containerSkipped; | 1064 bool containerSkipped; |
1071 RenderObject* o = container(paintInvalidationContainer, &containerSkipped); | 1065 RenderObject* o = container(paintInvalidationContainer, &containerSkipped); |
1072 if (!o) | 1066 if (!o) |
1073 return; | 1067 return; |
1074 | 1068 |
(...skipping 27 matching lines...) Expand all Loading... | |
1102 return; | 1096 return; |
1103 } | 1097 } |
1104 | 1098 |
1105 if (containerSkipped) { | 1099 if (containerSkipped) { |
1106 // If the paintInvalidationContainer is below o, then we need to map the rect into paintInvalidationContainer's coordinates. | 1100 // If the paintInvalidationContainer is below o, then we need to map the rect into paintInvalidationContainer's coordinates. |
1107 LayoutSize containerOffset = paintInvalidationContainer->offsetFromAnces torContainer(o); | 1101 LayoutSize containerOffset = paintInvalidationContainer->offsetFromAnces torContainer(o); |
1108 rect.move(-containerOffset); | 1102 rect.move(-containerOffset); |
1109 return; | 1103 return; |
1110 } | 1104 } |
1111 | 1105 |
1112 o->mapRectToPaintInvalidationBacking(paintInvalidationContainer, rect, fixed ); | 1106 o->mapRectToPaintInvalidationBacking(paintInvalidationContainer, rect, fixed , paintInvalidationState); |
1113 } | 1107 } |
1114 | 1108 |
1115 LayoutSize RenderInline::offsetFromContainer(const RenderObject* container, cons t LayoutPoint& point, bool* offsetDependsOnPoint) const | 1109 LayoutSize RenderInline::offsetFromContainer(const RenderObject* container, cons t LayoutPoint& point, bool* offsetDependsOnPoint) const |
1116 { | 1110 { |
1117 ASSERT(container == this->container()); | 1111 ASSERT(container == this->container()); |
1118 | 1112 |
1119 LayoutSize offset; | 1113 LayoutSize offset; |
1120 if (isRelPositioned()) | 1114 if (isRelPositioned()) |
1121 offset += offsetForInFlowPosition(); | 1115 offset += offsetForInFlowPosition(); |
1122 | 1116 |
1123 offset += container->columnOffset(point); | 1117 offset += container->columnOffset(point); |
1124 | 1118 |
1125 if (container->hasOverflowClip()) | 1119 if (container->hasOverflowClip()) |
1126 offset -= toRenderBox(container)->scrolledContentOffset(); | 1120 offset -= toRenderBox(container)->scrolledContentOffset(); |
1127 | 1121 |
1128 if (offsetDependsOnPoint) { | 1122 if (offsetDependsOnPoint) { |
1129 *offsetDependsOnPoint = container->hasColumns() | 1123 *offsetDependsOnPoint = container->hasColumns() |
1130 || (container->isBox() && container->style()->isFlippedBlocksWriting Mode()) | 1124 || (container->isBox() && container->style()->isFlippedBlocksWriting Mode()) |
1131 || container->isRenderFlowThread(); | 1125 || container->isRenderFlowThread(); |
1132 } | 1126 } |
1133 | 1127 |
1134 return offset; | 1128 return offset; |
1135 } | 1129 } |
1136 | 1130 |
1137 void RenderInline::mapLocalToContainer(const RenderLayerModelObject* repaintCont ainer, TransformState& transformState, MapCoordinatesFlags mode, bool* wasFixed) const | 1131 void RenderInline::mapLocalToContainer(const RenderLayerModelObject* repaintCont ainer, TransformState& transformState, MapCoordinatesFlags mode, bool* wasFixed, const PaintInvalidationState* paintInvalidationState) const |
1138 { | 1132 { |
1139 if (repaintContainer == this) | 1133 if (repaintContainer == this) |
1140 return; | 1134 return; |
1141 | 1135 |
1142 if (RenderView *v = view()) { | 1136 if (paintInvalidationState && paintInvalidationState->canMapToContainer(repa intContainer)) { |
1143 if (v->canMapUsingLayoutStateForContainer(repaintContainer)) { | 1137 LayoutSize offset = paintInvalidationState->paintOffset(); |
1144 LayoutState* layoutState = v->layoutState(); | 1138 if (style()->hasInFlowPosition() && layer()) |
1145 LayoutSize offset = layoutState->paintOffset(); | 1139 offset += layer()->offsetForInFlowPosition(); |
1146 if (style()->hasInFlowPosition() && layer()) | 1140 transformState.move(offset); |
1147 offset += layer()->offsetForInFlowPosition(); | 1141 return; |
1148 transformState.move(offset); | |
1149 return; | |
1150 } | |
1151 } | 1142 } |
1152 | 1143 |
1153 bool containerSkipped; | 1144 bool containerSkipped; |
1154 RenderObject* o = container(repaintContainer, &containerSkipped); | 1145 RenderObject* o = container(repaintContainer, &containerSkipped); |
1155 if (!o) | 1146 if (!o) |
1156 return; | 1147 return; |
1157 | 1148 |
1158 if (mode & ApplyContainerFlip && o->isBox()) { | 1149 if (mode & ApplyContainerFlip && o->isBox()) { |
1159 if (o->style()->isFlippedBlocksWritingMode()) { | 1150 if (o->style()->isFlippedBlocksWritingMode()) { |
1160 IntPoint centerPoint = roundedIntPoint(transformState.mappedPoint()) ; | 1151 IntPoint centerPoint = roundedIntPoint(transformState.mappedPoint()) ; |
(...skipping 13 matching lines...) Expand all Loading... | |
1174 transformState.move(containerOffset.width(), containerOffset.height(), p reserve3D ? TransformState::AccumulateTransform : TransformState::FlattenTransfo rm); | 1165 transformState.move(containerOffset.width(), containerOffset.height(), p reserve3D ? TransformState::AccumulateTransform : TransformState::FlattenTransfo rm); |
1175 | 1166 |
1176 if (containerSkipped) { | 1167 if (containerSkipped) { |
1177 // There can't be a transform between repaintContainer and o, because tr ansforms create containers, so it should be safe | 1168 // There can't be a transform between repaintContainer and o, because tr ansforms create containers, so it should be safe |
1178 // to just subtract the delta between the repaintContainer and o. | 1169 // to just subtract the delta between the repaintContainer and o. |
1179 LayoutSize containerOffset = repaintContainer->offsetFromAncestorContain er(o); | 1170 LayoutSize containerOffset = repaintContainer->offsetFromAncestorContain er(o); |
1180 transformState.move(-containerOffset.width(), -containerOffset.height(), preserve3D ? TransformState::AccumulateTransform : TransformState::FlattenTrans form); | 1171 transformState.move(-containerOffset.width(), -containerOffset.height(), preserve3D ? TransformState::AccumulateTransform : TransformState::FlattenTrans form); |
1181 return; | 1172 return; |
1182 } | 1173 } |
1183 | 1174 |
1184 o->mapLocalToContainer(repaintContainer, transformState, mode, wasFixed); | 1175 o->mapLocalToContainer(repaintContainer, transformState, mode, wasFixed, pai ntInvalidationState); |
1185 } | 1176 } |
1186 | 1177 |
1187 void RenderInline::updateDragState(bool dragOn) | 1178 void RenderInline::updateDragState(bool dragOn) |
1188 { | 1179 { |
1189 RenderBoxModelObject::updateDragState(dragOn); | 1180 RenderBoxModelObject::updateDragState(dragOn); |
1190 if (continuation()) | 1181 if (continuation()) |
1191 continuation()->updateDragState(dragOn); | 1182 continuation()->updateDragState(dragOn); |
1192 } | 1183 } |
1193 | 1184 |
1194 void RenderInline::childBecameNonInline(RenderObject* child) | 1185 void RenderInline::childBecameNonInline(RenderObject* child) |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1562 if (!container) | 1553 if (!container) |
1563 container = this; | 1554 container = this; |
1564 | 1555 |
1565 FloatPoint absPos = container->localToAbsolute(); | 1556 FloatPoint absPos = container->localToAbsolute(); |
1566 region.bounds.setX(absPos.x() + region.bounds.x()); | 1557 region.bounds.setX(absPos.x() + region.bounds.x()); |
1567 region.bounds.setY(absPos.y() + region.bounds.y()); | 1558 region.bounds.setY(absPos.y() + region.bounds.y()); |
1568 | 1559 |
1569 regions.append(region); | 1560 regions.append(region); |
1570 } | 1561 } |
1571 | 1562 |
1572 void RenderInline::invalidateTreeAfterLayout(const RenderLayerModelObject& paint InvalidationContainer) | 1563 void RenderInline::invalidateTreeAfterLayout(const PaintInvalidationState& paint InvalidationState) |
1573 { | 1564 { |
1574 LayoutState state(*this); | 1565 bool establishesNewPaintInvalidationContainer = isPaintInvalidationContainer (); |
1575 RenderObject::invalidateTreeAfterLayout(paintInvalidationContainer); | 1566 const RenderLayerModelObject& newPaintInvalidationContainer = *adjustComposi tedContainerForSpecialAncestors(establishesNewPaintInvalidationContainer ? this : &paintInvalidationState.paintInvalidationContainer()); |
1567 PaintInvalidationState childPaintInvalidationState(paintInvalidationState, * this, newPaintInvalidationContainer); | |
1568 RenderObject::invalidateTreeAfterLayout(paintInvalidationState); | |
1576 } | 1569 } |
1577 | 1570 |
1578 } // namespace WebCore | 1571 } // namespace WebCore |
OLD | NEW |