linux-user: fix ppc target_stat64 st_blocks layout
[qemu] / hw / blizzard_template.h
1 /*
2  * QEMU Epson S1D13744/S1D13745 templates
3  *
4  * Copyright (C) 2008 Nokia Corporation
5  * Written by Andrzej Zaborowski <andrew@openedhand.com>
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License as
9  * published by the Free Software Foundation; either version 2 or
10  * (at your option) version 3 of the License.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #define SKIP_PIXEL(to)          to += deststep
22 #if DEPTH == 8
23 # define PIXEL_TYPE             uint8_t
24 # define COPY_PIXEL(to, from)   *to = from; SKIP_PIXEL(to)
25 # define COPY_PIXEL1(to, from)  *to ++ = from
26 #elif DEPTH == 15 || DEPTH == 16
27 # define PIXEL_TYPE             uint16_t
28 # define COPY_PIXEL(to, from)   *to = from; SKIP_PIXEL(to)
29 # define COPY_PIXEL1(to, from)  *to ++ = from
30 #elif DEPTH == 24
31 # define PIXEL_TYPE             uint8_t
32 # define COPY_PIXEL(to, from)   \
33     to[0] = from; to[1] = (from) >> 8; to[2] = (from) >> 16; SKIP_PIXEL(to)
34 # define COPY_PIXEL1(to, from)  \
35     *to ++ = from; *to ++ = (from) >> 8; *to ++ = (from) >> 16
36 #elif DEPTH == 32
37 # define PIXEL_TYPE             uint32_t
38 # define COPY_PIXEL(to, from)   *to = from; SKIP_PIXEL(to)
39 # define COPY_PIXEL1(to, from)  *to ++ = from
40 #else
41 # error unknown bit depth
42 #endif
43
44 #ifdef HOST_WORDS_BIGENDIAN
45 # define SWAP_WORDS     1
46 #endif
47
48 static void glue(blizzard_draw_line16_, DEPTH)(PIXEL_TYPE *dest,
49                 const uint16_t *src, unsigned int width)
50 {
51 #if !defined(SWAP_WORDS) && DEPTH == 16
52     memcpy(dest, src, width);
53 #else
54     uint16_t data;
55     unsigned int r, g, b;
56     const uint16_t *end = (const void *) src + width;
57     while (src < end) {
58         data = lduw_raw(src ++);
59         b = (data & 0x1f) << 3;
60         data >>= 5;
61         g = (data & 0x3f) << 2;
62         data >>= 6;
63         r = (data & 0x1f) << 3;
64         data >>= 5;
65         COPY_PIXEL1(dest, glue(rgb_to_pixel, DEPTH)(r, g, b));
66     }
67 #endif
68 }
69
70 static void glue(blizzard_draw_line24mode1_, DEPTH)(PIXEL_TYPE *dest,
71                 const uint8_t *src, unsigned int width)
72 {
73     /* TODO: check if SDL 24-bit planes are not in the same format and
74      * if so, use memcpy */
75     unsigned int r[2], g[2], b[2];
76     const uint8_t *end = src + width;
77     while (src < end) {
78         g[0] = *src ++;
79         r[0] = *src ++;
80         r[1] = *src ++;
81         b[0] = *src ++;
82         COPY_PIXEL1(dest, glue(rgb_to_pixel, DEPTH)(r[0], g[0], b[0]));
83         b[1] = *src ++;
84         g[1] = *src ++;
85         COPY_PIXEL1(dest, glue(rgb_to_pixel, DEPTH)(r[1], g[1], b[1]));
86     }
87 }
88
89 static void glue(blizzard_draw_line24mode2_, DEPTH)(PIXEL_TYPE *dest,
90                 const uint8_t *src, unsigned int width)
91 {
92     unsigned int r, g, b;
93     const uint8_t *end = src + width;
94     while (src < end) {
95         r = *src ++;
96         src ++;
97         b = *src ++;
98         g = *src ++;
99         COPY_PIXEL1(dest, glue(rgb_to_pixel, DEPTH)(r, g, b));
100     }
101 }
102
103 /* No rotation */
104 static blizzard_fn_t glue(blizzard_draw_fn_, DEPTH)[0x10] = {
105     NULL,
106     /* RGB 5:6:5*/
107     (blizzard_fn_t) glue(blizzard_draw_line16_, DEPTH),
108     /* RGB 6:6:6 mode 1 */
109     (blizzard_fn_t) glue(blizzard_draw_line24mode1_, DEPTH),
110     /* RGB 8:8:8 mode 1 */
111     (blizzard_fn_t) glue(blizzard_draw_line24mode1_, DEPTH),
112     NULL, NULL,
113     /* RGB 6:6:6 mode 2 */
114     (blizzard_fn_t) glue(blizzard_draw_line24mode2_, DEPTH),
115     /* RGB 8:8:8 mode 2 */
116     (blizzard_fn_t) glue(blizzard_draw_line24mode2_, DEPTH),
117     /* YUV 4:2:2 */
118     NULL,
119     /* YUV 4:2:0 */
120     NULL,
121     NULL, NULL, NULL, NULL, NULL, NULL,
122 };
123
124 /* 90deg, 180deg and 270deg rotation */
125 static blizzard_fn_t glue(blizzard_draw_fn_r_, DEPTH)[0x10] = {
126     /* TODO */
127     [0 ... 0xf] = NULL,
128 };
129
130 #undef DEPTH
131 #undef SKIP_PIXEL
132 #undef COPY_PIXEL
133 #undef COPY_PIXEL1
134 #undef PIXEL_TYPE
135
136 #undef SWAP_WORDS