The fix looks good to me.

  Thanks,
  Alexandr.

On 2/10/2017 9:24 AM, Prem Balakrishnan wrote:

Hi Phil,

Sorry, I misinterpreted the example code.

Updated patch as suggested: http://cr.openjdk.java.net/~pkbalakr/8162959/webrev.11/ <http://cr.openjdk.java.net/%7Epkbalakr/8162959/webrev.11/>

I have raised CCC request for the same.

Regards,

Prem

*From:*Phil Race
*Sent:* Friday, February 10, 2017 1:54 AM
*To:* Prem Balakrishnan; Alexander Scherbatiy
*Cc:* Sergey Bylokhov; awt-dev@openjdk.java.net
*Subject:* Re: Review Request JDK:-8162959 [HiDPI] screenshot artifacts using AWT Robot

Your example here is  not what I wrote :-

443      *      Image nativeResImage;
444      *      Image baseResImage;
445 * MultiResolutionImage mrImage = robot.createMultiResolutionScreenCapture(frame.getBounds()); 446 * List<Image> resolutionVariants = mrImage.getResolutionVariants();
447      *      if (resolutionVariants.size() > 1) {
448      *          nativeResImage = resolutionVariants.get(1);
449      *      } else {
450      *          baseResImage = resolutionVariants.get(0);
451      *      } </pre>


The result of that example is that only one of

nativeResImage or baseResImage  is non-null and the developer then needs
to check again.
I defined only nativeResImage on purpose. If there is only one resolution
variant then it must be the nativeResImage .. so the way I coded it was
trying to show how you always get the unscaled result.
So I recommend updating it as I originally suggested.
Also please file the CCC today - the example part won't hold up that
since it is not spec. significant.
-phil.

On 02/09/2017 01:49 AM, Prem Balakrishnan wrote:

    Hi Phil,

    Thank you for the review.

    Updated patch:
    http://cr.openjdk.java.net/~pkbalakr/8162959/webrev.10/
    <http://cr.openjdk.java.net/%7Epkbalakr/8162959/webrev.10/>

    Regards,

    Prem

    *From:*Phil Race
    *Sent:* Thursday, February 09, 2017 1:59 AM
    *To:* Prem Balakrishnan; Alexander Scherbatiy
    *Cc:* Sergey Bylokhov; awt-dev@openjdk.java.net
    <mailto:awt-dev@openjdk.java.net>
    *Subject:* Re: Review Request JDK:-8162959 [HiDPI] screenshot
    artifacts using AWT Robot

    Two minor grammar issues in the javadoc

    This method should be used in case where there is a scaling transform

    ->

    This method can be used in case there is a scaling transform

    * For a high resolution display where there is scaling transform,

    ->

    * For a high resolution display where there is a scaling transform,


    Also I think we should show as an example in the javadoc how you
    would use it to get the hi-res image if you want it.
    Derived fom Alexander's off-list email :
            Image nativeResImage;
            MultiResolutionImage mrImage =
    robot.createMultiResolutionScreenCapture(frame.getBounds());
            List<Image> resolutionVariants =
    mrImage.getResolutionVariants();
            if (resolutionVariants.size() > 1) {
                nativeResImage = resolutionVariants.get(1);
            } else {
                nativeResImage = resolutionVariants.get(0);
            }

    -phil.

    On 02/08/2017 12:48 AM, Prem Balakrishnan wrote:

        Thank you Alex for the review.

        Updated patch:
        http://cr.openjdk.java.net/~pkbalakr/8162959/webrev.09/
        <http://cr.openjdk.java.net/%7Epkbalakr/8162959/webrev.09/>

        Regards,

        Prem

        *From:*Alexandr Scherbatiy
        *Sent:* Tuesday, February 07, 2017 10:54 PM
        *To:* Prem Balakrishnan; Philip Race
        *Cc:* Sergey Bylokhov; awt-dev@openjdk.java.net
        <mailto:awt-dev@openjdk.java.net>
        *Subject:* Re: Review Request JDK:-8162959 [HiDPI] screenshot
        artifacts using AWT Robot

        On 2/6/2017 1:19 PM, Prem Balakrishnan wrote:



        Hi Phil  and  Alex,

        Please review updated patch as per review comments.

        http://cr.openjdk.java.net/~pkbalakr/8162959/webrev.08/
        <http://cr.openjdk.java.net/%7Epkbalakr/8162959/webrev.08/>


          Just as a small optimization. The private method
        Robot.createCompatibleImage(...) can return an array of
        BufferedImage-s.
          The createScreenCapture(...) can return just an image from
        the zero index and the createMultiResolutionScreenCapture(...)
        returns BaseMultiResolutionImage(array of images).

          It is better if the public javadoc part is checked by a
        native speaker.

          Thanks,
          Alexandr.



        Multi-monitor scenario will be handled under JDK-8173972.

        https://bugs.openjdk.java.net/browse/JDK-8173972

        Regards,

        Prem

        *From:*Phil Race
        *Sent:* Tuesday, January 31, 2017 5:24 AM
        *To:* Prem Balakrishnan; Alexander Scherbatiy
        *Cc:* Sergey Bylokhov; awt-dev@openjdk.java.net
        <mailto:awt-dev@openjdk.java.net>
        *Subject:* Re: Review Request JDK:-8162959 [HiDPI] screenshot
        artifacts using AWT Robot

        I like

        3. createMultiresolutionScreenCapture(Rectangle rect);





        -phil.




        On 01/30/2017 01:11 AM, Prem Balakrishnan wrote:

            Hi Phil,

            Thank you for the review.

            >Is Robot only capable of a screen capture from the
            default screen ? I hope not.

            Robot.createScreenCapture() can be used to capture
            screenshots on Multi-Monitor as well.

            To capture screen on Multi-Monitor user should calculate
            the total width of multiple

             screens, based on the position of secondary monitor(i.e.,
            Right/Left) with respect to

            main monitor and pass it  to createScreenCapture() method.

            >So I would expect that where there are two screens with
            different DPI settings/transforms
            >the logic in here will be sensitive to the target screen.

            I tried with MacBookPro (macOS Sierra version 10.12 ,
            Retina ) by connecting a secondary monitor non-Retina display.

            keeping secondary monitor to the right/left of main
            display and targeted rectangle on each sides, expected
            results are obtained.

            The current patch addresses most common scenario of single
            HiDPI monitor setup and dual monitor (Hi-DPI, non-HiDPI)
            setup.

            As “Handling multi monitor setup with different DPI
            settings” requires additional effort to make it work on
            all platforms, I propose to fix it separately.

            >And what happens if the target rectangle overlaps the
            edge between two screens ?

            I tried this scenario with Mac connecting non-retina
            secondary monitor,  OS doesn’t allow user to place a
            window in between two screens.

            >The more significant API change is that the isHiDPI
            parameter is a misnomer.
            >It really means something else and I think what we should
            do is delete it
            >and change the method name to something else.

            Thank you for the Draft.

            From my point of view, I think we should maintain the
            method name “createScreenCapture()”, because two functions
            doing the same task

            should have the same name so that  method will have
            maximum proximal visibility i.e., developer will easily
            know that there exists two method variants to take
            screenshots.

            (At least the method name should start with create….);

            Some of the signatures  we can choose from:
            1. createScreenCapture(int x, int y, int width, int height);

            2. createScreenCapture(Point pt, Dimension d);

            3. createMultiresolutionScreenCapture(Rectangle rect);

            4. createMultiImageScreenCapture(Rectangle rect);

            Request your feedback on the same.

            Once we finalize the signature and behavior, I  shall
            update the patch and send it for review.

            Regards,

            Prem

            *From:*Philip Race
            *Sent:* Wednesday, January 25, 2017 11:44 PM
            *To:* Alexandr Scherbatiy
            *Cc:* Prem Balakrishnan; Sergey Bylokhov;
            awt-dev@openjdk.java.net <mailto:awt-dev@openjdk.java.net>
            *Subject:* Re: Review Request JDK:-8162959 [HiDPI]
            screenshot artifacts using AWT Robot

            I'd like to propose some revision to the API and also have
            a question about the implementation.

            The question about the implementation concerns this code :-

            465         AffineTransform tx = GraphicsEnvironment.

466 getLocalGraphicsEnvironment().getDefaultScreenDevice().

467 getDefaultConfiguration().getDefaultTransform();

            468         double uiScaleX = tx.getScaleX();

            469         double uiScaleY = tx.getScaleY();


            Is Robot only capable of a screen capture from the default
            screen ? I hope not.
            So I would expect that where there are two screens with
            different DPI settings/transforms
            the logic in here will be sensitive to the target screen.
            And what happens if the target rectangle overlaps the edge
            between two screens ?

            Regarding the API, I think that it needs to explain that
            it is "not 'hi dpi" per se,
            rather that it is the non-default transform that matters.

            Additionally the doc should properly link to the class
            names, not just write them
            as words.

            The more significant API change is that the isHiDPI
            parameter is a misnomer.
            It really means something else and I think what we should
            do is delete it
            and change the method name to something else.

            Here is my draft :
             /**
              * Creates an image containing pixels read from the screen.
              * This image does not include the mouse cursor.
              * This method should be used in case there is a scaling
            transform from
              * user space to screen (device) space.
              * Typically this means that the display is a high
            resolution screen,
              * although strictly it means any case in which there is
            such a transform.
              * Returns a {@link java.awt.image.BufferedImage} for a
            non-scaled display and
              * a {@link java.awt.image.MultiResolutionImage} where
            there is a scaling
              * transform.
              * <p>
              * The {@code MultiResolutionImage} will have two image
            variants:
              * <ul>
              * <li> Base Image with user specified size. This is
            scaled from the screen.
              * <li> Native device resolution image with device size
            pixels.
              * </ul>
              * @param   screenRect     Rect to capture in screen
            coordinates
              * @return  The captured image
              * @throws  IllegalArgumentException if {@code
            screenRect} width and height
              * are not greater than zero
              * @throws  SecurityException if {@code
            readDisplayPixels} permission
              * is not granted
              * @see     SecurityManager#checkPermission
              * @see     AWTPermission
              */

             public synchronized Image
            multiImageeScreenCapture(Rectangle screenRect);

            -phil.

            On 1/20/17, 3:20 AM, Alexandr Scherbatiy wrote:

            On 1/19/2017 3:57 PM, Prem Balakrishnan wrote:

                Hi Alex,

                Please review updated patch as per review comments.

                http://cr.openjdk.java.net/~pkbalakr/8162959/webrev.06/
                <http://cr.openjdk.java.net/%7Epkbalakr/8162959/webrev.06/>


                Automated test validates both Robot.getPixelColor()
                and output of Robot.createScreenCapture() API's.

                Jtreg and JCK tests passed on build with fix across
                all the platforms(Mac, Windows and Linux) without
                causing any regression.

            src/java.desktop/share/classes/java/awt/Robot.java
              > 421      * @param   isHiDPI     Indicates if HiDPI Display

              There should be mention that this argument value is
            ignored when a screenshot is taken on non-HiDPI display

              Thanks,
              Alexandr.






            Regards,

            Prem

            *From:*Alexandr Scherbatiy
            *Sent:* Thursday, January 12, 2017 2:39 PM
            *To:* Prem Balakrishnan; Sergey Bylokhov;
            awt-dev@openjdk.java.net
            <mailto:awt-dev@openjdk.java.net>; Philip Race
            *Subject:* Re: Review Request JDK:-8162959 [HiDPI]
            screenshot artifacts using AWT Robot


            > 421      * @param   isHiDPI     Indicates if HiDPI Display

              There should be mention that this argument value is
            ignored when a screenshot is taken on non-HiDPI display

            Please also check the the method Robot.getPixelColor(int
            x, int y) also correctly works on Mac OS X, Windows and
            Linux after the fix.

            Thanks,
            Alexandr.

            On 1/10/2017 11:54 AM, Prem Balakrishnan wrote:

                Hi Alex,

                Please review updated patch,

                http://cr.openjdk.java.net/~pkbalakr/8162959/webrev.05/
                <http://cr.openjdk.java.net/%7Epkbalakr/8162959/webrev.05/>

                updated imageOption to kCGWindowImageBestResolution
                 which returns Best Resolution Image while capturing
                screen using CGWindowListCreateImage() method.

                Regards,

                Prem

                *From:*Alexandr Scherbatiy
                *Sent:* Tuesday, January 10, 2017 1:08 AM
                *To:* Prem Balakrishnan; Sergey Bylokhov;
                awt-dev@openjdk.java.net
                <mailto:awt-dev@openjdk.java.net>; Philip Race
                *Subject:* Re: Review Request JDK:-8162959 [HiDPI]
                screenshot artifacts using AWT Robot


                  CGWindowListCreateImage() method which is used to
                capture a screenshot on Mac OS X by Robot has
                imageOption argument which can have value:
                kCGWindowImageBestResolution
                
https://developer.apple.com/reference/coregraphics/1666230-quartz_window_services/window_image_types?language=objc
                   "When capturing the window, return the best image
                resolution. The returned image size may be different
                than the screen size."

                  Could this option help to get a high-resolution
                CGImageRef on HiDPI display?

                  Thanks,
                  Alexandr.

                On 12/27/2016 12:14 PM, Prem Balakrishnan wrote:

                    Hi Alexander,

                    Please review updated patch,

                    http://cr.openjdk.java.net/~pkbalakr/8162959/webrev.04/
                    <http://cr.openjdk.java.net/%7Epkbalakr/8162959/webrev.04/>


                    I used  wrong bounds while creating images,
                    correct it in this patch.

                    Regards,

                    Prem

                    *From:*Alexander Scherbatiy
                    *Sent:* Wednesday, December 14, 2016 5:18 PM
                    *To:* Prem Balakrishnan; Sergey Bylokhov;
                    awt-dev@openjdk.java.net
                    <mailto:awt-dev@openjdk.java.net>; Philip Race
                    *Subject:* Re: Review Request JDK:-8162959 [HiDPI]
                    screenshot artifacts using AWT Robot

                    On 07/12/16 10:24, Prem Balakrishnan wrote:








                    Hi Alexander,

                    Please review updated patch as per review comments.

                    http://cr.openjdk.java.net/~pkbalakr/8162959/webrev.03/
                    <http://cr.openjdk.java.net/%7Epkbalakr/8162959/webrev.03/>

                      I used a simple app [1] to create a screenshot
                    of a frame on Mac OS X:
                            Rectangle rect = frame.getBounds();
                    rect.setLocation(frame.getLocationOnScreen());
                            BufferedImage img =
                    robot.createScreenCapture(rect);

                      It takes only bottom right quarter of the frame [2].

                      Is it possible to use some API that makes a
                    screenshot and returns an NSImage on Mac OS X?
                      In this case it would be possible to get a high
                    resolution representation from the NSImage and
                    return it in the same way as it is updated on
                    Windows and Linux.

                      [1]
                    
http://cr.openjdk.java.net/~alexsch/8162959/screenshot/RobotScreenshot.java
                    
<http://cr.openjdk.java.net/%7Ealexsch/8162959/screenshot/RobotScreenshot.java>
                      [2]
                    
http://cr.openjdk.java.net/~alexsch/8162959/screenshot/screenshot.png
                    
<http://cr.openjdk.java.net/%7Ealexsch/8162959/screenshot/screenshot.png>

                      Thanks,
                      Alexandr.








                    Regards,

                    Prem

                    *From:*Alexandr Scherbatiy
                    *Sent:* Monday, November 21, 2016 8:10 PM
                    *To:* Prem Balakrishnan; Sergey Bylokhov;
                    awt-dev@openjdk.java.net
                    <mailto:awt-dev@openjdk.java.net>; Phil Race
                    *Subject:* Re: Review Request JDK:-8162959 [HiDPI]
                    screenshot artifacts using AWT Robot

                    On 11/16/2016 8:46 AM, Prem Balakrishnan wrote:









                    Hi Alexander,

                    Please review update patch as per review comments.

                    http://cr.openjdk.java.net/~pkbalakr/8162959/webrev.02/
                    <http://cr.openjdk.java.net/%7Epkbalakr/8162959/webrev.02/>

                    With this patch,
                    Robot.createScreenCapture(Rectangle) method
                    returns a scaled down image on the HiDPI display.


                    - The native part on Mac OS X and Linux should be
                    updated as well.

                    - 416      * Returns BufferedImage for Non-HiDPI
                    display and MultiResolutionImage
                      417      * for HiDPI display with two resolution
                    variants.

                    There should be added an explanation what is the
                    content of the first and the second resolution
                    variant.

                    Thanks,
                    Alexandr.










                    Regards,

                    Prem

                    *From:*Alexandr Scherbatiy
                    *Sent:* Thursday, November 03, 2016 4:05 PM
                    *To:* Prem Balakrishnan; Sergey Bylokhov;
                    awt-dev@openjdk.java.net
                    <mailto:awt-dev@openjdk.java.net>
                    *Subject:* Re: Review Request JDK:-8162959 [HiDPI]
                    screenshot artifacts using AWT Robot

                    On 11/2/2016 1:57 PM, Prem Balakrishnan wrote:










                    Hi Alexander,

                    Please review updated patch.

                    http://cr.openjdk.java.net/~pkbalakr/8162959/webrev.01/
                    <http://cr.openjdk.java.net/%7Epkbalakr/8162959/webrev.01/>

                    Added a new public API “*Image
                    createHiDPIScreenCapture(Rectangle screenRect)”.*

                    Returns an ordinary screenshot(BufferedImage) if
                    the UI scale is 1.

                    Returns MultiResolutionImage for HiDPI display
                    with two resolution variants,

                    1.Low Resolution/base image with user input width
                    and height,  I have used interpolation algorithm
                    for scaling , adapted from JavaFX Robot
                    
(http://hg.openjdk.java.net/openjfx/9-dev/rt/rev/89a5de54b7dc),

                    2.High Resolution image with scaled width and height .

                    - Please, check that the
                    Robot.createScreenCapture(Rectangle) method
                    returns a scaled down image on the HiDPI display
                      - Probably existing Java methods can be used for
                    an image scaling.
                      For example, there is the
                    Image.getScaledInstance(int width, int height, int
                    hints) method.
                      Or may be it is better just to create an image
                    with required size and draw the high-resolution
                    image into it using a specific scale and rendering
                    hints.

                      Thanks,
                      Alexandr.











                    Regards,

                    Prem

                    *From:*Alexander Scherbatiy
                    *Sent:* Thursday, October 13, 2016 3:21 PM
                    *To:* Prem Balakrishnan; Sergey Bylokhov;
                    awt-dev@openjdk.java.net
                    <mailto:awt-dev@openjdk.java.net>
                    *Subject:* Re: Review Request JDK:-8162959 [HiDPI]
                    screenshot artifacts using AWT Robot

                    On 06/10/16 15:28, Prem Balakrishnan wrote:

                        Hi*,*

                        **

                        Please review fix for JDK 9,

                        *Bug:*https://bugs.openjdk.java.net/browse/JDK-8162959


                        
*Webrev:*http://cr.openjdk.java.net/~pkbalakr/8162959/webrev.00/
                        
<http://cr.openjdk.java.net/%7Epkbalakr/8162959/webrev.00/>


                        I have adapted the same fix as used for JavaFX
                        Robot

                        *Bug: *JDK-8162783
                        <https://bugs.openjdk.java.net/browse/JDK-8162783>.

                        *Patch:
                        
*http://hg.openjdk.java.net/openjfx/9-dev/rt/rev/89a5de54b7dc

                        New Public API ” BufferedImage
                        createScreenCapture(Rectangle screenRect,
                        boolean isHiDPI)”is added,

                        Which will have a parameter to specify if HiDPI.

                    It is better to a add public method which returns
                    MultiResolution image on HiDPI display and
                    consists of two resoltion variants
                       - base image which has size requested by a user
                       - high-resolution image which creates an
                    original screen capture

                      The proposed by your algorithm can be applied to
                    the base image.
                      For more details see JDK-8020618 [macosx]
                    java.awt.Robot makes blurry screen captures on Retina

                      Thanks,
                      Alexandr.











                    Regards,

                    Prem


Reply via email to