From 33b7668fcc316af0ce5b33c8508caa1e5569b71b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 28 Mar 2021 15:14:09 +0200 Subject: [PATCH] Fixed: #1669 DefineBitsJPEG3/4 alpha premultiplied --- .../flash/tags/DefineBitsJPEG3Tag.java | 18 +++++++++++++++++- .../flash/tags/DefineBitsJPEG4Tag.java | 18 +++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineBitsJPEG3Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineBitsJPEG3Tag.java index 2a4b71cf3..fb7b39998 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineBitsJPEG3Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineBitsJPEG3Tag.java @@ -223,7 +223,23 @@ public class DefineBitsJPEG3Tag extends ImageTag implements AloneTag { int[] pixels2 = ((DataBufferInt) img2.getRaster().getDataBuffer()).getData(); for (int i = 0; i < pixels.length; i++) { int a = alphaData[i] & 0xff; - pixels2[i] = (pixels[i] & 0xffffff) | (a << 24); + int b = (pixels[i] >> 16) & 0xff; + int g = (pixels[i] >> 8) & 0xff; + int r = (pixels[i]) & 0xff; + r = (int) Math.floor(r * 255.0 / a); + g = (int) Math.floor(g * 255.0 / a); + b = (int) Math.floor(b * 255.0 / a); + if (r > 255) { + r = 255; + } + if (g > 255) { + g = 255; + } + if (b > 255) { + b = 255; + } + + pixels2[i] = (a << 24) | (b << 16) | (g << 8) | r; } return img2; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineBitsJPEG4Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineBitsJPEG4Tag.java index f694eecc4..316f223b7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineBitsJPEG4Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineBitsJPEG4Tag.java @@ -227,7 +227,23 @@ public class DefineBitsJPEG4Tag extends ImageTag implements AloneTag { int[] pixels2 = ((DataBufferInt) img2.getRaster().getDataBuffer()).getData(); for (int i = 0; i < pixels.length; i++) { int a = alphaData[i] & 0xff; - pixels2[i] = (pixels[i] & 0xffffff) | (a << 24); + int b = (pixels[i] >> 16) & 0xff; + int g = (pixels[i] >> 8) & 0xff; + int r = (pixels[i]) & 0xff; + r = (int) Math.floor(r * 255.0 / a); + g = (int) Math.floor(g * 255.0 / a); + b = (int) Math.floor(b * 255.0 / a); + if (r > 255) { + r = 255; + } + if (g > 255) { + g = 255; + } + if (b > 255) { + b = 255; + } + + pixels2[i] = (a << 24) | (b << 16) | (g << 8) | r; } return img2;