Iggy fonts reading - first beta

This commit is contained in:
Jindra Petřík
2016-11-26 20:06:21 +01:00
parent 95cdb9f86f
commit aa9164cba5
5 changed files with 5972 additions and 6004 deletions

View File

@@ -1,9 +1,7 @@
package com.jpexs.decompiler.flash.iggy;
import com.jpexs.decompiler.flash.iggy.annotations.IggyArrayFieldType;
import com.jpexs.decompiler.flash.iggy.annotations.IggyFieldType;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -25,6 +23,7 @@ public class IggyDataReader implements StructureInterface {
private IggyFlashHeader64 header;
private Map<Long, Long> sizesOfOffsets;
private List<Long> allOffsets;
public IggyDataReader(IggyFlashHeader64 header, AbstractDataStream stream, List<Long> offsets) throws IOException {
this.header = header;
@@ -33,75 +32,40 @@ public class IggyDataReader implements StructureInterface {
sizesOfOffsets.put(offsets.get(i), offsets.get(i + 1) - offsets.get(i));
}
sizesOfOffsets.put(offsets.get(offsets.size() - 1), 0L); //Last offset has 0L length?
this.allOffsets = offsets;
readFromDataStream(stream);
}
@Override
public void readFromDataStream(AbstractDataStream stream) throws IOException {
//here is offset[0]
StringBuilder nameBuilder = new StringBuilder();
int charCnt = 0;
do {
char c = (char) stream.readUI16();
charCnt++;
if (c == '\0') {
break;
}
nameBuilder.append(c);
} while (true);
stream.seek(48 - charCnt * 2, SeekMode.CUR);
name = nameBuilder.toString();
stream.readUI64(); //pad 1
long[] fontOffsets = new long[(int) header.font_count];
for (int i = 0; i < header.font_count; i++) {
fontOffsets[i] = stream.position() + stream.readUI64();
}
List<Long> textOffsets = new ArrayList<>();
while (true) {
long val = stream.readUI64();
if (val == 1) {
break;
}
textOffsets.add(stream.position() + val);
}
//long pad_len = 840 - stream.position();
stream.seek(840, SeekMode.SET);
Long lastOffset = null;
texts = new HashMap<>();
text2Font = new HashMap<>();
long textDataSizes[] = new long[(int) header.font_count];
long offsetAfterTexts = header.as3_section_offset;
for (int i = 0; i < textOffsets.size(); i++) {
long textOffset = textOffsets.get(i);
if (lastOffset == null) {
lastOffset = textOffset;
} else {
textDataSizes[i - 1] = textOffset - lastOffset;
}
}
if (lastOffset != null) {
textDataSizes[(int) header.font_count - 1] = offsetAfterTexts - lastOffset;
}
for (int textIndex = 0; textIndex < textOffsets.size(); textIndex++) {
long textOffset = textOffsets.get(textIndex);
stream.seek(textOffset, SeekMode.SET);
byte[] textData = stream.readBytes((int) textDataSizes[textIndex]);
IggyText text = new IggyText(new ByteArrayDataStream(textData, stream.is64()));
text2Font.put(textIndex, text.fontIndex);
texts.put(textIndex, text);
}
//here is offset[1]
int pad8 = 8 - (int) (stream.position() % 8);
stream.seek(pad8, SeekMode.CUR);
//here is offset [2]
fonts = new HashMap<>();
for (int fontIndex = 0; fontIndex < header.font_count; fontIndex++) {
stream.seek(fontOffsets[fontIndex], SeekMode.SET);
IggyFont font = new IggyFont(stream);
fonts.put(fontIndex, font);
int fontIndex = 0;
for (int i = 2; i < allOffsets.size(); i++) {
long offset = allOffsets.get(i);
stream.seek(offset, SeekMode.SET);
int type = stream.readUI16();
stream.seek(-2, SeekMode.CUR);
if (type == IggyFont.ID) {
IggyFont font = new IggyFont(stream);
fonts.put(fontIndex++, font);
}
if (type == IggyText.ID) {
//TODO: Texts - incomplete
}
}
}

View File

@@ -2,11 +2,9 @@ package com.jpexs.decompiler.flash.iggy;
import com.jpexs.decompiler.flash.iggy.annotations.IggyArrayFieldType;
import com.jpexs.decompiler.flash.iggy.annotations.IggyFieldType;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.omg.CORBA.StructMemberHelper;
/**
*
@@ -14,6 +12,8 @@ import org.omg.CORBA.StructMemberHelper;
*/
public class IggyFont implements StructureInterface {
public static final int ID = 0xFF16;
@IggyFieldType(DataType.uint16_t)
int type; //stejny pro rozdilne fonty
@IggyFieldType(DataType.uint16_t)

View File

@@ -234,6 +234,9 @@ public class IggyToSwfConvertor {
swf.addTag(fontTag);
}
/*
//TODO: Texts, they are incomplete
Map<Integer, Integer> textIndex2CharId = new HashMap<>();
Set<Integer> textIds = file.getTextIds(swfIndex);
@@ -269,7 +272,7 @@ public class IggyToSwfConvertor {
textTag.setModified(true);
swf.addTag(textTag);
}
*/
swf.addTag(
new EndTag(swf));
swf.setModified(