mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-09-26 21:40:46 +00:00
faster shape export
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+14
-58
@@ -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
|
||||
|
||||
+2
@@ -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;
|
||||
|
||||
+11
-33
@@ -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() {
|
||||
|
||||
+6
-30
@@ -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;
|
||||
|
||||
+4
-4
@@ -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;
|
||||
|
||||
|
||||
+38
-35
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user