diff --git a/CHANGELOG.md b/CHANGELOG.md index 93820cf3e..a623827cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. - [#1221] Separate icons for different actionscript objects (class/interface/frame/) - AS3 P-code - hilight and edit traits outside classes - [#1585] SVG import - support for style tag (CSS) +- [#1585] SVG import - switch tag support ### Changed - [#1471] Import script menuitem renamed to Import scripts. diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/svg/SvgImporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/svg/SvgImporter.java index 10602e499..475ce681e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/svg/SvgImporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/svg/SvgImporter.java @@ -269,41 +269,72 @@ public class SvgImporter { } } } + + private void processSwitch(Element element, Map idMap, int shapeNum, SHAPEWITHSTYLE shapes, Matrix transform, SvgStyle style) { + for (int i = 0; i < element.getChildNodes().getLength(); i++) { + Node childNode = element.getChildNodes().item(i); + if (childNode instanceof Element) { + Element childElement = (Element) childNode; + if (childElement.hasAttribute("requiredExtensions") && !childElement.getAttribute("requiredExtensions").isEmpty()) { + continue; + } + if (childElement.hasAttribute("systemLanguage")) { + String systemLanguage = childElement.getAttribute("systemLanguage"); + if (systemLanguage.equals("en-us") || systemLanguage.equals("en")) { + processElement(childElement, idMap, shapeNum, shapes, transform, style); + return; + } + continue; + } + processElement(childElement, idMap, shapeNum, shapes, transform, style); + return; + } + } + } + + private void processElement(Element element, Map idMap, int shapeNum, SHAPEWITHSTYLE shapes, Matrix transform, SvgStyle style) { + if (element.hasAttribute("requiredExtensions") && !element.getAttribute("requiredExtensions").isEmpty()) { + return; + } + String tagName = element.getTagName(); + SvgStyle newStyle = new SvgStyle(this, idMap, element); + Matrix m = Matrix.parseSvgMatrix(element.getAttribute("transform"), 1, 1); + Matrix m2 = m == null ? transform : transform.concatenate(m); + if ("switch".equals(tagName)) { + processSwitch(element, idMap, shapeNum, shapes, transform, style); + } else if ("style".equals(tagName)) { + processStyle(element); + } else if ("g".equals(tagName)) { + processSvgObject(idMap, shapeNum, shapes, element, m2, newStyle); + } else if ("path".equals(tagName)) { + processPath(shapeNum, shapes, element, m2, newStyle); + } else if ("circle".equals(tagName)) { + processCircle(shapeNum, shapes, element, m2, newStyle); + } else if ("ellipse".equals(tagName)) { + processEllipse(shapeNum, shapes, element, m2, newStyle); + } else if ("rect".equals(tagName)) { + processRect(shapeNum, shapes, element, m2, newStyle); + } else if ("line".equals(tagName)) { + processLine(shapeNum, shapes, element, m2, newStyle); + } else if ("polyline".equals(tagName)) { + processPolyline(shapeNum, shapes, element, m2, newStyle); + } else if ("polygon".equals(tagName)) { + processPolygon(shapeNum, shapes, element, m2, newStyle); + } else if ("defs".equals(tagName)) { + processDefs(element); + } else if ("title".equals(tagName) || "desc".equals(tagName) + || "radialGradient".equals(tagName) || "linearGradient".equals(tagName)) { + // ignore + } else { + showWarning(tagName + "tagNotSupported", "The SVG tag '" + tagName + "' is not supported."); + } + } private void processSvgObject(Map idMap, int shapeNum, SHAPEWITHSTYLE shapes, Element element, Matrix transform, SvgStyle style) { for (int i = 0; i < element.getChildNodes().getLength(); i++) { Node childNode = element.getChildNodes().item(i); if (childNode instanceof Element) { Element childElement = (Element) childNode; - String tagName = childElement.getTagName(); - SvgStyle newStyle = new SvgStyle(this, idMap, childElement); - Matrix m = Matrix.parseSvgMatrix(childElement.getAttribute("transform"), 1, 1); - Matrix m2 = m == null ? transform : transform.concatenate(m); - if ("style".equals(tagName)) { - processStyle(childElement); - } else if ("g".equals(tagName)) { - processSvgObject(idMap, shapeNum, shapes, childElement, m2, newStyle); - } else if ("path".equals(tagName)) { - processPath(shapeNum, shapes, childElement, m2, newStyle); - } else if ("circle".equals(tagName)) { - processCircle(shapeNum, shapes, childElement, m2, newStyle); - } else if ("ellipse".equals(tagName)) { - processEllipse(shapeNum, shapes, childElement, m2, newStyle); - } else if ("rect".equals(tagName)) { - processRect(shapeNum, shapes, childElement, m2, newStyle); - } else if ("line".equals(tagName)) { - processLine(shapeNum, shapes, childElement, m2, newStyle); - } else if ("polyline".equals(tagName)) { - processPolyline(shapeNum, shapes, childElement, m2, newStyle); - } else if ("polygon".equals(tagName)) { - processPolygon(shapeNum, shapes, childElement, m2, newStyle); - } else if ("defs".equals(tagName)) { - processDefs(childElement); - } else if ("title".equals(tagName) || "desc".equals(tagName) - || "radialGradient".equals(tagName) || "linearGradient".equals(tagName)) { - // ignore - } else { - showWarning(tagName + "tagNotSupported", "The SVG tag '" + tagName + "' is not supported."); - } + processElement(childElement, idMap, shapeNum, shapes, transform, style); } } }