mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2025-12-06 14:00:55 +03:00
FlatTitlePaneIcon: use getResolutionVariant(width, height) instead of getResolutionVariants() to allow creation of requested size on demand and to avoids creation of all resolution variants
Extras: `FlatSVGUtils.createWindowIconImages()` now returns a single multi-resolution image that creates requested image sizes on demand from SVG (issue #323)
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
|
||||
package com.formdev.flatlaf.extras;
|
||||
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Image;
|
||||
import java.awt.RenderingHints;
|
||||
@@ -23,8 +24,10 @@ import java.awt.image.BufferedImage;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import javax.swing.JWindow;
|
||||
import com.formdev.flatlaf.util.MultiResolutionImageSupport;
|
||||
import com.kitfox.svg.SVGCache;
|
||||
import com.kitfox.svg.SVGDiagram;
|
||||
import com.kitfox.svg.SVGException;
|
||||
@@ -40,22 +43,51 @@ public class FlatSVGUtils
|
||||
* Creates from the given SVG a list of icon images with different sizes that
|
||||
* can be used for windows headers. The SVG should have a size of 16x16,
|
||||
* otherwise it is scaled.
|
||||
* <p>
|
||||
* If running on Java 9 or later and multi-resolution image support is available,
|
||||
* then a single multi-resolution image is returned that creates images on demand
|
||||
* for requested sizes from SVG.
|
||||
* This has the advantage that only images for used sizes are created.
|
||||
* Also if unusual sizes are requested (e.g. 18x18), then they are created from SVG.
|
||||
*
|
||||
* @param svgName the name of the SVG resource (a '/'-separated path)
|
||||
* @return list of icon images with different sizes (16x16, 24x24, 32x32, 48x48 and 64x64)
|
||||
* @return list of icon images with different sizes (16x16, 20x20, 24x24, 28x28, 32x32, 48x48 and 64x64)
|
||||
* @throws RuntimeException if failed to load or render SVG file
|
||||
* @see JWindow#setIconImages(List)
|
||||
*/
|
||||
public static List<Image> createWindowIconImages( String svgName ) {
|
||||
SVGDiagram diagram = loadSVG( svgName );
|
||||
|
||||
return Arrays.asList(
|
||||
svg2image( diagram, 16, 16 ),
|
||||
svg2image( diagram, 24, 24 ),
|
||||
svg2image( diagram, 32, 32 ),
|
||||
svg2image( diagram, 48, 48 ),
|
||||
svg2image( diagram, 64, 64 )
|
||||
);
|
||||
if( MultiResolutionImageSupport.isAvailable() ) {
|
||||
// use a multi-resolution image that creates images on demand for requested sizes
|
||||
return Collections.singletonList( MultiResolutionImageSupport.create( 0,
|
||||
new Dimension[] {
|
||||
// Listing all these sizes here is actually not necessary because
|
||||
// any size is created on demand when
|
||||
// MultiResolutionImage.getResolutionVariant(double destImageWidth, double destImageHeight)
|
||||
// is invoked.
|
||||
// This sizes are only used by MultiResolutionImage.getResolutionVariants().
|
||||
new Dimension( 16, 16 ), // 100%
|
||||
new Dimension( 20, 20 ), // 125%
|
||||
new Dimension( 24, 24 ), // 150%
|
||||
new Dimension( 28, 28 ), // 175%
|
||||
new Dimension( 32, 32 ), // 200%
|
||||
new Dimension( 48, 48 ), // 300%
|
||||
new Dimension( 64, 64 ), // 400%
|
||||
}, dim -> {
|
||||
return svg2image( diagram, dim.width, dim.height );
|
||||
} ) );
|
||||
} else {
|
||||
return Arrays.asList(
|
||||
svg2image( diagram, 16, 16 ), // 100%
|
||||
svg2image( diagram, 20, 20 ), // 125%
|
||||
svg2image( diagram, 24, 24 ), // 150%
|
||||
svg2image( diagram, 28, 28 ), // 175%
|
||||
svg2image( diagram, 32, 32 ), // 200%
|
||||
svg2image( diagram, 48, 48 ), // 300%
|
||||
svg2image( diagram, 64, 64 ) // 400%
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user