utilbitmap.c revision 23a0898a
1/* $Xorg: utilbitmap.c,v 1.4 2001/02/09 02:04:04 xorgcvs Exp $ */ 2 3/* 4 5Copyright 1990, 1994, 1998 The Open Group 6 7Permission to use, copy, modify, distribute, and sell this software and its 8documentation for any purpose is hereby granted without fee, provided that 9the above copyright notice appear in all copies and that both that 10copyright notice and this permission notice appear in supporting 11documentation. 12 13The above copyright notice and this permission notice shall be included in 14all copies or substantial portions of the Software. 15 16THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 20AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 23Except as contained in this notice, the name of The Open Group shall not be 24used in advertising or otherwise to promote the sale, use or other dealings 25in this Software without prior written authorization from The Open Group. 26 27*/ 28/* $XFree86: xc/lib/font/util/utilbitmap.c,v 1.4 2001/01/17 19:43:34 dawes Exp $ */ 29 30/* 31 * Author: Keith Packard, MIT X Consortium 32 */ 33 34#ifdef HAVE_CONFIG_H 35#include <config.h> 36#endif 37#include <X11/fonts/fontmisc.h> 38 39/* Utility functions for reformating font bitmaps */ 40 41static unsigned char _reverse_byte[0x100] = { 42 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 43 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, 44 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, 45 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, 46 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, 47 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, 48 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 49 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, 50 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, 51 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, 52 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, 53 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, 54 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 55 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, 56 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, 57 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, 58 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, 59 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, 60 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 61 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, 62 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, 63 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, 64 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, 65 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, 66 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 67 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, 68 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, 69 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, 70 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, 71 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, 72 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 73 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff 74}; 75 76/* 77 * Invert bit order within each BYTE of an array. 78 */ 79void 80BitOrderInvert(unsigned char *buf, int nbytes) 81{ 82 unsigned char *rev = _reverse_byte; 83 84 for (; --nbytes >= 0; buf++) 85 *buf = rev[*buf]; 86} 87 88/* 89 * Invert byte order within each 16-bits of an array. 90 */ 91void 92TwoByteSwap(unsigned char *buf, int nbytes) 93{ 94 unsigned char c; 95 96 for (; nbytes > 0; nbytes -= 2, buf += 2) 97 { 98 c = buf[0]; 99 buf[0] = buf[1]; 100 buf[1] = c; 101 } 102} 103 104/* 105 * Invert byte order within each 32-bits of an array. 106 */ 107void 108FourByteSwap(unsigned char *buf, int nbytes) 109{ 110 unsigned char c; 111 112 for (; nbytes > 0; nbytes -= 4, buf += 4) 113 { 114 c = buf[0]; 115 buf[0] = buf[3]; 116 buf[3] = c; 117 c = buf[1]; 118 buf[1] = buf[2]; 119 buf[2] = c; 120 } 121} 122 123/* 124 * Repad a bitmap 125 */ 126 127int 128RepadBitmap (char *pSrc, char *pDst, 129 unsigned int srcPad, unsigned int dstPad, 130 int width, int height) 131{ 132 int srcWidthBytes,dstWidthBytes; 133 int row,col; 134 char *pTmpSrc,*pTmpDst; 135 136 switch (srcPad) { 137 case 1: 138 srcWidthBytes = (width+7)>>3; 139 break; 140 case 2: 141 srcWidthBytes = ((width+15)>>4)<<1; 142 break; 143 case 4: 144 srcWidthBytes = ((width+31)>>5)<<2; 145 break; 146 case 8: 147 srcWidthBytes = ((width+63)>>6)<<3; 148 break; 149 default: 150 return 0; 151 } 152 switch (dstPad) { 153 case 1: 154 dstWidthBytes = (width+7)>>3; 155 break; 156 case 2: 157 dstWidthBytes = ((width+15)>>4)<<1; 158 break; 159 case 4: 160 dstWidthBytes = ((width+31)>>5)<<2; 161 break; 162 case 8: 163 dstWidthBytes = ((width+63)>>6)<<3; 164 break; 165 default: 166 return 0; 167 } 168 169 width = srcWidthBytes; 170 if (width > dstWidthBytes) 171 width = dstWidthBytes; 172 pTmpSrc= pSrc; 173 pTmpDst= pDst; 174 for (row = 0; row < height; row++) 175 { 176 for (col = 0; col < width; col++) 177 *pTmpDst++ = *pTmpSrc++; 178 while (col < dstWidthBytes) 179 { 180 *pTmpDst++ = '\0'; 181 col++; 182 } 183 pTmpSrc += srcWidthBytes - width; 184 } 185 return dstWidthBytes * height; 186} 187 188 189