From 483dae9590697fdfcd3dc29b7734506866aa43ca Mon Sep 17 00:00:00 2001 From: Tom Quellenberg Date: Wed, 16 Mar 2022 12:00:13 +0100 Subject: [PATCH 1/2] Add x-offset to logos (draw problem in tables) --- .../ui/wizards/security/AttributesPage.java | 4 ++-- .../abuchen/portfolio/model/ImageManager.java | 8 ++++---- .../name/abuchen/portfolio/util/ImageUtil.java | 18 ++++++++++-------- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/wizards/security/AttributesPage.java b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/wizards/security/AttributesPage.java index b7b0ad1da4..8e463b4098 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/wizards/security/AttributesPage.java +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/wizards/security/AttributesPage.java @@ -179,7 +179,7 @@ else if (attribute.getType().getConverter() instanceof ImageConverter) preview.setText(previewPlaceholderText); ImageConverter conv = (ImageConverter) attribute.getType().getConverter(); - Image img = ImageUtil.toImage(conv.toString(attribute.getValue()), 16, 16); + Image img = ImageUtil.toImage(conv.toString(attribute.getValue()), 0, 16, 16); if (img != null) preview.setImage(img); @@ -206,7 +206,7 @@ public IStatus validate(Object value) return Status.OK_STATUS; } - Image img = ImageUtil.toImage(s, 16, 16); + Image img = ImageUtil.toImage(s, 0, 16, 16); updatePreview(img); return img == null ? Status.CANCEL_STATUS : Status.OK_STATUS; diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/model/ImageManager.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/model/ImageManager.java index f5e5b92770..e0c977fa9e 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/model/ImageManager.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/model/ImageManager.java @@ -23,10 +23,10 @@ private ImageManager() public Image getImage(Attributable target, AttributeType attr) { - return getImage(target, attr, 16, 16); + return getImage(target, attr, 1, 16, 16); } - public Image getImage(Attributable target, AttributeType attr, int width, int height) + public Image getImage(Attributable target, AttributeType attr, int xOffset, int width, int height) { if (target != null && target.getAttributes().exists(attr) && attr.getConverter() instanceof ImageConverter) { @@ -35,14 +35,14 @@ public Image getImage(Attributable target, AttributeType attr, int width, int he return null; String imgString = String.valueOf(imgObject); - String imgKey = imgString + width + height; + String imgKey = imgString + width + height + xOffset; synchronized (imageCache) { Image img = imageCache.getOrDefault(imgKey, null); if (img != null) return img; - img = ImageUtil.toImage(imgString, width, height); + img = ImageUtil.toImage(imgString, xOffset, width, height); if (img != null) { imageCache.put(imgKey, img); diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/util/ImageUtil.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/util/ImageUtil.java index d76384be43..b0f0104e0c 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/util/ImageUtil.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/util/ImageUtil.java @@ -27,11 +27,13 @@ private static class ZoomingImageDataProvider implements ImageDataProvider { private int logicalWidth; private int logicalHeight; + private int xOffset; private ImageData fullSize; private HashMap zoomLevels = new HashMap(); - public ZoomingImageDataProvider(byte[] data, int logicalWidth, int logicalHeight) + public ZoomingImageDataProvider(byte[] data, int xOffset, int logicalWidth, int logicalHeight) { + this.xOffset = xOffset; this.logicalWidth = logicalWidth; this.logicalHeight = logicalHeight; this.fullSize = ImageUtil.toImageData(data); @@ -47,7 +49,7 @@ public ImageData getImageData(int zoom) float scaleW = 1f / fullSize.width * logicalWidth * (zoom / 100f); float scaleH = 1f / fullSize.height * logicalHeight * (zoom / 100f); - imageData = ImageUtil.resize(fullSize, (int) (fullSize.width * scaleW), (int) (fullSize.height * scaleH), + imageData = ImageUtil.resize(fullSize, xOffset, (int) (fullSize.width * scaleW), (int) (fullSize.height * scaleH), false); zoomLevels.put(zoom, imageData); @@ -56,7 +58,7 @@ public ImageData getImageData(int zoom) } } - public static Image toImage(String value, int logicalWidth, int logicalHeight) + public static Image toImage(String value, int xOffset, int logicalWidth, int logicalHeight) { if (value == null || value.length() == 0) return null; @@ -73,7 +75,7 @@ public static Image toImage(String value, int logicalWidth, int logicalHeight) if (buff == null || buff.length == 0) return null; - return new Image(null, new ZoomingImageDataProvider(buff, logicalWidth, logicalHeight)); + return new Image(null, new ZoomingImageDataProvider(buff, xOffset, logicalWidth, logicalHeight)); } catch (Exception ex) { @@ -119,13 +121,13 @@ public static String loadAndPrepare(String filename, int maxWidth, int maxHeight if (imgData.width > maxWidth || imgData.height > maxHeight) { - imgData = ImageUtil.resize(imgData, maxWidth, maxHeight, true); + imgData = ImageUtil.resize(imgData, 0, maxWidth, maxHeight, true); data = ImageUtil.encode(imgData); } return BASE64PREFIX + Base64.getEncoder().encodeToString(data); } - private static ImageData resize(ImageData image, int maxWidth, int maxHeight, boolean preserveRatio) + private static ImageData resize(ImageData image, int xOffset, int maxWidth, int maxHeight, boolean preserveRatio) { if (image.width == maxWidth && image.height == maxHeight) return image; @@ -148,7 +150,7 @@ private static ImageData resize(ImageData image, int maxWidth, int maxHeight, bo if (posY + newHeight > imageHeight) newWidth = imageHeight - posY; - ImageData imageData = getTransparentImage(imageWidth, imageHeight); + ImageData imageData = getTransparentImage(imageWidth + xOffset, imageHeight); Image canvas = new Image(null, imageData); @@ -157,7 +159,7 @@ private static ImageData resize(ImageData image, int maxWidth, int maxHeight, bo gc.setInterpolation(SWT.HIGH); Image source = new Image(null, image); - gc.drawImage(source, 0, 0, image.width, image.height, posX, posY, newWidth, newHeight); + gc.drawImage(source, 0, 0, image.width, image.height, posX+xOffset, posY, newWidth, newHeight); gc.dispose(); source.dispose(); From 89527641c1fbcfebe14fb5cd666a33cf4f0fed13 Mon Sep 17 00:00:00 2001 From: Tom Quellenberg Date: Wed, 16 Mar 2022 13:48:32 +0100 Subject: [PATCH 2/2] Offset for logo only on Windows systems. --- .../src/name/abuchen/portfolio/model/ImageManager.java | 4 +++- .../src/name/abuchen/portfolio/util/ImageUtil.java | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/model/ImageManager.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/model/ImageManager.java index e0c977fa9e..c84ad325e5 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/model/ImageManager.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/model/ImageManager.java @@ -2,6 +2,7 @@ import java.util.HashMap; +import org.eclipse.core.runtime.Platform; import org.eclipse.swt.graphics.Image; import name.abuchen.portfolio.model.AttributeType.ImageConverter; @@ -23,7 +24,8 @@ private ImageManager() public Image getImage(Attributable target, AttributeType attr) { - return getImage(target, attr, 1, 16, 16); + int xOffset = Platform.OS_WIN32.equals(Platform.getOS()) ? 1 : 0; + return getImage(target, attr, xOffset, 16, 16); } public Image getImage(Attributable target, AttributeType attr, int xOffset, int width, int height) diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/util/ImageUtil.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/util/ImageUtil.java index b0f0104e0c..9c6f79ad45 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/util/ImageUtil.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/util/ImageUtil.java @@ -58,6 +58,14 @@ public ImageData getImageData(int zoom) } } + /** + * + * @param value + * @param xOffset Additional transparent offset. Width of the resulting image is (xOffset + maxWidth) + * @param logicalWidth + * @param logicalHeight + * @return + */ public static Image toImage(String value, int xOffset, int logicalWidth, int logicalHeight) { if (value == null || value.length() == 0)