942efdb3136a5b7f8f5407916be2bea361ad664d
[framework/uifw/xorg/lib/libxft.git] / src / xftswap.c
1 /*
2  * Copyright © 2002 Keith Packard
3  *
4  * Permission to use, copy, modify, distribute, and sell this software and its
5  * documentation for any purpose is hereby granted without fee, provided that
6  * the above copyright notice appear in all copies and that both that
7  * copyright notice and this permission notice appear in supporting
8  * documentation, and that the name of Keith Packard not be used in
9  * advertising or publicity pertaining to distribution of the software without
10  * specific, written prior permission.  Keith Packard makes no
11  * representations about the suitability of this software for any purpose.  It
12  * is provided "as is" without express or implied warranty.
13  *
14  * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16  * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20  * PERFORMANCE OF THIS SOFTWARE.
21  */
22
23 #include "xftint.h"
24
25 _X_HIDDEN int
26 XftNativeByteOrder (void)
27 {
28     int     whichbyte = 1;
29
30     if (*((char *) &whichbyte))
31         return LSBFirst;
32     return MSBFirst;
33 }
34
35 /* byte swap a 32-bit value */
36 #define swapl(x, n) { \
37                  n = ((char *) (x))[0];\
38                  ((char *) (x))[0] = ((char *) (x))[3];\
39                  ((char *) (x))[3] = n;\
40                  n = ((char *) (x))[1];\
41                  ((char *) (x))[1] = ((char *) (x))[2];\
42                  ((char *) (x))[2] = n; }
43
44 /* byte swap a short */
45 #define swaps(x, n) { \
46                  n = ((char *) (x))[0];\
47                  ((char *) (x))[0] = ((char *) (x))[1];\
48                  ((char *) (x))[1] = n; }
49
50 /* byte swap a three-byte unit */
51 #define swapt(x, n) { \
52                  n = ((char *) (x))[0];\
53                  ((char *) (x))[0] = ((char *) (x))[2];\
54                  ((char *) (x))[2] = n; }
55
56 _X_HIDDEN void
57 XftSwapCARD32 (CARD32 *data, int u)
58 {
59     char    n;
60     while (u--)
61     {
62         swapl (data, n);
63         data++;
64     }
65 }
66
67 _X_HIDDEN void
68 XftSwapCARD24 (CARD8 *data, int width, int height)
69 {
70     int     units, u;
71     char    n;
72     CARD8   *d;
73
74     units = width / 3;
75     while (height--)
76     {
77         d = data;
78         data += width;
79         u = units;
80         while (u--)
81         {
82             swapt (d, n);
83             d += 3;
84         }
85     }
86 }
87
88 _X_HIDDEN void
89 XftSwapCARD16 (CARD16 *data, int u)
90 {
91     char    n;
92     while (u--)
93     {
94         swaps (data, n);
95         data++;
96     }
97 }
98
99 _X_HIDDEN void
100 XftSwapImage (XImage *image)
101 {
102     switch (image->bits_per_pixel) {
103     case 32:
104         XftSwapCARD32 ((CARD32 *) image->data, 
105                        image->height * image->bytes_per_line >> 2);
106         break;
107     case 24:
108         XftSwapCARD24 ((CARD8 *) image->data,
109                        image->bytes_per_line,
110                        image->height);
111         break;
112     case 16:
113         XftSwapCARD16 ((CARD16 *) image->data,
114                        image->height * image->bytes_per_line >> 1);
115         break;
116     default:
117         break;
118     }
119 }