faster shape export

This commit is contained in:
2015-05-10 14:36:09 +02:00
parent 08e51a2721
commit 569c50ce73
9 changed files with 199 additions and 164 deletions
@@ -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;
}
}
@@ -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);
}
}
}
@@ -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
@@ -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;
@@ -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<Color> 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() {
@@ -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;
@@ -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;
@@ -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<FILLSTYLE> fillStyles;
public List<FillStyle> fillStyles;
public List<LINESTYLE> lineStyles;
public List<LineStyle> lineStyles;
public List<List<IEdge>> fillPaths;
@@ -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<FILLSTYLE> _fillStyles;
private final List<FillStyle> _fillStyles;
private final List<LINESTYLE> _lineStyles;
private final List<LineStyle> _lineStyles;
private final List<List<IEdge>> _fillPaths;
@@ -66,12 +66,17 @@ public abstract class ShapeExporterBase implements IShapeExporter {
ShapeExportData cachedData = exportDataCache.get(shape);
if (cachedData == null) {
List<FILLSTYLE> fillStyles = new ArrayList<>();
List<LINESTYLE> lineStyles = new ArrayList<>();
List<FillStyle> fillStyles = new ArrayList<>();
List<LineStyle> 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<FILLSTYLE> fillStyles, List<LINESTYLE> lineStyles,
private void createEdgeMaps(SHAPE shape, List<FillStyle> fillStyles, List<LineStyle> lineStyles,
List<Map<Integer, List<IEdge>>> fillEdgeMaps, List<Map<Integer, List<IEdge>>> 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<FILLSTYLE> v1, FILLSTYLE[] v2) {
v1.addAll(Arrays.asList(v2));
private void appendFillStyles(List<FillStyle> v1, FILLSTYLE[] v2) {
for (FILLSTYLE s : v2) {
v1.add(new FillStyle(s));
}
}
private void appendLineStyles(List<LINESTYLE> v1, LINESTYLE[] v2) {
v1.addAll(Arrays.asList(v2));
private void appendLineStyles(List<LineStyle> v1, LINESTYLE[] v2) {
for (LINESTYLE s : v2) {
v1.add(new LineStyle(s));
}
}
private void appendEdges(List<IEdge> v1, List<IEdge> v2) {