Skip to content

Commit

Permalink
Fixed CombineLayers transparency bug
Browse files Browse the repository at this point in the history
  • Loading branch information
flabbet committed Dec 5, 2020
1 parent 3a22a48 commit b090499
Showing 1 changed file with 8 additions and 9 deletions.
17 changes: 8 additions & 9 deletions PixiEditor/Models/ImageManipulation/BitmapUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,29 +37,28 @@ public static WriteableBitmap CombineLayers(Layer[] layers, int width, int heigh
{
for (int i = 0; i < layers.Length; i++)
{
float layerOpacity = layers[i].Opacity;
for (int y = 0; y < finalBitmap.Height; y++)
{
for (int x = 0; x < finalBitmap.Width; x++)
{
Color color = layers[i].GetPixelWithOffset(x, y);
float layerOpacity = layers[i].Opacity;
if (i > 0 && ((color.A < 255 && color.A > 0) || (layerOpacity < 1f && layerOpacity > 0)))
if (i > 0 && ((color.A < 255 && color.A > 0) || (layerOpacity < 1f && layerOpacity > 0 && color.A > 0)))
{
var lastLayerPixel = finalBitmap.GetPixel(x, y);
byte lastPixelA = (byte)(lastLayerPixel.A * layers[i - 1].Opacity);
byte pixelA = (byte)(color.A * layerOpacity);
byte r = (byte)((color.R * pixelA / 255) + (lastLayerPixel.R * lastPixelA * (255 - pixelA) / (255 * 255)));
byte g = (byte)((color.G * pixelA / 255) + (lastLayerPixel.G * lastPixelA * (255 - pixelA) / (255 * 255)));
byte b = (byte)((color.B * pixelA / 255) + (lastLayerPixel.B * lastPixelA * (255 - pixelA) / (255 * 255)));
byte a = (byte)(pixelA + (lastPixelA * (255 - pixelA) / 255));
byte r = (byte)((color.R * pixelA / 255) + (lastLayerPixel.R * lastLayerPixel.A * (255 - pixelA) / (255 * 255)));
byte g = (byte)((color.G * pixelA / 255) + (lastLayerPixel.G * lastLayerPixel.A * (255 - pixelA) / (255 * 255)));
byte b = (byte)((color.B * pixelA / 255) + (lastLayerPixel.B * lastLayerPixel.A * (255 - pixelA) / (255 * 255)));
byte a = (byte)(pixelA + (lastLayerPixel.A * (255 - pixelA) / 255));
color = Color.FromArgb(a, r, g, b);
}
else
{
color = Color.FromArgb((byte)(color.A * layers[i].Opacity), color.R, color.G, color.B);
color = Color.FromArgb(color.A, color.R, color.G, color.B);
}

if (color.A != 0 || color.R != 0 || color.B != 0 || color.G != 0)
if (color.A > 0)
{
finalBitmap.SetPixel(x, y, color);
}
Expand Down

0 comments on commit b090499

Please sign in to comment.