root / hw / cirrus_vga_rop.h @ 8c78881f
History  View  Annotate  Download (5.5 kB)
1 
/*


2 
* QEMU Cirrus CLGD 54xx VGA Emulator.

3 
*

4 
* Copyright (c) 2004 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 
static inline void glue(rop_8_,ROP_NAME)(uint8_t *dst, uint8_t src) 
26 
{ 
27 
*dst = ROP_FN(*dst, src); 
28 
} 
29  
30 
static inline void glue(rop_16_,ROP_NAME)(uint16_t *dst, uint16_t src) 
31 
{ 
32 
*dst = ROP_FN(*dst, src); 
33 
} 
34  
35 
static inline void glue(rop_32_,ROP_NAME)(uint32_t *dst, uint32_t src) 
36 
{ 
37 
*dst = ROP_FN(*dst, src); 
38 
} 
39  
40 
#define ROP_OP(d, s) glue(rop_8_,ROP_NAME)(d, s)

41 
#define ROP_OP_16(d, s) glue(rop_16_,ROP_NAME)(d, s)

42 
#define ROP_OP_32(d, s) glue(rop_32_,ROP_NAME)(d, s)

43 
#undef ROP_FN

44  
45 
static void 
46 
glue(cirrus_bitblt_rop_fwd_, ROP_NAME)(CirrusVGAState *s, 
47 
uint8_t *dst,const uint8_t *src,

48 
int dstpitch,int srcpitch, 
49 
int bltwidth,int bltheight) 
50 
{ 
51 
int x,y;

52 
dstpitch = bltwidth; 
53 
srcpitch = bltwidth; 
54  
55 
if (dstpitch < 0  srcpitch < 0) { 
56 
/* is 0 valid? srcpitch == 0 could be useful */

57 
return;

58 
} 
59  
60 
for (y = 0; y < bltheight; y++) { 
61 
for (x = 0; x < bltwidth; x++) { 
62 
ROP_OP(dst, *src); 
63 
dst++; 
64 
src++; 
65 
} 
66 
dst += dstpitch; 
67 
src += srcpitch; 
68 
} 
69 
} 
70  
71 
static void 
72 
glue(cirrus_bitblt_rop_bkwd_, ROP_NAME)(CirrusVGAState *s, 
73 
uint8_t *dst,const uint8_t *src,

74 
int dstpitch,int srcpitch, 
75 
int bltwidth,int bltheight) 
76 
{ 
77 
int x,y;

78 
dstpitch += bltwidth; 
79 
srcpitch += bltwidth; 
80 
for (y = 0; y < bltheight; y++) { 
81 
for (x = 0; x < bltwidth; x++) { 
82 
ROP_OP(dst, *src); 
83 
dst; 
84 
src; 
85 
} 
86 
dst += dstpitch; 
87 
src += srcpitch; 
88 
} 
89 
} 
90  
91 
static void 
92 
glue(glue(cirrus_bitblt_rop_fwd_transp_, ROP_NAME),_8)(CirrusVGAState *s, 
93 
uint8_t *dst,const uint8_t *src,

94 
int dstpitch,int srcpitch, 
95 
int bltwidth,int bltheight) 
96 
{ 
97 
int x,y;

98 
uint8_t p; 
99 
dstpitch = bltwidth; 
100 
srcpitch = bltwidth; 
101 
for (y = 0; y < bltheight; y++) { 
102 
for (x = 0; x < bltwidth; x++) { 
103 
p = *dst; 
104 
ROP_OP(&p, *src); 
105 
if (p != s>vga.gr[0x34]) *dst = p; 
106 
dst++; 
107 
src++; 
108 
} 
109 
dst += dstpitch; 
110 
src += srcpitch; 
111 
} 
112 
} 
113  
114 
static void 
115 
glue(glue(cirrus_bitblt_rop_bkwd_transp_, ROP_NAME),_8)(CirrusVGAState *s, 
116 
uint8_t *dst,const uint8_t *src,

117 
int dstpitch,int srcpitch, 
118 
int bltwidth,int bltheight) 
119 
{ 
120 
int x,y;

121 
uint8_t p; 
122 
dstpitch += bltwidth; 
123 
srcpitch += bltwidth; 
124 
for (y = 0; y < bltheight; y++) { 
125 
for (x = 0; x < bltwidth; x++) { 
126 
p = *dst; 
127 
ROP_OP(&p, *src); 
128 
if (p != s>vga.gr[0x34]) *dst = p; 
129 
dst; 
130 
src; 
131 
} 
132 
dst += dstpitch; 
133 
src += srcpitch; 
134 
} 
135 
} 
136  
137 
static void 
138 
glue(glue(cirrus_bitblt_rop_fwd_transp_, ROP_NAME),_16)(CirrusVGAState *s, 
139 
uint8_t *dst,const uint8_t *src,

140 
int dstpitch,int srcpitch, 
141 
int bltwidth,int bltheight) 
142 
{ 
143 
int x,y;

144 
uint8_t p1, p2; 
145 
dstpitch = bltwidth; 
146 
srcpitch = bltwidth; 
147 
for (y = 0; y < bltheight; y++) { 
148 
for (x = 0; x < bltwidth; x+=2) { 
149 
p1 = *dst; 
150 
p2 = *(dst+1);

151 
ROP_OP(&p1, *src); 
152 
ROP_OP(&p2, *(src + 1));

153 
if ((p1 != s>vga.gr[0x34])  (p2 != s>vga.gr[0x35])) { 
154 
*dst = p1; 
155 
*(dst+1) = p2;

156 
} 
157 
dst+=2;

158 
src+=2;

159 
} 
160 
dst += dstpitch; 
161 
src += srcpitch; 
162 
} 
163 
} 
164  
165 
static void 
166 
glue(glue(cirrus_bitblt_rop_bkwd_transp_, ROP_NAME),_16)(CirrusVGAState *s, 
167 
uint8_t *dst,const uint8_t *src,

168 
int dstpitch,int srcpitch, 
169 
int bltwidth,int bltheight) 
170 
{ 
171 
int x,y;

172 
uint8_t p1, p2; 
173 
dstpitch += bltwidth; 
174 
srcpitch += bltwidth; 
175 
for (y = 0; y < bltheight; y++) { 
176 
for (x = 0; x < bltwidth; x+=2) { 
177 
p1 = *(dst1);

178 
p2 = *dst; 
179 
ROP_OP(&p1, *(src  1));

180 
ROP_OP(&p2, *src); 
181 
if ((p1 != s>vga.gr[0x34])  (p2 != s>vga.gr[0x35])) { 
182 
*(dst1) = p1;

183 
*dst = p2; 
184 
} 
185 
dst=2;

186 
src=2;

187 
} 
188 
dst += dstpitch; 
189 
src += srcpitch; 
190 
} 
191 
} 
192  
193 
#define DEPTH 8 
194 
#include "cirrus_vga_rop2.h" 
195  
196 
#define DEPTH 16 
197 
#include "cirrus_vga_rop2.h" 
198  
199 
#define DEPTH 24 
200 
#include "cirrus_vga_rop2.h" 
201  
202 
#define DEPTH 32 
203 
#include "cirrus_vga_rop2.h" 
204  
205 
#undef ROP_NAME

206 
#undef ROP_OP

207 
#undef ROP_OP_16

208 
#undef ROP_OP_32
