#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;
savePtr = (volatile unsigned short *) inst->cursorSave;
cursPtr = (volatile unsigned short *) inst->cursorImages[ shmem->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;
}
}
void IOFramebuffer::StdFBDisplayCursor444(
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 *savePtr;
volatile unsigned short *cursPtr;
unsigned short s, d, f;
savePtr = (volatile unsigned short *) inst->cursorSave;
cursPtr = (volatile unsigned short *) inst->cursorImages[ shmem->frame ];
cursPtr += cursStart;
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++ = s;
continue;
}
if ((f == AMASK))
{
*vramPtr++ = d ^ s;
continue;
}
*vramPtr++ = s + (((((d & RBMASK)>>4)*f + GAMASK) & RBMASK)
| ((((d & GAMASK)*f+GAMASK)>>4) & GAMASK));
}
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;
savePtr = (volatile unsigned char *) inst->cursorSave;
cursPtr = (volatile unsigned char *) inst->cursorImages[ shmem->frame ];
maskPtr = (volatile unsigned char *) inst->cursorMasks[ shmem->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 = map32to256(_bm38To256SampleTable,
_bm256To38SampleTable[dst] ^ 0xffffffff);
}
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;
savePtr = (volatile unsigned char *) inst->cursorSave;
cursPtr = (volatile unsigned char *) inst->cursorImages[ shmem->frame ];
maskPtr = (volatile unsigned char *) inst->cursorMasks[ shmem->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::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;
savePtr = (volatile unsigned int *) inst->cursorSave;
cursPtr = (volatile unsigned int *) inst->cursorImages[ shmem->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::StdFBDisplayCursor32xxxA(
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;
savePtr = (volatile unsigned int *) inst->cursorSave;
cursPtr = (volatile unsigned int *) inst->cursorImages[ shmem->frame ];
cursPtr += cursStart;
for (i = height; --i >= 0; ) {
for (j = width; --j >= 0; ) {
d = *savePtr++ = *vramPtr;
s = *cursPtr++;
f = s & (unsigned int)0xFF;
if (f) {
if (f == 0xff) *vramPtr++ = s;
else { f ^= 0xFF;
d = s+(((((d&0xFF00FF00)>>8)*f+0x00FF00FF)&0xFF00FF00)
| ((((d & 0x00FF00FF)*f+0x00FF00FF)>>8) &
0x00FF00FF));
*vramPtr++ = d;
}
} 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;
}
}