From 638af4bcd773df18807ae9e95c2ed5a80517da56 Mon Sep 17 00:00:00 2001 From: DUDSS Date: Thu, 8 Apr 2021 13:45:17 +0200 Subject: [PATCH] Added an option to specify an RGBImageFilter to a FlatSVGIcon --- .../formdev/flatlaf/extras/FlatRGBFilter.java | 23 ++++++++++++++++ .../formdev/flatlaf/extras/FlatSVGIcon.java | 26 +++++++++++++++++-- 2 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/FlatRGBFilter.java diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/FlatRGBFilter.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/FlatRGBFilter.java new file mode 100644 index 00000000..83c1917c --- /dev/null +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/FlatRGBFilter.java @@ -0,0 +1,23 @@ +package com.formdev.flatlaf.extras; + +import java.awt.*; +import java.awt.image.RGBImageFilter; + +/** + * A simplified RGBImageFilter that presents individual rgba components as a Color object. + * Can be used to modify the color of a {@link FlatSVGIcon}- + */ +public abstract class FlatRGBFilter extends RGBImageFilter +{ + @Override + public int filterRGB(int x, int y, int rgb) { + return filterRGB(new Color(rgb)).getRGB(); + } + + /** + * @param c Original color + * @return Modified color + */ + public abstract Color filterRGB(Color c); +} + diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/FlatSVGIcon.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/FlatSVGIcon.java index ff7655b4..2951c8a3 100644 --- a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/FlatSVGIcon.java +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/FlatSVGIcon.java @@ -66,6 +66,8 @@ public class FlatSVGIcon private final boolean disabled; private final ClassLoader classLoader; + private RGBImageFilter userFilter = null; + private SVGDiagram diagram; private boolean dark; @@ -168,6 +170,19 @@ public class FlatSVGIcon this.disabled = disabled; } + /** + * Sets an RGBImageFilter to be used when painting the icon. + * For simple RGB modifications you can use the {@link FlatRGBFilter}. + * @param filter + */ + public void setFilter(RGBImageFilter filter) { + this.userFilter = filter; + } + + public RGBImageFilter getFilter() { + return userFilter; + } + /** * Creates a new icon with given width and height, which is derived from this icon. * @@ -303,7 +318,7 @@ public class FlatSVGIcon : GrayFilter.createDisabledIconFilter( dark ); } - Graphics2D g2 = new GraphicsFilter( (Graphics2D) g.create(), ColorFilter.getInstance(), grayFilter ); + Graphics2D g2 = new GraphicsFilter( (Graphics2D) g.create(), ColorFilter.getInstance(), grayFilter, this.userFilter ); try { FlatUIUtils.setRenderingHints( g2 ); @@ -457,11 +472,13 @@ public class FlatSVGIcon { private final ColorFilter colorFilter; private final RGBImageFilter grayFilter; + private final RGBImageFilter userFilter; - public GraphicsFilter( Graphics2D delegate, ColorFilter colorFilter, RGBImageFilter grayFilter ) { + public GraphicsFilter( Graphics2D delegate, ColorFilter colorFilter, RGBImageFilter grayFilter, RGBImageFilter userFilter) { super( delegate ); this.colorFilter = colorFilter; this.grayFilter = grayFilter; + this.userFilter = userFilter; } @Override @@ -477,6 +494,11 @@ public class FlatSVGIcon } private Color filterColor( Color color ) { + if( userFilter != null ) { + int oldRGB = color.getRGB(); + int newRGB = userFilter.filterRGB( 0, 0, oldRGB ); + color = (newRGB != oldRGB) ? new Color( newRGB, true ) : color; + } if( colorFilter != null ) color = colorFilter.filter( color ); if( grayFilter != null ) {