On Wed, 2 Apr 2025 12:25:52 GMT, Nikita Gubarkov <ngubar...@openjdk.org> wrote:
>> Or maybe we should modify the code that relies on the current size? >> >> Why does our code work fine when skipping the end of the scanline in cases >> where there is a gap, but it cannot skip the pixelStride when there is a gap >> as well? > >> why we can't use the first component instead of the last one > > We definitely cannot do that because of the band-interleaved case: imagine if > there are like 10000 bytes of red samples followed by another 10000 bytes of > green samples - with `pixelStride=1` and `scanlineStride=100` if we take the > first component offset (0), our calculated size would only fit the red > channel. > > In your calculations using "starting offset + pointer to the last pixel + > pixelStride", you assume only pixel-interleaved variant, but this calculation > would break with other interleaving modes. Actually, for pixel-interleaved > layout there is a simple commonly-used formula, like: `size = startingOffset > + scanlineStride * height`. But the problem is that we don't really know the > `startingOffset`, we only know offsets of the individual components, which > leads to the other issue... > >> the size is not necessarily aligned to pixelStride because scanlineStride >> may include a gap larger than pixelStride at the end. > > Good point, and because of the way `pixelStride` and `scanlineStride` are > formulated (offsets between same-band samples of the adjacent > pixels/scanlines), they don't tell us anything about the alignment. And > moreover, in the case of unused components, where our `bandOffsets` don't > fully fill the `pixelStride`, there is an ambiguity: > Consider `bandOffsets = {1, 2, 3}` and `pixelStride=4`, is that a `xRGB` > layout with `startingOffset=0`, or `RGBx` with `startingOffset=1`? The answer > is - we don't have enough info as far as I'm concerned... I see a way to deal with this problem though - we don't have to deal with the ambiguity, but just allocate enough memory to be on the safe side no matter the interpretation of the layout - with the example I provided earlier `bandOffsets = {1, 2, 3}` and `pixelStride=4`, just allocate 1 extra byte at the end to prevent out-of-bounds access in any case. ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/24111#discussion_r2024744939