#define RBMASK 0xF0F0
#define GAMASK 0x0F0F
#define AMASK 0x000F
#if 1
#define short34to35WithGamma(x) \
( (((x) & 0xf000) >> 1) \
| (((x) & 0x0f00) >> 2) \
| (((x) & 0x00f0) >> 3) \
| (((x) & 0x8000) >> 5) \
| (((x) & 0x0800) >> 6) \
| (((x) & 0x0080) >> 7) )
#define short35to34WithGamma(x) \
( 0x000F \
| (((x) & 0x001e) << 3) \
| (((x) & 0x03c0) << 2) \
| (((x) & 0x7800) << 1) )
#else
#define short34to35WithGamma(x) \
( (_bm34To35SampleTable[((x) & 0x00F0) >> 4]) \
| (_bm34To35SampleTable[((x) & 0x0F00) >> 8] << 5) \
| (_bm34To35SampleTable[(x) >> 12] << 10) )
#define short35to34WithGamma(x) \
( 0x000F \
| (_bm35To34SampleTable[x & 0x001F] << 4) \
| (_bm35To34SampleTable[(x & 0x03E0) >> 5] << 8) \
| (_bm35To34SampleTable[(x & 0x7C00) >> 10] << 12) )
#endif
void IOFramebuffer::StdFBDisplayCursor555(
IOFramebuffer * inst,
StdFBShmem_t *shmem,
volatile unsigned short *vramPtr,
unsigned int cursStart,
unsigned int vramRow,
unsigned int cursRow,
int width,
int height )
{
int i, j;
volatile unsigned short *cursPtr;
volatile unsigned short *savePtr;
unsigned short s, d, f;
unsigned char *_bm34To35SampleTable;
unsigned char *_bm35To34SampleTable;
int frame;
frame = shmem->frame;
if (frame >= inst->__private->numCursorFrames) return;
savePtr = (volatile unsigned short *) inst->cursorSave;
cursPtr = (volatile unsigned short *) inst->__private->cursorImages[ frame ];
cursPtr += cursStart;
_bm34To35SampleTable = inst->colorConvert.t._bm34To35SampleTable;
_bm35To34SampleTable = inst->colorConvert.t._bm35To34SampleTable;
for (i = height; --i >= 0; ) {
for (j = width; --j >= 0; ) {
d = *savePtr++ = *vramPtr;
if ( (s = *cursPtr++) == 0 )
{
++vramPtr;
continue;
}
if ( (f = (~s) & (unsigned int)AMASK) == 0 )
{
*vramPtr++ = short34to35WithGamma(s);
continue;
}
if (f == AMASK)
{
*vramPtr++ = d ^ short34to35WithGamma(s);
continue;
}
d = short35to34WithGamma(d);
d = s + (((((d & RBMASK)>>4)*f + GAMASK) & RBMASK)
| ((((d & GAMASK)*f+GAMASK)>>4) & GAMASK));
*vramPtr++ = short34to35WithGamma(d);
}
cursPtr += cursRow;
vramPtr += vramRow;
}
}
static inline unsigned int MUL32(unsigned int a, unsigned int b)
{
unsigned int v, w;
v = ((a & 0xFF00FF00) >> 8) * b;
v += ((v & 0xFF00FF00) >> 8) + 0x00010001;
w = (a & 0x00FF00FF) * b;
w += ((w & 0xFF00FF00) >> 8) + 0x00010001;
return (v & 0xFF00FF00) | ((w >> 8) & 0x00FF00FF);
}
static inline unsigned char map32to256( unsigned char *directToLogical, unsigned int s)
{
unsigned char logicalValue;
if ((s ^ (s>>8)) & 0x00FFFF00) {
logicalValue = directToLogical[(s>>24) + 0] +
directToLogical[((s>>16)&0xFF) + 256] +
directToLogical[((s>>8)&0xFF) + 512];
} else {
logicalValue = directToLogical[(s>>24) + 768];
}
return( directToLogical[ logicalValue + 1024 ]);
}
void IOFramebuffer::StdFBDisplayCursor8P(
IOFramebuffer * inst,
StdFBShmem_t *shmem,
volatile unsigned char *vramPtr,
unsigned int cursStart,
unsigned int vramRow,
unsigned int cursRow,
int width,
int height )
{
int i, j;
volatile unsigned char *savePtr;
volatile unsigned char *cursPtr;
unsigned char dst, src, alpha, white;
unsigned int rgb32val;
volatile unsigned char *maskPtr;
unsigned int *_bm256To38SampleTable
= inst->colorConvert.t._bm256To38SampleTable;
unsigned char *_bm38To256SampleTable
= inst->colorConvert.t._bm38To256SampleTable;
int frame;
frame = shmem->frame;
if (frame >= inst->__private->numCursorFrames) return;
savePtr = (volatile unsigned char *) inst->cursorSave;
cursPtr = (volatile unsigned char *) inst->__private->cursorImages[ frame ];
maskPtr = (volatile unsigned char *) inst->__private->cursorMasks[ frame ];
cursPtr += cursStart;
maskPtr += cursStart;
white = inst->white;
for (i = height; --i >= 0; ) {
for (j = width; --j >= 0; savePtr++,maskPtr++,cursPtr++,vramPtr++) {
dst = *savePtr = *vramPtr;
src = *cursPtr;
if ((alpha = *maskPtr)) {
if ((alpha = ~alpha)) {
rgb32val = _bm256To38SampleTable[dst];
rgb32val = (_bm256To38SampleTable[src] & ~0xFF) +
MUL32(rgb32val, alpha);
*vramPtr = map32to256(_bm38To256SampleTable, rgb32val);
} else
*vramPtr = src;
} else if (src == white)
*vramPtr = dst ^ 0xFF;
}
cursPtr += cursRow;
maskPtr += cursRow;
vramPtr += vramRow;
}
}
void IOFramebuffer::StdFBDisplayCursor8G(
IOFramebuffer * inst,
StdFBShmem_t *shmem,
volatile unsigned char *vramPtr,
unsigned int cursStart,
unsigned int vramRow,
unsigned int cursRow,
int width,
int height )
{
int i, j;
volatile unsigned char *savePtr;
unsigned short s, d, a;
volatile unsigned char *cursPtr;
volatile unsigned char *maskPtr;
int frame;
frame = shmem->frame;
if (frame >= inst->__private->numCursorFrames) return;
savePtr = (volatile unsigned char *) inst->cursorSave;
cursPtr = (volatile unsigned char *) inst->__private->cursorImages[ frame ];
maskPtr = (volatile unsigned char *) inst->__private->cursorMasks[ frame ];
cursPtr += cursStart;
maskPtr += cursStart;
for (i = height; --i >= 0; ) {
for (j = width; --j >= 0; ) {
int t;
d = *savePtr++ = *vramPtr;
s = *cursPtr++;
a = *maskPtr++;
if (a) {
t = d * (255 - *maskPtr++);
*vramPtr = s + ((t + (t >> 8) + 1) >> 8);
} else if (s)
*vramPtr = d ^ s;
vramPtr++;
}
cursPtr += cursRow;
maskPtr += cursRow;
vramPtr += vramRow;
}
}
void IOFramebuffer::StdFBDisplayCursor30Axxx(
IOFramebuffer * inst,
StdFBShmem_t *shmem,
volatile unsigned int *vramPtr,
unsigned int cursStart,
unsigned int vramRow,
unsigned int cursRow,
int width,
int height )
{
int i, j;
volatile unsigned int *savePtr;
unsigned long long s, d;
unsigned int f;
volatile unsigned int *cursPtr;
int frame;
frame = shmem->frame;
if (frame >= inst->__private->numCursorFrames) return;
savePtr = (volatile unsigned int *) inst->cursorSave;
cursPtr = (volatile unsigned int *) inst->__private->cursorImages[ frame ];
cursPtr += cursStart;
for (i = height; --i >= 0; ) {
for (j = width; --j >= 0; ) {
d = *savePtr++ = *vramPtr;
s = *cursPtr++;
f = s >> 24;
s = ((s&0x000000FF)<<2)|((s&0x0000FF00)<<4)|((s&0x00FF0000)<<6);
if (f) {
if (f == 0xFF) *vramPtr++ = s;
else { s <<= 10; d <<= 10;
f ^= 0xFF;
d = s+(((((d&0xFFC00FFC00ULL)>>8)*f+0x0FF000FF) & 0xFFC00FFC00ULL)
| ((((d & 0x3FF003FF)*f+0x0FF000FF)>>8) & 0x3FF003FF));
*vramPtr++ = (d>>10) | 0xC0000000;
}
} else if (s) {
*vramPtr++ = d ^ s;
continue;
} else vramPtr++;
}
cursPtr += cursRow;
vramPtr += vramRow;
}
}
void IOFramebuffer::StdFBDisplayCursor32Axxx(
IOFramebuffer * inst,
StdFBShmem_t *shmem,
volatile unsigned int *vramPtr,
unsigned int cursStart,
unsigned int vramRow,
unsigned int cursRow,
int width,
int height )
{
int i, j;
volatile unsigned int *savePtr;
unsigned int s, d, f;
volatile unsigned int *cursPtr;
int frame;
frame = shmem->frame;
if (frame >= inst->__private->numCursorFrames) return;
savePtr = (volatile unsigned int *) inst->cursorSave;
cursPtr = (volatile unsigned int *) inst->__private->cursorImages[ frame ];
cursPtr += cursStart;
for (i = height; --i >= 0; ) {
for (j = width; --j >= 0; ) {
d = *savePtr++ = *vramPtr;
s = *cursPtr++;
f = s >> 24;
if (f) {
if (f == 0xFF) *vramPtr++ = s;
else { s <<= 8; d <<= 8;
f ^= 0xFF;
d = s+(((((d&0xFF00FF00)>>8)*f+0x00FF00FF)&0xFF00FF00)
| ((((d & 0x00FF00FF)*f+0x00FF00FF)>>8) &
0x00FF00FF));
*vramPtr++ = (d>>8) | 0xFF000000;
}
} else if (s) {
*vramPtr++ = d ^ s;
continue;
} else vramPtr++;
}
cursPtr += cursRow;
vramPtr += vramRow;
}
}
void IOFramebuffer::StdFBRemoveCursor16(
IOFramebuffer * inst,
StdFBShmem_t *shmem,
volatile unsigned short *vramPtr,
unsigned int vramRow,
int width,
int height )
{
int i, j;
volatile unsigned short *savePtr;
savePtr = (volatile unsigned short *) inst->cursorSave;
for (i = height; --i >= 0; ) {
for (j = width; --j >= 0; )
*vramPtr++ = *savePtr++;
vramPtr += vramRow;
}
}
void IOFramebuffer::StdFBRemoveCursor8(
IOFramebuffer * inst,
StdFBShmem_t *shmem,
volatile unsigned char *vramPtr,
unsigned int vramRow,
int width,
int height )
{
int i, j;
volatile unsigned char *savePtr;
savePtr = (volatile unsigned char *) inst->cursorSave;
for (i = height; --i >= 0; ) {
for (j = width; --j >= 0; )
*vramPtr++ = *savePtr++;
vramPtr += vramRow;
}
}
void IOFramebuffer::StdFBRemoveCursor32(
IOFramebuffer * inst,
StdFBShmem_t *shmem,
volatile unsigned int *vramPtr,
unsigned int vramRow,
int width,
int height )
{
int i, j;
volatile unsigned int *savePtr;
savePtr = (volatile unsigned int *) inst->cursorSave;
for (i = height; --i >= 0; ) {
for (j = width; --j >= 0; )
*vramPtr++ = *savePtr++;
vramPtr += vramRow;
}
}