Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a7d0ab80 authored by Jean Chalard's avatar Jean Chalard
Browse files

Fix an off-by-one error.

These variables were meant to represent the (x,y) coordinate of the
last pixel of the grid, to avoid going one pixel too far. But the last
pixel of the grid, of course, has coord (width - 1, height - 1).

This bug only ever happens in a rare case because to reproduce,
it needs the right (resp. bottom) coordinate of the rightmost
(resp. bottommost) plus the threshold plus half the grid width
(resp. height) to be exactly the number of pixels of the grid,
which is pretty unlikely... unless there are more tiles in the
grid than pixels on the screen, in which case the grid width is
1 and this becomes likely.

This fixes the fencepost error and renames the variables to
clarify their meaning.

Bug: 10537485
Change-Id: Iecfe2c0f29ee17776ee2cceaa4b1db722276b1f3
parent 86780628
Loading
Loading
Loading
Loading
+5 −7
Original line number Diff line number Diff line
@@ -245,8 +245,8 @@ public class ProximityInfo {
        final int threshold = (int) (defaultWidth * SEARCH_DISTANCE);
        final int thresholdSquared = threshold * threshold;
        // Round-up so we don't have any pixels outside the grid
        final int fullGridWidth = mGridWidth * mCellWidth;
        final int fullGridHeight = mGridHeight * mCellHeight;
        final int lastPixelXCoordinate = mGridWidth * mCellWidth - 1;
        final int lastPixelYCoordinate = mGridHeight * mCellHeight - 1;

        // For large layouts, 'neighborsFlatBuffer' is about 80k of memory: gridSize is usually 512,
        // keycount is about 40 and a pointer to a Key is 4 bytes. This contains, for each cell,
@@ -329,22 +329,20 @@ y |---+---+---+---+-v-+-|-+---+---+---+---+---| | thresholdBase and get
            final int yMiddleOfTopCell = topPixelWithinThreshold - yDeltaToGrid + halfCellHeight;
            final int yStart = Math.max(halfCellHeight,
                    yMiddleOfTopCell + (yDeltaToGrid <= halfCellHeight ? 0 : mCellHeight));
            final int yEnd = Math.min(fullGridHeight, keyY + key.getHeight() + threshold);
            final int yEnd = Math.min(lastPixelYCoordinate, keyY + key.getHeight() + threshold);

            final int leftPixelWithinThreshold = keyX - threshold;
            final int xDeltaToGrid = leftPixelWithinThreshold % mCellWidth;
            final int xMiddleOfLeftCell = leftPixelWithinThreshold - xDeltaToGrid + halfCellWidth;
            final int xStart = Math.max(halfCellWidth,
                    xMiddleOfLeftCell + (xDeltaToGrid <= halfCellWidth ? 0 : mCellWidth));
            final int xEnd = Math.min(fullGridWidth, keyX + key.getWidth() + threshold);
            final int xEnd = Math.min(lastPixelXCoordinate, keyX + key.getWidth() + threshold);

            int baseIndexOfCurrentRow = (yStart / mCellHeight) * mGridWidth + (xStart / mCellWidth);
            for (int centerY = yStart; centerY <= yEnd; centerY += mCellHeight) {
                int index = baseIndexOfCurrentRow;
                for (int centerX = xStart; centerX <= xEnd; centerX += mCellWidth) {
                    // TODO: Remove "index < neighborCountPerCell.length" below.
                    if (index < neighborCountPerCell.length
                            && key.squaredDistanceToEdge(centerX, centerY) < thresholdSquared) {
                    if (key.squaredDistanceToEdge(centerX, centerY) < thresholdSquared) {
                        neighborsFlatBuffer[index * keyCount + neighborCountPerCell[index]] = key;
                        ++neighborCountPerCell[index];
                    }