[OpenJDK 2D-Dev] <AWT Dev> Review request for 8029339 Custom MultiResolution image support on HiDPI displays

Alexander Scherbatiy alexandr.scherbatiy at oracle.com
Wed Jul 15 14:42:10 UTC 2015


On 7/15/2015 5:09 PM, Alan Snyder wrote:
>
> It seems you are making an assumption that the code that creates the 
> image is somehow initiated from a paint method so that the display 
> scale factor can be obtained from the graphics context and used to 
> determine the required image resolution. That is not the scenario I am 
> concerned about.
>
    The information about screen devices are available from the 
GraphicsEnvironment.
    Something like:
   ----------------------
     public static void main(String[] args) {
         GraphicsEnvironment ge = 
GraphicsEnvironment.getLocalGraphicsEnvironment();
         for(GraphicsDevice device: ge.getScreenDevices()){
             for(GraphicsConfiguration config: device.getConfigurations()){
                 if(!config.getDefaultTransform().isIdentity()){
                     System.out.println("Start high-resolution image 
loading");
                 }
             }
         }
     }
   ----------------------

   Thanks,
   Alexandr.
>
>
> I am talking about what I would consider a common case: a program that 
> was written before the concept of HiDPI displays existed and is being 
> adapted to support HiDPI displays. In this case, because the image 
> creation is potentially a long running process, the program is written 
> to use a background thread to create the image. Once the image is 
> created, it is stored somewhere that can be accessed by a painting 
> method of a component. Prior to the image becoming available, the 
> component will paint some default background or perhaps paint a 
> default image.
>
> I do not want to rearchitect the program to support HiDPI displays. 
> Using the display scale information for the available displays, I 
> could create a multiresolution image in the background thread that 
> either contains multiple images for all available displays or contains 
> one image at the maximum required resolution of the available 
> displays. However, these solutions are non-optimal. Either images may 
> be created that will never be used or image scaling may be used to 
> reduce the resolution, which may result in a lower quality image.
>
> What I would like to do is create a multiresolution image that tells 
> my code what resolution image is needed and allows me to create that 
> image on a background thread. In additional to solving the HiDPI 
> problem optimally, this solution would support less common cases, such 
> as displays added to the system at run time and graphics contexts that 
> are scaled for some reason other than supporting a HiDPI display.
>
> I am assuming this capability already exists to support toolkit 
> images. It would be nice to make that capability available to 
> applications.
>
>   Alan
>
>
>> On Jul 15, 2015, at 4:07 AM, Alexander Scherbatiy 
>> <alexandr.scherbatiy at oracle.com 
>> <mailto:alexandr.scherbatiy at oracle.com>> wrote:
>>
>> On 7/14/2015 3:18 AM, Alan Snyder wrote:
>>> I have a concern about how custom multiresolution images are 
>>> supported based on a problem I ran into using the JDK 8 classes, 
>>> which are similar.
>>>
>>> The problem is that the selection of a variant image happens during 
>>> painting. That is a very bad time to actually try to render an 
>>> image, if one is in a situation where images of arbitrary resolution 
>>> can be produced by rendering.
>>>
>>> If I have code now that uses a background thread to create an image 
>>> in this manner, how can I support HiDPI displays? Creating a 
>>> multiresolution image defeats the purpose of using a background 
>>> thread if it defers rendering until paint time. It seems that the 
>>> best I can do is to guess what resolutions might be wanted and 
>>> generate them all in advance or, alternatively, generate the highest 
>>> resolution I expect to need, and have the graphics system scale it 
>>> down for lower resolutions when requested. Neither of these 
>>> alternatives is optimal.
>>   JDK 9 has the fix that includes the scale factor in the 
>> GraphicsConfiguration default transform: 
>> http://hg.openjdk.java.net/jdk9/client/jdk/rev/661136704d07
>>
>>   It is possible to iterate over all graphics devices, decide on 
>> which device the image is supposed to be rendered and generate an 
>> image resolution according to the scale factor from the device 
>> graphics configuration.
>>
>>  Thanks,
>>  Alexandr.
>>
>>>
>>> Although the Image class does allow images to be produced in the 
>>> background, that API is way too complex for use by an application, 
>>> and the supporting code for Toolkit images is not accessible.
>>>
>>> It would be nice to have a simple way to return an image that is 
>>> produced in the background. Something like Future<Image>?
>>>
>>>   Alan
>>>
>>
>




More information about the 2d-dev mailing list