Statistics
| Branch: | Revision:

root / hw / omap_lcd_template.h @ 78ced65e

History | View | Annotate | Download (4.9 kB)

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_raw((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_raw((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_raw((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_raw((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_raw((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