Add qemu 2.4.0
[kvmfornfv.git] / qemu / hw / display / omap_lcd_template.h
1 /*
2  * QEMU OMAP LCD Emulator templates
3  *
4  * Copyright (c) 2006 Andrzej Zaborowski  <balrog@zabor.org>
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in
14  *    the documentation and/or other materials provided with the
15  *    distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
18  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
19  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20  * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR
21  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
25  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #if DEPTH == 8
31 # define BPP 1
32 # define PIXEL_TYPE uint8_t
33 #elif DEPTH == 15 || DEPTH == 16
34 # define BPP 2
35 # define PIXEL_TYPE uint16_t
36 #elif DEPTH == 32
37 # define BPP 4
38 # define PIXEL_TYPE uint32_t
39 #else
40 # error unsupport depth
41 #endif
42
43 /*
44  * 2-bit colour
45  */
46 static void glue(draw_line2_, DEPTH)(void *opaque,
47                 uint8_t *d, const uint8_t *s, int width, int deststep)
48 {
49     uint16_t *pal = opaque;
50     uint8_t v, r, g, b;
51
52     do {
53         v = ldub_p((void *) s);
54         r = (pal[v & 3] >> 4) & 0xf0;
55         g = pal[v & 3] & 0xf0;
56         b = (pal[v & 3] << 4) & 0xf0;
57         ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
58         d += BPP;
59         v >>= 2;
60         r = (pal[v & 3] >> 4) & 0xf0;
61         g = pal[v & 3] & 0xf0;
62         b = (pal[v & 3] << 4) & 0xf0;
63         ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
64         d += BPP;
65         v >>= 2;
66         r = (pal[v & 3] >> 4) & 0xf0;
67         g = pal[v & 3] & 0xf0;
68         b = (pal[v & 3] << 4) & 0xf0;
69         ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
70         d += BPP;
71         v >>= 2;
72         r = (pal[v & 3] >> 4) & 0xf0;
73         g = pal[v & 3] & 0xf0;
74         b = (pal[v & 3] << 4) & 0xf0;
75         ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
76         d += BPP;
77         s ++;
78         width -= 4;
79     } while (width > 0);
80 }
81
82 /*
83  * 4-bit colour
84  */
85 static void glue(draw_line4_, DEPTH)(void *opaque,
86                 uint8_t *d, const uint8_t *s, int width, int deststep)
87 {
88     uint16_t *pal = opaque;
89     uint8_t v, r, g, b;
90
91     do {
92         v = ldub_p((void *) s);
93         r = (pal[v & 0xf] >> 4) & 0xf0;
94         g = pal[v & 0xf] & 0xf0;
95         b = (pal[v & 0xf] << 4) & 0xf0;
96         ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
97         d += BPP;
98         v >>= 4;
99         r = (pal[v & 0xf] >> 4) & 0xf0;
100         g = pal[v & 0xf] & 0xf0;
101         b = (pal[v & 0xf] << 4) & 0xf0;
102         ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
103         d += BPP;
104         s ++;
105         width -= 2;
106     } while (width > 0);
107 }
108
109 /*
110  * 8-bit colour
111  */
112 static void glue(draw_line8_, DEPTH)(void *opaque,
113                 uint8_t *d, const uint8_t *s, int width, int deststep)
114 {
115     uint16_t *pal = opaque;
116     uint8_t v, r, g, b;
117
118     do {
119         v = ldub_p((void *) s);
120         r = (pal[v] >> 4) & 0xf0;
121         g = pal[v] & 0xf0;
122         b = (pal[v] << 4) & 0xf0;
123         ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
124         s ++;
125         d += BPP;
126     } while (-- width != 0);
127 }
128
129 /*
130  * 12-bit colour
131  */
132 static void glue(draw_line12_, DEPTH)(void *opaque,
133                 uint8_t *d, const uint8_t *s, int width, int deststep)
134 {
135     uint16_t v;
136     uint8_t r, g, b;
137
138     do {
139         v = lduw_p((void *) s);
140         r = (v >> 4) & 0xf0;
141         g = v & 0xf0;
142         b = (v << 4) & 0xf0;
143         ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
144         s += 2;
145         d += BPP;
146     } while (-- width != 0);
147 }
148
149 /*
150  * 16-bit colour
151  */
152 static void glue(draw_line16_, DEPTH)(void *opaque,
153                 uint8_t *d, const uint8_t *s, int width, int deststep)
154 {
155 #if DEPTH == 16 && defined(HOST_WORDS_BIGENDIAN) == defined(TARGET_WORDS_BIGENDIAN)
156     memcpy(d, s, width * 2);
157 #else
158     uint16_t v;
159     uint8_t r, g, b;
160
161     do {
162         v = lduw_p((void *) s);
163         r = (v >> 8) & 0xf8;
164         g = (v >> 3) & 0xfc;
165         b = (v << 3) & 0xf8;
166         ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
167         s += 2;
168         d += BPP;
169     } while (-- width != 0);
170 #endif
171 }
172
173 #undef DEPTH
174 #undef BPP
175 #undef PIXEL_TYPE