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