1fc5a983dSmrg/* 2fc5a983dSmrg Copyright (c) 1999, The XFree86 Project Inc. 3fc5a983dSmrg Written by Mark Vojkovich <markv@valinux.com> 4fc5a983dSmrg*/ 5fc5a983dSmrg 6fc5a983dSmrg#ifdef HAVE_CONFIG_H 7fc5a983dSmrg#include "config.h" 8fc5a983dSmrg#endif 9fc5a983dSmrg 10fc5a983dSmrg#include "riva_local.h" 11fc5a983dSmrg#include "riva_include.h" 12fc5a983dSmrg#include "riva_type.h" 13fc5a983dSmrg#include "shadowfb.h" 14fc5a983dSmrg#include "servermd.h" 15fc5a983dSmrg 16fc5a983dSmrg 17fc5a983dSmrgvoid 18fc5a983dSmrgRivaRefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox) 19fc5a983dSmrg{ 20fc5a983dSmrg RivaPtr pRiva = RivaPTR(pScrn); 21fc5a983dSmrg int width, height, Bpp, FBPitch; 22fc5a983dSmrg unsigned char *src, *dst; 23fc5a983dSmrg 24fc5a983dSmrg Bpp = pScrn->bitsPerPixel >> 3; 25fc5a983dSmrg FBPitch = BitmapBytePad(pScrn->displayWidth * pScrn->bitsPerPixel); 26fc5a983dSmrg 27fc5a983dSmrg while(num--) { 28fc5a983dSmrg width = (pbox->x2 - pbox->x1) * Bpp; 29fc5a983dSmrg height = pbox->y2 - pbox->y1; 30fc5a983dSmrg src = pRiva->ShadowPtr + (pbox->y1 * pRiva->ShadowPitch) + 31fc5a983dSmrg (pbox->x1 * Bpp); 32fc5a983dSmrg dst = pRiva->FbStart + (pbox->y1 * FBPitch) + (pbox->x1 * Bpp); 33fc5a983dSmrg 34fc5a983dSmrg while(height--) { 35fc5a983dSmrg memcpy(dst, src, width); 36fc5a983dSmrg dst += FBPitch; 37fc5a983dSmrg src += pRiva->ShadowPitch; 38fc5a983dSmrg } 39fc5a983dSmrg 40fc5a983dSmrg pbox++; 41fc5a983dSmrg } 42fc5a983dSmrg} 43fc5a983dSmrg 44fc5a983dSmrgvoid 45bd304fc0SmrgRivaPointerMoved(SCRN_ARG_TYPE arg, int x, int y) 46fc5a983dSmrg{ 47bd304fc0Smrg SCRN_INFO_PTR(arg); 48fc5a983dSmrg RivaPtr pRiva = RivaPTR(pScrn); 49fc5a983dSmrg int newX, newY; 50fc5a983dSmrg 51fc5a983dSmrg if(pRiva->Rotate == 1) { 52fc5a983dSmrg newX = pScrn->pScreen->height - y - 1; 53fc5a983dSmrg newY = x; 54fc5a983dSmrg } else { 55fc5a983dSmrg newX = y; 56fc5a983dSmrg newY = pScrn->pScreen->width - x - 1; 57fc5a983dSmrg } 58fc5a983dSmrg 59bd304fc0Smrg (*pRiva->PointerMoved)(arg, newX, newY); 60fc5a983dSmrg} 61fc5a983dSmrg 62fc5a983dSmrgvoid 63fc5a983dSmrgRivaRefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox) 64fc5a983dSmrg{ 65fc5a983dSmrg RivaPtr pRiva = RivaPTR(pScrn); 66fc5a983dSmrg int count, width, height, y1, y2, dstPitch, srcPitch; 67fc5a983dSmrg CARD8 *dstPtr, *srcPtr, *src; 68fc5a983dSmrg CARD32 *dst; 69fc5a983dSmrg 70fc5a983dSmrg dstPitch = pScrn->displayWidth; 71fc5a983dSmrg srcPitch = -pRiva->Rotate * pRiva->ShadowPitch; 72fc5a983dSmrg 73fc5a983dSmrg while(num--) { 74fc5a983dSmrg width = pbox->x2 - pbox->x1; 75fc5a983dSmrg y1 = pbox->y1 & ~3; 76fc5a983dSmrg y2 = (pbox->y2 + 3) & ~3; 77fc5a983dSmrg height = (y2 - y1) >> 2; /* in dwords */ 78fc5a983dSmrg 79fc5a983dSmrg if(pRiva->Rotate == 1) { 80fc5a983dSmrg dstPtr = pRiva->FbStart + 81fc5a983dSmrg (pbox->x1 * dstPitch) + pScrn->virtualX - y2; 82fc5a983dSmrg srcPtr = pRiva->ShadowPtr + ((1 - y2) * srcPitch) + pbox->x1; 83fc5a983dSmrg } else { 84fc5a983dSmrg dstPtr = pRiva->FbStart + 85fc5a983dSmrg ((pScrn->virtualY - pbox->x2) * dstPitch) + y1; 86fc5a983dSmrg srcPtr = pRiva->ShadowPtr + (y1 * srcPitch) + pbox->x2 - 1; 87fc5a983dSmrg } 88fc5a983dSmrg 89fc5a983dSmrg while(width--) { 90fc5a983dSmrg src = srcPtr; 91fc5a983dSmrg dst = (CARD32*)dstPtr; 92fc5a983dSmrg count = height; 93fc5a983dSmrg while(count--) { 94fc5a983dSmrg *(dst++) = src[0] | (src[srcPitch] << 8) | 95fc5a983dSmrg (src[srcPitch * 2] << 16) | 96fc5a983dSmrg (src[srcPitch * 3] << 24); 97fc5a983dSmrg src += srcPitch * 4; 98fc5a983dSmrg } 99fc5a983dSmrg srcPtr += pRiva->Rotate; 100fc5a983dSmrg dstPtr += dstPitch; 101fc5a983dSmrg } 102fc5a983dSmrg 103fc5a983dSmrg pbox++; 104fc5a983dSmrg } 105fc5a983dSmrg} 106fc5a983dSmrg 107fc5a983dSmrg 108fc5a983dSmrgvoid 109fc5a983dSmrgRivaRefreshArea16(ScrnInfoPtr pScrn, int num, BoxPtr pbox) 110fc5a983dSmrg{ 111fc5a983dSmrg RivaPtr pRiva = RivaPTR(pScrn); 112fc5a983dSmrg int count, width, height, y1, y2, dstPitch, srcPitch; 113fc5a983dSmrg CARD16 *dstPtr, *srcPtr, *src; 114fc5a983dSmrg CARD32 *dst; 115fc5a983dSmrg 116fc5a983dSmrg dstPitch = pScrn->displayWidth; 117fc5a983dSmrg srcPitch = -pRiva->Rotate * pRiva->ShadowPitch >> 1; 118fc5a983dSmrg 119fc5a983dSmrg while(num--) { 120fc5a983dSmrg width = pbox->x2 - pbox->x1; 121fc5a983dSmrg y1 = pbox->y1 & ~1; 122fc5a983dSmrg y2 = (pbox->y2 + 1) & ~1; 123fc5a983dSmrg height = (y2 - y1) >> 1; /* in dwords */ 124fc5a983dSmrg 125fc5a983dSmrg if(pRiva->Rotate == 1) { 126fc5a983dSmrg dstPtr = (CARD16*)pRiva->FbStart + 127fc5a983dSmrg (pbox->x1 * dstPitch) + pScrn->virtualX - y2; 128fc5a983dSmrg srcPtr = (CARD16*)pRiva->ShadowPtr + 129fc5a983dSmrg ((1 - y2) * srcPitch) + pbox->x1; 130fc5a983dSmrg } else { 131fc5a983dSmrg dstPtr = (CARD16*)pRiva->FbStart + 132fc5a983dSmrg ((pScrn->virtualY - pbox->x2) * dstPitch) + y1; 133fc5a983dSmrg srcPtr = (CARD16*)pRiva->ShadowPtr + 134fc5a983dSmrg (y1 * srcPitch) + pbox->x2 - 1; 135fc5a983dSmrg } 136fc5a983dSmrg 137fc5a983dSmrg while(width--) { 138fc5a983dSmrg src = srcPtr; 139fc5a983dSmrg dst = (CARD32*)dstPtr; 140fc5a983dSmrg count = height; 141fc5a983dSmrg while(count--) { 142fc5a983dSmrg *(dst++) = src[0] | (src[srcPitch] << 16); 143fc5a983dSmrg src += srcPitch * 2; 144fc5a983dSmrg } 145fc5a983dSmrg srcPtr += pRiva->Rotate; 146fc5a983dSmrg dstPtr += dstPitch; 147fc5a983dSmrg } 148fc5a983dSmrg 149fc5a983dSmrg pbox++; 150fc5a983dSmrg } 151fc5a983dSmrg} 152fc5a983dSmrg 153fc5a983dSmrg 154fc5a983dSmrgvoid 155fc5a983dSmrgRivaRefreshArea32(ScrnInfoPtr pScrn, int num, BoxPtr pbox) 156fc5a983dSmrg{ 157fc5a983dSmrg RivaPtr pRiva = RivaPTR(pScrn); 158fc5a983dSmrg int count, width, height, dstPitch, srcPitch; 159fc5a983dSmrg CARD32 *dstPtr, *srcPtr, *src, *dst; 160fc5a983dSmrg 161fc5a983dSmrg dstPitch = pScrn->displayWidth; 162fc5a983dSmrg srcPitch = -pRiva->Rotate * pRiva->ShadowPitch >> 2; 163fc5a983dSmrg 164fc5a983dSmrg while(num--) { 165fc5a983dSmrg width = pbox->x2 - pbox->x1; 166fc5a983dSmrg height = pbox->y2 - pbox->y1; 167fc5a983dSmrg 168fc5a983dSmrg if(pRiva->Rotate == 1) { 169fc5a983dSmrg dstPtr = (CARD32*)pRiva->FbStart + 170fc5a983dSmrg (pbox->x1 * dstPitch) + pScrn->virtualX - pbox->y2; 171fc5a983dSmrg srcPtr = (CARD32*)pRiva->ShadowPtr + 172fc5a983dSmrg ((1 - pbox->y2) * srcPitch) + pbox->x1; 173fc5a983dSmrg } else { 174fc5a983dSmrg dstPtr = (CARD32*)pRiva->FbStart + 175fc5a983dSmrg ((pScrn->virtualY - pbox->x2) * dstPitch) + pbox->y1; 176fc5a983dSmrg srcPtr = (CARD32*)pRiva->ShadowPtr + 177fc5a983dSmrg (pbox->y1 * srcPitch) + pbox->x2 - 1; 178fc5a983dSmrg } 179fc5a983dSmrg 180fc5a983dSmrg while(width--) { 181fc5a983dSmrg src = srcPtr; 182fc5a983dSmrg dst = dstPtr; 183fc5a983dSmrg count = height; 184fc5a983dSmrg while(count--) { 185fc5a983dSmrg *(dst++) = *src; 186fc5a983dSmrg src += srcPitch; 187fc5a983dSmrg } 188fc5a983dSmrg srcPtr += pRiva->Rotate; 189fc5a983dSmrg dstPtr += dstPitch; 190fc5a983dSmrg } 191fc5a983dSmrg 192fc5a983dSmrg pbox++; 193fc5a983dSmrg } 194fc5a983dSmrg} 195