Changeset 118567 in webkit
- Timestamp:
- May 25, 2012, 2:42:32 PM (14 years ago)
- Location:
- trunk
- Files:
-
- 8 added
- 32 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/compositing/geometry/composited-in-columns-expected.png (added)
-
LayoutTests/compositing/geometry/composited-in-columns-expected.txt (added)
-
LayoutTests/compositing/geometry/composited-in-columns.html (added)
-
LayoutTests/compositing/geometry/flipped-writing-mode-expected.png (added)
-
LayoutTests/compositing/geometry/flipped-writing-mode-expected.txt (added)
-
LayoutTests/compositing/geometry/flipped-writing-mode.html (added)
-
Source/WebCore/CMakeLists.txt (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/GNUmakefile.list.am (modified) (1 diff)
-
Source/WebCore/Target.pri (modified) (2 diffs)
-
Source/WebCore/WebCore.gypi (modified) (1 diff)
-
Source/WebCore/WebCore.vcproj/WebCore.vcproj (modified) (1 diff)
-
Source/WebCore/WebCore.xcodeproj/project.pbxproj (modified) (5 diffs)
-
Source/WebCore/rendering/RenderBox.cpp (modified) (5 diffs)
-
Source/WebCore/rendering/RenderBox.h (modified) (2 diffs)
-
Source/WebCore/rendering/RenderGeometryMap.cpp (added)
-
Source/WebCore/rendering/RenderGeometryMap.h (added)
-
Source/WebCore/rendering/RenderInline.cpp (modified) (4 diffs)
-
Source/WebCore/rendering/RenderInline.h (modified) (2 diffs)
-
Source/WebCore/rendering/RenderLayerCompositor.cpp (modified) (18 diffs)
-
Source/WebCore/rendering/RenderLayerCompositor.h (modified) (2 diffs)
-
Source/WebCore/rendering/RenderObject.cpp (modified) (6 diffs)
-
Source/WebCore/rendering/RenderObject.h (modified) (4 diffs)
-
Source/WebCore/rendering/RenderTableCell.cpp (modified) (1 diff)
-
Source/WebCore/rendering/RenderTableCell.h (modified) (1 diff)
-
Source/WebCore/rendering/RenderView.cpp (modified) (2 diffs)
-
Source/WebCore/rendering/RenderView.h (modified) (1 diff)
-
Source/WebCore/rendering/svg/RenderSVGForeignObject.cpp (modified) (1 diff)
-
Source/WebCore/rendering/svg/RenderSVGForeignObject.h (modified) (1 diff)
-
Source/WebCore/rendering/svg/RenderSVGInline.cpp (modified) (1 diff)
-
Source/WebCore/rendering/svg/RenderSVGInline.h (modified) (1 diff)
-
Source/WebCore/rendering/svg/RenderSVGModelObject.cpp (modified) (1 diff)
-
Source/WebCore/rendering/svg/RenderSVGModelObject.h (modified) (1 diff)
-
Source/WebCore/rendering/svg/RenderSVGRoot.cpp (modified) (1 diff)
-
Source/WebCore/rendering/svg/RenderSVGRoot.h (modified) (1 diff)
-
Source/WebCore/rendering/svg/RenderSVGText.cpp (modified) (1 diff)
-
Source/WebCore/rendering/svg/RenderSVGText.h (modified) (1 diff)
-
Source/WebCore/rendering/svg/SVGRenderSupport.cpp (modified) (2 diffs)
-
Source/WebCore/rendering/svg/SVGRenderSupport.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r118566 r118567 1 2012-05-25 Simon Fraser <simon.fraser@apple.com> 2 3 Terrible performance on http://alliances.commandandconquer.com/ and http://www.lordofultima.com/ 4 https://bugs.webkit.org/show_bug.cgi?id=84410 5 6 Reviewed by Dave Hyatt. 7 8 Basic tests for compositing inside columns, and in a flipped-writing-mode 9 document. 10 11 * compositing/geometry/composited-in-columns-expected.png: Added. 12 * compositing/geometry/composited-in-columns-expected.txt: Added. 13 * compositing/geometry/composited-in-columns.html: Added. 14 * compositing/geometry/flipped-writing-mode-expected.png: Added. 15 * compositing/geometry/flipped-writing-mode-expected.txt: Added. 16 * compositing/geometry/flipped-writing-mode.html: Added. 17 1 18 2012-05-25 Andras Becsi <andras.becsi@nokia.com> 2 19 -
trunk/Source/WebCore/CMakeLists.txt
r118376 r118567 1342 1342 rendering/RenderFrameSet.cpp 1343 1343 rendering/RenderFullScreen.cpp 1344 rendering/RenderGeometryMap.cpp 1344 1345 rendering/RenderHTMLCanvas.cpp 1345 1346 rendering/RenderIFrame.cpp -
trunk/Source/WebCore/ChangeLog
r118562 r118567 1 2012-05-25 Simon Fraser <simon.fraser@apple.com> 2 3 Terrible performance on http://alliances.commandandconquer.com/ and http://www.lordofultima.com/ 4 https://bugs.webkit.org/show_bug.cgi?id=84410 5 6 Reviewed by Dave Hyatt. 7 8 First part of fixing O(N^2) issues when walking the RenderLayer tree 9 for computeCompositingRequirements(). 10 11 For each layer that goes into the OverlapMap, we were computing an absolute 12 layer bounds, which requires walking back to the root of the tree. 13 Optimize this when possible by storing a stack of offsets as we walk 14 the tree, and using this stack to do the mapping. 15 16 The stack of offsets and transforms is managed by RenderGeometryMap. 17 When visiting a RenderLayer, RenderLayerCompositor pushes onto 18 the geometry map stack data about offsets and transforms between 19 the current layer and its stacking-parent. RenderGeometryMap handles 20 the case where the previous renderer pushed is between the current 21 renderer and its container. RenderGeometryMap can also handle callers 22 pushing renderers with multiple containers between them. 23 24 RenderGeometryMap stores some flags about whether the set of mapping 25 steps in the stack involve transforms, fixed position, or special non-uniform 26 mappings like CSS columns. In some cases, it falls back to mapping via 27 renderers. 28 29 Once constructed, the RenderGeometryMap stack can be used to map multiple 30 rects or points efficiently. Stacks consisting of simple offsets are 31 collapsed to a single offset. 32 33 Mappings between renderers and their containers are pushed by pushMappingToContainer() 34 methods, which are similar to mapLocalToContainer() methods. Having this code 35 in RenderObjects was deemed preferable to handling columns, transforms etc. all in 36 RenderLayer code. 37 38 Tested by assertions in RenderGeometryMap code that its mapping matches 39 mapping via localToAbsolute() calls. 40 41 RenderLayerCompositor::updateCompositingLayers() creates a RenderGeometryMap, 42 and pushes and pops layer renderers as it visits them. The geometry map is used 43 by RenderLayerCompositor::addToOverlapMap() when computing absolute layer bounds. 44 45 Futher optimizations in RenderGeometryMap are possible, especially with stacks that 46 have many offsets and a few transforms. 47 48 Tests: compositing/geometry/composited-in-columns.html 49 compositing/geometry/flipped-writing-mode.html 50 51 * CMakeLists.txt: Add RenderGeometryMap 52 * GNUmakefile.list.am: Ditt 53 * Target.pri: Ditto 54 * WebCore.gypi: Ditto 55 * WebCore.vcproj/WebCore.vcproj: Ditto 56 * WebCore.xcodeproj/project.pbxproj: Ditto 57 * rendering/RenderBox.cpp: 58 (WebCore::RenderBox::absoluteContentBox): 59 (WebCore::RenderBox::pushMappingToContainer): 60 (WebCore::RenderBox::offsetFromContainer): 61 * rendering/RenderBox.h: 62 * rendering/RenderGeometryMap.cpp: Added. 63 (RenderGeometryMapStep): 64 (WebCore::RenderGeometryMapStep::RenderGeometryMapStep): 65 (WebCore::RenderGeometryMapStep::mapPoint): 66 (WebCore::RenderGeometryMapStep::mapQuad): 67 (WebCore::RenderGeometryMap::RenderGeometryMap): 68 (WebCore::RenderGeometryMap::~RenderGeometryMap): 69 (WebCore::RenderGeometryMap::absolutePoint): 70 (WebCore::RenderGeometryMap::absoluteRect): 71 (WebCore::RenderGeometryMap::mapToAbsolute): 72 (WebCore::RenderGeometryMap::pushMappingsToAncestor): 73 (WebCore::RenderGeometryMap::push): 74 (WebCore::RenderGeometryMap::pushView): 75 (WebCore::RenderGeometryMap::popMappingsToAncestor): 76 (WebCore::RenderGeometryMap::stepInserted): 77 (WebCore::RenderGeometryMap::stepRemoved): 78 * rendering/RenderGeometryMap.h: Added. 79 (RenderGeometryMap): 80 (WebCore::RenderGeometryMap::hasNonUniformStep): 81 (WebCore::RenderGeometryMap::hasTransformStep): 82 (WebCore::RenderGeometryMap::hasFixedPositionStep): 83 * rendering/RenderInline.cpp: 84 (WebCore::RenderInline::offsetFromContainer): 85 (WebCore::RenderInline::pushMappingToContainer): 86 * rendering/RenderInline.h: 87 (RenderInline): 88 * rendering/RenderLayerCompositor.cpp: 89 (WebCore::RenderLayerCompositor::updateCompositingLayers): 90 (WebCore::RenderLayerCompositor::addToOverlapMap): 91 (WebCore::RenderLayerCompositor::addToOverlapMapRecursive): 92 (WebCore::RenderLayerCompositor::computeCompositingRequirements): 93 * rendering/RenderLayerCompositor.h: 94 (RenderLayerCompositor): 95 * rendering/RenderObject.cpp: 96 (WebCore::RenderObject::mapLocalToContainer): 97 (WebCore::RenderObject::pushMappingToContainer): 98 (WebCore::RenderObject::offsetFromContainer): 99 (WebCore::RenderObject::container): 100 * rendering/RenderObject.h: 101 * rendering/RenderTableCell.cpp: 102 (WebCore::RenderTableCell::offsetFromContainer): 103 * rendering/RenderTableCell.h: 104 (RenderTableCell): 105 * rendering/RenderView.cpp: 106 (WebCore::RenderView::pushMappingToContainer): 107 * rendering/RenderView.h: 108 * rendering/svg/RenderSVGForeignObject.cpp: 109 (WebCore::RenderSVGForeignObject::pushMappingToContainer): 110 * rendering/svg/RenderSVGForeignObject.h: 111 (RenderSVGForeignObject): 112 * rendering/svg/RenderSVGInline.cpp: 113 (WebCore::RenderSVGInline::pushMappingToContainer): 114 * rendering/svg/RenderSVGInline.h: 115 (RenderSVGInline): 116 * rendering/svg/RenderSVGModelObject.cpp: 117 (WebCore::RenderSVGModelObject::pushMappingToContainer): 118 * rendering/svg/RenderSVGModelObject.h: 119 (RenderSVGModelObject): 120 * rendering/svg/RenderSVGRoot.cpp: 121 (WebCore::RenderSVGRoot::pushMappingToContainer): 122 * rendering/svg/RenderSVGRoot.h: 123 (RenderSVGRoot): 124 * rendering/svg/RenderSVGText.cpp: 125 (WebCore::RenderSVGText::pushMappingToContainer): 126 * rendering/svg/RenderSVGText.h: 127 (RenderSVGText): 128 * rendering/svg/SVGRenderSupport.cpp: 129 (WebCore::SVGRenderSupport::pushMappingToContainer): 130 * rendering/svg/SVGRenderSupport.h: 131 (SVGRenderSupport): 132 1 133 2012-05-25 Simon Fraser <simon.fraser@apple.com> 2 134 -
trunk/Source/WebCore/GNUmakefile.list.am
r118510 r118567 3815 3815 Source/WebCore/rendering/RenderFullScreen.cpp \ 3816 3816 Source/WebCore/rendering/RenderFullScreen.h \ 3817 Source/WebCore/rendering/RenderGeometryMap.cpp \ 3818 Source/WebCore/rendering/RenderGeometryMap.h \ 3817 3819 Source/WebCore/rendering/RenderHTMLCanvas.cpp \ 3818 3820 Source/WebCore/rendering/RenderHTMLCanvas.h \ -
trunk/Source/WebCore/Target.pri
r118407 r118567 1267 1267 rendering/RenderFrameBase.cpp \ 1268 1268 rendering/RenderFrameSet.cpp \ 1269 rendering/RenderGeometryMap.cpp \ 1269 1270 rendering/RenderHTMLCanvas.cpp \ 1270 1271 rendering/RenderIFrame.cpp \ … … 2464 2465 rendering/RenderFrameBase.h \ 2465 2466 rendering/RenderFrameSet.h \ 2467 rendering/RenderGeometryMap.h \ 2466 2468 rendering/RenderHTMLCanvas.h \ 2467 2469 rendering/RenderIFrame.h \ -
trunk/Source/WebCore/WebCore.gypi
r118527 r118567 4811 4811 'rendering/RenderFullScreen.cpp', 4812 4812 'rendering/RenderFullScreen.h', 4813 'rendering/RenderGeometryMap.cpp', 4814 'rendering/RenderGeometryMap.h', 4813 4815 'rendering/RenderHTMLCanvas.cpp', 4814 4816 'rendering/RenderHTMLCanvas.h', -
trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj
r118510 r118567 39372 39372 </File> 39373 39373 <File 39374 RelativePath="..\rendering\RenderGeometryMap.cpp" 39375 > 39376 </File> 39377 <File 39378 RelativePath="..\rendering\RenderGeometryMap.h" 39379 > 39380 </File> 39381 <File 39374 39382 RelativePath="..\rendering\RenderHTMLCanvas.cpp" 39375 39383 > -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r118510 r118567 242 242 0F3DD44F12F5EA1B000D9190 /* ShadowBlur.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F3DD44D12F5EA1B000D9190 /* ShadowBlur.cpp */; }; 243 243 0F3DD45012F5EA1B000D9190 /* ShadowBlur.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F3DD44E12F5EA1B000D9190 /* ShadowBlur.h */; }; 244 0F3F0E59157030C3006DA57F /* RenderGeometryMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F3F0E57157030C3006DA57F /* RenderGeometryMap.cpp */; }; 245 0F3F0E5A157030C3006DA57F /* RenderGeometryMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F3F0E58157030C3006DA57F /* RenderGeometryMap.h */; }; 244 246 0F4E57171313276200CF85AF /* RenderSVGAllInOne.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F4E57161313276200CF85AF /* RenderSVGAllInOne.cpp */; }; 245 247 0F56028F0E4B76580065B038 /* RenderMarquee.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F56028D0E4B76580065B038 /* RenderMarquee.h */; }; … … 7130 7132 0F3DD44D12F5EA1B000D9190 /* ShadowBlur.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ShadowBlur.cpp; sourceTree = "<group>"; }; 7131 7133 0F3DD44E12F5EA1B000D9190 /* ShadowBlur.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShadowBlur.h; sourceTree = "<group>"; }; 7134 0F3F0E57157030C3006DA57F /* RenderGeometryMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderGeometryMap.cpp; sourceTree = "<group>"; }; 7135 0F3F0E58157030C3006DA57F /* RenderGeometryMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderGeometryMap.h; sourceTree = "<group>"; }; 7132 7136 0F4E57161313276200CF85AF /* RenderSVGAllInOne.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderSVGAllInOne.cpp; sourceTree = "<group>"; }; 7133 7137 0F56028D0E4B76580065B038 /* RenderMarquee.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderMarquee.h; sourceTree = "<group>"; }; … … 20925 20929 CDEA7C831276230400B846DD /* RenderFullScreen.cpp */, 20926 20930 CDEA7C821276230400B846DD /* RenderFullScreen.h */, 20931 0F3F0E57157030C3006DA57F /* RenderGeometryMap.cpp */, 20932 0F3F0E58157030C3006DA57F /* RenderGeometryMap.h */, 20927 20933 BCEA482A097D93020094C9E4 /* RenderHTMLCanvas.cpp */, 20928 20934 BCEA482B097D93020094C9E4 /* RenderHTMLCanvas.h */, … … 24951 24957 E4946EAF156E64DD00D3297F /* StyleRuleImport.h in Headers */, 24952 24958 71DCB7021568197600862271 /* JSSVGZoomAndPan.h in Headers */, 24959 0F3F0E5A157030C3006DA57F /* RenderGeometryMap.h in Headers */, 24953 24960 ); 24954 24961 runOnlyForDeploymentPostprocessing = 0; … … 27982 27989 E4946EAE156E64DD00D3297F /* StyleRuleImport.cpp in Sources */, 27983 27990 71DCB7011568197600862271 /* JSSVGZoomAndPan.cpp in Sources */, 27991 0F3F0E59157030C3006DA57F /* RenderGeometryMap.cpp in Sources */, 27984 27992 ); 27985 27993 runOnlyForDeploymentPostprocessing = 0; -
trunk/Source/WebCore/rendering/RenderBox.cpp
r118551 r118567 45 45 #include "RenderFlexibleBox.h" 46 46 #include "RenderFlowThread.h" 47 #include "RenderGeometryMap.h" 47 48 #include "RenderInline.h" 48 49 #include "RenderLayer.h" … … 438 439 IntRect RenderBox::absoluteContentBox() const 439 440 { 441 // This is wrong with transforms and flipped writing modes. 440 442 IntRect rect = pixelSnappedIntRect(contentBoxRect()); 441 443 FloatPoint absPos = localToAbsolute(FloatPoint()); … … 1316 1318 } 1317 1319 1320 const RenderObject* RenderBox::pushMappingToContainer(const RenderBoxModelObject* ancestorToStopAt, RenderGeometryMap& geometryMap) const 1321 { 1322 ASSERT(ancestorToStopAt != this); 1323 1324 bool ancestorSkipped; 1325 RenderObject* container = this->container(ancestorToStopAt, &ancestorSkipped); 1326 if (!container) 1327 return 0; 1328 1329 bool isFixedPos = style()->position() == FixedPosition; 1330 bool hasTransform = hasLayer() && layer()->transform(); 1331 1332 LayoutSize adjustmentForSkippedAncestor; 1333 if (ancestorSkipped) { 1334 // There can't be a transform between repaintContainer and o, because transforms create containers, so it should be safe 1335 // to just subtract the delta between the ancestor and o. 1336 adjustmentForSkippedAncestor = -ancestorToStopAt->offsetFromAncestorContainer(container); 1337 } 1338 1339 bool offsetDependsOnPoint = false; 1340 LayoutSize containerOffset = offsetFromContainer(container, LayoutPoint(), &offsetDependsOnPoint); 1341 1342 if (container->isRenderFlowThread()) 1343 offsetDependsOnPoint = true; 1344 1345 bool preserve3D = container->style()->preserves3D() || style()->preserves3D(); 1346 if (shouldUseTransformFromContainer(container)) { 1347 TransformationMatrix t; 1348 getTransformFromContainer(container, containerOffset, t); 1349 t.translateRight(adjustmentForSkippedAncestor.width(), adjustmentForSkippedAncestor.height()); 1350 1351 geometryMap.push(this, t, preserve3D, offsetDependsOnPoint, isFixedPos, hasTransform); 1352 } else { 1353 containerOffset += adjustmentForSkippedAncestor; 1354 geometryMap.push(this, containerOffset, preserve3D, offsetDependsOnPoint, isFixedPos, hasTransform); 1355 } 1356 1357 return ancestorSkipped ? ancestorToStopAt : container; 1358 } 1359 1318 1360 void RenderBox::mapAbsoluteToLocalPoint(bool fixed, bool useTransforms, TransformState& transformState) const 1319 1361 { … … 1333 1375 } 1334 1376 1335 LayoutSize RenderBox::offsetFromContainer(RenderObject* o, const LayoutPoint& point ) const1377 LayoutSize RenderBox::offsetFromContainer(RenderObject* o, const LayoutPoint& point, bool* offsetDependsOnPoint) const 1336 1378 { 1337 1379 ASSERT(o == container()); … … 1351 1393 o->adjustForColumns(offset, columnPoint); 1352 1394 offset = block->flipForWritingMode(offset); 1395 1396 if (offsetDependsOnPoint) 1397 *offsetDependsOnPoint = true; 1353 1398 } else 1354 1399 offset += topLeftLocationOffset(); -
trunk/Source/WebCore/rendering/RenderBox.h
r118291 r118567 277 277 void clearOverrideSize(); 278 278 279 virtual LayoutSize offsetFromContainer(RenderObject*, const LayoutPoint& ) const;279 virtual LayoutSize offsetFromContainer(RenderObject*, const LayoutPoint&, bool* offsetDependsOnPoint = 0) const; 280 280 281 281 LayoutUnit computeBorderBoxLogicalWidth(LayoutUnit width) const; … … 520 520 521 521 virtual void mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool fixed, bool useTransforms, TransformState&, ApplyContainerFlipOrNot = ApplyContainerFlip, bool* wasFixed = 0) const; 522 virtual const RenderObject* pushMappingToContainer(const RenderBoxModelObject*, RenderGeometryMap&) const; 522 523 virtual void mapAbsoluteToLocalPoint(bool fixed, bool useTransforms, TransformState&) const; 523 524 -
trunk/Source/WebCore/rendering/RenderInline.cpp
r118094 r118567 33 33 #include "RenderBlock.h" 34 34 #include "RenderFlowThread.h" 35 #include "RenderGeometryMap.h" 35 36 #include "RenderLayer.h" 36 37 #include "RenderTheme.h" … … 1066 1067 } 1067 1068 1068 LayoutSize RenderInline::offsetFromContainer(RenderObject* container, const LayoutPoint& point ) const1069 LayoutSize RenderInline::offsetFromContainer(RenderObject* container, const LayoutPoint& point, bool* offsetDependsOnPoint) const 1069 1070 { 1070 1071 ASSERT(container == this->container()); … … 1078 1079 if (container->hasOverflowClip()) 1079 1080 offset -= toRenderBox(container)->scrolledContentOffset(); 1081 1082 if (offsetDependsOnPoint) 1083 *offsetDependsOnPoint = container->hasColumns(); 1080 1084 1081 1085 return offset; … … 1128 1132 1129 1133 o->mapLocalToContainer(repaintContainer, fixed, useTransforms, transformState, applyContainerFlip, wasFixed); 1134 } 1135 1136 const RenderObject* RenderInline::pushMappingToContainer(const RenderBoxModelObject* ancestorToStopAt, RenderGeometryMap& geometryMap) const 1137 { 1138 ASSERT(ancestorToStopAt != this); 1139 1140 bool ancestorSkipped; 1141 RenderObject* container = this->container(ancestorToStopAt, &ancestorSkipped); 1142 if (!container) 1143 return 0; 1144 1145 bool offsetDependsOnPoint = false; 1146 1147 if (container->isBox() && container->style()->isFlippedBlocksWritingMode()) 1148 offsetDependsOnPoint = true; 1149 1150 LayoutSize adjustmentForSkippedAncestor; 1151 if (ancestorSkipped) { 1152 // There can't be a transform between repaintContainer and o, because transforms create containers, so it should be safe 1153 // to just subtract the delta between the ancestor and o. 1154 adjustmentForSkippedAncestor = -ancestorToStopAt->offsetFromAncestorContainer(container); 1155 } 1156 1157 LayoutSize containerOffset = offsetFromContainer(container, LayoutPoint(), &offsetDependsOnPoint); 1158 1159 bool preserve3D = container->style()->preserves3D() || style()->preserves3D(); 1160 if (shouldUseTransformFromContainer(container)) { 1161 TransformationMatrix t; 1162 getTransformFromContainer(container, containerOffset, t); 1163 t.translateRight(adjustmentForSkippedAncestor.width(), adjustmentForSkippedAncestor.height()); // FIXME: right? 1164 geometryMap.push(this, t, preserve3D, offsetDependsOnPoint); 1165 } else { 1166 containerOffset += adjustmentForSkippedAncestor; 1167 geometryMap.push(this, containerOffset, preserve3D, offsetDependsOnPoint); 1168 } 1169 1170 return ancestorSkipped ? ancestorToStopAt : container; 1130 1171 } 1131 1172 -
trunk/Source/WebCore/rendering/RenderInline.h
r117946 r118567 50 50 virtual void absoluteQuads(Vector<FloatQuad>&, bool* wasFixed) const; 51 51 52 virtual LayoutSize offsetFromContainer(RenderObject*, const LayoutPoint& ) const;52 virtual LayoutSize offsetFromContainer(RenderObject*, const LayoutPoint&, bool* offsetDependsOnPoint = 0) const; 53 53 54 54 IntRect linesBoundingBox() const; … … 135 135 136 136 virtual void mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool fixed, bool useTransforms, TransformState&, ApplyContainerFlipOrNot = ApplyContainerFlip, bool* wasFixed = 0) const; 137 virtual const RenderObject* pushMappingToContainer(const RenderBoxModelObject* ancestorToStopAt, RenderGeometryMap&) const; 137 138 138 139 virtual VisiblePosition positionForPoint(const LayoutPoint&); -
trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp
r118562 r118567 46 46 #include "RenderEmbeddedObject.h" 47 47 #include "RenderFullScreen.h" 48 #include "RenderGeometryMap.h" 48 49 #include "RenderIFrame.h" 49 50 #include "RenderLayerBacking.h" … … 55 56 #include "Settings.h" 56 57 #include "TiledBacking.h" 58 #include "TransformState.h" 57 59 58 60 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO) … … 399 401 if (m_compositingConsultsOverlap) { 400 402 OverlapMap overlapTestRequestMap; 401 computeCompositingRequirements(updateRoot, &overlapTestRequestMap, compState, layersChanged); 403 RenderGeometryMap geometryMap; 404 computeCompositingRequirements(0, updateRoot, &geometryMap, &overlapTestRequestMap, compState, layersChanged); 402 405 } else 403 computeCompositingRequirements( updateRoot, 0, compState, layersChanged);406 computeCompositingRequirements(0, updateRoot, 0, 0, compState, layersChanged); 404 407 405 408 needHierarchyUpdate |= layersChanged; … … 628 631 } 629 632 630 void RenderLayerCompositor::addToOverlapMap( OverlapMap& overlapMap, RenderLayer* layer, IntRect& layerBounds, bool& boundsComputed)633 void RenderLayerCompositor::addToOverlapMap(RenderGeometryMap& geometryMap, OverlapMap& overlapMap, RenderLayer* layer, IntRect& layerBounds, bool& boundsComputed) 631 634 { 632 635 if (layer->isRootLayer()) … … 634 637 635 638 if (!boundsComputed) { 636 layerBounds = layer->renderer()->localToAbsoluteQuad(FloatRect(layer->localBoundingBox())).enclosingBoundingBox();639 layerBounds = enclosingIntRect(geometryMap.absoluteRect(layer->localBoundingBox())); 637 640 // Empty rects never intersect, but we need them to for the purposes of overlap testing. 638 641 if (layerBounds.isEmpty()) … … 647 650 } 648 651 649 void RenderLayerCompositor::addToOverlapMapRecursive( OverlapMap& overlapMap, RenderLayer* layer)652 void RenderLayerCompositor::addToOverlapMapRecursive(RenderGeometryMap& geometryMap, OverlapMap& overlapMap, RenderLayer* layer, RenderLayer* ancestorLayer) 650 653 { 651 654 if (!canBeComposited(layer) || overlapMap.contains(layer)) 652 655 return; 653 656 657 // A null ancestorLayer is an indication that 'layer' has already been pushed. 658 if (ancestorLayer) 659 geometryMap.pushMappingsToAncestor(layer->renderer(), ancestorLayer->renderer()); 660 654 661 IntRect bounds; 655 662 bool haveComputedBounds = false; 656 addToOverlapMap( overlapMap, layer, bounds, haveComputedBounds);663 addToOverlapMap(geometryMap, overlapMap, layer, bounds, haveComputedBounds); 657 664 658 665 #if !ASSERT_DISABLED … … 665 672 for (size_t i = 0; i < listSize; ++i) { 666 673 RenderLayer* curLayer = negZOrderList->at(i); 667 addToOverlapMapRecursive( overlapMap, curLayer);674 addToOverlapMapRecursive(geometryMap, overlapMap, curLayer, layer); 668 675 } 669 676 } … … 674 681 for (size_t i = 0; i < listSize; ++i) { 675 682 RenderLayer* curLayer = normalFlowList->at(i); 676 addToOverlapMapRecursive( overlapMap, curLayer);683 addToOverlapMapRecursive(geometryMap, overlapMap, curLayer, layer); 677 684 } 678 685 } … … 683 690 for (size_t i = 0; i < listSize; ++i) { 684 691 RenderLayer* curLayer = posZOrderList->at(i); 685 addToOverlapMapRecursive( overlapMap, curLayer);692 addToOverlapMapRecursive(geometryMap, overlapMap, curLayer, layer); 686 693 } 687 694 } 688 695 } 696 697 if (ancestorLayer) 698 geometryMap.popMappingsToAncestor(ancestorLayer->renderer()); 689 699 } 690 700 … … 698 708 // This implies that its positive z-index children must also be compositing. 699 709 // 700 void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* layer, OverlapMap* overlapMap, CompositingState& compositingState, bool& layersChanged)710 void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestorLayer, RenderLayer* layer, RenderGeometryMap* geometryMap, OverlapMap* overlapMap, CompositingState& compositingState, bool& layersChanged) 701 711 { 702 712 layer->updateLayerListsIfNeeded(); 703 713 714 // Should geometryMap be part of the overlap map? 715 if (geometryMap) 716 geometryMap->pushMappingsToAncestor(layer->renderer(), ancestorLayer ? ancestorLayer->renderer() : 0); 717 704 718 // Clear the flag 705 719 layer->setHasCompositingDescendant(false); … … 711 725 if (overlapMap && !overlapMap->isEmpty() && compositingState.m_testingOverlap) { 712 726 // If we're testing for overlap, we only need to composite if we overlap something that is already composited. 713 absBounds = layer->renderer()->localToAbsoluteQuad(FloatRect(layer->localBoundingBox())).enclosingBoundingBox(); 727 absBounds = enclosingIntRect(geometryMap->absoluteRect(layer->localBoundingBox())); 728 714 729 // Empty rects never intersect, but we need them to for the purposes of overlap testing. 715 730 if (absBounds.isEmpty()) … … 760 775 for (size_t i = 0; i < listSize; ++i) { 761 776 RenderLayer* curLayer = negZOrderList->at(i); 762 computeCompositingRequirements( curLayer, overlapMap, childState, layersChanged);777 computeCompositingRequirements(layer, curLayer, geometryMap, overlapMap, childState, layersChanged); 763 778 764 779 // If we have to make a layer for this child, make one now so we can have a contents layer … … 780 795 for (size_t i = 0; i < listSize; ++i) { 781 796 RenderLayer* curLayer = normalFlowList->at(i); 782 computeCompositingRequirements( curLayer, overlapMap, childState, layersChanged);797 computeCompositingRequirements(layer, curLayer, geometryMap, overlapMap, childState, layersChanged); 783 798 } 784 799 } … … 789 804 for (size_t i = 0; i < listSize; ++i) { 790 805 RenderLayer* curLayer = posZOrderList->at(i); 791 computeCompositingRequirements( curLayer, overlapMap, childState, layersChanged);806 computeCompositingRequirements(layer, curLayer, geometryMap, overlapMap, childState, layersChanged); 792 807 } 793 808 } … … 806 821 // compositing ancestor's backing, and so are still considered for overlap. 807 822 if (overlapMap && childState.m_compositingAncestor && !childState.m_compositingAncestor->isRootLayer()) 808 addToOverlapMap(* overlapMap, layer, absBounds, haveComputedBounds);823 addToOverlapMap(*geometryMap, *overlapMap, layer, absBounds, haveComputedBounds); 809 824 810 825 // If we have a software transform, and we have layers under us, we need to also … … 816 831 if (overlapMap) { 817 832 overlapMap->pushCompositingContainer(); 818 addToOverlapMapRecursive(* overlapMap, layer);833 addToOverlapMapRecursive(*geometryMap, *overlapMap, layer); 819 834 } 820 835 willBeComposited = true; … … 845 860 if (overlapMap) { 846 861 overlapMap->pushCompositingContainer(); 847 addToOverlapMapRecursive(* overlapMap, layer);862 addToOverlapMapRecursive(*geometryMap, *overlapMap, layer); 848 863 } 849 864 willBeComposited = true; … … 876 891 if (layer->reflectionLayer() && updateLayerCompositingState(layer->reflectionLayer(), CompositingChangeRepaintNow)) 877 892 layersChanged = true; 893 894 if (geometryMap) 895 geometryMap->popMappingsToAncestor(ancestorLayer ? ancestorLayer->renderer() : 0); 878 896 } 879 897 -
trunk/Source/WebCore/rendering/RenderLayerCompositor.h
r115992 r118567 35 35 class GraphicsLayer; 36 36 class RenderEmbeddedObject; 37 class RenderGeometryMap; 37 38 class RenderPart; 38 39 class ScrollingCoordinator; … … 239 240 void recursiveRepaintLayerRect(RenderLayer*, const IntRect&); 240 241 241 void addToOverlapMap( OverlapMap&, RenderLayer*, IntRect& layerBounds, bool& boundsComputed);242 void addToOverlapMapRecursive( OverlapMap&, RenderLayer*);242 void addToOverlapMap(RenderGeometryMap&, OverlapMap&, RenderLayer*, IntRect& layerBounds, bool& boundsComputed); 243 void addToOverlapMapRecursive(RenderGeometryMap&, OverlapMap&, RenderLayer*, RenderLayer* ancestorLayer = 0); 243 244 244 245 void updateCompositingLayersTimerFired(Timer<RenderLayerCompositor>*); 245 246 246 247 // Returns true if any layer's compositing changed 247 void computeCompositingRequirements(RenderLayer* , OverlapMap*, struct CompositingState&, bool& layersChanged);248 void computeCompositingRequirements(RenderLayer* ancestorLayer, RenderLayer*, RenderGeometryMap*, OverlapMap*, struct CompositingState&, bool& layersChanged); 248 249 249 250 // Recurses down the tree, parenting descendant compositing layers and collecting an array of child layers for the current compositing layer. -
trunk/Source/WebCore/rendering/RenderObject.cpp
r118542 r118567 47 47 #include "RenderDeprecatedFlexibleBox.h" 48 48 #include "RenderFlexibleBox.h" 49 #include "RenderGeometryMap.h" 49 50 #include "RenderImage.h" 50 51 #include "RenderImageResourceStyleImage.h" … … 2031 2032 return; 2032 2033 2034 // FIXME: this should call offsetFromContainer to share code, but I'm not sure it's ever called. 2033 2035 LayoutPoint centerPoint = roundedLayoutPoint(transformState.mappedPoint()); 2034 2036 if (o->isBox() && o->style()->isFlippedBlocksWritingMode()) … … 2044 2046 2045 2047 o->mapLocalToContainer(repaintContainer, fixed, useTransforms, transformState, DoNotApplyContainerFlip, wasFixed); 2048 } 2049 2050 const RenderObject* RenderObject::pushMappingToContainer(const RenderBoxModelObject* ancestorToStopAt, RenderGeometryMap& geometryMap) const 2051 { 2052 ASSERT_UNUSED(ancestorToStopAt, ancestorToStopAt != this); 2053 2054 RenderObject* container = parent(); 2055 if (!container) 2056 return 0; 2057 2058 // FIXME: this should call offsetFromContainer to share code, but I'm not sure it's ever called. 2059 LayoutSize offset; 2060 if (container->hasOverflowClip()) 2061 offset = -toRenderBox(container)->scrolledContentOffset(); 2062 2063 geometryMap.push(this, offset, hasColumns()); 2064 2065 return container; 2046 2066 } 2047 2067 … … 2114 2134 } 2115 2135 2116 LayoutSize RenderObject::offsetFromContainer(RenderObject* o, const LayoutPoint& point ) const2136 LayoutSize RenderObject::offsetFromContainer(RenderObject* o, const LayoutPoint& point, bool* offsetDependsOnPoint) const 2117 2137 { 2118 2138 ASSERT(o == container()); … … 2124 2144 if (o->hasOverflowClip()) 2125 2145 offset -= toRenderBox(o)->scrolledContentOffset(); 2146 2147 if (offsetDependsOnPoint) 2148 *offsetDependsOnPoint = hasColumns(); 2126 2149 2127 2150 return offset; … … 2200 2223 } 2201 2224 2202 RenderObject* RenderObject::container( RenderBoxModelObject* repaintContainer, bool* repaintContainerSkipped) const2225 RenderObject* RenderObject::container(const RenderBoxModelObject* repaintContainer, bool* repaintContainerSkipped) const 2203 2226 { 2204 2227 if (repaintContainerSkipped) -
trunk/Source/WebCore/rendering/RenderObject.h
r118552 r118567 61 61 class RenderBlock; 62 62 class RenderFlowThread; 63 class RenderGeometryMap; 63 64 class RenderLayer; 64 65 class RenderTable; … … 587 588 // If repaintContainer and repaintContainerSkipped are not null, on return *repaintContainerSkipped 588 589 // is true if the renderer returned is an ancestor of repaintContainer. 589 RenderObject* container( RenderBoxModelObject* repaintContainer = 0, bool* repaintContainerSkipped = 0) const;590 RenderObject* container(const RenderBoxModelObject* repaintContainer = 0, bool* repaintContainerSkipped = 0) const; 590 591 591 592 virtual RenderObject* hoverAncestor() const { return parent(); } … … 688 689 // Return the offset from the container() renderer (excluding transforms). In multi-column layout, 689 690 // different offsets apply at different points, so return the offset that applies to the given point. 690 virtual LayoutSize offsetFromContainer(RenderObject*, const LayoutPoint& ) const;691 virtual LayoutSize offsetFromContainer(RenderObject*, const LayoutPoint&, bool* offsetDependsOnPoint = 0) const; 691 692 // Return the offset from an object up the container() chain. Asserts that none of the intermediate objects have transforms. 692 693 LayoutSize offsetFromAncestorContainer(RenderObject*) const; … … 885 886 virtual void mapAbsoluteToLocalPoint(bool fixed, bool useTransforms, TransformState&) const; 886 887 888 // Pushes state onto RenderGeometryMap about how to map coordinates from this renderer to its container, or ancestorToStopAt (whichever is encountered first). 889 // Returns the renderer which was mapped to (container or ancestorToStopAt). 890 virtual const RenderObject* pushMappingToContainer(const RenderBoxModelObject* ancestorToStopAt, RenderGeometryMap&) const; 891 887 892 bool shouldUseTransformFromContainer(const RenderObject* container) const; 888 893 void getTransformFromContainer(const RenderObject* container, const LayoutSize& offsetInContainer, TransformationMatrix&) const; -
trunk/Source/WebCore/rendering/RenderTableCell.cpp
r117988 r118567 241 241 } 242 242 243 LayoutSize RenderTableCell::offsetFromContainer(RenderObject* o, const LayoutPoint& point ) const243 LayoutSize RenderTableCell::offsetFromContainer(RenderObject* o, const LayoutPoint& point, bool* offsetDependsOnPoint) const 244 244 { 245 245 ASSERT(o == container()); 246 246 247 LayoutSize offset = RenderBlock::offsetFromContainer(o, point );247 LayoutSize offset = RenderBlock::offsetFromContainer(o, point, offsetDependsOnPoint); 248 248 if (parent()) 249 249 offset.expand(-parentBox()->x(), -parentBox()->y()); -
trunk/Source/WebCore/rendering/RenderTableCell.h
r115755 r118567 153 153 virtual bool boxShadowShouldBeAppliedToBackground(BackgroundBleedAvoidance, InlineFlowBox*) const OVERRIDE; 154 154 155 virtual LayoutSize offsetFromContainer(RenderObject*, const LayoutPoint& ) const;155 virtual LayoutSize offsetFromContainer(RenderObject*, const LayoutPoint&, bool* offsetDependsOnPoint = 0) const; 156 156 virtual LayoutRect clippedOverflowRectForRepaint(RenderBoxModelObject* repaintContainer) const; 157 157 virtual void computeRectForRepaint(RenderBoxModelObject* repaintContainer, LayoutRect&, bool fixed = false) const; -
trunk/Source/WebCore/rendering/RenderView.cpp
r118039 r118567 33 33 #include "HitTestResult.h" 34 34 #include "Page.h" 35 #include "RenderGeometryMap.h" 35 36 #include "RenderLayer.h" 36 37 #include "RenderNamedFlowThread.h" … … 166 167 if (fixed && m_frameView) 167 168 transformState.move(m_frameView->scrollOffsetForFixedPosition()); 169 } 170 171 const RenderObject* RenderView::pushMappingToContainer(const RenderBoxModelObject* ancestorToStopAt, RenderGeometryMap& geometryMap) const 172 { 173 // If a container was specified, and was not 0 or the RenderView, 174 // then we should have found it by now. 175 ASSERT_ARG(ancestorToStopAt, !ancestorToStopAt || ancestorToStopAt == this); 176 177 LayoutSize scrollOffset; 178 179 if (m_frameView) 180 scrollOffset = m_frameView->scrollOffsetForFixedPosition(); 181 182 if (!ancestorToStopAt && shouldUseTransformFromContainer(0)) { 183 TransformationMatrix t; 184 getTransformFromContainer(0, LayoutSize(), t); 185 geometryMap.pushView(this, scrollOffset, &t); 186 } else 187 geometryMap.pushView(this, scrollOffset); 188 189 return 0; 168 190 } 169 191 -
trunk/Source/WebCore/rendering/RenderView.h
r118039 r118567 189 189 protected: 190 190 virtual void mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool useTransforms, bool fixed, TransformState&, ApplyContainerFlipOrNot = ApplyContainerFlip, bool* wasFixed = 0) const; 191 virtual const RenderObject* pushMappingToContainer(const RenderBoxModelObject* ancestorToStopAt, RenderGeometryMap&) const; 191 192 virtual void mapAbsoluteToLocalPoint(bool fixed, bool useTransforms, TransformState&) const; 192 193 virtual bool requiresColumns(int desiredColumnCount) const OVERRIDE; -
trunk/Source/WebCore/rendering/svg/RenderSVGForeignObject.cpp
r115981 r118567 194 194 } 195 195 196 const RenderObject* RenderSVGForeignObject::pushMappingToContainer(const RenderBoxModelObject* ancestorToStopAt, RenderGeometryMap& geometryMap) const 197 { 198 return SVGRenderSupport::pushMappingToContainer(this, ancestorToStopAt, geometryMap); 199 } 200 196 201 } 197 202 -
trunk/Source/WebCore/rendering/svg/RenderSVGForeignObject.h
r115981 r118567 56 56 57 57 virtual void mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool fixed, bool useTransforms, TransformState&, ApplyContainerFlipOrNot = ApplyContainerFlip, bool* wasFixed = 0) const; 58 virtual const RenderObject* pushMappingToContainer(const RenderBoxModelObject* ancestorToStopAt, RenderGeometryMap&) const; 58 59 virtual void setNeedsTransformUpdate() { m_needsTransformUpdate = true; } 59 60 -
trunk/Source/WebCore/rendering/svg/RenderSVGInline.cpp
r117975 r118567 85 85 } 86 86 87 const RenderObject* RenderSVGInline::pushMappingToContainer(const RenderBoxModelObject* ancestorToStopAt, RenderGeometryMap& geometryMap) const 88 { 89 return SVGRenderSupport::pushMappingToContainer(this, ancestorToStopAt, geometryMap); 90 } 91 87 92 void RenderSVGInline::absoluteQuads(Vector<FloatQuad>& quads, bool* wasFixed) const 88 93 { -
trunk/Source/WebCore/rendering/svg/RenderSVGInline.h
r117225 r118567 49 49 virtual void computeFloatRectForRepaint(RenderBoxModelObject* repaintContainer, FloatRect&, bool fixed = false) const; 50 50 virtual void mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool useTransforms, bool fixed, TransformState&, ApplyContainerFlipOrNot = ApplyContainerFlip, bool* wasFixed = 0) const; 51 virtual const RenderObject* pushMappingToContainer(const RenderBoxModelObject* ancestorToStopAt, RenderGeometryMap&) const; 51 52 virtual void absoluteQuads(Vector<FloatQuad>&, bool* wasFixed) const; 52 53 -
trunk/Source/WebCore/rendering/svg/RenderSVGModelObject.cpp
r115981 r118567 59 59 { 60 60 SVGRenderSupport::mapLocalToContainer(this, repaintContainer, transformState, wasFixed); 61 } 62 63 const RenderObject* RenderSVGModelObject::pushMappingToContainer(const RenderBoxModelObject* ancestorToStopAt, RenderGeometryMap& geometryMap) const 64 { 65 return SVGRenderSupport::pushMappingToContainer(this, ancestorToStopAt, geometryMap); 61 66 } 62 67 -
trunk/Source/WebCore/rendering/svg/RenderSVGModelObject.h
r115981 r118567 60 60 61 61 virtual void mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool useTransforms, bool fixed, TransformState&, ApplyContainerFlipOrNot = ApplyContainerFlip, bool* wasFixed = 0) const; 62 virtual const RenderObject* pushMappingToContainer(const RenderBoxModelObject* ancestorToStopAt, RenderGeometryMap&) const; 62 63 virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle); 63 64 virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle); -
trunk/Source/WebCore/rendering/svg/RenderSVGRoot.cpp
r118074 r118567 392 392 } 393 393 394 const RenderObject* RenderSVGRoot::pushMappingToContainer(const RenderBoxModelObject* ancestorToStopAt, RenderGeometryMap& geometryMap) const 395 { 396 return RenderReplaced::pushMappingToContainer(ancestorToStopAt, geometryMap); 397 } 398 394 399 void RenderSVGRoot::updateCachedBoundaries() 395 400 { -
trunk/Source/WebCore/rendering/svg/RenderSVGRoot.h
r115981 r118567 96 96 97 97 virtual void mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool useTransforms, bool fixed, TransformState&, ApplyContainerFlipOrNot = ApplyContainerFlip, bool* wasFixed = 0) const; 98 virtual const RenderObject* pushMappingToContainer(const RenderBoxModelObject* ancestorToStopAt, RenderGeometryMap&) const; 99 98 100 virtual bool canBeSelectionLeaf() const { return false; } 99 101 virtual bool canHaveChildren() const { return true; } -
trunk/Source/WebCore/rendering/svg/RenderSVGText.cpp
r117977 r118567 116 116 } 117 117 118 const RenderObject* RenderSVGText::pushMappingToContainer(const RenderBoxModelObject* ancestorToStopAt, RenderGeometryMap& geometryMap) const 119 { 120 return SVGRenderSupport::pushMappingToContainer(this, ancestorToStopAt, geometryMap); 121 } 122 118 123 static inline void collectLayoutAttributes(RenderObject* text, Vector<SVGTextLayoutAttributes*>& attributes) 119 124 { -
trunk/Source/WebCore/rendering/svg/RenderSVGText.h
r117975 r118567 77 77 78 78 virtual void mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool useTransforms, bool fixed, TransformState&, ApplyContainerFlipOrNot = ApplyContainerFlip, bool* wasFixed = 0) const; 79 virtual const RenderObject* pushMappingToContainer(const RenderBoxModelObject* ancestorToStopAt, RenderGeometryMap&) const; 79 80 virtual void addChild(RenderObject* child, RenderObject* beforeChild = 0); 80 81 virtual void removeChild(RenderObject*) OVERRIDE; -
trunk/Source/WebCore/rendering/svg/SVGRenderSupport.cpp
r117225 r118567 29 29 30 30 #include "NodeRenderStyle.h" 31 #include "RenderGeometryMap.h" 31 32 #include "RenderLayer.h" 32 33 #include "RenderSVGResource.h" … … 86 87 } 87 88 89 const RenderObject* SVGRenderSupport::pushMappingToContainer(const RenderObject* object, const RenderBoxModelObject* ancestorToStopAt, RenderGeometryMap& geometryMap) 90 { 91 ASSERT_UNUSED(ancestorToStopAt, ancestorToStopAt != object); 92 93 RenderObject* parent = object->parent(); 94 95 // At the SVG/HTML boundary (aka RenderSVGRoot), we apply the localToBorderBoxTransform 96 // to map an element from SVG viewport coordinates to CSS box coordinates. 97 // RenderSVGRoot's mapLocalToContainer method expects CSS box coordinates. 98 if (parent->isSVGRoot()) 99 geometryMap.push(object, TransformationMatrix(toRenderSVGRoot(parent)->localToBorderBoxTransform())); 100 else 101 geometryMap.push(object, LayoutSize()); 102 103 return parent; 104 } 105 88 106 // Update a bounding box taking into account the validity of the other bounding box. 89 107 static inline void updateObjectBoundingBox(FloatRect& objectBoundingBox, bool& objectBoundingBoxValid, RenderObject* other, FloatRect otherBoundingBox) -
trunk/Source/WebCore/rendering/svg/SVGRenderSupport.h
r112091 r118567 35 35 class ImageBuffer; 36 36 class RenderBoxModelObject; 37 class RenderGeometryMap; 37 38 class RenderObject; 38 39 class RenderStyle; … … 65 66 static void computeFloatRectForRepaint(const RenderObject*, RenderBoxModelObject* repaintContainer, FloatRect&, bool fixed); 66 67 static void mapLocalToContainer(const RenderObject*, RenderBoxModelObject* repaintContainer, TransformState&, bool* wasFixed = 0); 68 static const RenderObject* pushMappingToContainer(const RenderObject*, const RenderBoxModelObject* ancestorToStopAt, RenderGeometryMap&); 67 69 68 70 // Shared between SVG renderers and resources.
Note:
See TracChangeset
for help on using the changeset viewer.