show gfx data in dump view

This commit is contained in:
honfika
2014-08-24 10:04:00 +02:00
parent 36d111b8b3
commit c91f0b106c
11 changed files with 1063 additions and 1000 deletions
@@ -106,7 +106,6 @@ public class FontTextureInfo extends Tag {
for (int i = 0; i < numTexGlyphs; i++) {
texGlyphs[i] = new TEXGLYPH(new GFxInputStream(mis));
}
// todo: honfika: add GFx data to dump view
sis.skipBytes(mis.getPos());
int numFonts = sis.readUI16("numFonts");
fonts = new FONTINFO[numFonts];
@@ -114,7 +113,6 @@ public class FontTextureInfo extends Tag {
for (int i = 0; i < numFonts; i++) {
fonts[i] = new FONTINFO(new GFxInputStream(sis.getBaseStream()));
}
// todo: honfika: add GFx data to dump view
sis.skipBytes(mis.getPos());
}
}
@@ -1,132 +1,132 @@
/*
* Copyright (C) 2010-2014 JPEXS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.jpexs.decompiler.flash.types.gfx;
import com.jpexs.decompiler.flash.types.shaperecords.CurvedEdgeRecord;
import com.jpexs.decompiler.flash.types.shaperecords.SHAPERECORD;
import com.jpexs.decompiler.flash.types.shaperecords.StraightEdgeRecord;
import com.jpexs.decompiler.flash.types.shaperecords.StyleChangeRecord;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author JPEXS
*/
public class ContourType implements Serializable {
public int moveToX;
public int moveToY;
public EdgeType[] edges;
public boolean isReference;
public long reference;
public ContourType(List<SHAPERECORD> records) {
int i = 0;
int divider = 20;
for (; i < records.size(); i++) {
if (records.get(i) instanceof StyleChangeRecord) {
StyleChangeRecord scr = (StyleChangeRecord) records.get(i);
if (scr.stateMoveTo) {
moveToX = scr.moveDeltaX / divider;
moveToY = scr.moveDeltaY / divider;
break;
}
}
}
List<EdgeType> edgesList = new ArrayList<>();
for (; i < records.size(); i++) {
SHAPERECORD rec = records.get(i);
if (rec instanceof StraightEdgeRecord) {
StraightEdgeRecord ser = (StraightEdgeRecord) rec;
if (ser.generalLineFlag) {
edgesList.add(new EdgeType(ser.deltaX / divider, ser.deltaY / divider));
} else if (ser.vertLineFlag) {
edgesList.add(new EdgeType(true, ser.deltaY / divider));
} else {
edgesList.add(new EdgeType(false, ser.deltaX / divider));
}
} else if (rec instanceof CurvedEdgeRecord) {
CurvedEdgeRecord cer = (CurvedEdgeRecord) rec;
edgesList.add(new EdgeType(cer.controlDeltaX / divider, cer.controlDeltaY / divider, cer.anchorDeltaX / divider, cer.anchorDeltaY / divider));
}
}
edges = edgesList.toArray(new EdgeType[edgesList.size()]);
}
public ContourType(GFxInputStream sis) throws IOException {
moveToX = sis.readSI15();
moveToY = sis.readSI15();
long numEdgesRef = sis.readUI30();
isReference = (numEdgesRef & 1) == 1;
numEdgesRef >>= 1;
long oldPos = sis.getPos();
if (isReference) {
sis.setPos(numEdgesRef);
numEdgesRef = sis.readUI30();
numEdgesRef >>= 1;
}
edges = new EdgeType[(int) numEdgesRef];
for (int i = 0; i < edges.length; i++) {
edges[i] = new EdgeType(sis);
}
if (isReference) {
sis.setPos(oldPos);
}
}
public List<SHAPERECORD> toSHAPERECORDS() {
int multiplier = 1;
List<SHAPERECORD> recs = new ArrayList<>();
StyleChangeRecord src = new StyleChangeRecord();
src.stateMoveTo = true;
src.moveDeltaX = moveToX * multiplier;
src.moveDeltaY = moveToY * multiplier;
src.calculateBits();
recs.add(src);
for (EdgeType e : edges) {
recs.add(e.toSHAPERECORD());
}
int x = src.moveDeltaX;
int y = src.moveDeltaY;
for (SHAPERECORD rec : recs) {
x = rec.changeX(x);
y = rec.changeY(y);
}
StraightEdgeRecord closeSer = new StraightEdgeRecord();
closeSer.generalLineFlag = true;
closeSer.deltaX = (src.moveDeltaX - x);
closeSer.deltaY = (src.moveDeltaY - y);
closeSer.calculateBits();
recs.add(closeSer);
return recs;
}
public void write(GFxOutputStream sos) throws IOException {
sos.writeSI15(moveToX);
sos.writeSI15(moveToY);
sos.writeUI30(edges.length << 1);
for (int i = 0; i < edges.length; i++) {
edges[i].write(sos);
}
}
}
/*
* Copyright (C) 2010-2014 JPEXS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.jpexs.decompiler.flash.types.gfx;
import com.jpexs.decompiler.flash.types.shaperecords.CurvedEdgeRecord;
import com.jpexs.decompiler.flash.types.shaperecords.SHAPERECORD;
import com.jpexs.decompiler.flash.types.shaperecords.StraightEdgeRecord;
import com.jpexs.decompiler.flash.types.shaperecords.StyleChangeRecord;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author JPEXS
*/
public class ContourType implements Serializable {
public int moveToX;
public int moveToY;
public EdgeType[] edges;
public boolean isReference;
public long reference;
public ContourType(List<SHAPERECORD> records) {
int i = 0;
int divider = 20;
for (; i < records.size(); i++) {
if (records.get(i) instanceof StyleChangeRecord) {
StyleChangeRecord scr = (StyleChangeRecord) records.get(i);
if (scr.stateMoveTo) {
moveToX = scr.moveDeltaX / divider;
moveToY = scr.moveDeltaY / divider;
break;
}
}
}
List<EdgeType> edgesList = new ArrayList<>();
for (; i < records.size(); i++) {
SHAPERECORD rec = records.get(i);
if (rec instanceof StraightEdgeRecord) {
StraightEdgeRecord ser = (StraightEdgeRecord) rec;
if (ser.generalLineFlag) {
edgesList.add(new EdgeType(ser.deltaX / divider, ser.deltaY / divider));
} else if (ser.vertLineFlag) {
edgesList.add(new EdgeType(true, ser.deltaY / divider));
} else {
edgesList.add(new EdgeType(false, ser.deltaX / divider));
}
} else if (rec instanceof CurvedEdgeRecord) {
CurvedEdgeRecord cer = (CurvedEdgeRecord) rec;
edgesList.add(new EdgeType(cer.controlDeltaX / divider, cer.controlDeltaY / divider, cer.anchorDeltaX / divider, cer.anchorDeltaY / divider));
}
}
edges = edgesList.toArray(new EdgeType[edgesList.size()]);
}
public ContourType(GFxInputStream sis) throws IOException {
moveToX = sis.readSI15("moveToX");
moveToY = sis.readSI15("moveToY");
long numEdgesRef = sis.readUI30("numEdgesRef");
isReference = (numEdgesRef & 1) == 1;
numEdgesRef >>= 1;
long oldPos = sis.getPos();
if (isReference) {
sis.setPos(numEdgesRef);
numEdgesRef = sis.readUI30("numEdgesRef");
numEdgesRef >>= 1;
}
edges = new EdgeType[(int) numEdgesRef];
for (int i = 0; i < edges.length; i++) {
edges[i] = new EdgeType(sis);
}
if (isReference) {
sis.setPos(oldPos);
}
}
public List<SHAPERECORD> toSHAPERECORDS() {
int multiplier = 1;
List<SHAPERECORD> recs = new ArrayList<>();
StyleChangeRecord src = new StyleChangeRecord();
src.stateMoveTo = true;
src.moveDeltaX = moveToX * multiplier;
src.moveDeltaY = moveToY * multiplier;
src.calculateBits();
recs.add(src);
for (EdgeType e : edges) {
recs.add(e.toSHAPERECORD());
}
int x = src.moveDeltaX;
int y = src.moveDeltaY;
for (SHAPERECORD rec : recs) {
x = rec.changeX(x);
y = rec.changeY(y);
}
StraightEdgeRecord closeSer = new StraightEdgeRecord();
closeSer.generalLineFlag = true;
closeSer.deltaX = (src.moveDeltaX - x);
closeSer.deltaY = (src.moveDeltaY - y);
closeSer.calculateBits();
recs.add(closeSer);
return recs;
}
public void write(GFxOutputStream sos) throws IOException {
sos.writeSI15(moveToX);
sos.writeSI15(moveToY);
sos.writeUI30(edges.length << 1);
for (int i = 0; i < edges.length; i++) {
edges[i].write(sos);
}
}
}
@@ -1,459 +1,459 @@
/*
* Copyright (C) 2010-2014 JPEXS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.jpexs.decompiler.flash.types.gfx;
import com.jpexs.decompiler.flash.types.shaperecords.CurvedEdgeRecord;
import com.jpexs.decompiler.flash.types.shaperecords.SHAPERECORD;
import com.jpexs.decompiler.flash.types.shaperecords.StraightEdgeRecord;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author JPEXS
*/
public class EdgeType implements Serializable {
private static final int sizes[] = new int[]{1, 2, 1, 2, 1, 2, 3, 4, 2, 3, 4, 5, 6, 7, 8, 9};
private static final int Edge_H12 = 0; // 2 bytes
private static final int Edge_H20 = 1; // 3 bytes
private static final int Edge_V12 = 2; // 2 bytes
private static final int Edge_V20 = 3; // 3 bytes
private static final int Edge_L6 = 4; // 2 bytes
private static final int Edge_L10 = 5; // 3 bytes
private static final int Edge_L14 = 6; // 4 bytes
private static final int Edge_L18 = 7; // 5 bytes
private static final int Edge_C5 = 8; // 3 bytes
private static final int Edge_C7 = 9; // 4 bytes
private static final int Edge_C9 = 10; // 5 bytes
private static final int Edge_C11 = 11; // 6 bytes
private static final int Edge_C13 = 12; // 7 bytes
private static final int Edge_C15 = 13; // 8 bytes
private static final int Edge_C17 = 14; // 9 bytes
private static final int Edge_C19 = 15; // 10 bytes
private static final int Edge_HLine = 0;
private static final int Edge_VLine = 1;
private static final int Edge_Line = 2;
private static final int Edge_Quad = 3;
public int data[];
public byte raw[];
public EdgeType(boolean vertical, int v) {
data = new int[]{vertical ? Edge_VLine : Edge_HLine, v};
calcRaw();
}
public EdgeType(int x, int y) {
data = new int[]{Edge_Line, x, y};
calcRaw();
}
public EdgeType(int cx, int cy, int ax, int ay) {
data = new int[]{Edge_Quad, cx, cy, ax, ay};
calcRaw();
}
private void calcRaw() {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GFxOutputStream sos = new GFxOutputStream(baos);
try {
write(sos);
} catch (IOException ex) {
Logger.getLogger(EdgeType.class.getName()).log(Level.SEVERE, null, ex);
}
raw = baos.toByteArray();
}
@Override
public String toString() {
String ret = "[Edge " + (raw[0] & 0xf) + " data:";
for (int i = 0; i < data.length; i++) {
if (i > 0) {
ret += ", ";
}
ret += "" + data[i];
}
ret += " raw: 0x";
for (int i = 0; i < raw.length; i++) {
if (i > 0) {
ret += "";
}
String h = Integer.toHexString(raw[i] & 0xff);
if (h.length() < 2) {
h = "0" + h;
}
ret += "" + h;
}
ret += "]";
return ret;
}
public EdgeType(GFxInputStream sis) throws IOException {
data = readEdge(sis);
/*if((raw[0]&0xf) == Edge_V20){
data[1] = 0;
}
if((raw[0]&0xf) == Edge_C17){
//System.out.println("========== 17 : "+toString()) ;
data[1] = 0;
data[2] = 0;
data[3] = 0;
data[4] = 0;
}*/
}
private byte[] readRawEdge(GFxInputStream sis) throws IOException {
int firstByte = sis.readUI8();
int nb = sizes[firstByte & 0xF];
byte ret[] = new byte[1 + nb];
ret[0] = (byte) firstByte;
int i;
for (i = 0; i < nb; i++) {
ret[i + 1] = (byte) sis.readUI8();
}
return ret;
}
private static int SInt8(int val) {
/*boolean sign = (val & 0x80) == 0x80;
val = val & 0x7F;
if (sign) {
val = -val;
}
return val;*/
return (byte) val;
}
public SHAPERECORD toSHAPERECORD() {
int multiplier = 1;
StraightEdgeRecord ser;
CurvedEdgeRecord cer;
switch (data[0]) {
case Edge_HLine:
ser = new StraightEdgeRecord();
ser.generalLineFlag = false;
ser.deltaX = data[1] * multiplier;
ser.calculateBits();
return ser;
case Edge_VLine:
ser = new StraightEdgeRecord();
ser.generalLineFlag = false;
ser.vertLineFlag = true;
ser.deltaY = data[1] * multiplier;
ser.calculateBits();
return ser;
case Edge_Line:
ser = new StraightEdgeRecord();
ser.generalLineFlag = true;
ser.deltaX = data[1] * multiplier;
ser.deltaY = data[2] * multiplier;
ser.calculateBits();
return ser;
case Edge_Quad:
cer = new CurvedEdgeRecord();
cer.controlDeltaX = data[1] * multiplier;
cer.controlDeltaY = data[2] * multiplier;
cer.anchorDeltaX = data[3] * multiplier;
cer.anchorDeltaY = data[4] * multiplier;
cer.calculateBits();
return cer;
}
return null;
}
private int[] readEdge(GFxInputStream sis) throws IOException {
raw = readRawEdge(sis);
int data[] = new int[5];
switch (raw[0] & 0xF) {
case Edge_H12:
data[0] = Edge_HLine;
data[1] = ((raw[0] & 0xff) >> 4) | (SInt8(raw[1] & 0xff) << 4);
break;
case Edge_H20:
data[0] = Edge_HLine;
data[1] = ((raw[0] & 0xff) >> 4) | ((raw[1] & 0xff) << 4) | (SInt8(raw[2] & 0xff) << 12);
break;
case Edge_V12:
data[0] = Edge_VLine;
data[1] = ((raw[0] & 0xff) >> 4) | (SInt8(raw[1] & 0xff) << 4);
break;
case Edge_V20:
data[0] = Edge_VLine;
data[1] = ((raw[0] & 0xff) >> 4) | ((raw[1] & 0xff) << 4) | (SInt8(raw[2] & 0xff) << 12);
break;
case Edge_L6:
data[0] = Edge_Line;
data[1] = ((raw[0] & 0xff) >> 4) | (SInt8((raw[1] & 0xff) << 6) >> 2);
data[2] = SInt8(raw[1] & 0xff) >> 2;
break;
case Edge_L10:
data[0] = Edge_Line;
data[1] = ((raw[0] & 0xff) >> 4) | (SInt8((raw[1] & 0xff) << 2) << 2);
data[2] = ((raw[1] & 0xff) >> 6) | (SInt8((raw[2] & 0xff)) << 2);
break;
case Edge_L14:
data[0] = Edge_Line;
data[1] = ((raw[0] & 0xff) >> 4) | ((raw[1] & 0xff) << 4) | (SInt8((raw[2] & 0xff) << 6) << 6);
data[2] = ((raw[2] & 0xff) >> 2) | (SInt8((raw[3] & 0xff)) << 6);
break;
case Edge_L18:
data[0] = Edge_Line;
data[1] = ((raw[0] & 0xff) >> 4) | ((raw[1] & 0xff) << 4) | (SInt8((raw[2] & 0xff) << 2) << 10);
data[2] = ((raw[2] & 0xff) >> 6) | ((raw[3] & 0xff) << 2) | (SInt8((raw[4] & 0xff)) << 10);
break;
case Edge_C5:
data[0] = Edge_Quad;
data[1] = ((raw[0] & 0xff) >> 4) | (SInt8((raw[1] & 0xff) << 7) >> 3);
data[2] = SInt8((raw[1] & 0xff) << 2) >> 3;
data[3] = ((raw[1] & 0xff) >> 6) | (SInt8((raw[2] & 0xff) << 5) >> 3);
data[4] = SInt8((raw[2] & 0xff)) >> 3;
break;
case Edge_C7:
data[0] = Edge_Quad;
data[1] = ((raw[0] & 0xff) >> 4) | (SInt8((raw[1] & 0xff) << 5) >> 1);
data[2] = ((raw[1] & 0xff) >> 3) | (SInt8((raw[2] & 0xff) << 6) >> 1);
data[3] = ((raw[2] & 0xff) >> 2) | (SInt8((raw[3] & 0xff) << 7) >> 1);
data[4] = SInt8(raw[3]) >> 1;
break;
case Edge_C9:
data[0] = Edge_Quad;
data[1] = ((raw[0] & 0xff) >> 4) | (SInt8((raw[1] & 0xff) << 3) << 1);
data[2] = ((raw[1] & 0xff) >> 5) | (SInt8((raw[2] & 0xff) << 2) << 1);
data[3] = ((raw[2] & 0xff) >> 6) | (SInt8((raw[3] & 0xff) << 1) << 1);
data[4] = ((raw[3] & 0xff) >> 7) | (SInt8(raw[4] & 0xff) << 1);
break;
case Edge_C11:
data[0] = Edge_Quad;
data[1] = ((raw[0] & 0xff) >> 4) | (SInt8((raw[1] & 0xff) << 1) << 3);
data[2] = (raw[1] >> 7) | ((raw[2] & 0xff) << 1) | (SInt8((raw[3] & 0xff) << 6) << 3);
data[3] = ((raw[3] & 0xff) >> 2) | (SInt8((raw[4] & 0xff) << 3) << 3);
data[4] = ((raw[4] & 0xff) >> 5) | (SInt8(raw[5] & 0xff) << 3);
break;
case Edge_C13:
data[0] = Edge_Quad;
data[1] = ((raw[0] & 0xff) >> 4) | ((raw[1] & 0xff) << 4) | (SInt8((raw[2] & 0xff) << 7) << 5);
data[2] = ((raw[2] & 0xff) >> 1) | (SInt8((raw[3] & 0xff) << 2) << 5);
data[3] = ((raw[3] & 0xff) >> 6) | ((raw[4] & 0xff) << 2) | (SInt8((raw[5] & 0xff) << 5) << 5);
data[4] = ((raw[5] & 0xff) >> 3) | (SInt8(raw[6] & 0xff) << 5);
break;
case Edge_C15:
data[0] = Edge_Quad;
data[1] = ((raw[0] & 0xff) >> 4) | ((raw[1] & 0xff) << 4) | (SInt8((raw[2] & 0xff) << 5) << 7);
data[2] = ((raw[2] & 0xff) >> 3) | ((raw[3] & 0xff) << 5) | (SInt8((raw[4] & 0xff) << 6) << 7);
data[3] = ((raw[4] & 0xff) >> 2) | ((raw[5] & 0xff) << 6) | (SInt8((raw[6] & 0xff) << 7) << 7);
data[4] = ((raw[6] & 0xff) >> 1) | (SInt8((raw[7] & 0xff)) << 7);
break;
case Edge_C17:
data[0] = Edge_Quad;
data[1] = ((raw[0] & 0xff) >> 4) | ((raw[1] & 0xff) << 4) | (SInt8((raw[2] & 0xff) << 3) << 9);
data[2] = ((raw[2] & 0xff) >> 5) | ((raw[3] & 0xff) << 3) | (SInt8((raw[4] & 0xff) << 2) << 9);
data[3] = ((raw[4] & 0xff) >> 6) | ((raw[5] & 0xff) << 2) | (SInt8((raw[6] & 0xff) << 1) << 9);
data[4] = ((raw[6] & 0xff) >> 7) | ((raw[7] & 0xff) << 1) | (SInt8(raw[8] & 0xff) << 9);
break;
case Edge_C19:
data[0] = Edge_Quad;
data[1] = ((raw[0] & 0xff) >> 4) | ((raw[1] & 0xff) << 4) | (SInt8(raw[2] << 1) << 11);
data[2] = ((raw[2] & 0xff) >> 7) | ((raw[3] & 0xff) << 1) | ((raw[4] & 0xff) << 9) | (SInt8(raw[5] << 6) << 11);
data[3] = ((raw[5] & 0xff) >> 2) | ((raw[6] & 0xff) << 6) | (SInt8(raw[7] << 3) << 11);
data[4] = ((raw[7] & 0xff) >> 5) | ((raw[8] & 0xff) << 3) | (SInt8(raw[9]) << 11);
break;
}
return data;
}
public void write(GFxOutputStream sos) throws IOException {
int x;
int y;
int m1 = 1;
int m2 = 3;
int m3 = 7;
int m4 = 0xF;
int m5 = 0x1F;
int m6 = 0x3F;
int m7 = 0x7F;
switch (data[0]) {
case Edge_HLine:
x = data[1];
if (x >= GFxOutputStream.MinSInt12 && x <= GFxOutputStream.MaxSInt12) {
sos.writeUI8((x << 4) | Edge_H12);
sos.writeUI8(x >> 4);
return;
}
sos.writeUI8((x << 4) | Edge_H20);
sos.writeUI8(x >> 4);
sos.writeUI8(x >> 12);
break;
case Edge_VLine:
y = data[1];
if (y >= GFxOutputStream.MinSInt12 && y <= GFxOutputStream.MaxSInt12) {
sos.writeUI8((y << 4) | Edge_V12);
sos.writeUI8(y >> 4);
return;
}
sos.writeUI8((y << 4) | Edge_V20);
sos.writeUI8(y >> 4);
sos.writeUI8(y >> 12);
return;
case Edge_Line:
x = data[1];
y = data[2];
if (x >= GFxOutputStream.MinSInt6 && x <= GFxOutputStream.MaxSInt6 && y >= GFxOutputStream.MinSInt6 && y <= GFxOutputStream.MaxSInt6) {
sos.writeUI8((x << 4) | Edge_L6);
sos.writeUI8(((x >> 4) & m2) | (y << 2));
return;
}
if (x >= GFxOutputStream.MinSInt10 && x <= GFxOutputStream.MaxSInt10 && y >= GFxOutputStream.MinSInt10 && y <= GFxOutputStream.MaxSInt10) {
sos.writeUI8((x << 4) | Edge_L10);
sos.writeUI8(((x >> 4) & m6) | (y << 6));
sos.writeUI8(y >> 2);
return;
}
if (x >= GFxOutputStream.MinSInt14 && x <= GFxOutputStream.MaxSInt14 && y >= GFxOutputStream.MinSInt14 && y <= GFxOutputStream.MaxSInt14) {
sos.writeUI8((x << 4) | Edge_L14);
sos.writeUI8(x >> 4);
sos.writeUI8(((x >> 12) & m2) | (y << 2));
sos.writeUI8(y >> 6);
return;
}
sos.writeUI8((x << 4) | Edge_L18);
sos.writeUI8(x >> 4);
sos.writeUI8(((x >> 12) & m6) | (y << 6));
sos.writeUI8(y >> 2);
sos.writeUI8(y >> 10);
return;
case Edge_Quad:
int cx = data[1];
int cy = data[2];
int ax = data[3];
int ay = data[4];
int minV = cx;
int maxV = cx;
if (cy < minV) {
minV = cy;
}
if (cy > maxV) {
maxV = cy;
}
if (ax < minV) {
minV = ax;
}
if (ax > maxV) {
maxV = ax;
}
if (ay < minV) {
minV = ay;
}
if (ay > maxV) {
maxV = ay;
}
if (minV >= GFxOutputStream.MinSInt5 && maxV <= GFxOutputStream.MaxSInt5) {
sos.writeUI8(((cx << 4) | Edge_C5));
sos.writeUI8((((cx >> 4) & m1) | ((cy << 1) & m6) | (ax << 6)));
sos.writeUI8((((ax >> 2) & m3) | (ay << 3)));
return;
}
if (minV >= GFxOutputStream.MinSInt7 && maxV <= GFxOutputStream.MaxSInt7) {
sos.writeUI8(((cx << 4) | Edge_C7));
sos.writeUI8((((cx >> 4) & m3) | (cy << 3)));
sos.writeUI8((((cy >> 5) & m2) | (ax << 2)));
sos.writeUI8((((ax >> 6) & m1) | (ay << 1)));
return;
}
if (minV >= GFxOutputStream.MinSInt9 && maxV <= GFxOutputStream.MaxSInt9) {
sos.writeUI8(((cx << 4) | Edge_C9));
sos.writeUI8((((cx >> 4) & m5) | (cy << 5)));
sos.writeUI8((((cy >> 3) & m6) | (ax << 6)));
sos.writeUI8((((ax >> 2) & m7) | (ay << 7)));
sos.writeUI8(((ay >> 1)));
return;
}
if (minV >= GFxOutputStream.MinSInt11 && maxV <= GFxOutputStream.MaxSInt11) {
sos.writeUI8(((cx << 4) | Edge_C11));
sos.writeUI8((((cx >> 4) & m7) | (cy << 7)));
sos.writeUI8(((cy >> 1)));
sos.writeUI8((((cy >> 9) & m2) | (ax << 2)));
sos.writeUI8((((ax >> 6) & m5) | (ay << 5)));
sos.writeUI8(((ay >> 3)));
return;
}
if (minV >= GFxOutputStream.MinSInt13 && maxV <= GFxOutputStream.MaxSInt13) {
sos.writeUI8(((cx << 4) | Edge_C13));
sos.writeUI8(((cx >> 4)));
sos.writeUI8((((cx >> 12) & m1) | (cy << 1)));
sos.writeUI8((((cy >> 7) & m6) | (ax << 6)));
sos.writeUI8(((ax >> 2)));
sos.writeUI8((((ax >> 10) & m3) | (ay << 3)));
sos.writeUI8(((ay >> 5)));
return;
}
if (minV >= GFxOutputStream.MinSInt15 && maxV <= GFxOutputStream.MaxSInt15) {
sos.writeUI8(((cx << 4) | Edge_C15));
sos.writeUI8(((cx >> 4)));
sos.writeUI8((((cx >> 12) & m3) | (cy << 3)));
sos.writeUI8(((cy >> 5)));
sos.writeUI8((((cy >> 13) & m2) | (ax << 2)));
sos.writeUI8(((ax >> 6)));
sos.writeUI8((((ax >> 14) & m1) | (ay << 1)));
sos.writeUI8(((ay >> 7)));
return;
}
if (minV >= GFxOutputStream.MinSInt17 && maxV <= GFxOutputStream.MaxSInt17) {
sos.writeUI8(((cx << 4) | Edge_C17));
sos.writeUI8(((cx >> 4)));
sos.writeUI8((((cx >> 12) & m5) | (cy << 5)));
sos.writeUI8(((cy >> 3)));
sos.writeUI8((((cy >> 11) & m6) | (ax << 6)));
sos.writeUI8(((ax >> 2)));
sos.writeUI8((((ax >> 10) & m7) | (ay << 7)));
sos.writeUI8(((ay >> 1)));
sos.writeUI8(((ay >> 9)));
return;
}
sos.writeUI8(((cx << 4) | Edge_C19));
sos.writeUI8(((cx >> 4)));
sos.writeUI8((((cx >> 12) & m7) | (cy << 7)));
sos.writeUI8(((cy >> 1)));
sos.writeUI8(((cy >> 9)));
sos.writeUI8((((cy >> 17) & m2) | (ax << 2)));
sos.writeUI8(((ax >> 6)));
sos.writeUI8((((ax >> 14) & m5) | (ay << 5)));
sos.writeUI8(((ay >> 3)));
sos.writeUI8(((ay >> 11)));
}
}
}
/*
* Copyright (C) 2010-2014 JPEXS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.jpexs.decompiler.flash.types.gfx;
import com.jpexs.decompiler.flash.types.shaperecords.CurvedEdgeRecord;
import com.jpexs.decompiler.flash.types.shaperecords.SHAPERECORD;
import com.jpexs.decompiler.flash.types.shaperecords.StraightEdgeRecord;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author JPEXS
*/
public class EdgeType implements Serializable {
private static final int sizes[] = new int[]{1, 2, 1, 2, 1, 2, 3, 4, 2, 3, 4, 5, 6, 7, 8, 9};
private static final int Edge_H12 = 0; // 2 bytes
private static final int Edge_H20 = 1; // 3 bytes
private static final int Edge_V12 = 2; // 2 bytes
private static final int Edge_V20 = 3; // 3 bytes
private static final int Edge_L6 = 4; // 2 bytes
private static final int Edge_L10 = 5; // 3 bytes
private static final int Edge_L14 = 6; // 4 bytes
private static final int Edge_L18 = 7; // 5 bytes
private static final int Edge_C5 = 8; // 3 bytes
private static final int Edge_C7 = 9; // 4 bytes
private static final int Edge_C9 = 10; // 5 bytes
private static final int Edge_C11 = 11; // 6 bytes
private static final int Edge_C13 = 12; // 7 bytes
private static final int Edge_C15 = 13; // 8 bytes
private static final int Edge_C17 = 14; // 9 bytes
private static final int Edge_C19 = 15; // 10 bytes
private static final int Edge_HLine = 0;
private static final int Edge_VLine = 1;
private static final int Edge_Line = 2;
private static final int Edge_Quad = 3;
public int data[];
public byte raw[];
public EdgeType(boolean vertical, int v) {
data = new int[]{vertical ? Edge_VLine : Edge_HLine, v};
calcRaw();
}
public EdgeType(int x, int y) {
data = new int[]{Edge_Line, x, y};
calcRaw();
}
public EdgeType(int cx, int cy, int ax, int ay) {
data = new int[]{Edge_Quad, cx, cy, ax, ay};
calcRaw();
}
private void calcRaw() {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GFxOutputStream sos = new GFxOutputStream(baos);
try {
write(sos);
} catch (IOException ex) {
Logger.getLogger(EdgeType.class.getName()).log(Level.SEVERE, null, ex);
}
raw = baos.toByteArray();
}
@Override
public String toString() {
String ret = "[Edge " + (raw[0] & 0xf) + " data:";
for (int i = 0; i < data.length; i++) {
if (i > 0) {
ret += ", ";
}
ret += "" + data[i];
}
ret += " raw: 0x";
for (int i = 0; i < raw.length; i++) {
if (i > 0) {
ret += "";
}
String h = Integer.toHexString(raw[i] & 0xff);
if (h.length() < 2) {
h = "0" + h;
}
ret += "" + h;
}
ret += "]";
return ret;
}
public EdgeType(GFxInputStream sis) throws IOException {
data = readEdge(sis);
/*if((raw[0]&0xf) == Edge_V20){
data[1] = 0;
}
if((raw[0]&0xf) == Edge_C17){
//System.out.println("========== 17 : "+toString()) ;
data[1] = 0;
data[2] = 0;
data[3] = 0;
data[4] = 0;
}*/
}
private byte[] readRawEdge(GFxInputStream sis) throws IOException {
int firstByte = sis.readUI8("firstByte");
int nb = sizes[firstByte & 0xF];
byte ret[] = new byte[1 + nb];
ret[0] = (byte) firstByte;
int i;
for (i = 0; i < nb; i++) {
ret[i + 1] = (byte) sis.readUI8("byte");
}
return ret;
}
private static int SInt8(int val) {
/*boolean sign = (val & 0x80) == 0x80;
val = val & 0x7F;
if (sign) {
val = -val;
}
return val;*/
return (byte) val;
}
public SHAPERECORD toSHAPERECORD() {
int multiplier = 1;
StraightEdgeRecord ser;
CurvedEdgeRecord cer;
switch (data[0]) {
case Edge_HLine:
ser = new StraightEdgeRecord();
ser.generalLineFlag = false;
ser.deltaX = data[1] * multiplier;
ser.calculateBits();
return ser;
case Edge_VLine:
ser = new StraightEdgeRecord();
ser.generalLineFlag = false;
ser.vertLineFlag = true;
ser.deltaY = data[1] * multiplier;
ser.calculateBits();
return ser;
case Edge_Line:
ser = new StraightEdgeRecord();
ser.generalLineFlag = true;
ser.deltaX = data[1] * multiplier;
ser.deltaY = data[2] * multiplier;
ser.calculateBits();
return ser;
case Edge_Quad:
cer = new CurvedEdgeRecord();
cer.controlDeltaX = data[1] * multiplier;
cer.controlDeltaY = data[2] * multiplier;
cer.anchorDeltaX = data[3] * multiplier;
cer.anchorDeltaY = data[4] * multiplier;
cer.calculateBits();
return cer;
}
return null;
}
private int[] readEdge(GFxInputStream sis) throws IOException {
raw = readRawEdge(sis);
int data[] = new int[5];
switch (raw[0] & 0xF) {
case Edge_H12:
data[0] = Edge_HLine;
data[1] = ((raw[0] & 0xff) >> 4) | (SInt8(raw[1] & 0xff) << 4);
break;
case Edge_H20:
data[0] = Edge_HLine;
data[1] = ((raw[0] & 0xff) >> 4) | ((raw[1] & 0xff) << 4) | (SInt8(raw[2] & 0xff) << 12);
break;
case Edge_V12:
data[0] = Edge_VLine;
data[1] = ((raw[0] & 0xff) >> 4) | (SInt8(raw[1] & 0xff) << 4);
break;
case Edge_V20:
data[0] = Edge_VLine;
data[1] = ((raw[0] & 0xff) >> 4) | ((raw[1] & 0xff) << 4) | (SInt8(raw[2] & 0xff) << 12);
break;
case Edge_L6:
data[0] = Edge_Line;
data[1] = ((raw[0] & 0xff) >> 4) | (SInt8((raw[1] & 0xff) << 6) >> 2);
data[2] = SInt8(raw[1] & 0xff) >> 2;
break;
case Edge_L10:
data[0] = Edge_Line;
data[1] = ((raw[0] & 0xff) >> 4) | (SInt8((raw[1] & 0xff) << 2) << 2);
data[2] = ((raw[1] & 0xff) >> 6) | (SInt8((raw[2] & 0xff)) << 2);
break;
case Edge_L14:
data[0] = Edge_Line;
data[1] = ((raw[0] & 0xff) >> 4) | ((raw[1] & 0xff) << 4) | (SInt8((raw[2] & 0xff) << 6) << 6);
data[2] = ((raw[2] & 0xff) >> 2) | (SInt8((raw[3] & 0xff)) << 6);
break;
case Edge_L18:
data[0] = Edge_Line;
data[1] = ((raw[0] & 0xff) >> 4) | ((raw[1] & 0xff) << 4) | (SInt8((raw[2] & 0xff) << 2) << 10);
data[2] = ((raw[2] & 0xff) >> 6) | ((raw[3] & 0xff) << 2) | (SInt8((raw[4] & 0xff)) << 10);
break;
case Edge_C5:
data[0] = Edge_Quad;
data[1] = ((raw[0] & 0xff) >> 4) | (SInt8((raw[1] & 0xff) << 7) >> 3);
data[2] = SInt8((raw[1] & 0xff) << 2) >> 3;
data[3] = ((raw[1] & 0xff) >> 6) | (SInt8((raw[2] & 0xff) << 5) >> 3);
data[4] = SInt8((raw[2] & 0xff)) >> 3;
break;
case Edge_C7:
data[0] = Edge_Quad;
data[1] = ((raw[0] & 0xff) >> 4) | (SInt8((raw[1] & 0xff) << 5) >> 1);
data[2] = ((raw[1] & 0xff) >> 3) | (SInt8((raw[2] & 0xff) << 6) >> 1);
data[3] = ((raw[2] & 0xff) >> 2) | (SInt8((raw[3] & 0xff) << 7) >> 1);
data[4] = SInt8(raw[3]) >> 1;
break;
case Edge_C9:
data[0] = Edge_Quad;
data[1] = ((raw[0] & 0xff) >> 4) | (SInt8((raw[1] & 0xff) << 3) << 1);
data[2] = ((raw[1] & 0xff) >> 5) | (SInt8((raw[2] & 0xff) << 2) << 1);
data[3] = ((raw[2] & 0xff) >> 6) | (SInt8((raw[3] & 0xff) << 1) << 1);
data[4] = ((raw[3] & 0xff) >> 7) | (SInt8(raw[4] & 0xff) << 1);
break;
case Edge_C11:
data[0] = Edge_Quad;
data[1] = ((raw[0] & 0xff) >> 4) | (SInt8((raw[1] & 0xff) << 1) << 3);
data[2] = (raw[1] >> 7) | ((raw[2] & 0xff) << 1) | (SInt8((raw[3] & 0xff) << 6) << 3);
data[3] = ((raw[3] & 0xff) >> 2) | (SInt8((raw[4] & 0xff) << 3) << 3);
data[4] = ((raw[4] & 0xff) >> 5) | (SInt8(raw[5] & 0xff) << 3);
break;
case Edge_C13:
data[0] = Edge_Quad;
data[1] = ((raw[0] & 0xff) >> 4) | ((raw[1] & 0xff) << 4) | (SInt8((raw[2] & 0xff) << 7) << 5);
data[2] = ((raw[2] & 0xff) >> 1) | (SInt8((raw[3] & 0xff) << 2) << 5);
data[3] = ((raw[3] & 0xff) >> 6) | ((raw[4] & 0xff) << 2) | (SInt8((raw[5] & 0xff) << 5) << 5);
data[4] = ((raw[5] & 0xff) >> 3) | (SInt8(raw[6] & 0xff) << 5);
break;
case Edge_C15:
data[0] = Edge_Quad;
data[1] = ((raw[0] & 0xff) >> 4) | ((raw[1] & 0xff) << 4) | (SInt8((raw[2] & 0xff) << 5) << 7);
data[2] = ((raw[2] & 0xff) >> 3) | ((raw[3] & 0xff) << 5) | (SInt8((raw[4] & 0xff) << 6) << 7);
data[3] = ((raw[4] & 0xff) >> 2) | ((raw[5] & 0xff) << 6) | (SInt8((raw[6] & 0xff) << 7) << 7);
data[4] = ((raw[6] & 0xff) >> 1) | (SInt8((raw[7] & 0xff)) << 7);
break;
case Edge_C17:
data[0] = Edge_Quad;
data[1] = ((raw[0] & 0xff) >> 4) | ((raw[1] & 0xff) << 4) | (SInt8((raw[2] & 0xff) << 3) << 9);
data[2] = ((raw[2] & 0xff) >> 5) | ((raw[3] & 0xff) << 3) | (SInt8((raw[4] & 0xff) << 2) << 9);
data[3] = ((raw[4] & 0xff) >> 6) | ((raw[5] & 0xff) << 2) | (SInt8((raw[6] & 0xff) << 1) << 9);
data[4] = ((raw[6] & 0xff) >> 7) | ((raw[7] & 0xff) << 1) | (SInt8(raw[8] & 0xff) << 9);
break;
case Edge_C19:
data[0] = Edge_Quad;
data[1] = ((raw[0] & 0xff) >> 4) | ((raw[1] & 0xff) << 4) | (SInt8(raw[2] << 1) << 11);
data[2] = ((raw[2] & 0xff) >> 7) | ((raw[3] & 0xff) << 1) | ((raw[4] & 0xff) << 9) | (SInt8(raw[5] << 6) << 11);
data[3] = ((raw[5] & 0xff) >> 2) | ((raw[6] & 0xff) << 6) | (SInt8(raw[7] << 3) << 11);
data[4] = ((raw[7] & 0xff) >> 5) | ((raw[8] & 0xff) << 3) | (SInt8(raw[9]) << 11);
break;
}
return data;
}
public void write(GFxOutputStream sos) throws IOException {
int x;
int y;
int m1 = 1;
int m2 = 3;
int m3 = 7;
int m4 = 0xF;
int m5 = 0x1F;
int m6 = 0x3F;
int m7 = 0x7F;
switch (data[0]) {
case Edge_HLine:
x = data[1];
if (x >= GFxOutputStream.MinSInt12 && x <= GFxOutputStream.MaxSInt12) {
sos.writeUI8((x << 4) | Edge_H12);
sos.writeUI8(x >> 4);
return;
}
sos.writeUI8((x << 4) | Edge_H20);
sos.writeUI8(x >> 4);
sos.writeUI8(x >> 12);
break;
case Edge_VLine:
y = data[1];
if (y >= GFxOutputStream.MinSInt12 && y <= GFxOutputStream.MaxSInt12) {
sos.writeUI8((y << 4) | Edge_V12);
sos.writeUI8(y >> 4);
return;
}
sos.writeUI8((y << 4) | Edge_V20);
sos.writeUI8(y >> 4);
sos.writeUI8(y >> 12);
return;
case Edge_Line:
x = data[1];
y = data[2];
if (x >= GFxOutputStream.MinSInt6 && x <= GFxOutputStream.MaxSInt6 && y >= GFxOutputStream.MinSInt6 && y <= GFxOutputStream.MaxSInt6) {
sos.writeUI8((x << 4) | Edge_L6);
sos.writeUI8(((x >> 4) & m2) | (y << 2));
return;
}
if (x >= GFxOutputStream.MinSInt10 && x <= GFxOutputStream.MaxSInt10 && y >= GFxOutputStream.MinSInt10 && y <= GFxOutputStream.MaxSInt10) {
sos.writeUI8((x << 4) | Edge_L10);
sos.writeUI8(((x >> 4) & m6) | (y << 6));
sos.writeUI8(y >> 2);
return;
}
if (x >= GFxOutputStream.MinSInt14 && x <= GFxOutputStream.MaxSInt14 && y >= GFxOutputStream.MinSInt14 && y <= GFxOutputStream.MaxSInt14) {
sos.writeUI8((x << 4) | Edge_L14);
sos.writeUI8(x >> 4);
sos.writeUI8(((x >> 12) & m2) | (y << 2));
sos.writeUI8(y >> 6);
return;
}
sos.writeUI8((x << 4) | Edge_L18);
sos.writeUI8(x >> 4);
sos.writeUI8(((x >> 12) & m6) | (y << 6));
sos.writeUI8(y >> 2);
sos.writeUI8(y >> 10);
return;
case Edge_Quad:
int cx = data[1];
int cy = data[2];
int ax = data[3];
int ay = data[4];
int minV = cx;
int maxV = cx;
if (cy < minV) {
minV = cy;
}
if (cy > maxV) {
maxV = cy;
}
if (ax < minV) {
minV = ax;
}
if (ax > maxV) {
maxV = ax;
}
if (ay < minV) {
minV = ay;
}
if (ay > maxV) {
maxV = ay;
}
if (minV >= GFxOutputStream.MinSInt5 && maxV <= GFxOutputStream.MaxSInt5) {
sos.writeUI8(((cx << 4) | Edge_C5));
sos.writeUI8((((cx >> 4) & m1) | ((cy << 1) & m6) | (ax << 6)));
sos.writeUI8((((ax >> 2) & m3) | (ay << 3)));
return;
}
if (minV >= GFxOutputStream.MinSInt7 && maxV <= GFxOutputStream.MaxSInt7) {
sos.writeUI8(((cx << 4) | Edge_C7));
sos.writeUI8((((cx >> 4) & m3) | (cy << 3)));
sos.writeUI8((((cy >> 5) & m2) | (ax << 2)));
sos.writeUI8((((ax >> 6) & m1) | (ay << 1)));
return;
}
if (minV >= GFxOutputStream.MinSInt9 && maxV <= GFxOutputStream.MaxSInt9) {
sos.writeUI8(((cx << 4) | Edge_C9));
sos.writeUI8((((cx >> 4) & m5) | (cy << 5)));
sos.writeUI8((((cy >> 3) & m6) | (ax << 6)));
sos.writeUI8((((ax >> 2) & m7) | (ay << 7)));
sos.writeUI8(((ay >> 1)));
return;
}
if (minV >= GFxOutputStream.MinSInt11 && maxV <= GFxOutputStream.MaxSInt11) {
sos.writeUI8(((cx << 4) | Edge_C11));
sos.writeUI8((((cx >> 4) & m7) | (cy << 7)));
sos.writeUI8(((cy >> 1)));
sos.writeUI8((((cy >> 9) & m2) | (ax << 2)));
sos.writeUI8((((ax >> 6) & m5) | (ay << 5)));
sos.writeUI8(((ay >> 3)));
return;
}
if (minV >= GFxOutputStream.MinSInt13 && maxV <= GFxOutputStream.MaxSInt13) {
sos.writeUI8(((cx << 4) | Edge_C13));
sos.writeUI8(((cx >> 4)));
sos.writeUI8((((cx >> 12) & m1) | (cy << 1)));
sos.writeUI8((((cy >> 7) & m6) | (ax << 6)));
sos.writeUI8(((ax >> 2)));
sos.writeUI8((((ax >> 10) & m3) | (ay << 3)));
sos.writeUI8(((ay >> 5)));
return;
}
if (minV >= GFxOutputStream.MinSInt15 && maxV <= GFxOutputStream.MaxSInt15) {
sos.writeUI8(((cx << 4) | Edge_C15));
sos.writeUI8(((cx >> 4)));
sos.writeUI8((((cx >> 12) & m3) | (cy << 3)));
sos.writeUI8(((cy >> 5)));
sos.writeUI8((((cy >> 13) & m2) | (ax << 2)));
sos.writeUI8(((ax >> 6)));
sos.writeUI8((((ax >> 14) & m1) | (ay << 1)));
sos.writeUI8(((ay >> 7)));
return;
}
if (minV >= GFxOutputStream.MinSInt17 && maxV <= GFxOutputStream.MaxSInt17) {
sos.writeUI8(((cx << 4) | Edge_C17));
sos.writeUI8(((cx >> 4)));
sos.writeUI8((((cx >> 12) & m5) | (cy << 5)));
sos.writeUI8(((cy >> 3)));
sos.writeUI8((((cy >> 11) & m6) | (ax << 6)));
sos.writeUI8(((ax >> 2)));
sos.writeUI8((((ax >> 10) & m7) | (ay << 7)));
sos.writeUI8(((ay >> 1)));
sos.writeUI8(((ay >> 9)));
return;
}
sos.writeUI8(((cx << 4) | Edge_C19));
sos.writeUI8(((cx >> 4)));
sos.writeUI8((((cx >> 12) & m7) | (cy << 7)));
sos.writeUI8(((cy >> 1)));
sos.writeUI8(((cy >> 9)));
sos.writeUI8((((cy >> 17) & m2) | (ax << 2)));
sos.writeUI8(((ax >> 6)));
sos.writeUI8((((ax >> 14) & m5) | (ay << 5)));
sos.writeUI8(((ay >> 3)));
sos.writeUI8(((ay >> 11)));
}
}
}
@@ -1,52 +1,52 @@
/*
* Copyright (C) 2010-2014 JPEXS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.jpexs.decompiler.flash.types.gfx;
import java.io.IOException;
import java.io.Serializable;
/**
*
* @author JPEXS
*/
public class FONTINFO implements Serializable {
public int fontId;
public GLYPHIDX glyphIndices[];
public FONTINFO(int fontId, int numGlyphs, GLYPHIDX[] glyphIndices) {
this.fontId = fontId;
this.glyphIndices = glyphIndices;
}
public FONTINFO(GFxInputStream sis) throws IOException {
fontId = sis.readUI16();
int numGlyphs = sis.readUI16();
glyphIndices = new GLYPHIDX[numGlyphs];
for (int i = 0; i < numGlyphs; i++) {
glyphIndices[i] = new GLYPHIDX(sis);
}
}
public void write(GFxOutputStream sos) throws IOException {
sos.writeUI16(fontId);
sos.writeUI16(glyphIndices.length);
for (int i = 0; i < glyphIndices.length; i++) {
glyphIndices[i].write(sos);
}
}
}
/*
* Copyright (C) 2010-2014 JPEXS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.jpexs.decompiler.flash.types.gfx;
import java.io.IOException;
import java.io.Serializable;
/**
*
* @author JPEXS
*/
public class FONTINFO implements Serializable {
public int fontId;
public GLYPHIDX glyphIndices[];
public FONTINFO(int fontId, int numGlyphs, GLYPHIDX[] glyphIndices) {
this.fontId = fontId;
this.glyphIndices = glyphIndices;
}
public FONTINFO(GFxInputStream sis) throws IOException {
fontId = sis.readUI16("fontId");
int numGlyphs = sis.readUI16("numGlyphs");
glyphIndices = new GLYPHIDX[numGlyphs];
for (int i = 0; i < numGlyphs; i++) {
glyphIndices[i] = new GLYPHIDX(sis);
}
}
public void write(GFxOutputStream sos) throws IOException {
sos.writeUI16(fontId);
sos.writeUI16(glyphIndices.length);
for (int i = 0; i < glyphIndices.length; i++) {
glyphIndices[i].write(sos);
}
}
}
@@ -42,14 +42,14 @@ public class FontType implements Serializable {
public List<KerningPairType> kerning;
public FontType(GFxInputStream sis) throws IOException {
fontName = sis.readString();
flags = sis.readUI16();
nominalSize = sis.readUI16();
ascent = sis.readSI16();
descent = sis.readSI16();
leading = sis.readSI16();
long numGlyphs = sis.readUI32();
long glyphBytesLen = sis.readUI32();
fontName = sis.readString("fontName");
flags = sis.readUI16("flags");
nominalSize = sis.readUI16("nominalSize");
ascent = sis.readSI16("ascent");
descent = sis.readSI16("descent");
leading = sis.readSI16("leading");
long numGlyphs = sis.readUI32("numGlyphs");
long glyphBytesLen = sis.readUI32("glyphBytesLen");
byte glyphBytes[] = new byte[(int) glyphBytesLen];
sis.read(glyphBytes);
glyphInfo = new ArrayList<>();
@@ -57,7 +57,7 @@ public class FontType implements Serializable {
glyphInfo.add(new GlyphInfoType(sis));
}
long kerningTableSize = sis.readUI30();
long kerningTableSize = sis.readUI30("kerningTableSize");
kerning = new ArrayList<>();
for (int i = 0; i < kerningTableSize; i++) {
kerning.add(new KerningPairType(sis));
@@ -16,6 +16,7 @@
*/
package com.jpexs.decompiler.flash.types.gfx;
import com.jpexs.decompiler.flash.dumpview.DumpInfo;
import com.jpexs.helpers.MemoryInputStream;
import com.jpexs.helpers.utf8.Utf8Helper;
import java.io.ByteArrayOutputStream;
@@ -29,11 +30,36 @@ public class GFxInputStream {
private final MemoryInputStream is;
private static final int MaxUInt7 = (1 << 7) - 1;
public DumpInfo dumpInfo;
public GFxInputStream(MemoryInputStream is) {
this.is = is;
}
public DumpInfo newDumpLevel(String name, String type) {
if (dumpInfo != null) {
long startByte = is.getPos();
DumpInfo di = new DumpInfo(name, type, null, startByte, 0, 0, 0);
di.parent = dumpInfo;
dumpInfo.getChildInfos().add(di);
dumpInfo = di;
}
return dumpInfo;
}
public void endDumpLevel() {
endDumpLevel(null);
}
public void endDumpLevel(Object value) {
if (dumpInfo != null) {
dumpInfo.lengthBytes = is.getPos() - dumpInfo.startByte;
dumpInfo.previewValue = value;
dumpInfo = dumpInfo.parent;
}
}
public int available() throws IOException {
return is.available();
}
@@ -46,16 +72,22 @@ public class GFxInputStream {
return is.getPos();
}
public int read() throws IOException {
private int read() throws IOException {
return is.read();
}
public int readUI8() throws IOException {
return read();
public int readUI8(String name) throws IOException {
newDumpLevel(name, "UI8");
int ret = read();
endDumpLevel(ret);
return ret;
}
public int readUI16() throws IOException {
return read() + (read() << 8);
public int readUI16(String name) throws IOException {
newDumpLevel(name, "UI8");
int ret = read() + (read() << 8);
endDumpLevel(ret);
return ret;
}
/**
@@ -64,81 +96,109 @@ public class GFxInputStream {
* @return SI16 value
* @throws IOException
*/
public int readSI16() throws IOException {
public int readSI16(String name) throws IOException {
newDumpLevel(name, "SI16");
int uval = read() + (read() << 8);
if (uval >= 0x8000) {
return -(((~uval) & 0xffff) + 1);
} else {
return uval;
uval = -(((~uval) & 0xffff) + 1);
}
endDumpLevel(uval);
return uval;
}
public long readUI32() throws IOException {
return (read() + (read() << 8) + (read() << 16) + (read() << 24)) & 0xffffffff;
private long readUI32Internal() throws IOException {
long ret = (read() + (read() << 8) + (read() << 16) + (read() << 24)) & 0xffffffff;
return ret;
}
public long readUI30() throws IOException {
public long readUI32(String name) throws IOException {
newDumpLevel(name, "UI32");
long ret = readUI32Internal();
endDumpLevel(ret);
return ret;
}
public long readUI30(String name) throws IOException {
newDumpLevel(name, "UI30");
long v;
int tb = readUI8();
int tb = read();
long t = tb;
switch (tb & 3) {
case 0:
v = t >> 2;
endDumpLevel(v);
return v;
case 1:
t >>= 2;
v = t | (readUI8() << 6);
v = t | (read() << 6);
endDumpLevel(v);
return v;
case 2:
t >>= 2;
t |= (readUI8() << 6);
v = t | (readUI8() << 14);
t |= (read() << 6);
v = t | (read() << 14);
endDumpLevel(v);
return v;
}
t >>= 2;
t |= (readUI8() << 6);
t |= (readUI8() << 14);
v = t | (readUI8() << 22);
t |= (read() << 6);
t |= (read() << 14);
v = t | (read() << 22);
endDumpLevel(v);
return v;
}
public float readFLOAT() throws IOException {
int val = (int) readUI32();
public float readFLOAT(String name) throws IOException {
newDumpLevel(name, "UI32");
int val = (int) readUI32Internal();
float ret = Float.intBitsToFloat(val);
endDumpLevel(ret);
return ret;
}
public int readSI8() throws IOException {
int uval = read();
if (uval >= 0x80) {
return -(((~uval) & 0xff) + 1);
} else {
return uval;
}
public int readSI8(String name) throws IOException {
newDumpLevel(name, "SI8");
int uval = readSI8Internal();
endDumpLevel(uval);
return uval;
}
public int readSI15() throws IOException {
int t = readSI8();
private int readSI8Internal() throws IOException {
int uval = read();
if (uval >= 0x80) {
uval = -(((~uval) & 0xff) + 1);
}
return uval;
}
public int readSI15(String name) throws IOException {
newDumpLevel(name, "SI15");
int t = readSI8Internal();
int v;
if ((t & 1) == 0) {
v = t >> 1;
endDumpLevel(v);
return v;
}
t = ((t >> 1) & MaxUInt7);
v = (t | (readSI8() << 7));
v = (t | (readSI8Internal() << 7));
endDumpLevel(v);
return v;
}
public int readUI15() throws IOException {
int t = readUI8();
public int readUI15(String name) throws IOException {
newDumpLevel(name, "UI15");
int t = read();
int v;
if ((t & 1) == 0) {
v = t >> 1;
endDumpLevel(v);
return v;
}
t = (t >> 1);
v = (t | (readUI8() << 7));
v = (t | (read() << 7));
endDumpLevel(v);
return v;
}
@@ -149,14 +209,16 @@ public class GFxInputStream {
* @return Array of read bytes
* @throws IOException
*/
public byte[] readBytes(long count) throws IOException {
public byte[] readBytes(long count, String name) throws IOException {
if (count <= 0) {
return new byte[0];
}
newDumpLevel(name, "bytes");
byte[] ret = new byte[(int) count];
for (int i = 0; i < count; i++) {
ret[i] = (byte) read();
}
endDumpLevel();
return ret;
}
@@ -170,13 +232,16 @@ public class GFxInputStream {
* @return String value
* @throws IOException
*/
public String readString() throws IOException {
public String readString(String name) throws IOException {
newDumpLevel(name, "string");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int r;
while (true) {
r = readUI8();
r = read();
if (r == 0) {
return new String(baos.toByteArray(), Utf8Helper.charset);
String res = new String(baos.toByteArray(), Utf8Helper.charset);
endDumpLevel(res);
return res;
}
baos.write(r);
}
@@ -1,45 +1,45 @@
/*
* Copyright (C) 2010-2014 JPEXS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.jpexs.decompiler.flash.types.gfx;
import java.io.IOException;
import java.io.Serializable;
/**
*
* @author JPEXS
*/
public class GLYPHIDX implements Serializable {
public int indexInFont;
public int indexInTexture;
public GLYPHIDX(int indexInFont, int indexInTexture) {
this.indexInFont = indexInFont;
this.indexInTexture = indexInTexture;
}
public GLYPHIDX(GFxInputStream sis) throws IOException {
this.indexInFont = sis.readUI16();
this.indexInTexture = sis.readUI16();
}
public void write(GFxOutputStream sos) throws IOException {
sos.writeUI16(indexInFont);
sos.writeUI16(indexInTexture);
}
}
/*
* Copyright (C) 2010-2014 JPEXS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.jpexs.decompiler.flash.types.gfx;
import java.io.IOException;
import java.io.Serializable;
/**
*
* @author JPEXS
*/
public class GLYPHIDX implements Serializable {
public int indexInFont;
public int indexInTexture;
public GLYPHIDX(int indexInFont, int indexInTexture) {
this.indexInFont = indexInFont;
this.indexInTexture = indexInTexture;
}
public GLYPHIDX(GFxInputStream sis) throws IOException {
this.indexInFont = sis.readUI16("indexInFont");
this.indexInTexture = sis.readUI16("indexInTexture");
}
public void write(GFxOutputStream sos) throws IOException {
sos.writeUI16(indexInFont);
sos.writeUI16(indexInTexture);
}
}
@@ -1,49 +1,49 @@
/*
* Copyright (C) 2010-2014 JPEXS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.jpexs.decompiler.flash.types.gfx;
import java.io.IOException;
import java.io.Serializable;
/**
*
* @author JPEXS
*/
public class GlyphInfoType implements Serializable {
public int glyphCode;
public int advanceX;
public long globalOffset;
public GlyphInfoType(int glyphCode, int advance, int glyphPos) {
this.glyphCode = glyphCode;
this.advanceX = advance;
this.globalOffset = glyphPos;
}
public GlyphInfoType(GFxInputStream sis) throws IOException {
this.glyphCode = sis.readUI16();
this.advanceX = sis.readSI16();
this.globalOffset = sis.readUI32();
}
public void write(GFxOutputStream sos) throws IOException {
sos.writeUI16(glyphCode);
sos.writeSI16(advanceX);
sos.writeUI32(globalOffset);
}
}
/*
* Copyright (C) 2010-2014 JPEXS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.jpexs.decompiler.flash.types.gfx;
import java.io.IOException;
import java.io.Serializable;
/**
*
* @author JPEXS
*/
public class GlyphInfoType implements Serializable {
public int glyphCode;
public int advanceX;
public long globalOffset;
public GlyphInfoType(int glyphCode, int advance, int glyphPos) {
this.glyphCode = glyphCode;
this.advanceX = advance;
this.globalOffset = glyphPos;
}
public GlyphInfoType(GFxInputStream sis) throws IOException {
this.glyphCode = sis.readUI16("glyphCode");
this.advanceX = sis.readSI16("advanceX");
this.globalOffset = sis.readUI32("globalOffset");
}
public void write(GFxOutputStream sos) throws IOException {
sos.writeUI16(glyphCode);
sos.writeSI16(advanceX);
sos.writeUI32(globalOffset);
}
}
@@ -1,104 +1,104 @@
/*
* Copyright (C) 2010-2014 JPEXS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.jpexs.decompiler.flash.types.gfx;
import com.jpexs.decompiler.flash.types.RECT;
import com.jpexs.decompiler.flash.types.SHAPE;
import com.jpexs.decompiler.flash.types.shaperecords.EndShapeRecord;
import com.jpexs.decompiler.flash.types.shaperecords.SHAPERECORD;
import com.jpexs.decompiler.flash.types.shaperecords.StyleChangeRecord;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author JPEXS
*/
public class GlyphType implements Serializable {
public int[] boundingBox;
public ContourType[] contours;
public GlyphType(List<SHAPERECORD> records) {
RECT bounds = SHAPERECORD.getBounds(records);
boundingBox = new int[4];
boundingBox[0] = bounds.Xmin;
boundingBox[1] = bounds.Ymin;
boundingBox[2] = bounds.Xmax;
boundingBox[3] = bounds.Ymax;
List<SHAPERECORD> cont = new ArrayList<>();
List<ContourType> contoursList = new ArrayList<>();
for (int i = 0; i < records.size(); i++) {
SHAPERECORD r = records.get(i);
if ((r instanceof StyleChangeRecord) && ((StyleChangeRecord) r).stateMoveTo) {
if (!cont.isEmpty()) {
contoursList.add(new ContourType(cont));
cont.clear();
}
}
cont.add(r);
}
if (!cont.isEmpty()) {
contoursList.add(new ContourType(cont));
cont.clear();
}
contours = contoursList.toArray(new ContourType[contoursList.size()]);
}
public GlyphType(GFxInputStream sis) throws IOException {
boundingBox = new int[4];
for (int i = 0; i < 4; i++) {
boundingBox[i] = sis.readSI15();
}
int numContours = sis.readUI15();
contours = new ContourType[numContours];
for (int i = 0; i < numContours; i++) {
contours[i] = new ContourType(sis);
}
}
public SHAPE toSHAPE() {
SHAPE shp = new SHAPE();
shp.numFillBits = 1;
shp.numLineBits = 0;
List<SHAPERECORD> recs = new ArrayList<>();
StyleChangeRecord scr = new StyleChangeRecord();
scr.fillStyle0 = 0;
scr.fillStyle1 = 1;
scr.stateFillStyle1 = true;
scr.stateFillStyle0 = false;
recs.add(scr);
for (ContourType cnt : contours) {
recs.addAll(cnt.toSHAPERECORDS());
}
recs.add(new EndShapeRecord());
shp.shapeRecords = recs;
return shp;
}
public void write(GFxOutputStream sos) throws IOException {
for (int b : boundingBox) {
sos.writeSI15(b);
}
sos.writeUI15(contours.length);
for (ContourType cnt : contours) {
cnt.write(sos);
}
}
}
/*
* Copyright (C) 2010-2014 JPEXS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.jpexs.decompiler.flash.types.gfx;
import com.jpexs.decompiler.flash.types.RECT;
import com.jpexs.decompiler.flash.types.SHAPE;
import com.jpexs.decompiler.flash.types.shaperecords.EndShapeRecord;
import com.jpexs.decompiler.flash.types.shaperecords.SHAPERECORD;
import com.jpexs.decompiler.flash.types.shaperecords.StyleChangeRecord;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author JPEXS
*/
public class GlyphType implements Serializable {
public int[] boundingBox;
public ContourType[] contours;
public GlyphType(List<SHAPERECORD> records) {
RECT bounds = SHAPERECORD.getBounds(records);
boundingBox = new int[4];
boundingBox[0] = bounds.Xmin;
boundingBox[1] = bounds.Ymin;
boundingBox[2] = bounds.Xmax;
boundingBox[3] = bounds.Ymax;
List<SHAPERECORD> cont = new ArrayList<>();
List<ContourType> contoursList = new ArrayList<>();
for (int i = 0; i < records.size(); i++) {
SHAPERECORD r = records.get(i);
if ((r instanceof StyleChangeRecord) && ((StyleChangeRecord) r).stateMoveTo) {
if (!cont.isEmpty()) {
contoursList.add(new ContourType(cont));
cont.clear();
}
}
cont.add(r);
}
if (!cont.isEmpty()) {
contoursList.add(new ContourType(cont));
cont.clear();
}
contours = contoursList.toArray(new ContourType[contoursList.size()]);
}
public GlyphType(GFxInputStream sis) throws IOException {
boundingBox = new int[4];
for (int i = 0; i < 4; i++) {
boundingBox[i] = sis.readSI15("boundingBox");
}
int numContours = sis.readUI15("numContours");
contours = new ContourType[numContours];
for (int i = 0; i < numContours; i++) {
contours[i] = new ContourType(sis);
}
}
public SHAPE toSHAPE() {
SHAPE shp = new SHAPE();
shp.numFillBits = 1;
shp.numLineBits = 0;
List<SHAPERECORD> recs = new ArrayList<>();
StyleChangeRecord scr = new StyleChangeRecord();
scr.fillStyle0 = 0;
scr.fillStyle1 = 1;
scr.stateFillStyle1 = true;
scr.stateFillStyle0 = false;
recs.add(scr);
for (ContourType cnt : contours) {
recs.addAll(cnt.toSHAPERECORDS());
}
recs.add(new EndShapeRecord());
shp.shapeRecords = recs;
return shp;
}
public void write(GFxOutputStream sos) throws IOException {
for (int b : boundingBox) {
sos.writeSI15(b);
}
sos.writeUI15(contours.length);
for (ContourType cnt : contours) {
cnt.write(sos);
}
}
}
@@ -1,49 +1,49 @@
/*
* Copyright (C) 2010-2014 JPEXS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.jpexs.decompiler.flash.types.gfx;
import java.io.IOException;
import java.io.Serializable;
/**
*
* @author JPEXS
*/
public class KerningPairType implements Serializable {
public int char1;
public int char2;
public int advance;
public KerningPairType(int char1, int char2, int advance) {
this.char1 = char1;
this.char2 = char2;
this.advance = advance;
}
public KerningPairType(GFxInputStream sis) throws IOException {
this.char1 = sis.readUI16();
this.char2 = sis.readUI16();
this.advance = sis.readSI16();
}
public void write(GFxOutputStream sos) throws IOException {
sos.writeUI16(char1);
sos.writeUI16(char2);
sos.writeSI16(advance);
}
}
/*
* Copyright (C) 2010-2014 JPEXS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.jpexs.decompiler.flash.types.gfx;
import java.io.IOException;
import java.io.Serializable;
/**
*
* @author JPEXS
*/
public class KerningPairType implements Serializable {
public int char1;
public int char2;
public int advance;
public KerningPairType(int char1, int char2, int advance) {
this.char1 = char1;
this.char2 = char2;
this.advance = advance;
}
public KerningPairType(GFxInputStream sis) throws IOException {
this.char1 = sis.readUI16("char1");
this.char2 = sis.readUI16("char2");
this.advance = sis.readSI16("advance");
}
public void write(GFxOutputStream sos) throws IOException {
sos.writeUI16(char1);
sos.writeUI16(char2);
sos.writeSI16(advance);
}
}
@@ -1,61 +1,61 @@
/*
* Copyright (C) 2010-2014 JPEXS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.jpexs.decompiler.flash.types.gfx;
import java.io.IOException;
import java.io.Serializable;
/**
*
* @author JPEXS
*/
public class TEXGLYPH implements Serializable {
public float uvBoundsLeft;
public float uvBoundsTop;
public float uvBoundsRight;
public float uvBoundsBottom;
public float uvOriginX;
public float uvOriginY;
public TEXGLYPH(float uvBoundsLeft, float uvBoundsTop, float uvBoundsRight, float uvBoundsBottom, float uvOriginX, float uvOriginY) {
this.uvBoundsLeft = uvBoundsLeft;
this.uvBoundsTop = uvBoundsTop;
this.uvBoundsRight = uvBoundsRight;
this.uvBoundsBottom = uvBoundsBottom;
this.uvOriginX = uvOriginX;
this.uvOriginY = uvOriginY;
}
public TEXGLYPH(GFxInputStream sis) throws IOException {
this.uvBoundsLeft = sis.readFLOAT();
this.uvBoundsTop = sis.readFLOAT();
this.uvBoundsRight = sis.readFLOAT();
this.uvBoundsBottom = sis.readFLOAT();
this.uvOriginX = sis.readFLOAT();
this.uvOriginY = sis.readFLOAT();
}
public void write(GFxOutputStream sos) throws IOException {
sos.writeFLOAT(uvBoundsLeft);
sos.writeFLOAT(uvBoundsTop);
sos.writeFLOAT(uvBoundsRight);
sos.writeFLOAT(uvBoundsBottom);
sos.writeFLOAT(uvOriginX);
sos.writeFLOAT(uvOriginY);
}
}
/*
* Copyright (C) 2010-2014 JPEXS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.jpexs.decompiler.flash.types.gfx;
import java.io.IOException;
import java.io.Serializable;
/**
*
* @author JPEXS
*/
public class TEXGLYPH implements Serializable {
public float uvBoundsLeft;
public float uvBoundsTop;
public float uvBoundsRight;
public float uvBoundsBottom;
public float uvOriginX;
public float uvOriginY;
public TEXGLYPH(float uvBoundsLeft, float uvBoundsTop, float uvBoundsRight, float uvBoundsBottom, float uvOriginX, float uvOriginY) {
this.uvBoundsLeft = uvBoundsLeft;
this.uvBoundsTop = uvBoundsTop;
this.uvBoundsRight = uvBoundsRight;
this.uvBoundsBottom = uvBoundsBottom;
this.uvOriginX = uvOriginX;
this.uvOriginY = uvOriginY;
}
public TEXGLYPH(GFxInputStream sis) throws IOException {
this.uvBoundsLeft = sis.readFLOAT("uvBoundsLeft");
this.uvBoundsTop = sis.readFLOAT("uvBoundsTop");
this.uvBoundsRight = sis.readFLOAT("uvBoundsRight");
this.uvBoundsBottom = sis.readFLOAT("uvBoundsBottom");
this.uvOriginX = sis.readFLOAT("uvOriginX");
this.uvOriginY = sis.readFLOAT("uvOriginY");
}
public void write(GFxOutputStream sos) throws IOException {
sos.writeFLOAT(uvBoundsLeft);
sos.writeFLOAT(uvBoundsTop);
sos.writeFLOAT(uvBoundsRight);
sos.writeFLOAT(uvBoundsBottom);
sos.writeFLOAT(uvOriginX);
sos.writeFLOAT(uvOriginY);
}
}