diff --git a/CHANGELOG.md b/CHANGELOG.md index ba2ed8e10..b2f61ecc0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ All notable changes to this project will be documented in this file. - Dependencies handling - Raw editing of DefineFontInfo/DefineFont2-3, KERNINGRECORD - proper switching wide codes - Storing SWF configuration for files inside bundles and/or binarydata +- [#1846] blend modes with alpha ### Changed - Full path inside bundle is displayed as SWF name instead simple name @@ -2561,6 +2562,7 @@ All notable changes to this project will be documented in this file. [#1864]: https://www.free-decompiler.com/flash/issues/1864 [#1863]: https://www.free-decompiler.com/flash/issues/1863 [#1865]: https://www.free-decompiler.com/flash/issues/1865 +[#1846]: https://www.free-decompiler.com/flash/issues/1846 [#1414]: https://www.free-decompiler.com/flash/issues/1414 [#1755]: https://www.free-decompiler.com/flash/issues/1755 [#1460]: https://www.free-decompiler.com/flash/issues/1460 diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timeline.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timeline.java index 49bc7b61c..11b08b97d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timeline.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timeline.java @@ -792,6 +792,11 @@ public class Timeline { } ColorTransform clrTrans2 = clrTrans; + + if (blendMode > 1) { + clrTrans2 = null; + } + if (clipDepth > -1) { //Make transparent colors opaque, mask should be only made by shapes CXFORMWITHALPHA clrMask = new CXFORMWITHALPHA(); @@ -926,6 +931,11 @@ public class Timeline { }*/ if (!(sameImage && canUseSameImage)) { g.setTransform(drawMatrix.toTransform()); + + if (blendMode > 1 && clrTrans != null) { + img = clrTrans.apply(img); + } + g.drawImage(img.getBufferedImage(), 0, 0, null); //g.setColor(Color.red); //g.drawRect(0, 0, img.getWidth(), img.getHeight()); @@ -1020,7 +1030,7 @@ public class Timeline { Matrix absMat = absoluteTransformation.concatenate(layerMatrix); ColorTransform clrTrans = colorTransform; - if (layer.colorTransForm != null && layer.blendMode <= 1) { // Normal blend mode + if (layer.colorTransForm != null) { clrTrans = clrTrans == null ? layer.colorTransForm : colorTransform.merge(layer.colorTransForm); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/filters/BlendComposite.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/filters/BlendComposite.java index 0b8401472..bd84e6659 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/filters/BlendComposite.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/filters/BlendComposite.java @@ -190,7 +190,14 @@ public final class BlendComposite implements Composite { srcPixel[1] = (pixel >> 8) & 0xFF; srcPixel[2] = (pixel) & 0xFF; srcPixel[3] = (pixel >> 24) & 0xFF; - + + + if (srcPixel[3] != 1 && srcPixel[3] != 0) { + srcPixel[0] = srcPixel[0] * 255 / srcPixel[3]; + srcPixel[1] = srcPixel[1] * 255 / srcPixel[3]; + srcPixel[2] = srcPixel[2] * 255 / srcPixel[3]; + } + pixel = dstPixels[x]; dstPixel[0] = (pixel >> 16) & 0xFF; dstPixel[1] = (pixel >> 8) & 0xFF; @@ -198,12 +205,14 @@ public final class BlendComposite implements Composite { dstPixel[3] = (pixel >> 24) & 0xFF; blender.blend(srcPixel, dstPixel, result); + + result[3] = 255; retPixel[0] = ((int) (dstPixel[0] + (result[0] - dstPixel[0]) * alpha) & 0xFF); retPixel[1] = ((int) (dstPixel[1] + (result[1] - dstPixel[1]) * alpha) & 0xFF); retPixel[2] = (int) (dstPixel[2] + (result[2] - dstPixel[2]) * alpha) & 0xFF; retPixel[3] = ((int) (dstPixel[3] + (result[3] - dstPixel[3]) * alpha) & 0xFF); - + float af = ((float) srcPixel[3]) / 255f; retPixel[0] = (int) ((1f - af) * dstPixel[0] + af * retPixel[0]); retPixel[1] = (int) ((1f - af) * dstPixel[1] + af * retPixel[1]); @@ -233,7 +242,6 @@ public final class BlendComposite implements Composite { result[0] = Math.min(255, src[0] + dst[0]); result[1] = Math.min(255, src[1] + dst[1]); result[2] = Math.min(255, src[2] + dst[2]); - result[3] = Math.min(255, src[3] + dst[3]); } }; case INVERT: @@ -243,7 +251,6 @@ public final class BlendComposite implements Composite { result[0] = 255 - dst[0]; result[1] = 255 - dst[1]; result[2] = 255 - dst[2]; - result[3] = src[3]; } }; case ALPHA: @@ -253,7 +260,6 @@ public final class BlendComposite implements Composite { result[0] = src[0]; result[1] = src[1]; result[2] = src[2]; - result[3] = dst[3]; //? } }; case ERASE: @@ -263,7 +269,6 @@ public final class BlendComposite implements Composite { result[0] = src[0]; result[1] = src[1]; result[2] = src[2]; - result[3] = 255 - dst[3]; //? } }; @@ -274,7 +279,6 @@ public final class BlendComposite implements Composite { result[0] = Math.min(src[0], dst[0]); result[1] = Math.min(src[1], dst[1]); result[2] = Math.min(src[2], dst[2]); - result[3] = Math.min(255, src[3] + dst[3] - (src[3] * dst[3]) / 255); } }; case DIFFERENCE: @@ -284,7 +288,6 @@ public final class BlendComposite implements Composite { result[0] = Math.abs(dst[0] - src[0]); result[1] = Math.abs(dst[1] - src[1]); result[2] = Math.abs(dst[2] - src[2]); - result[3] = Math.min(255, src[3] + dst[3] - (src[3] * dst[3]) / 255); } }; @@ -298,7 +301,6 @@ public final class BlendComposite implements Composite { : 255 - ((255 - src[1]) * (255 - dst[1]) >> 7); result[2] = src[2] < 128 ? dst[2] * src[2] >> 7 : 255 - ((255 - src[2]) * (255 - dst[2]) >> 7); - result[3] = Math.min(255, src[3] + dst[3] - (src[3] * dst[3]) / 255); } }; @@ -309,7 +311,6 @@ public final class BlendComposite implements Composite { result[0] = Math.max(src[0], dst[0]); result[1] = Math.max(src[1], dst[1]); result[2] = Math.max(src[2], dst[2]); - result[3] = Math.min(255, src[3] + dst[3] - (src[3] * dst[3]) / 255); } }; case MULTIPLY: @@ -319,7 +320,6 @@ public final class BlendComposite implements Composite { result[0] = (src[0] * dst[0]) >> 8; result[1] = (src[1] * dst[1]) >> 8; result[2] = (src[2] * dst[2]) >> 8; - result[3] = Math.min(255, src[3] + dst[3] - (src[3] * dst[3]) / 255); } }; @@ -333,7 +333,6 @@ public final class BlendComposite implements Composite { : 255 - ((255 - dst[1]) * (255 - src[1]) >> 7); result[2] = dst[2] < 128 ? dst[2] * src[2] >> 7 : 255 - ((255 - dst[2]) * (255 - src[2]) >> 7); - result[3] = Math.min(255, src[3] + dst[3] - (src[3] * dst[3]) / 255); } }; case SCREEN: @@ -343,7 +342,6 @@ public final class BlendComposite implements Composite { result[0] = 255 - ((255 - src[0]) * (255 - dst[0]) >> 8); result[1] = 255 - ((255 - src[1]) * (255 - dst[1]) >> 8); result[2] = 255 - ((255 - src[2]) * (255 - dst[2]) >> 8); - result[3] = Math.min(255, src[3] + dst[3] - (src[3] * dst[3]) / 255); } }; @@ -354,7 +352,6 @@ public final class BlendComposite implements Composite { result[0] = Math.max(0, dst[0] - src[0]); result[1] = Math.max(0, dst[1] - src[1]); result[2] = Math.max(0, dst[2] - src[2]); - result[3] = Math.min(255, src[3] + dst[3] - 256 - (src[3] * dst[3]) / 255); } }; }