Hi, Martin.

I am not sure that the problem is in the implementation, probably the word
"origin" in the "Returns the x offset of the tile grid relative to the origin,"
should be clarified.

Is the "origin" refer the original bufferedimage or the sub-image.
Note the spec of the getSubimage():
     * The returned {@code BufferedImage} shares the same
     * data array as the original image.

So if origin is base image then implementation is correct, if the origin is
sub image then implementations should be fixed.

On 2/21/20 5:36 am, Martin Desruisseaux wrote:
Hello all

Implementation of getTileGridXOffset() and getTileGridXOffset() in 
BufferedImage seems in contradiction with specification. The RenderedImage 
specification said:

    Returns the X offset of the tile grid relative to the origin, i.e., the X 
coordinate of the upper-left pixel of tile (0, 0). (Note that tile (0, 0) may 
not actually exist.)

Since BufferedImage has only one tile, always at index (0,0), the (x,y) 
coordinates of the upper-left pixel of that tile should be the image (minX, 
minY), which is always (0,0) in a BufferedImage. Indeed 
BufferedImage.getTileGridXOffset() javadoc adds the following sentence:

    This is always zero.

But the BufferedImage implementation is:

    public int getTileGridXOffset() {
         return raster.getSampleModelTranslateX();
    }

Which does not always returns zero. It can be demonstrated by the following 
test case:

    import java.awt.Dimension;
    import java.awt.image.BufferedImage;

    class Test {
         public static void main(String[] args) throws Exception {
             BufferedImage img = new BufferedImage(100, 100, 
BufferedImage.TYPE_INT_ARGB);
             BufferedImage sub = img.getSubimage(10, 20, 50, 50);
             System.out.println(sub.getTileGridXOffset());
             System.out.println(sub.getTileGridYOffset());
         }
    }

Which prints -10 and -20.

Proposed fix: given that coordinates of BufferedImage == coordinates of tile 
(0,0) (this fact is hard-coded in BuffereImage.getMinTileX() returning the 
hard-coded 0 value, BuffereImage.getNumXTiles() returning the hard-coded 1 
value (same for Y), and in BufferedImage.getMinX(), getMinY(), getWidth() and 
getHeight() delegating to the Raster), applying the same logic we should have:

    public int getTileGridXOffset() {
         return raster.getMinX();
    }

    public int getTileGridXOffset() {
         return raster.getMinY();
    }

Even if raster.getMinX() / getMinY() should always return 0, those methods are 
invoked for consistency with current implementation of BufferedImage.getMinX() 
/ getMinY().

If above analysis is correct, do I need to provide a GitHub pull request or 
other submission mechanism?

     Regards,

         Martin




--
Best regards, Sergey.

Reply via email to