1 /*
2 Copyright (c) 1999, The XFree86 Project Inc.
3 Written by Mark Vojkovich <markv@valinux.com>
4 */
5
6 #ifdef HAVE_CONFIG_H
7 #include "config.h"
8 #endif
9
10 #include "xf86.h"
11 #include "xf86_OSproc.h"
12 #include "xf86Pci.h"
13 #include "mga_reg.h"
14 #include "mga.h"
15 #include "shadowfb.h"
16 #include "servermd.h"
17
18
19
20 void
MGARefreshArea(ScrnInfoPtr pScrn,int num,BoxPtr pbox)21 MGARefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
22 {
23 MGAPtr pMga = MGAPTR(pScrn);
24 int width, height, Bpp, FBPitch;
25 unsigned char *src, *dst;
26
27 Bpp = pScrn->bitsPerPixel >> 3;
28 FBPitch = BitmapBytePad(pScrn->displayWidth * pScrn->bitsPerPixel);
29
30 while(num--) {
31 width = (pbox->x2 - pbox->x1) * Bpp;
32 height = pbox->y2 - pbox->y1;
33 src = pMga->ShadowPtr + (pbox->y1 * pMga->ShadowPitch) +
34 (pbox->x1 * Bpp);
35 dst = pMga->FbStart + (pbox->y1 * FBPitch) + (pbox->x1 * Bpp);
36
37 while(height--) {
38 memcpy(dst, src, width);
39 dst += FBPitch;
40 src += pMga->ShadowPitch;
41 }
42
43 pbox++;
44 }
45 }
46
47 void
MGAPointerMoved(SCRN_ARG_TYPE arg,int x,int y)48 MGAPointerMoved(SCRN_ARG_TYPE arg, int x, int y)
49 {
50 SCRN_INFO_PTR(arg);
51 MGAPtr pMga = MGAPTR(pScrn);
52 int newX, newY;
53
54 if(pMga->Rotate == 1) {
55 newX = pScrn->pScreen->height - y - 1;
56 newY = x;
57 } else {
58 newX = y;
59 newY = pScrn->pScreen->width - x - 1;
60 }
61
62 (*pMga->PointerMoved)(arg, newX, newY);
63 }
64
65 void
MGARefreshArea8(ScrnInfoPtr pScrn,int num,BoxPtr pbox)66 MGARefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
67 {
68 MGAPtr pMga = MGAPTR(pScrn);
69 int count, width, height, y1, y2, dstPitch, srcPitch;
70 CARD8 *dstPtr, *srcPtr, *src;
71 CARD32 *dst;
72
73 dstPitch = pScrn->displayWidth;
74 srcPitch = -pMga->Rotate * pMga->ShadowPitch;
75
76 while(num--) {
77 width = pbox->x2 - pbox->x1;
78 y1 = pbox->y1 & ~3;
79 y2 = (pbox->y2 + 3) & ~3;
80 height = (y2 - y1) >> 2; /* in dwords */
81
82 if(pMga->Rotate == 1) {
83 dstPtr = pMga->FbStart +
84 (pbox->x1 * dstPitch) + pScrn->virtualX - y2;
85 srcPtr = pMga->ShadowPtr + ((1 - y2) * srcPitch) + pbox->x1;
86 } else {
87 dstPtr = pMga->FbStart +
88 ((pScrn->virtualY - pbox->x2) * dstPitch) + y1;
89 srcPtr = pMga->ShadowPtr + (y1 * srcPitch) + pbox->x2 - 1;
90 }
91
92 while(width--) {
93 src = srcPtr;
94 dst = (CARD32*)dstPtr;
95 count = height;
96 while(count--) {
97 *(dst++) = src[0] | (src[srcPitch] << 8) |
98 (src[srcPitch * 2] << 16) |
99 (src[srcPitch * 3] << 24);
100 src += srcPitch * 4;
101 }
102 srcPtr += pMga->Rotate;
103 dstPtr += dstPitch;
104 }
105
106 pbox++;
107 }
108 }
109
110
111 void
MGARefreshArea16(ScrnInfoPtr pScrn,int num,BoxPtr pbox)112 MGARefreshArea16(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
113 {
114 MGAPtr pMga = MGAPTR(pScrn);
115 int count, width, height, y1, y2, dstPitch, srcPitch;
116 CARD16 *dstPtr, *srcPtr, *src;
117 CARD32 *dst;
118
119 dstPitch = pScrn->displayWidth;
120 srcPitch = -pMga->Rotate * pMga->ShadowPitch >> 1;
121
122 while(num--) {
123 width = pbox->x2 - pbox->x1;
124 y1 = pbox->y1 & ~1;
125 y2 = (pbox->y2 + 1) & ~1;
126 height = (y2 - y1) >> 1; /* in dwords */
127
128 if(pMga->Rotate == 1) {
129 dstPtr = (CARD16*)pMga->FbStart +
130 (pbox->x1 * dstPitch) + pScrn->virtualX - y2;
131 srcPtr = (CARD16*)pMga->ShadowPtr +
132 ((1 - y2) * srcPitch) + pbox->x1;
133 } else {
134 dstPtr = (CARD16*)pMga->FbStart +
135 ((pScrn->virtualY - pbox->x2) * dstPitch) + y1;
136 srcPtr = (CARD16*)pMga->ShadowPtr +
137 (y1 * srcPitch) + pbox->x2 - 1;
138 }
139
140 while(width--) {
141 src = srcPtr;
142 dst = (CARD32*)dstPtr;
143 count = height;
144 while(count--) {
145 *(dst++) = src[0] | (src[srcPitch] << 16);
146 src += srcPitch * 2;
147 }
148 srcPtr += pMga->Rotate;
149 dstPtr += dstPitch;
150 }
151
152 pbox++;
153 }
154 }
155
156
157 /* this one could be faster */
158 void
MGARefreshArea24(ScrnInfoPtr pScrn,int num,BoxPtr pbox)159 MGARefreshArea24(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
160 {
161 MGAPtr pMga = MGAPTR(pScrn);
162 int count, width, height, y1, y2, dstPitch, srcPitch;
163 CARD8 *dstPtr, *srcPtr, *src;
164 CARD32 *dst;
165
166 dstPitch = BitmapBytePad(pScrn->displayWidth * 24);
167 srcPitch = -pMga->Rotate * pMga->ShadowPitch;
168
169 while(num--) {
170 width = pbox->x2 - pbox->x1;
171 y1 = pbox->y1 & ~3;
172 y2 = (pbox->y2 + 3) & ~3;
173 height = (y2 - y1) >> 2; /* blocks of 3 dwords */
174
175 if(pMga->Rotate == 1) {
176 dstPtr = pMga->FbStart +
177 (pbox->x1 * dstPitch) + ((pScrn->virtualX - y2) * 3);
178 srcPtr = pMga->ShadowPtr + ((1 - y2) * srcPitch) + (pbox->x1 * 3);
179 } else {
180 dstPtr = pMga->FbStart +
181 ((pScrn->virtualY - pbox->x2) * dstPitch) + (y1 * 3);
182 srcPtr = pMga->ShadowPtr + (y1 * srcPitch) + (pbox->x2 * 3) - 3;
183 }
184
185 while(width--) {
186 src = srcPtr;
187 dst = (CARD32*)dstPtr;
188 count = height;
189 while(count--) {
190 dst[0] = src[0] | (src[1] << 8) | (src[2] << 16) |
191 (src[srcPitch] << 24);
192 dst[1] = src[srcPitch + 1] | (src[srcPitch + 2] << 8) |
193 (src[srcPitch * 2] << 16) |
194 (src[(srcPitch * 2) + 1] << 24);
195 dst[2] = src[(srcPitch * 2) + 2] | (src[srcPitch * 3] << 8) |
196 (src[(srcPitch * 3) + 1] << 16) |
197 (src[(srcPitch * 3) + 2] << 24);
198 dst += 3;
199 src += srcPitch * 4;
200 }
201 srcPtr += pMga->Rotate * 3;
202 dstPtr += dstPitch;
203 }
204
205 pbox++;
206 }
207 }
208
209 void
MGARefreshArea32(ScrnInfoPtr pScrn,int num,BoxPtr pbox)210 MGARefreshArea32(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
211 {
212 MGAPtr pMga = MGAPTR(pScrn);
213 int count, width, height, dstPitch, srcPitch;
214 CARD32 *dstPtr, *srcPtr, *src, *dst;
215
216 dstPitch = pScrn->displayWidth;
217 srcPitch = -pMga->Rotate * pMga->ShadowPitch >> 2;
218
219 while(num--) {
220 width = pbox->x2 - pbox->x1;
221 height = pbox->y2 - pbox->y1;
222
223 if(pMga->Rotate == 1) {
224 dstPtr = (CARD32*)pMga->FbStart +
225 (pbox->x1 * dstPitch) + pScrn->virtualX - pbox->y2;
226 srcPtr = (CARD32*)pMga->ShadowPtr +
227 ((1 - pbox->y2) * srcPitch) + pbox->x1;
228 } else {
229 dstPtr = (CARD32*)pMga->FbStart +
230 ((pScrn->virtualY - pbox->x2) * dstPitch) + pbox->y1;
231 srcPtr = (CARD32*)pMga->ShadowPtr +
232 (pbox->y1 * srcPitch) + pbox->x2 - 1;
233 }
234
235 while(width--) {
236 src = srcPtr;
237 dst = dstPtr;
238 count = height;
239 while(count--) {
240 *(dst++) = *src;
241 src += srcPitch;
242 }
243 srcPtr += pMga->Rotate;
244 dstPtr += dstPitch;
245 }
246
247 pbox++;
248 }
249 }
250
251
252
253