#include "accelerant.h"
#include "rage128.h"
void
Rage128_ShowCursor(bool bShow)
{
OUTREGM(R128_CRTC_GEN_CNTL, bShow ? R128_CRTC_CUR_EN : 0, R128_CRTC_CUR_EN);
}
void
Rage128_SetCursorPosition(int x, int y)
{
SharedInfo& si = *gInfo.sharedInfo;
uint8 xOffset = 0;
uint8 yOffset = 0;
if (x < 0) {
xOffset = (( -x) & 0xFE);
x = 0;
}
if (y < 0) {
yOffset = (( -y) & 0xFE);
y = 0;
}
OUTREG(R128_CUR_HORZ_VERT_OFF, R128_CUR_LOCK | (xOffset << 16) | yOffset);
OUTREG(R128_CUR_HORZ_VERT_POSN, R128_CUR_LOCK | (x << 16) | y);
OUTREG(R128_CUR_OFFSET, si.cursorOffset + yOffset * 16);
}
bool
Rage128_LoadCursorImage(int width, int height, uint8* andMask, uint8* xorMask)
{
SharedInfo& si = *gInfo.sharedInfo;
if (andMask == NULL || xorMask == NULL)
return false;
uint32* fbCursor32 = (uint32*)((addr_t)si.videoMemAddr + si.cursorOffset);
for (int i = 0; i < CURSOR_BYTES; i += 16) {
*fbCursor32++ = ~0;
*fbCursor32++ = ~0;
*fbCursor32++ = 0;
*fbCursor32++ = 0;
}
uint8* fbCursor = (uint8*)((addr_t)si.videoMemAddr + si.cursorOffset);
for (int row = 0; row < height; row++) {
for (int colByte = 0; colByte < width / 8; colByte++) {
fbCursor[row * 16 + colByte] = *andMask++;
fbCursor[row * 16 + colByte + 8] = *xorMask++;
}
}
OUTREG(R128_CUR_CLR0, ~0);
OUTREG(R128_CUR_CLR1, 0);
return true;
}