X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=swt%2Forg.argeo.cms.swt%2Fsrc%2Forg%2Fargeo%2Fcms%2Fswt%2Fosgi%2FBundleSvgTheme.java;h=74de83e09ce895ce442e214ef64e5bb835163f9f;hb=9fd6762a7ac6bb5102dcd2c5a3bc876aa5c942c4;hp=e65f226e2bf8174119a229c2a51c275912ecda04;hpb=7b242851c0094d13cbaca5b68261ad92c873a59f;p=lgpl%2Fargeo-commons.git diff --git a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/osgi/BundleSvgTheme.java b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/osgi/BundleSvgTheme.java index e65f226e2..74de83e09 100644 --- a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/osgi/BundleSvgTheme.java +++ b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/osgi/BundleSvgTheme.java @@ -1,5 +1,6 @@ package org.argeo.cms.swt.osgi; +import java.awt.Color; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -9,6 +10,7 @@ import java.lang.System.Logger.Level; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import org.apache.batik.transcoder.TranscoderException; import org.apache.batik.transcoder.TranscoderInput; @@ -24,17 +26,29 @@ import org.osgi.framework.BundleContext; public class BundleSvgTheme extends BundleCmsSwtTheme { private final static Logger logger = System.getLogger(BundleSvgTheme.class.getName()); - private Map> imageCache = Collections.synchronizedMap(new HashMap<>()); + private Map> imageDataCache = Collections.synchronizedMap(new HashMap<>()); private Map transcoders = Collections.synchronizedMap(new HashMap<>()); + private final static String IMAGE_CACHE_KEY = BundleSvgTheme.class.getName() + ".imageCache"; + @Override public Image getIcon(String name, Integer preferredSize) { String path = "icons/types/svg/" + name + ".svg"; return createImageFromSvg(path, preferredSize); } + @SuppressWarnings("unchecked") protected Image createImageFromSvg(String path, Integer preferredSize) { + Display display = Display.getCurrent(); + Objects.requireNonNull(display, "Not a user interface thread"); + + Map> imageCache = (Map>) display + .getData(IMAGE_CACHE_KEY); + if (imageCache == null) + display.setData(IMAGE_CACHE_KEY, new HashMap>()); + imageCache = (Map>) display.getData(IMAGE_CACHE_KEY); + Image image = null; if (imageCache.containsKey(path)) { image = imageCache.get(path).get(preferredSize); @@ -42,7 +56,7 @@ public class BundleSvgTheme extends BundleCmsSwtTheme { if (image != null) return image; ImageData imageData = loadFromSvg(path, preferredSize); - image = new Image(Display.getDefault(), imageData); + image = new Image(display, imageData); if (!imageCache.containsKey(path)) imageCache.put(path, Collections.synchronizedMap(new HashMap<>())); imageCache.get(path).put(preferredSize, image); @@ -50,6 +64,12 @@ public class BundleSvgTheme extends BundleCmsSwtTheme { } protected ImageData loadFromSvg(String path, int size) { + ImageData imageData = null; + if (imageDataCache.containsKey(path)) + imageData = imageDataCache.get(path).get(size); + if (imageData != null) + return imageData; + ImageTranscoder transcoder = null; synchronized (this) { transcoder = transcoders.get(size); @@ -57,10 +77,10 @@ public class BundleSvgTheme extends BundleCmsSwtTheme { transcoder = new PNGTranscoder(); transcoder.addTranscodingHint(PNGTranscoder.KEY_WIDTH, (float) size); transcoder.addTranscodingHint(PNGTranscoder.KEY_HEIGHT, (float) size); + transcoder.addTranscodingHint(PNGTranscoder.KEY_BACKGROUND_COLOR, new Color(255, 255, 255, 0)); transcoders.put(size, transcoder); } } - ImageData imageData; try (InputStream in = getResourceAsStream(path); ByteArrayOutputStream out = new ByteArrayOutputStream();) { if (in == null) throw new IllegalArgumentException(path + " not found"); @@ -75,6 +95,11 @@ public class BundleSvgTheme extends BundleCmsSwtTheme { throw new RuntimeException("Cannot transcode SVG " + path, e); } + // cache it + if (!imageDataCache.containsKey(path)) + imageDataCache.put(path, Collections.synchronizedMap(new HashMap<>())); + imageDataCache.get(path).put(size, imageData); + return imageData; } @@ -90,16 +115,16 @@ public class BundleSvgTheme extends BundleCmsSwtTheme { // } } - @Override - public void destroy(BundleContext bundleContext, Map properties) { - Display display = Display.getDefault(); - if (display != null) - for (String path : imageCache.keySet()) { - for (Image image : imageCache.get(path).values()) { - display.syncExec(() -> image.dispose()); - } - } - super.destroy(bundleContext, properties); - } +// @Override +// public void destroy(BundleContext bundleContext, Map properties) { +// Display display = Display.getDefault(); +// if (display != null) +// for (String path : imageCache.keySet()) { +// for (Image image : imageCache.get(path).values()) { +// display.syncExec(() -> image.dispose()); +// } +// } +// super.destroy(bundleContext, properties); +// } }