misc fixes to get rrdtool working without included libraries.
[rrdtool.git] / libraries / freetype-2.0.5 / pcfutil.c
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 */