[OpenJDK 2D-Dev] <AWT Dev> [8] Review request for 8011059 [macosx] Make JDK demos look perfect on retina displays
Sergey Bylokhov
Sergey.Bylokhov at oracle.com
Wed Nov 27 03:12:25 PST 2013
Hello.
Probably we are in a point when it is necessary to stop and move out all
extensions to the separate bugs.
We should give a time to our sqe to test these changes.
Actually current version looks good to me.
On 26.11.2013 2:31, Jim Graham wrote:
>
>
> On 11/25/13 5:51 AM, Alexander Scherbatiy wrote:
>> On 11/23/2013 5:11 AM, Jim Graham wrote:
>>> Hi Alexander,
>>>
>>> If we are going to be advertising it as something that developers use
>>> in production code then we would need to file this via CCC. With the
>>> current implementation, any user that has their own ImageObservers
>>> must use this API and so it becomes not only public, at a time when
>>> there is a lockdown on new public API in 8.0, but it also means that
>>> we are tied to its implementation and we can't rely on "it was
>>> experimental and so we can change it at any point" - you can't say
>>> that about an API that is necessary to correctly use a touted feature.
>>
>> This issue has its own history. It has been already fixed for the
>> JDK 7u for the Java2D demo. It was decided to not bring new API for the
>> HiDPI support in the JDK 7.
>> It was suggested to using code like below to create a
>> ScalableImage.
>> ------------------------------
>> /**
>> * Class that loads and returns images according to
>> * scale factor of graphic device
>> *
>> * <pre> {@code
>> * Image image = new ScalableImage() {
>> *
>> * public Image createScaledImage(float scaleFactor) {
>> * return (scaleFactor <= 1) ? loadImage("image.png")
>> * : loadImage("image at 2x.png");
>> * }
>> *
>> * Image loadImage(String name){
>> * // load image
>> * }
>> * };}</pre>
>> */
>> ------------------------------
>>
>> It was based on the display scale factor. The scale factor should be
>> manually retrieved from the Graphics2D and was not a part of the public
>> API:
>> g2d.drawImage(scalbleImage.getScaledImage(scaleFactor),..).
>>
>> From that time it was clear that there should be 2 basic operations
>> for the HiDPI images support:
>> - retrieve an image with necessary resolution
>> - retrieve images with all resolutions
>>
>> The second one is useful when it is necessary to create one set of
>> images using the given one (for example, to draw a shape on all images).
>
> For now, these are just ToolkitImages and you can't draw on them, so
> this is moot for the case of @2x support in getImage().
>
>> The JDK 7 solution has been revisited for the JDK 8 and the neccesary
>> CCC request 8011059 has been created and approved.
>>
>> Both the JDK-8011059 issue description and the approved CCC request
>> says:
>> -----------------------
>> A user should have a unified way to provide high resolution images
>> that can be drawn on HIDPI displays according to the user provided
>> algorithm.
>> -----------------------
>
> We've implemented the Hint part of that solution, but the mechanism
> for creating custom multi-res images was not workable. I no longer sit
> as the client rep on the CCC or I would have pointed that out, my
> apologies.
>
>> The 8011059 fix consists of two parts:
>> - Provide a way for a custom image creation that holds images with
>> different resolutions
>> - Load @2x images on Mac OS X
>>
>> The first one of the fix can be used without the second. it is not
>> difficult to crate just a class which loads @2x images using the given
>> file path/url.
>
> If we support @2x transparently behind the scenes as we are doing now,
> who is the requester for the way to create a custom set of resolution
> variants? I think the most important customer-driven request was to
> support @2x for the Mac developers, wasn't it?
>
>> Now it is suggested to implement the given MultiResolutionImage
>> interface and override two methods:
>> - Image getResolutionVariant(int width, int height)
>> - List<Image> getResolutionVariants()
>>
>> An image with necessary resolution should be drawn automatically in
>> SunGraphics2D.
>>
>> What we need is to focus on the first part of the fix.
>> From this point of view it up to the user' code to load all or some
>> resolution variants by MediaTracker and using
>> Component.prepareImage/checkImage methods.
>
> This is all an interesting goal, but I'm not sure it is as high a
> priority if we support a convention (based on platform conventions)
> for high resolution variants behind the scenes. I do agree that we
> need something like this before too long, but I don't think it was
> workable to target the getScaledInstance() method as the mechanism to
> implement it. That was the only convention that was approved in that
> CCC request, so a more complete API based on another mechanism is not
> covered there.
>
> Also, Win8 has its own conventions as well which come into play on the
> new high resolution Surface tablets and we should consider those to
> guide the API we develop.
>
> All, in all, though, I think if we get @2x support in with no code
> changes needed for apps then we have taken care of the primary use
> case. We can probably even handle the Win8 conventions behind the
> scenes in an 8u release...
>
> ...jim
--
Best regards, Sergey.
More information about the macosx-port-dev
mailing list