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