On Thu, 17 Mar 2022 21:55:05 GMT, Phil Race <p...@openjdk.org> wrote:

>> Detect the situation where we do need to perform interpolation during 
>> ImageIcon
>> painting and set a hint to the rendering to perform bicubic approximation so
>> image details are preserved during transition.
>
> src/java.desktop/share/classes/javax/swing/ImageIcon.java line 463:
> 
>> 461:         if (hintChanged) {
>> 462:             ((Graphics2D) 
>> g).setRenderingHint(RenderingHints.KEY_INTERPOLATION,
>> 463:                     oldHint == null ? 
>> RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR : oldHint);
> 
> So this is one of only two hints which do not have an "_DEFAULT" value. I 
> don't know why it doesn't.
> 
> Not authoritative but the only place where we currently set this hint and 
> then restore it is here
> share/classes/javax/swing/plaf/nimbus/AbstractRegionPainter.java
>                 Object oldScaleingHints = 
> g.getRenderingHint(RenderingHints.KEY_INTERPOLATION);
>                 
> g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
>                 ImageScalingHelper.paint(g, 0, 0, w, h, img, insets, 
> dstInsets,
>                         ImageScalingHelper.PaintType.PAINT9_STRETCH, 
> ImageScalingHelper.PAINT_ALL);
>                 g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
>                     
> oldScaleingHints!=null?oldScaleingHints:RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
> 
> if the get() returns null and you aren't happy with that then creating a new 
> Graphics is the only alternative I see.
> 
> 
> But it seems to me there are bigger problems to resolve first
> 
>> Image variant = ((MultiResolutionImage) 
>> image).getResolutionVariant(this.width, this.height);
> 
> So getResolutionVariant wants image pixels, but I expect ImageIcon is sized 
> in user-space, isn't it ?
> 
> Don't you need to apply the scale from the Graphics ?
> 
> Next, if we have an exact match for what we want, why  do we need the hint ?
> 
> Next, as Sergey mentions, BICUBIC is expensive.
> Probably how  that should be used is to redraw the image into a cached image 
> that
> is dw= iw*sx and dh= iwh*sy where sx and sy are the graphics scale
> and that is the graphics on which you apply the hint and the graphics is 
> disposed and the restore issue vanishes
> 
> then you can just blit that resulting image so long as the cached dw x dy 
> isn't changed.
> 
> The MR is still useful for finding the best starting image

If I understand correctly, the problem occurs only when the image is scaled 
down. The test case renders 32×32 icon into 16×16 image.

So is the usage of bicubic interpolation need only when the image is scaled 
down?

-------------

PR: https://git.openjdk.java.net/jdk/pull/7805

Reply via email to