Fixed #1846 blend modes with alpha

This commit is contained in:
Jindra Petřík
2022-11-13 10:39:44 +01:00
parent 0b6f5fa957
commit ff160911a6
3 changed files with 24 additions and 15 deletions

View File

@@ -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);
}

View File

@@ -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);
}
};
}