[OpenJDK 2D-Dev] Review request for JDK-8147413 : api/java_awt/Image/MultiResolutionImage/index.html\#MultiResolutionRenderingHints[test_VALUE_RESOLUTION_VARIANT_BASE] started to fail

Jayathirth D V jayathirth.d.v at oracle.com
Mon Feb 1 09:04:07 UTC 2016

Hi Alex,

Since two separate bugs are created for the suggestions given by Jim.
And you are okay with the fix provided for the bug https://bugs.openjdk.java.net/browse/JDK-8147413 under webrev http://cr.openjdk.java.net/~jdv/8147413/webrev.00/ 

Can we push the fix into JDK9 after one more approval?


-----Original Message-----
From: Alexander Scherbatiy 
Sent: Friday, January 22, 2016 5:05 PM
To: Jim Graham; Phil Race; Jayathirth D V
Cc: 2d-dev at openjdk.java.net
Subject: Re: [OpenJDK 2D-Dev] Review request for JDK-8147413 : api/java_awt/Image/MultiResolutionImage/index.html\#MultiResolutionRenderingHints[test_VALUE_RESOLUTION_VARIANT_BASE] started to fail

I have created two separated issues on it:
   8148045 Handle null resolution variant in SunGraphics2D

   8148046 Investigate the case where MRI.getResolutionVariant() returns MultiResolutionImage


On 22/01/16 00:34, Jim Graham wrote:
> BASE essentially just means to draw the 1:1 image.  The problem is 
> that returning null is not the way to achieve that.  Returning null 
> means "MRI doesn't apply here, just use the original image", but in 
> the case of BASE we have to make sure it isn't an MRI first otherwise 
> the caller will get an exception.
> The change does achieve that since BASE handling is built in to the 
> helper getResolutionVariant() method in SG2D and so it should ask for 
> the 1:1 image, but if the getRV() helper method returns null then we 
> still return null from the drawHiDPIImage() method and that causes the 
> caller to use the original MRI in a normal-image pipeline.  There 
> should perhaps be an else clause for the "if (rV != img && rV != null) 
> { } else { ???; }". What that "???" is depends on why the helper 
> method returned the original image and/or a null, but it should not be 
> "return null;". (Also, there is no check if it returned another 
> different MRI. That should probably not be allowed, but we never state 
> that in the interface description...)
> The remaining question is why the helper method would return either 
> the original image or null.
> I don't think the helper method ever returns the original MRI 
> knowingly, but the MRI itself might do that.  That would then fall 
> under the "what to do if the MRI returns any sort of non-standard 
> image" case, and perhaps the exception is appropriate there?  We 
> should probably detect that, though, and throw a more obvious 
> exception (or recurse?). Recursion can get ugly, so perhaps a very 
> explicit error with a reasonable description would be better than 
> letting the DrawImage pipeline fail in various ways.
> The helper function can return null if the operation is a NOP (sxy1 ==
> sxy2 - i.e. an empty subimage rectangle), but that case should be 
> handled here and end up with returning ?true? which matches what many 
> of the drawImage() variants return when they detect a trivial NOP case.
> The helper function can also return null if the srcWidth/Height are 
> negative which would imply an uninitialized image.  I'm not sure what 
> to do there because normally an uninitialized image is tracked by the 
> DrawImage pipe and the observer is notified as the image data is 
> loaded, but we have no mechanism to do that with an MRI.  This case 
> may require more work, or something explicit in the MRI spec (what 
> happens when someone lazily loads an image with an @x2 variant now?).
> It also returns null if the return value from the MRI is a 
> ToolkitImage with an error - but I think that is wrong, it should just 
> return the ToolkitImage and let the caller send it to the DrawImage 
> pipeline to detect the error and respond in the appropriate manner.
> Or perhaps it should cause the drawHiDPIImage() method to return 
> whatever boolean is appropriate for an error to save time, but there 
> is no way to orchestrate that from the helper method since it can only 
> return a (non-MRI) image.  It's probably best to just return the 
> errored TKImage in that case...?
> The last way it can return null is if the MRI returned null from its
> getRV() method, but the interface doesn't discuss what that means.  I 
> suppose it might mean that all of the resolution variants are being 
> loaded asynchronously and none of them are available yet, but we are 
> then missing a mechanism to inform the observer of when the variants 
> are loaded.  (Is there a bugid for that?  I seem to recall having a 
> discussion about that missing mechanism in the past...?)
> So, I think the change made here is along the right track, but we have 
> a couple more holes to plug before we can consider this fixed...
>             ...jim
> On 1/20/2016 12:57 PM, Phil Race wrote:
>> It seems like the expectation was that BASE could be drawn by the old 
>> imaging path.
>> which would be lower overhead.
>> I think we should ask Alexandr what the intention was here and 
>> whether the code that handles the base image needs to be taught how 
>> to extract data from a MultiResolutionImage.
>> -phil.
>> On 01/20/2016 08:20 AM, Jayathirth D V wrote:
>>> Hi,
>>> __
>>> _Please review the following fix in JDK9:_
>>> Bug : https://bugs.openjdk.java.net/browse/JDK-8147413
>>> Webrev : http://cr.openjdk.java.net/~jdv/8147413/webrev.00/
>>> <http://cr.openjdk.java.net/%7Ejdv/8147413/webrev.00/>
>>> Issue : JCK testcase
>>> api/java_awt/Image/MultiResolutionImage/index.html\#MultiResolutionR
>>> is failing from b96 JDK9 build.
>>> Root cause : In getManager API of SurfaceManager.java we are trying 
>>> to typecast BaseMultiResolutionImage to BufferedImage and it is 
>>> causing ClassCastException and in turn IllegalArgumentException seen 
>>> in result of test case. It is happening because of change made in 
>>> JDK-8073320 <https://bugs.openjdk.java.net/browse/JDK-8073320> in 
>>> SunGraphics2D.java. In case of VALUE_RESOLUTION_VARIANT_BASE type we 
>>> are not trying to convert MultiResolutionImage to BufferedImage.
>>> Solution : Modify the condition present in drawHiDPIImage API to 
>>> convert all MultiResolutionImage to BufferedImage irrespective of 
>>> Thanks,
>>> Jay

More information about the 2d-dev mailing list