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