?? gdk-pixbuf-xlib-drawable.c
字號:
/* check for last remaining pixel */ if (width & 1) { register guint16 data;#ifdef LITTLE data = *((short *) s); data = ((data >> 8) & 0xff) | ((data & 0xff) << 8);#else data = *((short *) s);#endif ((char *) o)[0] = ((data >> 8) & 0xf8) | ((data >> 13) & 0x7); ((char *) o)[1] = ((data >> 3) & 0xfc) | ((data >> 9) & 0x3); ((char *) o)[2] = ((data << 3) & 0xf8) | ((data >> 2) & 0x7); } srow += bpl; orow += rowstride; }}/* convert 16 bits/pixel data with alpha data in lsb format*/static voidrgb565alsb (XImage *image, guchar *pixels, int rowstride, xlib_colormap *colormap){ int xx, yy; int width, height; int bpl;#ifdef LITTLE register guint16 *s; /* read 1 pixels at once */#else register guint8 *s;#endif register guint32 *o; guint8 *srow = image->data, *orow = pixels; width = image->width; height = image->height; bpl = image->bytes_per_line; for (yy = 0; yy < height; yy++) {#ifdef LITTLE s = (guint16 *) srow;#else s = (guint8 *) srow;#endif o = (guint32 *) orow; for (xx = 0; xx < width; xx ++) { register guint32 data; /* rrrrrggg gggbbbbb -> rrrrrRRR ggggggGG bbbbbBBB aaaaaaaa */ /* little endian: aaaaaaaa bbbbbBBB ggggggGG rrrrrRRR */#ifdef LITTLE data = *s++; *o++ = (data & 0xf800) >> 8 | (data & 0xe000) >> 13 | (data & 0x7e0) << 5 | (data & 0x600) >> 1 | (data & 0x1f) << 19 | (data & 0x1c) << 14 | 0xff000000;#else /* swap endianness first */ data = s[0] | s[1] << 8; s += 2; *o++ = (data & 0xf800) << 16 | (data & 0xe000) << 11 | (data & 0x7e0) << 13 | (data & 0x600) << 7 | (data & 0x1f) << 11 | (data & 0x1c) << 6 | 0xff;#endif } srow += bpl; orow += rowstride; }}/* convert 16 bits/pixel data with alpha data in msb format*/static voidrgb565amsb (XImage *image, guchar *pixels, int rowstride, xlib_colormap *colormap){ int xx, yy; int width, height; int bpl;#ifdef LITTLE register guint8 *s;#else register guint16 *s; /* read 1 pixels at once */#endif register guint32 *o; guint8 *srow = image->data, *orow = pixels; width = image->width; height = image->height; bpl = image->bytes_per_line; for (yy = 0; yy < height; yy++) {#ifdef LITTLE s = srow;#else s = (guint16 *) srow;#endif o = (guint32 *) orow; for (xx = 0; xx < width; xx ++) { register guint32 data; /* rrrrrggg gggbbbbb -> rrrrrRRR gggggg00 bbbbbBBB aaaaaaaa */ /* little endian: aaaaaaaa bbbbbBBB gggggg00 rrrrrRRR */#ifdef LITTLE /* swap endianness first */ data = s[0] | s[1] << 8; s += 2; *o++ = (data & 0xf800) >> 8 | (data & 0xe000) >> 13 | (data & 0x7e0) << 5 | (data & 0x600) >> 1 | (data & 0x1f) << 19 | (data & 0x1c) << 14 | 0xff000000;#else data = *s++; *o++ = (data & 0xf800) << 16 | (data & 0xe000) << 11 | (data & 0x7e0) << 13 | (data & 0x600) << 7 | (data & 0x1f) << 11 | (data & 0x1c) << 6 | 0xff;#endif } srow += bpl; orow += rowstride; }}/* convert 15 bits/pixel data no alpha data in lsb format*/static voidrgb555lsb (XImage *image, guchar *pixels, int rowstride, xlib_colormap *colormap){ int xx, yy; int width, height; int bpl;#ifdef LITTLE register guint32 *s; /* read 2 pixels at once */#else register guint8 *s; /* read 2 pixels at once */#endif register guint16 *o; guint8 *srow = image->data, *orow = pixels; width = image->width; height = image->height; bpl = image->bytes_per_line; for (yy = 0; yy < height; yy++) {#ifdef LITTLE s = (guint32 *) srow;#else s = srow;#endif o = (guint16 *) orow; for (xx = 1; xx < width; xx += 2) { register guint32 data;#ifdef LITTLE data = *s++; *o++ = (data & 0x7c00) >> 7 | (data & 0x7000) >> 12 | (data & 0x3e0) << 6 | (data & 0x380) << 1; *o++ = (data & 0x1f) << 3 | (data & 0x1c) >> 2 | (data & 0x7c000000) >> 15 | (data & 0x70000000) >> 20; *o++ = (data & 0x3e00000) >> 18 | (data & 0x3800000) >> 23 | (data & 0x1f0000) >> 5 | (data & 0x1c0000) >> 10;#else /* swap endianness first */ data = s[1] | s[0] << 8 | s[3] << 16 | s[2] << 24; s += 4; *o++ = (data & 0x7c00) << 1 | (data & 0x7000) >> 4 | (data & 0x3e0) >> 2 | (data & 0x380) >> 7; *o++ = (data & 0x1f) << 11 | (data & 0x1c) << 6 | (data & 0x7c000000) >> 23 | (data & 0x70000000) >> 28; *o++ = (data & 0x3e00000) >> 10 | (data & 0x3800000) >> 15 | (data & 0x1f0000) >> 13 | (data & 0x1c0000) >> 18;#endif } /* check for last remaining pixel */ if (width & 1) { register guint16 data;#ifdef LITTLE data = *((short *) s);#else data = *((short *) s); data = ((data >> 8) & 0xff) | ((data & 0xff) << 8);#endif ((char *) o)[0] = (data & 0x7c00) >> 7 | (data & 0x7000) >> 12; ((char *) o)[1] = (data & 0x3e0) >> 2 | (data & 0x380) >> 7; ((char *) o)[2] = (data & 0x1f) << 3 | (data & 0x1c) >> 2; } srow += bpl; orow += rowstride; }}/* convert 15 bits/pixel data no alpha data in msb format*/static voidrgb555msb (XImage *image, guchar *pixels, int rowstride, xlib_colormap *colormap){ int xx, yy; int width, height; int bpl;#ifdef LITTLE register guint8 *s; /* read 2 pixels at once */#else register guint32 *s; /* read 2 pixels at once */#endif register guint16 *o; guint8 *srow = image->data, *orow = pixels; width = image->width; height = image->height; bpl = image->bytes_per_line; for (yy = 0; yy < height; yy++) {#ifdef LITTLE s = srow;#else s = (guint32 *) srow;#endif o = (guint16 *) orow; for (xx = 1; xx < width; xx += 2) { register guint32 data;#ifdef LITTLE /* swap endianness first */ data = s[1] | s[0] << 8 | s[3] << 16 | s[2] << 24; s += 4; *o++ = (data & 0x7c00) >> 7 | (data & 0x7000) >> 12 | (data & 0x3e0) << 6 | (data & 0x380) << 1; *o++ = (data & 0x1f) << 3 | (data & 0x1c) >> 2 | (data & 0x7c000000) >> 15 | (data & 0x70000000) >> 20; *o++ = (data & 0x3e00000) >> 18 | (data & 0x3800000) >> 23 | (data & 0x1f0000) >> 5 | (data & 0x1c0000) >> 10;#else data = *s++; *o++ = (data & 0x7c00) << 1 | (data & 0x7000) >> 4 | (data & 0x3e0) >> 2 | (data & 0x380) >> 7; *o++ = (data & 0x1f) << 11 | (data & 0x1c) << 6 | (data & 0x7c000000) >> 23 | (data & 0x70000000) >> 28; *o++ = (data & 0x3e00000) >> 10 | (data & 0x3800000) >> 15 | (data & 0x1f0000) >> 13 | (data & 0x1c0000) >> 18;#endif } /* check for last remaining pixel */ if (width & 1) { register guint16 data;#ifdef LITTLE data = *((short *) s); data = ((data >> 8) & 0xff) | ((data & 0xff) << 8);#else data = *((short *) s);#endif ((char *) o)[0] = (data & 0x7c00) >> 7 | (data & 0x7000) >> 12; ((char *) o)[1] = (data & 0x3e0) >> 2 | (data & 0x380) >> 7; ((char *) o)[2] = (data & 0x1f) << 3 | (data & 0x1c) >> 2; } srow += bpl; orow += rowstride; }}/* convert 15 bits/pixel data with alpha data in lsb format*/static voidrgb555alsb (XImage *image, guchar *pixels, int rowstride, xlib_colormap *colormap){ int xx, yy; int width, height; int bpl;#ifdef LITTLE register guint16 *s; /* read 1 pixels at once */#else register guint8 *s;#endif register guint32 *o; guint8 *srow = image->data, *orow = pixels; width = image->width; height = image->height; bpl = image->bytes_per_line; for (yy = 0; yy < height; yy++) {#ifdef LITTLE s = (guint16 *) srow;#else s = srow;#endif o = (guint32 *) orow; for (xx = 0; xx < width; xx++) { register guint32 data; /* rrrrrggg gggbbbbb -> rrrrrRRR gggggGGG bbbbbBBB aaaaaaaa */ /* little endian: aaaaaaaa bbbbbBBB gggggGGG rrrrrRRR */#ifdef LITTLE data = *s++; *o++ = (data & 0x7c00) >> 7 | (data & 0x7000) >> 12 | (data & 0x3e0) << 6 | (data & 0x380) << 1 | (data & 0x1f) << 19 | (data & 0x1c) << 14 | 0xff000000;#else /* swap endianness first */ data = s[0] | s[1] << 8; s += 2; *o++ = (data & 0x7c00) << 17 | (data & 0x7000) << 12 | (data & 0x3e0) << 14 | (data & 0x380) << 9 | (data & 0x1f) << 11 | (data & 0x1c) << 6 | 0xff;#endif } srow += bpl; orow += rowstride; }}/* convert 15 bits/pixel data with alpha data in msb format*/static voidrgb555amsb (XImage *image, guchar *pixels, int rowstride, xlib_colormap *colormap){ int xx, yy; int width, height; int bpl;#ifdef LITTLE register guint16 *s; /* read 1 pixels at once */#else register guint8 *s;#endif register guint32 *o; guint8 *srow = image->data, *orow = pixels; width = image->width; height = image->height; bpl = image->bytes_per_line; for (yy = 0; yy < height; yy++) {#ifdef LITTLE s = (guint16 *) srow;#else s = srow;#endif o = (guint32 *) orow; for (xx = 0; xx < width; xx++) { register guint32 data; /* rrrrrggg gggbbbbb -> rrrrrRRR gggggGGG bbbbbBBB aaaaaaaa */ /* little endian: aaaaaaaa bbbbbBBB gggggGGG rrrrrRRR */#ifdef LITTLE /* swap endianness first */ data = s[0] | s[1] << 8; s += 2; *o++ = (data & 0x7c00) >> 7 | (data & 0x7000) >> 12 | (data & 0x3e0) << 6 | (data & 0x380) << 1 | (data & 0x1f) << 19 | (data & 0x1c) << 14 | 0xff000000;#else data = *s++; *o++ = (data & 0x7c00) << 17 | (data & 0x7000) << 12 | (data & 0x3e0) << 14 | (data & 0x380) << 9 | (data & 0x1f) << 11 | (data & 0x1c) << 6 | 0xff;#endif } srow += bpl; orow += rowstride; }}static voidrgb888alsb (XImage *image, guchar *pixels, int rowstride, xlib_colormap *colormap){ int xx, yy; int width, height; int bpl; guint8 *s; /* for byte order swapping */ guint8 *o; guint8 *srow = image->data, *orow = pixels; width = image->width; height = image->height; bpl = image->bytes_per_line; d (printf ("32 bits/pixel with alpha\n")); /* lsb data */ for (yy = 0; yy < height; yy++) { s = srow; o = orow; for (xx = 0; xx < width; xx++) { *o++ = s[2]; *o++ = s[1]; *o++ = s[0]; *o++ = 0xff; s += 4; } srow += bpl; orow += rowstride; }}static voidrgb888lsb (XImage *image, guchar *pixels, int rowstride, xlib_colormap *colormap){ int xx, yy; int width, height; int bpl; guint8 *srow = image->data, *orow = pixels; guint8 *o, *s; width = image->width; height = image->height; bpl = image->bytes_per_line; d (printf ("32 bit, lsb, no alpha\n")); for (yy = 0; yy < height; yy++) { s = srow; o = orow; for (xx = 0; xx < width; xx++) { *o++ = s[2]; *o++ = s[1]; *o++ = s[0]; s += 4; } srow += bpl;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -