sprite frames display fix

other flash viewer fixes
This commit is contained in:
Jindra Pet��k
2013-07-08 17:21:08 +02:00
parent 7f7c6e0e8f
commit 7b535415bb
7 changed files with 75 additions and 75 deletions
+59 -61
View File
@@ -331,7 +331,7 @@ public class SWF {
findFileAttributes();
}
private void findFileAttributes(){
private void findFileAttributes() {
for (Tag t : tags) {
if (t instanceof FileAttributesTag) {
fileAttributes = (FileAttributesTag) t;
@@ -339,7 +339,7 @@ public class SWF {
}
}
}
private void assignExportNamesToSymbols() {
HashMap<Integer, String> exportNames = new HashMap<>();
for (Tag t : tags) {
@@ -2100,7 +2100,7 @@ public class SWF {
g.setTransform(trans);
if (character instanceof DrawableTag) {
DrawableTag drawable = (DrawableTag) character;
BufferedImage img = drawable.toImage(layer.ratio < 0 ? 0 : layer.ratio/*layer.duration*/, allTags, displayRect, characters, visited);
BufferedImage img = drawable.toImage(layer.ratio < 0 ? 0 : layer.ratio/*layer.duration*/, allTags, displayRect, characters, visited);
if (layer.filters != null) {
for (FILTER filter : layer.filters) {
img = filter.apply(img);
@@ -2114,62 +2114,54 @@ public class SWF {
img = layer.colorTransFormAlpha.apply(img);
}
Point imgPos = drawable.getImagePos(layer.ratio < 0 ? 0 : layer.ratio, characters, visited);
//imgPos.x+=fixX;
//imgPos.y+=fixY;
/*if (imgPos.x < 0) {
imgPos.x = 0;
}
if (imgPos.y < 0) {
imgPos.y = 0;
}*/
/*switch (layer.blendMode) {
case 0:
case 1:
g.setComposite(AlphaComposite.SrcOver);
break;
case 2: //TODO:Layer
g.setComposite(AlphaComposite.SrcOver);
break;
case 3:
g.setComposite(BlendComposite.Multiply);
break;
case 4:
g.setComposite(BlendComposite.Screen);
break;
case 5:
g.setComposite(BlendComposite.Lighten);
break;
case 6:
g.setComposite(BlendComposite.Darken);
break;
case 7:
g.setComposite(BlendComposite.Difference);
break;
case 8:
g.setComposite(BlendComposite.Add);
break;
case 9:
g.setComposite(BlendComposite.Subtract);
break;
case 10:
g.setComposite(BlendComposite.Invert);
break;
case 11:
g.setComposite(BlendComposite.Alpha);
break;
case 12:
g.setComposite(BlendComposite.Erase);
break;
case 13:
g.setComposite(BlendComposite.Overlay);
break;
case 14:
g.setComposite(BlendComposite.HardLight);
break;
default: //Not implemented
g.setComposite(AlphaComposite.SrcOver);
break;
}*/
switch (layer.blendMode) {
case 0:
case 1:
g.setComposite(AlphaComposite.SrcOver);
break;
case 2: //TODO:Layer
g.setComposite(AlphaComposite.SrcOver);
break;
case 3:
g.setComposite(BlendComposite.Multiply);
break;
case 4:
g.setComposite(BlendComposite.Screen);
break;
case 5:
g.setComposite(BlendComposite.Lighten);
break;
case 6:
g.setComposite(BlendComposite.Darken);
break;
case 7:
g.setComposite(BlendComposite.Difference);
break;
case 8:
g.setComposite(BlendComposite.Add);
break;
case 9:
g.setComposite(BlendComposite.Subtract);
break;
case 10:
g.setComposite(BlendComposite.Invert);
break;
case 11:
g.setComposite(BlendComposite.Alpha);
break;
case 12:
g.setComposite(BlendComposite.Erase);
break;
case 13:
g.setComposite(BlendComposite.Overlay);
break;
case 14:
g.setComposite(BlendComposite.HardLight);
break;
default: //Not implemented
g.setComposite(AlphaComposite.SrcOver);
break;
}
g.drawImage(img, imgPos.x, imgPos.y, null);
} else if (character instanceof BoundedTag) {
@@ -2188,6 +2180,12 @@ public class SWF {
/*g.setPaint(Color.yellow);
g.draw(new Rectangle(ret.getWidth()-1,ret.getHeight()-1));*/
cache.put(key, new CachedImage(ret));
/*try {
ImageIO.write(ret, "png", new File("tst_id_" + containerId + "_time_" + System.currentTimeMillis() + ".png"));
} catch (IOException ex) {
Logger.getLogger(SWF.class.getName()).log(Level.SEVERE, null, ex);
}*/
return ret;
}
@@ -2217,11 +2215,11 @@ public class SWF {
return;
}
while (startFrame > totalFrameCount) {
while (startFrame >= totalFrameCount) {
startFrame -= totalFrameCount;
}
while (stopFrame > totalFrameCount) {
while (stopFrame >= totalFrameCount) {
stopFrame -= totalFrameCount;
}
@@ -51,7 +51,7 @@ public class SwitchItem extends LoopItem implements Block {
ret += hilight("switch(") + switchedObject.toString(localData) + hilight(")") + "\r\n{\r\n";
for (int i = 0; i < caseCommands.size(); i++) {
for (int k = 0; k < valuesMapping.size(); k++) {
if (valuesMapping.get(k) == i) {
if (valuesMapping.get(k) == i) {
ret += "case " + caseValues.get(k).toString(localData) + ":\r\n";
}
}
@@ -2241,12 +2241,14 @@ public class MainFrame extends AppFrame implements ActionListener, TreeSelection
List<Tag> controlTags = swf.tags;
int containerId = 0;
RECT rect = swf.displayRect;
int totalFrameCount = swf.frameCount;
if (fn.getParent() instanceof DefineSpriteTag) {
controlTags = ((DefineSpriteTag) fn.getParent()).subTags;
containerId = ((DefineSpriteTag) fn.getParent()).spriteId;
rect = ((DefineSpriteTag) fn.getParent()).getRect(characters, new Stack<Integer>());
totalFrameCount = ((DefineSpriteTag) fn.getParent()).frameCount;
}
previewImagePanel.setImage(SWF.frameToImage(containerId, ((FrameNode) tagObj).getFrame() - 1, swf.tags, controlTags, rect, swf.frameCount, new Stack<Integer>()));
previewImagePanel.setImage(SWF.frameToImage(containerId, ((FrameNode) tagObj).getFrame() - 1, swf.tags, controlTags, rect, totalFrameCount, new Stack<Integer>()));
} else if (((tagObj instanceof FrameNode) && ((FrameNode) tagObj).isDisplayed()) || ((tagObj instanceof CharacterTag) || (tagObj instanceof FontTag)) && (tagObj instanceof Tag)) {
try {
@@ -2292,7 +2294,7 @@ public class MainFrame extends AppFrame implements ActionListener, TreeSelection
break;
}
Tag t = (Tag) o;
Set<Integer> needed = t.getDeepNeededCharacters(characters,new ArrayList<Integer>());
Set<Integer> needed = t.getDeepNeededCharacters(characters, new ArrayList<Integer>());
for (int n : needed) {
if (!doneCharacters.contains(n)) {
sos2.writeTag(characters.get(n));
@@ -2336,7 +2338,7 @@ public class MainFrame extends AppFrame implements ActionListener, TreeSelection
}
} else if (tagObj instanceof AloneTag) {
} else {
Set<Integer> needed = ((Tag) tagObj).getDeepNeededCharacters(characters,new ArrayList<Integer>());
Set<Integer> needed = ((Tag) tagObj).getDeepNeededCharacters(characters, new ArrayList<Integer>());
for (int n : needed) {
sos2.writeTag(characters.get(n));
}
@@ -272,8 +272,8 @@ public class DefineButton2Tag extends CharacterTag implements Container, Bounded
@Override
public Point getImagePos(int frame, HashMap<Integer, CharacterTag> characters, Stack<Integer> visited) {
RECT r=getRect(characters, visited);
return new Point(r.Xmin/20, r.Ymin/20);
RECT r = getRect(characters, visited);
return new Point(r.Xmin / 20, r.Ymin / 20);
}
@Override
@@ -286,8 +286,8 @@ public class DefineButtonTag extends CharacterTag implements ASMSource, BoundedT
@Override
public Point getImagePos(int frame, HashMap<Integer, CharacterTag> characters, Stack<Integer> visited) {
RECT r=getRect(characters, visited);
return new Point(r.Xmin/20, r.Ymin/20);
RECT r = getRect(characters, visited);
return new Point(r.Xmin / 20, r.Ymin / 20);
}
@Override
@@ -110,7 +110,7 @@ public class DefineSpriteTag extends CharacterTag implements Container, BoundedT
if (visited.contains(spriteId)) {
return new RECT();
}
visited.push(spriteId);
visited.push(spriteId);
RECT emptyRet = new RECT();
RECT ret = new RECT(Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE);
HashMap<Integer, Integer> depthMap = new HashMap<>();
@@ -129,20 +129,20 @@ public class Tag implements NeedsCharacters, Exportable {
return new HashSet<>();
}
public Set<Integer> getDeepNeededCharacters(HashMap<Integer, CharacterTag> characters,List<Integer> visited) {
public Set<Integer> getDeepNeededCharacters(HashMap<Integer, CharacterTag> characters, List<Integer> visited) {
Set<Integer> ret = new HashSet<>();
Set<Integer> needed = getNeededCharacters();
for (int ch : needed) {
for (int ch : needed) {
if (!characters.containsKey(ch)) { //TODO: use Import tag (?)
continue;
}
if(visited.contains(ch)){
if (visited.contains(ch)) {
continue;
}else{
} else {
visited.add(ch);
}
ret.add(ch);
ret.addAll(characters.get(ch).getDeepNeededCharacters(characters,visited));
ret.addAll(characters.get(ch).getDeepNeededCharacters(characters, visited));
}
return ret;
}