diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a6da53dc..57ea3e8ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. - [#1327] P-code editing: error message and syntax highlighting fixed when instruction name contains upper cased letter - [#1343] AS 1/2 direct editation critical bug - [#1348] Cannot properly export frame with cyrillic symbols to SVG +- [#1354] Various FLA export problem fixes ## [10.0.0] - 2016-12-24 ### Added diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java index 8e130c6b1..2f7fc3b68 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java @@ -1562,39 +1562,43 @@ public class XFLConverter { } } CharacterTag character = characters.get(rec.characterId); - MATRIX matrix = rec.placeMatrix; - XFLXmlWriter recCharWriter = new XFLXmlWriter(); + if (character != null) { + MATRIX matrix = rec.placeMatrix; + XFLXmlWriter recCharWriter = new XFLXmlWriter(); - int characterId = character.getCharacterId(); - if ((character instanceof ShapeTag) && (nonLibraryShapes.contains(characterId))) { - ShapeTag shape = (ShapeTag) character; - convertShape(characters, matrix, shape.getShapeNum(), shape.getShapes().shapeRecords, shape.getShapes().fillStyles, shape.getShapes().lineStyles, false, false, recCharWriter); - } else if (character instanceof TextTag) { - convertText(null, (TextTag) character, matrix, filters, null, recCharWriter); - } else if (character instanceof DefineVideoStreamTag) { - convertVideoInstance(null, matrix, (DefineVideoStreamTag) character, null, recCharWriter); - } else { - convertSymbolInstance(null, matrix, colorTransformAlpha, false, blendMode, filters, true, null, null, null, characters.get(rec.characterId), characters, tags, flaVersion, recCharWriter); - } + int characterId = character.getCharacterId(); + if ((character instanceof ShapeTag) && (nonLibraryShapes.contains(characterId))) { + ShapeTag shape = (ShapeTag) character; + convertShape(characters, matrix, shape.getShapeNum(), shape.getShapes().shapeRecords, shape.getShapes().fillStyles, shape.getShapes().lineStyles, false, false, recCharWriter); + } else if (character instanceof TextTag) { + convertText(null, (TextTag) character, matrix, filters, null, recCharWriter); + } else if (character instanceof DefineVideoStreamTag) { + convertVideoInstance(null, matrix, (DefineVideoStreamTag) character, null, recCharWriter); + } else { + convertSymbolInstance(null, matrix, colorTransformAlpha, false, blendMode, filters, true, null, null, null, characters.get(rec.characterId), characters, tags, flaVersion, recCharWriter); + } - int duration = frame - lastFrame; - lastFrame = frame; - if (duration > 0) { - if (duration > 1) { + int duration = frame - lastFrame; + lastFrame = frame; + if (duration > 0) { + if (duration > 1) { + symbolStr.writeStartElement("DOMFrame", new String[]{ + "index", Integer.toString(frame - duration), + "duration", Integer.toString(duration - 1), + "keyMode", Integer.toString(KEY_MODE_NORMAL),}); + symbolStr.writeElementValue("elements", ""); + symbolStr.writeEndElement(); + } symbolStr.writeStartElement("DOMFrame", new String[]{ - "index", Integer.toString(frame - duration), - "duration", Integer.toString(duration - 1), + "index", Integer.toString(frame - 1), "keyMode", Integer.toString(KEY_MODE_NORMAL),}); - symbolStr.writeElementValue("elements", ""); + symbolStr.writeStartElement("elements"); + symbolStr.writeCharactersRaw(recCharWriter.toString()); + symbolStr.writeEndElement(); symbolStr.writeEndElement(); } - symbolStr.writeStartElement("DOMFrame", new String[]{ - "index", Integer.toString(frame - 1), - "keyMode", Integer.toString(KEY_MODE_NORMAL),}); - symbolStr.writeStartElement("elements"); - symbolStr.writeCharactersRaw(recCharWriter.toString()); - symbolStr.writeEndElement(); - symbolStr.writeEndElement(); + } else { + logger.log(Level.WARNING, "Character with id={0} was not found.", rec.characterId); } } } @@ -3997,11 +4001,19 @@ public class XFLConverter { //kerning ? String ls = attributes.getValue("letterSpacing"); if (ls != null) { - letterSpacing = Double.parseDouble(ls); + try { + letterSpacing = Double.parseDouble(ls); + } catch (NumberFormatException ex) { + logger.log(Level.WARNING, "Invalid letter spacing value: {0}", ls); + } } String s = attributes.getValue("size"); if (s != null) { - size = Integer.parseInt(s); + try { + size = Integer.parseInt(s); + } catch (NumberFormatException ex) { + logger.log(Level.WARNING, "Invalid font size: {0}", s); + } } String c = attributes.getValue("color"); if (c != null) { diff --git a/src/com/jpexs/decompiler/flash/gui/editor/LineMarkedEditorPane.java b/src/com/jpexs/decompiler/flash/gui/editor/LineMarkedEditorPane.java index 41683b60f..ad2a514aa 100644 --- a/src/com/jpexs/decompiler/flash/gui/editor/LineMarkedEditorPane.java +++ b/src/com/jpexs/decompiler/flash/gui/editor/LineMarkedEditorPane.java @@ -341,8 +341,10 @@ public class LineMarkedEditorPane extends UndoFixedEditorPane implements LinkHan Rectangle r; try { r = modelToView(pos); - if (lastPos.x < r.x) { - pos--; + if (r != null) { + if (lastPos.x < r.x) { + pos--; + } } } catch (BadLocationException ex) { //ignore