[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?
Thanks,
Jay
-----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
https://bugs.openjdk.java.net/browse/JDK-8148045
8148046 Investigate the case where MRI.getResolutionVariant() returns MultiResolutionImage
https://bugs.openjdk.java.net/browse/JDK-8148046
Thanks,
Alexandr.
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
>>> enderingHints[test_VALUE_RESOLUTION_VARIANT_BASE]
>>>
>>> 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
>>> KEY_RESOLUTION_VARIANT type.
>>>
>>> Thanks,
>>>
>>> Jay
>>>
>>
More information about the 2d-dev
mailing list