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