#include "ffb.h"
static void FFBLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src);
static void FFBShowCursor(ScrnInfoPtr pScrn);
static void FFBHideCursor(ScrnInfoPtr pScrn);
static void FFBSetCursorPosition(ScrnInfoPtr pScrn, int x, int y);
static void FFBSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg);
static void
FFBLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src)
{
FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
unsigned int *data = (unsigned int *)src;
int x, y;
pFfb->CursorData = src;
x = pFfb->CursorShiftX;
y = pFfb->CursorShiftY;
if (x >= 64 || y >= 64)
y = 64;
FFBDacCursorLoadBitmap(pFfb, x, y, data);
}
static void
FFBShowCursor(ScrnInfoPtr pScrn)
{
FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
FFBDacCursorEnableDisable(pFfb, 1);
}
static void
FFBHideCursor(ScrnInfoPtr pScrn)
{
FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
FFBDacCursorEnableDisable(pFfb, 0);
pFfb->CursorData = NULL;
}
static void
FFBSetCursorPosition(ScrnInfoPtr pScrn, int x, int y)
{
FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
int CursorShiftX = 0, CursorShiftY = 0;
if (x < 0) {
CursorShiftX = -x;
x = 0;
if (CursorShiftX > 64)
CursorShiftX = 64;
}
if (y < 0) {
CursorShiftY = -y;
y = 0;
if (CursorShiftY > 64)
CursorShiftY = 64;
}
if ((CursorShiftX != pFfb->CursorShiftX ||
CursorShiftY != pFfb->CursorShiftY) &&
pFfb->CursorData != NULL) {
pFfb->CursorShiftX = CursorShiftX;
pFfb->CursorShiftY = CursorShiftY;
FFBLoadCursorImage(pScrn, pFfb->CursorData);
}
FFBDacLoadCursorPos(pFfb, x, y);
}
static void
FFBSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg)
{
FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
FFBDacLoadCursorColor(pFfb, fg, bg);
}
Bool
FFBHWCursorInit(ScreenPtr pScreen)
{
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
FFBPtr pFfb;
xf86CursorInfoPtr infoPtr;
pFfb = GET_FFB_FROM_SCRN(pScrn);
pFfb->CursorShiftX = 0;
pFfb->CursorShiftY = 0;
pFfb->CursorData = NULL;
infoPtr = xf86CreateCursorInfoRec();
if(!infoPtr) return FALSE;
pFfb->CursorInfoRec = infoPtr;
infoPtr->MaxWidth = 64;
infoPtr->MaxHeight = 64;
infoPtr->Flags = HARDWARE_CURSOR_AND_SOURCE_WITH_MASK |
HARDWARE_CURSOR_SOURCE_MASK_NOT_INTERLEAVED;
infoPtr->SetCursorColors = FFBSetCursorColors;
infoPtr->SetCursorPosition = FFBSetCursorPosition;
infoPtr->LoadCursorImage = FFBLoadCursorImage;
infoPtr->HideCursor = FFBHideCursor;
infoPtr->ShowCursor = FFBShowCursor;
infoPtr->UseHWCursor = NULL;
return xf86InitCursor(pScreen, infoPtr);
}