[OpenJDK 2D-Dev] Review request for JDK-8147413 : api/java_awt/Image/MultiResolutionImage/index.html\#MultiResolutionRenderingHints[test_VALUE_RESOLUTION_VARIANT_BASE] started to fail
Jim Graham
james.graham at oracle.com
Thu Jan 21 20:34:51 UTC 2016
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\#MultiResolutionRenderingHints[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