mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-07-05 15:18:31 +00:00
Merge origin/master
This commit is contained in:
@@ -166,8 +166,10 @@ import com.jpexs.helpers.ProgressListener;
|
||||
import com.jpexs.helpers.SerializableImage;
|
||||
import com.jpexs.helpers.utf8.Utf8Helper;
|
||||
import java.awt.AlphaComposite;
|
||||
import java.awt.BasicStroke;
|
||||
import java.awt.Color;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Point;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.RenderingHints;
|
||||
import java.awt.Shape;
|
||||
@@ -2688,13 +2690,10 @@ public final class SWF implements SWFContainerItem, Timelined {
|
||||
}
|
||||
|
||||
CharacterTag character = timeline.swf.getCharacter(layer.characterId);
|
||||
if (colorTransform == null) {
|
||||
colorTransform = new ColorTransform();
|
||||
}
|
||||
|
||||
ColorTransform clrTrans = colorTransform.clone();
|
||||
ColorTransform clrTrans = colorTransform;
|
||||
if (layer.colorTransForm != null && layer.blendMode <= 1) { // Normal blend mode
|
||||
clrTrans = colorTransform.merge(layer.colorTransForm);
|
||||
clrTrans = clrTrans == null ? layer.colorTransForm : colorTransform.merge(layer.colorTransForm);
|
||||
}
|
||||
|
||||
if (character instanceof DrawableTag) {
|
||||
@@ -2753,7 +2752,7 @@ public final class SWF implements SWFContainerItem, Timelined {
|
||||
return exporter.getUniqueId("tag");
|
||||
}
|
||||
|
||||
public static SerializableImage frameToImageGet(Timeline timeline, int frame, int time, DepthState stateUnderCursor, int mouseButton, RECT displayRect, Matrix transformation, ColorTransform colorTransform, Color backGroundColor, boolean useCache, double zoom) {
|
||||
public static SerializableImage frameToImageGet(Timeline timeline, int frame, int time, Point cursorPosition, int mouseButton, RECT displayRect, Matrix transformation, Matrix absoluteTransformation, ColorTransform colorTransform, Color backGroundColor, boolean useCache, double zoom) {
|
||||
SWF swf = timeline.swf;
|
||||
String key = "frame_" + frame + "_" + time + "_" + timeline.id + "_" + swf.hashCode() + "_" + zoom;
|
||||
SerializableImage image;
|
||||
@@ -2784,9 +2783,9 @@ public final class SWF implements SWFContainerItem, Timelined {
|
||||
m.translate(-rect.Xmin * zoom, -rect.Ymin * zoom);
|
||||
m.scale(zoom);
|
||||
RenderContext renderContext = new RenderContext();
|
||||
renderContext.stateUnderCursor = stateUnderCursor;
|
||||
renderContext.cursorPosition = cursorPosition;
|
||||
renderContext.mouseButton = mouseButton;
|
||||
frameToImage(timeline, frame, time, renderContext, image, m, colorTransform);
|
||||
frameToImage(timeline, frame, time, renderContext, image, false, m, absoluteTransformation, colorTransform);
|
||||
if (useCache) {
|
||||
swf.putToCache(key, image);
|
||||
}
|
||||
@@ -2794,7 +2793,7 @@ public final class SWF implements SWFContainerItem, Timelined {
|
||||
return image;
|
||||
}
|
||||
|
||||
public static void framesToImage(Timeline timeline, List<SerializableImage> ret, int startFrame, int stopFrame, RenderContext renderContext, RECT displayRect, int totalFrameCount, Stack<Integer> visited, Matrix transformation, ColorTransform colorTransform, double zoom) {
|
||||
public static void framesToImage(Timeline timeline, List<SerializableImage> ret, int startFrame, int stopFrame, RenderContext renderContext, RECT displayRect, int totalFrameCount, Stack<Integer> visited, Matrix transformation, Matrix absoluteTransformation, ColorTransform colorTransform, double zoom) {
|
||||
RECT rect = displayRect;
|
||||
for (int f = 0; f < timeline.getFrameCount(); f++) {
|
||||
SerializableImage image = new SerializableImage((int) (rect.getWidth() / SWF.unitDivisor) + 1,
|
||||
@@ -2802,12 +2801,12 @@ public final class SWF implements SWFContainerItem, Timelined {
|
||||
image.fillTransparent();
|
||||
Matrix m = new Matrix();
|
||||
m.translate(-rect.Xmin, -rect.Ymin);
|
||||
frameToImage(timeline, f, 0, renderContext, image, m, colorTransform);
|
||||
frameToImage(timeline, f, 0, renderContext, image, false, m, absoluteTransformation, colorTransform);
|
||||
ret.add(image);
|
||||
}
|
||||
}
|
||||
|
||||
public static void frameToImage(Timeline timeline, int frame, int time, RenderContext renderContext, SerializableImage image, Matrix transformation, ColorTransform colorTransform) {
|
||||
public static void frameToImage(Timeline timeline, int frame, int time, RenderContext renderContext, SerializableImage image, boolean isClip, Matrix transformation, Matrix absoluteTransformation, ColorTransform colorTransform) {
|
||||
double unzoom = SWF.unitDivisor;
|
||||
if (timeline.getFrameCount() <= frame) {
|
||||
return;
|
||||
@@ -2841,16 +2840,13 @@ public final class SWF implements SWFContainerItem, Timelined {
|
||||
}
|
||||
|
||||
CharacterTag character = timeline.swf.getCharacter(layer.characterId);
|
||||
Matrix mat = new Matrix(layer.matrix);
|
||||
mat = mat.preConcatenate(transformation);
|
||||
Matrix layerMatrix = new Matrix(layer.matrix);
|
||||
Matrix mat = transformation.concatenate(layerMatrix);
|
||||
Matrix absMat = absoluteTransformation.concatenate(layerMatrix);
|
||||
|
||||
if (colorTransform == null) {
|
||||
colorTransform = new ColorTransform();
|
||||
}
|
||||
|
||||
ColorTransform clrTrans = colorTransform.clone();
|
||||
ColorTransform clrTrans = colorTransform;
|
||||
if (layer.colorTransForm != null && layer.blendMode <= 1) { // Normal blend mode
|
||||
clrTrans = colorTransform.merge(layer.colorTransForm);
|
||||
clrTrans = clrTrans == null ? layer.colorTransForm : colorTransform.merge(layer.colorTransForm);
|
||||
}
|
||||
|
||||
boolean showPlaceholder = false;
|
||||
@@ -2862,24 +2858,6 @@ public final class SWF implements SWFContainerItem, Timelined {
|
||||
drawableFrameCount = 1;
|
||||
}
|
||||
|
||||
int dframe;
|
||||
if (timeline.fontFrameNum != -1) {
|
||||
dframe = timeline.fontFrameNum;
|
||||
} else {
|
||||
dframe = time % drawableFrameCount;
|
||||
}
|
||||
|
||||
if (character instanceof ButtonTag) {
|
||||
dframe = ButtonTag.FRAME_UP;
|
||||
if (renderContext.stateUnderCursor == layer) {
|
||||
if (renderContext.mouseButton > 0) {
|
||||
dframe = ButtonTag.FRAME_DOWN;
|
||||
} else {
|
||||
dframe = ButtonTag.FRAME_OVER;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RECT boundRect = drawable.getRect();
|
||||
ExportRectangle rect = new ExportRectangle(boundRect);
|
||||
rect = mat.transform(rect);
|
||||
@@ -2922,15 +2900,38 @@ public final class SWF implements SWFContainerItem, Timelined {
|
||||
SerializableImage img = null;
|
||||
String cacheKey = null;
|
||||
if (drawable instanceof ShapeTag) {
|
||||
cacheKey = ((ShapeTag) drawable).getCharacterId() + m.toString() + clrTrans.toString();
|
||||
cacheKey = ((ShapeTag) drawable).getCharacterId() + m.toString() + (clrTrans == null ? "" : clrTrans.toString());
|
||||
img = renderContext.shapeCache.get(cacheKey);
|
||||
}
|
||||
|
||||
int dframe;
|
||||
if (timeline.fontFrameNum != -1) {
|
||||
dframe = timeline.fontFrameNum;
|
||||
} else {
|
||||
dframe = time % drawableFrameCount;
|
||||
}
|
||||
|
||||
if (character instanceof ButtonTag) {
|
||||
dframe = ButtonTag.FRAME_UP;
|
||||
if (renderContext.cursorPosition != null) {
|
||||
Shape buttonShape = drawable.getOutline(ButtonTag.FRAME_HITTEST, time, layer.ratio, renderContext, absMat);
|
||||
if (buttonShape.contains(renderContext.cursorPosition)) {
|
||||
renderContext.mouseOverButton = (ButtonTag) character;
|
||||
if (renderContext.mouseButton > 0) {
|
||||
dframe = ButtonTag.FRAME_DOWN;
|
||||
} else {
|
||||
dframe = ButtonTag.FRAME_OVER;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int stateCount = renderContext.stateUnderCursor == null ? 0 : renderContext.stateUnderCursor.size();
|
||||
if (img == null) {
|
||||
img = new SerializableImage(newWidth, newHeight, SerializableImage.TYPE_INT_ARGB);
|
||||
img.fillTransparent();
|
||||
|
||||
drawable.toImage(dframe, time, layer.ratio, renderContext, img, m, clrTrans);
|
||||
drawable.toImage(dframe, time, layer.ratio, renderContext, img, isClip || layer.clipDepth > -1, m, absMat, clrTrans);
|
||||
|
||||
if (cacheKey != null) {
|
||||
renderContext.shapeCache.put(cacheKey, img);
|
||||
@@ -3031,6 +3032,27 @@ public final class SWF implements SWFContainerItem, Timelined {
|
||||
g.setTransform(AffineTransform.getTranslateInstance(0, 0));
|
||||
g.setClip(clip.shape);
|
||||
} else {
|
||||
if (renderContext.cursorPosition != null) {
|
||||
if (drawable instanceof DefineSpriteTag) {
|
||||
if (renderContext.stateUnderCursor.size() > stateCount) {
|
||||
renderContext.stateUnderCursor.add(layer);
|
||||
}
|
||||
} else if (absMat.transform(new ExportRectangle(boundRect)).contains(renderContext.cursorPosition)) {
|
||||
Shape shape = drawable.getOutline(dframe, time, layer.ratio, renderContext, absMat);
|
||||
if (shape.contains(renderContext.cursorPosition)) {
|
||||
renderContext.stateUnderCursor.add(layer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (renderContext.borderImage != null) {
|
||||
Graphics2D g2 = (Graphics2D) renderContext.borderImage.getGraphics();
|
||||
g2.setPaint(Color.red);
|
||||
g2.setStroke(new BasicStroke(2));
|
||||
Shape shape = drawable.getOutline(dframe, time, layer.ratio, renderContext, absMat.preConcatenate(Matrix.getScaleInstance(1 / SWF.unitDivisor)));
|
||||
g2.draw(shape);
|
||||
}
|
||||
|
||||
g.setTransform(trans);
|
||||
g.drawImage(img.getBufferedImage(), 0, 0, null);
|
||||
}
|
||||
@@ -3039,9 +3061,10 @@ public final class SWF implements SWFContainerItem, Timelined {
|
||||
}
|
||||
|
||||
if (showPlaceholder) {
|
||||
mat.translateX /= unzoom;
|
||||
mat.translateY /= unzoom;
|
||||
AffineTransform trans = mat.toTransform();
|
||||
Matrix mat2 = mat.clone();
|
||||
mat2.translateX /= unzoom;
|
||||
mat2.translateY /= unzoom;
|
||||
AffineTransform trans = mat2.toTransform();
|
||||
g.setTransform(trans);
|
||||
BoundedTag b = (BoundedTag) character;
|
||||
g.setPaint(new Color(255, 255, 255, 128));
|
||||
|
||||
@@ -33,7 +33,6 @@ import com.jpexs.decompiler.flash.exporters.settings.FontExportSettings;
|
||||
import com.jpexs.decompiler.flash.exporters.shape.PathExporter;
|
||||
import com.jpexs.decompiler.flash.tags.Tag;
|
||||
import com.jpexs.decompiler.flash.tags.base.FontTag;
|
||||
import com.jpexs.decompiler.flash.types.ColorTransform;
|
||||
import com.jpexs.decompiler.flash.types.SHAPE;
|
||||
import com.jpexs.helpers.Helper;
|
||||
import com.jpexs.helpers.Path;
|
||||
@@ -181,7 +180,7 @@ public class FontExporter {
|
||||
for (int i = 0; i < shapes.size(); i++) {
|
||||
SHAPE s = shapes.get(i);
|
||||
final List<FPoint[]> contours = new ArrayList<>();
|
||||
PathExporter seb = new PathExporter(swf, s, new ColorTransform()) {
|
||||
PathExporter seb = new PathExporter(swf, s, null) {
|
||||
|
||||
private double transformX(double x) {
|
||||
return Math.ceil((double) (x / divider));
|
||||
|
||||
@@ -200,7 +200,7 @@ public class FrameExporter {
|
||||
if (fbackgroundColor != null) {
|
||||
exporter.setBackGroundColor(fbackgroundColor);
|
||||
}
|
||||
SWF.frameToSvg(tim, frame, 0, null, 0, exporter, new ColorTransform(), 0, settings.zoom);
|
||||
SWF.frameToSvg(tim, frame, 0, null, 0, exporter, null, 0, settings.zoom);
|
||||
fos.write(Utf8Helper.getBytes(exporter.getSVG()));
|
||||
}
|
||||
ret.add(f);
|
||||
@@ -246,7 +246,7 @@ public class FrameExporter {
|
||||
sb.append("function ").append(currentName).append("(ctx,ctrans,frame,ratio,time){\r\n");
|
||||
sb.append("\tctx.save();\r\n");
|
||||
sb.append("\tctx.transform(1,0,0,1,").append(-ftim.displayRect.Xmin * settings.zoom / SWF.unitDivisor).append(",").append(-ftim.displayRect.Ymin * settings.zoom / SWF.unitDivisor).append(");\r\n");
|
||||
framesToHtmlCanvas(sb, SWF.unitDivisor / settings.zoom, ftim, fframes, 0, null, 0, ftim.displayRect, new ColorTransform(), fbackgroundColor);
|
||||
framesToHtmlCanvas(sb, SWF.unitDivisor / settings.zoom, ftim, fframes, 0, null, 0, ftim.displayRect, null, fbackgroundColor);
|
||||
sb.append("\tctx.restore();\r\n");
|
||||
sb.append("}\r\n\r\n");
|
||||
|
||||
@@ -359,7 +359,7 @@ public class FrameExporter {
|
||||
}
|
||||
|
||||
int fframe = fframes.get(pos++);
|
||||
BufferedImage result = SWF.frameToImageGet(ftim, fframe, fframe, null, 0, ftim.displayRect, new Matrix(), new ColorTransform(), fbackgroundColor, false, settings.zoom).getBufferedImage();
|
||||
BufferedImage result = SWF.frameToImageGet(ftim, fframe, fframe, null, 0, ftim.displayRect, new Matrix(), new Matrix(), null, fbackgroundColor, false, settings.zoom).getBufferedImage();
|
||||
|
||||
if (evl != null) {
|
||||
evl.handleExportedEvent("frame", pos, fframes.size(), tagName);
|
||||
@@ -535,9 +535,6 @@ public class FrameExporter {
|
||||
}
|
||||
|
||||
CharacterTag character = timeline.swf.getCharacter(layer.characterId);
|
||||
if (colorTransform == null) {
|
||||
colorTransform = new ColorTransform();
|
||||
}
|
||||
|
||||
Matrix placeMatrix = new Matrix(layer.matrix);
|
||||
placeMatrix.scaleX /= unitDivisor;
|
||||
@@ -578,11 +575,9 @@ public class FrameExporter {
|
||||
result.append("\t\t\tctx = fctx;\r\n");
|
||||
}
|
||||
|
||||
ColorTransform ctrans = layer.colorTransForm;
|
||||
ColorTransform ctrans = layer.colorTransForm; // todo: colorTransform from parameter is not used? why?
|
||||
String ctrans_str = "ctrans";
|
||||
if (ctrans == null) {
|
||||
ctrans = new ColorTransform();
|
||||
} else {
|
||||
if (ctrans != null) {
|
||||
ctrans_str = "ctrans.merge(new cxform("
|
||||
+ ctrans.getRedAdd() + "," + ctrans.getGreenAdd() + "," + ctrans.getBlueAdd() + "," + ctrans.getAlphaAdd() + ","
|
||||
+ ctrans.getRedMulti() + "," + ctrans.getGreenMulti() + "," + ctrans.getBlueMulti() + "," + ctrans.getAlphaMulti()
|
||||
|
||||
@@ -122,7 +122,7 @@ public class ShapeExporter {
|
||||
Matrix m = new Matrix();
|
||||
m.translate(-rect.Xmin, -rect.Ymin);
|
||||
m.scale(settings.zoom);
|
||||
st.toImage(0, 0, 0, new RenderContext(), img, m, new CXFORMWITHALPHA());
|
||||
st.toImage(0, 0, 0, new RenderContext(), img, false, m, m, new CXFORMWITHALPHA());
|
||||
if (settings.mode == ShapeExportMode.PNG) {
|
||||
ImageHelper.write(img.getBufferedImage(), ImageFormat.PNG, file);
|
||||
} else {
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package com.jpexs.decompiler.flash.exporters.commonshape;
|
||||
|
||||
import com.jpexs.decompiler.flash.types.RECT;
|
||||
import java.awt.Point;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
|
||||
/**
|
||||
@@ -62,6 +63,12 @@ public class ExportRectangle {
|
||||
return yMax - yMin;
|
||||
}
|
||||
|
||||
public boolean contains(Point point) {
|
||||
int x = point.x;
|
||||
int y = point.y;
|
||||
return xMin <= x && xMax >= x && yMin <= y && yMax >= y;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
long bits = Double.doubleToLongBits(xMin);
|
||||
|
||||
@@ -226,7 +226,10 @@ public class CanvasMorphShapeExporter extends MorphShapeExporterBase {
|
||||
if (img != null) {
|
||||
fillWidth = img.getWidth();
|
||||
fillHeight = img.getHeight();
|
||||
colorTransform.apply(img);
|
||||
if (colorTransform != null) {
|
||||
colorTransform.apply(img);
|
||||
}
|
||||
|
||||
if (matrix != null) {
|
||||
fillMatrix = matrix;
|
||||
fillMatrixEnd = matrixEnd;
|
||||
|
||||
@@ -305,7 +305,11 @@ public abstract class MorphShapeExporterBase implements IMorphShapeExporter {
|
||||
switch (fillStyle.fillStyleType) {
|
||||
case FILLSTYLE.SOLID:
|
||||
// Solid fill
|
||||
beginFill(colorTransform.apply(fillStyle.color), colorTransform.apply(fillStyleEnd.color));
|
||||
if (colorTransform == null) {
|
||||
beginFill(fillStyle.color, fillStyleEnd.color);
|
||||
} else {
|
||||
beginFill(colorTransform.apply(fillStyle.color), colorTransform.apply(fillStyleEnd.color));
|
||||
}
|
||||
break;
|
||||
case FILLSTYLE.LINEAR_GRADIENT:
|
||||
case FILLSTYLE.RADIAL_GRADIENT:
|
||||
@@ -315,8 +319,8 @@ public abstract class MorphShapeExporterBase implements IMorphShapeExporter {
|
||||
matrixEnd = new Matrix(fillStyleEnd.gradientMatrix);
|
||||
beginGradientFill(
|
||||
fillStyle.fillStyleType,
|
||||
colorTransform.apply(fillStyle.gradient.gradientRecords),
|
||||
colorTransform.apply(fillStyleEnd.gradient.gradientRecords),
|
||||
colorTransform == null ? fillStyle.gradient.gradientRecords : colorTransform.apply(fillStyle.gradient.gradientRecords),
|
||||
colorTransform == null ? fillStyleEnd.gradient.gradientRecords : colorTransform.apply(fillStyleEnd.gradient.gradientRecords),
|
||||
matrix,
|
||||
matrixEnd,
|
||||
fillStyle.gradient.spreadMode,
|
||||
@@ -414,8 +418,8 @@ public abstract class MorphShapeExporterBase implements IMorphShapeExporter {
|
||||
lineStyle(
|
||||
lineStyle.width,
|
||||
lineStyleEnd.width,
|
||||
colorTransform.apply(lineStyle.color),
|
||||
colorTransform.apply(lineStyleEnd.color),
|
||||
colorTransform == null ? lineStyle.color : colorTransform.apply(lineStyle.color),
|
||||
colorTransform == null ? lineStyleEnd.color : colorTransform.apply(lineStyleEnd.color),
|
||||
pixelHintingFlag,
|
||||
scaleMode,
|
||||
startCapStyle,
|
||||
|
||||
@@ -107,7 +107,10 @@ public class SVGMorphShapeExporter extends DefaultSVGMorphShapeExporter {
|
||||
if (image != null) {
|
||||
SerializableImage img = image.getImage();
|
||||
if (img != null) {
|
||||
colorTransform.apply(img);
|
||||
if (colorTransform != null) {
|
||||
colorTransform.apply(img);
|
||||
}
|
||||
|
||||
int width = img.getWidth();
|
||||
int height = img.getHeight();
|
||||
lastPatternId++;
|
||||
|
||||
@@ -306,7 +306,10 @@ public class BitmapExporter extends ShapeExporterBase {
|
||||
if (imageTag != null) {
|
||||
SerializableImage img = imageTag.getImage();
|
||||
if (img != null) {
|
||||
img = colorTransform.apply(img);
|
||||
if (colorTransform != null) {
|
||||
img = colorTransform.apply(img);
|
||||
}
|
||||
|
||||
fillPaint = new TexturePaint(img.getBufferedImage(), new java.awt.Rectangle(img.getWidth(), img.getHeight()));
|
||||
fillTransform = matrix.toTransform();
|
||||
}
|
||||
|
||||
@@ -261,7 +261,10 @@ public class CanvasShapeExporter extends ShapeExporterBase {
|
||||
if (img != null) {
|
||||
fillWidth = img.getWidth();
|
||||
fillHeight = img.getHeight();
|
||||
colorTransform.apply(img);
|
||||
if (colorTransform != null) {
|
||||
colorTransform.apply(img);
|
||||
}
|
||||
|
||||
if (matrix != null) {
|
||||
fillMatrix = matrix;
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ public class PathExporter extends ShapeExporterBase {
|
||||
private GeneralPath path = new GeneralPath(GeneralPath.WIND_EVEN_ODD);
|
||||
|
||||
public static List<GeneralPath> export(SWF swf, SHAPE shape) {
|
||||
PathExporter exporter = new PathExporter(swf, shape, new ColorTransform());
|
||||
PathExporter exporter = new PathExporter(swf, shape, null);
|
||||
exporter.export();
|
||||
return exporter.paths;
|
||||
}
|
||||
|
||||
@@ -104,7 +104,10 @@ public class SVGShapeExporter extends DefaultSVGShapeExporter {
|
||||
if (image != null) {
|
||||
SerializableImage img = image.getImage();
|
||||
if (img != null) {
|
||||
colorTransform.apply(img);
|
||||
if (colorTransform != null) {
|
||||
colorTransform.apply(img);
|
||||
}
|
||||
|
||||
int width = img.getWidth();
|
||||
int height = img.getHeight();
|
||||
lastPatternId++;
|
||||
|
||||
@@ -267,7 +267,7 @@ public abstract class ShapeExporterBase implements IShapeExporter {
|
||||
switch (fillStyle.fillStyleType) {
|
||||
case FILLSTYLE.SOLID:
|
||||
// Solid fill
|
||||
beginFill(colorTransform.apply(fillStyle.color));
|
||||
beginFill(colorTransform == null ? fillStyle.color : colorTransform.apply(fillStyle.color));
|
||||
break;
|
||||
case FILLSTYLE.LINEAR_GRADIENT:
|
||||
case FILLSTYLE.RADIAL_GRADIENT:
|
||||
@@ -275,7 +275,7 @@ public abstract class ShapeExporterBase implements IShapeExporter {
|
||||
// Gradient fill
|
||||
beginGradientFill(
|
||||
fillStyle.fillStyleType,
|
||||
colorTransform.apply(fillStyle.gradient.gradientRecords),
|
||||
colorTransform == null ? fillStyle.gradient.gradientRecords : colorTransform.apply(fillStyle.gradient.gradientRecords),
|
||||
fillStyle.gradientMatrix,
|
||||
fillStyle.gradient.spreadMode,
|
||||
fillStyle.gradient.interpolationMode,
|
||||
@@ -368,7 +368,7 @@ public abstract class ShapeExporterBase implements IShapeExporter {
|
||||
}
|
||||
lineStyle(
|
||||
lineStyle.width,
|
||||
colorTransform.apply(lineStyle.color),
|
||||
colorTransform == null ? lineStyle.color : colorTransform.apply(lineStyle.color),
|
||||
pixelHintingFlag,
|
||||
scaleMode,
|
||||
startCapStyle,
|
||||
|
||||
@@ -29,7 +29,6 @@ import com.jpexs.decompiler.flash.tags.DefineShape4Tag;
|
||||
import com.jpexs.decompiler.flash.tags.ExportAssetsTag;
|
||||
import com.jpexs.decompiler.flash.tags.Tag;
|
||||
import com.jpexs.decompiler.flash.tags.base.ShapeTag;
|
||||
import com.jpexs.decompiler.flash.types.ColorTransform;
|
||||
import com.jpexs.decompiler.flash.types.FILLSTYLE;
|
||||
import com.jpexs.decompiler.flash.types.FILLSTYLEARRAY;
|
||||
import com.jpexs.decompiler.flash.types.FOCALGRADIENT;
|
||||
@@ -1041,7 +1040,7 @@ public class SvgImporter {
|
||||
st = (DefineShape4Tag) (new SvgImporter().importSvg(st, svgDataS));
|
||||
swf.addTag(st);
|
||||
SerializableImage si = new SerializableImage(480, 360, BufferedImage.TYPE_4BYTE_ABGR);
|
||||
BitmapExporter.export(swf, st.shapes, Color.yellow, si, new Matrix(), new ColorTransform());
|
||||
BitmapExporter.export(swf, st.shapes, Color.yellow, si, new Matrix(), null);
|
||||
List<Tag> li = new ArrayList<>();
|
||||
li.add(st);
|
||||
ImageIO.write(si.getBufferedImage(), "PNG", new File(name + ".imported.png"));
|
||||
|
||||
@@ -916,7 +916,7 @@ public class DefineEditTextTag extends TextTag {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, Matrix transformation, ColorTransform colorTransform) {
|
||||
public void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, boolean isClip, Matrix transformation, Matrix absoluteTransformation, ColorTransform colorTransform) {
|
||||
render(TextRenderMode.BITMAP, image, null, null, transformation, colorTransform, 1);
|
||||
}
|
||||
|
||||
@@ -927,7 +927,7 @@ public class DefineEditTextTag extends TextTag {
|
||||
|
||||
@Override
|
||||
public void toHtmlCanvas(StringBuilder result, double unitDivisor) {
|
||||
render(TextRenderMode.HTML5_CANVAS, null, null, result, new Matrix(), new ColorTransform(), unitDivisor);
|
||||
render(TextRenderMode.HTML5_CANVAS, null, null, result, new Matrix(), null, unitDivisor);
|
||||
}
|
||||
|
||||
private void render(TextRenderMode renderMode, SerializableImage image, SVGExporter svgExporter, StringBuilder htmlCanvasBuilder, Matrix transformation, ColorTransform colorTransform, double zoom) {
|
||||
|
||||
@@ -366,8 +366,8 @@ public class DefineSpriteTag extends CharacterTag implements DrawableTag, Timeli
|
||||
}
|
||||
|
||||
@Override
|
||||
public void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, Matrix transformation, ColorTransform colorTransform) {
|
||||
SWF.frameToImage(getTimeline(), frame, time, renderContext, image, transformation, colorTransform);
|
||||
public void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, boolean isClip, Matrix transformation, Matrix absoluteTransformation, ColorTransform colorTransform) {
|
||||
SWF.frameToImage(getTimeline(), frame, time, renderContext, image, isClip, transformation, absoluteTransformation, colorTransform);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -92,8 +92,8 @@ public abstract class ButtonTag extends CharacterTag implements DrawableTag, Tim
|
||||
}
|
||||
|
||||
@Override
|
||||
public void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, Matrix transformation, ColorTransform colorTransform) {
|
||||
SWF.frameToImage(getTimeline(), frame, time, renderContext, image, transformation, colorTransform);
|
||||
public void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, boolean isClip, Matrix transformation, Matrix absoluteTransformation, ColorTransform colorTransform) {
|
||||
SWF.frameToImage(getTimeline(), frame, time, renderContext, image, isClip, transformation, absoluteTransformation, colorTransform);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -39,7 +39,7 @@ public interface DrawableTag extends BoundedTag {
|
||||
|
||||
public Shape getOutline(int frame, int time, int ratio, RenderContext renderContext, Matrix transformation);
|
||||
|
||||
public void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, Matrix transformation, ColorTransform colorTransform);
|
||||
public void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, boolean isClip, Matrix transformation, Matrix absoluteTransformation, ColorTransform colorTransform);
|
||||
|
||||
public void toSVG(SVGExporter exporter, int ratio, ColorTransform colorTransform, int level, double zoom) throws IOException;
|
||||
|
||||
|
||||
@@ -323,7 +323,7 @@ public abstract class FontTag extends CharacterTag implements AloneTag, Drawable
|
||||
}
|
||||
|
||||
@Override
|
||||
public void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, Matrix transformation, ColorTransform colorTransform) {
|
||||
public void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, boolean isClip, Matrix transformation, Matrix absoluteTransformation, ColorTransform colorTransform) {
|
||||
SHAPERECORD.shapeListToImage(swf, getGlyphShapeTable(), image, frame, Color.black, colorTransform);
|
||||
}
|
||||
|
||||
@@ -341,7 +341,7 @@ public abstract class FontTag extends CharacterTag implements AloneTag, Drawable
|
||||
String cs = "" + c;
|
||||
cs = cs.replace("\\", "\\\\").replace("\"", "\\\"");
|
||||
result.append("\t\tcase \"").append(cs).append("\":\r\n");
|
||||
CanvasShapeExporter exporter = new CanvasShapeExporter(null, unitDivisor, swf, shapes.get(i), new ColorTransform(), 0, 0);
|
||||
CanvasShapeExporter exporter = new CanvasShapeExporter(null, unitDivisor, swf, shapes.get(i), null, 0, 0);
|
||||
exporter.export();
|
||||
result.append("\t\t").append(exporter.getShapeData().replaceAll("\r\n", "\r\n\t\t"));
|
||||
result.append("\tbreak;\r\n");
|
||||
|
||||
@@ -283,7 +283,7 @@ public abstract class ImageTag extends CharacterTag implements DrawableTag {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, Matrix transformation, ColorTransform colorTransform) {
|
||||
public void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, boolean isClip, Matrix transformation, Matrix absoluteTransformation, ColorTransform colorTransform) {
|
||||
BitmapExporter.export(swf, getShape(), null, image, transformation, colorTransform);
|
||||
}
|
||||
|
||||
@@ -295,7 +295,7 @@ public abstract class ImageTag extends CharacterTag implements DrawableTag {
|
||||
|
||||
@Override
|
||||
public void toHtmlCanvas(StringBuilder result, double unitDivisor) {
|
||||
CanvasShapeExporter cse = new CanvasShapeExporter(null, unitDivisor, swf, getShape(), new ColorTransform(), 0, 0);
|
||||
CanvasShapeExporter cse = new CanvasShapeExporter(null, unitDivisor, swf, getShape(), null, 0, 0);
|
||||
cse.export();
|
||||
result.append(cse.getShapeData());
|
||||
}
|
||||
|
||||
@@ -279,7 +279,7 @@ public abstract class MorphShapeTag extends CharacterTag implements DrawableTag
|
||||
}
|
||||
|
||||
@Override
|
||||
public void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, Matrix transformation, ColorTransform colorTransform) {
|
||||
public void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, boolean isClip, Matrix transformation, Matrix absoluteTransformation, ColorTransform colorTransform) {
|
||||
SHAPEWITHSTYLE shape = getShapeAtRatio(ratio);
|
||||
// morphShape using shapeNum=3, morphShape2 using shapeNum=4
|
||||
// todo: Currently the generated image is not cached, because the cache
|
||||
@@ -320,7 +320,7 @@ public abstract class MorphShapeTag extends CharacterTag implements DrawableTag
|
||||
|
||||
@Override
|
||||
public void toHtmlCanvas(StringBuilder result, double unitDivisor) {
|
||||
CanvasMorphShapeExporter cmse = new CanvasMorphShapeExporter(swf, getShapeAtRatio(0), getShapeAtRatio(MAX_RATIO), new ColorTransform(), unitDivisor, 0, 0);
|
||||
CanvasMorphShapeExporter cmse = new CanvasMorphShapeExporter(swf, getShapeAtRatio(0), getShapeAtRatio(MAX_RATIO), null, unitDivisor, 0, 0);
|
||||
cmse.export();
|
||||
result.append(cmse.getShapeData());
|
||||
}
|
||||
|
||||
@@ -18,7 +18,9 @@ package com.jpexs.decompiler.flash.tags.base;
|
||||
|
||||
import com.jpexs.decompiler.flash.timeline.DepthState;
|
||||
import com.jpexs.helpers.SerializableImage;
|
||||
import java.awt.Point;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
@@ -27,9 +29,15 @@ import java.util.Map;
|
||||
*/
|
||||
public class RenderContext {
|
||||
|
||||
public DepthState stateUnderCursor;
|
||||
public Point cursorPosition;
|
||||
|
||||
public List<DepthState> stateUnderCursor;
|
||||
|
||||
public int mouseButton;
|
||||
|
||||
public ButtonTag mouseOverButton;
|
||||
|
||||
public Map<String, SerializableImage> shapeCache = new HashMap<>();
|
||||
|
||||
public SerializableImage borderImage;
|
||||
}
|
||||
|
||||
@@ -132,7 +132,7 @@ public abstract class ShapeTag extends CharacterTag implements DrawableTag, Lazy
|
||||
}
|
||||
|
||||
@Override
|
||||
public void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, Matrix transformation, ColorTransform colorTransform) {
|
||||
public void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, boolean isClip, Matrix transformation, Matrix absoluteTransformation, ColorTransform colorTransform) {
|
||||
BitmapExporter.export(swf, getShapes(), null, image, transformation, colorTransform);
|
||||
if (Configuration.debugMode.get()) { // show control points
|
||||
List<GeneralPath> paths = PathExporter.export(swf, getShapes());
|
||||
@@ -183,7 +183,7 @@ public abstract class ShapeTag extends CharacterTag implements DrawableTag, Lazy
|
||||
|
||||
@Override
|
||||
public void toHtmlCanvas(StringBuilder result, double unitDivisor) {
|
||||
CanvasShapeExporter cse = new CanvasShapeExporter(null, unitDivisor, swf, getShapes(), new ColorTransform(), 0, 0);
|
||||
CanvasShapeExporter cse = new CanvasShapeExporter(null, unitDivisor, swf, getShapes(), null, 0, 0);
|
||||
cse.export();
|
||||
result.append(cse.getShapeData());
|
||||
}
|
||||
|
||||
@@ -654,7 +654,7 @@ public abstract class StaticTextTag extends TextTag {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, Matrix transformation, ColorTransform colorTransform) {
|
||||
public void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, boolean isClip, Matrix transformation, Matrix absoluteTransformation, ColorTransform colorTransform) {
|
||||
staticTextToImage(swf, textRecords, getTextNum(), image, textMatrix, transformation, colorTransform);
|
||||
/*try {
|
||||
TextTag originalTag = (TextTag) getOriginalTag();
|
||||
@@ -674,6 +674,6 @@ public abstract class StaticTextTag extends TextTag {
|
||||
|
||||
@Override
|
||||
public void toHtmlCanvas(StringBuilder result, double unitDivisor) {
|
||||
staticTextToHtmlCanvas(unitDivisor, swf, textRecords, getTextNum(), result, textBounds, textMatrix, new ColorTransform());
|
||||
staticTextToHtmlCanvas(unitDivisor, swf, textRecords, getTextNum(), result, textBounds, textMatrix, null);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -424,9 +424,13 @@ public abstract class TextTag extends CharacterTag implements DrawableTag {
|
||||
for (TEXTRECORD rec : textRecords) {
|
||||
if (rec.styleFlagsHasColor) {
|
||||
if (numText == 2) {
|
||||
textColor = colorTransform.apply(rec.textColorA.toInt());
|
||||
textColor = rec.textColorA.toInt();
|
||||
} else {
|
||||
textColor = colorTransform.apply(rec.textColor.toInt());
|
||||
textColor = rec.textColor.toInt();
|
||||
}
|
||||
|
||||
if (colorTransform != null) {
|
||||
textColor = colorTransform.apply(textColor);
|
||||
}
|
||||
}
|
||||
if (rec.styleFlagsHasFont) {
|
||||
@@ -574,9 +578,13 @@ public abstract class TextTag extends CharacterTag implements DrawableTag {
|
||||
for (TEXTRECORD rec : textRecords) {
|
||||
if (rec.styleFlagsHasColor) {
|
||||
if (numText == 2) {
|
||||
textColor = colorTransform.apply(rec.textColorA.toInt());
|
||||
textColor = rec.textColorA.toInt();
|
||||
} else {
|
||||
textColor = colorTransform.apply(rec.textColor.toInt());
|
||||
textColor = rec.textColor.toInt();
|
||||
}
|
||||
|
||||
if (colorTransform != null) {
|
||||
textColor = colorTransform.apply(textColor);
|
||||
}
|
||||
}
|
||||
if (rec.styleFlagsHasFont) {
|
||||
@@ -619,9 +627,13 @@ public abstract class TextTag extends CharacterTag implements DrawableTag {
|
||||
for (TEXTRECORD rec : textRecords) {
|
||||
if (rec.styleFlagsHasColor) {
|
||||
if (numText == 2) {
|
||||
textColor = colorTransform.apply(rec.textColorA.toInt());
|
||||
textColor = rec.textColorA.toInt();
|
||||
} else {
|
||||
textColor = colorTransform.apply(rec.textColor.toInt());
|
||||
textColor = rec.textColor.toInt();
|
||||
}
|
||||
|
||||
if (colorTransform != null) {
|
||||
textColor = colorTransform.apply(textColor);
|
||||
}
|
||||
}
|
||||
if (rec.styleFlagsHasFont) {
|
||||
|
||||
@@ -45,6 +45,7 @@ import com.jpexs.decompiler.flash.types.MATRIX;
|
||||
import com.jpexs.decompiler.flash.types.RECT;
|
||||
import com.jpexs.decompiler.flash.types.filters.FILTER;
|
||||
import com.jpexs.helpers.SerializableImage;
|
||||
import java.awt.Point;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Shape;
|
||||
import java.awt.geom.Area;
|
||||
@@ -529,12 +530,12 @@ public class Timeline {
|
||||
return modified;
|
||||
}
|
||||
|
||||
public void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, Matrix transformation, ColorTransform colorTransform) {
|
||||
SWF.frameToImage(this, frame, time, renderContext, image, transformation, colorTransform);
|
||||
public void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, boolean isClip, Matrix transformation, Matrix absoluteTransformation, ColorTransform colorTransform) {
|
||||
SWF.frameToImage(this, frame, time, renderContext, image, isClip, transformation, absoluteTransformation, colorTransform);
|
||||
}
|
||||
|
||||
public void toHtmlCanvas(StringBuilder result, double unitDivisor, List<Integer> frames) {
|
||||
FrameExporter.framesToHtmlCanvas(result, unitDivisor, this, frames, 0, null, 0, displayRect, new ColorTransform(), null);
|
||||
FrameExporter.framesToHtmlCanvas(result, unitDivisor, this, frames, 0, null, 0, displayRect, null, null);
|
||||
}
|
||||
|
||||
public void getSounds(int frame, int time, DepthState stateUnderCursor, int mouseButton, List<Integer> sounds, List<String> soundClasses) {
|
||||
@@ -568,7 +569,7 @@ public class Timeline {
|
||||
}
|
||||
}
|
||||
|
||||
public void getObjectsOutlines(int frame, int time, int ratio, DepthState stateUnderCursor, int mouseButton, Matrix transformation, List<DepthState> objs, List<Shape> outlines) {
|
||||
public void getObjectsOutlines(int frame, int time, int ratio, Point cursorPosition, int mouseButton, Matrix transformation, List<DepthState> objs, List<Shape> outlines) {
|
||||
Frame fr = getFrame(frame);
|
||||
Stack<Clip> clips = new Stack<>();
|
||||
for (int d = maxDepth; d >= 0; d--) {
|
||||
@@ -592,8 +593,7 @@ public class Timeline {
|
||||
CharacterTag character = swf.getCharacter(layer.characterId);
|
||||
if (character instanceof DrawableTag) {
|
||||
DrawableTag drawable = (DrawableTag) character;
|
||||
Matrix m = new Matrix(layer.matrix);
|
||||
m = m.preConcatenate(transformation);
|
||||
Matrix m = transformation.concatenate(new Matrix(layer.matrix));
|
||||
|
||||
int drawableFrameCount = drawable.getNumFrames();
|
||||
if (drawableFrameCount == 0) {
|
||||
@@ -616,7 +616,7 @@ public class Timeline {
|
||||
}
|
||||
|
||||
RenderContext renderContext = new RenderContext();
|
||||
renderContext.stateUnderCursor = stateUnderCursor;
|
||||
renderContext.cursorPosition = cursorPosition;
|
||||
renderContext.mouseButton = mouseButton;
|
||||
Shape cshape = ((DrawableTag) character).getOutline(dframe, layer.time + time, layer.ratio, renderContext, m);
|
||||
|
||||
@@ -634,7 +634,7 @@ public class Timeline {
|
||||
outlines.add(addArea);
|
||||
}
|
||||
if (character instanceof Timelined) {
|
||||
((Timelined) character).getTimeline().getObjectsOutlines(dframe, time + layer.time, layer.ratio, stateUnderCursor, mouseButton, m, objs, outlines);
|
||||
((Timelined) character).getTimeline().getObjectsOutlines(dframe, time + layer.time, layer.ratio, cursorPosition, mouseButton, m, objs, outlines);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -672,12 +672,14 @@ public class Timeline {
|
||||
if (drawableFrameCount == 0) {
|
||||
drawableFrameCount = 1;
|
||||
}
|
||||
|
||||
int dframe = (time + layer.time) % drawableFrameCount;
|
||||
if (character instanceof Timelined) {
|
||||
if (character instanceof ButtonTag) {
|
||||
ButtonTag bt = (ButtonTag) character;
|
||||
dframe = ButtonTag.FRAME_UP;
|
||||
if (renderContext.stateUnderCursor == layer) {
|
||||
if (character instanceof ButtonTag) {
|
||||
dframe = ButtonTag.FRAME_UP;
|
||||
if (renderContext.cursorPosition != null) {
|
||||
ButtonTag buttonTag = (ButtonTag) character;
|
||||
Shape buttonShape = buttonTag.getOutline(ButtonTag.FRAME_HITTEST, time, layer.ratio, renderContext, m);
|
||||
if (buttonShape.contains(renderContext.cursorPosition)) {
|
||||
if (renderContext.mouseButton > 0) {
|
||||
dframe = ButtonTag.FRAME_DOWN;
|
||||
} else {
|
||||
@@ -688,13 +690,13 @@ public class Timeline {
|
||||
}
|
||||
|
||||
Shape cshape = ((DrawableTag) character).getOutline(dframe, time + layer.time, layer.ratio, renderContext, m);
|
||||
|
||||
Area addArea = new Area(cshape);
|
||||
if (currentClip != null) {
|
||||
Area a = new Area(new Rectangle(displayRect.Xmin, displayRect.Ymin, displayRect.getWidth(), displayRect.getHeight()));
|
||||
a.subtract(new Area(currentClip.shape));
|
||||
addArea.subtract(a);
|
||||
}
|
||||
|
||||
if (layer.clipDepth > -1) {
|
||||
Clip clip = new Clip(addArea, layer.clipDepth);
|
||||
clips.push(clip);
|
||||
|
||||
@@ -1824,7 +1824,7 @@ public class Graph {
|
||||
pos++;
|
||||
continue;
|
||||
}*/
|
||||
//if (p != defaultPart)
|
||||
//if (p != defaultPart)
|
||||
{
|
||||
if (vis.contains(p)) {
|
||||
valueMappings.add(caseCommands.size() - 1);
|
||||
@@ -1849,7 +1849,7 @@ public class Graph {
|
||||
if (next != p) {
|
||||
//if (p == defaultPart && !defaultCommands.isEmpty()) {
|
||||
//ignore
|
||||
//} else
|
||||
//} else
|
||||
{
|
||||
TranslateStack s2 = (TranslateStack) stack.clone();
|
||||
s2.clear();
|
||||
@@ -1890,7 +1890,7 @@ public class Graph {
|
||||
}
|
||||
}
|
||||
}
|
||||
//remove last break from last section
|
||||
//remove last break from last section
|
||||
if (!caseCommands.isEmpty()) {
|
||||
List<GraphTargetItem> lastc = caseCommands.get(caseCommands.size() - 1);
|
||||
if (!lastc.isEmpty() && (lastc.get(lastc.size() - 1) instanceof BreakItem)) {
|
||||
|
||||
Reference in New Issue
Block a user