diff --git a/CHANGELOG.md b/CHANGELOG.md
index e4c92db6..6f34f97e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,13 @@
FlatLaf Change Log
==================
+## 3.5-SNAPSHOT
+
+#### Fixed bugs
+
+- Extras: `FlatSVGIcon` color filters now support linear gradients. (PR #817)
+
+
## 3.4
#### New features and improvements
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 fe6d3dfb..39843369 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
@@ -985,11 +985,12 @@ public class FlatSVGIcon
paint = filterColor( (Color) paint );
else if( paint instanceof LinearGradientPaint ) {
LinearGradientPaint oldPaint = (LinearGradientPaint) paint;
- paint = new LinearGradientPaint( oldPaint.getStartPoint(),
- oldPaint.getEndPoint(),
- oldPaint.getFractions(),
- filterColors( oldPaint.getColors() ),
- oldPaint.getCycleMethod() );
+ Color[] newColors = filterColors( oldPaint.getColors() );
+ if( newColors != null ) {
+ paint = new LinearGradientPaint( oldPaint.getStartPoint(), oldPaint.getEndPoint(),
+ oldPaint.getFractions(), newColors, oldPaint.getCycleMethod(),
+ oldPaint.getColorSpace(), oldPaint.getTransform() );
+ }
}
super.setPaint( paint );
}
@@ -1013,9 +1014,12 @@ public class FlatSVGIcon
private Color[] filterColors( Color[] colors ) {
Color[] newColors = new Color[colors.length];
- for( int i = 0; i < colors.length; i++ )
+ boolean changed = false;
+ for( int i = 0; i < colors.length; i++ ) {
newColors[i] = filterColor( colors[i] );
- return newColors;
+ changed = (changed || newColors[i] != colors[i]);
+ }
+ return changed ? newColors : null;
}
}
}
diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/extras/FlatExtrasTest.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/extras/FlatExtrasTest.java
index 143cf6cb..637e3392 100644
--- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/extras/FlatExtrasTest.java
+++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/extras/FlatExtrasTest.java
@@ -16,6 +16,7 @@
package com.formdev.flatlaf.testing.extras;
+import java.awt.*;
import javax.swing.*;
import com.formdev.flatlaf.extras.*;
import com.formdev.flatlaf.extras.components.*;
@@ -75,6 +76,12 @@ public class FlatExtrasTest
disabledTabbedPane2.setIconAt( 0, icon );
disabledTabbedPane2.setDisabledIconAt( 0, disabledIcon );
+ addJSVGIcon( "linearGradient.svg", 64, 128 );
+ addJSVGIcon( "stripes.svg", 128, 128 );
+ addJSVGIcon( "gradientText0.svg", 128, 128 );
+ addJSVGIcon( "gradientText1.svg", 128, 128 );
+ addJSVGIcon( "gradientText2.svg", 128, 128 );
+
disabledChanged();
}
@@ -82,6 +89,10 @@ public class FlatExtrasTest
svgIconsPanel.add( new JLabel( new FlatSVGIcon( "com/formdev/flatlaf/demo/extras/svg/" + name ) ) );
}
+ private void addJSVGIcon( String name, int width, int height ) {
+ gradientIconsPanel.add( new JLabel( new FlatSVGIcon( "com/formdev/flatlaf/testing/extras/jsvg/" + name, width, height ) ) );
+ }
+
private void triStateCheckBox1Changed() {
triStateLabel1.setText( triStateCheckBox1.getState().toString() );
}
@@ -104,6 +115,9 @@ public class FlatExtrasTest
disabledLabel2.setEnabled( enabled );
disabledButton2.setEnabled( enabled );
disabledTabbedPane2.setEnabledAt( 0, enabled );
+
+ for( Component c : gradientIconsPanel.getComponents() )
+ c.setEnabled( enabled );
}
@Override
@@ -141,6 +155,7 @@ public class FlatExtrasTest
disabledButton2 = new JButton();
disabledTabbedPane2 = new JTabbedPane();
label6 = new JLabel();
+ gradientIconsPanel = new JPanel();
//======== this ========
setLayout(new MigLayout(
@@ -156,6 +171,7 @@ public class FlatExtrasTest
"[]" +
"[]" +
"[]" +
+ "[]" +
"[]"));
//---- label1 ----
@@ -251,6 +267,12 @@ public class FlatExtrasTest
label6.setText("setIcon() and setDisabledIcon()");
label6.setEnabled(false);
add(label6, "cell 1 6 2 1,gapx 20");
+
+ //======== gradientIconsPanel ========
+ {
+ gradientIconsPanel.setLayout(new FlowLayout());
+ }
+ add(gradientIconsPanel, "cell 1 7 2 1");
// JFormDesigner - End of component initialization //GEN-END:initComponents
}
@@ -275,5 +297,6 @@ public class FlatExtrasTest
private JButton disabledButton2;
private JTabbedPane disabledTabbedPane2;
private JLabel label6;
+ private JPanel gradientIconsPanel;
// JFormDesigner - End of variables declaration //GEN-END:variables
}
diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/extras/FlatExtrasTest.jfd b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/extras/FlatExtrasTest.jfd
index 2853a30d..c91ae6d1 100644
--- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/extras/FlatExtrasTest.jfd
+++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/extras/FlatExtrasTest.jfd
@@ -1,4 +1,4 @@
-JFDML JFormDesigner: "7.0.3.1.342" Java: "15" encoding: "UTF-8"
+JFDML JFormDesigner: "8.2.0.0.331" Java: "21" encoding: "UTF-8"
new FormModel {
contentType: "form/swing"
@@ -6,7 +6,7 @@ new FormModel {
add( new FormContainer( "com.formdev.flatlaf.testing.FlatTestPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "ltr,insets dialog,hidemode 3"
"$columnConstraints": "[][][left]"
- "$rowConstraints": "[][][][][][][]"
+ "$rowConstraints": "[][][][][][][][]"
} ) {
name: "this"
add( new FormComponent( "javax.swing.JLabel" ) {
@@ -143,9 +143,14 @@ new FormModel {
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 6 2 1,gapx 20"
} )
+ add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
+ name: "gradientIconsPanel"
+ }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
+ "value": "cell 1 7 2 1"
+ } )
}, new FormLayoutConstraints( null ) {
"location": new java.awt.Point( 0, 0 )
- "size": new java.awt.Dimension( 595, 470 )
+ "size": new java.awt.Dimension( 645, 470 )
} )
}
}
diff --git a/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/extras/jsvg/LICENSE.txt b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/extras/jsvg/LICENSE.txt
new file mode 100644
index 00000000..ab0b9155
--- /dev/null
+++ b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/extras/jsvg/LICENSE.txt
@@ -0,0 +1,3 @@
+The SVG icons in this folder are from JSVG,
+which is licensed under the MIT License
+See: https://github.com/weisJ/jsvg
diff --git a/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/extras/jsvg/gradientText0.svg b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/extras/jsvg/gradientText0.svg
new file mode 100644
index 00000000..53abaff4
--- /dev/null
+++ b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/extras/jsvg/gradientText0.svg
@@ -0,0 +1,12 @@
+
diff --git a/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/extras/jsvg/gradientText1.svg b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/extras/jsvg/gradientText1.svg
new file mode 100644
index 00000000..5be7b4f0
--- /dev/null
+++ b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/extras/jsvg/gradientText1.svg
@@ -0,0 +1,14 @@
+
diff --git a/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/extras/jsvg/gradientText2.svg b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/extras/jsvg/gradientText2.svg
new file mode 100644
index 00000000..eabbcb30
--- /dev/null
+++ b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/extras/jsvg/gradientText2.svg
@@ -0,0 +1,14 @@
+
diff --git a/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/extras/jsvg/linearGradient.svg b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/extras/jsvg/linearGradient.svg
new file mode 100644
index 00000000..4859f7a9
--- /dev/null
+++ b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/extras/jsvg/linearGradient.svg
@@ -0,0 +1,23 @@
+
diff --git a/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/extras/jsvg/stripes.svg b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/extras/jsvg/stripes.svg
new file mode 100644
index 00000000..91fdad81
--- /dev/null
+++ b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/extras/jsvg/stripes.svg
@@ -0,0 +1,27 @@
+