root / hw / cirrus_vga_rop.h @ 5fafdf24
History  View  Annotate  Download (4.8 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 void 
26 
glue(cirrus_bitblt_rop_fwd_, ROP_NAME)(CirrusVGAState *s, 
27 
uint8_t *dst,const uint8_t *src,

28 
int dstpitch,int srcpitch, 
29 
int bltwidth,int bltheight) 
30 
{ 
31 
int x,y;

32 
dstpitch = bltwidth; 
33 
srcpitch = bltwidth; 
34 
for (y = 0; y < bltheight; y++) { 
35 
for (x = 0; x < bltwidth; x++) { 
36 
ROP_OP(*dst, *src); 
37 
dst++; 
38 
src++; 
39 
} 
40 
dst += dstpitch; 
41 
src += srcpitch; 
42 
} 
43 
} 
44  
45 
static void 
46 
glue(cirrus_bitblt_rop_bkwd_, 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 
for (y = 0; y < bltheight; y++) { 
55 
for (x = 0; x < bltwidth; x++) { 
56 
ROP_OP(*dst, *src); 
57 
dst; 
58 
src; 
59 
} 
60 
dst += dstpitch; 
61 
src += srcpitch; 
62 
} 
63 
} 
64  
65 
static void 
66 
glue(glue(cirrus_bitblt_rop_fwd_transp_, ROP_NAME),_8)(CirrusVGAState *s, 
67 
uint8_t *dst,const uint8_t *src,

68 
int dstpitch,int srcpitch, 
69 
int bltwidth,int bltheight) 
70 
{ 
71 
int x,y;

72 
uint8_t p; 
73 
dstpitch = bltwidth; 
74 
srcpitch = bltwidth; 
75 
for (y = 0; y < bltheight; y++) { 
76 
for (x = 0; x < bltwidth; x++) { 
77 
p = *dst; 
78 
ROP_OP(p, *src); 
79 
if (p != s>gr[0x34]) *dst = p; 
80 
dst++; 
81 
src++; 
82 
} 
83 
dst += dstpitch; 
84 
src += srcpitch; 
85 
} 
86 
} 
87  
88 
static void 
89 
glue(glue(cirrus_bitblt_rop_bkwd_transp_, ROP_NAME),_8)(CirrusVGAState *s, 
90 
uint8_t *dst,const uint8_t *src,

91 
int dstpitch,int srcpitch, 
92 
int bltwidth,int bltheight) 
93 
{ 
94 
int x,y;

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

114 
int dstpitch,int srcpitch, 
115 
int bltwidth,int bltheight) 
116 
{ 
117 
int x,y;

118 
uint8_t p1, p2; 
119 
dstpitch = bltwidth; 
120 
srcpitch = bltwidth; 
121 
for (y = 0; y < bltheight; y++) { 
122 
for (x = 0; x < bltwidth; x+=2) { 
123 
p1 = *dst; 
124 
p2 = *(dst+1);

125 
ROP_OP(p1, *src); 
126 
ROP_OP(p2, *(src+1));

127 
if ((p1 != s>gr[0x34])  (p2 != s>gr[0x35])) { 
128 
*dst = p1; 
129 
*(dst+1) = p2;

130 
} 
131 
dst+=2;

132 
src+=2;

133 
} 
134 
dst += dstpitch; 
135 
src += srcpitch; 
136 
} 
137 
} 
138  
139 
static void 
140 
glue(glue(cirrus_bitblt_rop_bkwd_transp_, ROP_NAME),_16)(CirrusVGAState *s, 
141 
uint8_t *dst,const uint8_t *src,

142 
int dstpitch,int srcpitch, 
143 
int bltwidth,int bltheight) 
144 
{ 
145 
int x,y;

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

152 
p2 = *dst; 
153 
ROP_OP(p1, *(src1));

154 
ROP_OP(p2, *src); 
155 
if ((p1 != s>gr[0x34])  (p2 != s>gr[0x35])) { 
156 
*(dst1) = p1;

157 
*dst = p2; 
158 
} 
159 
dst=2;

160 
src=2;

161 
} 
162 
dst += dstpitch; 
163 
src += srcpitch; 
164 
} 
165 
} 
166  
167 
#define DEPTH 8 
168 
#include "cirrus_vga_rop2.h" 
169  
170 
#define DEPTH 16 
171 
#include "cirrus_vga_rop2.h" 
172  
173 
#define DEPTH 24 
174 
#include "cirrus_vga_rop2.h" 
175  
176 
#define DEPTH 32 
177 
#include "cirrus_vga_rop2.h" 
178  
179 
#undef ROP_NAME

180 
#undef ROP_OP
