⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdk-pixbuf-xlib-drawable.c

📁 linux下电话本所依赖的一些图形库
💻 C
📖 第 1 页 / 共 3 页
字号:
		/* 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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -