1fa2b3b63Smrg/*
2fa2b3b63Smrg
3fa2b3b63SmrgCopyright 1990, 1994, 1998  The Open Group
4fa2b3b63Smrg
5fa2b3b63SmrgPermission to use, copy, modify, distribute, and sell this software and its
6fa2b3b63Smrgdocumentation for any purpose is hereby granted without fee, provided that
7fa2b3b63Smrgthe above copyright notice appear in all copies and that both that
8fa2b3b63Smrgcopyright notice and this permission notice appear in supporting
9fa2b3b63Smrgdocumentation.
10fa2b3b63Smrg
11fa2b3b63SmrgThe above copyright notice and this permission notice shall be included in
12fa2b3b63Smrgall copies or substantial portions of the Software.
13fa2b3b63Smrg
14fa2b3b63SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15fa2b3b63SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16fa2b3b63SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
17fa2b3b63SmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18fa2b3b63SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19fa2b3b63SmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20fa2b3b63Smrg
21fa2b3b63SmrgExcept as contained in this notice, the name of The Open Group shall not be
22fa2b3b63Smrgused in advertising or otherwise to promote the sale, use or other dealings
23fa2b3b63Smrgin this Software without prior written authorization from The Open Group.
24fa2b3b63Smrg
25fa2b3b63Smrg*/
26fa2b3b63Smrg
27fa2b3b63Smrg/*
28fa2b3b63Smrg * Author:  Keith Packard, MIT X Consortium
29fa2b3b63Smrg */
30fa2b3b63Smrg
31fa2b3b63Smrg#ifdef HAVE_CONFIG_H
32fa2b3b63Smrg#include <config.h>
33fa2b3b63Smrg#endif
34fa2b3b63Smrg#include "fontmisc.h"
35fa2b3b63Smrg
36e24f450bSmrg/* Utility functions for reformatting font bitmaps */
37fa2b3b63Smrg
38fa2b3b63Smrgstatic const unsigned char _reverse_byte[0x100] = {
39e24f450bSmrg    0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
40e24f450bSmrg    0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
41e24f450bSmrg    0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
42e24f450bSmrg    0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
43e24f450bSmrg    0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
44e24f450bSmrg    0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
45e24f450bSmrg    0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
46e24f450bSmrg    0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
47e24f450bSmrg    0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
48e24f450bSmrg    0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
49e24f450bSmrg    0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
50e24f450bSmrg    0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
51e24f450bSmrg    0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
52e24f450bSmrg    0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
53e24f450bSmrg    0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
54e24f450bSmrg    0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
55e24f450bSmrg    0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
56e24f450bSmrg    0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
57e24f450bSmrg    0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
58e24f450bSmrg    0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
59e24f450bSmrg    0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
60e24f450bSmrg    0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
61e24f450bSmrg    0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
62e24f450bSmrg    0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
63e24f450bSmrg    0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
64e24f450bSmrg    0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
65e24f450bSmrg    0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
66e24f450bSmrg    0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
67e24f450bSmrg    0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
68e24f450bSmrg    0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
69e24f450bSmrg    0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
70e24f450bSmrg    0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
71fa2b3b63Smrg};
72fa2b3b63Smrg
73fa2b3b63Smrg/*
74fa2b3b63Smrg *	Invert bit order within each BYTE of an array.
75fa2b3b63Smrg */
76fa2b3b63Smrgvoid
77fa2b3b63SmrgBitOrderInvert(unsigned char *buf, int nbytes)
78fa2b3b63Smrg{
79fa2b3b63Smrg    const unsigned char *rev = _reverse_byte;
80fa2b3b63Smrg
81fa2b3b63Smrg    for (; --nbytes >= 0; buf++)
82e24f450bSmrg        *buf = rev[*buf];
83fa2b3b63Smrg}
84fa2b3b63Smrg
85fa2b3b63Smrg/*
86fa2b3b63Smrg *	Invert byte order within each 16-bits of an array.
87fa2b3b63Smrg */
88fa2b3b63Smrgvoid
89fa2b3b63SmrgTwoByteSwap(unsigned char *buf, int nbytes)
90fa2b3b63Smrg{
91e24f450bSmrg    for (; nbytes > 0; nbytes -= 2, buf += 2) {
92e24f450bSmrg        unsigned char c;
93fa2b3b63Smrg
94e24f450bSmrg        c = buf[0];
95e24f450bSmrg        buf[0] = buf[1];
96e24f450bSmrg        buf[1] = c;
97fa2b3b63Smrg    }
98fa2b3b63Smrg}
99fa2b3b63Smrg
100fa2b3b63Smrg/*
101fa2b3b63Smrg *	Invert byte order within each 32-bits of an array.
102fa2b3b63Smrg */
103fa2b3b63Smrgvoid
104fa2b3b63SmrgFourByteSwap(unsigned char *buf, int nbytes)
105fa2b3b63Smrg{
106e24f450bSmrg    for (; nbytes > 0; nbytes -= 4, buf += 4) {
107e24f450bSmrg        unsigned char c;
108fa2b3b63Smrg
109e24f450bSmrg        c = buf[0];
110e24f450bSmrg        buf[0] = buf[3];
111e24f450bSmrg        buf[3] = c;
112fa2b3b63Smrg
113e24f450bSmrg        c = buf[1];
114e24f450bSmrg        buf[1] = buf[2];
115e24f450bSmrg        buf[2] = c;
116fa2b3b63Smrg    }
117fa2b3b63Smrg}
118