diff options
author | Kim Woelders <kim@woelders.dk> | 2020-12-06 13:53:58 +0100 |
---|---|---|
committer | Kim Woelders <kim@woelders.dk> | 2020-12-06 14:16:45 +0100 |
commit | e3be3eb0fc11d7ddf6af2ab9aa8c457f6f1f4def (patch) | |
tree | 1618b6b87fed493f1971f6fed379dfd92ee3e15d | |
parent | 9219b2c6a35931dec819610afe1b388153364141 (diff) | |
download | imlib2-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.c | 77 |
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) { |