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