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