<AWT Dev> [OpenJDK 2D-Dev] [8] Review request for 8011059 [macosx] Make JDK demos look perfect on retina displays

Jim Graham james.graham at oracle.com
Tue Nov 5 17:39:45 PST 2013


Why is getScaledInstance() being consulted here?  It seems a misuse of 
that method.

The method was designed to return a rescaled version of the same pixels 
that you would get if you examined the raw pixels.  You are overriding 
it to return a different image.  That does not fit in with the original 
intent of that method as I created it.

It is also causing implementation headaches (read reflection) in the 
SG2D code to try to use it that way.

The @2x mechanism should be based on different API.  I guess it would 
have to be internal-only for 8.0 and could be exposed to allow 
developers to call it and possibly to be a provider for it in JDK9...

			...jim

On 10/31/13 9:19 AM, Alexander Scherbatiy wrote:
>
>   Could you review the updated fix:
>     http://cr.openjdk.java.net/~alexsch/8011059/webrev.04/
>
>     The reflection is used to skip the Image.getScaledInstance() method
> call if it is not overridden by a user.
>
> On 10/29/2013 11:08 PM, Sergey Bylokhov wrote:
>> Hi, Alexander.
>> The fix looks fine to me in general. But there is at least one issue.
>> I build you fix and test it:
>>  - Consuming of cpu increased by 500 times Java2Demo on images tab.
>>  - FPS is dropped from 220(jdk8)/35(jdk7u40) to 15 in guimark2. Note
>> that jdk6 has the same FPS(15) on my system.
>
>     The main problem is that the Image.SCALE_DEFAULT hint is used to
> retrieve a scaled image from Image.getScaledInstance() method.
>     It always uses the ReplicateScaleFilter for images which
> getScaledInstance() method has not been overridden.
>     The ReplicateScaleFilter creates a lot of arrays and consumes the
> CPU during the image parsing.
>
>     The better fix would be to introduce the new Image.SCALE_CUSTOM hint
> which could be used to get a scaled image and does not use filters by
> default.
>     But it should be a separated bug with a new CCC request.
>
>    Thanks,
>    Alexandr.
>
>>
>> On 29.10.2013 20:45, Alexander Scherbatiy wrote:
>>>
>>>   Could you review the updated fix:
>>>     http://cr.openjdk.java.net/~alexsch/8011059/webrev.03
>>>
>>> On 10/28/2013 2:33 PM, Artem Ananiev wrote:
>>>> Hi, Alexander,
>>>>
>>>> a few comments:
>>>>
>>>> 1. SunGraphics2D.java:3076 - should isHiDPIImage() be used here?
>>>      The isHiDPIImage() method is used to check that the
>>> drawHiDPIImage should be called like:
>>>         if (isHiDPIImage(img)) {
>>>             return drawHiDPIImage(...);
>>>         }
>>>
>>>> 2. I'm not sure that the proposed getScaledImageName()
>>>> implementation in ScalableToolkitImage works perfectly for URLs like
>>>> this:
>>>>
>>>>   http://www.exampmle.com/dir/image
>>>>
>>>> In this case it will try to find 2x image here:
>>>>
>>>>   http://www.example@2x.com/dir/image
>>>>
>>>> which doesn't look correct.
>>>        Fixed. Only path part of a URL is converted to path2x.
>>>
>>>> 3. RenderingHints spec references Retina or non-Retina displays,
>>>> which should be removed.
>>>        Fixed.
>>>
>>>     - devScale is used instead of transform parsing in the
>>> drawHiDPIImage() method just to not have performance regression more
>>> than 2 times on HiDPI displays
>>>     - LWCToolkit.ScalableToolkitImage is made public for the fix
>>> 8024926 [macosx] AquaIcon HiDPI support.
>>>
>>>     Thanks,
>>>     Alexandr.
>>>
>>>>
>>>> Thanks,
>>>>
>>>> Artem
>>>>
>>>> On 10/25/2013 5:18 PM, Alexander Scherbatiy wrote:
>>>>>
>>>>>    Could you review the updated fix:
>>>>> http://cr.openjdk.java.net/~alexsch/8011059/webrev.02/
>>>>>
>>>>>    - Scaled image width and height are transformed according to the
>>>>> AffineTransform type.
>>>>>    - ToolkitImage subclass is used to hold @2x image instance.
>>>>>
>>>>>   Thanks,
>>>>>   Alexandr.
>>>>>
>>>>> On 10/23/2013 7:24 PM, Alexander Scherbatiy wrote:
>>>>>>
>>>>>>   Could you review the updated fix:
>>>>>> http://cr.openjdk.java.net/~alexsch/8011059/webrev.01/
>>>>>>
>>>>>>   The JCK failures has been resolved:
>>>>>>     - Some tests tries to draw an image with Integer.MAX_VALUE width
>>>>>> or height. Passing large values to image.getScaledImage(width,
>>>>>> height,
>>>>>> hints).
>>>>>>        leads that an Image filter is not able to create necessary
>>>>>> arrays.  The fix uses the original image if width or height are equal
>>>>>> to Integer.MAX_VALUE.
>>>>>>     - Using Image.SCALE_DEFAULT hint for the getScaledImage(width,
>>>>>> height, hints) method to get the high resolution image interferes
>>>>>> with
>>>>>>        JCK tests that expect that the scaled image by certain
>>>>>> algorithm is returned. This is fixed by invoking the
>>>>>> super.getScaledImage(width, height, hints)
>>>>>>        method in ToolkitImage in case if a high resolution image is
>>>>>> not set.
>>>>>>
>>>>>>     Thanks,
>>>>>>     Alexandr.
>>>>>>
>>>>>>
>>>>>>
>>>>>> On 10/22/2013 1:31 PM, Alexander Scherbatiy wrote:
>>>>>>>
>>>>>>> Hello,
>>>>>>>
>>>>>>> Could you review the fix:
>>>>>>>
>>>>>>>   bug: https://bugs.openjdk.java.net/browse/JDK-8011059
>>>>>>>   webrev: http://cr.openjdk.java.net/~alexsch/8011059/webrev.00
>>>>>>>
>>>>>>>   The IMAGE_SCALING rendering hint is added to the RenderingHints
>>>>>>> class.
>>>>>>>   Enabling the image scaling rendering hint forces the SunGraphics2D
>>>>>>> to use getScaledInstance(width, height, hints) method
>>>>>>>   from Image class with SCALE_DEFAULT hint.
>>>>>>>
>>>>>>>   By default the image scaling rendering hint is enabled on HiDPI
>>>>>>> display and disabled for standard displays.
>>>>>>>
>>>>>>>   User can override the getScaledInstance(width, height, hints)
>>>>>>> method and return necessary high resolution image
>>>>>>>   according to the given image width and height.
>>>>>>>
>>>>>>>   For example:
>>>>>>>   ---------------------
>>>>>>>         final Image highResolutionImage =
>>>>>>>                 new BufferedImage(2 * WIDTH, 2 * HEIGHT,
>>>>>>> BufferedImage.TYPE_INT_RGB);
>>>>>>>         Image image = new BufferedImage(WIDTH, HEIGHT,
>>>>>>> BufferedImage.TYPE_INT_RGB) {
>>>>>>>
>>>>>>>             @Override
>>>>>>>             public Image getScaledInstance(int width, int height,
>>>>>>> int
>>>>>>> hints) {
>>>>>>>                 if ((hints & Image.SCALE_DEFAULT) != 0) {
>>>>>>>                     return (width <= WIDTH && height <= HEIGHT)
>>>>>>>                             ? this : highResolutionImage;
>>>>>>>                 }
>>>>>>>                 return super.getScaledInstance(width, height,
>>>>>>> hints);
>>>>>>>             }
>>>>>>>         };
>>>>>>>   ---------------------
>>>>>>>
>>>>>>>   The LWCToolkit and ToolkitImage classes are patched to
>>>>>>> automatically get provided image at 2x.ext images on MacOSX.
>>>>>>>
>>>>>>>   There are no significant changes in the Java2D demo to make it
>>>>>>> look
>>>>>>> perfect on Retina displays.
>>>>>>>   It needs only to put necessary images with the @2x postfix and
>>>>>>> they
>>>>>>> will be automatically drawn.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Alexandr.
>>>>>>>
>>>>>>
>>>>>
>>>
>>
>>
>


More information about the awt-dev mailing list