I am commenting on your suggestion that I can determine which display the image will displayed on.
> On Jul 15, 2015, at 7:42 AM, Alexander Scherbatiy > <alexandr.scherba...@oracle.com> wrote: > > 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.scherba...@oracle.com <mailto:alexandr.scherba...@oracle.com> >>> <mailto:alexandr.scherba...@oracle.com >>> <mailto:alexandr.scherba...@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