diff --git a/CHANGELOG.md b/CHANGELOG.md index 36bcabc2a..d6c61a8bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,9 +5,11 @@ All notable changes to this project will be documented in this file. ### Added - [#1209], [#1850], [#2619] Debugging SWF in the web browser (Debug listening capability - only for SWFs previously prepared by FFDec) +- TTF export - setting italic / bold flags in the font ### Fixed - Metadata formatting +- [#2632] TTF export - non-zero italic angle ## [25.0.0] - 2026-02-10 ### Added @@ -4119,6 +4121,7 @@ Major version of SWF to XML export changed to 2. [#1209]: https://www.free-decompiler.com/flash/issues/1209 [#1850]: https://www.free-decompiler.com/flash/issues/1850 [#2619]: https://www.free-decompiler.com/flash/issues/2619 +[#2632]: https://www.free-decompiler.com/flash/issues/2632 [#2610]: https://www.free-decompiler.com/flash/issues/2610 [#2603]: https://www.free-decompiler.com/flash/issues/2603 [#2626]: https://www.free-decompiler.com/flash/issues/2626 diff --git a/lib/ttf.jar b/lib/ttf.jar index 81ac3e4ef..93c24c3a0 100644 Binary files a/lib/ttf.jar and b/lib/ttf.jar differ diff --git a/libsrc/ffdec_lib/lib/ttf.jar b/libsrc/ffdec_lib/lib/ttf.jar index 81ac3e4ef..93c24c3a0 100644 Binary files a/libsrc/ffdec_lib/lib/ttf.jar and b/libsrc/ffdec_lib/lib/ttf.jar differ diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/FontExporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/FontExporter.java index adfd878f0..3595cab50 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/FontExporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/FontExporter.java @@ -209,6 +209,13 @@ public class FontExporter { value = Math.min(value, 1024); f.setDescender(value); } + + if (ft.isBold()) { + f.setBold(true); + } + if (ft.isItalic()) { + f.setItalic(true); + } List reallyExportedGlyphs = new ArrayList<>(); Set processedCharacters = new HashSet<>(); diff --git a/libsrc/ttf/nbproject/project.properties b/libsrc/ttf/nbproject/project.properties index 84837aad0..ab1765eae 100644 --- a/libsrc/ttf/nbproject/project.properties +++ b/libsrc/ttf/nbproject/project.properties @@ -39,12 +39,13 @@ javac.classpath= # Space-separated list of extra javac options javac.compilerargs=-Xlint:unchecked -Xlint:deprecation javac.deprecation=false +javac.external.vm=false javac.modulepath= javac.processormodulepath= javac.processorpath=\ ${javac.classpath} -javac.source=1.7 -javac.target=1.7 +javac.source=1.8 +javac.target=1.8 javac.test.classpath=\ ${javac.classpath}:\ ${build.classes.dir} @@ -55,6 +56,7 @@ javac.test.processorpath=\ javadoc.additionalparam= javadoc.author=false javadoc.encoding=${source.encoding} +javadoc.html5=false javadoc.noindex=false javadoc.nonavbar=false javadoc.notree=false @@ -63,6 +65,8 @@ javadoc.splitindex=true javadoc.use=true javadoc.version=false javadoc.windowtitle= +jlink.launcher=false +jlink.launcher.name=ttf main.class=fontatest.FontaTest manifest.file=manifest.mf meta.inf.dir=${src.dir}/META-INF diff --git a/libsrc/ttf/src/fontastic/Fontastic.java b/libsrc/ttf/src/fontastic/Fontastic.java index 59f6d236b..745a6915f 100644 --- a/libsrc/ttf/src/fontastic/Fontastic.java +++ b/libsrc/ttf/src/fontastic/Fontastic.java @@ -291,6 +291,16 @@ public class Fontastic { e.printStackTrace(); } } + + //JPEXS + public void setBold(boolean bold) { + m_engine.getTypeface().setBold(bold); + } + + //JPEXS + public void setItalic(boolean italic) { + m_engine.getTypeface().setItalic(italic); + } public void setAscender(float ascender) { try { diff --git a/libsrc/ttf/src/org/doubletype/ossa/module/TypefaceFile.java b/libsrc/ttf/src/org/doubletype/ossa/module/TypefaceFile.java index 31d4d0e13..77a6f3bf9 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/module/TypefaceFile.java +++ b/libsrc/ttf/src/org/doubletype/ossa/module/TypefaceFile.java @@ -97,6 +97,12 @@ public class TypefaceFile extends GlyphFile { private Double m_bottomSideBearing = null; private String m_name; + + //JPEXS + private boolean bold = false; + + //JPEXS + private boolean italic = false; public TypefaceFile(String a_name, File a_dir) throws FileNotFoundException { super(a_dir); @@ -115,6 +121,16 @@ public class TypefaceFile extends GlyphFile { initFileName(); } + //JPEXS + public void setBold(boolean bold) { + this.bold = bold; + } + + //JPEXS + public void setItalic(boolean italic) { + this.italic = italic; + } + private void initFileName() { String fileName = m_name + k_dotTtf; @@ -397,6 +413,7 @@ public class TypefaceFile extends GlyphFile { writer.setXHeight((int) getXHeight()); writer.setDescent((int) getDescender()); writer.setLineGap((int) (getTopSideBearing() + getBottomSideBearing())); + writer.setFontStyle(bold, italic); loadCodePages(writer); loadUnicodeRanges(writer); diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/FontFileWriter.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/FontFileWriter.java index 2b6e41a2d..0c5335f8e 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/FontFileWriter.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/FontFileWriter.java @@ -246,7 +246,7 @@ public class FontFileWriter extends FontFormatWriter { } public long getCharacterMapping(long a_unicode) { - return m_cmap.getGlyfIndex(new Long(a_unicode)); + return m_cmap.getGlyfIndex(a_unicode); } /** @@ -308,4 +308,36 @@ public class FontFileWriter extends FontFormatWriter { = (int) Math.floor(Math.log(a_value) / Math.log(2)); return retval; } + + //JPEXS + public void setFontStyle(boolean bold, boolean italic) { + int fsSelection = 0; + if (!bold && !italic) { + fsSelection = m_os2.k_regular; + } else { + if (bold) { + fsSelection |= m_os2.k_bold; + } + if (italic) { + fsSelection |= m_os2.k_italic; + } + } + m_os2.setFsSelection(fsSelection); + + if (bold) { + m_os2.setUsWeightClass(m_os2.FW_BOLD); + } else { + m_os2.setUsWeightClass(m_os2.FW_NORMAL); + } + + int macStyle = 0; + if (bold) { + macStyle |= HeadWriter.k_bold; + } + if (italic) { + macStyle |= HeadWriter.k_italic; + } + + m_head.setMacStyle(macStyle); + } } diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/HeadWriter.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/HeadWriter.java index 2f18831ae..89255e9f8 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/HeadWriter.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/HeadWriter.java @@ -66,6 +66,11 @@ public class HeadWriter extends FontFormatWriter { static public final int k_indicRearrangement = 0x400; + //JPEXS + static public final int k_bold = 0x01; + //JPEXS + static public final int k_italic = 0x02; + private final long k_magicNumber = 0x5f0f3cf5; private long m_checkSumAdjustment = 0; @@ -77,6 +82,8 @@ public class HeadWriter extends FontFormatWriter { private Date m_creationDate = new Date(); private Date m_modificationDate = m_creationDate; + + private int m_macStyle = 0; //JPEXS public HeadWriter() { super(); @@ -122,6 +129,11 @@ public class HeadWriter extends FontFormatWriter { m_modificationDate = a_date; } + //JPEXS + public void setMacStyle(int macStyle) { + this.m_macStyle = macStyle; + } + public void write() throws IOException { // table version number writeFixed32(1.0); @@ -151,7 +163,7 @@ public class HeadWriter extends FontFormatWriter { writeFWord(m_max.y); // macStyle - writeUInt16(0); + writeUInt16(m_macStyle); // lowestRecPPEM writeUInt16(11); diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/HheaWriter.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/HheaWriter.java index 9b96b71e5..ee92378bb 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/HheaWriter.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/HheaWriter.java @@ -88,10 +88,9 @@ public class HheaWriter extends FontFormatWriter { int xMaxExtent = m_head.getMax().x - m_head.getMin().x; writeFWord(xMaxExtent); - // caratSlopeRise - writeInt16(1); - writeInt16(0); - + writeInt16(1); // caretSlopeRise + writeInt16(0); //caretSlopeRun + // reserved for (int i = 0; i < 5; i++) { writeInt16(0); diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/OS2Writer.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/OS2Writer.java index a1f7e3c20..5944b49dd 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/OS2Writer.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/OS2Writer.java @@ -70,6 +70,10 @@ public class OS2Writer extends FontFormatWriter { final int k_latin1Supplement = 0x0002; + final int k_italic = 0x01; + + final int k_bold = 0x20; + final int k_regular = 0x40; final int k_basicLatinStart = 0x0020; @@ -220,6 +224,16 @@ public class OS2Writer extends FontFormatWriter { } // switch } + //JPEXS + public void setFsSelection(int fsSelection) { + this.m_fsSelection = fsSelection; + } + + //JPEXS + public void setUsWeightClass(int usWeightClass) { + this.m_usWeightClass = usWeightClass; + } + public void write() throws IOException { m_usWinAscent = m_head.getMax().y; m_usWinDescent = 0; diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/PostWriter.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/PostWriter.java index 1eb98ba25..2952c3525 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/PostWriter.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/PostWriter.java @@ -50,7 +50,7 @@ public class PostWriter extends FontFormatWriter { public void write() throws IOException { // table version number writeFixed32(3.0); //JPEXS - 3.0 = no postscript table set - writeFixed32(10.0); // italic angle + writeFixed32(0.0);//JPEXS - original was 10.0 // italic angle writeFWord(0); // underline pos writeFWord(60); // underline thickness