From 3fc47c5afc6955250809cccc5b023236e6ec9f6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Fri, 25 Nov 2016 11:29:09 +0100 Subject: [PATCH] Texts converting --- .../decompiler/flash/iggy/IggyDataReader.java | 16 +++---- .../jpexs/decompiler/flash/iggy/IggyText.java | 22 ++++----- .../iggy/conversion/IggyToSwfConvertor.java | 46 ++++++++++++++----- 3 files changed, 54 insertions(+), 30 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyDataReader.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyDataReader.java index cb4d3c7bc..d74c79b9c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyDataReader.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyDataReader.java @@ -89,19 +89,19 @@ public class IggyDataReader implements StructureInterface { textDataSizes[(int) header.font_count - 1] = offsetAfterTexts - lastOffset; } - for (int i = 0; i < textOffsets.size(); i++) { - long textOffset = textOffsets.get(i); + for (int textIndex = 0; textIndex < textOffsets.size(); textIndex++) { + long textOffset = textOffsets.get(textIndex); stream.seek(textOffset, SeekMode.SET); - byte[] textData = stream.readBytes((int) textDataSizes[i]); + byte[] textData = stream.readBytes((int) textDataSizes[textIndex]); IggyText text = new IggyText(new ByteArrayDataStream(textData, stream.is64())); - text2Font.put(text.textId, text.fontId); - texts.put(text.textId, text); + text2Font.put(textIndex, text.fontIndex); + texts.put(textIndex, text); } fonts = new HashMap<>(); - for (int i = 0; i < header.font_count; i++) { - stream.seek(fontOffsets[i], SeekMode.SET); + for (int fontIndex = 0; fontIndex < header.font_count; fontIndex++) { + stream.seek(fontOffsets[fontIndex], SeekMode.SET); IggyFont font = new IggyFont(stream); - fonts.put(font.fontId, font); + fonts.put(fontIndex, font); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyText.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyText.java index d94ae096d..bff6a24a2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyText.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyText.java @@ -13,7 +13,7 @@ public class IggyText implements StructureInterface { @IggyFieldType(DataType.uint16_t) int type; // Tag type @IggyFieldType(DataType.uint16_t) - int textId; + int textIndex; @IggyArrayFieldType(value = DataType.uint8_t, count = 28) byte zeroone[]; @IggyFieldType(DataType.float_t) @@ -27,7 +27,7 @@ public class IggyText implements StructureInterface { @IggyFieldType(DataType.uint16_t) int enum_hex; @IggyFieldType(DataType.uint16_t) - int fontId; + int fontIndex; @IggyFieldType(DataType.uint32_t) long zero; @IggyFieldType(DataType.uint64_t) @@ -39,14 +39,14 @@ public class IggyText implements StructureInterface { public IggyText(int type, int order_in_iggy_file, byte[] zeroone, float par1, float par2, float par3, float par4, int enum_hex, int for_which_font_order_in_iggyfile, long zero, long one, byte[] some, long offset_of_name, String name) { this.type = type; - this.textId = order_in_iggy_file; + this.textIndex = order_in_iggy_file; this.zeroone = zeroone; this.par1 = par1; this.par2 = par2; this.par3 = par3; this.par4 = par4; this.enum_hex = enum_hex; - this.fontId = for_which_font_order_in_iggyfile; + this.fontIndex = for_which_font_order_in_iggyfile; this.zero = zero; this.one = one; this.some = some; @@ -60,14 +60,14 @@ public class IggyText implements StructureInterface { @Override public void readFromDataStream(AbstractDataStream s) throws IOException { type = s.readUI16(); - textId = s.readUI16(); + textIndex = s.readUI16(); zeroone = s.readBytes(28); par1 = s.readFloat(); par2 = s.readFloat(); par3 = s.readFloat(); par4 = s.readFloat(); enum_hex = s.readUI16(); - fontId = s.readUI16(); + fontIndex = s.readUI16(); zero = s.readUI32(); one = s.readUI64(); some = s.readBytes(32); @@ -91,8 +91,8 @@ public class IggyText implements StructureInterface { return type; } - public int getOrder_in_iggy_file() { - return textId; + public int getTextIndex() { + return textIndex; } public byte[] getZeroone() { @@ -119,8 +119,8 @@ public class IggyText implements StructureInterface { return enum_hex; } - public int getFor_which_font_order_in_iggyfile() { - return fontId; + public int getFontIndex() { + return fontIndex; } public long getZero() { @@ -135,7 +135,7 @@ public class IggyText implements StructureInterface { return some; } - public String getIntitalText() { + public String getInitialText() { return initialText; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/conversion/IggyToSwfConvertor.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/conversion/IggyToSwfConvertor.java index 74c3eddfb..20bebdedc 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/conversion/IggyToSwfConvertor.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/conversion/IggyToSwfConvertor.java @@ -6,6 +6,7 @@ import com.jpexs.decompiler.flash.iggy.IggyChar; import com.jpexs.decompiler.flash.iggy.IggyFile; import com.jpexs.decompiler.flash.iggy.IggyFont; import com.jpexs.decompiler.flash.iggy.IggyText; +import com.jpexs.decompiler.flash.tags.DefineEditTextTag; import com.jpexs.decompiler.flash.tags.DefineFont2Tag; import com.jpexs.decompiler.flash.tags.EndTag; import com.jpexs.decompiler.flash.tags.FileAttributesTag; @@ -16,6 +17,8 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; import java.util.Set; /** @@ -76,22 +79,26 @@ public class IggyToSwfConvertor { fat.useNetwork = false; swf.addTag(fat); - Set fontKeys = file.getFontIds(swfIndex); + Set fontIndices = file.getFontIds(swfIndex); - for (int fontKey : fontKeys) { - IggyFont iggyFontData = file.getFont(swfIndex, fontKey); - IggyText fontInfo = file.getText(swfIndex, fontKey); + int currentCharId = 0; + Map fontIndex2CharId = new HashMap<>(); + + for (int fontIndex : fontIndices) { + IggyFont iggyFont = file.getFont(swfIndex, fontIndex); DefineFont2Tag fontTag = new DefineFont2Tag(swf); - fontTag.fontID = fontKey + 1; + currentCharId++; + fontIndex2CharId.put(fontIndex, currentCharId); + fontTag.fontID = currentCharId; fontTag.codeTable = new ArrayList<>(); - fontTag.fontName = iggyFontData.getName(); + fontTag.fontName = iggyFont.getName(); fontTag.glyphShapeTable = new ArrayList<>(); fontTag.fontAdvanceTable = new ArrayList<>(); fontTag.fontBoundsTable = new ArrayList<>(); - for (int i = 0; i < iggyFontData.getCharacterCount(); i++) { - int code = iggyFontData.getCharIndices().getChars().get(i); - IggyChar chr = iggyFontData.getChars().get(i); + for (int i = 0; i < iggyFont.getCharacterCount(); i++) { + int code = iggyFont.getCharIndices().getChars().get(i); + IggyChar chr = iggyFont.getChars().get(i); if (chr != null) { fontTag.codeTable.add(code); SHAPE shp = IggyCharToShapeConvertor.convertCharToShape(chr); @@ -100,11 +107,29 @@ public class IggyToSwfConvertor { fontTag.fontBoundsTable.add(shp.getBounds()); } - //TODO: handle spaces, etc. + //FIXME: handle spaces (with no vectors), etc. } fontTag.setModified(true); swf.addTag(fontTag); } + + Map textIndex2CharId = new HashMap<>(); + + Set textIds = file.getTextIds(swfIndex); + for (int textId : textIds) { + IggyText iggyText = file.getText(swfIndex, textId); + DefineEditTextTag textTag = new DefineEditTextTag(swf); + currentCharId++; + textIndex2CharId.put(iggyText.getTextIndex(), currentCharId); + textTag.characterID = currentCharId; + textTag.hasText = true; + textTag.initialText = iggyText.getInitialText(); + //textTag.hasFont = true; + //textTag.fontId = fontIndex2CharId.get(iggyText.getFontIndex()); + textTag.setModified(true); + swf.addTag(textTag); + } + swf.addTag(new EndTag(swf)); swf.setModified(true); @@ -112,6 +137,5 @@ public class IggyToSwfConvertor { } public static void main(String[] args) throws IOException { - } }