Statistics
| Branch: | Revision:

root / hw / pxa2xx_template.h @ aba35a6c

History | View | Annotate | Download (11.2 kB)

1
/*
2
 * Intel XScale PXA255/270 LCDC emulation.
3
 *
4
 * Copyright (c) 2006 Openedhand Ltd.
5
 * Written by Andrzej Zaborowski <balrog@zabor.org>
6
 *
7
 * This code is licensed under the GPLv2.
8
 *
9
 * Framebuffer format conversion routines.
10
 */
11

    
12
# define SKIP_PIXEL(to)                to += deststep
13
#if BITS == 8
14
# define COPY_PIXEL(to, from)        *to = from; SKIP_PIXEL(to)
15
#elif BITS == 15 || BITS == 16
16
# define COPY_PIXEL(to, from)        *(uint16_t *) to = from; SKIP_PIXEL(to)
17
#elif BITS == 24
18
# define COPY_PIXEL(to, from)        \
19
        *(uint16_t *) to = from; *(to + 2) = (from) >> 16; SKIP_PIXEL(to)
20
#elif BITS == 32
21
# define COPY_PIXEL(to, from)        *(uint32_t *) to = from; SKIP_PIXEL(to)
22
#else
23
# error unknown bit depth
24
#endif
25

    
26
#ifdef WORDS_BIGENDIAN
27
# define SWAP_WORDS        1
28
#endif
29

    
30
#define FN_2(x)                FN(x + 1) FN(x)
31
#define FN_4(x)                FN_2(x + 2) FN_2(x)
32

    
33
static void glue(pxa2xx_draw_line2_, BITS)(uint32_t *palette,
34
                uint8_t *dest, const uint8_t *src, int width, int deststep)
35
{
36
    uint32_t data;
37
    while (width > 0) {
38
        data = *(uint32_t *) src;
39
#define FN(x)                COPY_PIXEL(dest, palette[(data >> ((x) * 2)) & 3]);
40
#ifdef SWAP_WORDS
41
        FN_4(12)
42
        FN_4(8)
43
        FN_4(4)
44
        FN_4(0)
45
#else
46
        FN_4(0)
47
        FN_4(4)
48
        FN_4(8)
49
        FN_4(12)
50
#endif
51
#undef FN
52
        width -= 16;
53
        src += 4;
54
    }
55
}
56

    
57
static void glue(pxa2xx_draw_line4_, BITS)(uint32_t *palette,
58
                uint8_t *dest, const uint8_t *src, int width, int deststep)
59
{
60
    uint32_t data;
61
    while (width > 0) {
62
        data = *(uint32_t *) src;
63
#define FN(x)                COPY_PIXEL(dest, palette[(data >> ((x) * 4)) & 0xf]);
64
#ifdef SWAP_WORDS
65
        FN_2(6)
66
        FN_2(4)
67
        FN_2(2)
68
        FN_2(0)
69
#else
70
        FN_2(0)
71
        FN_2(2)
72
        FN_2(4)
73
        FN_2(6)
74
#endif
75
#undef FN
76
        width -= 8;
77
        src += 4;
78
    }
79
}
80

    
81
static void glue(pxa2xx_draw_line8_, BITS)(uint32_t *palette,
82
                uint8_t *dest, const uint8_t *src, int width, int deststep)
83
{
84
    uint32_t data;
85
    while (width > 0) {
86
        data = *(uint32_t *) src;
87
#define FN(x)                COPY_PIXEL(dest, palette[(data >> (x)) & 0xff]);
88
#ifdef SWAP_WORDS
89
        FN(24)
90
        FN(16)
91
        FN(8)
92
        FN(0)
93
#else
94
        FN(0)
95
        FN(8)
96
        FN(16)
97
        FN(24)
98
#endif
99
#undef FN
100
        width -= 4;
101
        src += 4;
102
    }
103
}
104

    
105
static void glue(pxa2xx_draw_line16_, BITS)(uint32_t *palette,
106
                uint8_t *dest, const uint8_t *src, int width, int deststep)
107
{
108
    uint32_t data;
109
    unsigned int r, g, b;
110
    while (width > 0) {
111
        data = *(uint32_t *) src;
112
#ifdef SWAP_WORDS
113
        data = bswap32(data);
114
#endif
115
        b = (data & 0x1f) << 3;
116
        data >>= 5;
117
        g = (data & 0x3f) << 2;
118
        data >>= 6;
119
        r = (data & 0x1f) << 3;
120
        data >>= 5;
121
        COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
122
        b = (data & 0x1f) << 3;
123
        data >>= 5;
124
        g = (data & 0x3f) << 2;
125
        data >>= 6;
126
        r = (data & 0x1f) << 3;
127
        COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
128
        width -= 2;
129
        src += 4;
130
    }
131
}
132

    
133
static void glue(pxa2xx_draw_line16t_, BITS)(uint32_t *palette,
134
                uint8_t *dest, const uint8_t *src, int width, int deststep)
135
{
136
    uint32_t data;
137
    unsigned int r, g, b;
138
    while (width > 0) {
139
        data = *(uint32_t *) src;
140
#ifdef SWAP_WORDS
141
        data = bswap32(data);
142
#endif
143
        b = (data & 0x1f) << 3;
144
        data >>= 5;
145
        g = (data & 0x1f) << 3;
146
        data >>= 5;
147
        r = (data & 0x1f) << 3;
148
        data >>= 5;
149
        if (data & 1)
150
            SKIP_PIXEL(dest);
151
        else
152
            COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
153
        data >>= 1;
154
        b = (data & 0x1f) << 3;
155
        data >>= 5;
156
        g = (data & 0x1f) << 3;
157
        data >>= 5;
158
        r = (data & 0x1f) << 3;
159
        data >>= 5;
160
        if (data & 1)
161
            SKIP_PIXEL(dest);
162
        else
163
            COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
164
        width -= 2;
165
        src += 4;
166
    }
167
}
168

    
169
static void glue(pxa2xx_draw_line18_, BITS)(uint32_t *palette,
170
                uint8_t *dest, const uint8_t *src, int width, int deststep)
171
{
172
    uint32_t data;
173
    unsigned int r, g, b;
174
    while (width > 0) {
175
        data = *(uint32_t *) src;
176
#ifdef SWAP_WORDS
177
        data = bswap32(data);
178
#endif
179
        b = (data & 0x3f) << 2;
180
        data >>= 6;
181
        g = (data & 0x3f) << 2;
182
        data >>= 6;
183
        r = (data & 0x3f) << 2;
184
        COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
185
        width -= 1;
186
        src += 4;
187
    }
188
}
189

    
190
/* The wicked packed format */
191
static void glue(pxa2xx_draw_line18p_, BITS)(uint32_t *palette,
192
                uint8_t *dest, const uint8_t *src, int width, int deststep)
193
{
194
    uint32_t data[3];
195
    unsigned int r, g, b;
196
    while (width > 0) {
197
        data[0] = *(uint32_t *) src;
198
        src += 4;
199
        data[1] = *(uint32_t *) src;
200
        src += 4;
201
        data[2] = *(uint32_t *) src;
202
        src += 4;
203
#ifdef SWAP_WORDS
204
        data[0] = bswap32(data[0]);
205
        data[1] = bswap32(data[1]);
206
        data[2] = bswap32(data[2]);
207
#endif
208
        b = (data[0] & 0x3f) << 2;
209
        data[0] >>= 6;
210
        g = (data[0] & 0x3f) << 2;
211
        data[0] >>= 6;
212
        r = (data[0] & 0x3f) << 2;
213
        data[0] >>= 12;
214
        COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
215
        b = (data[0] & 0x3f) << 2;
216
        data[0] >>= 6;
217
        g = ((data[1] & 0xf) << 4) | (data[0] << 2);
218
        data[1] >>= 4;
219
        r = (data[1] & 0x3f) << 2;
220
        data[1] >>= 12;
221
        COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
222
        b = (data[1] & 0x3f) << 2;
223
        data[1] >>= 6;
224
        g = (data[1] & 0x3f) << 2;
225
        data[1] >>= 6;
226
        r = ((data[2] & 0x3) << 6) | (data[1] << 2);
227
        data[2] >>= 8;
228
        COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
229
        b = (data[2] & 0x3f) << 2;
230
        data[2] >>= 6;
231
        g = (data[2] & 0x3f) << 2;
232
        data[2] >>= 6;
233
        r = data[2] << 2;
234
        COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
235
        width -= 4;
236
    }
237
}
238

    
239
static void glue(pxa2xx_draw_line19_, BITS)(uint32_t *palette,
240
                uint8_t *dest, const uint8_t *src, int width, int deststep)
241
{
242
    uint32_t data;
243
    unsigned int r, g, b;
244
    while (width > 0) {
245
        data = *(uint32_t *) src;
246
#ifdef SWAP_WORDS
247
        data = bswap32(data);
248
#endif
249
        b = (data & 0x3f) << 2;
250
        data >>= 6;
251
        g = (data & 0x3f) << 2;
252
        data >>= 6;
253
        r = (data & 0x3f) << 2;
254
        data >>= 6;
255
        if (data & 1)
256
            SKIP_PIXEL(dest);
257
        else
258
            COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
259
        width -= 1;
260
        src += 4;
261
    }
262
}
263

    
264
/* The wicked packed format */
265
static void glue(pxa2xx_draw_line19p_, BITS)(uint32_t *palette,
266
                uint8_t *dest, const uint8_t *src, int width, int deststep)
267
{
268
    uint32_t data[3];
269
    unsigned int r, g, b;
270
    while (width > 0) {
271
        data[0] = *(uint32_t *) src;
272
        src += 4;
273
        data[1] = *(uint32_t *) src;
274
        src += 4;
275
        data[2] = *(uint32_t *) src;
276
        src += 4;
277
# ifdef SWAP_WORDS
278
        data[0] = bswap32(data[0]);
279
        data[1] = bswap32(data[1]);
280
        data[2] = bswap32(data[2]);
281
# endif
282
        b = (data[0] & 0x3f) << 2;
283
        data[0] >>= 6;
284
        g = (data[0] & 0x3f) << 2;
285
        data[0] >>= 6;
286
        r = (data[0] & 0x3f) << 2;
287
        data[0] >>= 6;
288
        if (data[0] & 1)
289
            SKIP_PIXEL(dest);
290
        else
291
            COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
292
        data[0] >>= 6;
293
        b = (data[0] & 0x3f) << 2;
294
        data[0] >>= 6;
295
        g = ((data[1] & 0xf) << 4) | (data[0] << 2);
296
        data[1] >>= 4;
297
        r = (data[1] & 0x3f) << 2;
298
        data[1] >>= 6;
299
        if (data[1] & 1)
300
            SKIP_PIXEL(dest);
301
        else
302
            COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
303
        data[1] >>= 6;
304
        b = (data[1] & 0x3f) << 2;
305
        data[1] >>= 6;
306
        g = (data[1] & 0x3f) << 2;
307
        data[1] >>= 6;
308
        r = ((data[2] & 0x3) << 6) | (data[1] << 2);
309
        data[2] >>= 2;
310
        if (data[2] & 1)
311
            SKIP_PIXEL(dest);
312
        else
313
            COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
314
        data[2] >>= 6;
315
        b = (data[2] & 0x3f) << 2;
316
        data[2] >>= 6;
317
        g = (data[2] & 0x3f) << 2;
318
        data[2] >>= 6;
319
        r = data[2] << 2;
320
        data[2] >>= 6;
321
        if (data[2] & 1)
322
            SKIP_PIXEL(dest);
323
        else
324
            COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
325
        width -= 4;
326
    }
327
}
328

    
329
static void glue(pxa2xx_draw_line24_, BITS)(uint32_t *palette,
330
                uint8_t *dest, const uint8_t *src, int width, int deststep)
331
{
332
    uint32_t data;
333
    unsigned int r, g, b;
334
    while (width > 0) {
335
        data = *(uint32_t *) src;
336
#ifdef SWAP_WORDS
337
        data = bswap32(data);
338
#endif
339
        b = data & 0xff;
340
        data >>= 8;
341
        g = data & 0xff;
342
        data >>= 8;
343
        r = data & 0xff;
344
        COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
345
        width -= 1;
346
        src += 4;
347
    }
348
}
349

    
350
static void glue(pxa2xx_draw_line24t_, BITS)(uint32_t *palette,
351
                uint8_t *dest, const uint8_t *src, int width, int deststep)
352
{
353
    uint32_t data;
354
    unsigned int r, g, b;
355
    while (width > 0) {
356
        data = *(uint32_t *) src;
357
#ifdef SWAP_WORDS
358
        data = bswap32(data);
359
#endif
360
        b = (data & 0x7f) << 1;
361
        data >>= 7;
362
        g = data & 0xff;
363
        data >>= 8;
364
        r = data & 0xff;
365
        data >>= 8;
366
        if (data & 1)
367
            SKIP_PIXEL(dest);
368
        else
369
            COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
370
        width -= 1;
371
        src += 4;
372
    }
373
}
374

    
375
static void glue(pxa2xx_draw_line25_, BITS)(uint32_t *palette,
376
                uint8_t *dest, const uint8_t *src, int width, int deststep)
377
{
378
    uint32_t data;
379
    unsigned int r, g, b;
380
    while (width > 0) {
381
        data = *(uint32_t *) src;
382
#ifdef SWAP_WORDS
383
        data = bswap32(data);
384
#endif
385
        b = data & 0xff;
386
        data >>= 8;
387
        g = data & 0xff;
388
        data >>= 8;
389
        r = data & 0xff;
390
        data >>= 8;
391
        if (data & 1)
392
            SKIP_PIXEL(dest);
393
        else
394
            COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
395
        width -= 1;
396
        src += 4;
397
    }
398
}
399

    
400
/* Overlay planes disabled, no transparency */
401
static drawfn glue(pxa2xx_draw_fn_, BITS)[16] =
402
{
403
    [0 ... 0xf]       = 0,
404
    [pxa_lcdc_2bpp]   = glue(pxa2xx_draw_line2_, BITS),
405
    [pxa_lcdc_4bpp]   = glue(pxa2xx_draw_line4_, BITS),
406
    [pxa_lcdc_8bpp]   = glue(pxa2xx_draw_line8_, BITS),
407
    [pxa_lcdc_16bpp]  = glue(pxa2xx_draw_line16_, BITS),
408
    [pxa_lcdc_18bpp]  = glue(pxa2xx_draw_line18_, BITS),
409
    [pxa_lcdc_18pbpp] = glue(pxa2xx_draw_line18p_, BITS),
410
    [pxa_lcdc_24bpp]  = glue(pxa2xx_draw_line24_, BITS),
411
};
412

    
413
/* Overlay planes enabled, transparency used */
414
static drawfn glue(glue(pxa2xx_draw_fn_, BITS), t)[16] =
415
{
416
    [0 ... 0xf]       = 0,
417
    [pxa_lcdc_4bpp]   = glue(pxa2xx_draw_line4_, BITS),
418
    [pxa_lcdc_8bpp]   = glue(pxa2xx_draw_line8_, BITS),
419
    [pxa_lcdc_16bpp]  = glue(pxa2xx_draw_line16t_, BITS),
420
    [pxa_lcdc_19bpp]  = glue(pxa2xx_draw_line19_, BITS),
421
    [pxa_lcdc_19pbpp] = glue(pxa2xx_draw_line19p_, BITS),
422
    [pxa_lcdc_24bpp]  = glue(pxa2xx_draw_line24t_, BITS),
423
    [pxa_lcdc_25bpp]  = glue(pxa2xx_draw_line25_, BITS),
424
};
425

    
426
#undef BITS
427
#undef COPY_PIXEL
428
#undef SKIP_PIXEL
429

    
430
#ifdef SWAP_WORDS
431
# undef SWAP_WORDS
432
#endif