diff --git a/trunk/src/com/jpexs/decompiler/flash/SWF.java b/trunk/src/com/jpexs/decompiler/flash/SWF.java index a66e79c13..2a1d61618 100644 --- a/trunk/src/com/jpexs/decompiler/flash/SWF.java +++ b/trunk/src/com/jpexs/decompiler/flash/SWF.java @@ -2454,14 +2454,45 @@ public final class SWF implements TreeItem { rect = mat.transform(rect); Matrix m = mat.clone(); if (layer.filters != null) { - // needs the whole size because of the filters - img = new SerializableImage(image.getWidth(), image.getHeight(), SerializableImage.TYPE_INT_ARGB); - } else { - img = new SerializableImage((int) (rect.getWidth() / SWF.unitDivisor) + 1, - (int) (rect.getHeight() / SWF.unitDivisor) + 1, SerializableImage.TYPE_INT_ARGB); - m.translate(-rect.xMin, -rect.yMin); - drawMatrix.translate(rect.xMin, rect.yMin); + // calculate size after applying the filters + double deltaXMax = 0; + double deltaYMax = 0; + for (FILTER filter : layer.filters) { + double x = filter.getDeltaX(); + double y = filter.getDeltaY(); + deltaXMax = Math.max(x, deltaXMax); + deltaYMax = Math.max(y, deltaYMax); + } + rect.xMin -= deltaXMax * SWF.unitDivisor; + rect.xMax += deltaXMax * SWF.unitDivisor; + rect.yMin -= deltaYMax * SWF.unitDivisor; + rect.yMax += deltaYMax * SWF.unitDivisor; } + + // align to whole pixels + rect.xMin = (int) (Math.floor(rect.xMin / SWF.unitDivisor) * SWF.unitDivisor); + rect.yMin = (int) (Math.floor(rect.yMin / SWF.unitDivisor) * SWF.unitDivisor); + rect.xMax = (int) (Math.ceil(rect.xMax / SWF.unitDivisor) * SWF.unitDivisor); + rect.yMax = (int) (Math.ceil(rect.yMax / SWF.unitDivisor) * SWF.unitDivisor); + + rect.xMin = Math.max(0, rect.xMin); + rect.yMin = Math.max(0, rect.yMin); + + int newWidth = (int) (rect.getWidth() / SWF.unitDivisor); + int newHeight = (int) (rect.getHeight() / SWF.unitDivisor); + int deltaX = (int) (rect.xMin / SWF.unitDivisor); + int deltaY = (int) (rect.yMin / SWF.unitDivisor); + newWidth = Math.min(image.getWidth() - deltaX, newWidth); + newHeight = Math.min(image.getHeight() - deltaY, newHeight); + + if (newWidth <= 0 || newHeight <= 0) { + continue; + } + + img = new SerializableImage(newWidth, newHeight, SerializableImage.TYPE_INT_ARGB); + m.translate(-rect.xMin, -rect.yMin); + drawMatrix.translate(rect.xMin, rect.yMin); + //Make all pixels transparent Graphics2D gr = (Graphics2D) img.getGraphics(); gr.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); diff --git a/trunk/src/com/jpexs/decompiler/flash/configuration/Configuration.java b/trunk/src/com/jpexs/decompiler/flash/configuration/Configuration.java index 1866f2362..d97cbcee5 100644 --- a/trunk/src/com/jpexs/decompiler/flash/configuration/Configuration.java +++ b/trunk/src/com/jpexs/decompiler/flash/configuration/Configuration.java @@ -168,7 +168,7 @@ public class Configuration { public static final ConfigurationItem locale = null; @ConfigurationDefaultString("_loc%d_") public static final ConfigurationItem registerNameFormat = null; - @ConfigurationDefaultInt(8) + @ConfigurationDefaultInt(10) public static final ConfigurationItem maxRecentFileCount = null; public static final ConfigurationItem recentFiles = null; public static final ConfigurationItem fontPairing = null; @@ -338,7 +338,7 @@ public class Configuration { recentFilesArray.remove(idx); } recentFilesArray.add(path); - while (recentFilesArray.size() >= maxRecentFileCount.get()) { + while (recentFilesArray.size() > maxRecentFileCount.get()) { recentFilesArray.remove(0); } recentFiles.set(Helper.joinStrings(recentFilesArray, "::")); diff --git a/trunk/src/com/jpexs/decompiler/flash/types/filters/BEVELFILTER.java b/trunk/src/com/jpexs/decompiler/flash/types/filters/BEVELFILTER.java index 48c7ceb9d..6b884dbc7 100644 --- a/trunk/src/com/jpexs/decompiler/flash/types/filters/BEVELFILTER.java +++ b/trunk/src/com/jpexs/decompiler/flash/types/filters/BEVELFILTER.java @@ -101,4 +101,14 @@ public class BEVELFILTER extends FILTER { } return Filtering.bevel(src, (int) blurX, (int) blurY, strength, type, highlightColor.toColor(), shadowColor.toColor(), (int) (angle * 180 / Math.PI), (float) distance, knockout, passes); } + + @Override + public double getDeltaX() { + return blurX; + } + + @Override + public double getDeltaY() { + return blurY; + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/types/filters/BLURFILTER.java b/trunk/src/com/jpexs/decompiler/flash/types/filters/BLURFILTER.java index e63433ccc..835c1c7cc 100644 --- a/trunk/src/com/jpexs/decompiler/flash/types/filters/BLURFILTER.java +++ b/trunk/src/com/jpexs/decompiler/flash/types/filters/BLURFILTER.java @@ -55,4 +55,14 @@ public class BLURFILTER extends FILTER { public SerializableImage apply(SerializableImage src) { return Filtering.blur(src, (int) blurX, (int) blurY, passes); } + + @Override + public double getDeltaX() { + return blurX; + } + + @Override + public double getDeltaY() { + return blurY; + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/types/filters/COLORMATRIXFILTER.java b/trunk/src/com/jpexs/decompiler/flash/types/filters/COLORMATRIXFILTER.java index b954830ea..aa7dbc667 100644 --- a/trunk/src/com/jpexs/decompiler/flash/types/filters/COLORMATRIXFILTER.java +++ b/trunk/src/com/jpexs/decompiler/flash/types/filters/COLORMATRIXFILTER.java @@ -51,4 +51,14 @@ public class COLORMATRIXFILTER extends FILTER { //matrix2[4][4] = 1; return Filtering.colorMatrix(src, matrix2); } + + @Override + public double getDeltaX() { + return 0; + } + + @Override + public double getDeltaY() { + return 0; + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/types/filters/CONVOLUTIONFILTER.java b/trunk/src/com/jpexs/decompiler/flash/types/filters/CONVOLUTIONFILTER.java index 00d631742..1dbe797b8 100644 --- a/trunk/src/com/jpexs/decompiler/flash/types/filters/CONVOLUTIONFILTER.java +++ b/trunk/src/com/jpexs/decompiler/flash/types/filters/CONVOLUTIONFILTER.java @@ -89,4 +89,14 @@ public class CONVOLUTIONFILTER extends FILTER { } return Filtering.convolution(src, matrix2, width, height); } + + @Override + public double getDeltaX() { + return 0; + } + + @Override + public double getDeltaY() { + return 0; + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/types/filters/DROPSHADOWFILTER.java b/trunk/src/com/jpexs/decompiler/flash/types/filters/DROPSHADOWFILTER.java index 0fd8f9a42..629963692 100644 --- a/trunk/src/com/jpexs/decompiler/flash/types/filters/DROPSHADOWFILTER.java +++ b/trunk/src/com/jpexs/decompiler/flash/types/filters/DROPSHADOWFILTER.java @@ -86,4 +86,14 @@ public class DROPSHADOWFILTER extends FILTER { public SerializableImage apply(SerializableImage src) { return Filtering.dropShadow(src, (int) blurX, (int) blurY, (int) (angle * 180 / Math.PI), distance, dropShadowColor.toColor(), innerShadow, passes, strength, knockout); } + + @Override + public double getDeltaX() { + return blurX; + } + + @Override + public double getDeltaY() { + return blurY; + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/types/filters/FILTER.java b/trunk/src/com/jpexs/decompiler/flash/types/filters/FILTER.java index 8c83b5e05..c8903089b 100644 --- a/trunk/src/com/jpexs/decompiler/flash/types/filters/FILTER.java +++ b/trunk/src/com/jpexs/decompiler/flash/types/filters/FILTER.java @@ -26,7 +26,7 @@ import java.io.Serializable; * * @author JPEXS */ -public class FILTER implements Serializable { +public abstract class FILTER implements Serializable { /** * Identificator of type of the filter @@ -43,7 +43,9 @@ public class FILTER implements Serializable { this.id = id; } - public SerializableImage apply(SerializableImage src) { - return src; - } + public abstract SerializableImage apply(SerializableImage src); + + public abstract double getDeltaX(); + + public abstract double getDeltaY(); } diff --git a/trunk/src/com/jpexs/decompiler/flash/types/filters/GLOWFILTER.java b/trunk/src/com/jpexs/decompiler/flash/types/filters/GLOWFILTER.java index 2e707f343..76e718e60 100644 --- a/trunk/src/com/jpexs/decompiler/flash/types/filters/GLOWFILTER.java +++ b/trunk/src/com/jpexs/decompiler/flash/types/filters/GLOWFILTER.java @@ -76,4 +76,14 @@ public class GLOWFILTER extends FILTER { public SerializableImage apply(SerializableImage src) { return Filtering.glow(src, (int) blurX, (int) blurY, strength, glowColor.toColor(), innerGlow, knockout, passes); } + + @Override + public double getDeltaX() { + return blurX; + } + + @Override + public double getDeltaY() { + return blurY; + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/types/filters/GRADIENTBEVELFILTER.java b/trunk/src/com/jpexs/decompiler/flash/types/filters/GRADIENTBEVELFILTER.java index 6a1ac9685..80705b128 100644 --- a/trunk/src/com/jpexs/decompiler/flash/types/filters/GRADIENTBEVELFILTER.java +++ b/trunk/src/com/jpexs/decompiler/flash/types/filters/GRADIENTBEVELFILTER.java @@ -117,4 +117,14 @@ public class GRADIENTBEVELFILTER extends FILTER { return Filtering.gradientBevel(src, colorsArr, ratiosAr, (int) blurX, (int) blurY, strength, type, (int) (angle * 180 / Math.PI), (float) distance, knockout, passes); } + + @Override + public double getDeltaX() { + return blurX; + } + + @Override + public double getDeltaY() { + return blurY; + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/types/filters/GRADIENTGLOWFILTER.java b/trunk/src/com/jpexs/decompiler/flash/types/filters/GRADIENTGLOWFILTER.java index 3a679d35f..3b82e4465 100644 --- a/trunk/src/com/jpexs/decompiler/flash/types/filters/GRADIENTGLOWFILTER.java +++ b/trunk/src/com/jpexs/decompiler/flash/types/filters/GRADIENTGLOWFILTER.java @@ -119,4 +119,14 @@ public class GRADIENTGLOWFILTER extends FILTER { } return Filtering.gradientGlow(src, (int) blurX, (int) blurY, (int) (angle * 180 / Math.PI), distance, colors.toArray(new Color[colors.size()]), ratiosAr, type, passes, strength, knockout); } + + @Override + public double getDeltaX() { + return blurX; + } + + @Override + public double getDeltaY() { + return blurY; + } }