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 "riva_local.h"
11 #include "riva_include.h"
12 #include "riva_type.h"
13 #include "shadowfb.h"
14 #include "servermd.h"
15
16
17 void
RivaRefreshArea(ScrnInfoPtr pScrn,int num,BoxPtr pbox)18 RivaRefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
19 {
20 RivaPtr pRiva = RivaPTR(pScrn);
21 int width, height, Bpp, FBPitch;
22 unsigned char *src, *dst;
23
24 Bpp = pScrn->bitsPerPixel >> 3;
25 FBPitch = BitmapBytePad(pScrn->displayWidth * pScrn->bitsPerPixel);
26
27 while(num--) {
28 width = (pbox->x2 - pbox->x1) * Bpp;
29 height = pbox->y2 - pbox->y1;
30 src = pRiva->ShadowPtr + (pbox->y1 * pRiva->ShadowPitch) +
31 (pbox->x1 * Bpp);
32 dst = pRiva->FbStart + (pbox->y1 * FBPitch) + (pbox->x1 * Bpp);
33
34 while(height--) {
35 memcpy(dst, src, width);
36 dst += FBPitch;
37 src += pRiva->ShadowPitch;
38 }
39
40 pbox++;
41 }
42 }
43
44 void
RivaPointerMoved(SCRN_ARG_TYPE arg,int x,int y)45 RivaPointerMoved(SCRN_ARG_TYPE arg, int x, int y)
46 {
47 SCRN_INFO_PTR(arg);
48 RivaPtr pRiva = RivaPTR(pScrn);
49 int newX, newY;
50
51 if(pRiva->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 (*pRiva->PointerMoved)(arg, newX, newY);
60 }
61
62 void
RivaRefreshArea8(ScrnInfoPtr pScrn,int num,BoxPtr pbox)63 RivaRefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
64 {
65 RivaPtr pRiva = RivaPTR(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 = -pRiva->Rotate * pRiva->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(pRiva->Rotate == 1) {
80 dstPtr = pRiva->FbStart +
81 (pbox->x1 * dstPitch) + pScrn->virtualX - y2;
82 srcPtr = pRiva->ShadowPtr + ((1 - y2) * srcPitch) + pbox->x1;
83 } else {
84 dstPtr = pRiva->FbStart +
85 ((pScrn->virtualY - pbox->x2) * dstPitch) + y1;
86 srcPtr = pRiva->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 += pRiva->Rotate;
100 dstPtr += dstPitch;
101 }
102
103 pbox++;
104 }
105 }
106
107
108 void
RivaRefreshArea16(ScrnInfoPtr pScrn,int num,BoxPtr pbox)109 RivaRefreshArea16(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
110 {
111 RivaPtr pRiva = RivaPTR(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 = -pRiva->Rotate * pRiva->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(pRiva->Rotate == 1) {
126 dstPtr = (CARD16*)pRiva->FbStart +
127 (pbox->x1 * dstPitch) + pScrn->virtualX - y2;
128 srcPtr = (CARD16*)pRiva->ShadowPtr +
129 ((1 - y2) * srcPitch) + pbox->x1;
130 } else {
131 dstPtr = (CARD16*)pRiva->FbStart +
132 ((pScrn->virtualY - pbox->x2) * dstPitch) + y1;
133 srcPtr = (CARD16*)pRiva->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 += pRiva->Rotate;
146 dstPtr += dstPitch;
147 }
148
149 pbox++;
150 }
151 }
152
153
154 void
RivaRefreshArea32(ScrnInfoPtr pScrn,int num,BoxPtr pbox)155 RivaRefreshArea32(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
156 {
157 RivaPtr pRiva = RivaPTR(pScrn);
158 int count, width, height, dstPitch, srcPitch;
159 CARD32 *dstPtr, *srcPtr, *src, *dst;
160
161 dstPitch = pScrn->displayWidth;
162 srcPitch = -pRiva->Rotate * pRiva->ShadowPitch >> 2;
163
164 while(num--) {
165 width = pbox->x2 - pbox->x1;
166 height = pbox->y2 - pbox->y1;
167
168 if(pRiva->Rotate == 1) {
169 dstPtr = (CARD32*)pRiva->FbStart +
170 (pbox->x1 * dstPitch) + pScrn->virtualX - pbox->y2;
171 srcPtr = (CARD32*)pRiva->ShadowPtr +
172 ((1 - pbox->y2) * srcPitch) + pbox->x1;
173 } else {
174 dstPtr = (CARD32*)pRiva->FbStart +
175 ((pScrn->virtualY - pbox->x2) * dstPitch) + pbox->y1;
176 srcPtr = (CARD32*)pRiva->ShadowPtr +
177 (pbox->y1 * srcPitch) + pbox->x2 - 1;
178 }
179
180 while(width--) {
181 src = srcPtr;
182 dst = dstPtr;
183 count = height;
184 while(count--) {
185 *(dst++) = *src;
186 src += srcPitch;
187 }
188 srcPtr += pRiva->Rotate;
189 dstPtr += dstPitch;
190 }
191
192 pbox++;
193 }
194 }
195