[prev in list] [next in list] [prev in thread] [next in thread]
List: openjdk-2d-dev
Subject: Re: [OpenJDK 2D-Dev] Review request for JDK-8147413 : api/java_awt/Image/MultiResolutionImage/index.
From: Alexander Scherbatiy <alexandr.scherbatiy () oracle ! com>
Date: 2016-01-22 11:35:03
Message-ID: 56A213E7.8090903 () oracle ! com
[Download RAW message or body]
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\#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
> > >
> >
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic