summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKim Woelders <kim@woelders.dk>2020-12-06 13:53:58 +0100
committerKim Woelders <kim@woelders.dk>2020-12-06 14:16:45 +0100
commite3be3eb0fc11d7ddf6af2ab9aa8c457f6f1f4def (patch)
tree1618b6b87fed493f1971f6fed379dfd92ee3e15d
parent9219b2c6a35931dec819610afe1b388153364141 (diff)
downloadimlib2-e3be3eb0fc11d7ddf6af2ab9aa8c457f6f1f4def.tar.gz
grab.c: Support 30bpp display in __imlib_GrabXImageToRGBA()
Patch by the_third. https://phab.enlightenment.org/T8808
-rw-r--r--src/lib/grab.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/lib/grab.c b/src/lib/grab.c
index 6c935b8..3e41351 100644
--- a/src/lib/grab.c
+++ b/src/lib/grab.c
@@ -91,6 +91,7 @@ __imlib_GrabXImageToRGBA(DATA32 * data, int ox, int oy, int ow, int oh,
break;
case 24:
case 25:
+ case 30:
case 32:
for (y = 0; y < h; y++)
{
@@ -439,6 +440,82 @@ __imlib_GrabXImageToRGBA(DATA32 * data, int ox, int oy, int ow, int oh,
}
}
break;
+ case 30:
+ if (bgr)
+ {
+ if (mxim)
+ {
+ for (y = 0; y < h; y++)
+ {
+ src = (DATA32 *) (xim->data + (xim->bytes_per_line * y));
+ ptr = data + ((y + iny) * ow) + inx;
+ for (x = 0; x < w; x++)
+ {
+ pixel = (((*src) & 0x000003ff) << 14 & 0x00ff0000) |
+ (((*src) & 0x000ffc00) >> 4 & 0x0000ff00) |
+ (((*src) & 0x3ff00000) >> 22 & 0x000000ff);
+ if (XGetPixel(mxim, x, y))
+ pixel |= 0xff000000;
+ *ptr++ = pixel;
+ src++;
+ }
+ }
+ }
+ else
+ {
+ for (y = 0; y < h; y++)
+ {
+ src = (DATA32 *) (xim->data + (xim->bytes_per_line * y));
+ ptr = data + ((y + iny) * ow) + inx;
+ for (x = 0; x < w; x++)
+ {
+ *ptr++ = 0xff000000 |
+ (((*src) & 0x000003ff) << 14 & 0x00ff0000) |
+ (((*src) & 0x000ffc00) >> 4 & 0x0000ff00) |
+ (((*src) & 0x3ff00000) >> 22 & 0x000000ff);
+ src++;
+ }
+ }
+ }
+ }
+ else
+ {
+ if (mxim)
+ {
+ for (y = 0; y < h; y++)
+ {
+ src = (DATA32 *) (xim->data + (xim->bytes_per_line * y));
+ ptr = data + ((y + iny) * ow) + inx;
+ for (x = 0; x < w; x++)
+ {
+ pixel = (((*src) & 0x3ff00000) >> 6 & 0x00ff0000) |
+ (((*src) & 0x000ffc00) >> 4 & 0x0000ff00) |
+ (((*src) & 0x000003ff) >> 2 & 0x000000ff);
+ if (XGetPixel(mxim, x, y))
+ pixel |= 0xff000000;
+ *ptr++ = pixel;
+ src++;
+ }
+ }
+ }
+ else
+ {
+ for (y = 0; y < h; y++)
+ {
+ src = (DATA32 *) (xim->data + (xim->bytes_per_line * y));
+ ptr = data + ((y + iny) * ow) + inx;
+ for (x = 0; x < w; x++)
+ {
+ *ptr++ = 0xff000000 |
+ (((*src) & 0x3ff00000) >> 6 & 0x00ff0000) |
+ (((*src) & 0x000ffc00) >> 4 & 0x0000ff00) |
+ (((*src) & 0x000003ff) >> 2 & 0x000000ff);
+ src++;
+ }
+ }
+ }
+ }
+ break;
case 32:
if (bgr)
{