Changeset 83165 in webkit
- Timestamp:
- Apr 7, 2011 6:05:35 AM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r83164 r83165 1 2011-04-07 Ryosuke Niwa <rniwa@webkit.org> 2 3 Reviewed by Eric Seidel. 4 5 Add functions to update left and right offsets to LineOffsets 6 https://bugs.webkit.org/show_bug.cgi?id=58028 7 8 Added update() and shrinkWidthForNewFloatIfNeeded(FloatingObject*) to LineOffsets, 9 which are used to update m_left and m_right. Also added m_block and m_isFirstLine 10 member variables to LineOffsets so that users of LineOffsets don't have to pass them around. 11 12 * rendering/RenderBlock.h: 13 * rendering/RenderBlockLineLayout.cpp: 14 (WebCore::RenderBlock::skipLeadingWhitespace): No longer passes firstLine to positionNewFloatOnLine. 15 (WebCore::LineOffsets::LineOffsets): Takes RenderBlock* and isFirstLine instead of left and right offsets. 16 (WebCore::LineOffsets::update): Extracted from findNextLineBreak and positionNewFloatOnLine. 17 (WebCore::LineOffsets::shrinkWidthForNewFloatIfNeeded): Extracted from positionNewFloatOnLine. 18 (WebCore::RenderBlock::findNextLineBreak): Calls skipLeadingWhitespace and positionNewFloatOnLine. 19 (WebCore::RenderBlock::positionNewFloatOnLine): Calls shrinkWidthForNewFloatIfNeeded and update and 20 no longer passes firstLine around. 21 1 22 2011-04-06 Pavel Feldman <pfeldman@google.com> 2 23 -
trunk/Source/WebCore/rendering/RenderBlock.h
r83076 r83165 495 495 496 496 void skipTrailingWhitespace(InlineIterator&, bool isLineEmpty, bool previousLineBrokeCleanly); 497 void skipLeadingWhitespace(InlineBidiResolver&, bool firstLine, boolisLineEmpty, bool previousLineBrokeCleanly, FloatingObject* lastFloatFromPreviousLine, LineOffsets&);497 void skipLeadingWhitespace(InlineBidiResolver&, bool isLineEmpty, bool previousLineBrokeCleanly, FloatingObject* lastFloatFromPreviousLine, LineOffsets&); 498 498 void fitBelowFloats(float widthToFit, float totalOverhangWidth, bool firstLine, float& availableWidth); 499 499 typedef std::pair<RenderText*, LazyLineBreakIterator> LineBreakIteratorInfo; … … 510 510 // Positions new floats and also adjust all floats encountered on the line if any of them 511 511 // have to move to the next page/column. 512 bool positionNewFloatOnLine(FloatingObject* newFloat, FloatingObject* lastFloatFromPreviousLine, bool firstLine,LineOffsets&);512 bool positionNewFloatOnLine(FloatingObject* newFloat, FloatingObject* lastFloatFromPreviousLine, LineOffsets&); 513 513 514 514 // End of functions defined in RenderBlockLineLayout.cpp. … … 785 785 // (calling moveChildTo, moveAllChildrenTo, and makeChildrenNonInline). 786 786 friend class RenderRubyBase; 787 friend class LineOffsets; // Needs to know FloatingObject 787 788 }; 788 789 -
trunk/Source/WebCore/rendering/RenderBlockLineLayout.cpp
r83098 r83165 1454 1454 } 1455 1455 1456 void RenderBlock::skipLeadingWhitespace(InlineBidiResolver& resolver, bool firstLine, boolisLineEmpty, bool previousLineBrokeCleanly,1456 void RenderBlock::skipLeadingWhitespace(InlineBidiResolver& resolver, bool isLineEmpty, bool previousLineBrokeCleanly, 1457 1457 FloatingObject* lastFloatFromPreviousLine, LineOffsets& lineOffsets) 1458 1458 { … … 1460 1460 RenderObject* object = resolver.position().m_obj; 1461 1461 if (object->isFloating()) 1462 positionNewFloatOnLine(insertFloatingObject(toRenderBox(object)), lastFloatFromPreviousLine, firstLine,lineOffsets);1462 positionNewFloatOnLine(insertFloatingObject(toRenderBox(object)), lastFloatFromPreviousLine, lineOffsets); 1463 1463 else if (object->isPositioned()) 1464 1464 setStaticPositions(this, toRenderBox(object)); … … 1563 1563 class LineOffsets { 1564 1564 public: 1565 LineOffsets(int leftOffset, int rightOffset) 1566 : m_left(leftOffset) 1567 , m_right(rightOffset) 1568 { 1569 } 1565 LineOffsets(RenderBlock*, bool isFirstLine); 1570 1566 int width() const { return max(0, m_right - m_left); } 1571 void setLeft(int left) { m_left = left; } 1572 void setRight(int right) { m_right = right; } 1567 void update(); 1568 void shrinkWidthForNewFloatIfNeeded(RenderBlock::FloatingObject*); 1569 1573 1570 private: 1571 RenderBlock* m_block; 1574 1572 int m_left; 1575 1573 int m_right; 1574 bool m_isFirstLine; 1576 1575 }; 1576 1577 inline LineOffsets::LineOffsets(RenderBlock* block, bool isFirstLine) 1578 : m_block(block) 1579 , m_left(0) 1580 , m_right(0) 1581 , m_isFirstLine(isFirstLine) 1582 { 1583 ASSERT(block); 1584 update(); 1585 } 1586 1587 inline void LineOffsets::update() 1588 { 1589 int height = m_block->logicalHeight(); 1590 m_left = m_block->logicalLeftOffsetForLine(height, m_isFirstLine); 1591 m_right = m_block->logicalRightOffsetForLine(height, m_isFirstLine); 1592 } 1593 1594 inline void LineOffsets::shrinkWidthForNewFloatIfNeeded(RenderBlock::FloatingObject* newFloat) 1595 { 1596 int height = m_block->logicalHeight(); 1597 if (height < m_block->logicalTopForFloat(newFloat) || height >= m_block->logicalBottomForFloat(newFloat)) 1598 return; 1599 1600 if (newFloat->type() == RenderBlock::FloatingObject::FloatLeft) 1601 m_left = m_block->logicalRightForFloat(newFloat); 1602 else 1603 m_right = m_block->logicalLeftForFloat(newFloat); 1604 } 1577 1605 1578 1606 InlineIterator RenderBlock::findNextLineBreak(InlineBidiResolver& resolver, bool firstLine, bool& isLineEmpty, LineBreakIteratorInfo& lineBreakIteratorInfo, bool& previousLineBrokeCleanly, … … 1583 1611 bool appliedStartWidth = resolver.position().m_pos > 0; 1584 1612 LineMidpointState& lineMidpointState = resolver.midpointState(); 1585 1586 int blockOffset = logicalHeight(); 1587 LineOffsets lineOffsets(logicalLeftOffsetForLine(blockOffset, firstLine), logicalRightOffsetForLine(blockOffset, firstLine)); 1588 1589 skipLeadingWhitespace(resolver, firstLine, isLineEmpty, previousLineBrokeCleanly, lastFloatFromPreviousLine, lineOffsets); 1613 1614 LineOffsets lineOffsets(this, firstLine); 1615 1616 skipLeadingWhitespace(resolver, isLineEmpty, previousLineBrokeCleanly, lastFloatFromPreviousLine, lineOffsets); 1590 1617 1591 1618 float width = lineOffsets.width(); … … 1683 1710 // it after moving to next line (in newLine() func) 1684 1711 if (floatsFitOnLine && logicalWidthForFloat(f) + w + tmpW <= width) { 1685 positionNewFloatOnLine(f, lastFloatFromPreviousLine, firstLine,lineOffsets);1712 positionNewFloatOnLine(f, lastFloatFromPreviousLine, lineOffsets); 1686 1713 width = lineOffsets.width() + totalOverhangWidth; 1687 1714 if (lBreak.m_obj == o) { … … 2270 2297 } 2271 2298 2272 bool RenderBlock::positionNewFloatOnLine(FloatingObject* newFloat, FloatingObject* lastFloatFromPreviousLine, bool firstLine, LineOffsets& lineOffsets) 2273 { 2274 bool didPosition = positionNewFloats(); 2275 if (!didPosition) 2276 return didPosition; 2277 2278 int blockOffset = logicalHeight(); 2279 if (blockOffset >= logicalTopForFloat(newFloat) && blockOffset < logicalBottomForFloat(newFloat)) { 2280 if (newFloat->type() == FloatingObject::FloatLeft) 2281 lineOffsets.setLeft(logicalRightForFloat(newFloat)); 2282 else 2283 lineOffsets.setRight(logicalLeftForFloat(newFloat)); 2284 } 2299 bool RenderBlock::positionNewFloatOnLine(FloatingObject* newFloat, FloatingObject* lastFloatFromPreviousLine, LineOffsets& lineOffsets) 2300 { 2301 if (!positionNewFloats()) 2302 return false; 2303 2304 lineOffsets.shrinkWidthForNewFloatIfNeeded(newFloat); 2285 2305 2286 2306 if (!newFloat->m_paginationStrut) 2287 return didPosition;2307 return true; 2288 2308 2289 2309 FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); … … 2294 2314 2295 2315 if (floatLogicalTop - paginationStrut != logicalHeight()) 2296 return didPosition;2316 return true; 2297 2317 2298 2318 FloatingObjectSetIterator it = floatingObjectSet.end(); … … 2316 2336 } 2317 2337 2318 setLogicalHeight(blockOffset + paginationStrut); 2319 lineOffsets.setLeft(logicalLeftOffsetForLine(logicalHeight(), firstLine)); 2320 lineOffsets.setRight(logicalRightOffsetForLine(logicalHeight(), firstLine)); 2321 2322 return didPosition; 2323 } 2324 2325 } 2338 setLogicalHeight(logicalHeight() + paginationStrut); 2339 lineOffsets.update(); 2340 2341 return true; 2342 } 2343 2344 }
Note: See TracChangeset
for help on using the changeset viewer.