RFR: 8274939: Incorrect size of the pixel storage is used by the robot on macOS

Phil Race prr at openjdk.java.net
Thu Jan 27 18:49:32 UTC 2022


On Fri, 8 Oct 2021 10:23:13 GMT, Sergey Bylokhov <serb at openjdk.org> wrote:

> In JDK 9 the native code for the robot class was reworked to get an access to the HiDPI quality screenshots. So we allocate the data storage for the HiDPI quality and then request the best quality from the macOS.
> 
> It works fine if the user request the screenshot of some area, since we properly scale this area. Unfortunately it does not work well if the user request only one pixel, in this case we allocate the array of one element and does not multiply the size by the scale, so if the system scale is 2 then the macOS returns the 2x2 pixels, which does not fit properly to the array of one element. This can be checked by the Xcheck:jni option which produce fatal error in this case.
> 
> Solution is to allocate the storage of the proper size 1 * scale * 1 * scale

I get that getPixelColor() / getRGBPixel() takes only a coordinate but when looking at CRobotPeer it is far from obvious why there is this inconsistency.  If we can't make the shared code consistent - maybe add a scale parameter ? Then at least we should have some comments.
But why are X11 and Windows fine with no scale ?

X11:
    @Override
    public int getRGBPixel(int x, int y) {
        int[] pixelArray = new int[1];
        getRGBPixelsImpl(xgc, x, y, 1, 1, pixelArray, useGtk);
        return pixelArray[0];
    }

Windows :
    @Override
    public int getRGBPixel(int x, int y) {
         // See 7002846: that's ineffective, but works correctly with non-opaque windows
        return getRGBPixels(new Rectangle(x, y, 1, 1))[0];
    }

And in native what I was suggesting was a safeguard that would have detected this problem - which I still think would be a good idea.

BTW "usually this is 1x1 pixel on lowdpi and 4x4 on hidpi screen, actually macOS may return any size"

When might it return "any size" ?
My experiments show scale==2 no matter what scale I use in the macos Display settings for the built-in retina

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

PR: https://git.openjdk.java.net/jdk/pull/5864



More information about the client-libs-dev mailing list