From ec00cb2b0b33e6c4ddd6efc11c38b6b924522a00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=F8=EDk?= Date: Sun, 13 Jan 2013 14:24:02 +0100 Subject: [PATCH] Better Fonts/Texts Flash display --- trunk/src/com/jpexs/asdec/gui/TagPanel.java | 76 ++++++++----------- .../jpexs/asdec/tags/DefineEditTextTag.java | 8 +- .../com/jpexs/asdec/tags/DefineFont2Tag.java | 10 +++ .../com/jpexs/asdec/tags/DefineFont3Tag.java | 10 +++ .../com/jpexs/asdec/tags/DefineFontTag.java | 10 +++ .../com/jpexs/asdec/tags/DefineText2Tag.java | 8 +- .../com/jpexs/asdec/tags/DefineTextTag.java | 8 +- .../com/jpexs/asdec/tags/base/FontTag.java | 4 + 8 files changed, 88 insertions(+), 46 deletions(-) diff --git a/trunk/src/com/jpexs/asdec/gui/TagPanel.java b/trunk/src/com/jpexs/asdec/gui/TagPanel.java index c3b1b036c..bc840db35 100644 --- a/trunk/src/com/jpexs/asdec/gui/TagPanel.java +++ b/trunk/src/com/jpexs/asdec/gui/TagPanel.java @@ -153,15 +153,12 @@ public class TagPanel extends JPanel implements ListSelectionListener { ByteArrayOutputStream baos = new ByteArrayOutputStream(); SWFOutputStream sos2 = new SWFOutputStream(baos, 10); - int width = 8000; - int height = 6000; - RECT rct = new RECT(); - rct.Ymax = height; - rct.Xmax = width; - sos2.writeRECT(rct); + int width = swf.displayRect.Xmax - swf.displayRect.Xmin; + int height = swf.displayRect.Ymax - swf.displayRect.Ymin; + sos2.writeRECT(swf.displayRect); sos2.writeUI8(0); - sos2.writeUI8(30); - sos2.writeUI16(1); //framecnt + sos2.writeUI8(swf.frameRate); + sos2.writeUI16(100); //framecnt //sos2.writeTag(new SetBackgroundColorTag(new RGB(255, 0, 255))); for (Tag tag : swf.tags) { if ((!(tag instanceof PlaceObjectTag)) @@ -202,43 +199,36 @@ public class TagPanel extends JPanel implements ListSelectionListener { } if (tagObj instanceof FontTag) { - int countGlyphs = 0; - int fontId = 0; - if (tagObj instanceof DefineFontTag) { - countGlyphs = ((DefineFontTag) tagObj).glyphShapeTable.length; - fontId = ((DefineFontTag) tagObj).fontId; - } - if (tagObj instanceof DefineFont2Tag) { - countGlyphs = ((DefineFont2Tag) tagObj).glyphShapeTable.length; - fontId = ((DefineFont2Tag) tagObj).fontId; - } - if (tagObj instanceof DefineFont3Tag) { - countGlyphs = ((DefineFont3Tag) tagObj).glyphShapeTable.length; - fontId = ((DefineFont3Tag) tagObj).fontId; - } - - List rec = new ArrayList(); - TEXTRECORD tr = new TEXTRECORD(); - tr.fontId = fontId; - tr.styleFlagsHasFont = true; - tr.textHeight = 460; - tr.glyphEntries = new GLYPHENTRY[countGlyphs]; - tr.styleFlagsHasColor = true; - tr.textColor = new RGB(0, 0, 0); - int adv = 300; - int maxadv = 0; - for (int f = 0; f < countGlyphs; f++) { - tr.glyphEntries[f] = new GLYPHENTRY(); - tr.glyphEntries[f].glyphAdvance = adv; - adv += 300; - if (adv > maxadv) { - maxadv = adv; + int countGlyphs = ((FontTag) tagObj).getGlyphShapeTable().length; + int fontId = ((FontTag) tagObj).getFontId(); + int sloupcu=(int)Math.ceil(Math.sqrt(countGlyphs)); + int radku=(int)Math.ceil(((float)countGlyphs)/((float)sloupcu)); + int x=0; + int y=1; + for (int f = 0; f < countGlyphs; f++) { + if(x>=sloupcu){ + x=0; + y++; } - tr.glyphEntries[f].glyphIndex = f; + List rec = new ArrayList(); + TEXTRECORD tr = new TEXTRECORD(); + int textHeight=height/radku; + tr.fontId = fontId; + tr.styleFlagsHasFont = true; + tr.textHeight = textHeight; + tr.glyphEntries = new GLYPHENTRY[1]; + tr.styleFlagsHasColor = true; + tr.textColor = new RGB(0, 0, 0); + tr.glyphEntries[0] = new GLYPHENTRY(); + tr.glyphEntries[0].glyphAdvance = 0; + tr.glyphEntries[0].glyphIndex = f; + rec.add(tr); + mat.translateX=x*width/sloupcu; + mat.translateY=y*height/radku; + sos2.writeTag(new DefineTextTag(999 + f, new RECT(0, width, 0, height), new MATRIX(), SWFOutputStream.getNeededBitsU(countGlyphs - 1), SWFOutputStream.getNeededBitsU(0), rec)); + sos2.writeTag(new PlaceObject2Tag(false, false, false, true, false, true, true, false, 1+f, 999 + f, mat, null, 0, null, 0, null)); + x++; } - rec.add(tr); - sos2.writeTag(new DefineTextTag(999, new RECT(0, width, 0, height), new MATRIX(), SWFOutputStream.getNeededBitsU(countGlyphs - 1), SWFOutputStream.getNeededBitsU(maxadv), rec)); - sos2.writeTag(new PlaceObject2Tag(false, false, false, true, false, true, true, false, 1, 999, mat, null, 0, null, 0, null)); sos2.writeTag(new ShowFrameTag()); } else if ((tagObj instanceof DefineMorphShapeTag) || (tagObj instanceof DefineMorphShape2Tag)) { sos2.writeTag(new PlaceObject2Tag(false, false, false, true, false, true, true, false, 1, chtId, mat, null, 0, null, 0, null)); diff --git a/trunk/src/com/jpexs/asdec/tags/DefineEditTextTag.java b/trunk/src/com/jpexs/asdec/tags/DefineEditTextTag.java index 17f0eb32f..3b5c752f0 100644 --- a/trunk/src/com/jpexs/asdec/tags/DefineEditTextTag.java +++ b/trunk/src/com/jpexs/asdec/tags/DefineEditTextTag.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.tags; import com.jpexs.asdec.SWFInputStream; import com.jpexs.asdec.SWFOutputStream; +import com.jpexs.asdec.tags.base.BoundedTag; import com.jpexs.asdec.tags.base.CharacterTag; import com.jpexs.asdec.types.RECT; import com.jpexs.asdec.types.RGBA; @@ -31,7 +32,7 @@ import java.io.OutputStream; * * @author JPEXS */ -public class DefineEditTextTag extends CharacterTag { +public class DefineEditTextTag extends CharacterTag implements BoundedTag { public int characterID; public RECT bounds; @@ -64,6 +65,11 @@ public class DefineEditTextTag extends CharacterTag { public String variableName; public String initialText; + @Override + public RECT getRect() { + return bounds; + } + @Override public int getCharacterID() { return characterID; diff --git a/trunk/src/com/jpexs/asdec/tags/DefineFont2Tag.java b/trunk/src/com/jpexs/asdec/tags/DefineFont2Tag.java index c55936607..3873c7f20 100644 --- a/trunk/src/com/jpexs/asdec/tags/DefineFont2Tag.java +++ b/trunk/src/com/jpexs/asdec/tags/DefineFont2Tag.java @@ -207,4 +207,14 @@ public class DefineFont2Tag extends Tag implements FontTag { } } } + + @Override + public int getFontId() { + return fontId; + } + + @Override + public SHAPE[] getGlyphShapeTable() { + return glyphShapeTable; + } } diff --git a/trunk/src/com/jpexs/asdec/tags/DefineFont3Tag.java b/trunk/src/com/jpexs/asdec/tags/DefineFont3Tag.java index 53213e1a4..f6ae73f5a 100644 --- a/trunk/src/com/jpexs/asdec/tags/DefineFont3Tag.java +++ b/trunk/src/com/jpexs/asdec/tags/DefineFont3Tag.java @@ -198,4 +198,14 @@ public class DefineFont3Tag extends Tag implements FontTag { } return baos.toByteArray(); } + + @Override + public int getFontId() { + return fontId; + } + + @Override + public SHAPE[] getGlyphShapeTable() { + return glyphShapeTable; + } } diff --git a/trunk/src/com/jpexs/asdec/tags/DefineFontTag.java b/trunk/src/com/jpexs/asdec/tags/DefineFontTag.java index 9f2eaad8d..d3cbe71ba 100644 --- a/trunk/src/com/jpexs/asdec/tags/DefineFontTag.java +++ b/trunk/src/com/jpexs/asdec/tags/DefineFontTag.java @@ -83,4 +83,14 @@ public class DefineFontTag extends Tag implements FontTag { glyphShapeTable[i] = sis.readSHAPE(1); } } + + @Override + public int getFontId() { + return fontId; + } + + @Override + public SHAPE[] getGlyphShapeTable() { + return glyphShapeTable; + } } diff --git a/trunk/src/com/jpexs/asdec/tags/DefineText2Tag.java b/trunk/src/com/jpexs/asdec/tags/DefineText2Tag.java index 00b31637e..ea810f2c1 100644 --- a/trunk/src/com/jpexs/asdec/tags/DefineText2Tag.java +++ b/trunk/src/com/jpexs/asdec/tags/DefineText2Tag.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.tags; import com.jpexs.asdec.SWFInputStream; import com.jpexs.asdec.SWFOutputStream; +import com.jpexs.asdec.tags.base.BoundedTag; import com.jpexs.asdec.tags.base.CharacterTag; import com.jpexs.asdec.types.MATRIX; import com.jpexs.asdec.types.RECT; @@ -34,7 +35,7 @@ import java.util.List; * * @author JPEXS */ -public class DefineText2Tag extends CharacterTag { +public class DefineText2Tag extends CharacterTag implements BoundedTag { public int characterID; public RECT textBounds; @@ -43,6 +44,11 @@ public class DefineText2Tag extends CharacterTag { public int advanceBits; public List textRecords; + @Override + public RECT getRect() { + return textBounds; + } + @Override public int getCharacterID() { return characterID; diff --git a/trunk/src/com/jpexs/asdec/tags/DefineTextTag.java b/trunk/src/com/jpexs/asdec/tags/DefineTextTag.java index 1e52d74f7..3a9567b55 100644 --- a/trunk/src/com/jpexs/asdec/tags/DefineTextTag.java +++ b/trunk/src/com/jpexs/asdec/tags/DefineTextTag.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.tags; import com.jpexs.asdec.SWFInputStream; import com.jpexs.asdec.SWFOutputStream; +import com.jpexs.asdec.tags.base.BoundedTag; import com.jpexs.asdec.tags.base.CharacterTag; import com.jpexs.asdec.types.MATRIX; import com.jpexs.asdec.types.RECT; @@ -34,7 +35,7 @@ import java.util.List; * * @author JPEXS */ -public class DefineTextTag extends CharacterTag { +public class DefineTextTag extends CharacterTag implements BoundedTag { public int characterID; public RECT textBounds; @@ -105,4 +106,9 @@ public class DefineTextTag extends CharacterTag { textRecords.add(tr); } } + + @Override + public RECT getRect() { + return textBounds; + } } diff --git a/trunk/src/com/jpexs/asdec/tags/base/FontTag.java b/trunk/src/com/jpexs/asdec/tags/base/FontTag.java index 57fa32b44..c6273e468 100644 --- a/trunk/src/com/jpexs/asdec/tags/base/FontTag.java +++ b/trunk/src/com/jpexs/asdec/tags/base/FontTag.java @@ -1,8 +1,12 @@ package com.jpexs.asdec.tags.base; +import com.jpexs.asdec.types.SHAPE; + /** * * @author JPEXS */ public interface FontTag { + public int getFontId(); + public SHAPE[] getGlyphShapeTable(); }