[OpenJDK 2D-Dev] [9] Review request for 8152309 Seamless way of using image filters with multi-resolution images
Phil Race
philip.race at oracle.com
Tue Apr 19 20:08:04 UTC 2016
I've gone up and down the API (and most of the implementation)
ResolutionVariantItem is really only used in the public API in one place :-
ImageProducer defines :-
+ default List<ResolutionVariantItem<ImageProducer>> getResolutionVariantItems() {
+ return Arrays.asList(new ResolutionVariantItem<>(this, 1, 1));
The sort-of second place is that FilteredImageSource over-rides this.
The rest is the internal uses of the class (and its definition of course)
So do we need such a generic sounding API class for this one case, (or
are there other API-level uses?) and is there a different approach
which avoid the new class entirely ?
Assuming ResolutionVariantItem is the right name - and design - it
seems like it could use a bit more class javadoc, even if it is basically
a bag to hold a few things.
There are few formatting/typo things I noticed but no point in talking about
those until the rest is near conclusion.
-phil.
On 04/05/2016 07:30 AM, Alexander Scherbatiy wrote:
>
> Hello,
>
> Could you review the fix:
> bug: https://bugs.openjdk.java.net/browse/JDK-8152309
> webrev: http://cr.openjdk.java.net/~alexsch/8152309/webrev.00
>
>
> The purpose of the fix is to allow to apply an image filter for a
> multi-resolution image to get new multi-resolution image so the code
> below works without changes:
> ----------
> Image mrImage = getMultiResolutionImage();
> ImageProducer mriProducer = new
> FilteredImageSource(mrImage.getSource(), new CropImageFilter(x, y, w,
> h));
> Image filteredMRImage =
> Toolkit.getDefaultToolkit().createImage(mriProducer);
> ----------
>
>
> The Image producer needs to be updated to contain a set of
> resolution-variant image producers. It can be done introducing a new
> MultiResolution[Image]Producer interface. However, the
> FilteredImageSource which takes an original image producer as a
> constructor argument needs to be declared as
> MultiResolution[Image]Producer even for ordinary image producers.
> I chose to add the getRVProducers() method directly to the
> ImageProducer interface.
>
> The option to add a method which request a resolution variant producer
> for the given image size (getRVProducer(width, height) ) seems is not
> possible because the result multi-resolution image can be loaded by a
> MediaTracker which can load only finite number of resolution variants.
>
> Applying an image filter to resolution-variant producers requires to
> scale filters which use fixed image size (like CropImageFilter and
> ReplicateScaleFilter).
> There should be a way to get a scaled filter using the original one.
> The resolution variant image producer need to provide necessary scale
> factors for the used filter.
> To do that getScaledFilterInstance(scaleX, scaleY) method is added to
> the ImageFilter and public ResolutionVariantItem class which can hold
> image or image producer with associated scale factors is introduced.
>
> There is an interesting problem in SunGraphics2D where a
> multi-resolution image size is requested. To do that it is necessary
> to have an image observer which needs to redirect calls to the base
> image observer. The resolution variant observer needs to know scale
> factors to recalculate given [x, y, width, height] values. The scale
> factors are provided by toolkit multi-resolution image but for non
> toolkit multi-resolution images they need to be calculated dividing a
> rv-image size to base image size. It looks like a closed loop when to
> know scale factors it needs to get a rv-image size but for this it is
> necessary to use an image observer which requires scale factors.
> The current fix just divides rv-image size to base image size for non
> toolkit multi-resolution images to get scale factors .
>
> Thanks,
> Alexandr.
>
More information about the 2d-dev
mailing list