Statistics
| Branch: | Revision:

root / hw / blizzard_template.h @ e2542fe2

History | View | Annotate | Download (4 kB)

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