[OpenJDK 2D-Dev] Relax pixelStride check inside PixelInterleavedSampleModel constructor?

Martin Desruisseaux martin.desruisseaux at geomatys.com
Mon Jul 5 13:43:03 UTC 2021


PixelInterleavedSampleModel constructor has the following argument check 
at line 100:

    if (pixelStride*w > scanlineStride) {
         throw new IllegalArgumentException("Pixel stride times width must be less than or equal to the scanline stride");

It seems to me that the following check would be more accurate:

    if (pixelStride*(w-1) + maxBandOff >= scanlineStride) {

Rational: consider a subsampling operation where a new 
PixelInterleavedSampleModel is created for an image with a subset of the 
pixels of the original image. This is an operation similar to the 
existing PixelInterleavedSampleModel.createSubsetModel(int[] bands) 
method, which allows to create a view without coyping the DataBuffer 
content. Consider the following subsampling factors:

    sourceXSubsampling = 5
    sourceYSubsampling = 1

Consider an image of size 16 × 3 pixels with a single band. In the 
illustration below, "X" and "-" are pixels from the source images and 
"X" are pixels retained in the subsampled image. Note that the last 
column of the source image is included in the subsampled image; it is 
important for this issue.


A subsampled image view can be created with a 
PixelInterleavedSampleModel having a pixel stride of 5, a width of 4 and 
everything else identical, in particular a scanline stride of 16. It 
works well in the general case. But for the case illustrated above, an 
IllegalArgumentException is thrown. It can be seen from the following 

    pixelStride*w > scanlineStride
               5*4 > 16
                20 > 16
                true -> IllegalArgumentException

Above condition is equivalent to requiring image to be like that:


Instead of:


The amended check proposed at the beginning of this email checks if 
there is enough room for storing the last sample value of a row, 
ignoring the remaining of pixel stride that are just skipped. The check 
in this case become:

    pixelStride*(w-1) + maxBandOff >= scanlineStride
    5*(4-1) + 0 >= 16
    15 >= 16
    false -> no exception thrown

I can create a pull request, but before spending time on it I would like 
to know if this is considered worth fixing?



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/2d-dev/attachments/20210705/ece6858a/attachment.htm>

More information about the 2d-dev mailing list