Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(37)

Side by Side Diff: Source/core/layout/LayoutBlockFlow.cpp

Issue 763173003: Convert RenderBlockFlow code to use FloatingObject references (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Address Review Comments Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 938 matching lines...) Expand 10 before | Expand all | Expand 10 after
949 addIntrudingFloats(blockFlow, 0, logicalTopOffset); 949 addIntrudingFloats(blockFlow, 0, logicalTopOffset);
950 } 950 }
951 951
952 if (childrenInline()) { 952 if (childrenInline()) {
953 LayoutUnit changeLogicalTop = LayoutUnit::max(); 953 LayoutUnit changeLogicalTop = LayoutUnit::max();
954 LayoutUnit changeLogicalBottom = LayoutUnit::min(); 954 LayoutUnit changeLogicalBottom = LayoutUnit::min();
955 if (m_floatingObjects) { 955 if (m_floatingObjects) {
956 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set( ); 956 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set( );
957 FloatingObjectSetIterator end = floatingObjectSet.end(); 957 FloatingObjectSetIterator end = floatingObjectSet.end();
958 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) { 958 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) {
959 FloatingObject* floatingObject = it->get(); 959 FloatingObject& floatingObject = it->getReference();
960 FloatingObject* oldFloatingObject = floatMap.get(floatingObject- >layoutObject()); 960 FloatingObject* oldFloatingObject = floatMap.get(floatingObject. layoutObject());
961 LayoutUnit logicalBottom = logicalBottomForFloat(floatingObject) ; 961 LayoutUnit logicalBottom = logicalBottomForFloat(floatingObject) ;
962 if (oldFloatingObject) { 962 if (oldFloatingObject) {
963 LayoutUnit oldLogicalBottom = logicalBottomForFloat(oldFloat ingObject); 963 LayoutUnit oldLogicalBottom = logicalBottomForFloat(*oldFloa tingObject);
964 if (logicalWidthForFloat(floatingObject) != logicalWidthForF loat(oldFloatingObject) || logicalLeftForFloat(floatingObject) != logicalLeftFor Float(oldFloatingObject)) { 964 if (logicalWidthForFloat(floatingObject) != logicalWidthForF loat(*oldFloatingObject) || logicalLeftForFloat(floatingObject) != logicalLeftFo rFloat(*oldFloatingObject)) {
965 changeLogicalTop = 0; 965 changeLogicalTop = 0;
966 changeLogicalBottom = std::max(changeLogicalBottom, std: :max(logicalBottom, oldLogicalBottom)); 966 changeLogicalBottom = std::max(changeLogicalBottom, std: :max(logicalBottom, oldLogicalBottom));
967 } else { 967 } else {
968 if (logicalBottom != oldLogicalBottom) { 968 if (logicalBottom != oldLogicalBottom) {
969 changeLogicalTop = std::min(changeLogicalTop, std::m in(logicalBottom, oldLogicalBottom)); 969 changeLogicalTop = std::min(changeLogicalTop, std::m in(logicalBottom, oldLogicalBottom));
970 changeLogicalBottom = std::max(changeLogicalBottom, std::max(logicalBottom, oldLogicalBottom)); 970 changeLogicalBottom = std::max(changeLogicalBottom, std::max(logicalBottom, oldLogicalBottom));
971 } 971 }
972 LayoutUnit logicalTop = logicalTopForFloat(floatingObjec t); 972 LayoutUnit logicalTop = logicalTopForFloat(floatingObjec t);
973 LayoutUnit oldLogicalTop = logicalTopForFloat(oldFloatin gObject); 973 LayoutUnit oldLogicalTop = logicalTopForFloat(*oldFloati ngObject);
974 if (logicalTop != oldLogicalTop) { 974 if (logicalTop != oldLogicalTop) {
975 changeLogicalTop = std::min(changeLogicalTop, std::m in(logicalTop, oldLogicalTop)); 975 changeLogicalTop = std::min(changeLogicalTop, std::m in(logicalTop, oldLogicalTop));
976 changeLogicalBottom = std::max(changeLogicalBottom, std::max(logicalTop, oldLogicalTop)); 976 changeLogicalBottom = std::max(changeLogicalBottom, std::max(logicalTop, oldLogicalTop));
977 } 977 }
978 } 978 }
979 979
980 if (oldFloatingObject->originatingLine() && !selfNeedsLayout ()) { 980 if (oldFloatingObject->originatingLine() && !selfNeedsLayout ()) {
981 ASSERT(oldFloatingObject->originatingLine()->layoutObjec t() == this); 981 ASSERT(oldFloatingObject->originatingLine()->layoutObjec t() == this);
982 oldFloatingObject->originatingLine()->markDirty(); 982 oldFloatingObject->originatingLine()->markDirty();
983 } 983 }
984 984
985 floatMap.remove(floatingObject->layoutObject()); 985 floatMap.remove(floatingObject.layoutObject());
986 } else { 986 } else {
987 changeLogicalTop = 0; 987 changeLogicalTop = 0;
988 changeLogicalBottom = std::max(changeLogicalBottom, logicalB ottom); 988 changeLogicalBottom = std::max(changeLogicalBottom, logicalB ottom);
989 } 989 }
990 } 990 }
991 } 991 }
992 992
993 RendererToFloatInfoMap::iterator end = floatMap.end(); 993 RendererToFloatInfoMap::iterator end = floatMap.end();
994 for (RendererToFloatInfoMap::iterator it = floatMap.begin(); it != end; ++it) { 994 for (RendererToFloatInfoMap::iterator it = floatMap.begin(); it != end; ++it) {
995 OwnPtr<FloatingObject>& floatingObject = it->value; 995 OwnPtr<FloatingObject>& floatingObject = it->value;
996 if (!floatingObject->isDescendant()) { 996 if (!floatingObject->isDescendant()) {
997 changeLogicalTop = 0; 997 changeLogicalTop = 0;
998 changeLogicalBottom = std::max(changeLogicalBottom, logicalBotto mForFloat(floatingObject.get())); 998 changeLogicalBottom = std::max(changeLogicalBottom, logicalBotto mForFloat(*floatingObject.get()));
999 } 999 }
1000 } 1000 }
1001 1001
1002 markLinesDirtyInBlockRange(changeLogicalTop, changeLogicalBottom); 1002 markLinesDirtyInBlockRange(changeLogicalTop, changeLogicalBottom);
1003 } else if (!oldIntrudingFloatSet.isEmpty()) { 1003 } else if (!oldIntrudingFloatSet.isEmpty()) {
1004 // If there are previously intruding floats that no longer intrude, then children with floats 1004 // If there are previously intruding floats that no longer intrude, then children with floats
1005 // should also get layout because they might need their floating object lists cleared. 1005 // should also get layout because they might need their floating object lists cleared.
1006 if (m_floatingObjects->set().size() < oldIntrudingFloatSet.size()) { 1006 if (m_floatingObjects->set().size() < oldIntrudingFloatSet.size()) {
1007 markAllDescendantsWithFloatsForLayout(); 1007 markAllDescendantsWithFloatsForLayout();
1008 } else { 1008 } else {
(...skipping 766 matching lines...) Expand 10 before | Expand all | Expand 10 after
1775 } 1775 }
1776 1776
1777 void LayoutBlockFlow::addOverflowFromFloats() 1777 void LayoutBlockFlow::addOverflowFromFloats()
1778 { 1778 {
1779 if (!m_floatingObjects) 1779 if (!m_floatingObjects)
1780 return; 1780 return;
1781 1781
1782 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); 1782 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set();
1783 FloatingObjectSetIterator end = floatingObjectSet.end(); 1783 FloatingObjectSetIterator end = floatingObjectSet.end();
1784 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++ it) { 1784 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++ it) {
1785 FloatingObject* floatingObject = it->get(); 1785 FloatingObject* floatingObject = it->get();
Julien - ping for review 2015/03/16 15:27:54 This should be a const reference.
Sunil Ratnu 2015/03/17 11:31:19 Done.
1786 if (floatingObject->isDescendant()) 1786 if (floatingObject->isDescendant())
1787 addOverflowFromChild(floatingObject->layoutObject(), LayoutSize(xPos itionForFloatIncludingMargin(floatingObject), yPositionForFloatIncludingMargin(f loatingObject))); 1787 addOverflowFromChild(floatingObject->layoutObject(), LayoutSize(xPos itionForFloatIncludingMargin(*floatingObject), yPositionForFloatIncludingMargin( *floatingObject)));
1788 } 1788 }
1789 } 1789 }
1790 1790
1791 void LayoutBlockFlow::computeOverflow(LayoutUnit oldClientAfterEdge, bool recomp uteFloats) 1791 void LayoutBlockFlow::computeOverflow(LayoutUnit oldClientAfterEdge, bool recomp uteFloats)
1792 { 1792 {
1793 LayoutBlock::computeOverflow(oldClientAfterEdge, recomputeFloats); 1793 LayoutBlock::computeOverflow(oldClientAfterEdge, recomputeFloats);
1794 if (!hasColumns() && (recomputeFloats || createsNewFormattingContext() || ha sSelfPaintingLayer())) 1794 if (!hasColumns() && (recomputeFloats || createsNewFormattingContext() || ha sSelfPaintingLayer()))
1795 addOverflowFromFloats(); 1795 addOverflowFromFloats();
1796 } 1796 }
1797 1797
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
2068 void LayoutBlockFlow::invalidatePaintForOverhangingFloats(bool paintAllDescendan ts) 2068 void LayoutBlockFlow::invalidatePaintForOverhangingFloats(bool paintAllDescendan ts)
2069 { 2069 {
2070 // Invalidate paint of any overhanging floats (if we know we're the one to p aint them). 2070 // Invalidate paint of any overhanging floats (if we know we're the one to p aint them).
2071 // Otherwise, bail out. 2071 // Otherwise, bail out.
2072 if (!hasOverhangingFloats()) 2072 if (!hasOverhangingFloats())
2073 return; 2073 return;
2074 2074
2075 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); 2075 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set();
2076 FloatingObjectSetIterator end = floatingObjectSet.end(); 2076 FloatingObjectSetIterator end = floatingObjectSet.end();
2077 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++ it) { 2077 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++ it) {
2078 FloatingObject* floatingObject = it->get(); 2078 FloatingObject& floatingObject = it->getReference();
2079 // Only issue paint invaldiations for the object if it is overhanging, i s not in its own layer, and 2079 // Only issue paint invaldiations for the object if it is overhanging, i s not in its own layer, and
2080 // is our responsibility to paint (m_shouldPaint is set). When paintAllD escendants is true, the latter 2080 // is our responsibility to paint (m_shouldPaint is set). When paintAllD escendants is true, the latter
2081 // condition is replaced with being a descendant of us. 2081 // condition is replaced with being a descendant of us.
2082 if (logicalBottomForFloat(floatingObject) > logicalHeight() 2082 if (logicalBottomForFloat(floatingObject) > logicalHeight()
2083 && !floatingObject->layoutObject()->hasSelfPaintingLayer() 2083 && !floatingObject.layoutObject()->hasSelfPaintingLayer()
2084 && (floatingObject->shouldPaint() || (paintAllDescendants && floatin gObject->layoutObject()->isDescendantOf(this)))) { 2084 && (floatingObject.shouldPaint() || (paintAllDescendants && floating Object.layoutObject()->isDescendantOf(this)))) {
2085 2085
2086 LayoutBox* floatingRenderer = floatingObject->layoutObject(); 2086 LayoutBox* floatingRenderer = floatingObject.layoutObject();
2087 floatingRenderer->setShouldDoFullPaintInvalidation(); 2087 floatingRenderer->setShouldDoFullPaintInvalidation();
2088 floatingRenderer->invalidatePaintForOverhangingFloats(false); 2088 floatingRenderer->invalidatePaintForOverhangingFloats(false);
2089 } 2089 }
2090 } 2090 }
2091 } 2091 }
2092 2092
2093 void LayoutBlockFlow::invalidatePaintForOverflow() 2093 void LayoutBlockFlow::invalidatePaintForOverflow()
2094 { 2094 {
2095 // FIXME: We could tighten up the left and right invalidation points if we l et layoutInlineChildren fill them in based off the particular lines 2095 // FIXME: We could tighten up the left and right invalidation points if we l et layoutInlineChildren fill them in based off the particular lines
2096 // it had to lay out. We wouldn't need the hasOverflowClip() hack in that ca se either. 2096 // it had to lay out. We wouldn't need the hasOverflowClip() hack in that ca se either.
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
2148 void LayoutBlockFlow::clipOutFloatingObjects(const LayoutBlock* rootBlock, const PaintInfo* paintInfo, const LayoutPoint& rootBlockPhysicalPosition, const Layou tSize& offsetFromRootBlock) const 2148 void LayoutBlockFlow::clipOutFloatingObjects(const LayoutBlock* rootBlock, const PaintInfo* paintInfo, const LayoutPoint& rootBlockPhysicalPosition, const Layou tSize& offsetFromRootBlock) const
2149 { 2149 {
2150 if (!m_floatingObjects) 2150 if (!m_floatingObjects)
2151 return; 2151 return;
2152 2152
2153 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); 2153 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set();
2154 FloatingObjectSetIterator end = floatingObjectSet.end(); 2154 FloatingObjectSetIterator end = floatingObjectSet.end();
2155 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++ it) { 2155 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++ it) {
2156 FloatingObject* floatingObject = it->get(); 2156 FloatingObject* floatingObject = it->get();
2157 LayoutRect floatBox(LayoutPoint(offsetFromRootBlock), floatingObject->la youtObject()->size()); 2157 LayoutRect floatBox(LayoutPoint(offsetFromRootBlock), floatingObject->la youtObject()->size());
2158 floatBox.move(positionForFloatIncludingMargin(floatingObject)); 2158 floatBox.move(positionForFloatIncludingMargin(*floatingObject));
2159 rootBlock->flipForWritingMode(floatBox); 2159 rootBlock->flipForWritingMode(floatBox);
2160 floatBox.move(rootBlockPhysicalPosition.x(), rootBlockPhysicalPosition.y ()); 2160 floatBox.move(rootBlockPhysicalPosition.x(), rootBlockPhysicalPosition.y ());
2161 2161
2162 ASSERT(paintInfo->context->clipRecorderStack()); 2162 ASSERT(paintInfo->context->clipRecorderStack());
2163 paintInfo->context->clipRecorderStack()->addClipRecorder(adoptPtr(new Cl ipRecorder( 2163 paintInfo->context->clipRecorderStack()->addClipRecorder(adoptPtr(new Cl ipRecorder(
2164 displayItemClient(), paintInfo->context, paintInfo->displayItemTypeF orClipping(), floatBox, SkRegion::kDifference_Op))); 2164 displayItemClient(), paintInfo->context, paintInfo->displayItemTypeF orClipping(), floatBox, SkRegion::kDifference_Op)));
2165 } 2165 }
2166 } 2166 }
2167 2167
2168 void LayoutBlockFlow::clearFloats(EClear clear) 2168 void LayoutBlockFlow::clearFloats(EClear clear)
(...skipping 25 matching lines...) Expand all
2194 void LayoutBlockFlow::removeFloatingObjects() 2194 void LayoutBlockFlow::removeFloatingObjects()
2195 { 2195 {
2196 if (!m_floatingObjects) 2196 if (!m_floatingObjects)
2197 return; 2197 return;
2198 2198
2199 markSiblingsWithFloatsForLayout(); 2199 markSiblingsWithFloatsForLayout();
2200 2200
2201 m_floatingObjects->clear(); 2201 m_floatingObjects->clear();
2202 } 2202 }
2203 2203
2204 LayoutPoint LayoutBlockFlow::flipFloatForWritingModeForChild(const FloatingObjec t* child, const LayoutPoint& point) const 2204 LayoutPoint LayoutBlockFlow::flipFloatForWritingModeForChild(const FloatingObjec t& child, const LayoutPoint& point) const
2205 { 2205 {
2206 if (!style()->isFlippedBlocksWritingMode()) 2206 if (!style()->isFlippedBlocksWritingMode())
2207 return point; 2207 return point;
2208 2208
2209 // This is similar to LayoutBox::flipForWritingModeForChild. We have to subt ract out our left/top offsets twice, since 2209 // This is similar to LayoutBox::flipForWritingModeForChild. We have to subt ract out our left/top offsets twice, since
2210 // it's going to get added back in. We hide this complication here so that t he calling code looks normal for the unflipped 2210 // it's going to get added back in. We hide this complication here so that t he calling code looks normal for the unflipped
2211 // case. 2211 // case.
2212 if (isHorizontalWritingMode()) 2212 if (isHorizontalWritingMode())
2213 return LayoutPoint(point.x(), point.y() + size().height() - child->layou tObject()->size().height() - 2 * yPositionForFloatIncludingMargin(child)); 2213 return LayoutPoint(point.x(), point.y() + size().height() - child.layout Object()->size().height() - 2 * yPositionForFloatIncludingMargin(child));
2214 return LayoutPoint(point.x() + size().width() - child->layoutObject()->size( ).width() - 2 * xPositionForFloatIncludingMargin(child), point.y()); 2214 return LayoutPoint(point.x() + size().width() - child.layoutObject()->size() .width() - 2 * xPositionForFloatIncludingMargin(child), point.y());
2215 } 2215 }
2216 2216
2217 LayoutUnit LayoutBlockFlow::logicalLeftOffsetForPositioningFloat(LayoutUnit logi calTop, LayoutUnit fixedOffset, bool applyTextIndent, LayoutUnit* heightRemainin g) const 2217 LayoutUnit LayoutBlockFlow::logicalLeftOffsetForPositioningFloat(LayoutUnit logi calTop, LayoutUnit fixedOffset, bool applyTextIndent, LayoutUnit* heightRemainin g) const
2218 { 2218 {
2219 LayoutUnit offset = fixedOffset; 2219 LayoutUnit offset = fixedOffset;
2220 if (m_floatingObjects && m_floatingObjects->hasLeftObjects()) 2220 if (m_floatingObjects && m_floatingObjects->hasLeftObjects())
2221 offset = m_floatingObjects->logicalLeftOffsetForPositioningFloat(fixedOf fset, logicalTop, heightRemaining); 2221 offset = m_floatingObjects->logicalLeftOffsetForPositioningFloat(fixedOf fset, logicalTop, heightRemaining);
2222 return adjustLogicalLeftOffsetForLine(offset, applyTextIndent); 2222 return adjustLogicalLeftOffsetForLine(offset, applyTextIndent);
2223 } 2223 }
2224 2224
(...skipping 25 matching lines...) Expand all
2250 return right; 2250 return right;
2251 } 2251 }
2252 2252
2253 LayoutPoint LayoutBlockFlow::computeLogicalLocationForFloat(const FloatingObject * floatingObject, LayoutUnit logicalTopOffset) const 2253 LayoutPoint LayoutBlockFlow::computeLogicalLocationForFloat(const FloatingObject * floatingObject, LayoutUnit logicalTopOffset) const
2254 { 2254 {
2255 LayoutBox* childBox = floatingObject->layoutObject(); 2255 LayoutBox* childBox = floatingObject->layoutObject();
2256 LayoutUnit logicalLeftOffset = logicalLeftOffsetForContent(); // Constant pa rt of left offset. 2256 LayoutUnit logicalLeftOffset = logicalLeftOffsetForContent(); // Constant pa rt of left offset.
2257 LayoutUnit logicalRightOffset; // Constant part of right offset. 2257 LayoutUnit logicalRightOffset; // Constant part of right offset.
2258 logicalRightOffset = logicalRightOffsetForContent(); 2258 logicalRightOffset = logicalRightOffsetForContent();
2259 2259
2260 LayoutUnit floatLogicalWidth = std::min(logicalWidthForFloat(floatingObject) , logicalRightOffset - logicalLeftOffset); // The width we look for. 2260 LayoutUnit floatLogicalWidth = std::min(logicalWidthForFloat(*floatingObject ), logicalRightOffset - logicalLeftOffset); // The width we look for.
2261 2261
2262 LayoutUnit floatLogicalLeft; 2262 LayoutUnit floatLogicalLeft;
2263 2263
2264 bool insideFlowThread = flowThreadContainingBlock(); 2264 bool insideFlowThread = flowThreadContainingBlock();
2265 2265
2266 if (childBox->style()->floating() == LeftFloat) { 2266 if (childBox->style()->floating() == LeftFloat) {
2267 LayoutUnit heightRemainingLeft = 1; 2267 LayoutUnit heightRemainingLeft = 1;
2268 LayoutUnit heightRemainingRight = 1; 2268 LayoutUnit heightRemainingRight = 1;
2269 floatLogicalLeft = logicalLeftOffsetForPositioningFloat(logicalTopOffset , logicalLeftOffset, false, &heightRemainingLeft); 2269 floatLogicalLeft = logicalLeftOffsetForPositioningFloat(logicalTopOffset , logicalLeftOffset, false, &heightRemainingLeft);
2270 while (logicalRightOffsetForPositioningFloat(logicalTopOffset, logicalRi ghtOffset, false, &heightRemainingRight) - floatLogicalLeft < floatLogicalWidth) { 2270 while (logicalRightOffsetForPositioningFloat(logicalTopOffset, logicalRi ghtOffset, false, &heightRemainingRight) - floatLogicalLeft < floatLogicalWidth) {
2271 logicalTopOffset += std::min(heightRemainingLeft, heightRemainingRig ht); 2271 logicalTopOffset += std::min(heightRemainingLeft, heightRemainingRig ht);
2272 floatLogicalLeft = logicalLeftOffsetForPositioningFloat(logicalTopOf fset, logicalLeftOffset, false, &heightRemainingLeft); 2272 floatLogicalLeft = logicalLeftOffsetForPositioningFloat(logicalTopOf fset, logicalLeftOffset, false, &heightRemainingLeft);
2273 if (insideFlowThread) { 2273 if (insideFlowThread) {
2274 // Have to re-evaluate all of our offsets, since they may have c hanged. 2274 // Have to re-evaluate all of our offsets, since they may have c hanged.
2275 logicalRightOffset = logicalRightOffsetForContent(); // Constant part of right offset. 2275 logicalRightOffset = logicalRightOffsetForContent(); // Constant part of right offset.
2276 logicalLeftOffset = logicalLeftOffsetForContent(); // Constant p art of left offset. 2276 logicalLeftOffset = logicalLeftOffsetForContent(); // Constant p art of left offset.
2277 floatLogicalWidth = std::min(logicalWidthForFloat(floatingObject ), logicalRightOffset - logicalLeftOffset); 2277 floatLogicalWidth = std::min(logicalWidthForFloat(*floatingObjec t), logicalRightOffset - logicalLeftOffset);
Julien - ping for review 2015/03/16 15:27:54 |floatingObject| should be a reference here too. I
Sunil Ratnu 2015/03/17 11:31:19 Done.
2278 } 2278 }
2279 } 2279 }
2280 floatLogicalLeft = std::max(logicalLeftOffset - borderAndPaddingLogicalL eft(), floatLogicalLeft); 2280 floatLogicalLeft = std::max(logicalLeftOffset - borderAndPaddingLogicalL eft(), floatLogicalLeft);
2281 } else { 2281 } else {
2282 LayoutUnit heightRemainingLeft = 1; 2282 LayoutUnit heightRemainingLeft = 1;
2283 LayoutUnit heightRemainingRight = 1; 2283 LayoutUnit heightRemainingRight = 1;
2284 floatLogicalLeft = logicalRightOffsetForPositioningFloat(logicalTopOffse t, logicalRightOffset, false, &heightRemainingRight); 2284 floatLogicalLeft = logicalRightOffsetForPositioningFloat(logicalTopOffse t, logicalRightOffset, false, &heightRemainingRight);
2285 while (floatLogicalLeft - logicalLeftOffsetForPositioningFloat(logicalTo pOffset, logicalLeftOffset, false, &heightRemainingLeft) < floatLogicalWidth) { 2285 while (floatLogicalLeft - logicalLeftOffsetForPositioningFloat(logicalTo pOffset, logicalLeftOffset, false, &heightRemainingLeft) < floatLogicalWidth) {
2286 logicalTopOffset += std::min(heightRemainingLeft, heightRemainingRig ht); 2286 logicalTopOffset += std::min(heightRemainingLeft, heightRemainingRig ht);
2287 floatLogicalLeft = logicalRightOffsetForPositioningFloat(logicalTopO ffset, logicalRightOffset, false, &heightRemainingRight); 2287 floatLogicalLeft = logicalRightOffsetForPositioningFloat(logicalTopO ffset, logicalRightOffset, false, &heightRemainingRight);
2288 if (insideFlowThread) { 2288 if (insideFlowThread) {
2289 // Have to re-evaluate all of our offsets, since they may have c hanged. 2289 // Have to re-evaluate all of our offsets, since they may have c hanged.
2290 logicalRightOffset = logicalRightOffsetForContent(); // Constant part of right offset. 2290 logicalRightOffset = logicalRightOffsetForContent(); // Constant part of right offset.
2291 logicalLeftOffset = logicalLeftOffsetForContent(); // Constant p art of left offset. 2291 logicalLeftOffset = logicalLeftOffsetForContent(); // Constant p art of left offset.
2292 floatLogicalWidth = std::min(logicalWidthForFloat(floatingObject ), logicalRightOffset - logicalLeftOffset); 2292 floatLogicalWidth = std::min(logicalWidthForFloat(*floatingObjec t), logicalRightOffset - logicalLeftOffset);
2293 } 2293 }
2294 } 2294 }
2295 // Use the original width of the float here, since the local variable 2295 // Use the original width of the float here, since the local variable
2296 // |floatLogicalWidth| was capped to the available line width. See 2296 // |floatLogicalWidth| was capped to the available line width. See
2297 // fast/block/float/clamped-right-float.html. 2297 // fast/block/float/clamped-right-float.html.
2298 floatLogicalLeft -= logicalWidthForFloat(floatingObject); 2298 floatLogicalLeft -= logicalWidthForFloat(*floatingObject);
2299 } 2299 }
2300 2300
2301 return LayoutPoint(floatLogicalLeft, logicalTopOffset); 2301 return LayoutPoint(floatLogicalLeft, logicalTopOffset);
2302 } 2302 }
2303 2303
2304 FloatingObject* LayoutBlockFlow::insertFloatingObject(LayoutBox& floatBox) 2304 FloatingObject* LayoutBlockFlow::insertFloatingObject(LayoutBox& floatBox)
2305 { 2305 {
2306 ASSERT(floatBox.isFloating()); 2306 ASSERT(floatBox.isFloating());
2307 2307
2308 // Create the list of special objects if we don't aleady have one 2308 // Create the list of special objects if we don't aleady have one
(...skipping 18 matching lines...) Expand all
2327 floatBox.setChildNeedsLayout(MarkOnlyThis); 2327 floatBox.setChildNeedsLayout(MarkOnlyThis);
2328 2328
2329 bool needsBlockDirectionLocationSetBeforeLayout = isChildLayoutBlock && view ()->layoutState()->needsBlockDirectionLocationSetBeforeLayout(); 2329 bool needsBlockDirectionLocationSetBeforeLayout = isChildLayoutBlock && view ()->layoutState()->needsBlockDirectionLocationSetBeforeLayout();
2330 if (!needsBlockDirectionLocationSetBeforeLayout || isWritingModeRoot()) { // We are unsplittable if we're a block flow root. 2330 if (!needsBlockDirectionLocationSetBeforeLayout || isWritingModeRoot()) { // We are unsplittable if we're a block flow root.
2331 floatBox.layoutIfNeeded(); 2331 floatBox.layoutIfNeeded();
2332 } else { 2332 } else {
2333 floatBox.updateLogicalWidth(); 2333 floatBox.updateLogicalWidth();
2334 floatBox.computeAndSetBlockDirectionMargins(this); 2334 floatBox.computeAndSetBlockDirectionMargins(this);
2335 } 2335 }
2336 2336
2337 setLogicalWidthForFloat(newObj.get(), logicalWidthForChild(floatBox) + margi nStartForChild(floatBox) + marginEndForChild(floatBox)); 2337 setLogicalWidthForFloat(*newObj.get(), logicalWidthForChild(floatBox) + marg inStartForChild(floatBox) + marginEndForChild(floatBox));
Julien - ping for review 2015/03/16 15:27:54 *newObj should work and is shorter and safer (ther
Sunil Ratnu 2015/03/17 11:31:19 Done.
2338 2338
2339 return m_floatingObjects->add(newObj.release()); 2339 return m_floatingObjects->add(newObj.release());
2340 } 2340 }
2341 2341
2342 void LayoutBlockFlow::removeFloatingObject(LayoutBox* floatBox) 2342 void LayoutBlockFlow::removeFloatingObject(LayoutBox* floatBox)
2343 { 2343 {
2344 if (m_floatingObjects) { 2344 if (m_floatingObjects) {
2345 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); 2345 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set();
2346 FloatingObjectSetIterator it = floatingObjectSet.find<FloatingObjectHash Translator>(floatBox); 2346 FloatingObjectSetIterator it = floatingObjectSet.find<FloatingObjectHash Translator>(floatBox);
2347 if (it != floatingObjectSet.end()) { 2347 if (it != floatingObjectSet.end()) {
2348 FloatingObject* floatingObject = it->get(); 2348 FloatingObject& floatingObject = it->getReference();
2349 if (childrenInline()) { 2349 if (childrenInline()) {
2350 LayoutUnit logicalTop = logicalTopForFloat(floatingObject); 2350 LayoutUnit logicalTop = logicalTopForFloat(floatingObject);
2351 LayoutUnit logicalBottom = logicalBottomForFloat(floatingObject) ; 2351 LayoutUnit logicalBottom = logicalBottomForFloat(floatingObject) ;
2352 2352
2353 // Fix for https://bugs.webkit.org/show_bug.cgi?id=54995. 2353 // Fix for https://bugs.webkit.org/show_bug.cgi?id=54995.
2354 if (logicalBottom < 0 || logicalBottom < logicalTop || logicalTo p == LayoutUnit::max()) { 2354 if (logicalBottom < 0 || logicalBottom < logicalTop || logicalTo p == LayoutUnit::max()) {
2355 logicalBottom = LayoutUnit::max(); 2355 logicalBottom = LayoutUnit::max();
2356 } else { 2356 } else {
2357 // Special-case zero- and less-than-zero-height floats: thos e don't touch 2357 // Special-case zero- and less-than-zero-height floats: thos e don't touch
2358 // the line that they're on, but it still needs to be dirtie d. This is 2358 // the line that they're on, but it still needs to be dirtie d. This is
2359 // accomplished by pretending they have a height of 1. 2359 // accomplished by pretending they have a height of 1.
2360 logicalBottom = std::max(logicalBottom, logicalTop + 1); 2360 logicalBottom = std::max(logicalBottom, logicalTop + 1);
2361 } 2361 }
2362 if (floatingObject->originatingLine()) { 2362 if (floatingObject.originatingLine()) {
2363 if (!selfNeedsLayout()) { 2363 if (!selfNeedsLayout()) {
2364 ASSERT(floatingObject->originatingLine()->layoutObject() == this); 2364 ASSERT(floatingObject.originatingLine()->layoutObject() == this);
2365 floatingObject->originatingLine()->markDirty(); 2365 floatingObject.originatingLine()->markDirty();
2366 } 2366 }
2367 #if ENABLE(ASSERT) 2367 #if ENABLE(ASSERT)
2368 floatingObject->setOriginatingLine(0); 2368 floatingObject.setOriginatingLine(0);
2369 #endif 2369 #endif
2370 } 2370 }
2371 markLinesDirtyInBlockRange(0, logicalBottom); 2371 markLinesDirtyInBlockRange(0, logicalBottom);
2372 } 2372 }
2373 m_floatingObjects->remove(floatingObject); 2373 m_floatingObjects->remove(&floatingObject);
2374 } 2374 }
2375 } 2375 }
2376 } 2376 }
2377 2377
2378 void LayoutBlockFlow::removeFloatingObjectsBelow(FloatingObject* lastFloat, int logicalOffset) 2378 void LayoutBlockFlow::removeFloatingObjectsBelow(FloatingObject* lastFloat, int logicalOffset)
2379 { 2379 {
2380 if (!containsFloats()) 2380 if (!containsFloats())
2381 return; 2381 return;
2382 2382
2383 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); 2383 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set();
2384 FloatingObject* curr = floatingObjectSet.last().get(); 2384 FloatingObject* curr = floatingObjectSet.last().get();
2385 while (curr != lastFloat && (!curr->isPlaced() || logicalTopForFloat(curr) > = logicalOffset)) { 2385 while (curr != lastFloat && (!curr->isPlaced() || logicalTopForFloat(*curr) >= logicalOffset)) {
2386 m_floatingObjects->remove(curr); 2386 m_floatingObjects->remove(curr);
2387 if (floatingObjectSet.isEmpty()) 2387 if (floatingObjectSet.isEmpty())
2388 break; 2388 break;
2389 curr = floatingObjectSet.last().get(); 2389 curr = floatingObjectSet.last().get();
2390 } 2390 }
2391 } 2391 }
2392 2392
2393 bool LayoutBlockFlow::positionNewFloats(LineWidth* width) 2393 bool LayoutBlockFlow::positionNewFloats(LineWidth* width)
2394 { 2394 {
2395 if (!m_floatingObjects) 2395 if (!m_floatingObjects)
(...skipping 20 matching lines...) Expand all
2416 lastPlacedFloatingObject = it->get(); 2416 lastPlacedFloatingObject = it->get();
2417 ++it; 2417 ++it;
2418 break; 2418 break;
2419 } 2419 }
2420 } 2420 }
2421 2421
2422 LayoutUnit logicalTop = logicalHeight(); 2422 LayoutUnit logicalTop = logicalHeight();
2423 2423
2424 // The float cannot start above the top position of the last positioned floa t. 2424 // The float cannot start above the top position of the last positioned floa t.
2425 if (lastPlacedFloatingObject) 2425 if (lastPlacedFloatingObject)
2426 logicalTop = std::max(logicalTopForFloat(lastPlacedFloatingObject), logi calTop); 2426 logicalTop = std::max(logicalTopForFloat(*lastPlacedFloatingObject), log icalTop);
2427 2427
2428 FloatingObjectSetIterator end = floatingObjectSet.end(); 2428 FloatingObjectSetIterator end = floatingObjectSet.end();
2429 // Now walk through the set of unpositioned floats and place them. 2429 // Now walk through the set of unpositioned floats and place them.
2430 for (; it != end; ++it) { 2430 for (; it != end; ++it) {
2431 FloatingObject* floatingObject = it->get(); 2431 FloatingObject& floatingObject = it->getReference();
2432 // The containing block is responsible for positioning floats, so if we have floats in our 2432 // The containing block is responsible for positioning floats, so if we have floats in our
2433 // list that come from somewhere else, do not attempt to position them. 2433 // list that come from somewhere else, do not attempt to position them.
2434 if (floatingObject->layoutObject()->containingBlock() != this) 2434 if (floatingObject.layoutObject()->containingBlock() != this)
2435 continue; 2435 continue;
2436 2436
2437 LayoutBox* childBox = floatingObject->layoutObject(); 2437 LayoutBox* childBox = floatingObject.layoutObject();
2438 2438
2439 // FIXME Investigate if this can be removed. crbug.com/370006 2439 // FIXME Investigate if this can be removed. crbug.com/370006
2440 childBox->setMayNeedPaintInvalidation(); 2440 childBox->setMayNeedPaintInvalidation();
2441 2441
2442 LayoutUnit childLogicalLeftMargin = style()->isLeftToRightDirection() ? marginStartForChild(*childBox) : marginEndForChild(*childBox); 2442 LayoutUnit childLogicalLeftMargin = style()->isLeftToRightDirection() ? marginStartForChild(*childBox) : marginEndForChild(*childBox);
2443 if (childBox->style()->clear() & CLEFT) 2443 if (childBox->style()->clear() & CLEFT)
2444 logicalTop = std::max(lowestFloatLogicalBottom(FloatingObject::Float Left), logicalTop); 2444 logicalTop = std::max(lowestFloatLogicalBottom(FloatingObject::Float Left), logicalTop);
2445 if (childBox->style()->clear() & CRIGHT) 2445 if (childBox->style()->clear() & CRIGHT)
2446 logicalTop = std::max(lowestFloatLogicalBottom(FloatingObject::Float Right), logicalTop); 2446 logicalTop = std::max(lowestFloatLogicalBottom(FloatingObject::Float Right), logicalTop);
2447 2447
2448 LayoutPoint floatLogicalLocation = computeLogicalLocationForFloat(floati ngObject, logicalTop); 2448 LayoutPoint floatLogicalLocation = computeLogicalLocationForFloat(&float ingObject, logicalTop);
2449 2449
2450 setLogicalLeftForFloat(floatingObject, floatLogicalLocation.x()); 2450 setLogicalLeftForFloat(floatingObject, floatLogicalLocation.x());
2451 2451
2452 setLogicalLeftForChild(*childBox, floatLogicalLocation.x() + childLogica lLeftMargin); 2452 setLogicalLeftForChild(*childBox, floatLogicalLocation.x() + childLogica lLeftMargin);
2453 setLogicalTopForChild(*childBox, floatLogicalLocation.y() + marginBefore ForChild(*childBox)); 2453 setLogicalTopForChild(*childBox, floatLogicalLocation.y() + marginBefore ForChild(*childBox));
2454 2454
2455 SubtreeLayoutScope layoutScope(*childBox); 2455 SubtreeLayoutScope layoutScope(*childBox);
2456 LayoutState* layoutState = view()->layoutState(); 2456 LayoutState* layoutState = view()->layoutState();
2457 bool isPaginated = layoutState->isPaginated(); 2457 bool isPaginated = layoutState->isPaginated();
2458 if (isPaginated && !childBox->needsLayout()) 2458 if (isPaginated && !childBox->needsLayout())
2459 childBox->markForPaginationRelayoutIfNeeded(layoutScope); 2459 childBox->markForPaginationRelayoutIfNeeded(layoutScope);
2460 2460
2461 childBox->layoutIfNeeded(); 2461 childBox->layoutIfNeeded();
2462 2462
2463 if (isPaginated) { 2463 if (isPaginated) {
2464 // If we are unsplittable and don't fit, then we need to move down. 2464 // If we are unsplittable and don't fit, then we need to move down.
2465 // We include our margins as part of the unsplittable area. 2465 // We include our margins as part of the unsplittable area.
2466 LayoutUnit newLogicalTop = adjustForUnsplittableChild(*childBox, flo atLogicalLocation.y(), true); 2466 LayoutUnit newLogicalTop = adjustForUnsplittableChild(*childBox, flo atLogicalLocation.y(), true);
2467 2467
2468 // See if we have a pagination strut that is making us move down fur ther. 2468 // See if we have a pagination strut that is making us move down fur ther.
2469 // Note that an unsplittable child can't also have a pagination stru t, so this is 2469 // Note that an unsplittable child can't also have a pagination stru t, so this is
2470 // exclusive with the case above. 2470 // exclusive with the case above.
2471 LayoutBlockFlow* childBlockFlow = childBox->isLayoutBlockFlow() ? to LayoutBlockFlow(childBox) : 0; 2471 LayoutBlockFlow* childBlockFlow = childBox->isLayoutBlockFlow() ? to LayoutBlockFlow(childBox) : 0;
2472 if (childBlockFlow && childBlockFlow->paginationStrut()) { 2472 if (childBlockFlow && childBlockFlow->paginationStrut()) {
2473 newLogicalTop += childBlockFlow->paginationStrut(); 2473 newLogicalTop += childBlockFlow->paginationStrut();
2474 childBlockFlow->setPaginationStrut(0); 2474 childBlockFlow->setPaginationStrut(0);
2475 } 2475 }
2476 2476
2477 if (newLogicalTop != floatLogicalLocation.y()) { 2477 if (newLogicalTop != floatLogicalLocation.y()) {
2478 floatingObject->setPaginationStrut(newLogicalTop - floatLogicalL ocation.y()); 2478 floatingObject.setPaginationStrut(newLogicalTop - floatLogicalLo cation.y());
2479 2479
2480 floatLogicalLocation = computeLogicalLocationForFloat(floatingOb ject, newLogicalTop); 2480 floatLogicalLocation = computeLogicalLocationForFloat(&floatingO bject, newLogicalTop);
2481 setLogicalLeftForFloat(floatingObject, floatLogicalLocation.x()) ; 2481 setLogicalLeftForFloat(floatingObject, floatLogicalLocation.x()) ;
2482 2482
2483 setLogicalLeftForChild(*childBox, floatLogicalLocation.x() + chi ldLogicalLeftMargin); 2483 setLogicalLeftForChild(*childBox, floatLogicalLocation.x() + chi ldLogicalLeftMargin);
2484 setLogicalTopForChild(*childBox, floatLogicalLocation.y() + marg inBeforeForChild(*childBox)); 2484 setLogicalTopForChild(*childBox, floatLogicalLocation.y() + marg inBeforeForChild(*childBox));
2485 2485
2486 if (childBox->isLayoutBlock()) 2486 if (childBox->isLayoutBlock())
2487 childBox->setChildNeedsLayout(MarkOnlyThis); 2487 childBox->setChildNeedsLayout(MarkOnlyThis);
2488 childBox->layoutIfNeeded(); 2488 childBox->layoutIfNeeded();
2489 } 2489 }
2490 } 2490 }
2491 2491
2492 setLogicalTopForFloat(floatingObject, floatLogicalLocation.y()); 2492 setLogicalTopForFloat(floatingObject, floatLogicalLocation.y());
2493 2493
2494 setLogicalHeightForFloat(floatingObject, logicalHeightForChild(*childBox ) + marginBeforeForChild(*childBox) + marginAfterForChild(*childBox)); 2494 setLogicalHeightForFloat(floatingObject, logicalHeightForChild(*childBox ) + marginBeforeForChild(*childBox) + marginAfterForChild(*childBox));
2495 2495
2496 m_floatingObjects->addPlacedObject(floatingObject); 2496 m_floatingObjects->addPlacedObject(&floatingObject);
2497 2497
2498 if (ShapeOutsideInfo* shapeOutside = childBox->shapeOutsideInfo()) 2498 if (ShapeOutsideInfo* shapeOutside = childBox->shapeOutsideInfo())
2499 shapeOutside->setReferenceBoxLogicalSize(logicalSizeForChild(*childB ox)); 2499 shapeOutside->setReferenceBoxLogicalSize(logicalSizeForChild(*childB ox));
2500 2500
2501 if (width) 2501 if (width)
2502 width->shrinkAvailableWidthForNewFloatIfNeeded(floatingObject); 2502 width->shrinkAvailableWidthForNewFloatIfNeeded(floatingObject);
2503 } 2503 }
2504 return true; 2504 return true;
2505 } 2505 }
2506 2506
2507 bool LayoutBlockFlow::hasOverhangingFloat(LayoutBox* renderer) 2507 bool LayoutBlockFlow::hasOverhangingFloat(LayoutBox* renderer)
2508 { 2508 {
2509 if (!m_floatingObjects || hasColumns() || !parent()) 2509 if (!m_floatingObjects || hasColumns() || !parent())
2510 return false; 2510 return false;
2511 2511
2512 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); 2512 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set();
2513 FloatingObjectSetIterator it = floatingObjectSet.find<FloatingObjectHashTran slator>(renderer); 2513 FloatingObjectSetIterator it = floatingObjectSet.find<FloatingObjectHashTran slator>(renderer);
2514 if (it == floatingObjectSet.end()) 2514 if (it == floatingObjectSet.end())
2515 return false; 2515 return false;
2516 2516
2517 return logicalBottomForFloat(it->get()) > logicalHeight(); 2517 return logicalBottomForFloat(it->getReference()) > logicalHeight();
2518 } 2518 }
2519 2519
2520 void LayoutBlockFlow::addIntrudingFloats(LayoutBlockFlow* prev, LayoutUnit logic alLeftOffset, LayoutUnit logicalTopOffset) 2520 void LayoutBlockFlow::addIntrudingFloats(LayoutBlockFlow* prev, LayoutUnit logic alLeftOffset, LayoutUnit logicalTopOffset)
2521 { 2521 {
2522 ASSERT(!avoidsFloats()); 2522 ASSERT(!avoidsFloats());
2523 2523
2524 // If we create our own block formatting context then our contents don't int eract with floats outside it, even those from our parent. 2524 // If we create our own block formatting context then our contents don't int eract with floats outside it, even those from our parent.
2525 if (createsNewFormattingContext()) 2525 if (createsNewFormattingContext())
2526 return; 2526 return;
2527 2527
2528 // If the parent or previous sibling doesn't have any floats to add, don't b other. 2528 // If the parent or previous sibling doesn't have any floats to add, don't b other.
2529 if (!prev->m_floatingObjects) 2529 if (!prev->m_floatingObjects)
2530 return; 2530 return;
2531 2531
2532 logicalLeftOffset += marginLogicalLeft(); 2532 logicalLeftOffset += marginLogicalLeft();
2533 2533
2534 const FloatingObjectSet& prevSet = prev->m_floatingObjects->set(); 2534 const FloatingObjectSet& prevSet = prev->m_floatingObjects->set();
2535 FloatingObjectSetIterator prevEnd = prevSet.end(); 2535 FloatingObjectSetIterator prevEnd = prevSet.end();
2536 for (FloatingObjectSetIterator prevIt = prevSet.begin(); prevIt != prevEnd; ++prevIt) { 2536 for (FloatingObjectSetIterator prevIt = prevSet.begin(); prevIt != prevEnd; ++prevIt) {
2537 FloatingObject* floatingObject = prevIt->get(); 2537 FloatingObject* floatingObject = prevIt->get();
2538 if (logicalBottomForFloat(floatingObject) > logicalTopOffset) { 2538 if (logicalBottomForFloat(*floatingObject) > logicalTopOffset) {
2539 if (!m_floatingObjects || !m_floatingObjects->set().contains(floatin gObject)) { 2539 if (!m_floatingObjects || !m_floatingObjects->set().contains(floatin gObject)) {
2540 // We create the floating object list lazily. 2540 // We create the floating object list lazily.
2541 if (!m_floatingObjects) 2541 if (!m_floatingObjects)
2542 createFloatingObjects(); 2542 createFloatingObjects();
2543 2543
2544 // Applying the child's margin makes no sense in the case where the child was passed in. 2544 // Applying the child's margin makes no sense in the case where the child was passed in.
2545 // since this margin was added already through the modification of the |logicalLeftOffset| variable 2545 // since this margin was added already through the modification of the |logicalLeftOffset| variable
2546 // above. |logicalLeftOffset| will equal the margin in this case , so it's already been taken 2546 // above. |logicalLeftOffset| will equal the margin in this case , so it's already been taken
2547 // into account. Only apply this code if prev is the parent, sin ce otherwise the left margin 2547 // into account. Only apply this code if prev is the parent, sin ce otherwise the left margin
2548 // will get applied twice. 2548 // will get applied twice.
(...skipping 13 matching lines...) Expand all
2562 if (!child->containsFloats() || child->isLayoutRegion() || child->createsNew FormattingContext()) 2562 if (!child->containsFloats() || child->isLayoutRegion() || child->createsNew FormattingContext())
2563 return; 2563 return;
2564 2564
2565 LayoutUnit childLogicalTop = child->logicalTop(); 2565 LayoutUnit childLogicalTop = child->logicalTop();
2566 LayoutUnit childLogicalLeft = child->logicalLeft(); 2566 LayoutUnit childLogicalLeft = child->logicalLeft();
2567 2567
2568 // Floats that will remain the child's responsibility to paint should factor into its 2568 // Floats that will remain the child's responsibility to paint should factor into its
2569 // overflow. 2569 // overflow.
2570 FloatingObjectSetIterator childEnd = child->m_floatingObjects->set().end(); 2570 FloatingObjectSetIterator childEnd = child->m_floatingObjects->set().end();
2571 for (FloatingObjectSetIterator childIt = child->m_floatingObjects->set().beg in(); childIt != childEnd; ++childIt) { 2571 for (FloatingObjectSetIterator childIt = child->m_floatingObjects->set().beg in(); childIt != childEnd; ++childIt) {
2572 FloatingObject* floatingObject = childIt->get(); 2572 FloatingObject& floatingObject = childIt->getReference();
2573 LayoutUnit logicalBottomForFloat = std::min(this->logicalBottomForFloat( floatingObject), LayoutUnit::max() - childLogicalTop); 2573 LayoutUnit logicalBottomForFloat = std::min(this->logicalBottomForFloat( floatingObject), LayoutUnit::max() - childLogicalTop);
2574 LayoutUnit logicalBottom = childLogicalTop + logicalBottomForFloat; 2574 LayoutUnit logicalBottom = childLogicalTop + logicalBottomForFloat;
2575 2575
2576 if (logicalBottom > logicalHeight()) { 2576 if (logicalBottom > logicalHeight()) {
2577 // If the object is not in the list, we add it now. 2577 // If the object is not in the list, we add it now.
2578 if (!containsFloat(floatingObject->layoutObject())) { 2578 if (!containsFloat(floatingObject.layoutObject())) {
2579 LayoutSize offset = isHorizontalWritingMode() ? LayoutSize(-chil dLogicalLeft, -childLogicalTop) : LayoutSize(-childLogicalTop, -childLogicalLeft ); 2579 LayoutSize offset = isHorizontalWritingMode() ? LayoutSize(-chil dLogicalLeft, -childLogicalTop) : LayoutSize(-childLogicalTop, -childLogicalLeft );
2580 bool shouldPaint = false; 2580 bool shouldPaint = false;
2581 2581
2582 // The nearest enclosing layer always paints the float (so that zindex and stacking 2582 // The nearest enclosing layer always paints the float (so that zindex and stacking
2583 // behaves properly). We always want to propagate the desire to paint the float as 2583 // behaves properly). We always want to propagate the desire to paint the float as
2584 // far out as we can, to the outermost block that overlaps the f loat, stopping only 2584 // far out as we can, to the outermost block that overlaps the f loat, stopping only
2585 // if we hit a self-painting layer boundary. 2585 // if we hit a self-painting layer boundary.
2586 if (floatingObject->layoutObject()->enclosingFloatPaintingLayer( ) == enclosingFloatPaintingLayer()) { 2586 if (floatingObject.layoutObject()->enclosingFloatPaintingLayer() == enclosingFloatPaintingLayer()) {
2587 floatingObject->setShouldPaint(false); 2587 floatingObject.setShouldPaint(false);
2588 shouldPaint = true; 2588 shouldPaint = true;
2589 } 2589 }
2590 // We create the floating object list lazily. 2590 // We create the floating object list lazily.
2591 if (!m_floatingObjects) 2591 if (!m_floatingObjects)
2592 createFloatingObjects(); 2592 createFloatingObjects();
2593 2593
2594 m_floatingObjects->add(floatingObject->copyToNewContainer(offset , shouldPaint, true)); 2594 m_floatingObjects->add(floatingObject.copyToNewContainer(offset, shouldPaint, true));
2595 } 2595 }
2596 } else { 2596 } else {
2597 if (makeChildPaintOtherFloats && !floatingObject->shouldPaint() && ! floatingObject->layoutObject()->hasSelfPaintingLayer() 2597 if (makeChildPaintOtherFloats && !floatingObject.shouldPaint() && !f loatingObject.layoutObject()->hasSelfPaintingLayer()
2598 && floatingObject->layoutObject()->isDescendantOf(child) && floa tingObject->layoutObject()->enclosingFloatPaintingLayer() == child->enclosingFlo atPaintingLayer()) { 2598 && floatingObject.layoutObject()->isDescendantOf(child) && float ingObject.layoutObject()->enclosingFloatPaintingLayer() == child->enclosingFloat PaintingLayer()) {
2599 // The float is not overhanging from this block, so if it is a d escendant of the child, the child should 2599 // The float is not overhanging from this block, so if it is a d escendant of the child, the child should
2600 // paint it (the other case is that it is intruding into the chi ld), unless it has its own layer or enclosing 2600 // paint it (the other case is that it is intruding into the chi ld), unless it has its own layer or enclosing
2601 // layer. 2601 // layer.
2602 // If makeChildPaintOtherFloats is false, it means that the chil d must already know about all the floats 2602 // If makeChildPaintOtherFloats is false, it means that the chil d must already know about all the floats
2603 // it should paint. 2603 // it should paint.
2604 floatingObject->setShouldPaint(true); 2604 floatingObject.setShouldPaint(true);
2605 } 2605 }
2606 2606
2607 // Since the float doesn't overhang, it didn't get put into our list . We need to go ahead and add its overflow in to the 2607 // Since the float doesn't overhang, it didn't get put into our list . We need to go ahead and add its overflow in to the
2608 // child now. 2608 // child now.
2609 if (floatingObject->isDescendant()) 2609 if (floatingObject.isDescendant())
2610 child->addOverflowFromChild(floatingObject->layoutObject(), Layo utSize(xPositionForFloatIncludingMargin(floatingObject), yPositionForFloatInclud ingMargin(floatingObject))); 2610 child->addOverflowFromChild(floatingObject.layoutObject(), Layou tSize(xPositionForFloatIncludingMargin(floatingObject), yPositionForFloatIncludi ngMargin(floatingObject)));
2611 } 2611 }
2612 } 2612 }
2613 } 2613 }
2614 2614
2615 LayoutUnit LayoutBlockFlow::lowestFloatLogicalBottom(FloatingObject::Type floatT ype) const 2615 LayoutUnit LayoutBlockFlow::lowestFloatLogicalBottom(FloatingObject::Type floatT ype) const
2616 { 2616 {
2617 if (!m_floatingObjects) 2617 if (!m_floatingObjects)
2618 return LayoutUnit(); 2618 return LayoutUnit();
2619 2619
2620 return m_floatingObjects->lowestFloatLogicalBottom(floatType); 2620 return m_floatingObjects->lowestFloatLogicalBottom(floatType);
2621 } 2621 }
2622 2622
2623 LayoutUnit LayoutBlockFlow::nextFloatLogicalBottomBelow(LayoutUnit logicalHeight , ShapeOutsideFloatOffsetMode offsetMode) const 2623 LayoutUnit LayoutBlockFlow::nextFloatLogicalBottomBelow(LayoutUnit logicalHeight , ShapeOutsideFloatOffsetMode offsetMode) const
2624 { 2624 {
2625 if (!m_floatingObjects) 2625 if (!m_floatingObjects)
2626 return logicalHeight; 2626 return logicalHeight;
2627 2627
2628 LayoutUnit logicalBottom; 2628 LayoutUnit logicalBottom;
2629 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); 2629 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set();
2630 FloatingObjectSetIterator end = floatingObjectSet.end(); 2630 FloatingObjectSetIterator end = floatingObjectSet.end();
2631 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++ it) { 2631 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++ it) {
2632 FloatingObject* floatingObject = it->get(); 2632 FloatingObject& floatingObject = it->getReference();
2633 LayoutUnit floatLogicalBottom = logicalBottomForFloat(floatingObject); 2633 LayoutUnit floatLogicalBottom = logicalBottomForFloat(floatingObject);
2634 ShapeOutsideInfo* shapeOutside = floatingObject->layoutObject()->shapeOu tsideInfo(); 2634 ShapeOutsideInfo* shapeOutside = floatingObject.layoutObject()->shapeOut sideInfo();
2635 if (shapeOutside && (offsetMode == ShapeOutsideFloatShapeOffset)) { 2635 if (shapeOutside && (offsetMode == ShapeOutsideFloatShapeOffset)) {
2636 LayoutUnit shapeLogicalBottom = logicalTopForFloat(floatingObject) + marginBeforeForChild(*(floatingObject->layoutObject())) + shapeOutside->shapeLo gicalBottom(); 2636 LayoutUnit shapeLogicalBottom = logicalTopForFloat(floatingObject) + marginBeforeForChild(*(floatingObject.layoutObject())) + shapeOutside->shapeLog icalBottom();
2637 // Use the shapeLogicalBottom unless it extends outside of the margi n box, in which case it is clipped. 2637 // Use the shapeLogicalBottom unless it extends outside of the margi n box, in which case it is clipped.
2638 if (shapeLogicalBottom < floatLogicalBottom) 2638 if (shapeLogicalBottom < floatLogicalBottom)
2639 floatLogicalBottom = shapeLogicalBottom; 2639 floatLogicalBottom = shapeLogicalBottom;
2640 } 2640 }
2641 if (floatLogicalBottom > logicalHeight) 2641 if (floatLogicalBottom > logicalHeight)
2642 logicalBottom = logicalBottom ? std::min(floatLogicalBottom, logical Bottom) : floatLogicalBottom; 2642 logicalBottom = logicalBottom ? std::min(floatLogicalBottom, logical Bottom) : floatLogicalBottom;
2643 } 2643 }
2644 2644
2645 return logicalBottom; 2645 return logicalBottom;
2646 } 2646 }
2647 2647
2648 bool LayoutBlockFlow::hitTestFloats(const HitTestRequest& request, HitTestResult & result, const HitTestLocation& locationInContainer, const LayoutPoint& accumul atedOffset) 2648 bool LayoutBlockFlow::hitTestFloats(const HitTestRequest& request, HitTestResult & result, const HitTestLocation& locationInContainer, const LayoutPoint& accumul atedOffset)
2649 { 2649 {
2650 if (!m_floatingObjects) 2650 if (!m_floatingObjects)
2651 return false; 2651 return false;
2652 2652
2653 LayoutPoint adjustedLocation = accumulatedOffset; 2653 LayoutPoint adjustedLocation = accumulatedOffset;
2654 if (isLayoutView()) { 2654 if (isLayoutView()) {
2655 DoublePoint position = toLayoutView(this)->frameView()->scrollPositionDo uble(); 2655 DoublePoint position = toLayoutView(this)->frameView()->scrollPositionDo uble();
2656 adjustedLocation.move(position.x(), position.y()); 2656 adjustedLocation.move(position.x(), position.y());
2657 } 2657 }
2658 2658
2659 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); 2659 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set();
2660 FloatingObjectSetIterator begin = floatingObjectSet.begin(); 2660 FloatingObjectSetIterator begin = floatingObjectSet.begin();
2661 for (FloatingObjectSetIterator it = floatingObjectSet.end(); it != begin;) { 2661 for (FloatingObjectSetIterator it = floatingObjectSet.end(); it != begin;) {
2662 --it; 2662 --it;
2663 FloatingObject* floatingObject = it->get(); 2663 FloatingObject& floatingObject = it->getReference();
2664 if (floatingObject->shouldPaint() && !floatingObject->layoutObject()->ha sSelfPaintingLayer()) { 2664 if (floatingObject.shouldPaint() && !floatingObject.layoutObject()->hasS elfPaintingLayer()) {
2665 LayoutUnit xOffset = xPositionForFloatIncludingMargin(floatingObject ) - floatingObject->layoutObject()->location().x(); 2665 LayoutUnit xOffset = xPositionForFloatIncludingMargin(floatingObject ) - floatingObject.layoutObject()->location().x();
2666 LayoutUnit yOffset = yPositionForFloatIncludingMargin(floatingObject ) - floatingObject->layoutObject()->location().y(); 2666 LayoutUnit yOffset = yPositionForFloatIncludingMargin(floatingObject ) - floatingObject.layoutObject()->location().y();
2667 LayoutPoint childPoint = flipFloatForWritingModeForChild(floatingObj ect, adjustedLocation + LayoutSize(xOffset, yOffset)); 2667 LayoutPoint childPoint = flipFloatForWritingModeForChild(floatingObj ect, adjustedLocation + LayoutSize(xOffset, yOffset));
2668 if (floatingObject->layoutObject()->hitTest(request, result, locatio nInContainer, childPoint)) { 2668 if (floatingObject.layoutObject()->hitTest(request, result, location InContainer, childPoint)) {
2669 updateHitTestResult(result, locationInContainer.point() - toLayo utSize(childPoint)); 2669 updateHitTestResult(result, locationInContainer.point() - toLayo utSize(childPoint));
2670 return true; 2670 return true;
2671 } 2671 }
2672 } 2672 }
2673 } 2673 }
2674 2674
2675 return false; 2675 return false;
2676 } 2676 }
2677 2677
2678 LayoutUnit LayoutBlockFlow::logicalLeftFloatOffsetForLine(LayoutUnit logicalTop, LayoutUnit fixedOffset, LayoutUnit logicalHeight) const 2678 LayoutUnit LayoutBlockFlow::logicalLeftFloatOffsetForLine(LayoutUnit logicalTop, LayoutUnit fixedOffset, LayoutUnit logicalHeight) const
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after
3155 } 3155 }
3156 if (isAnonymous()) 3156 if (isAnonymous())
3157 return "LayoutBlockFlow (anonymous)"; 3157 return "LayoutBlockFlow (anonymous)";
3158 if (isRelPositioned()) 3158 if (isRelPositioned())
3159 return "LayoutBlockFlow (relative positioned)"; 3159 return "LayoutBlockFlow (relative positioned)";
3160 return "LayoutBlockFlow"; 3160 return "LayoutBlockFlow";
3161 } 3161 }
3162 3162
3163 3163
3164 } // namespace blink 3164 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698