This is an automated email from the ASF dual-hosted git repository.

mattcasters pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hop.git


The following commit(s) were added to refs/heads/main by this push:
     new 7dfcf9ab43 Issue #8057 : Rasterize palette tree icons at the zoomed 
small-icon size (#8107)
7dfcf9ab43 is described below

commit 7dfcf9ab43d83cae234f8ca4a99251b3c54be559
Author: Matt Casters <[email protected]>
AuthorDate: Wed Aug 26 20:02:31 2026 +0200

    Issue #8057 : Rasterize palette tree icons at the zoomed small-icon size 
(#8107)
    
    Plugin icons in the transform/action palette were drawn at a raw 16x16
    while folder icons in the same SWT tree (and explorer file-type icons)
    used Hop's zoomed size. Windows then stretched the smaller bitmaps in
    the tree ImageList, which made them look pixelated.
---
 ui/src/main/java/org/apache/hop/ui/core/ConstUi.java       |  8 ++++++++
 .../main/java/org/apache/hop/ui/core/gui/GuiResource.java  | 12 +++++++++++-
 .../org/apache/hop/ui/hopgui/palette/GraphPaletteTree.java | 14 ++++++--------
 ui/src/test/java/org/apache/hop/ui/core/ConstUiTest.java   |  9 +++++++++
 4 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/ui/src/main/java/org/apache/hop/ui/core/ConstUi.java 
b/ui/src/main/java/org/apache/hop/ui/core/ConstUi.java
index 046e656c3a..e93598aaea 100644
--- a/ui/src/main/java/org/apache/hop/ui/core/ConstUi.java
+++ b/ui/src/main/java/org/apache/hop/ui/core/ConstUi.java
@@ -44,6 +44,14 @@ public class ConstUi {
 
   public static final int DOCUMENTATION_ICON_SIZE = 14;
 
+  /**
+   * Bitmap size of a logical icon at a Hop zoom factor. Same truncation as 
{@code
+   * GuiResource#getZoomedImaged} and explorer tree icons: {@code (int) 
(zoomFactor * logicalSize)}.
+   */
+  public static int zoomedIconSize(int logicalSize, double zoomFactor) {
+    return (int) (zoomFactor * logicalSize);
+  }
+
   /** Default checkbox width */
   public static final int CHECKBOX_WIDTH = 20;
 
diff --git a/ui/src/main/java/org/apache/hop/ui/core/gui/GuiResource.java 
b/ui/src/main/java/org/apache/hop/ui/core/gui/GuiResource.java
index f5f981df5a..7ed36b3d36 100644
--- a/ui/src/main/java/org/apache/hop/ui/core/gui/GuiResource.java
+++ b/ui/src/main/java/org/apache/hop/ui/core/gui/GuiResource.java
@@ -1224,7 +1224,17 @@ public class GuiResource {
   private Image getZoomedImaged(
       SwtUniversalImage universalImage, Device device, int width, int height) {
     return universalImage.getAsBitmapForSize(
-        device, (int) (zoomFactor * width), (int) (zoomFactor * height));
+        device,
+        ConstUi.zoomedIconSize(width, zoomFactor),
+        ConstUi.zoomedIconSize(height, zoomFactor));
+  }
+
+  /**
+   * Tree/toolbar-sized bitmap of {@code image}, scaled by the current zoom 
factor. Do not dispose
+   * the returned image; it is cached on the universal image.
+   */
+  public Image getSmallIcon(SwtUniversalImage image) {
+    return getZoomedImaged(image, display, ConstUi.SMALL_ICON_SIZE, 
ConstUi.SMALL_ICON_SIZE);
   }
 
   /**
diff --git 
a/ui/src/main/java/org/apache/hop/ui/hopgui/palette/GraphPaletteTree.java 
b/ui/src/main/java/org/apache/hop/ui/hopgui/palette/GraphPaletteTree.java
index 2510e98746..8c19587207 100644
--- a/ui/src/main/java/org/apache/hop/ui/hopgui/palette/GraphPaletteTree.java
+++ b/ui/src/main/java/org/apache/hop/ui/hopgui/palette/GraphPaletteTree.java
@@ -19,9 +19,9 @@ package org.apache.hop.ui.hopgui.palette;
 
 import java.util.List;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.hop.core.SwtUniversalImage;
 import org.apache.hop.core.gui.Point;
 import org.apache.hop.i18n.BaseMessages;
-import org.apache.hop.ui.core.ConstUi;
 import org.apache.hop.ui.core.PropsUi;
 import org.apache.hop.ui.core.bus.HopGuiEvents;
 import org.apache.hop.ui.core.gui.GuiResource;
@@ -428,14 +428,12 @@ public class GraphPaletteTree extends Composite {
   }
 
   private Image iconFor(Item item) {
-    int size = ConstUi.SMALL_ICON_SIZE;
     GuiResource images = GuiResource.getInstance();
-    if (host.getPaletteKind() == Kind.TRANSFORM) {
-      return images
-          .getSwtImageTransform(item.pluginId())
-          .getAsBitmapForSize(getDisplay(), size, size);
-    }
-    return 
images.getSwtImageAction(item.pluginId()).getAsBitmapForSize(getDisplay(), 
size, size);
+    SwtUniversalImage swtImage =
+        host.getPaletteKind() == Kind.TRANSFORM
+            ? images.getSwtImageTransform(item.pluginId())
+            : images.getSwtImageAction(item.pluginId());
+    return images.getSmallIcon(swtImage);
   }
 
   private void expandAll(boolean expanded) {
diff --git a/ui/src/test/java/org/apache/hop/ui/core/ConstUiTest.java 
b/ui/src/test/java/org/apache/hop/ui/core/ConstUiTest.java
index c8e85de1f2..763b55ec47 100644
--- a/ui/src/test/java/org/apache/hop/ui/core/ConstUiTest.java
+++ b/ui/src/test/java/org/apache/hop/ui/core/ConstUiTest.java
@@ -35,6 +35,15 @@ class ConstUiTest {
     assertEquals(Charset.availableCharsets().size() + 1, encodings.length);
   }
 
+  @Test
+  void zoomedIconSizeMatchesExplorerAndGuiResourceTruncation() {
+    assertEquals(16, ConstUi.zoomedIconSize(ConstUi.SMALL_ICON_SIZE, 1.0));
+    assertEquals(24, ConstUi.zoomedIconSize(ConstUi.SMALL_ICON_SIZE, 1.5));
+    assertEquals(32, ConstUi.zoomedIconSize(ConstUi.SMALL_ICON_SIZE, 2.0));
+    assertEquals(20, ConstUi.zoomedIconSize(ConstUi.SMALL_ICON_SIZE, 1.25));
+    assertEquals(21, ConstUi.zoomedIconSize(ConstUi.SMALL_ICON_SIZE, 1.333));
+  }
+
   @Test
   void encodingListContainsTheAvailableCharsets() {
     List<String> encodings = Arrays.asList(ConstUi.getEncodings());

Reply via email to