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

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

Issue 763173003: Convert RenderBlockFlow code to use FloatingObject references (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase Created 5 years, 6 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) 2000 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r ight reserved. 3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r ight reserved.
4 * Copyright (C) 2010 Google Inc. All rights reserved. 4 * Copyright (C) 2010 Google Inc. All rights reserved.
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version. 9 * version 2 of the License, or (at your option) any later version.
10 * 10 *
(...skipping 593 matching lines...) Expand 10 before | Expand all | Expand 10 after
604 604
605 // Position is used to properly position both replaced elements and 605 // Position is used to properly position both replaced elements and
606 // to update the static normal flow x/y of positioned elements. 606 // to update the static normal flow x/y of positioned elements.
607 if (r->m_object->isText()) 607 if (r->m_object->isText())
608 toLayoutText(r->m_object)->positionLineBox(r->m_box); 608 toLayoutText(r->m_object)->positionLineBox(r->m_box);
609 else if (r->m_object->isBox()) 609 else if (r->m_object->isBox())
610 toLayoutBox(r->m_object)->positionLineBox(r->m_box); 610 toLayoutBox(r->m_object)->positionLineBox(r->m_box);
611 } 611 }
612 } 612 }
613 613
614 void LayoutBlockFlow::appendFloatingObjectToLastLine(FloatingObject* floatingObj ect) 614 void LayoutBlockFlow::appendFloatingObjectToLastLine(FloatingObject& floatingObj ect)
615 { 615 {
616 ASSERT(!floatingObject->originatingLine()); 616 ASSERT(!floatingObject.originatingLine());
617 floatingObject->setOriginatingLine(lastRootBox()); 617 floatingObject.setOriginatingLine(lastRootBox());
618 lastRootBox()->appendFloat(floatingObject->layoutObject()); 618 lastRootBox()->appendFloat(floatingObject.layoutObject());
619 } 619 }
620 620
621 // This function constructs line boxes for all of the text runs in the resolver and computes their position. 621 // This function constructs line boxes for all of the text runs in the resolver and computes their position.
622 RootInlineBox* LayoutBlockFlow::createLineBoxesFromBidiRuns(unsigned bidiLevel, BidiRunList<BidiRun>& bidiRuns, const InlineIterator& end, LineInfo& lineInfo, V erticalPositionCache& verticalPositionCache, BidiRun* trailingSpaceRun, WordMeas urements& wordMeasurements) 622 RootInlineBox* LayoutBlockFlow::createLineBoxesFromBidiRuns(unsigned bidiLevel, BidiRunList<BidiRun>& bidiRuns, const InlineIterator& end, LineInfo& lineInfo, V erticalPositionCache& verticalPositionCache, BidiRun* trailingSpaceRun, WordMeas urements& wordMeasurements)
623 { 623 {
624 if (!bidiRuns.runCount()) 624 if (!bidiRuns.runCount())
625 return nullptr; 625 return nullptr;
626 626
627 // FIXME: Why is this only done when we had runs? 627 // FIXME: Why is this only done when we had runs?
628 lineInfo.setLastLine(!end.object()); 628 lineInfo.setLastLine(!end.object());
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
847 const FloatingObjectSet& floatingObjectSet = m_floatingObjects-> set(); 847 const FloatingObjectSet& floatingObjectSet = m_floatingObjects-> set();
848 FloatingObjectSetIterator it = floatingObjectSet.begin(); 848 FloatingObjectSetIterator it = floatingObjectSet.begin();
849 FloatingObjectSetIterator end = floatingObjectSet.end(); 849 FloatingObjectSetIterator end = floatingObjectSet.end();
850 if (layoutState.lastFloat()) { 850 if (layoutState.lastFloat()) {
851 FloatingObjectSetIterator lastFloatIterator = floatingObject Set.find(layoutState.lastFloat()); 851 FloatingObjectSetIterator lastFloatIterator = floatingObject Set.find(layoutState.lastFloat());
852 ASSERT(lastFloatIterator != end); 852 ASSERT(lastFloatIterator != end);
853 ++lastFloatIterator; 853 ++lastFloatIterator;
854 it = lastFloatIterator; 854 it = lastFloatIterator;
855 } 855 }
856 for (; it != end; ++it) { 856 for (; it != end; ++it) {
857 FloatingObject* f = it->get(); 857 FloatingObject& floatingObject = *it->get();
858 appendFloatingObjectToLastLine(f); 858 appendFloatingObjectToLastLine(floatingObject);
859 ASSERT(f->layoutObject() == layoutState.floats()[layoutState .floatIndex()].object); 859 ASSERT(floatingObject.layoutObject() == layoutState.floats() [layoutState.floatIndex()].object);
860 // If a float's geometry has changed, give up on syncing wit h clean lines. 860 // If a float's geometry has changed, give up on syncing wit h clean lines.
861 if (layoutState.floats()[layoutState.floatIndex()].rect != f ->frameRect()) 861 if (layoutState.floats()[layoutState.floatIndex()].rect != f loatingObject.frameRect())
862 checkForEndLineMatch = false; 862 checkForEndLineMatch = false;
863 layoutState.setFloatIndex(layoutState.floatIndex() + 1); 863 layoutState.setFloatIndex(layoutState.floatIndex() + 1);
864 } 864 }
865 layoutState.setLastFloat(!floatingObjectSet.isEmpty() ? floating ObjectSet.last().get() : 0); 865 layoutState.setLastFloat(!floatingObjectSet.isEmpty() ? floating ObjectSet.last().get() : 0);
866 } 866 }
867 } 867 }
868 868
869 lineMidpointState.reset(); 869 lineMidpointState.reset();
870 resolver.setPosition(endOfLine, numberOfIsolateAncestors(endOfLine)); 870 resolver.setPosition(endOfLine, numberOfIsolateAncestors(endOfLine));
871 } 871 }
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
995 VerticalPositionCache verticalPositionCache; 995 VerticalPositionCache verticalPositionCache;
996 LayoutUnit blockLogicalHeight = logicalHeight(); 996 LayoutUnit blockLogicalHeight = logicalHeight();
997 trailingFloatsLineBox->alignBoxesInBlockDirection(blockLogicalHeight , textBoxDataMap, verticalPositionCache); 997 trailingFloatsLineBox->alignBoxesInBlockDirection(blockLogicalHeight , textBoxDataMap, verticalPositionCache);
998 trailingFloatsLineBox->setLineTopBottomPositions(blockLogicalHeight, blockLogicalHeight, blockLogicalHeight, blockLogicalHeight); 998 trailingFloatsLineBox->setLineTopBottomPositions(blockLogicalHeight, blockLogicalHeight, blockLogicalHeight, blockLogicalHeight);
999 LayoutRect logicalLayoutOverflow(0, blockLogicalHeight, 1, bottomLay outOverflow - blockLogicalHeight); 999 LayoutRect logicalLayoutOverflow(0, blockLogicalHeight, 1, bottomLay outOverflow - blockLogicalHeight);
1000 LayoutRect logicalVisualOverflow(0, blockLogicalHeight, 1, bottomVis ualOverflow - blockLogicalHeight); 1000 LayoutRect logicalVisualOverflow(0, blockLogicalHeight, 1, bottomVis ualOverflow - blockLogicalHeight);
1001 trailingFloatsLineBox->setOverflowFromLogicalRects(logicalLayoutOver flow, logicalVisualOverflow, trailingFloatsLineBox->lineTop(), trailingFloatsLin eBox->lineBottom()); 1001 trailingFloatsLineBox->setOverflowFromLogicalRects(logicalLayoutOver flow, logicalVisualOverflow, trailingFloatsLineBox->lineTop(), trailingFloatsLin eBox->lineBottom());
1002 } 1002 }
1003 1003
1004 for (; it != end; ++it) 1004 for (; it != end; ++it)
1005 appendFloatingObjectToLastLine(it->get()); 1005 appendFloatingObjectToLastLine(*it->get());
1006 } 1006 }
1007 } 1007 }
1008 1008
1009 void LayoutBlockFlow::markDirtyFloatsForPaintInvalidation(Vector<FloatWithRect>& floats) 1009 void LayoutBlockFlow::markDirtyFloatsForPaintInvalidation(Vector<FloatWithRect>& floats)
1010 { 1010 {
1011 size_t floatCount = floats.size(); 1011 size_t floatCount = floats.size();
1012 // Floats that did not have layout did not paint invalidations when we laid them out. They would have 1012 // Floats that did not have layout did not paint invalidations when we laid them out. They would have
1013 // painted by now if they had moved, but if they stayed at (0, 0), they stil l need to be 1013 // painted by now if they had moved, but if they stayed at (0, 0), they stil l need to be
1014 // painted. 1014 // painted.
1015 for (size_t i = 0; i < floatCount; ++i) { 1015 for (size_t i = 0; i < floatCount; ++i) {
(...skipping 757 matching lines...) Expand 10 before | Expand all | Expand 10 after
1773 1773
1774 RootInlineBox* lastLine = layoutState.endLine(); 1774 RootInlineBox* lastLine = layoutState.endLine();
1775 while (RootInlineBox* nextLine = lastLine->nextRootBox()) 1775 while (RootInlineBox* nextLine = lastLine->nextRootBox())
1776 lastLine = nextLine; 1776 lastLine = nextLine;
1777 1777
1778 LayoutUnit logicalBottom = lastLine->lineBottomWithLeading() + absoluteValue (lineDelta); 1778 LayoutUnit logicalBottom = lastLine->lineBottomWithLeading() + absoluteValue (lineDelta);
1779 1779
1780 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); 1780 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set();
1781 FloatingObjectSetIterator end = floatingObjectSet.end(); 1781 FloatingObjectSetIterator end = floatingObjectSet.end();
1782 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++ it) { 1782 for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++ it) {
1783 FloatingObject* floatingObject = it->get(); 1783 const FloatingObject& floatingObject = *it->get();
1784 if (logicalBottomForFloat(floatingObject) >= logicalTop && logicalBottom ForFloat(floatingObject) < logicalBottom) 1784 if (logicalBottomForFloat(floatingObject) >= logicalTop && logicalBottom ForFloat(floatingObject) < logicalBottom)
1785 return false; 1785 return false;
1786 } 1786 }
1787 1787
1788 return true; 1788 return true;
1789 } 1789 }
1790 1790
1791 bool LayoutBlockFlow::matchedEndLine(LineLayoutState& layoutState, const InlineB idiResolver& resolver, const InlineIterator& endLineStart, const BidiStatus& end LineStatus) 1791 bool LayoutBlockFlow::matchedEndLine(LineLayoutState& layoutState, const InlineB idiResolver& resolver, const InlineIterator& endLineStart, const BidiStatus& end LineStatus)
1792 { 1792 {
1793 if (resolver.position() == endLineStart) { 1793 if (resolver.position() == endLineStart) {
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
1947 if (ltr) 1947 if (ltr)
1948 curr->adjustLogicalPosition(logicalLeft, 0); 1948 curr->adjustLogicalPosition(logicalLeft, 0);
1949 else 1949 else
1950 curr->adjustLogicalPosition(logicalLeft - (availableLogicalW idth - totalLogicalWidth), 0); 1950 curr->adjustLogicalPosition(logicalLeft - (availableLogicalW idth - totalLogicalWidth), 0);
1951 } 1951 }
1952 } 1952 }
1953 firstLine = false; 1953 firstLine = false;
1954 } 1954 }
1955 } 1955 }
1956 1956
1957 bool LayoutBlockFlow::positionNewFloatOnLine(FloatingObject* newFloat, FloatingO bject* lastFloatFromPreviousLine, LineInfo& lineInfo, LineWidth& width) 1957 bool LayoutBlockFlow::positionNewFloatOnLine(FloatingObject& newFloat, FloatingO bject* lastFloatFromPreviousLine, LineInfo& lineInfo, LineWidth& width)
1958 { 1958 {
1959 if (!positionNewFloats(&width)) 1959 if (!positionNewFloats(&width))
1960 return false; 1960 return false;
1961 1961
1962 // We only connect floats to lines for pagination purposes if the floats occ ur at the start of 1962 // We only connect floats to lines for pagination purposes if the floats occ ur at the start of
1963 // the line and the previous line had a hard break (so this line is either t he first in the block 1963 // the line and the previous line had a hard break (so this line is either t he first in the block
1964 // or follows a <br>). 1964 // or follows a <br>).
1965 if (!newFloat->paginationStrut() || !lineInfo.previousLineBrokeCleanly() || !lineInfo.isEmpty()) 1965 if (!newFloat.paginationStrut() || !lineInfo.previousLineBrokeCleanly() || ! lineInfo.isEmpty())
1966 return true; 1966 return true;
1967 1967
1968 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); 1968 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set();
1969 ASSERT(floatingObjectSet.last() == newFloat); 1969 ASSERT(floatingObjectSet.last() == &newFloat);
1970 1970
1971 LayoutUnit floatLogicalTop = logicalTopForFloat(newFloat); 1971 LayoutUnit floatLogicalTop = logicalTopForFloat(newFloat);
1972 int paginationStrut = newFloat->paginationStrut(); 1972 int paginationStrut = newFloat.paginationStrut();
1973 1973
1974 if (floatLogicalTop - paginationStrut != logicalHeight() + lineInfo.floatPag inationStrut()) 1974 if (floatLogicalTop - paginationStrut != logicalHeight() + lineInfo.floatPag inationStrut())
1975 return true; 1975 return true;
1976 1976
1977 FloatingObjectSetIterator it = floatingObjectSet.end(); 1977 FloatingObjectSetIterator it = floatingObjectSet.end();
1978 --it; // Last float is newFloat, skip that one. 1978 --it; // Last float is newFloat, skip that one.
1979 FloatingObjectSetIterator begin = floatingObjectSet.begin(); 1979 FloatingObjectSetIterator begin = floatingObjectSet.begin();
1980 while (it != begin) { 1980 while (it != begin) {
1981 --it; 1981 --it;
1982 FloatingObject* floatingObject = it->get(); 1982 FloatingObject& floatingObject = *it->get();
1983 if (floatingObject == lastFloatFromPreviousLine) 1983 if (&floatingObject == lastFloatFromPreviousLine)
1984 break; 1984 break;
1985 if (logicalTopForFloat(floatingObject) == logicalHeight() + lineInfo.flo atPaginationStrut()) { 1985 if (logicalTopForFloat(floatingObject) == logicalHeight() + lineInfo.flo atPaginationStrut()) {
1986 floatingObject->setPaginationStrut(paginationStrut + floatingObject- >paginationStrut()); 1986 floatingObject.setPaginationStrut(paginationStrut + floatingObject.p aginationStrut());
1987 LayoutBox* floatBox = floatingObject->layoutObject(); 1987 LayoutBox* floatBox = floatingObject.layoutObject();
1988 setLogicalTopForChild(*floatBox, logicalTopForChild(*floatBox) + mar ginBeforeForChild(*floatBox) + paginationStrut); 1988 setLogicalTopForChild(*floatBox, logicalTopForChild(*floatBox) + mar ginBeforeForChild(*floatBox) + paginationStrut);
1989 if (floatBox->isLayoutBlock()) 1989 if (floatBox->isLayoutBlock())
1990 floatBox->forceChildLayout(); 1990 floatBox->forceChildLayout();
1991 else 1991 else
1992 floatBox->layoutIfNeeded(); 1992 floatBox->layoutIfNeeded();
1993 // Save the old logical top before calling removePlacedObject which will set 1993 // Save the old logical top before calling removePlacedObject which will set
1994 // isPlaced to false. Otherwise it will trigger an assert in logical TopForFloat. 1994 // isPlaced to false. Otherwise it will trigger an assert in logical TopForFloat.
1995 LayoutUnit oldLogicalTop = logicalTopForFloat(floatingObject); 1995 LayoutUnit oldLogicalTop = logicalTopForFloat(floatingObject);
1996 m_floatingObjects->removePlacedObject(floatingObject); 1996 m_floatingObjects->removePlacedObject(floatingObject);
1997 setLogicalTopForFloat(floatingObject, oldLogicalTop + paginationStru t); 1997 setLogicalTopForFloat(floatingObject, oldLogicalTop + paginationStru t);
(...skipping 19 matching lines...) Expand all
2017 LayoutUnit logicalLeft = logicalLeftOffsetForLine(logicalHeight(), false); 2017 LayoutUnit logicalLeft = logicalLeftOffsetForLine(logicalHeight(), false);
2018 LayoutUnit availableLogicalWidth = logicalRightOffsetForLine(logicalHeight() , false) - logicalLeft; 2018 LayoutUnit availableLogicalWidth = logicalRightOffsetForLine(logicalHeight() , false) - logicalLeft;
2019 updateLogicalWidthForAlignment(textAlign, 0, 0, logicalLeft, totalLogicalWid th, availableLogicalWidth, 0); 2019 updateLogicalWidthForAlignment(textAlign, 0, 0, logicalLeft, totalLogicalWid th, availableLogicalWidth, 0);
2020 2020
2021 if (!style()->isLeftToRightDirection()) 2021 if (!style()->isLeftToRightDirection())
2022 return logicalWidth() - logicalLeft; 2022 return logicalWidth() - logicalLeft;
2023 return logicalLeft; 2023 return logicalLeft;
2024 } 2024 }
2025 2025
2026 } 2026 }
OLDNEW
« no previous file with comments | « Source/core/layout/LayoutBlockFlow.cpp ('k') | Source/core/layout/line/BreakingContextInlineHeaders.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698