OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2011 Apple 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 | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 14 matching lines...) Expand all Loading... |
25 | 25 |
26 #include "core/layout/LayoutGrid.h" | 26 #include "core/layout/LayoutGrid.h" |
27 | 27 |
28 #include "core/layout/LayoutState.h" | 28 #include "core/layout/LayoutState.h" |
29 #include "core/layout/TextAutosizer.h" | 29 #include "core/layout/TextAutosizer.h" |
30 #include "core/paint/GridPainter.h" | 30 #include "core/paint/GridPainter.h" |
31 #include "core/paint/PaintLayer.h" | 31 #include "core/paint/PaintLayer.h" |
32 #include "core/style/ComputedStyle.h" | 32 #include "core/style/ComputedStyle.h" |
33 #include "core/style/GridArea.h" | 33 #include "core/style/GridArea.h" |
34 #include "platform/LengthFunctions.h" | 34 #include "platform/LengthFunctions.h" |
| 35 #include "wtf/PtrUtil.h" |
35 #include <algorithm> | 36 #include <algorithm> |
| 37 #include <memory> |
36 | 38 |
37 namespace blink { | 39 namespace blink { |
38 | 40 |
39 static const int infinity = -1; | 41 static const int infinity = -1; |
40 | 42 |
41 class GridItemWithSpan; | 43 class GridItemWithSpan; |
42 | 44 |
43 class GridTrack { | 45 class GridTrack { |
44 public: | 46 public: |
45 GridTrack() | 47 GridTrack() |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 for (size_t column = m_columnIndex; column < maxColumns; ++column) { | 194 for (size_t column = m_columnIndex; column < maxColumns; ++column) { |
193 const GridCell& children = m_grid[row][column]; | 195 const GridCell& children = m_grid[row][column]; |
194 if (!children.isEmpty()) | 196 if (!children.isEmpty()) |
195 return false; | 197 return false; |
196 } | 198 } |
197 } | 199 } |
198 | 200 |
199 return true; | 201 return true; |
200 } | 202 } |
201 | 203 |
202 PassOwnPtr<GridArea> nextEmptyGridArea(size_t fixedTrackSpan, size_t varying
TrackSpan) | 204 std::unique_ptr<GridArea> nextEmptyGridArea(size_t fixedTrackSpan, size_t va
ryingTrackSpan) |
203 { | 205 { |
204 DCHECK(!m_grid.isEmpty()); | 206 DCHECK(!m_grid.isEmpty()); |
205 DCHECK(!m_grid[0].isEmpty()); | 207 DCHECK(!m_grid[0].isEmpty()); |
206 ASSERT(fixedTrackSpan >= 1 && varyingTrackSpan >= 1); | 208 ASSERT(fixedTrackSpan >= 1 && varyingTrackSpan >= 1); |
207 | 209 |
208 size_t rowSpan = (m_direction == ForColumns) ? varyingTrackSpan : fixedT
rackSpan; | 210 size_t rowSpan = (m_direction == ForColumns) ? varyingTrackSpan : fixedT
rackSpan; |
209 size_t columnSpan = (m_direction == ForColumns) ? fixedTrackSpan : varyi
ngTrackSpan; | 211 size_t columnSpan = (m_direction == ForColumns) ? fixedTrackSpan : varyi
ngTrackSpan; |
210 | 212 |
211 size_t& varyingTrackIndex = (m_direction == ForColumns) ? m_rowIndex : m
_columnIndex; | 213 size_t& varyingTrackIndex = (m_direction == ForColumns) ? m_rowIndex : m
_columnIndex; |
212 const size_t endOfVaryingTrackIndex = (m_direction == ForColumns) ? m_gr
id.size() : m_grid[0].size(); | 214 const size_t endOfVaryingTrackIndex = (m_direction == ForColumns) ? m_gr
id.size() : m_grid[0].size(); |
213 for (; varyingTrackIndex < endOfVaryingTrackIndex; ++varyingTrackIndex)
{ | 215 for (; varyingTrackIndex < endOfVaryingTrackIndex; ++varyingTrackIndex)
{ |
214 if (checkEmptyCells(rowSpan, columnSpan)) { | 216 if (checkEmptyCells(rowSpan, columnSpan)) { |
215 OwnPtr<GridArea> result = adoptPtr(new GridArea(GridSpan::transl
atedDefiniteGridSpan(m_rowIndex, m_rowIndex + rowSpan), GridSpan::translatedDefi
niteGridSpan(m_columnIndex, m_columnIndex + columnSpan))); | 217 std::unique_ptr<GridArea> result = wrapUnique(new GridArea(GridS
pan::translatedDefiniteGridSpan(m_rowIndex, m_rowIndex + rowSpan), GridSpan::tra
nslatedDefiniteGridSpan(m_columnIndex, m_columnIndex + columnSpan))); |
216 // Advance the iterator to avoid an infinite loop where we would
return the same grid area over and over. | 218 // Advance the iterator to avoid an infinite loop where we would
return the same grid area over and over. |
217 ++varyingTrackIndex; | 219 ++varyingTrackIndex; |
218 return result; | 220 return result; |
219 } | 221 } |
220 } | 222 } |
221 return nullptr; | 223 return nullptr; |
222 } | 224 } |
223 | 225 |
224 private: | 226 private: |
225 const GridRepresentation& m_grid; | 227 const GridRepresentation& m_grid; |
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
627 return usedBreadth; | 629 return usedBreadth; |
628 | 630 |
629 const Length& trackLength = gridLength.length(); | 631 const Length& trackLength = gridLength.length(); |
630 if (trackLength.isSpecified()) | 632 if (trackLength.isSpecified()) |
631 return valueForLength(trackLength, maxSize); | 633 return valueForLength(trackLength, maxSize); |
632 | 634 |
633 ASSERT(trackLength.isMinContent() || trackLength.isAuto() || trackLength.isM
axContent()); | 635 ASSERT(trackLength.isMinContent() || trackLength.isAuto() || trackLength.isM
axContent()); |
634 return LayoutUnit(infinity); | 636 return LayoutUnit(infinity); |
635 } | 637 } |
636 | 638 |
637 double LayoutGrid::computeFlexFactorUnitSize(const Vector<GridTrack>& tracks, Gr
idTrackSizingDirection direction, double flexFactorSum, LayoutUnit& leftOverSpac
e, const Vector<size_t, 8>& flexibleTracksIndexes, PassOwnPtr<TrackIndexSet> tra
cksToTreatAsInflexible) const | 639 double LayoutGrid::computeFlexFactorUnitSize(const Vector<GridTrack>& tracks, Gr
idTrackSizingDirection direction, double flexFactorSum, LayoutUnit& leftOverSpac
e, const Vector<size_t, 8>& flexibleTracksIndexes, std::unique_ptr<TrackIndexSet
> tracksToTreatAsInflexible) const |
638 { | 640 { |
639 // We want to avoid the effect of flex factors sum below 1 making the factor
unit size to grow exponentially. | 641 // We want to avoid the effect of flex factors sum below 1 making the factor
unit size to grow exponentially. |
640 double hypotheticalFactorUnitSize = leftOverSpace / std::max<double>(1, flex
FactorSum); | 642 double hypotheticalFactorUnitSize = leftOverSpace / std::max<double>(1, flex
FactorSum); |
641 | 643 |
642 // product of the hypothetical "flex factor unit" and any flexible track's "
flex factor" must be grater than such track's "base size". | 644 // product of the hypothetical "flex factor unit" and any flexible track's "
flex factor" must be grater than such track's "base size". |
643 OwnPtr<TrackIndexSet> additionalTracksToTreatAsInflexible = std::move(tracks
ToTreatAsInflexible); | 645 std::unique_ptr<TrackIndexSet> additionalTracksToTreatAsInflexible = std::mo
ve(tracksToTreatAsInflexible); |
644 bool validFlexFactorUnit = true; | 646 bool validFlexFactorUnit = true; |
645 for (auto index : flexibleTracksIndexes) { | 647 for (auto index : flexibleTracksIndexes) { |
646 if (additionalTracksToTreatAsInflexible && additionalTracksToTreatAsInfl
exible->contains(index)) | 648 if (additionalTracksToTreatAsInflexible && additionalTracksToTreatAsInfl
exible->contains(index)) |
647 continue; | 649 continue; |
648 LayoutUnit baseSize = tracks[index].baseSize(); | 650 LayoutUnit baseSize = tracks[index].baseSize(); |
649 double flexFactor = gridTrackSize(direction, index).maxTrackBreadth().fl
ex(); | 651 double flexFactor = gridTrackSize(direction, index).maxTrackBreadth().fl
ex(); |
650 // treating all such tracks as inflexible. | 652 // treating all such tracks as inflexible. |
651 if (baseSize > hypotheticalFactorUnitSize * flexFactor) { | 653 if (baseSize > hypotheticalFactorUnitSize * flexFactor) { |
652 leftOverSpace -= baseSize; | 654 leftOverSpace -= baseSize; |
653 flexFactorSum -= flexFactor; | 655 flexFactorSum -= flexFactor; |
654 if (!additionalTracksToTreatAsInflexible) | 656 if (!additionalTracksToTreatAsInflexible) |
655 additionalTracksToTreatAsInflexible = adoptPtr(new TrackIndexSet
()); | 657 additionalTracksToTreatAsInflexible = wrapUnique(new TrackIndexS
et()); |
656 additionalTracksToTreatAsInflexible->add(index); | 658 additionalTracksToTreatAsInflexible->add(index); |
657 validFlexFactorUnit = false; | 659 validFlexFactorUnit = false; |
658 } | 660 } |
659 } | 661 } |
660 if (!validFlexFactorUnit) | 662 if (!validFlexFactorUnit) |
661 return computeFlexFactorUnitSize(tracks, direction, flexFactorSum, leftO
verSpace, flexibleTracksIndexes, std::move(additionalTracksToTreatAsInflexible))
; | 663 return computeFlexFactorUnitSize(tracks, direction, flexFactorSum, leftO
verSpace, flexibleTracksIndexes, std::move(additionalTracksToTreatAsInflexible))
; |
662 return hypotheticalFactorUnitSize; | 664 return hypotheticalFactorUnitSize; |
663 } | 665 } |
664 | 666 |
665 double LayoutGrid::findFlexFactorUnitSize(const Vector<GridTrack>& tracks, const
GridSpan& tracksSpan, GridTrackSizingDirection direction, LayoutUnit leftOverSp
ace) const | 667 double LayoutGrid::findFlexFactorUnitSize(const Vector<GridTrack>& tracks, const
GridSpan& tracksSpan, GridTrackSizingDirection direction, LayoutUnit leftOverSp
ace) const |
(...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1406 size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(*
style(), *child, ForColumns); | 1408 size_t spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(*
style(), *child, ForColumns); |
1407 maximumColumnIndex = std::max(maximumColumnIndex, spanSize); | 1409 maximumColumnIndex = std::max(maximumColumnIndex, spanSize); |
1408 } | 1410 } |
1409 } | 1411 } |
1410 | 1412 |
1411 m_grid.grow(maximumRowIndex + abs(m_smallestRowStart)); | 1413 m_grid.grow(maximumRowIndex + abs(m_smallestRowStart)); |
1412 for (auto& column : m_grid) | 1414 for (auto& column : m_grid) |
1413 column.grow(maximumColumnIndex + abs(m_smallestColumnStart)); | 1415 column.grow(maximumColumnIndex + abs(m_smallestColumnStart)); |
1414 } | 1416 } |
1415 | 1417 |
1416 PassOwnPtr<GridArea> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOutsideG
rid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection, cons
t GridSpan& specifiedPositions) const | 1418 std::unique_ptr<GridArea> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOut
sideGrid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection,
const GridSpan& specifiedPositions) const |
1417 { | 1419 { |
1418 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ?
ForRows : ForColumns; | 1420 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ?
ForRows : ForColumns; |
1419 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn
Count() : gridRowCount(); | 1421 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn
Count() : gridRowCount(); |
1420 size_t crossDirectionSpanSize = GridPositionsResolver::spanSizeForAutoPlaced
Item(*style(), gridItem, crossDirection); | 1422 size_t crossDirectionSpanSize = GridPositionsResolver::spanSizeForAutoPlaced
Item(*style(), gridItem, crossDirection); |
1421 GridSpan crossDirectionPositions = GridSpan::translatedDefiniteGridSpan(endO
fCrossDirection, endOfCrossDirection + crossDirectionSpanSize); | 1423 GridSpan crossDirectionPositions = GridSpan::translatedDefiniteGridSpan(endO
fCrossDirection, endOfCrossDirection + crossDirectionSpanSize); |
1422 return adoptPtr(new GridArea(specifiedDirection == ForColumns ? crossDirecti
onPositions : specifiedPositions, specifiedDirection == ForColumns ? specifiedPo
sitions : crossDirectionPositions)); | 1424 return wrapUnique(new GridArea(specifiedDirection == ForColumns ? crossDirec
tionPositions : specifiedPositions, specifiedDirection == ForColumns ? specified
Positions : crossDirectionPositions)); |
1423 } | 1425 } |
1424 | 1426 |
1425 void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>& au
toGridItems) | 1427 void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>& au
toGridItems) |
1426 { | 1428 { |
1427 bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns; | 1429 bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns; |
1428 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); | 1430 bool isGridAutoFlowDense = style()->isGridAutoFlowAlgorithmDense(); |
1429 | 1431 |
1430 // Mapping between the major axis tracks (rows or columns) and the last auto
-placed item's position inserted on | 1432 // Mapping between the major axis tracks (rows or columns) and the last auto
-placed item's position inserted on |
1431 // that track. This is needed to implement "sparse" packing for items locked
to a given track. | 1433 // that track. This is needed to implement "sparse" packing for items locked
to a given track. |
1432 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo | 1434 // See http://dev.w3.org/csswg/css-grid/#auto-placement-algo |
1433 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe
roKeyHashTraits<unsigned>> minorAxisCursors; | 1435 HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZe
roKeyHashTraits<unsigned>> minorAxisCursors; |
1434 | 1436 |
1435 for (const auto& autoGridItem : autoGridItems) { | 1437 for (const auto& autoGridItem : autoGridItems) { |
1436 GridSpan majorAxisPositions = cachedGridSpan(*autoGridItem, autoPlacemen
tMajorAxisDirection()); | 1438 GridSpan majorAxisPositions = cachedGridSpan(*autoGridItem, autoPlacemen
tMajorAxisDirection()); |
1437 ASSERT(majorAxisPositions.isTranslatedDefinite()); | 1439 ASSERT(majorAxisPositions.isTranslatedDefinite()); |
1438 ASSERT(!cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection())
.isTranslatedDefinite()); | 1440 ASSERT(!cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection())
.isTranslatedDefinite()); |
1439 size_t minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedI
tem(*style(), *autoGridItem, autoPlacementMinorAxisDirection()); | 1441 size_t minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedI
tem(*style(), *autoGridItem, autoPlacementMinorAxisDirection()); |
1440 unsigned majorAxisInitialPosition = majorAxisPositions.startLine(); | 1442 unsigned majorAxisInitialPosition = majorAxisPositions.startLine(); |
1441 | 1443 |
1442 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx
isPositions.startLine(), isGridAutoFlowDense ? 0 : minorAxisCursors.get(majorAxi
sInitialPosition)); | 1444 GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAx
isPositions.startLine(), isGridAutoFlowDense ? 0 : minorAxisCursors.get(majorAxi
sInitialPosition)); |
1443 OwnPtr<GridArea> emptyGridArea = iterator.nextEmptyGridArea(majorAxisPos
itions.integerSpan(), minorAxisSpanSize); | 1445 std::unique_ptr<GridArea> emptyGridArea = iterator.nextEmptyGridArea(maj
orAxisPositions.integerSpan(), minorAxisSpanSize); |
1444 if (!emptyGridArea) | 1446 if (!emptyGridArea) |
1445 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*
autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions); | 1447 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*
autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions); |
1446 | 1448 |
1447 m_gridItemArea.set(autoGridItem, *emptyGridArea); | 1449 m_gridItemArea.set(autoGridItem, *emptyGridArea); |
1448 insertItemIntoGrid(*autoGridItem, *emptyGridArea); | 1450 insertItemIntoGrid(*autoGridItem, *emptyGridArea); |
1449 | 1451 |
1450 if (!isGridAutoFlowDense) | 1452 if (!isGridAutoFlowDense) |
1451 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyG
ridArea->rows.startLine() : emptyGridArea->columns.startLine()); | 1453 minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyG
ridArea->rows.startLine() : emptyGridArea->columns.startLine()); |
1452 } | 1454 } |
1453 } | 1455 } |
(...skipping 17 matching lines...) Expand all Loading... |
1471 void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<siz
e_t, size_t>& autoPlacementCursor) | 1473 void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<siz
e_t, size_t>& autoPlacementCursor) |
1472 { | 1474 { |
1473 GridSpan minorAxisPositions = cachedGridSpan(gridItem, autoPlacementMinorAxi
sDirection()); | 1475 GridSpan minorAxisPositions = cachedGridSpan(gridItem, autoPlacementMinorAxi
sDirection()); |
1474 ASSERT(!cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isTransl
atedDefinite()); | 1476 ASSERT(!cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isTransl
atedDefinite()); |
1475 size_t majorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(
*style(), gridItem, autoPlacementMajorAxisDirection()); | 1477 size_t majorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(
*style(), gridItem, autoPlacementMajorAxisDirection()); |
1476 | 1478 |
1477 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum
ns) ? gridColumnCount() : gridRowCount(); | 1479 const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColum
ns) ? gridColumnCount() : gridRowCount(); |
1478 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.second : autoPlacementCursor.first; | 1480 size_t majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.second : autoPlacementCursor.first; |
1479 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.first : autoPlacementCursor.second; | 1481 size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == F
orColumns ? autoPlacementCursor.first : autoPlacementCursor.second; |
1480 | 1482 |
1481 OwnPtr<GridArea> emptyGridArea; | 1483 std::unique_ptr<GridArea> emptyGridArea; |
1482 if (minorAxisPositions.isTranslatedDefinite()) { | 1484 if (minorAxisPositions.isTranslatedDefinite()) { |
1483 // Move to the next track in major axis if initial position in minor axi
s is before auto-placement cursor. | 1485 // Move to the next track in major axis if initial position in minor axi
s is before auto-placement cursor. |
1484 if (minorAxisPositions.startLine() < minorAxisAutoPlacementCursor) | 1486 if (minorAxisPositions.startLine() < minorAxisAutoPlacementCursor) |
1485 majorAxisAutoPlacementCursor++; | 1487 majorAxisAutoPlacementCursor++; |
1486 | 1488 |
1487 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { | 1489 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { |
1488 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min
orAxisPositions.startLine(), majorAxisAutoPlacementCursor); | 1490 GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), min
orAxisPositions.startLine(), majorAxisAutoPlacementCursor); |
1489 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.intege
rSpan(), majorAxisSpanSize); | 1491 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.intege
rSpan(), majorAxisSpanSize); |
1490 } | 1492 } |
1491 | 1493 |
(...skipping 759 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2251 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child, sizingData
)); | 2253 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child, sizingData
)); |
2252 } | 2254 } |
2253 | 2255 |
2254 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa
intOffset) const | 2256 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa
intOffset) const |
2255 { | 2257 { |
2256 if (!m_gridItemArea.isEmpty()) | 2258 if (!m_gridItemArea.isEmpty()) |
2257 GridPainter(*this).paintChildren(paintInfo, paintOffset); | 2259 GridPainter(*this).paintChildren(paintInfo, paintOffset); |
2258 } | 2260 } |
2259 | 2261 |
2260 } // namespace blink | 2262 } // namespace blink |
OLD | NEW |