From fc19983ae9948e165b4066143a4637846435935c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 20 Jan 2018 21:09:27 +0100 Subject: [PATCH] loading list of fonts on demand - X11 load bug on Java9 --- .../flash/tags/DefineEditTextTag.java | 5 +-- .../decompiler/flash/tags/base/FontTag.java | 36 +++++++++++++++---- .../tags/base/MissingCharacterHandler.java | 7 ++-- .../decompiler/flash/xfl/XFLConverter.java | 11 +++--- .../jpexs/decompiler/flash/gui/FontPanel.java | 6 ++-- .../jpexs/decompiler/flash/gui/MainPanel.java | 2 +- 6 files changed, 47 insertions(+), 20 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java index 3013c2ee0..ebe7e7f7e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.tags; import com.jpexs.decompiler.flash.SWF; @@ -1023,7 +1024,7 @@ public class DefineEditTextTag extends TextTag { ge.glyphIndex = -1; // always use system character glyphs in edit text - String fontName = ge.fontFace != null ? ge.fontFace : FontTag.defaultFontName; + String fontName = ge.fontFace != null ? ge.fontFace : FontTag.getDefaultFontName(); int fontStyle = font == null ? ge.fontStyle : font.getFontStyle(); ge.glyphAdvance = (int) Math.round(SWF.unitDivisor * FontTag.getSystemFontAdvance(fontName, fontStyle, (int) (lastStyle.fontHeight / SWF.unitDivisor), c, nextChar)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java index 8975c6a35..b1ef5443d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.tags.base; import com.jpexs.decompiler.flash.SWF; @@ -121,14 +122,19 @@ public abstract class FontTag extends DrawableTag implements AloneTag { return fontNameTag.fontCopyright; } - public static Map> installedFontsByFamily; + private static Map> installedFontsByFamily; - public static Map installedFontsByName; + private static Map installedFontsByName; - public static String defaultFontName; + private static String defaultFontName; - static { - reload(); + private static boolean firstLoaded = false; + + private static void ensureLoaded() { + if (!firstLoaded) { + reload(); + } + firstLoaded = true; } public int getFontId() { @@ -259,6 +265,11 @@ public abstract class FontTag extends DrawableTag implements AloneTag { return gm.getAdvanceX(); } + public static String getDefaultFontName() { + ensureLoaded(); + return defaultFontName; + } + public static void reload() { installedFontsByFamily = FontHelper.getInstalledFonts(); installedFontsByName = new HashMap<>(); @@ -279,6 +290,7 @@ public abstract class FontTag extends DrawableTag implements AloneTag { } public static String getFontNameWithFallback(String fontName) { + ensureLoaded(); if (installedFontsByFamily.containsKey(fontName)) { return fontName; } @@ -307,6 +319,7 @@ public abstract class FontTag extends DrawableTag implements AloneTag { } public static String findInstalledFontName(String fontName) { + ensureLoaded(); if (installedFontsByName.containsKey(fontName)) { return fontName; } @@ -413,4 +426,15 @@ public abstract class FontTag extends DrawableTag implements AloneTag { public FontTag toClassicFont() { return this; } + + public static Map> getInstalledFontsByFamily() { + ensureLoaded(); + return installedFontsByFamily; + } + + public static Map getInstalledFontsByName() { + ensureLoaded(); + return installedFontsByName; + } + } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MissingCharacterHandler.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MissingCharacterHandler.java index f9e9b45b3..4174a0de5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MissingCharacterHandler.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MissingCharacterHandler.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.tags.base; import java.awt.Font; @@ -30,10 +31,10 @@ public class MissingCharacterHandler { public boolean handle(TextTag textTag, FontTag font, char character) { String fontName = font.getFontNameIntag(); - if (!FontTag.installedFontsByFamily.containsKey(fontName)) { + if (!FontTag.getInstalledFontsByFamily().containsKey(fontName)) { return false; } - Map faces = FontTag.installedFontsByFamily.get(fontName); + Map faces = FontTag.getInstalledFontsByFamily().get(fontName); Font f = null; for (String face : faces.keySet()) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java index 518914081..6ca70db83 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.xfl; import com.jpexs.decompiler.flash.AbortRetryIgnoreHandler; @@ -2358,7 +2359,7 @@ public class XFLConverter { fontName = font.getFontNameIntag(); } if (fontName == null) { - fontName = FontTag.defaultFontName; + fontName = FontTag.getDefaultFontName(); } int fontStyle = font.getFontStyle(); String installedFont; @@ -3035,7 +3036,7 @@ public class XFLConverter { fontName = font.getFontNameIntag(); } if (fontName == null) { - fontName = FontTag.defaultFontName; + fontName = FontTag.getDefaultFontName(); } int fontStyle = 0; if (font != null) { @@ -3197,7 +3198,7 @@ public class XFLConverter { fontName = ft.getFontNameIntag(); } if (fontName == null) { - fontName = FontTag.defaultFontName; + fontName = FontTag.getDefaultFontName(); } italic = ft.isItalic(); bold = ft.isBold(); @@ -3934,7 +3935,7 @@ public class XFLConverter { fontName = ft.getFontNameIntag(); } if (fontName == null) { - fontName = FontTag.defaultFontName; + fontName = FontTag.getDefaultFontName(); } italic = ft.isItalic(); bold = ft.isBold(); diff --git a/src/com/jpexs/decompiler/flash/gui/FontPanel.java b/src/com/jpexs/decompiler/flash/gui/FontPanel.java index 1fe3c9fe7..d43296056 100644 --- a/src/com/jpexs/decompiler/flash/gui/FontPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/FontPanel.java @@ -92,7 +92,7 @@ public class FontPanel extends JPanel { public static ComboBoxModel getFamilyModel() { Set famSet = new TreeSet<>(); - for (Font f : FontTag.installedFontsByName.values()) { + for (Font f : FontTag.getInstalledFontsByName().values()) { famSet.add(new FontFamily(f)); } return new DefaultComboBoxModel<>(new Vector<>(famSet)); @@ -101,7 +101,7 @@ public class FontPanel extends JPanel { public static ComboBoxModel getFaceModel(FontFamily family) { Set faceSet = new TreeSet<>(); - for (Font f : FontTag.installedFontsByFamily.get(family.familyEn).values()) { + for (Font f : FontTag.getInstalledFontsByFamily().get(family.familyEn).values()) { faceSet.add(new FontFace(f)); } @@ -403,7 +403,7 @@ public class FontPanel extends JPanel { fontFamilyNameSelection.setPreferredSize(new Dimension(100, fontFamilyNameSelection.getMinimumSize().height)); fontFamilyNameSelection.setModel(getFamilyModel()); - fontFamilyNameSelection.setSelectedItem(FontTag.defaultFontName); + fontFamilyNameSelection.setSelectedItem(FontTag.getDefaultFontName()); fontFaceSelection.setModel(getFaceModel((FontFamily) fontFamilyNameSelection.getSelectedItem())); fontFamilyNameSelection.addItemListener(new ItemListener() { @Override diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 2f2f1f76a..e645319ac 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -2676,7 +2676,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se if (fontName == null) { fontName = font.getFontName(); } - final Font f = FontTag.installedFontsByName.get(fontName); + final Font f = FontTag.getInstalledFontsByName().get(fontName); if (f == null || !f.canDisplay(character)) { String msg = translate("error.font.nocharacter").replace("%char%", "" + character); logger.log(Level.SEVERE, "{0} FontId: {1} TextId: {2}", new Object[]{msg, font.getCharacterId(), textTag.getCharacterId()});