This is an automated email from the ASF dual-hosted git repository. pmouawad pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/jmeter.git
The following commit(s) were added to refs/heads/master by this push: new fc334b0 Ensure all used fonts support fallback fonts by using methods that preserve the underlying Font2D handle. (#618) fc334b0 is described below commit fc334b0426b48a1ee86015a1fba52d274c479f54 Author: Jannis Weis <31143295+we...@users.noreply.github.com> AuthorDate: Wed Oct 7 13:51:06 2020 +0200 Ensure all used fonts support fallback fonts by using methods that preserve the underlying Font2D handle. (#618) Ensure fallback enabled fonts are used --- .../org/apache/jmeter/visualizers/AxisGraph.java | 3 +- .../jmeter/visualizers/MailerVisualizer.java | 3 +- .../visualizers/RespTimeGraphVisualizer.java | 8 +++-- .../jmeter/visualizers/StatGraphVisualizer.java | 12 +++++--- .../apache/jmeter/gui/util/JSyntaxTextArea.java | 2 +- .../org/apache/jorphan/gui/JMeterUIDefaults.java | 34 ++++++++++++++++++++-- .../protocol/http/config/gui/UrlConfigGui.java | 6 ---- 7 files changed, 50 insertions(+), 18 deletions(-) diff --git a/src/components/src/main/java/org/apache/jmeter/visualizers/AxisGraph.java b/src/components/src/main/java/org/apache/jmeter/visualizers/AxisGraph.java index 14ffcbc..3de8a94 100644 --- a/src/components/src/main/java/org/apache/jmeter/visualizers/AxisGraph.java +++ b/src/components/src/main/java/org/apache/jmeter/visualizers/AxisGraph.java @@ -30,6 +30,7 @@ import javax.swing.JPanel; import javax.swing.UIManager; import org.apache.jmeter.util.JMeterUtils; +import org.apache.jorphan.gui.JMeterUIDefaults; import org.jCharts.axisChart.AxisChart; import org.jCharts.axisChart.customRenderers.axisValue.renderers.ValueLabelPosition; import org.jCharts.axisChart.customRenderers.axisValue.renderers.ValueLabelRenderer; @@ -82,7 +83,7 @@ public class AxisGraph extends JPanel { private static final Font FONT_DEFAULT = UIManager.getDefaults().getFont("TextField.font"); - protected Font valueFont = new Font("SansSerif", Font.PLAIN, (int) Math.round(FONT_DEFAULT.getSize() * 0.6)); + protected Font valueFont = JMeterUIDefaults.createFont("SansSerif", Font.PLAIN, (int) Math.round(FONT_DEFAULT.getSize() * 0.6)); protected Color[] color = { Color.YELLOW }; diff --git a/src/components/src/main/java/org/apache/jmeter/visualizers/MailerVisualizer.java b/src/components/src/main/java/org/apache/jmeter/visualizers/MailerVisualizer.java index b24ea2b..aaaa058 100644 --- a/src/components/src/main/java/org/apache/jmeter/visualizers/MailerVisualizer.java +++ b/src/components/src/main/java/org/apache/jmeter/visualizers/MailerVisualizer.java @@ -49,6 +49,7 @@ import org.apache.jmeter.samplers.SampleResult; import org.apache.jmeter.testelement.TestElement; import org.apache.jmeter.util.JMeterUtils; import org.apache.jmeter.visualizers.gui.AbstractVisualizer; +import org.apache.jorphan.gui.JMeterUIDefaults; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -283,7 +284,7 @@ public class MailerVisualizer extends AbstractVisualizer implements ActionListen MailerModel.MailAuthType.NONE.toString(), MailerModel.MailAuthType.SSL.toString(), MailerModel.MailAuthType.TLS.toString()}); - authTypeCombo.setFont(new Font("SansSerif", Font.PLAIN, 10)); // $NON-NLS-1$ + authTypeCombo.setFont(JMeterUIDefaults.createFont("SansSerif", Font.PLAIN, 10)); // $NON-NLS-1$ authTypePane.add(authTypeCombo, BorderLayout.CENTER); JPanel credPane = new JPanel(new BorderLayout()); diff --git a/src/components/src/main/java/org/apache/jmeter/visualizers/RespTimeGraphVisualizer.java b/src/components/src/main/java/org/apache/jmeter/visualizers/RespTimeGraphVisualizer.java index 234c96f..59ad93f 100644 --- a/src/components/src/main/java/org/apache/jmeter/visualizers/RespTimeGraphVisualizer.java +++ b/src/components/src/main/java/org/apache/jmeter/visualizers/RespTimeGraphVisualizer.java @@ -21,7 +21,6 @@ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; -import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.SimpleDateFormat; @@ -66,6 +65,7 @@ import org.apache.jmeter.visualizers.utils.Colors; import org.apache.jorphan.gui.GuiUtils; import org.apache.jorphan.gui.JFactory; import org.apache.jorphan.gui.JLabeledTextField; +import org.apache.jorphan.gui.JMeterUIDefaults; import org.apache.jorphan.math.StatCalculatorLong; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -373,10 +373,12 @@ public class RespTimeGraphVisualizer extends AbstractVisualizer implements Actio graphPanel.setPointShape(StatGraphProperties.getPointShapeMap().get(pointShapeLine.getSelectedItem())); graphPanel.setStrokeWidth(Float.parseFloat((String) strokeWidthList.getSelectedItem())); - graphPanel.setTitleFont(new Font(StatGraphProperties.getFontNameMap().get(titleFontNameList.getSelectedItem()), + graphPanel.setTitleFont(JMeterUIDefaults.createFont( + StatGraphProperties.getFontNameMap().get(titleFontNameList.getSelectedItem()), StatGraphProperties.getFontStyleMap().get(titleFontStyleList.getSelectedItem()), Integer.parseInt((String) titleFontSizeList.getSelectedItem()))); - graphPanel.setLegendFont(new Font(StatGraphProperties.getFontNameMap().get(fontNameList.getSelectedItem()), + graphPanel.setLegendFont(JMeterUIDefaults.createFont( + StatGraphProperties.getFontNameMap().get(fontNameList.getSelectedItem()), StatGraphProperties.getFontStyleMap().get(fontStyleList.getSelectedItem()), Integer.parseInt((String) fontSizeList.getSelectedItem()))); diff --git a/src/components/src/main/java/org/apache/jmeter/visualizers/StatGraphVisualizer.java b/src/components/src/main/java/org/apache/jmeter/visualizers/StatGraphVisualizer.java index 9ab55b2..7ce6d37 100644 --- a/src/components/src/main/java/org/apache/jmeter/visualizers/StatGraphVisualizer.java +++ b/src/components/src/main/java/org/apache/jmeter/visualizers/StatGraphVisualizer.java @@ -81,6 +81,7 @@ import org.apache.jmeter.visualizers.gui.AbstractVisualizer; import org.apache.jorphan.gui.GuiUtils; import org.apache.jorphan.gui.JFactory; import org.apache.jorphan.gui.JLabeledTextField; +import org.apache.jorphan.gui.JMeterUIDefaults; import org.apache.jorphan.gui.NumberRenderer; import org.apache.jorphan.gui.ObjectTableModel; import org.apache.jorphan.gui.ObjectTableSorter; @@ -622,13 +623,16 @@ public class StatGraphVisualizer extends AbstractVisualizer implements Clearable graphPanel.setLegendPlacement(StatGraphProperties.getPlacementNameMap() .get(legendPlacementList.getSelectedItem())); - graphPanel.setTitleFont(new Font(StatGraphProperties.getFontNameMap().get(titleFontNameList.getSelectedItem()), + graphPanel.setTitleFont(JMeterUIDefaults.createFont( + StatGraphProperties.getFontNameMap().get(titleFontNameList.getSelectedItem()), StatGraphProperties.getFontStyleMap().get(titleFontStyleList.getSelectedItem()), Integer.parseInt((String) titleFontSizeList.getSelectedItem()))); - graphPanel.setLegendFont(new Font(StatGraphProperties.getFontNameMap().get(fontNameList.getSelectedItem()), + graphPanel.setLegendFont(JMeterUIDefaults.createFont( + StatGraphProperties.getFontNameMap().get(fontNameList.getSelectedItem()), StatGraphProperties.getFontStyleMap().get(fontStyleList.getSelectedItem()), Integer.parseInt((String) fontSizeList.getSelectedItem()))); - graphPanel.setValueFont(new Font(StatGraphProperties.getFontNameMap().get(valueFontNameList.getSelectedItem()), + graphPanel.setValueFont(JMeterUIDefaults.createFont( + StatGraphProperties.getFontNameMap().get(valueFontNameList.getSelectedItem()), StatGraphProperties.getFontStyleMap().get(valueFontStyleList.getSelectedItem()), Integer.parseInt((String) valueFontSizeList.getSelectedItem()))); @@ -926,7 +930,7 @@ public class StatGraphVisualizer extends AbstractVisualizer implements Clearable private JPanel createGraphTitlePane() { JPanel titleNamePane = new JPanel(new BorderLayout()); - syncWithName.setFont(new Font("SansSerif", Font.PLAIN, 10)); + syncWithName.setFont(JMeterUIDefaults.createFont("SansSerif", Font.PLAIN, 10)); titleNamePane.add(graphTitle, BorderLayout.CENTER); titleNamePane.add(syncWithName, BorderLayout.EAST); diff --git a/src/core/src/main/java/org/apache/jmeter/gui/util/JSyntaxTextArea.java b/src/core/src/main/java/org/apache/jmeter/gui/util/JSyntaxTextArea.java index d186477..61e01ad 100644 --- a/src/core/src/main/java/org/apache/jmeter/gui/util/JSyntaxTextArea.java +++ b/src/core/src/main/java/org/apache/jmeter/gui/util/JSyntaxTextArea.java @@ -233,7 +233,7 @@ public class JSyntaxTextArea extends RSyntaxTextArea { this.disableUndo = disableUndo; if (USER_FONT_FAMILY != null) { int fontSize = USER_FONT_SIZE > 0 ? USER_FONT_SIZE : getFont().getSize(); - setFont(new Font(USER_FONT_FAMILY, Font.PLAIN, fontSize)); + setFont(JMeterUIDefaults.createFont(USER_FONT_FAMILY, Font.PLAIN, fontSize)); if (log.isDebugEnabled()) { log.debug("Font is set to: {}", getFont()); } diff --git a/src/jorphan/src/main/java/org/apache/jorphan/gui/JMeterUIDefaults.java b/src/jorphan/src/main/java/org/apache/jorphan/gui/JMeterUIDefaults.java index 94e51af..ab7d771 100644 --- a/src/jorphan/src/main/java/org/apache/jorphan/gui/JMeterUIDefaults.java +++ b/src/jorphan/src/main/java/org/apache/jorphan/gui/JMeterUIDefaults.java @@ -30,6 +30,7 @@ import javax.swing.UIDefaults; import javax.swing.UIManager; import javax.swing.plaf.FontUIResource; import javax.swing.plaf.UIResource; +import javax.swing.text.StyleContext; import org.apache.jorphan.gui.ui.TextAreaUIWithUndo; import org.apache.jorphan.gui.ui.TextFieldUIWithUndo; @@ -141,6 +142,10 @@ public class JMeterUIDefaults { }); } + public static Font createFont(String family, int style, int size) { + return stripUiResource(StyleContext.getDefaultStyleContext().getFont(family, style, size)); + } + private static void addScaledFont(UIDefaults defaults, String output, String input, float scale) { addDerivedFont(defaults, output, input, f -> f.deriveFont(f.getSize2D() * scale)); } @@ -154,7 +159,7 @@ public class JMeterUIDefaults { // Note: we drop UIResource here so LaF treats the font as user-provided rather than // LaF-provided. if (input instanceof UIResource) { - output = new Font(output.getAttributes()); + output = stripUiResource(output); } return output; } @@ -238,8 +243,22 @@ public class JMeterUIDefaults { } /** + * Ensures the font isn't of type {@link UIResource}. + * + * @param font the font. + * @return font which does not implement {@link UIResource}. + */ + private static Font stripUiResource(Font font) { + if (font instanceof UIResource) { + return new NonUIResourceFont(font); + } + return font; + } + + /** * Ensures {@code oldFont} and {@code newFont} either both implement {@link UIResource}, * or none of them implement. + * * @param oldFont old font * @param newFont new font * @return Font (when oldFont does not implement UIResource) or FontUIResource (when oldFont implements UIResource) @@ -249,8 +268,19 @@ public class JMeterUIDefaults { boolean O = newFont instanceof FontUIResource; // This is a beautiful smile, isn't it? if (o ^ O) { - return o ? new FontUIResource(newFont) : new Font(newFont.getAttributes()); + return o ? new FontUIResource(newFont) : stripUiResource(newFont); } return newFont; } + + /** + * Non UIResource wrapper for fonts which preserves the underlying {@link sun.font.Font2D}. + * This way the font behaves the same way with respect to fallback fonts + * (i.e. if the {@link sun.font.Font2D} base is of type {@link sun.font.CompositeFont}). + */ + private static class NonUIResourceFont extends Font { + private NonUIResourceFont(Font font) { + super(font); + } + } } diff --git a/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/config/gui/UrlConfigGui.java b/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/config/gui/UrlConfigGui.java index 4f29b4b..5a670e0 100644 --- a/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/config/gui/UrlConfigGui.java +++ b/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/config/gui/UrlConfigGui.java @@ -20,14 +20,12 @@ package org.apache.jmeter.protocol.http.config.gui; import java.awt.BorderLayout; import java.awt.Component; import java.awt.FlowLayout; -import java.awt.Font; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JCheckBox; import javax.swing.JPanel; import javax.swing.JTabbedPane; -import javax.swing.UIManager; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; @@ -74,10 +72,6 @@ public class UrlConfigGui extends JPanel implements ChangeListener { private int tabFileUploadIndex = 2; - private static final Font FONT_DEFAULT = UIManager.getDefaults().getFont("TextField.font"); - - private static final Font FONT_SMALL = new Font("SansSerif", Font.PLAIN, (int) Math.round(FONT_DEFAULT.getSize() * 0.8)); - private HTTPArgumentsPanel argsPanel; private HTTPFileArgsPanel filesPanel;