[OpenJDK 2D-Dev] Review request for 8029339 Custom MultiResolution image support on HiDPI displays
Alexander Scherbatiy
alexandr.scherbatiy at oracle.com
Wed Aug 19 11:51:40 UTC 2015
Hello,
Could you review the updated fix:
http://cr.openjdk.java.net/~alexsch/8029339/webrev.12
Javadoc description is updated in some places and parameters checking
is added:
- @throws IllegalArgumentException tag is added for
MultiResolutionImage.getResolutionVariant(destImageWidth,destImageHeight) method
- Comment about nonempty return list is added for
MultiResolutionImage.getResolutionVariants() method
- BaseMultiResolutionImage class description is updated to mention
getResolutionVariant(destImageWidth, destImageHeight) method
- @throws IllegalArgumentException and NullPointerException tags are
added for BaseMultiResolutionImage constructors
- parameters checking is added for BaseMultiResolutionImage,
MultiResolutionCachedImage and MultiResolutionToolkitImage clases
- Exception message is updated for MRRHT.java, line 85
Thanks,
Alexandr.
On 7/29/2015 4:42 AM, Jim Graham wrote:
> Hi Alexandr,
>
> All of the new changes look good. Only one minor issue in a comment
> in the test:
>
> MRRHT.java, line 85: should be "is not based on rendered size" or
> something to that effect
> (No need for a new webrev to fix that print statement.)
>
> I have a separate question out to Phil on whether or not using sun.*
> classes like this in a java.* test is good practice, but the worst
> case answer for that question would be "or should the test be moved to
> a sun.* package"...
>
> One follow-on issue to file and think about - the use of
> getDefaultTransform() requires the construction of a brand new
> transform every time it is used. For the call to it from the SG2D
> constructor that is fine because that becomes our initial
> AffineTransform that we would have had to create anyway. But, if they
> set the DPI_FIT hint then we end up calling that method every time we
> are looking at an MR image. We should look for a way to cache that
> value, or use internal API that doesn't require a clone, or some other
> way to avoid that "on every drawImage call" object creation. Unless
> you have an obvious fix you want to do now, I don't think we need to
> hold up this push to get the new MR APIs out there...
>
> ...jim
>
> On 7/28/15 8:33 AM, Alexander Scherbatiy wrote:
>>
>> Hello Jim,
>>
>> Could you review the updated fix:
>> http://cr.openjdk.java.net/~alexsch/8029339/webrev.10/
>> - the suggested comments are updated
>> - the MultiResolutionRenderingHintsTest is updated to use custom
>> GraphicsConfiguration and SurfaceData
>>
>> On 7/23/2015 8:25 PM, Jim Graham wrote:
>>> Hi Alexandr,
>>>
>>> On 7/21/15 7:41 AM, Alexander Scherbatiy wrote:
>>>>
>>>> Hello Jim,
>>>>
>>>> Thank your for the review.
>>>>
>>>> Could you review the updated fix there the suggested comments are
>>>> updated:
>>>> http://cr.openjdk.java.net/~alexsch/8029339/webrev.09/
>>>
>>> Minor comments embedded below.
>>>
>>>> On 7/14/2015 2:36 AM, Jim Graham wrote:
>>>>> AbstractMRI - getGraphics() should include "getGraphics() not
>>>>> supported on Multi-Resolution Images" as the exception description
>>>>> text.
>>>
>>> AbstractMRI - the getGraphics() description string contains an
>>> embedded '\n' and an embedded '\"', are those typos?
>> Updated.
>>>
>>>>> BaseMRI - class comment - "The implementation will return the first
>>>>> ... satisfy the rendering request." Add another sentence right there
>>>>> "The last image in the array will be returned if no suitable image is
>>>>> found that is larger than the rendering request."
>>>
>>> BaseMRI - whoops, my bad. "that is larger than" should probably be
>>> "that is as large as" to match the <= comparison
>> Updated.
>>>
>>>>> SG2D.getResolutionVariant - using destRegionWH to calculate
>>>>> destImageWH can involve a lot of "do some math and then later have
>>>>> additional code undo it". Would it be faster to just compute
>>>>> destImageWH directly, as in:
>>>>>
>>>>> float destImageWidth, destImageHeight;
>>>>>
>>>>> if (BASE) {
>>>>> destImageWH = srcWH;
>>>>> } else if (DPI) {
>>>>> destImageWH = (float) abs(srcWH * devScale);
>>>>> } else {
>>>>> double destRegionWidth, destRegionHeight;
>>>>> if (type) {
>>>>> ...
>>>>> }
>>>>> destImageWH = (float) abs(srcWH * destRegionWH / swh);
>>>>> }
>>>>> Image rv = img.getRV(destImageWH);
>>>
>>> For the BASE and DPI_FIT cases shouldn't you use srcWidth,srcHeight
>>> instead of sw,sh? The sw,sh are affected by sub-image parameters, but
>>> srcWidth,srcHeight are literally the size of the original image, which
>>> is what you want to search the MRI for. The sw,sh should only be used
>>> to scale the srcWidth in the "else" clause - as in "srcWidth *
>>> destRegionWidth / sw".
>>
>> You are right. sw and sh are sizes of a region in the original
>> image. I have updated the fix to use srcWidth/Height.
>>
>>>
>>>>> Is there intent to have the default case be mapped to DPI_FIT for
>>>>> Windows?
>>>> I think yes.
>>>
>>> I didn't see where this was being done - is that a TBD follow-on fix
>>> or did I miss a default somewhere?
>> I think that it could be fixed with the updating WToolkit to load
>> high-resolution toolkit images in the same way as it is done in
>> LWCToolkit.
>> At least it can be filled as a separate issue.
>>
>>>
>>>>> MRRHTest - why not render to a BufferedImage and avoid Robot?
>>>>> Could it
>>>>> tap into internal APIs to create a BImg/compatibleImage with a given
>>>>> devScale?
>>>>
>>>> The DPI_FIT test includes case there a graphics transform is
>>>> identity but the device configuration transform has scale 2.
>>>> There should be a way to set scale for the device configuration
>>>> transform;
>>>
>>> Ah yes, DPI_FIT needs a default transform. Also, without a way to
>>> manually create a device with a transform, that means that DPI_FIT is
>>> only successfully tested if the tests are run on a HiDPI machine,
>>> right?
>>>
>>>>> MRRHTest - why allow up to delta=50 on the comparison?
>>>> It is just for monitors that are calibrated on Mac OS X and they
>>>> colors are different from that which was set. The test uses colors
>>>> which
>>>> have at least one color component differ by 255.
>>>
>>> Another issue that might go away if we could use BImg instead of robot.
>>>
>>>>> MRRHTest - since the scale factor comes from a dialog, we depend on
>>>>> running this on a HiDPI display to fully test the hints? Could using
>>>>> "scaled compatible images" allow testing this more definitively?
>>>>
>>>> Could you explain more what does it mean "scaled compatible
>>>> images"?
>>>
>>> I seem to recall that there is a mechanism in there to create
>>> backbuffer images for swing that record the fact that they are
>>> scaled. I forget how this is done, but I'm wondering if it could be
>>> used to run all of this test code in a simulated scale environment
>>> rather than using the actual configurations that AWT creates for the
>>> current system.
>>
>> I have updated the test to use custom GraphicsConfiguration and
>> SurfaceData. This allows to use custom scales both on the graphics
>> configuration and on graphics.
>>
>> Thanks,
>> Alexandr.
>>
>>>
>>> ...jim
>>
More information about the 2d-dev
mailing list