Skip to content

Commit

Permalink
Prevent placeables index out of bounds
Browse files Browse the repository at this point in the history
  • Loading branch information
cheonjaeung committed Jul 15, 2023
1 parent 550a358 commit f6d9b43
Showing 1 changed file with 47 additions and 42 deletions.
89 changes: 47 additions & 42 deletions grid/src/commonMain/kotlin/io/woong/compose/grid/MeasureHelper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -80,33 +80,36 @@ internal class GridMeasureHelper(
var crossAxisPlacedSpace = 0
var crossAxisSpaceAfterLast: Int
for (c in 0 until crossAxisCount) {
val measurable = measurables[i]
val crossAxisMax = constraints.crossAxisMaxSize
val placeable = measurable.measure(
constraints = OrientationIndependentConstraints(
mainAxisMinSize = 0,
mainAxisMaxSize = if (mainAxisMax == Constraints.Infinity) {
Constraints.Infinity
} else {
mainAxisMax - mainAxisPlacedSpace
},
crossAxisMinSize = 0,
crossAxisMaxSize = if (crossAxisMax == Constraints.Infinity) {
Constraints.Infinity
} else {
crossAxisMax - crossAxisPlacedSpace
}
).toConstraints(orientation)
)
crossAxisSpaceAfterLast = min(
if (c == crossAxisCount - 1) 0 else crossAxisSpacingPx,
crossAxisMax - crossAxisPlacedSpace - placeable.crossAxisSize()
)
crossAxisPlacedSpace += placeable.crossAxisSize() + crossAxisSpaceAfterLast
placeableMainAxisSizeMax = max(placeableMainAxisSizeMax, placeable.mainAxisSize())
crossAxisTotalSize = max(crossAxisTotalSize, crossAxisPlacedSpace)
placeables[i] = placeable
i++
if (i < measurableCount) {
val measurable = measurables[i]
val crossAxisMax = constraints.crossAxisMaxSize
val placeable = measurable.measure(
constraints = OrientationIndependentConstraints(
mainAxisMinSize = 0,
mainAxisMaxSize = if (mainAxisMax == Constraints.Infinity) {
Constraints.Infinity
} else {
mainAxisMax - mainAxisPlacedSpace
},
crossAxisMinSize = 0,
crossAxisMaxSize = if (crossAxisMax == Constraints.Infinity) {
Constraints.Infinity
} else {
crossAxisMax - crossAxisPlacedSpace
},
).toConstraints(orientation)
)
crossAxisSpaceAfterLast = min(
if (c == crossAxisCount - 1) 0 else crossAxisSpacingPx,
crossAxisMax - crossAxisPlacedSpace - placeable.crossAxisSize()
)
crossAxisPlacedSpace += placeable.crossAxisSize() + crossAxisSpaceAfterLast
placeableMainAxisSizeMax =
max(placeableMainAxisSizeMax, placeable.mainAxisSize())
crossAxisTotalSize = max(crossAxisTotalSize, crossAxisPlacedSpace)
placeables[i] = placeable
i++
}
}
mainAxisSpaceAfterLast = min(
if (m == mainAxisCount - 1) 0 else mainAxisSpacingPx,
Expand Down Expand Up @@ -189,22 +192,24 @@ internal class GridMeasureHelper(
var i = 0
for (m in 0 until measureResult.mainAxisCount) {
for (c in 0 until measureResult.crossAxisCount) {
val placeable = placeables[i]
// Placeable must not null on this time.
placeable!!

if (orientation == LayoutOrientation.Horizontal) {
placeable.place(
x = positionResult.mainAxisPositions[m],
y = positionResult.crossAxisPositions[c],
)
} else {
placeable.place(
x = positionResult.crossAxisPositions[c],
y = positionResult.mainAxisPositions[m],
)
if (i < placeables.size) {
val placeable = placeables[i]
// Placeable must not null on this time.
placeable!!

if (orientation == LayoutOrientation.Horizontal) {
placeable.place(
x = positionResult.mainAxisPositions[m],
y = positionResult.crossAxisPositions[c],
)
} else {
placeable.place(
x = positionResult.crossAxisPositions[c],
y = positionResult.mainAxisPositions[m],
)
}
i++
}
i++
}
}
}
Expand Down

0 comments on commit f6d9b43

Please sign in to comment.