From 569c50ce7325723b9bb102e39011843669655576 Mon Sep 17 00:00:00 2001 From: "honfika@gmail.com" Date: Sun, 10 May 2015 14:36:09 +0200 Subject: [PATCH] faster shape export --- .../exporters/commonshape/FillStyle.java | 49 +++++++++++++ .../exporters/commonshape/LineStyle.java | 70 ++++++++++++++++++ .../morphshape/CanvasMorphShapeExporter.java | 72 ++++-------------- .../morphshape/SVGMorphShapeExporter.java | 2 + .../flash/exporters/shape/BitmapExporter.java | 44 +++-------- .../exporters/shape/CanvasShapeExporter.java | 36 ++------- .../flash/exporters/shape/IShapeExporter.java | 9 ++- .../exporters/shape/ShapeExportData.java | 8 +- .../exporters/shape/ShapeExporterBase.java | 73 ++++++++++--------- 9 files changed, 199 insertions(+), 164 deletions(-) create mode 100644 libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/commonshape/FillStyle.java create mode 100644 libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/commonshape/LineStyle.java diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/commonshape/FillStyle.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/commonshape/FillStyle.java new file mode 100644 index 000000000..74a34dc5b --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/commonshape/FillStyle.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.exporters.commonshape; + +import com.jpexs.decompiler.flash.types.FILLSTYLE; +import com.jpexs.decompiler.flash.types.GRADIENT; +import com.jpexs.decompiler.flash.types.RGB; + +/** + * + * @author JPEXS + */ +public class FillStyle { + + public int fillStyleType; + + public RGB color; + + public Matrix gradientMatrix; + + public GRADIENT gradient; + + public Matrix bitmapMatrix; + + public int bitmapId; + + public FillStyle(FILLSTYLE fillStyle) { + fillStyleType = fillStyle.fillStyleType; + color = fillStyle.color; + gradientMatrix = new Matrix(fillStyle.gradientMatrix); + gradient = fillStyle.gradient; + bitmapMatrix = new Matrix(fillStyle.bitmapMatrix); + bitmapId = fillStyle.bitmapId; + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/commonshape/LineStyle.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/commonshape/LineStyle.java new file mode 100644 index 000000000..48a9c22e4 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/commonshape/LineStyle.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.exporters.commonshape; + +import com.jpexs.decompiler.flash.types.LINESTYLE; +import com.jpexs.decompiler.flash.types.LINESTYLE2; +import com.jpexs.decompiler.flash.types.RGB; + +/** + * + * @author JPEXS + */ +public class LineStyle { + + public int width; + + public RGB color; + + public boolean isLineStyle2; + + public boolean noHScaleFlag; + + public boolean noVScaleFlag; + + public boolean pixelHintingFlag; + + public int startCapStyle; + + public int endCapStyle; + + public int joinStyle; + + public int miterLimitFactor; + + public boolean hasFillFlag; + + public FillStyle fillType; + + public LineStyle(LINESTYLE lineStyle) { + width = lineStyle.width; + color = lineStyle.color; + isLineStyle2 = lineStyle instanceof LINESTYLE2; + if (isLineStyle2) { + LINESTYLE2 lineStyle2 = (LINESTYLE2) lineStyle; + noHScaleFlag = lineStyle2.noHScaleFlag; + noVScaleFlag = lineStyle2.noVScaleFlag; + pixelHintingFlag = lineStyle2.pixelHintingFlag; + startCapStyle = lineStyle2.startCapStyle; + endCapStyle = lineStyle2.endCapStyle; + joinStyle = lineStyle2.joinStyle; + miterLimitFactor = lineStyle2.miterLimitFactor; + hasFillFlag = lineStyle2.hasFillFlag; + fillType = lineStyle2.fillType == null ? null : new FillStyle(lineStyle2.fillType); + } + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/morphshape/CanvasMorphShapeExporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/morphshape/CanvasMorphShapeExporter.java index bfa2bc21b..05e602480 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/morphshape/CanvasMorphShapeExporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/morphshape/CanvasMorphShapeExporter.java @@ -181,26 +181,8 @@ public class CanvasMorphShapeExporter extends MorphShapeExporterBase { fillData += "\tvar grd=ctx.createLinearGradient(" + useRatioPos(start.x, start2.x) + "," + useRatioPos(start.y, start2.y) + "," + useRatioPos(end.x, end2.x) + "," + useRatioPos(end.y, end2.y) + ");\r\n"; } else { - matrix.translateX /= unitDivisor; - matrix.translateY /= unitDivisor; - matrix.scaleX /= unitDivisor; - matrix.scaleY /= unitDivisor; - matrix.rotateSkew0 /= unitDivisor; - matrix.rotateSkew1 /= unitDivisor; - matrix.translateX += deltaX / unitDivisor; - matrix.translateY += deltaY / unitDivisor; fillMatrix = matrix; - - matrixEnd.translateX /= unitDivisor; - matrixEnd.translateY /= unitDivisor; - matrixEnd.scaleX /= unitDivisor; - matrixEnd.scaleY /= unitDivisor; - matrixEnd.rotateSkew0 /= unitDivisor; - matrixEnd.rotateSkew1 /= unitDivisor; - matrixEnd.translateX += deltaX / unitDivisor; - matrixEnd.translateY += deltaY / unitDivisor; fillMatrixEnd = matrixEnd; - fillData += "\tvar grd=ctx.createRadialGradient(" + useRatioDouble(focalPointRatio * 16384, focalPointRatioEnd * 16384) + ",0,0,0,0," + (16384 + 32768 * repeatCnt) + ");\r\n"; } int repeatTotal = repeatCnt * 2 + 1; @@ -250,26 +232,8 @@ public class CanvasMorphShapeExporter extends MorphShapeExporterBase { if (img != null) { colorTransform.apply(img); if (matrix != null) { - fillMatrix = matrix.clone(); - fillMatrix.translateX /= unitDivisor; - fillMatrix.translateY /= unitDivisor; - fillMatrix.scaleX /= unitDivisor; - fillMatrix.scaleY /= unitDivisor; - fillMatrix.rotateSkew0 /= unitDivisor; - fillMatrix.rotateSkew1 /= unitDivisor; - fillMatrix.translateX += deltaX / unitDivisor; - fillMatrix.translateY += deltaY / unitDivisor; - - fillMatrixEnd = matrixEnd.clone(); - fillMatrixEnd.translateX /= unitDivisor; - fillMatrixEnd.translateY /= unitDivisor; - fillMatrixEnd.scaleX /= unitDivisor; - fillMatrixEnd.scaleY /= unitDivisor; - fillMatrixEnd.rotateSkew0 /= unitDivisor; - fillMatrixEnd.rotateSkew1 /= unitDivisor; - fillMatrixEnd.translateX += deltaX / unitDivisor; - fillMatrixEnd.translateY += deltaY / unitDivisor; - + fillMatrix = matrix; + fillMatrixEnd = matrixEnd; } fillData += "\tvar fimg = ctrans.applyToImage(imageObj" + bitmapId + ");\r\n"; @@ -344,26 +308,8 @@ public class CanvasMorphShapeExporter extends MorphShapeExporterBase { end2.y += deltaY; lineFillData += "\tvar grd=ctx.createLinearGradient(" + useRatioPos(start.x, start2.x) + "," + useRatioPos(start.y, start2.y) + "," + useRatioPos(end.x, end2.x) + "," + useRatioPos(end.y, end2.y) + ");\r\n"; } else { - matrix.translateX /= unitDivisor; - matrix.translateY /= unitDivisor; - matrix.scaleX /= unitDivisor; - matrix.scaleY /= unitDivisor; - matrix.rotateSkew0 /= unitDivisor; - matrix.rotateSkew1 /= unitDivisor; - matrix.translateX += deltaX / unitDivisor; - matrix.translateY += deltaY / unitDivisor; lineFillMatrix = matrix; - - matrixEnd.translateX /= unitDivisor; - matrixEnd.translateY /= unitDivisor; - matrixEnd.scaleX /= unitDivisor; - matrixEnd.scaleY /= unitDivisor; - matrixEnd.rotateSkew0 /= unitDivisor; - matrixEnd.rotateSkew1 /= unitDivisor; - matrixEnd.translateX += deltaX / unitDivisor; - matrixEnd.translateY += deltaY / unitDivisor; lineFillMatrixEnd = matrixEnd; - lineFillData += "\tvar grd=ctx.createRadialGradient(" + useRatioDouble(focalPointRatio * 16384, focalPointRatioEnd * 16384) + ",0,0,0,0," + (16384 + 32768 * repeatCnt) + ");\r\n"; } int repeatTotal = lineRepeatCnt * 2 + 1; @@ -471,7 +417,12 @@ public class CanvasMorphShapeExporter extends MorphShapeExporterBase { if (lineLastRadColor != null) { preLineFillData += "\tctx.fillStyle=" + lineLastRadColor + ";\r\n ctx.fill(\"evenodd\");\r\n"; } - preLineFillData += "\tctx.transform(" + useRatioDouble(lineFillMatrix.scaleX, lineFillMatrixEnd.scaleX) + "," + useRatioDouble(lineFillMatrix.rotateSkew0, lineFillMatrixEnd.rotateSkew0) + "," + useRatioDouble(lineFillMatrix.rotateSkew1, lineFillMatrixEnd.rotateSkew1) + "," + useRatioDouble(lineFillMatrix.scaleY, lineFillMatrixEnd.scaleY) + "," + useRatioDouble(lineFillMatrix.translateX, lineFillMatrixEnd.translateX) + "," + useRatioDouble(lineFillMatrix.translateY, lineFillMatrixEnd.translateY) + ");\r\n"; + preLineFillData += "\tctx.transform(" + useRatioDouble(lineFillMatrix.scaleX / unitDivisor, lineFillMatrixEnd.scaleX / unitDivisor) + + "," + useRatioDouble(lineFillMatrix.rotateSkew0 / unitDivisor, lineFillMatrixEnd.rotateSkew0 / unitDivisor) + + "," + useRatioDouble(lineFillMatrix.rotateSkew1 / unitDivisor, lineFillMatrixEnd.rotateSkew1 / unitDivisor) + + "," + useRatioDouble(lineFillMatrix.scaleY / unitDivisor, lineFillMatrixEnd.scaleY / unitDivisor) + + "," + useRatioDouble((lineFillMatrix.translateX + deltaX) / unitDivisor, (lineFillMatrixEnd.translateX + deltaX) / unitDivisor) + + "," + useRatioDouble((lineFillMatrix.translateY + deltaY) / unitDivisor, (lineFillMatrixEnd.translateY + deltaY) / unitDivisor) + ");\r\n"; lineFillData = preLineFillData + lineFillData; lineFillData += "\tctx.fillRect(" + (-16384 - 32768 * lineRepeatCnt) + "," + (-16384 - 32768 * lineRepeatCnt) + "," + (2 * 16384 + 32768 * 2 * lineRepeatCnt) + "," + (2 * 16384 + 32768 * 2 * lineRepeatCnt) + ");\r\n"; lineFillData += "\tctx = oldctx;\r\n"; @@ -500,7 +451,12 @@ public class CanvasMorphShapeExporter extends MorphShapeExporterBase { } pathData += "\tctx.save();\r\n"; pathData += "\tctx.clip();\r\n"; - pathData += "\tctx.transform(" + useRatioDouble(fillMatrix.scaleX, fillMatrixEnd.scaleX) + "," + useRatioDouble(fillMatrix.rotateSkew0, fillMatrixEnd.rotateSkew0) + "," + useRatioDouble(fillMatrix.rotateSkew1, fillMatrixEnd.rotateSkew1) + "," + useRatioDouble(fillMatrix.scaleY, fillMatrixEnd.scaleY) + "," + useRatioDouble(fillMatrix.translateX, fillMatrixEnd.translateX) + "," + useRatioDouble(fillMatrix.translateY, fillMatrixEnd.translateY) + ");\r\n"; + pathData += "\tctx.transform(" + useRatioDouble(fillMatrix.scaleX / unitDivisor, fillMatrixEnd.scaleX / unitDivisor) + + "," + useRatioDouble(fillMatrix.rotateSkew0 / unitDivisor, fillMatrixEnd.rotateSkew0 / unitDivisor) + + "," + useRatioDouble(fillMatrix.rotateSkew1 / unitDivisor, fillMatrixEnd.rotateSkew1 / unitDivisor) + + "," + useRatioDouble(fillMatrix.scaleY / unitDivisor, fillMatrixEnd.scaleY / unitDivisor) + + "," + useRatioDouble((fillMatrix.translateX + deltaX) / unitDivisor, (fillMatrixEnd.translateX + deltaX) / unitDivisor) + + "," + useRatioDouble((fillMatrix.translateY + deltaY) / unitDivisor, (fillMatrixEnd.translateY + deltaY) / unitDivisor) + ");\r\n"; if (fillWidth > 0) {//repeating bitmap glitch fix //make bitmap 1px wider diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/morphshape/SVGMorphShapeExporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/morphshape/SVGMorphShapeExporter.java index d3713b17e..aab8ce3c5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/morphshape/SVGMorphShapeExporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/morphshape/SVGMorphShapeExporter.java @@ -145,10 +145,12 @@ public class SVGMorphShapeExporter extends DefaultSVGMorphShapeExporter { pattern.setAttribute("height", "" + height); pattern.setAttribute("viewBox", "0 0 " + width + " " + height); if (matrix != null) { + matrix = matrix.clone(); matrix.rotateSkew0 *= zoom / SWF.unitDivisor; matrix.rotateSkew1 *= zoom / SWF.unitDivisor; matrix.scaleX *= zoom / SWF.unitDivisor; matrix.scaleY *= zoom / SWF.unitDivisor; + matrixEnd = matrixEnd.clone(); matrixEnd.rotateSkew0 *= zoom / SWF.unitDivisor; matrixEnd.rotateSkew1 *= zoom / SWF.unitDivisor; matrixEnd.scaleX *= zoom / SWF.unitDivisor; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/BitmapExporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/BitmapExporter.java index 869389a21..10e2b632a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/BitmapExporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/BitmapExporter.java @@ -36,6 +36,7 @@ import java.awt.Graphics2D; import java.awt.LinearGradientPaint; import java.awt.MultipleGradientPaint; import java.awt.Paint; +import java.awt.Point; import java.awt.RadialGradientPaint; import java.awt.Shape; import java.awt.Stroke; @@ -52,16 +53,18 @@ import java.util.List; */ public class BitmapExporter extends ShapeExporterBase { + private static final Point POINT_NEG16384_0 = new Point(-16384, 0); + + private static final Point POINT_16384_0 = new Point(16384, 0); + + private static final AffineTransform IDENTITY_TRANSFORM = new AffineTransform(); + private SerializableImage image; private Graphics2D graphics; private final Color defaultColor; - private double deltaX; - - private double deltaY; - private final SWF swf; private GeneralPath path; @@ -78,8 +81,6 @@ public class BitmapExporter extends ShapeExporterBase { private Stroke defaultStroke; - private double unitDivisor; - private class TransformedStroke implements Stroke { /** @@ -147,7 +148,6 @@ public class BitmapExporter extends ShapeExporterBase { graphics = (Graphics2D) image.getGraphics(); AffineTransform at = transformation.toTransform(); at.preConcatenate(AffineTransform.getScaleInstance(1 / SWF.unitDivisor, 1 / SWF.unitDivisor)); - unitDivisor = 1; graphics.setTransform(at); defaultStroke = graphics.getStroke(); super.export(); @@ -199,12 +199,6 @@ public class BitmapExporter extends ShapeExporterBase { if (interpolationMethod == GRADIENT.INTERPOLATION_LINEAR_RGB_MODE) { cstype = MultipleGradientPaint.ColorSpaceType.LINEAR_RGB; } - matrix.translateX /= unitDivisor; - matrix.translateY /= unitDivisor; - matrix.scaleX /= unitDivisor; - matrix.scaleY /= unitDivisor; - matrix.rotateSkew0 /= unitDivisor; - matrix.rotateSkew1 /= unitDivisor; switch (type) { case FILLSTYLE.LINEAR_GRADIENT: { List colors = new ArrayList<>(); @@ -233,9 +227,7 @@ public class BitmapExporter extends ShapeExporterBase { } fillPathPaint = null; - fillPaint = new LinearGradientPaint(new java.awt.Point(-16384, 0), new java.awt.Point(16384, 0), ratiosArr, colorsArr, cm, cstype, AffineTransform.getTranslateInstance(0, 0)); - matrix.translateX -= deltaX; - matrix.translateY -= deltaY; + fillPaint = new LinearGradientPaint(POINT_NEG16384_0, POINT_16384_0, ratiosArr, colorsArr, cm, cstype, IDENTITY_TRANSFORM); fillTransform = matrix.toTransform(); } break; @@ -268,8 +260,6 @@ public class BitmapExporter extends ShapeExporterBase { Color endColor = gradientRecords[gradientRecords.length - 1].color.toColor(); fillPathPaint = endColor; fillPaint = new RadialGradientPaint(new java.awt.Point(0, 0), 16384, ratiosArr, colorsArr, cm); - matrix.translateX -= deltaX; - matrix.translateY -= deltaY; fillTransform = matrix.toTransform(); } break; @@ -302,8 +292,6 @@ public class BitmapExporter extends ShapeExporterBase { Color endColor = gradientRecords[gradientRecords.length - 1].color.toColor(); fillPathPaint = endColor; fillPaint = new RadialGradientPaint(new java.awt.Point(0, 0), 16384, new java.awt.Point((int) (focalPointRatio * 16384), 0), ratiosArr, colorsArr, cm, cstype, AffineTransform.getTranslateInstance(0, 0)); - matrix.translateX -= deltaX; - matrix.translateY -= deltaY; fillTransform = matrix.toTransform(); } break; @@ -313,12 +301,6 @@ public class BitmapExporter extends ShapeExporterBase { @Override public void beginBitmapFill(int bitmapId, Matrix matrix, boolean repeat, boolean smooth, ColorTransform colorTransform) { finalizePath(); - matrix.translateX /= unitDivisor; - matrix.translateY /= unitDivisor; - matrix.scaleX /= unitDivisor; - matrix.scaleY /= unitDivisor; - matrix.rotateSkew0 /= unitDivisor; - matrix.rotateSkew1 /= unitDivisor; ImageTag image = null; for (Tag t : swf.tags) { if (t instanceof ImageTag) { @@ -334,8 +316,6 @@ public class BitmapExporter extends ShapeExporterBase { if (img != null) { img = colorTransform.apply(img); fillPaint = new TexturePaint(img.getBufferedImage(), new java.awt.Rectangle(img.getWidth(), img.getHeight())); - matrix.translateX -= deltaX; - matrix.translateY -= deltaY; fillTransform = matrix.toTransform(); } } @@ -350,7 +330,6 @@ public class BitmapExporter extends ShapeExporterBase { @Override public void lineStyle(double thickness, RGB color, boolean pixelHinting, String scaleMode, int startCaps, int endCaps, int joints, int miterLimit) { finalizePath(); - thickness /= unitDivisor; lineColor = color == null ? null : color.toColor(); int capStyle = BasicStroke.CAP_ROUND; switch (startCaps) { @@ -412,18 +391,17 @@ public class BitmapExporter extends ShapeExporterBase { @Override public void moveTo(double x, double y) { - path.moveTo(x / unitDivisor - deltaX, y / unitDivisor - deltaY); + path.moveTo(x, y); } @Override public void lineTo(double x, double y) { - path.lineTo(x / unitDivisor - deltaX, y / unitDivisor - deltaY); + path.lineTo(x, y); } @Override public void curveTo(double controlX, double controlY, double anchorX, double anchorY) { - path.quadTo(controlX / unitDivisor - deltaX, controlY / unitDivisor - deltaY, - anchorX / unitDivisor - deltaX, anchorY / unitDivisor - deltaY); + path.quadTo(controlX, controlY, anchorX, anchorY); } protected void finalizePath() { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/CanvasShapeExporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/CanvasShapeExporter.java index 76a877c98..c4c629120 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/CanvasShapeExporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/CanvasShapeExporter.java @@ -212,17 +212,7 @@ public class CanvasShapeExporter extends ShapeExporterBase { end.y += deltaY; fillData += "\tvar grd=ctx.createLinearGradient(" + Double.toString(start.x / unitDivisor) + "," + Double.toString(start.y / unitDivisor) + "," + Double.toString(end.x / unitDivisor) + "," + Double.toString(end.y / unitDivisor) + ");\r\n"; } else { - matrix.translateX /= unitDivisor; - matrix.translateY /= unitDivisor; - matrix.scaleX /= unitDivisor; - matrix.scaleY /= unitDivisor; - matrix.rotateSkew0 /= unitDivisor; - matrix.rotateSkew1 /= unitDivisor; fillMatrix = matrix; - - matrix.translateX += deltaX / unitDivisor; - matrix.translateY += deltaY / unitDivisor; - fillData += "\tvar grd=ctx.createRadialGradient(" + focalPointRatio * 16384 + ",0,0,0,0," + (16384 + 32768 * repeatCnt) + ");\r\n"; } int repeatTotal = repeatCnt * 2 + 1; @@ -280,14 +270,6 @@ public class CanvasShapeExporter extends ShapeExporterBase { if (img != null) { colorTransform.apply(img); if (matrix != null) { - matrix.translateX /= unitDivisor; - matrix.translateY /= unitDivisor; - matrix.scaleX /= unitDivisor; - matrix.scaleY /= unitDivisor; - matrix.rotateSkew0 /= unitDivisor; - matrix.rotateSkew1 /= unitDivisor; - matrix.translateX += deltaX / unitDivisor; - matrix.translateY += deltaY / unitDivisor; fillMatrix = matrix; } @@ -356,17 +338,7 @@ public class CanvasShapeExporter extends ShapeExporterBase { end.y += deltaY; lineFillData += "\tvar grd=ctx.createLinearGradient(" + Double.toString(start.x / unitDivisor) + "," + Double.toString(start.y / unitDivisor) + "," + Double.toString(end.x / unitDivisor) + "," + Double.toString(end.y / unitDivisor) + ");\r\n"; } else { - matrix.translateX /= unitDivisor; - matrix.translateY /= unitDivisor; - matrix.scaleX /= unitDivisor; - matrix.scaleY /= unitDivisor; - matrix.rotateSkew0 /= unitDivisor; - matrix.rotateSkew1 /= unitDivisor; lineFillMatrix = matrix; - - matrix.translateX += deltaX / unitDivisor; - matrix.translateY += deltaY / unitDivisor; - lineFillData += "\tvar grd=ctx.createRadialGradient(" + focalPointRatio * 16384 + ",0,0,0,0," + (16384 + 32768 * lineRepeatCnt) + ");\r\n"; } int repeatTotal = lineRepeatCnt * 2 + 1; @@ -461,7 +433,9 @@ public class CanvasShapeExporter extends ShapeExporterBase { preLineFillData += "\tctx.fillStyle=" + lineLastRadColor + ";\r\n\tctx.fill(\"evenodd\");\r\n"; } - preLineFillData += "\tctx.transform(" + Helper.doubleStr(lineFillMatrix.scaleX) + "," + Helper.doubleStr(lineFillMatrix.rotateSkew0) + "," + Helper.doubleStr(lineFillMatrix.rotateSkew1) + "," + Helper.doubleStr(lineFillMatrix.scaleY) + "," + Helper.doubleStr(lineFillMatrix.translateX) + "," + Helper.doubleStr(lineFillMatrix.translateY) + ");\r\n"; + preLineFillData += "\tctx.transform(" + Helper.doubleStr(lineFillMatrix.scaleX / unitDivisor) + "," + Helper.doubleStr(lineFillMatrix.rotateSkew0 / unitDivisor) + + "," + Helper.doubleStr(lineFillMatrix.rotateSkew1 / unitDivisor) + "," + Helper.doubleStr(lineFillMatrix.scaleY / unitDivisor) + + "," + Helper.doubleStr((lineFillMatrix.translateX + deltaX) / unitDivisor) + "," + Helper.doubleStr((lineFillMatrix.translateY + deltaY) / unitDivisor) + ");\r\n"; lineFillData = preLineFillData + lineFillData; lineFillData += "\tctx.fillRect(" + (-16384 - 32768 * lineRepeatCnt) + "," + (-16384 - 32768 * lineRepeatCnt) + "," + (2 * 16384 + 32768 * 2 * lineRepeatCnt) + "," + (2 * 16384 + 32768 * 2 * lineRepeatCnt) + ");\r\n"; @@ -491,7 +465,9 @@ public class CanvasShapeExporter extends ShapeExporterBase { } pathData += "\tctx.save();\r\n"; pathData += "\tctx.clip();\r\n"; - pathData += "\tctx.transform(" + Helper.doubleStr(fillMatrix.scaleX) + "," + Helper.doubleStr(fillMatrix.rotateSkew0) + "," + Helper.doubleStr(fillMatrix.rotateSkew1) + "," + Helper.doubleStr(fillMatrix.scaleY) + "," + Helper.doubleStr(fillMatrix.translateX) + "," + Helper.doubleStr(fillMatrix.translateY) + ");\r\n"; + pathData += "\tctx.transform(" + Helper.doubleStr(fillMatrix.scaleX / unitDivisor) + "," + Helper.doubleStr(fillMatrix.rotateSkew0 / unitDivisor) + + "," + Helper.doubleStr(fillMatrix.rotateSkew1 / unitDivisor) + "," + Helper.doubleStr(fillMatrix.scaleY / unitDivisor) + + "," + Helper.doubleStr((fillMatrix.translateX + deltaX) / unitDivisor) + "," + Helper.doubleStr((fillMatrix.translateY + deltaY) / unitDivisor) + ");\r\n"; if (fillWidth > 0) {//repeating bitmap glitch fix //make bitmap 1px wider double s_w = (fillWidth + 1) / (double) fillWidth; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/IShapeExporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/IShapeExporter.java index f1557d87f..9288109c9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/IShapeExporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/IShapeExporter.java @@ -1,18 +1,19 @@ /* * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. - * + * * This library 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 * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.exporters.shape; import com.jpexs.decompiler.flash.exporters.commonshape.Matrix; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/ShapeExportData.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/ShapeExportData.java index 1ab573e4a..12ab9a5bd 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/ShapeExportData.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/ShapeExportData.java @@ -16,8 +16,8 @@ */ package com.jpexs.decompiler.flash.exporters.shape; -import com.jpexs.decompiler.flash.types.FILLSTYLE; -import com.jpexs.decompiler.flash.types.LINESTYLE; +import com.jpexs.decompiler.flash.exporters.commonshape.FillStyle; +import com.jpexs.decompiler.flash.exporters.commonshape.LineStyle; import java.util.List; /** @@ -26,9 +26,9 @@ import java.util.List; */ public class ShapeExportData { - public List fillStyles; + public List fillStyles; - public List lineStyles; + public List lineStyles; public List> fillPaths; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/ShapeExporterBase.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/ShapeExporterBase.java index c8105f2ef..b6b19b386 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/ShapeExporterBase.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/shape/ShapeExporterBase.java @@ -16,7 +16,8 @@ */ package com.jpexs.decompiler.flash.exporters.shape; -import com.jpexs.decompiler.flash.exporters.commonshape.Matrix; +import com.jpexs.decompiler.flash.exporters.commonshape.FillStyle; +import com.jpexs.decompiler.flash.exporters.commonshape.LineStyle; import com.jpexs.decompiler.flash.exporters.commonshape.PointInt; import com.jpexs.decompiler.flash.types.ColorTransform; import com.jpexs.decompiler.flash.types.FILLSTYLE; @@ -34,7 +35,6 @@ import com.jpexs.decompiler.flash.types.shaperecords.StyleChangeRecord; import com.jpexs.helpers.Cache; import java.awt.Color; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -48,9 +48,9 @@ public abstract class ShapeExporterBase implements IShapeExporter { protected final SHAPE shape; - private final List _fillStyles; + private final List _fillStyles; - private final List _lineStyles; + private final List _lineStyles; private final List> _fillPaths; @@ -66,12 +66,17 @@ public abstract class ShapeExporterBase implements IShapeExporter { ShapeExportData cachedData = exportDataCache.get(shape); if (cachedData == null) { - List fillStyles = new ArrayList<>(); - List lineStyles = new ArrayList<>(); + List fillStyles = new ArrayList<>(); + List lineStyles = new ArrayList<>(); if (shape instanceof SHAPEWITHSTYLE) { SHAPEWITHSTYLE shapeWithStyle = (SHAPEWITHSTYLE) shape; - fillStyles.addAll(Arrays.asList(shapeWithStyle.fillStyles.fillStyles)); - lineStyles.addAll(Arrays.asList(shapeWithStyle.lineStyles.lineStyles)); + for (FILLSTYLE fillStyle : shapeWithStyle.fillStyles.fillStyles) { + fillStyles.add(new FillStyle(fillStyle)); + } + + for (LINESTYLE lineStyle : shapeWithStyle.lineStyles.lineStyles) { + lineStyles.add(new LineStyle(lineStyle)); + } } // Create edge maps @@ -114,7 +119,7 @@ public abstract class ShapeExporterBase implements IShapeExporter { endShape(); } - private void createEdgeMaps(SHAPE shape, List fillStyles, List lineStyles, + private void createEdgeMaps(SHAPE shape, List fillStyles, List lineStyles, List>> fillEdgeMaps, List>> lineEdgeMaps) { int xPos = 0; int yPos = 0; @@ -260,8 +265,7 @@ public abstract class ShapeExporterBase implements IShapeExporter { fillStyleIdx = e.getFillStyleIdx(); pos = PointInt.MAX; if (fillStyleIdx - 1 < _fillStyles.size()) { - Matrix matrix; - FILLSTYLE fillStyle = _fillStyles.get(fillStyleIdx - 1); + FillStyle fillStyle = _fillStyles.get(fillStyleIdx - 1); switch (fillStyle.fillStyleType) { case FILLSTYLE.SOLID: // Solid fill @@ -271,11 +275,10 @@ public abstract class ShapeExporterBase implements IShapeExporter { case FILLSTYLE.RADIAL_GRADIENT: case FILLSTYLE.FOCAL_RADIAL_GRADIENT: // Gradient fill - matrix = new Matrix(fillStyle.gradientMatrix); beginGradientFill( fillStyle.fillStyleType, colorTransform.apply(fillStyle.gradient.gradientRecords), - matrix, + fillStyle.gradientMatrix, fillStyle.gradient.spreadMode, fillStyle.gradient.interpolationMode, (fillStyle.gradient instanceof FOCALGRADIENT) ? ((FOCALGRADIENT) fillStyle.gradient).focalPoint : 0 @@ -286,10 +289,9 @@ public abstract class ShapeExporterBase implements IShapeExporter { case FILLSTYLE.NON_SMOOTHED_REPEATING_BITMAP: case FILLSTYLE.NON_SMOOTHED_CLIPPED_BITMAP: // Bitmap fill - matrix = new Matrix(fillStyle.bitmapMatrix); beginBitmapFill( fillStyle.bitmapId, - matrix, + fillStyle.bitmapMatrix, (fillStyle.fillStyleType == FILLSTYLE.REPEATING_BITMAP || fillStyle.fillStyleType == FILLSTYLE.NON_SMOOTHED_REPEATING_BITMAP), (fillStyle.fillStyleType == FILLSTYLE.REPEATING_BITMAP || fillStyle.fillStyleType == FILLSTYLE.CLIPPED_BITMAP), colorTransform @@ -330,7 +332,7 @@ public abstract class ShapeExporterBase implements IShapeExporter { if (lineStyleIdx != e.getLineStyleIdx()) { lineStyleIdx = e.getLineStyleIdx(); pos = PointInt.MAX; - LINESTYLE lineStyle = null; + LineStyle lineStyle = null; try { lineStyle = _lineStyles.get(lineStyleIdx - 1); } catch (Exception ex) { @@ -343,21 +345,20 @@ public abstract class ShapeExporterBase implements IShapeExporter { int joinStyle = LINESTYLE2.ROUND_JOIN; int miterLimitFactor = 3; boolean hasFillFlag = false; - if (lineStyle instanceof LINESTYLE2) { - LINESTYLE2 lineStyle2 = (LINESTYLE2) lineStyle; - if (lineStyle2.noHScaleFlag && lineStyle2.noVScaleFlag) { + if (lineStyle.isLineStyle2) { + if (lineStyle.noHScaleFlag && lineStyle.noVScaleFlag) { scaleMode = "NONE"; - } else if (lineStyle2.noHScaleFlag) { + } else if (lineStyle.noHScaleFlag) { scaleMode = "VERTICAL"; - } else if (lineStyle2.noVScaleFlag) { + } else if (lineStyle.noVScaleFlag) { scaleMode = "HORIZONTAL"; } - pixelHintingFlag = lineStyle2.pixelHintingFlag; - startCapStyle = lineStyle2.startCapStyle; - endCapStyle = lineStyle2.endCapStyle; - joinStyle = lineStyle2.joinStyle; - miterLimitFactor = lineStyle2.miterLimitFactor; - hasFillFlag = lineStyle2.hasFillFlag; + pixelHintingFlag = lineStyle.pixelHintingFlag; + startCapStyle = lineStyle.startCapStyle; + endCapStyle = lineStyle.endCapStyle; + joinStyle = lineStyle.joinStyle; + miterLimitFactor = lineStyle.miterLimitFactor; + hasFillFlag = lineStyle.hasFillFlag; } lineStyle( lineStyle.width, @@ -370,18 +371,16 @@ public abstract class ShapeExporterBase implements IShapeExporter { miterLimitFactor); if (hasFillFlag) { - LINESTYLE2 lineStyle2 = (LINESTYLE2) lineStyle; - FILLSTYLE fillStyle = lineStyle2.fillType; + FillStyle fillStyle = lineStyle.fillType; switch (fillStyle.fillStyleType) { case FILLSTYLE.LINEAR_GRADIENT: case FILLSTYLE.RADIAL_GRADIENT: case FILLSTYLE.FOCAL_RADIAL_GRADIENT: // Gradient fill - Matrix matrix = new Matrix(fillStyle.gradientMatrix); lineGradientStyle( fillStyle.fillStyleType, fillStyle.gradient.gradientRecords, - matrix, + fillStyle.gradientMatrix, fillStyle.gradient.spreadMode, fillStyle.gradient.interpolationMode, (fillStyle.gradient instanceof FOCALGRADIENT) ? ((FOCALGRADIENT) fillStyle.gradient).focalPoint : 0 @@ -495,12 +494,16 @@ public abstract class ShapeExporterBase implements IShapeExporter { return null; } - private void appendFillStyles(List v1, FILLSTYLE[] v2) { - v1.addAll(Arrays.asList(v2)); + private void appendFillStyles(List v1, FILLSTYLE[] v2) { + for (FILLSTYLE s : v2) { + v1.add(new FillStyle(s)); + } } - private void appendLineStyles(List v1, LINESTYLE[] v2) { - v1.addAll(Arrays.asList(v2)); + private void appendLineStyles(List v1, LINESTYLE[] v2) { + for (LINESTYLE s : v2) { + v1.add(new LineStyle(s)); + } } private void appendEdges(List v1, List v2) {