OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "config.h" | 5 #include "config.h" |
6 #include "core/paint/GridPainter.h" | 6 #include "core/paint/GridPainter.h" |
7 | 7 |
| 8 #include "core/layout/LayoutGrid.h" |
8 #include "core/layout/PaintInfo.h" | 9 #include "core/layout/PaintInfo.h" |
9 #include "core/paint/BlockPainter.h" | 10 #include "core/paint/BlockPainter.h" |
10 #include "core/rendering/RenderGrid.h" | |
11 | 11 |
12 namespace blink { | 12 namespace blink { |
13 | 13 |
14 static GridSpan dirtiedGridAreas(const Vector<LayoutUnit>& coordinates, LayoutUn
it start, LayoutUnit end) | 14 static GridSpan dirtiedGridAreas(const Vector<LayoutUnit>& coordinates, LayoutUn
it start, LayoutUnit end) |
15 { | 15 { |
16 // This function does a binary search over the coordinates. | 16 // This function does a binary search over the coordinates. |
17 // This doesn't work with grid items overflowing their grid areas, but that
is managed with m_gridItemsOverflowingGridArea. | 17 // This doesn't work with grid items overflowing their grid areas, but that
is managed with m_gridItemsOverflowingGridArea. |
18 | 18 |
19 size_t startGridAreaIndex = std::upper_bound(coordinates.begin(), coordinate
s.end() - 1, start) - coordinates.begin(); | 19 size_t startGridAreaIndex = std::upper_bound(coordinates.begin(), coordinate
s.end() - 1, start) - coordinates.begin(); |
20 if (startGridAreaIndex > 0) | 20 if (startGridAreaIndex > 0) |
(...skipping 12 matching lines...) Expand all Loading... |
33 { | 33 { |
34 if (firstChild.first->style()->order() != secondChild.first->style()->or
der()) | 34 if (firstChild.first->style()->order() != secondChild.first->style()->or
der()) |
35 return firstChild.first->style()->order() < secondChild.first->style
()->order(); | 35 return firstChild.first->style()->order() < secondChild.first->style
()->order(); |
36 | 36 |
37 return firstChild.second < secondChild.second; | 37 return firstChild.second < secondChild.second; |
38 } | 38 } |
39 }; | 39 }; |
40 | 40 |
41 void GridPainter::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& p
aintOffset) | 41 void GridPainter::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& p
aintOffset) |
42 { | 42 { |
43 ASSERT(!m_renderGrid.needsLayout()); | 43 ASSERT(!m_layoutGrid.needsLayout()); |
44 ASSERT_WITH_SECURITY_IMPLICATION(!m_renderGrid.gridIsDirty()); | 44 ASSERT_WITH_SECURITY_IMPLICATION(!m_layoutGrid.gridIsDirty()); |
45 | 45 |
46 LayoutRect localPaintInvalidationRect = paintInfo.rect; | 46 LayoutRect localPaintInvalidationRect = paintInfo.rect; |
47 localPaintInvalidationRect.moveBy(-paintOffset); | 47 localPaintInvalidationRect.moveBy(-paintOffset); |
48 | 48 |
49 GridSpan dirtiedColumns = dirtiedGridAreas(m_renderGrid.columnPositions(), l
ocalPaintInvalidationRect.x(), localPaintInvalidationRect.maxX()); | 49 GridSpan dirtiedColumns = dirtiedGridAreas(m_layoutGrid.columnPositions(), l
ocalPaintInvalidationRect.x(), localPaintInvalidationRect.maxX()); |
50 GridSpan dirtiedRows = dirtiedGridAreas(m_renderGrid.rowPositions(), localPa
intInvalidationRect.y(), localPaintInvalidationRect.maxY()); | 50 GridSpan dirtiedRows = dirtiedGridAreas(m_layoutGrid.rowPositions(), localPa
intInvalidationRect.y(), localPaintInvalidationRect.maxY()); |
51 | 51 |
52 Vector<std::pair<LayoutBox*, size_t>> gridItemsToBePainted; | 52 Vector<std::pair<LayoutBox*, size_t>> gridItemsToBePainted; |
53 | 53 |
54 for (GridSpan::iterator row = dirtiedRows.begin(); row != dirtiedRows.end();
++row) { | 54 for (GridSpan::iterator row = dirtiedRows.begin(); row != dirtiedRows.end();
++row) { |
55 for (GridSpan::iterator column = dirtiedColumns.begin(); column != dirti
edColumns.end(); ++column) { | 55 for (GridSpan::iterator column = dirtiedColumns.begin(); column != dirti
edColumns.end(); ++column) { |
56 const Vector<LayoutBox*, 1>& children = m_renderGrid.gridCell(row.to
Int(), column.toInt()); | 56 const Vector<LayoutBox*, 1>& children = m_layoutGrid.gridCell(row.to
Int(), column.toInt()); |
57 for (auto* child : children) | 57 for (auto* child : children) |
58 gridItemsToBePainted.append(std::make_pair(child, m_renderGrid.p
aintIndexForGridItem(child))); | 58 gridItemsToBePainted.append(std::make_pair(child, m_layoutGrid.p
aintIndexForGridItem(child))); |
59 } | 59 } |
60 } | 60 } |
61 | 61 |
62 for (auto* item: m_renderGrid.itemsOverflowingGridArea()) { | 62 for (auto* item: m_layoutGrid.itemsOverflowingGridArea()) { |
63 if (item->frameRect().intersects(localPaintInvalidationRect)) | 63 if (item->frameRect().intersects(localPaintInvalidationRect)) |
64 gridItemsToBePainted.append(std::make_pair(item, m_renderGrid.paintI
ndexForGridItem(item))); | 64 gridItemsToBePainted.append(std::make_pair(item, m_layoutGrid.paintI
ndexForGridItem(item))); |
65 } | 65 } |
66 | 66 |
67 // Sort grid items following order-modified document order. | 67 // Sort grid items following order-modified document order. |
68 // See http://www.w3.org/TR/css-flexbox/#order-modified-document-order | 68 // See http://www.w3.org/TR/css-flexbox/#order-modified-document-order |
69 std::stable_sort(gridItemsToBePainted.begin(), gridItemsToBePainted.end(), G
ridItemsSorter()); | 69 std::stable_sort(gridItemsToBePainted.begin(), gridItemsToBePainted.end(), G
ridItemsSorter()); |
70 | 70 |
71 LayoutBox* previous = 0; | 71 LayoutBox* previous = 0; |
72 for (const auto& gridItemAndPaintIndex : gridItemsToBePainted) { | 72 for (const auto& gridItemAndPaintIndex : gridItemsToBePainted) { |
73 // We might have duplicates because of spanning children are included in
all cells they span. | 73 // We might have duplicates because of spanning children are included in
all cells they span. |
74 // Skip them here to avoid painting items several times. | 74 // Skip them here to avoid painting items several times. |
75 LayoutBox* current = gridItemAndPaintIndex.first; | 75 LayoutBox* current = gridItemAndPaintIndex.first; |
76 if (current == previous) | 76 if (current == previous) |
77 continue; | 77 continue; |
78 | 78 |
79 BlockPainter(m_renderGrid).paintChild(*current, paintInfo, paintOffset); | 79 BlockPainter(m_layoutGrid).paintChild(*current, paintInfo, paintOffset); |
80 previous = current; | 80 previous = current; |
81 } | 81 } |
82 } | 82 } |
83 | 83 |
84 } // namespace blink | 84 } // namespace blink |
OLD | NEW |