root / hw / display / cirrus_vga_template.h @ 47b43a1f
History | View | Annotate | Download (2.9 kB)
1 |
/*
|
---|---|
2 |
* QEMU Cirrus VGA Emulator templates
|
3 |
*
|
4 |
* Copyright (c) 2003 Fabrice Bellard
|
5 |
*
|
6 |
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
7 |
* of this software and associated documentation files (the "Software"), to deal
|
8 |
* in the Software without restriction, including without limitation the rights
|
9 |
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10 |
* copies of the Software, and to permit persons to whom the Software is
|
11 |
* furnished to do so, subject to the following conditions:
|
12 |
*
|
13 |
* The above copyright notice and this permission notice shall be included in
|
14 |
* all copies or substantial portions of the Software.
|
15 |
*
|
16 |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17 |
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18 |
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
19 |
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20 |
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21 |
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22 |
* THE SOFTWARE.
|
23 |
*/
|
24 |
|
25 |
#if DEPTH == 8 |
26 |
#define BPP 1 |
27 |
#elif DEPTH == 15 || DEPTH == 16 |
28 |
#define BPP 2 |
29 |
#elif DEPTH == 32 |
30 |
#define BPP 4 |
31 |
#else
|
32 |
#error unsupported depth
|
33 |
#endif
|
34 |
|
35 |
static void glue(vga_draw_cursor_line_, DEPTH)(uint8_t *d1, |
36 |
const uint8_t *src1,
|
37 |
int poffset, int w, |
38 |
unsigned int color0, |
39 |
unsigned int color1, |
40 |
unsigned int color_xor) |
41 |
{ |
42 |
const uint8_t *plane0, *plane1;
|
43 |
int x, b0, b1;
|
44 |
uint8_t *d; |
45 |
|
46 |
d = d1; |
47 |
plane0 = src1; |
48 |
plane1 = src1 + poffset; |
49 |
for (x = 0; x < w; x++) { |
50 |
b0 = (plane0[x >> 3] >> (7 - (x & 7))) & 1; |
51 |
b1 = (plane1[x >> 3] >> (7 - (x & 7))) & 1; |
52 |
#if DEPTH == 8 |
53 |
switch (b0 | (b1 << 1)) { |
54 |
case 0: |
55 |
break;
|
56 |
case 1: |
57 |
d[0] ^= color_xor;
|
58 |
break;
|
59 |
case 2: |
60 |
d[0] = color0;
|
61 |
break;
|
62 |
case 3: |
63 |
d[0] = color1;
|
64 |
break;
|
65 |
} |
66 |
#elif DEPTH == 16 |
67 |
switch (b0 | (b1 << 1)) { |
68 |
case 0: |
69 |
break;
|
70 |
case 1: |
71 |
((uint16_t *)d)[0] ^= color_xor;
|
72 |
break;
|
73 |
case 2: |
74 |
((uint16_t *)d)[0] = color0;
|
75 |
break;
|
76 |
case 3: |
77 |
((uint16_t *)d)[0] = color1;
|
78 |
break;
|
79 |
} |
80 |
#elif DEPTH == 32 |
81 |
switch (b0 | (b1 << 1)) { |
82 |
case 0: |
83 |
break;
|
84 |
case 1: |
85 |
((uint32_t *)d)[0] ^= color_xor;
|
86 |
break;
|
87 |
case 2: |
88 |
((uint32_t *)d)[0] = color0;
|
89 |
break;
|
90 |
case 3: |
91 |
((uint32_t *)d)[0] = color1;
|
92 |
break;
|
93 |
} |
94 |
#else
|
95 |
#error unsupported depth
|
96 |
#endif
|
97 |
d += BPP; |
98 |
} |
99 |
} |
100 |
|
101 |
#undef DEPTH
|
102 |
#undef BPP
|