Code

The BIG graph update
[rrdtool.git] / libraries / freetype-2.0.5 / pcfutil.c
1 /*
3 Copyright 1990, 1994, 1998  The Open Group
5 All Rights Reserved.
7 The above copyright notice and this permission notice shall be included in
8 all copies or substantial portions of the Software.
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.
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.
21 */
22 /* $XFree86: xc/lib/font/util/utilbitmap.c,v 1.3 1999/08/22 08:58:58 dawes Exp $ */
24 /*
25  * Author:  Keith Packard, MIT X Consortium
26  */
29 #include <ft2build.h>
30 #include "pcfutil.h"
33   /* Utility functions for reformatting font bitmaps */
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   };
71   /*
72    *  Invert bit order within each BYTE of an array.
73    */
75   void
76   BitOrderInvert( unsigned char*  buf,
77                   int             nbytes )
78   {
79     const unsigned char*  rev = _reverse_byte;
82     for ( ; --nbytes >= 0; buf++ )
83       *buf = rev[*buf];
84   }
87   /*
88    *  Invert byte order within each 16-bits of an array.
89    */
91   void
92   TwoByteSwap( unsigned char*  buf,
93                int             nbytes )
94   {
95     unsigned char  c;
98     for ( ; nbytes > 0; nbytes -= 2, buf += 2 )
99     {
100       c      = buf[0];
101       buf[0] = buf[1];
102       buf[1] = c;
103     }
104   }
106   /*
107    *  Invert byte order within each 32-bits of an array.
108    */
110   void
111   FourByteSwap( unsigned char*  buf,
112                 int             nbytes )
113   {
114     unsigned char  c;
117     for ( ; nbytes > 0; nbytes -= 4, buf += 4 )
118     {
119       c      = buf[0];
120       buf[0] = buf[3];
121       buf[3] = c;
123       c      = buf[1];
124       buf[1] = buf[2];
125       buf[2] = c;
126     }
127   }
130   /*
131    *  Repad a bitmap.
132    */
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;
147     switch ( srcPad )
148     {
149     case 1:
150       srcWidthBytes = ( width + 7 ) >> 3;
151       break;
153     case 2:
154       srcWidthBytes = ( ( width + 15 ) >> 4 ) << 1;
155       break;
157     case 4:
158       srcWidthBytes = ( ( width + 31 ) >> 5 ) << 2;
159       break;
161     case 8:
162       srcWidthBytes = ( ( width + 63 ) >> 6 ) << 3;
163       break;
165     default:
166       return 0;
167     }
169     switch ( dstPad )
170     {
171     case 1:
172       dstWidthBytes = ( width + 7 ) >> 3;
173       break;
175     case 2:
176       dstWidthBytes = ( ( width + 15 ) >> 4 ) << 1;
177       break;
179     case 4:
180       dstWidthBytes = ( ( width + 31 ) >> 5 ) << 2;
181       break;
183     case 8:
184       dstWidthBytes = ( ( width + 63 ) >> 6 ) << 3;
185       break;
187     default:
188       return 0;
189     }
191     width = srcWidthBytes;
192     if ( width > dstWidthBytes )
193       width = dstWidthBytes;
195     pTmpSrc= pSrc;
196     pTmpDst= pDst;
198     for ( row = 0; row < height; row++ )
199     {
200       for ( col = 0; col < width; col++ )
201         *pTmpDst++ = *pTmpSrc++;
203       while ( col < dstWidthBytes )
204       {
205         *pTmpDst++ = '\0';
206         col++;
207       }
208       pTmpSrc += srcWidthBytes - width;
209     }
211     return dstWidthBytes * height;
212   }
215 /* END */