#include "riva_include.h"
#include "cursorstr.h"
#define TRANSPARENT_PIXEL 0
#define ConvertToRGB555(c) \
(((c & 0xf80000) >> 9 ) | ((c & 0xf800) >> 6 ) | ((c & 0xf8) >> 3 ) | 0x8000)
static void
RivaConvertCursor1555(RivaPtr pRiva, CARD32 *src, CARD16 *dst)
{
CARD32 b, m;
int i, j;
for ( i = 0; i < 32; i++ ) {
b = *src++;
m = *src++;
for ( j = 0; j < 32; j++ ) {
if ( m & 1 )
*dst = ( b & 1) ? pRiva->curFg : pRiva->curBg;
else
*dst = TRANSPARENT_PIXEL;
b >>= 1;
m >>= 1;
dst++;
}
}
}
static void
RivaTransformCursor (RivaPtr pRiva)
{
CARD32 *tmp;
int i, dwords;
dwords = (32 * 32) >> 1;
if(!(tmp = ALLOCATE_LOCAL(dwords * 4))) return;
RivaConvertCursor1555(pRiva, pRiva->curImage, (CARD16*)tmp);
for(i = 0; i < dwords; i++)
pRiva->riva.CURSOR[i] = tmp[i];
DEALLOCATE_LOCAL(tmp);
}
static void
RivaLoadCursorImage( ScrnInfoPtr pScrn, unsigned char *src )
{
RivaPtr pRiva = RivaPTR(pScrn);
memcpy(pRiva->curImage, src, 256);
RivaTransformCursor(pRiva);
}
static void
RivaSetCursorPosition(ScrnInfoPtr pScrn, int x, int y)
{
RivaPtr pRiva = RivaPTR(pScrn);
pRiva->riva.PRAMDAC[0x0000300/4] = (x & 0xFFFF) | (y << 16);
}
static void
RivaSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg)
{
RivaPtr pRiva = RivaPTR(pScrn);
CARD32 fore, back;
fore = ConvertToRGB555(fg);
back = ConvertToRGB555(bg);
if ((pRiva->curFg != fore) || (pRiva->curBg != back)) {
pRiva->curFg = fore;
pRiva->curBg = back;
RivaTransformCursor(pRiva);
}
}
static void
RivaShowCursor(ScrnInfoPtr pScrn)
{
RivaPtr pRiva = RivaPTR(pScrn);
pRiva->riva.ShowHideCursor(&pRiva->riva, 1);
}
static void
RivaHideCursor(ScrnInfoPtr pScrn)
{
RivaPtr pRiva = RivaPTR(pScrn);
pRiva->riva.ShowHideCursor(&pRiva->riva, 0);
}
static Bool
RivaUseHWCursor(ScreenPtr pScreen, CursorPtr pCurs)
{
return TRUE;
}
Bool
RivaCursorInit(ScreenPtr pScreen)
{
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
RivaPtr pRiva = RivaPTR(pScrn);
xf86CursorInfoPtr infoPtr;
infoPtr = xf86CreateCursorInfoRec();
if(!infoPtr) return FALSE;
pRiva->CursorInfoRec = infoPtr;
infoPtr->MaxWidth = infoPtr->MaxHeight = 32;
infoPtr->Flags = HARDWARE_CURSOR_TRUECOLOR_AT_8BPP |
HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_32;
infoPtr->SetCursorColors = RivaSetCursorColors;
infoPtr->SetCursorPosition = RivaSetCursorPosition;
infoPtr->LoadCursorImage = RivaLoadCursorImage;
infoPtr->HideCursor = RivaHideCursor;
infoPtr->ShowCursor = RivaShowCursor;
infoPtr->UseHWCursor = RivaUseHWCursor;
return(xf86InitCursor(pScreen, infoPtr));
}