mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-08-17 10:44:45 +03:00
Add BGRa for compatibility with cairo
This commit is contained in:
parent
bc2c933552
commit
53eb33dd6d
|
@ -40,6 +40,7 @@ def getmode(mode):
|
||||||
_modes[m] = ModeDescriptor(m, bands, basemode, basetype)
|
_modes[m] = ModeDescriptor(m, bands, basemode, basetype)
|
||||||
# extra experimental modes
|
# extra experimental modes
|
||||||
_modes["RGBa"] = ModeDescriptor("RGBa", ("R", "G", "B", "a"), "RGB", "L")
|
_modes["RGBa"] = ModeDescriptor("RGBa", ("R", "G", "B", "a"), "RGB", "L")
|
||||||
|
_modes["BGRa"] = ModeDescriptor("BGRa", ("B", "G", "R", "a"), "BGR", "L")
|
||||||
_modes["LA"] = ModeDescriptor("LA", ("L", "A"), "L", "L")
|
_modes["LA"] = ModeDescriptor("LA", ("L", "A"), "L", "L")
|
||||||
_modes["La"] = ModeDescriptor("La", ("L", "a"), "L", "L")
|
_modes["La"] = ModeDescriptor("La", ("L", "a"), "L", "L")
|
||||||
_modes["PA"] = ModeDescriptor("PA", ("P", "A"), "RGB", "L")
|
_modes["PA"] = ModeDescriptor("PA", ("P", "A"), "RGB", "L")
|
||||||
|
|
|
@ -454,6 +454,21 @@ rgbA2rgba(UINT8* out, const UINT8* in, int xsize)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
rgbA2bgra(UINT8* out, const UINT8* in, int xsize)
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
unsigned int alpha, tmp;
|
||||||
|
for (x = 0; x < xsize; x++) {
|
||||||
|
alpha = in[3];
|
||||||
|
*out++ = MULDIV255(in[2], alpha, tmp);
|
||||||
|
*out++ = MULDIV255(in[1], alpha, tmp);
|
||||||
|
*out++ = MULDIV255(in[0], alpha, tmp);
|
||||||
|
*out++ = in[3];
|
||||||
|
in += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* RGBa -> RGBA conversion to remove premultiplication
|
/* RGBa -> RGBA conversion to remove premultiplication
|
||||||
Needed for correct transforms/resizing on RGBA images */
|
Needed for correct transforms/resizing on RGBA images */
|
||||||
static void
|
static void
|
||||||
|
@ -476,6 +491,26 @@ rgba2rgbA(UINT8* out, const UINT8* in, int xsize)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
bgra2rgbA(UINT8* out, const UINT8* in, int xsize)
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
unsigned int alpha;
|
||||||
|
for (x = 0; x < xsize; x++, in+=4) {
|
||||||
|
alpha = in[3];
|
||||||
|
if (alpha == 255 || alpha == 0) {
|
||||||
|
*out++ = in[2];
|
||||||
|
*out++ = in[1];
|
||||||
|
*out++ = in[0];
|
||||||
|
} else {
|
||||||
|
*out++ = CLIP((255 * in[2]) / alpha);
|
||||||
|
*out++ = CLIP((255 * in[1]) / alpha);
|
||||||
|
*out++ = CLIP((255 * in[0]) / alpha);
|
||||||
|
}
|
||||||
|
*out++ = in[3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Conversion of RGB + single transparent color to RGBA,
|
* Conversion of RGB + single transparent color to RGBA,
|
||||||
* where any pixel that matches the color will have the
|
* where any pixel that matches the color will have the
|
||||||
|
@ -834,11 +869,13 @@ static struct {
|
||||||
{ "RGBA", "F", rgb2f },
|
{ "RGBA", "F", rgb2f },
|
||||||
{ "RGBA", "RGB", rgba2rgb },
|
{ "RGBA", "RGB", rgba2rgb },
|
||||||
{ "RGBA", "RGBa", rgbA2rgba },
|
{ "RGBA", "RGBa", rgbA2rgba },
|
||||||
|
{ "RGBA", "BGRa", rgbA2bgra },
|
||||||
{ "RGBA", "RGBX", rgb2rgba },
|
{ "RGBA", "RGBX", rgb2rgba },
|
||||||
{ "RGBA", "CMYK", rgb2cmyk },
|
{ "RGBA", "CMYK", rgb2cmyk },
|
||||||
{ "RGBA", "YCbCr", ImagingConvertRGB2YCbCr },
|
{ "RGBA", "YCbCr", ImagingConvertRGB2YCbCr },
|
||||||
|
|
||||||
{ "RGBa", "RGBA", rgba2rgbA },
|
{ "RGBa", "RGBA", rgba2rgbA },
|
||||||
|
{ "BGRa", "RGBA", bgra2rgbA },
|
||||||
|
|
||||||
{ "RGBX", "1", rgb2bit },
|
{ "RGBX", "1", rgb2bit },
|
||||||
{ "RGBX", "L", rgb2l },
|
{ "RGBX", "L", rgb2l },
|
||||||
|
|
|
@ -534,6 +534,7 @@ static struct {
|
||||||
{"RGBa", "RGBa", 32, copy4},
|
{"RGBa", "RGBa", 32, copy4},
|
||||||
{"RGBa", "BGRa", 32, ImagingPackBGRA},
|
{"RGBa", "BGRa", 32, ImagingPackBGRA},
|
||||||
{"RGBa", "aBGR", 32, ImagingPackABGR},
|
{"RGBa", "aBGR", 32, ImagingPackABGR},
|
||||||
|
{"BGRa", "BGRa", 32, copy4},
|
||||||
|
|
||||||
/* true colour w. padding */
|
/* true colour w. padding */
|
||||||
{"RGBX", "RGBX", 32, copy4},
|
{"RGBX", "RGBX", 32, copy4},
|
||||||
|
|
|
@ -179,6 +179,11 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize,
|
||||||
im->bands = im->pixelsize = 4;
|
im->bands = im->pixelsize = 4;
|
||||||
im->linesize = xsize * 4;
|
im->linesize = xsize * 4;
|
||||||
|
|
||||||
|
} else if (strcmp(mode, "BGRa") == 0) {
|
||||||
|
/* 32-bit true colour images with premultiplied alpha */
|
||||||
|
im->bands = im->pixelsize = 4;
|
||||||
|
im->linesize = xsize * 4;
|
||||||
|
|
||||||
} else if (strcmp(mode, "CMYK") == 0) {
|
} else if (strcmp(mode, "CMYK") == 0) {
|
||||||
/* 32-bit colour separation */
|
/* 32-bit colour separation */
|
||||||
im->bands = im->pixelsize = 4;
|
im->bands = im->pixelsize = 4;
|
||||||
|
|
|
@ -747,6 +747,30 @@ unpackRGBa(UINT8* out, const UINT8* in, int pixels)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
unpackBGRa(UINT8* out, const UINT8* in, int pixels)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
/* premultiplied BGRA */
|
||||||
|
for (i = 0; i < pixels; i++) {
|
||||||
|
int a = in[3];
|
||||||
|
if (!a)
|
||||||
|
out[R] = out[G] = out[B] = out[A] = 0;
|
||||||
|
else if (a == 255) {
|
||||||
|
out[R] = in[2];
|
||||||
|
out[G] = in[1];
|
||||||
|
out[B] = in[0];
|
||||||
|
out[A] = a;
|
||||||
|
} else {
|
||||||
|
out[R] = CLIP(in[2] * 255 / a);
|
||||||
|
out[G] = CLIP(in[1] * 255 / a);
|
||||||
|
out[B] = CLIP(in[0] * 255 / a);
|
||||||
|
out[A] = a;
|
||||||
|
}
|
||||||
|
out += 4; in += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
unpackRGBAI(UINT8* out, const UINT8* in, int pixels)
|
unpackRGBAI(UINT8* out, const UINT8* in, int pixels)
|
||||||
{
|
{
|
||||||
|
@ -1206,6 +1230,7 @@ static struct {
|
||||||
{"RGBA", "LA;16B", 32, unpackRGBALA16B},
|
{"RGBA", "LA;16B", 32, unpackRGBALA16B},
|
||||||
{"RGBA", "RGBA", 32, copy4},
|
{"RGBA", "RGBA", 32, copy4},
|
||||||
{"RGBA", "RGBa", 32, unpackRGBa},
|
{"RGBA", "RGBa", 32, unpackRGBa},
|
||||||
|
{"RGBA", "BGRa", 32, unpackBGRa},
|
||||||
{"RGBA", "RGBA;I", 32, unpackRGBAI},
|
{"RGBA", "RGBA;I", 32, unpackRGBAI},
|
||||||
{"RGBA", "RGBA;L", 32, unpackRGBAL},
|
{"RGBA", "RGBA;L", 32, unpackRGBAL},
|
||||||
{"RGBA", "RGBA;15", 16, ImagingUnpackRGBA15},
|
{"RGBA", "RGBA;15", 16, ImagingUnpackRGBA15},
|
||||||
|
@ -1226,6 +1251,7 @@ static struct {
|
||||||
{"RGBa", "BGRa", 32, unpackBGRA},
|
{"RGBa", "BGRa", 32, unpackBGRA},
|
||||||
{"RGBa", "aRGB", 32, unpackARGB},
|
{"RGBa", "aRGB", 32, unpackARGB},
|
||||||
{"RGBa", "aBGR", 32, unpackABGR},
|
{"RGBa", "aBGR", 32, unpackABGR},
|
||||||
|
{"BGRa", "BGRa", 32, copy4},
|
||||||
|
|
||||||
/* true colour w. padding */
|
/* true colour w. padding */
|
||||||
{"RGBX", "RGB", 24, ImagingUnpackRGB},
|
{"RGBX", "RGB", 24, ImagingUnpackRGB},
|
||||||
|
|
Loading…
Reference in New Issue
Block a user