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

📄 xputimage.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
/* $XConsortium: XPutImage.c,v 11.60 91/06/07 16:33:38 rws Exp $ *//* Copyright    Massachusetts Institute of Technology    1986	*//*Permission to use, copy, modify, distribute, and sell this software and itsdocumentation for any purpose is hereby granted without fee, provided thatthe above copyright notice appear in all copies and that both thatcopyright notice and this permission notice appear in supportingdocumentation, and that the name of M.I.T. not be used in advertising orpublicity pertaining to distribution of the software without specific,written prior permission.  M.I.T. makes no representations about thesuitability of this software for any purpose.  It is provided "as is"without express or implied warranty.*/#include <X11/Xlibint.h>#include <stdio.h>#if __STDC__#define Const const#else#define Const /**/#endif/* assumes pad is a power of 2 */#define ROUNDUP(nbytes, pad) (((nbytes) + ((pad) - 1)) & ~(long)((pad) - 1))static unsigned char Const _reverse_byte[0x100] = {	0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,	0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,	0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,	0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,	0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,	0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,	0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,	0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,	0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,	0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,	0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,	0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,	0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,	0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,	0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,	0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,	0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,	0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,	0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,	0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,	0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,	0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,	0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,	0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,	0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,	0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,	0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,	0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,	0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,	0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,	0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,	0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff};static unsigned char Const _reverse_nibs[0x100] = {	0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,	0x80, 0x90, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0,	0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,	0x81, 0x91, 0xa1, 0xb1, 0xc1, 0xd1, 0xe1, 0xf1,	0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,	0x82, 0x92, 0xa2, 0xb2, 0xc2, 0xd2, 0xe2, 0xf2,	0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,	0x83, 0x93, 0xa3, 0xb3, 0xc3, 0xd3, 0xe3, 0xf3,	0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,	0x84, 0x94, 0xa4, 0xb4, 0xc4, 0xd4, 0xe4, 0xf4,	0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,	0x85, 0x95, 0xa5, 0xb5, 0xc5, 0xd5, 0xe5, 0xf5,	0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,	0x86, 0x96, 0xa6, 0xb6, 0xc6, 0xd6, 0xe6, 0xf6,	0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,	0x87, 0x97, 0xa7, 0xb7, 0xc7, 0xd7, 0xe7, 0xf7,	0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,	0x88, 0x98, 0xa8, 0xb8, 0xc8, 0xd8, 0xe8, 0xf8,	0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,	0x89, 0x99, 0xa9, 0xb9, 0xc9, 0xd9, 0xe9, 0xf9,	0x0a, 0x1a, 0x2a, 0x3a, 0x4a, 0x5a, 0x6a, 0x7a,	0x8a, 0x9a, 0xaa, 0xba, 0xca, 0xda, 0xea, 0xfa,	0x0b, 0x1b, 0x2b, 0x3b, 0x4b, 0x5b, 0x6b, 0x7b,	0x8b, 0x9b, 0xab, 0xbb, 0xcb, 0xdb, 0xeb, 0xfb,	0x0c, 0x1c, 0x2c, 0x3c, 0x4c, 0x5c, 0x6c, 0x7c,	0x8c, 0x9c, 0xac, 0xbc, 0xcc, 0xdc, 0xec, 0xfc,	0x0d, 0x1d, 0x2d, 0x3d, 0x4d, 0x5d, 0x6d, 0x7d,	0x8d, 0x9d, 0xad, 0xbd, 0xcd, 0xdd, 0xed, 0xfd,	0x0e, 0x1e, 0x2e, 0x3e, 0x4e, 0x5e, 0x6e, 0x7e,	0x8e, 0x9e, 0xae, 0xbe, 0xce, 0xde, 0xee, 0xfe,	0x0f, 0x1f, 0x2f, 0x3f, 0x4f, 0x5f, 0x6f, 0x7f,	0x8f, 0x9f, 0xaf, 0xbf, 0xcf, 0xdf, 0xef, 0xff};_XReverse_Bytes (bpt, nb)    register unsigned char *bpt;    register int nb;{    do {	*bpt = _reverse_byte[*bpt];	bpt++;    } while (--nb > 0);    return;}/* XXX the following functions are declared int instead of void because various * compilers and lints complain about later intialization of SwapFunc and/or * (swapfunc == NoSwap) when void is used. *//*ARGSUSED*/static intNoSwap (src, dest, srclen, srcinc, destinc, height, half_order)    register unsigned char *src, *dest;    long srclen, srcinc, destinc;    unsigned int height;    int half_order;{    long h = height;    if (srcinc == destinc)	bcopy((char *)src, (char *)dest, (int)(srcinc * (h - 1) + srclen));    else	for (; --h >= 0; src += srcinc, dest += destinc)	    bcopy((char *)src, (char *)dest, (int)srclen);}static intSwapTwoBytes (src, dest, srclen, srcinc, destinc, height, half_order)    register unsigned char *src, *dest;    long srclen, srcinc, destinc;    unsigned int height;    int half_order;{    long length = ROUNDUP(srclen, 2);    register long h, n;    srcinc -= length;    destinc -= length;    for (h = height; --h >= 0; src += srcinc, dest += destinc) {	if ((h == 0) && (srclen != length)) {	    length -= 2;	    if (half_order == MSBFirst)		*(dest + length) = *(src + length + 1);	    else		*(dest + length + 1) = *(src + length);	}	for (n = length; n > 0; n -= 2, src += 2) {	    *dest++ = *(src + 1);	    *dest++ = *src;	}    }}static intSwapThreeBytes (src, dest, srclen, srcinc, destinc, height, byte_order)    register unsigned char *src, *dest;    long srclen, srcinc, destinc;    unsigned int height;    int byte_order;{    long length = ((srclen + 2) / 3) * 3;    register long h, n;    srcinc -= length;    destinc -= length;    for (h = height; --h >= 0; src += srcinc, dest += destinc) {	if ((h == 0) && (srclen != length)) {	    length -= 3;	    if ((srclen - length) == 2)		*(dest + length + 1) = *(src + length + 1);	    if (byte_order == MSBFirst)		*(dest + length) = *(src + length + 2);	    else		*(dest + length + 2) = *(src + length);	}	for (n = length; n > 0; n -= 3, src += 3) {	    *dest++ = *(src + 2);	    *dest++ = *(src + 1);	    *dest++ = *src;	}    }}static intSwapFourBytes (src, dest, srclen, srcinc, destinc, height, half_order)    register unsigned char *src, *dest;    long srclen, srcinc, destinc;    unsigned int height;    int half_order;{    long length = ROUNDUP(srclen, 4);    register long h, n;    srcinc -= length;    destinc -= length;    for (h = height; --h >= 0; src += srcinc, dest += destinc) {	if ((h == 0) && (srclen != length)) {	    length -= 4;	    if (half_order == MSBFirst)		*(dest + length) = *(src + length + 3);	    if (((half_order == LSBFirst) && ((srclen - length) == 3)) ||		((half_order == MSBFirst) && (srclen & 2)))		*(dest + length + 1) = *(src + length + 2);	    if (((half_order == MSBFirst) && ((srclen - length) == 3)) ||		((half_order == LSBFirst) && (srclen & 2)))		*(dest + length + 2) = *(src + length + 1);	    if (half_order == LSBFirst)		*(dest + length + 3) = *(src + length);	}	for (n = length; n > 0; n -= 4, src += 4) {	    *dest++ = *(src + 3);	    *dest++ = *(src + 2);	    *dest++ = *(src + 1);	    *dest++ = *src;	}    }}static intSwapWords (src, dest, srclen, srcinc, destinc, height, half_order)    register unsigned char *src, *dest;    long srclen, srcinc, destinc;    unsigned int height;    int half_order;{    long length = ROUNDUP(srclen, 4);    register long h, n;    srcinc -= length;    destinc -= length;    for (h = height; --h >= 0; src += srcinc, dest += destinc) {	if ((h == 0) && (srclen != length)) {	    length -= 4;	    if (half_order == MSBFirst)		*(dest + length + 1) = *(src + length + 3);	    if (((half_order == LSBFirst) && ((srclen - length) == 3)) ||		((half_order == MSBFirst) && (srclen & 2)))		*(dest + length) = *(src + length + 2);	    if (((half_order == MSBFirst) && ((srclen - length) == 3)) ||		((half_order == LSBFirst) && (srclen & 2)))		*(dest + length + 3) = *(src + length + 1);	    if (half_order == LSBFirst)		*(dest + length + 2) = *(src + length);	}	for (n = length; n > 0; n -= 4, src += 2) {	    *dest++ = *(src + 2);	    *dest++ = *(src + 3);	    *dest++ = *src++;	    *dest++ = *src++;	}    }}static intSwapNibbles (src, dest, srclen, srcinc, destinc, height)    register unsigned char *src, *dest;    long srclen, srcinc, destinc;    unsigned int height;{    register long h, n;    register Const unsigned char *rev = _reverse_nibs;    srcinc -= srclen;    destinc -= srclen;    for (h = height; --h >= 0; src += srcinc, dest += destinc)	for (n = srclen; --n >= 0; )	    *dest++ = rev[*src++];}static intShiftNibblesLeft (src, dest, srclen, srcinc, destinc, height, nibble_order)    register unsigned char *src, *dest;    long srclen, srcinc, destinc;    unsigned int height;    int nibble_order;{    register long h, n;    register unsigned char c1, c2;    srcinc -= srclen;    destinc -= srclen;    if (nibble_order == MSBFirst) {	for (h = height; --h >= 0; src += srcinc, dest += destinc)	    for (n = srclen; --n >= 0; ) {		c1 = *src++;		c2 = *src;		*dest++ = ((c1 & 0x0f) << 4) | ((c2 & (unsigned)0xf0) >> 4);	    }    } else {	for (h = height; --h >= 0; src += srcinc, dest += destinc)	    for (n = srclen; --n >= 0; ) {		c1 = *src++;		c2 = *src;		*dest++ = ((c2 & 0x0f) << 4) | ((c1 & (unsigned)0xf0) >> 4);	    }    }}/*ARGSUSED*/static intSwapBits (src, dest, srclen, srcinc, destinc, height, half_order)    register unsigned char *src, *dest;    long srclen, srcinc, destinc;    unsigned int height;    int half_order;{    register long h, n;    register Const unsigned char *rev = _reverse_byte;    srcinc -= srclen;    destinc -= srclen;    for (h = height; --h >= 0; src += srcinc, dest += destinc)	for (n = srclen; --n >= 0; )	    *dest++ = rev[*src++];}static intSwapBitsAndTwoBytes (src, dest, srclen, srcinc, destinc, height, half_order)    register unsigned char *src, *dest;    long srclen, srcinc, destinc;    unsigned int height;{    long length = ROUNDUP(srclen, 2);    register long h, n;    register Const unsigned char *rev = _reverse_byte;    srcinc -= length;    destinc -= length;    for (h = height; --h >= 0; src += srcinc, dest += destinc) {	if ((h == 0) && (srclen != length)) {	    length -= 2;	    if (half_order == MSBFirst)		*(dest + length) = rev[*(src + length + 1)];	    else		*(dest + length + 1) = rev[*(src + length)];	}	for (n = length; n > 0; n -= 2, src += 2) {	    *dest++ = rev[*(src + 1)];	    *dest++ = rev[*src];	}    }}static intSwapBitsAndFourBytes (src, dest, srclen, srcinc, destinc, height, half_order)    register unsigned char *src, *dest;    long srclen, srcinc, destinc;    unsigned int height;    int half_order;{    long length = ROUNDUP(srclen, 4);    register long h, n;    register Const unsigned char *rev = _reverse_byte;    srcinc -= length;    destinc -= length;    for (h = height; --h >= 0; src += srcinc, dest += destinc) {	if ((h == 0) && (srclen != length)) {	    length -= 4;	    if (half_order == MSBFirst)		*(dest + length) = rev[*(src + length + 3)];	    if (((half_order == LSBFirst) && ((srclen - length) == 3)) ||		((half_order == MSBFirst) && (srclen & 2)))		*(dest + length + 1) = rev[*(src + length + 2)];	    if (((half_order == MSBFirst) && ((srclen - length) == 3)) ||		((half_order == LSBFirst) && (srclen & 2)))		*(dest + length + 2) = rev[*(src + length + 1)];	    if (half_order == LSBFirst)		*(dest + length + 3) = rev[*(src + length)];	}	for (n = length; n > 0; n -= 4, src += 4) {	    *dest++ = rev[*(src + 3)];	    *dest++ = rev[*(src + 2)];	    *dest++ = rev[*(src + 1)];	    *dest++ = rev[*src];	}    }}static intSwapBitsAndWords (src, dest, srclen, srcinc, destinc, height, half_order)    register unsigned char *src, *dest;    long srclen, srcinc, destinc;    unsigned int height;    int half_order;{    long length = ROUNDUP(srclen, 4);    register long h, n;    register Const unsigned char *rev = _reverse_byte;    srcinc -= length;    destinc -= length;    for (h = height; --h >= 0; src += srcinc, dest += destinc) {	if ((h == 0) && (srclen != length)) {	    length -= 4;	    if (half_order == MSBFirst)		*(dest + length + 1) = rev[*(src + length + 3)];	    if (((half_order == LSBFirst) && ((srclen - length) == 3)) ||		((half_order == MSBFirst) && (srclen & 2)))		*(dest + length) = rev[*(src + length + 2)];	    if (((half_order == MSBFirst) && ((srclen - length) == 3)) ||		((half_order == LSBFirst) && (srclen & 2)))		*(dest + length + 3) = rev[*(src + length + 1)];	    if (half_order == LSBFirst)		*(dest + length + 2) = rev[*(src + length)];	}	for (n = length; n > 0; n -= 4, src += 2) {	    *dest++ = rev[*(src + 2)];	    *dest++ = rev[*(src + 3)];	    *dest++ = rev[*src++];	    *dest++ = rev[*src++];	}    }}/*The following table gives the bit ordering within bytes (when accessedsequentially) for a scanline containing 32 bits, with bits numbered 0 to31, where bit 0 should be leftmost on the display.  For a given bytelabelled A-B, A is for the most significant bit of the byte, and B isfor the least significant bit.legend:	1   scanline-unit = 8	2   scanline-unit = 16	4   scanline-unit = 32	M   byte-order = MostSignificant	L   byte-order = LeastSignificant	m   bit-order = MostSignificant	l   bit-order = LeastSignificantformat	ordering1Mm	00-07 08-15 16-23 24-312Mm	00-07 08-15 16-23 24-314Mm	00-07 08-15 16-23 24-311Ml	07-00 15-08 23-16 31-242Ml	15-08 07-00 31-24 23-164Ml	31-24 23-16 15-08 07-001Lm	00-07 08-15 16-23 24-312Lm	08-15 00-07 24-31 16-234Lm	24-31 16-23 08-15 00-071Ll	07-00 15-08 23-16 31-242Ll	07-00 15-08 23-16 31-244Ll	07-00 15-08 23-16 31-24The following table gives the required conversion between any twoformats.  It is based strictly on the table above.  If you believe one,you should believe the other.legend:	n   no changes	s   reverse 8-bit units within 16-bit units	l   reverse 8-bit units within 32-bit units	w   reverse 16-bit units within 32-bit units	R   reverse bits within 8-bit units	S   s+R	L   l+R	W   w+R*/static int (* Const (SwapFunction[12][12]))() = {#define n NoSwap,#define s SwapTwoBytes,#define l SwapFourBytes,#define w SwapWords,#define R SwapBits,#define S SwapBitsAndTwoBytes,#define L SwapBitsAndFourBytes,#define W SwapBitsAndWords,/*         1Mm 2Mm 4Mm 1Ml 2Ml 4Ml 1Lm 2Lm 4Lm 1Ll 2Ll 4Ll   *//* 1Mm */ { n   n   n   R   S   L   n   s   l   R   R   R },/* 2Mm */ { n   n   n   R   S   L   n   s   l   R   R   R },/* 4Mm */ { n   n   n   R   S   L   n   s   l   R   R   R },/* 1Ml */ { R   R   R   n   s   l   R   S   L   n   n   n },/* 2Ml */ { S   S   S   s   n   w   S   R   W   s   s   s },/* 4Ml */ { L   L   L   l   w   n   L   W   R   l   l   l },/* 1Lm */ { n   n   n   R   S   L   n   s   l   R   R   R },

⌨️ 快捷键说明

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