On Tue, 14 Oct 2025 16:17:49 GMT, Phil Race <[email protected]> wrote:

>>> Do you have a conformant sample implementation that we could consider ?
>> 
>> We already have an implementation of BandedSampleModel and buffers that 
>> store color components in separate bands (different arrays). Similarly, we 
>> can implement a new subclass of ComponentSampleModel that stores "x lines of 
>> the image per bank". 
>> And it should be possible to reuse an existed api of buffers like: 
>> https://github.com/openjdk/jdk/blob/4ca4485e9af10a49ca95710c4e26aa3895835d47/src/java.desktop/share/classes/java/awt/image/DataBufferInt.java#L254
>> 
>> Initially these images will the slowest loops, but we can add some new here 
>> and there.
>
> BandedSampleModel is not precluded by the current proposed wording, in fact 
> it is explicitly accommodated.
> 
> The spec. for BandedSampleModel has this as its first sentence :
> This class represents image data which is stored in a band interleaved 
> fashion and for which each sample of a pixel occupies one data element of the 
> DataBuffer
> 
> I had actually thought already about the way you suggest with splitting an 
> image so that different parts of it
> are in different data buffers. But that seems nearly impossible. There's too 
> many things in the spec. and
> implementation that would need revisision. I see no value in diluting the 
> wording to allow an impossibility.
> If we ever did that (unlikely) then revising these few words in the spec. 
> would be an insignificant part of it.
> 
> Essentially the proposed spec is saying is "array length imposes a hard 
> limit".
> 
> So I do not see any problem with the spec as proposed.

I see that none of the code path under this API uses BandedSampleModel.

We can continue to create DataBuffer to hold >Integer.MAX_VALUE and use it to 
create a Raster with BandedSampleModel and then create a BufferedImage out of 
it.


import java.awt.Transparency;
import java.awt.color.ColorSpace;
import java.awt.image.BandedSampleModel;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.ComponentColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;

public class BandedBufferedImage {
    public static void main (String[] args) {
        int width = 1;
        int height = Integer.MAX_VALUE - 5;
        int numBands = 3; // For RGB
        int dataType = DataBuffer.TYPE_BYTE; // 8-bit per band

        // Create arrays for bank indices and band offsets
        int[] bankIndices = new int[numBands];
        int[] bandOffsets = new int[numBands];
        for (int i = 0; i < numBands; i++) {
            bankIndices[i] = i; // Each band in its own bank
            bandOffsets[i] = 0; // Offset within each bank
        }

        BandedSampleModel sampleModel = new BandedSampleModel(
            dataType, width, height, width, bankIndices, bandOffsets
        );
        DataBuffer dataBuffer = new DataBufferByte(width * height, numBands);
        WritableRaster raster = Raster.createWritableRaster(sampleModel, 
dataBuffer, null);
        ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
        int[] bits = {8, 8, 8}; // 8 bits per color component (R, G, B)
        ColorModel colorModel = new ComponentColorModel(cs, bits, false, false, 
Transparency.OPAQUE, dataType);
        BufferedImage bufferedImage = new BufferedImage(colorModel, raster, 
false, null);
    }
}


So there are no restrictions on these values. Even if someone extends 
ComponentSampleModel and divides data into separate bands they can continue to 
do so.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/27640#discussion_r2473056310

Reply via email to