Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1481 lines
41 KiB

#include "precomp.h"
#pragma hdrstop
#include "genclear.h"
// Null stores...
static void FASTCALL Store_NOT(__GLcolorBuffer *cfb, const __GLfragment *frag)
{
}
static GLboolean FASTCALL StoreSpanNone(__GLcontext *gc)
{
return GL_FALSE;
}
/* XXX! Current policy for >8-bit ColorIndex:
- The index<->Color mapping will be kept in gengc->pajTranslateVector,
viewed as an array of longs. The first entry in the array will be
the number of valid entries in the table.
- gengc->pajTranslateVector will never be NULL, it is always allocated
at MakeCurrent, and tracks any palette changes.
- the minimum indexBits is 8 if the pixel format is > 8 bits deep
*/
/******************************Public*Routine******************************\
* dibSetPixelCI
*
* Special case version of GDI SetPixel API for use when the destination
* surface is a DIB and rendering in color index mode.
*
* This function *must* be used in lieu of gdiCopyPixels if we are
* accessing the screen directly as it is not safe to call GDI entry
* points with a screen lock
*
* History:
* 29-May-1995 -by- Gilman Wong [gilmanw]
* Wrote it.
\**************************************************************************/
void dibSetPixelCI(__GLGENcontext *gengc, __GLcolorBuffer *cfb,
GLint x, GLint y, DWORD dwColor)
{
GLuint flags;
flags = cfb->buf.flags;
ASSERTOPENGL(flags & DIB_FORMAT,
"dibSetPixelCI called on non-DIB\n");
if ( (flags & NO_CLIP) || wglPixelVisible(x, y) )
{
if ( gengc->gsurf.pfd.cColorBits > 4 )
{
VOID *pvDib;
UINT cjPixel = gengc->gsurf.pfd.cColorBits >> 3;
pvDib = (VOID *) (((BYTE *) gengc->gc.front->buf.base) +
gengc->gc.front->buf.outerWidth * y +
cjPixel * x);
if ( gengc->gsurf.pfd.cColorBits == 8 )
*((BYTE *) pvDib) = gengc->pajTranslateVector[dwColor];
else
{
GLuint *pTrans = ((GLuint *) gengc->pajTranslateVector) + 1;
dwColor &= cfb->redMax;
switch (gengc->gsurf.pfd.cColorBits)
{
case 16:
*((WORD *) pvDib) = (WORD) pTrans[dwColor];
break;
case 24:
Copy3Bytes(pvDib, &(pTrans[dwColor]));
break;
case 32:
*((DWORD *) pvDib) = (DWORD) pTrans[dwColor];
break;
default:
WARNING1("dibSetPixelCI: bad cColorBits = %ld\n",
gengc->gsurf.pfd.cColorBits);
break;
}
}
}
else
{
BYTE *puj = (BYTE *)((ULONG_PTR)cfb->buf.base +
(y*cfb->buf.outerWidth) + (x >> 1));
dwColor = gengc->pajTranslateVector[dwColor & 0xf] & 0xf;
if( x & 1 )
*puj = (*puj & 0xf0) | (BYTE) dwColor;
else
*puj = (*puj & 0x0f) | (BYTE) (dwColor << 4);
}
}
}
/*
** No dither, no logicOp.
*/
static void FASTCALL Store(__GLcolorBuffer *cfb, const __GLfragment *frag)
{
GLint x, y;
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *genGc = (__GLGENcontext *)gc;
COLORREF Cr;
DWORD index;
DBGLEVEL(32, "Store(CI)\n");
index = (DWORD) (frag->color.r + __glHalf);
Cr = PALETTEINDEX(index);
x = __GL_UNBIAS_X(gc, frag->x);
y = __GL_UNBIAS_Y(gc, frag->y);
if ( !(genGc->fsLocks & LOCKFLAG_FRONT_BUFFER) )
SetPixel( CURRENT_DC, x, y, Cr );
else
dibSetPixelCI(genGc, cfb, x, y, index);
}
/* XXX! The Store_* routines do not handle double buffering. Gilman
has said that they will not be compatible with his 'cursor
tear-down' strategy. Therefore we probably won't use them.
BUT, they are about 30% faster than their Display*Store
counterparts, so we'll keep them around for further study
*/
/*
** Dither, no logicOp.
*/
static void FASTCALL Store_D(__GLcolorBuffer *cfb, const __GLfragment *frag)
{
GLint x, y;
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *genGc = (__GLGENcontext *)gc;
COLORREF Cr;
DWORD index;
DBGLEVEL(32, "Store_D\n");
index = (DWORD) (frag->color.r + __glHalf);
Cr = PALETTEINDEX(index);
x = __GL_UNBIAS_X(gc, frag->x);
y = __GL_UNBIAS_Y(gc, frag->y);
if ( !(genGc->fsLocks & LOCKFLAG_FRONT_BUFFER) )
SetPixel( CURRENT_DC, x, y, Cr );
else
dibSetPixelCI(genGc, cfb, x, y, index);
}
/*
** No dither, logicOp
*/
static void FASTCALL Store_L(__GLcolorBuffer *cfb, const __GLfragment *frag)
{
GLint x, y;
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *genGc = (__GLGENcontext *)gc;
COLORREF Cr;
DWORD index;
DBGLEVEL(32, "Store_L\n");
index = (DWORD) (frag->color.r + __glHalf);
Cr = PALETTEINDEX(index);
x = __GL_UNBIAS_X(gc, frag->x);
y = __GL_UNBIAS_Y(gc, frag->y);
if ( !(genGc->fsLocks & LOCKFLAG_FRONT_BUFFER) )
SetPixel( CURRENT_DC, x, y, Cr );
else
dibSetPixelCI(genGc, cfb, x, y, index);
}
/*
** Dither, logicOp
*/
static void FASTCALL Store_DL(__GLcolorBuffer *cfb, const __GLfragment *frag)
{
GLint x, y;
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *genGc = (__GLGENcontext *)gc;
COLORREF Cr;
DWORD index;
DBGLEVEL(32, "Store_DL\n");
index = (DWORD) (frag->color.r + __glHalf);
Cr = PALETTEINDEX(index);
x = __GL_UNBIAS_X(gc, frag->x);
y = __GL_UNBIAS_Y(gc, frag->y);
if ( !(genGc->fsLocks & LOCKFLAG_FRONT_BUFFER) )
SetPixel( CURRENT_DC, x, y, Cr );
else
dibSetPixelCI(genGc, cfb, x, y, index);
}
GLuint FASTCALL ColorToIndex( __GLGENcontext *genGc, GLuint color )
{
int i, imax;
GLuint *pTrans = (GLuint *) genGc->pajTranslateVector;
color &= genGc->gc.modes.rgbMask;
imax = *pTrans++; // first element of pTrans is # entries
for( i=0; i<imax; i++ ) {
if( color == *pTrans++ )
return i;
}
return 0;
}
GLuint FASTCALL DoLogicOp( GLenum logicOp, GLuint SrcColor, GLuint DstColor )
{
GLuint result;
switch (logicOp) {
case GL_CLEAR: result = 0; break;
case GL_AND: result = SrcColor & DstColor; break;
case GL_AND_REVERSE: result = SrcColor & (~DstColor); break;
case GL_COPY: result = SrcColor; break;
case GL_AND_INVERTED: result = (~SrcColor) & DstColor; break;
case GL_NOOP: result = DstColor; break;
case GL_XOR: result = SrcColor ^ DstColor; break;
case GL_OR: result = SrcColor | DstColor; break;
case GL_NOR: result = ~(SrcColor | DstColor); break;
case GL_EQUIV: result = ~(SrcColor ^ DstColor); break;
case GL_INVERT: result = ~DstColor; break;
case GL_OR_REVERSE: result = SrcColor | (~DstColor); break;
case GL_COPY_INVERTED: result = ~SrcColor; break;
case GL_OR_INVERTED: result = (~SrcColor) | DstColor; break;
case GL_NAND: result = ~(SrcColor & DstColor); break;
case GL_SET: result = (GLuint)~0; break;
}
return result;
}
/************************************************************************/
void FASTCALL DIBIndex4CIStore(__GLcolorBuffer *cfb, const __GLfragment *frag)
{
GLint x, y;
GLubyte *puj;
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
__GLfloat inc;
GLuint enables = gc->state.enables.general;
GLubyte index;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, frag->x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, frag->y) + cfb->buf.yOrigin;
inc = (enables & __GL_DITHER_ENABLE) ?
fDitherIncTable[__GL_DITHER_INDEX(frag->x, frag->y)] : __glHalf;
if ( (cfb->buf.flags & NO_CLIP) ||
(*gengc->pfnPixelVisible)(x, y) ) {
index = (BYTE) (frag->color.r + inc);
puj = (GLubyte *)((ULONG_PTR)cfb->buf.base +
(y*cfb->buf.outerWidth) + (x >> 1));
if( cfb->buf.flags & NEED_FETCH ) {
GLubyte DstIndex;
if (x & 1)
DstIndex = gengc->pajInvTranslateVector[*puj & 0x0f];
else
DstIndex = gengc->pajInvTranslateVector[(*puj & 0xf0) >> 4];
// apply logicop
if (enables & __GL_INDEX_LOGIC_OP_ENABLE) {
index = (GLubyte) DoLogicOp( gc->state.raster.logicOp,
(GLuint) index, (GLuint) DstIndex );
index &= 0xf;
}
// apply indexmask
if( cfb->buf.flags & INDEXMASK_ON ) {
index = (GLubyte)((index & cfb->sourceMask) | (DstIndex & cfb->destMask));
}
}
index = gengc->pajTranslateVector[index & 0xf] & 0xf;
if( x & 1 )
*puj = (*puj & 0xf0) | index;
else
*puj = (*puj & 0x0f) | (index << 4);
}
}
// Put fragment into created DIB and call copybits for one pixel
void FASTCALL DisplayIndex4CIStore(__GLcolorBuffer *cfb, const __GLfragment *frag)
{
GLint x, y;
GLubyte *puj;
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
__GLfloat inc;
GLuint enables = gc->state.enables.general;
GLubyte index;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, frag->x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, frag->y) + cfb->buf.yOrigin;
inc = (enables & __GL_DITHER_ENABLE) ?
fDitherIncTable[__GL_DITHER_INDEX(frag->x, frag->y)] : __glHalf;
index = (BYTE) (frag->color.r + inc);
puj = gengc->ColorsBits;
if( cfb->buf.flags & NEED_FETCH ) {
GLubyte DstIndex;
(*gengc->pfnCopyPixels)(gengc, cfb, x, y, 1, FALSE);
DstIndex = gengc->pajInvTranslateVector[(*puj & 0xf0) >> 4];
// apply logicop
if (enables & __GL_INDEX_LOGIC_OP_ENABLE) {
index = (GLubyte) DoLogicOp( gc->state.raster.logicOp,
(GLuint) index, (GLuint) DstIndex );
index &= 0xf;
}
// apply indexmask
if( cfb->buf.flags & INDEXMASK_ON ) {
index = (GLubyte)((index & cfb->sourceMask) | (DstIndex & cfb->destMask));
}
}
*puj = gengc->pajTranslateVector[index & 0xf] << 4;
(*gengc->pfnCopyPixels)(gengc, cfb, x, y, 1, TRUE);
}
/************************************************************************/
void FASTCALL DIBIndex8CIStore(__GLcolorBuffer *cfb, const __GLfragment *frag)
{
GLint x, y;
GLubyte *puj;
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
__GLfloat inc;
GLuint enables = gc->state.enables.general;
GLubyte index;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, frag->x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, frag->y) + cfb->buf.yOrigin;
inc = (enables & __GL_DITHER_ENABLE) ?
fDitherIncTable[__GL_DITHER_INDEX(frag->x, frag->y)] : __glHalf;
if ( (cfb->buf.flags & NO_CLIP) ||
(*gengc->pfnPixelVisible)(x, y) ) {
index = (BYTE) (frag->color.r + inc);
puj = (GLubyte *)((ULONG_PTR)cfb->buf.base + (y*cfb->buf.outerWidth) + x);
if( cfb->buf.flags & NEED_FETCH ) {
GLubyte DstIndex = gengc->pajInvTranslateVector[*puj];
// apply logicop
if (enables & __GL_INDEX_LOGIC_OP_ENABLE) {
index = (GLubyte) DoLogicOp( gc->state.raster.logicOp,
(GLuint) index, (GLuint) DstIndex );
}
// apply indexmask
if( cfb->buf.flags & INDEXMASK_ON ) {
index = (GLubyte)((DstIndex & cfb->destMask) | (index & cfb->sourceMask));
}
}
*puj = gengc->pajTranslateVector[index];
}
}
/************************************************************************/
void FASTCALL DisplayIndex8CIStore(__GLcolorBuffer *cfb, const __GLfragment *frag)
{
GLint x, y;
GLubyte *puj;
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
__GLfloat inc;
GLuint enables = gc->state.enables.general;
GLubyte index;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, frag->x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, frag->y) + cfb->buf.yOrigin;
inc = (enables & __GL_DITHER_ENABLE) ?
fDitherIncTable[__GL_DITHER_INDEX(frag->x, frag->y)] : __glHalf;
index = (BYTE) (frag->color.r + inc);
puj = gengc->ColorsBits;
if( cfb->buf.flags & NEED_FETCH ) {
GLubyte DstIndex;
(*gengc->pfnCopyPixels)(gengc, cfb, x, y, 1, FALSE);
DstIndex = gengc->pajInvTranslateVector[*puj];
// apply logicop
if (enables & __GL_INDEX_LOGIC_OP_ENABLE) {
index = (GLubyte) DoLogicOp( gc->state.raster.logicOp,
(GLuint) index, (GLuint) DstIndex );
}
// apply indexmask
if( cfb->buf.flags & INDEXMASK_ON ) {
index = (GLubyte)((DstIndex & cfb->destMask) | (index & cfb->sourceMask));
}
}
*puj = gengc->pajTranslateVector[index];
(*gengc->pfnCopyPixels)(gengc, cfb, x, y, 1, TRUE);
}
/************************************************************************/
void FASTCALL DIBRGBCIStore(__GLcolorBuffer *cfb, const __GLfragment *frag)
{
GLint x, y;
GLubyte *puj;
GLuint index;
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
GLuint enables = gc->state.enables.general;
GLuint color, *pTrans;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, frag->x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, frag->y) + cfb->buf.yOrigin;
if ( (cfb->buf.flags & NO_CLIP) ||
(*gengc->pfnPixelVisible)(x, y) ) {
index = (GLuint) (frag->color.r + __glHalf);
puj = (GLubyte *)((ULONG_PTR)cfb->buf.base +
(y*cfb->buf.outerWidth) + (x * 3));
pTrans = ((GLuint *) gengc->pajTranslateVector) + 1;
if( cfb->buf.flags & NEED_FETCH ) {
GLuint DstIndex; // represents both RGB and index
Copy3Bytes( &DstIndex, puj );
DstIndex = ColorToIndex( gengc, DstIndex );
// apply logicop
if (enables & __GL_INDEX_LOGIC_OP_ENABLE) {
index = (GLuint) DoLogicOp( gc->state.raster.logicOp,
(GLuint) index, (GLuint) DstIndex);
}
// apply indexmask
if( cfb->buf.flags & INDEXMASK_ON ) {
index = ((GLuint) DstIndex & cfb->destMask) |
(index & cfb->sourceMask);
}
}
index &= cfb->redMax; // ceiling
color = pTrans[index]; // guaranteed to be in range
Copy3Bytes( puj, &color );
}
}
/************************************************************************/
void FASTCALL DisplayRGBCIStore(__GLcolorBuffer *cfb, const __GLfragment *frag)
{
GLint x, y;
GLubyte *puj;
GLuint index, color, *pTrans;
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
GLuint enables = gc->state.enables.general;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, frag->x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, frag->y) + cfb->buf.yOrigin;
index = (GLuint) (frag->color.r + __glHalf);
puj = gengc->ColorsBits;
pTrans = (GLuint *) gengc->pajTranslateVector;
if( cfb->buf.flags & NEED_FETCH ) {
GLuint DstIndex; // represents both RGB and index
(*gengc->pfnCopyPixels)(gengc, cfb, x, y, 1, FALSE);
Copy3Bytes( &DstIndex, puj );
DstIndex = ColorToIndex( gengc, DstIndex );
// apply logicop
if (enables & __GL_INDEX_LOGIC_OP_ENABLE) {
index = (GLuint) DoLogicOp( gc->state.raster.logicOp,
(GLuint) index, (GLuint) DstIndex );
}
// apply indexmask
if( cfb->buf.flags & INDEXMASK_ON ) {
index = ((GLuint) DstIndex & cfb->destMask) |
(index & cfb->sourceMask);
}
}
// Get RGB values that correspond to index
index &= cfb->redMax; // ceiling
color = pTrans[index+1]; // guaranteed to be in range
Copy3Bytes( puj, &color );
(*gengc->pfnCopyPixels)(gengc, cfb, x, y, 1, TRUE);
}
/************************************************************************/
void FASTCALL DIBBitfield16CIStore(__GLcolorBuffer *cfb, const __GLfragment *frag)
{
GLint x, y;
GLushort index, *pus;
GLuint *pTrans;
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
__GLfloat inc;
GLuint enables = gc->state.enables.general;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, frag->x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, frag->y) + cfb->buf.yOrigin;
inc = (enables & __GL_DITHER_ENABLE) ?
fDitherIncTable[__GL_DITHER_INDEX(frag->x, frag->y)] : __glHalf;
if ( (cfb->buf.flags & NO_CLIP) ||
(*gengc->pfnPixelVisible)(x, y) ) {
index = (GLushort) (frag->color.r + inc);
pus = (GLushort *)((ULONG_PTR)cfb->buf.base +
(y*cfb->buf.outerWidth) + (x << 1));
pTrans = (GLuint *) gengc->pajTranslateVector;
if( cfb->buf.flags & NEED_FETCH ) {
GLushort DstIndex; // represents both RGB and index
DstIndex = *pus;
DstIndex = (GLushort) ColorToIndex( gengc, (GLuint) DstIndex );
// apply logicop
if (enables & __GL_INDEX_LOGIC_OP_ENABLE) {
index = (GLushort) DoLogicOp( gc->state.raster.logicOp,
(GLuint) index, (GLuint) DstIndex);
}
// apply indexmask
if( cfb->buf.flags & INDEXMASK_ON ) {
index = (GLushort)((DstIndex & cfb->destMask) | (index & cfb->sourceMask));
}
}
index &= cfb->redMax;
*pus = (GLushort) pTrans[index+1];
}
}
// Put fragment into created DIB and call copybits for one pixel
void FASTCALL DisplayBitfield16CIStore(__GLcolorBuffer *cfb, const __GLfragment *frag)
{
GLint x, y;
GLushort index, *pus;
GLuint *pTrans;
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
__GLfloat inc;
GLuint enables = gc->state.enables.general;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, frag->x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, frag->y) + cfb->buf.yOrigin;
inc = (enables & __GL_DITHER_ENABLE) ?
fDitherIncTable[__GL_DITHER_INDEX(frag->x, frag->y)] : __glHalf;
index = (GLushort) (frag->color.r + inc);
pus = gengc->ColorsBits;
pTrans = (GLuint *) gengc->pajTranslateVector;
if( cfb->buf.flags & NEED_FETCH ) {
GLushort DstIndex; // represents both RGB and index
(*gengc->pfnCopyPixels)(gengc, cfb, x, y, 1, FALSE);
DstIndex = *pus;
DstIndex = (GLushort) ColorToIndex( gengc, (GLuint) DstIndex );
// apply logicop
if (enables & __GL_INDEX_LOGIC_OP_ENABLE) {
index = (GLushort) DoLogicOp( gc->state.raster.logicOp,
(GLuint) index, (GLuint) DstIndex);
}
// apply indexmask
if( cfb->buf.flags & INDEXMASK_ON ) {
index = (GLushort)((DstIndex & cfb->destMask) | (index & cfb->sourceMask));
}
}
index &= cfb->redMax;
*pus = (GLushort) pTrans[index+1];
(*gengc->pfnCopyPixels)(gengc, cfb, x, y, 1, TRUE);
}
/************************************************************************/
void FASTCALL DIBBitfield32CIStore(__GLcolorBuffer *cfb, const __GLfragment *frag)
{
GLint x, y;
GLuint index, *pul, *pTrans;
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
GLuint enables = gc->state.enables.general;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, frag->x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, frag->y) + cfb->buf.yOrigin;
if ( (cfb->buf.flags & NO_CLIP) ||
(*gengc->pfnPixelVisible)(x, y) ) {
index = (GLuint) (frag->color.r + __glHalf);
pul = (GLuint *)((ULONG_PTR)cfb->buf.base +
(y*cfb->buf.outerWidth) + (x << 2));
pTrans = ((GLuint *) gengc->pajTranslateVector) + 1;
if( cfb->buf.flags & NEED_FETCH ) {
GLuint DstIndex; // represents both RGB and index
DstIndex = ColorToIndex( gengc, *pul );
// apply logicop
if (enables & __GL_INDEX_LOGIC_OP_ENABLE) {
index = (GLuint) DoLogicOp( gc->state.raster.logicOp, index,
DstIndex );
}
// apply indexmask
if( cfb->buf.flags & INDEXMASK_ON ) {
index = (GLuint)((DstIndex & cfb->destMask) | (index & cfb->sourceMask));
}
}
index &= cfb->redMax;
*pul = pTrans[index];
}
}
// Put fragment into created DIB and call copybits for one pixel
void FASTCALL DisplayBitfield32CIStore(__GLcolorBuffer *cfb, const __GLfragment *frag)
{
GLint x, y;
GLuint index, *pul, *pTrans;
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
GLuint enables = gc->state.enables.general;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, frag->x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, frag->y) + cfb->buf.yOrigin;
index = (GLuint) (frag->color.r + __glHalf);
pul = gengc->ColorsBits;
pTrans = ((GLuint *) gengc->pajTranslateVector) + 1;
if( cfb->buf.flags & NEED_FETCH ) {
GLuint DstIndex; // represents both RGB and index
(*gengc->pfnCopyPixels)(gengc, cfb, x, y, 1, FALSE);
DstIndex = ColorToIndex( gengc, *pul );
// apply logicop
if (enables & __GL_INDEX_LOGIC_OP_ENABLE) {
index = (GLuint) DoLogicOp( gc->state.raster.logicOp, index,
DstIndex );
}
// apply indexmask
if( cfb->buf.flags & INDEXMASK_ON ) {
index = (DstIndex & cfb->destMask) | (index & cfb->sourceMask);
}
}
index &= cfb->redMax;
*pul = pTrans[index];
(*gengc->pfnCopyPixels)(gengc, cfb, x, y, 1, TRUE);
}
/************************************************************************/
static GLboolean FASTCALL SlowStoreSpan(__GLcontext *gc)
{
int x, x1;
int i;
__GLfragment frag;
__GLcolor *cp;
__GLcolorBuffer *cfb;
GLint w;
DBGENTRY("CI:StoreSpan\n");
w = gc->polygon.shader.length;
frag.y = gc->polygon.shader.frag.y;
x = gc->polygon.shader.frag.x;
x1 = gc->polygon.shader.frag.x + w;
cp = gc->polygon.shader.colors;
cfb = gc->polygon.shader.cfb;
for (i = x; i < x1; i++) {
frag.x = i;
frag.color.r = cp->r;
cp++;
(*cfb->store)(cfb, &frag);
}
return GL_FALSE;
}
static GLboolean FASTCALL SlowStoreStippledSpan(__GLcontext *gc)
{
int x;
__GLfragment frag;
__GLcolor *cp;
__GLcolorBuffer *cfb;
__GLstippleWord inMask, bit, *sp;
GLint count;
GLint w;
DBGENTRY("CI:StoreStippledSpan\n");
w = gc->polygon.shader.length;
sp = gc->polygon.shader.stipplePat;
frag.y = gc->polygon.shader.frag.y;
x = gc->polygon.shader.frag.x;
cp = gc->polygon.shader.colors;
cfb = gc->polygon.shader.cfb;
while (w) {
count = w;
if (count > __GL_STIPPLE_BITS) {
count = __GL_STIPPLE_BITS;
}
w -= count;
inMask = *sp++;
bit = (GLuint) __GL_STIPPLE_SHIFT(0);
while (--count >= 0) {
if (inMask & bit) {
frag.x = x;
frag.color.r = cp->r;
(*cfb->store)(cfb, &frag);
}
x++;
cp++;
#ifdef __GL_STIPPLE_MSB
bit >>= 1;
#else
bit <<= 1;
#endif
}
}
return GL_FALSE;
}
void
CIFetchNone(__GLcolorBuffer *cfb, GLint x, GLint y, __GLcolor *result)
{
result->r = 0.0F;
}
void
CIReadSpanNone(__GLcolorBuffer *cfb, GLint x, GLint y, __GLcolor *results,
GLint w)
{
GLint i;
__GLcolor *pResults;
for (i = 0, pResults = results; i < w; i++, pResults++)
{
pResults->r = 0.0F;
}
}
void
DIBIndex4CIFetch(__GLcolorBuffer *cfb, GLint x, GLint y, __GLcolor *result)
{
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
GLubyte *puj, pixel;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, y) + cfb->buf.yOrigin;
puj = (GLubyte *)((ULONG_PTR)cfb->buf.base +
(y*cfb->buf.outerWidth) + (x >> 1));
pixel = *puj;
if (!(x & 1))
pixel >>= 4;
result->r = (__GLfloat) gengc->pajInvTranslateVector[pixel & 0xf];
}
void
DIBIndex8CIFetch(__GLcolorBuffer *cfb, GLint x, GLint y, __GLcolor *result)
{
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
GLubyte *puj;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, y) + cfb->buf.yOrigin;
puj = (GLubyte *)((ULONG_PTR)cfb->buf.base + (y*cfb->buf.outerWidth) + x);
result->r = (__GLfloat) gengc->pajInvTranslateVector[*puj];
}
void
DIBRGBCIFetch(__GLcolorBuffer *cfb, GLint x, GLint y, __GLcolor *result)
{
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
GLubyte *puj;
GLuint iColor;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, y) + cfb->buf.yOrigin;
puj = (GLubyte *)((ULONG_PTR)cfb->buf.base +
(y*cfb->buf.outerWidth) + (x * 3));
Copy3Bytes( &iColor, puj );
result->r = (float) ColorToIndex( gengc, iColor );
}
void
DIBBitfield16CIFetch(__GLcolorBuffer *cfb, GLint x, GLint y, __GLcolor *result)
{
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
GLushort *pus;
GLuint iColor;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, y) + cfb->buf.yOrigin;
pus = (GLushort *)((ULONG_PTR)cfb->buf.base +
(y*cfb->buf.outerWidth) + (x << 1));
iColor = (GLuint) *pus;
result->r = (float) ColorToIndex( gengc, iColor );
}
void
DIBBitfield32CIFetch(__GLcolorBuffer *cfb, GLint x, GLint y, __GLcolor *result)
{
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
GLuint *pul;
GLuint iColor;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, y) + cfb->buf.yOrigin;
pul = (GLuint *)((ULONG_PTR)cfb->buf.base +
(y*cfb->buf.outerWidth) + (x << 2));
iColor = *pul; // need to clamp to <= 24 bits ?
result->r = (float) ColorToIndex( gengc, iColor );
}
void
DisplayIndex4CIFetch(__GLcolorBuffer *cfb, GLint x, GLint y, __GLcolor *result)
{
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
GLubyte *puj, pixel;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, y) + cfb->buf.yOrigin;
(*gengc->pfnCopyPixels)(gengc, cfb, x, y, 1, FALSE);
puj = gengc->ColorsBits;
pixel = *puj >> 4;
result->r = (__GLfloat) gengc->pajInvTranslateVector[pixel];
}
void
DisplayIndex8CIFetch(__GLcolorBuffer *cfb, GLint x, GLint y, __GLcolor *result)
{
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
GLubyte *puj;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, y) + cfb->buf.yOrigin;
(*gengc->pfnCopyPixels)(gengc, cfb, x, y, 1, FALSE);
puj = gengc->ColorsBits;
result->r = (__GLfloat) gengc->pajInvTranslateVector[*puj];
}
void
DisplayRGBCIFetch(__GLcolorBuffer *cfb, GLint x, GLint y, __GLcolor *result)
{
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
GLubyte *puj;
GLuint iColor;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, y) + cfb->buf.yOrigin;
(*gengc->pfnCopyPixels)(gengc, cfb, x, y, 1, FALSE);
puj = gengc->ColorsBits;
Copy3Bytes( &iColor, puj );
result->r = (float) ColorToIndex( gengc, iColor );
}
void
DisplayBitfield16CIFetch(__GLcolorBuffer *cfb, GLint x, GLint y,
__GLcolor *result)
{
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
GLushort *pus;
GLuint iColor;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, y) + cfb->buf.yOrigin;
(*gengc->pfnCopyPixels)(gengc, cfb, x, y, 1, FALSE);
pus = gengc->ColorsBits;
iColor = (GLuint) *pus;
result->r = (float) ColorToIndex( gengc, iColor );
}
void
DisplayBitfield32CIFetch(__GLcolorBuffer *cfb, GLint x, GLint y,
__GLcolor *result)
{
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
GLuint *pul;
GLuint iColor;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, y) + cfb->buf.yOrigin;
(*gengc->pfnCopyPixels)(gengc, cfb, x, y, 1, FALSE);
pul = gengc->ColorsBits;
iColor = *pul; // need to clamp to <= 24 bits ?
result->r = (float) ColorToIndex( gengc, iColor );
}
void
Index4CIReadSpan(__GLcolorBuffer *cfb, GLint x, GLint y, __GLcolor *results,
GLint w, GLboolean bDIB)
{
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
GLubyte *puj, pixel;
__GLcolor *pResults;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, y) + cfb->buf.yOrigin;
if (bDIB)
{
puj = (GLubyte *)((ULONG_PTR)cfb->buf.base + (y*cfb->buf.outerWidth) +
(x >> 1));
}
else
{
(*gengc->pfnCopyPixels)(gengc, cfb, x, y, w, FALSE);
puj = gengc->ColorsBits;
x = 0;
}
pResults = results;
if (x & 1)
{
pixel = *puj++;
pResults->r = (__GLfloat) gengc->pajInvTranslateVector[pixel & 0xf];
pResults++;
w--;
}
while (w > 1)
{
pixel = *puj >> 4;
pResults->r = (__GLfloat) gengc->pajInvTranslateVector[pixel];
pResults++;
pixel = *puj++;
pResults->r = (__GLfloat) gengc->pajInvTranslateVector[pixel & 0xf];
pResults++;
w -= 2;
}
if (w > 0)
{
pixel = *puj >> 4;
pResults->r = (__GLfloat) gengc->pajInvTranslateVector[pixel];
}
}
void
DIBIndex4CIReadSpan(__GLcolorBuffer *cfb, GLint x, GLint y, __GLcolor *results,
GLint w)
{
Index4CIReadSpan(cfb, x, y, results, w, TRUE);
}
void
DisplayIndex4CIReadSpan(__GLcolorBuffer *cfb, GLint x, GLint y,
__GLcolor *results, GLint w)
{
Index4CIReadSpan(cfb, x, y, results, w, FALSE);
}
void
Index8CIReadSpan(__GLcolorBuffer *cfb, GLint x, GLint y, __GLcolor *results,
GLint w, GLboolean bDIB)
{
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
GLubyte *puj;
GLint i;
__GLcolor *pResults;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, y) + cfb->buf.yOrigin;
if (bDIB)
{
puj = (GLubyte *)((ULONG_PTR)cfb->buf.base + (y*cfb->buf.outerWidth) + x);
}
else
{
(*gengc->pfnCopyPixels)(gengc, cfb, x, y, w, FALSE);
puj = gengc->ColorsBits;
}
for (i = 0, pResults = results; i < w; i++, pResults++)
{
pResults->r = (__GLfloat) gengc->pajInvTranslateVector[*puj++];
}
}
void
DIBIndex8CIReadSpan(__GLcolorBuffer *cfb, GLint x, GLint y, __GLcolor *results,
GLint w)
{
Index8CIReadSpan(cfb, x, y, results, w, TRUE);
}
void
DisplayIndex8CIReadSpan(__GLcolorBuffer *cfb, GLint x, GLint y,
__GLcolor *results, GLint w)
{
Index8CIReadSpan(cfb, x, y, results, w, FALSE);
}
void
RGBCIReadSpan(__GLcolorBuffer *cfb, GLint x, GLint y, __GLcolor *results,
GLint w, GLboolean bDIB)
{
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
GLubyte *puj;
GLint i;
__GLcolor *pResults;
GLuint iColor;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, y) + cfb->buf.yOrigin;
if (bDIB)
{
puj = (GLubyte *)((ULONG_PTR)cfb->buf.base +
(y*cfb->buf.outerWidth) + (x * 3));
}
else
{
(*gengc->pfnCopyPixels)(gengc, cfb, x, y, w, FALSE);
puj = gengc->ColorsBits;
}
for (i = 0, pResults = results; i < w; i++, pResults++, puj += 3)
{
Copy3Bytes( &iColor, puj );
pResults->r = (float) ColorToIndex( gengc, iColor );
}
}
void
DIBRGBCIReadSpan(__GLcolorBuffer *cfb, GLint x, GLint y, __GLcolor *results,
GLint w)
{
RGBCIReadSpan(cfb, x, y, results, w, TRUE);
}
void
DisplayRGBCIReadSpan(__GLcolorBuffer *cfb, GLint x, GLint y, __GLcolor *results,
GLint w)
{
RGBCIReadSpan(cfb, x, y, results, w, FALSE);
}
void
Bitfield16CIReadSpan(__GLcolorBuffer *cfb, GLint x, GLint y,
__GLcolor *results, GLint w, GLboolean bDIB)
{
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
GLushort *pus;
GLint i;
__GLcolor *pResults;
GLuint iColor;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, y) + cfb->buf.yOrigin;
if (bDIB)
{
pus = (GLushort *)((ULONG_PTR)cfb->buf.base +
(y*cfb->buf.outerWidth) + (x << 1));
}
else
{
(*gengc->pfnCopyPixels)(gengc, cfb, x, y, w, FALSE);
pus = gengc->ColorsBits;
}
for (i = 0, pResults = results; i < w; i++, pResults++)
{
iColor = *pus++;
pResults->r = (__GLfloat) ColorToIndex( gengc, iColor );
}
}
void
DIBBitfield16CIReadSpan(__GLcolorBuffer *cfb, GLint x, GLint y,
__GLcolor *results, GLint w)
{
Bitfield16CIReadSpan(cfb, x, y, results, w, TRUE);
}
void
DisplayBitfield16CIReadSpan(__GLcolorBuffer *cfb, GLint x, GLint y,
__GLcolor *results, GLint w)
{
Bitfield16CIReadSpan(cfb, x, y, results, w, FALSE);
}
void
Bitfield32CIReadSpan(__GLcolorBuffer *cfb, GLint x, GLint y,
__GLcolor *results, GLint w, GLboolean bDIB)
{
__GLcontext *gc = cfb->buf.gc;
__GLGENcontext *gengc;
GLuint *pul;
GLint i;
__GLcolor *pResults;
GLuint iColor;
gengc = (__GLGENcontext *)gc;
x = __GL_UNBIAS_X(gc, x) + cfb->buf.xOrigin;
y = __GL_UNBIAS_Y(gc, y) + cfb->buf.yOrigin;
if (bDIB)
{
pul = (GLuint *)((ULONG_PTR)cfb->buf.base +
(y*cfb->buf.outerWidth) + (x << 2));
}
else
{
(*gengc->pfnCopyPixels)(gengc, cfb, x, y, w, FALSE);
pul = gengc->ColorsBits;
}
for (i = 0, pResults = results; i < w; i++, pResults++)
{
iColor = *pul++;
pResults->r = (__GLfloat) ColorToIndex( gengc, iColor );
}
}
void
DIBBitfield32CIReadSpan(__GLcolorBuffer *cfb, GLint x, GLint y,
__GLcolor *results, GLint w)
{
Bitfield32CIReadSpan(cfb, x, y, results, w, TRUE);
}
void
DisplayBitfield32CIReadSpan(__GLcolorBuffer *cfb, GLint x, GLint y,
__GLcolor *results, GLint w)
{
Bitfield32CIReadSpan(cfb, x, y, results, w, FALSE);
}
/************************************************************************/
static void Resize(__GLGENbuffers *buffers, __GLcolorBuffer *cfb,
GLint w, GLint h)
{
DBGENTRY("CI:Resize\n");
#ifdef __GL_LINT
dp = dp;
#endif
cfb->buf.width = w;
cfb->buf.height = h;
}
/************************************************************************/
static void (FASTCALL *StoreProcs[4])(__GLcolorBuffer*, const __GLfragment*) = {
Store,
Store_D,
Store_L,
Store_DL,
};
void FASTCALL PickCI(__GLcontext *gc, __GLcolorBuffer *cfb)
{
GLuint enables = gc->state.enables.general;
GLint ix = 0;
__GLGENcontext *gengc;
PIXELFORMATDESCRIPTOR *pfmt;
GLboolean needFetch = GL_FALSE;
DBGENTRY("PickCI\n");
/* predetermine if fetch required for Store procs: we'll assume
always need to if logicOp or indexMask (i.e: assume if needFetch
not set, then no logicOp or indexMask used)
*/
if( gc->state.raster.writeMask == cfb->redMax ) {
cfb->buf.flags = cfb->buf.flags & ~INDEXMASK_ON;
cfb->sourceMask = cfb->redMax; // mf: these 2 may not be needed
cfb->destMask = ~cfb->sourceMask;
} else {
cfb->sourceMask = gc->state.raster.writeMask & cfb->redMax;
cfb->destMask = ~cfb->sourceMask & cfb->redMax;
cfb->buf.flags = cfb->buf.flags | INDEXMASK_ON;
needFetch = GL_TRUE;
}
if (enables & __GL_DITHER_ENABLE) {
ix |= 1;
}
if (enables & __GL_INDEX_LOGIC_OP_ENABLE) {
ix |= 2;
needFetch = GL_TRUE; // don't need to fetch for some logicOps, but
// we'll deal with that later
}
if( needFetch )
cfb->buf.flags = cfb->buf.flags | NEED_FETCH;
else
cfb->buf.flags = cfb->buf.flags & ~NEED_FETCH;
cfb->store = StoreProcs[ix];
// Figure out store and fetch routines
if (gc->state.raster.drawBuffer == GL_NONE)
{
cfb->store = Store_NOT;
cfb->fetch = CIFetchNone;
cfb->readColor = CIFetchNone;
cfb->readSpan = CIReadSpanNone;
cfb->storeSpan = StoreSpanNone;
cfb->storeStippledSpan = StoreSpanNone;
}
else
{
gengc = (__GLGENcontext *)gc;
pfmt = &gengc->gsurf.pfd;
if (cfb->buf.flags & DIB_FORMAT)
{
switch(pfmt->cColorBits) {
case 4:
cfb->fetch = DIBIndex4CIFetch;
cfb->readColor = DIBIndex4CIFetch;
cfb->readSpan = DIBIndex4CIReadSpan;
cfb->store = DIBIndex4CIStore;
cfb->clear = Index4Clear;
break;
case 8:
cfb->fetch = DIBIndex8CIFetch;
cfb->readColor = DIBIndex8CIFetch;
cfb->readSpan = DIBIndex8CIReadSpan;
cfb->store = DIBIndex8CIStore;
cfb->clear = Index8Clear;
break;
case 16:
cfb->fetch = DIBBitfield16CIFetch;
cfb->readColor = DIBBitfield16CIFetch;
cfb->readSpan = DIBBitfield16CIReadSpan;
cfb->store = DIBBitfield16CIStore;
cfb->clear = Bitfield16Clear;
break;
case 24:
cfb->readSpan = DIBRGBCIReadSpan;
cfb->readColor = DIBRGBCIFetch;
cfb->fetch = DIBRGBCIFetch;
cfb->store = DIBRGBCIStore;
cfb->clear = RGBClear;
break;
case 32:
cfb->fetch = DIBBitfield32CIFetch;
cfb->readColor = DIBBitfield32CIFetch;
cfb->readSpan = DIBBitfield32CIReadSpan;
cfb->store = DIBBitfield32CIStore;
cfb->clear = Bitfield32Clear;
break;
}
}
else
{
switch(pfmt->cColorBits) {
case 4:
cfb->fetch = DisplayIndex4CIFetch;
cfb->readColor = DisplayIndex4CIFetch;
cfb->readSpan = DisplayIndex4CIReadSpan;
cfb->store = DisplayIndex4CIStore;
cfb->clear = Index4Clear;
break;
case 8:
cfb->fetch = DisplayIndex8CIFetch;
cfb->readColor = DisplayIndex8CIFetch;
cfb->readSpan = DisplayIndex8CIReadSpan;
cfb->store = DisplayIndex8CIStore;
cfb->clear = Index8Clear;
break;
case 16:
cfb->fetch = DisplayBitfield16CIFetch;
cfb->readColor = DisplayBitfield16CIFetch;
cfb->readSpan = DisplayBitfield16CIReadSpan;
cfb->store = DisplayBitfield16CIStore;
cfb->clear = Bitfield16Clear;
break;
case 24:
cfb->readSpan = DisplayRGBCIReadSpan;
cfb->fetch = DisplayRGBCIFetch;
cfb->readColor = DisplayRGBCIFetch;
cfb->store = DisplayRGBCIStore;
cfb->clear = RGBClear;
break;
case 32:
cfb->fetch = DisplayBitfield32CIFetch;
cfb->readColor = DisplayBitfield32CIFetch;
cfb->readSpan = DisplayBitfield32CIReadSpan;
cfb->store = DisplayBitfield32CIStore;
cfb->clear = Bitfield32Clear;
break;
}
}
}
}
void FASTCALL __glGenInitCI(__GLcontext *gc, __GLcolorBuffer *cfb, GLenum type)
{
__GLGENcontext *gengc = (__GLGENcontext *)gc;
PIXELFORMATDESCRIPTOR *pfmt;
DBGENTRY("__glGenInitCI\n");
__glInitGenericCB(gc, cfb);
cfb->pick = PickCI;
gc->redVertexScale = cfb->redScale = (__GLfloat)1.0;
gc->greenVertexScale = cfb->greenScale = (__GLfloat)1.0;
gc->blueVertexScale = cfb->blueScale = (__GLfloat)1.0;
gc->alphaVertexScale = cfb->alphaScale = (__GLfloat)1.0;
cfb->buf.elementSize = sizeof(GLubyte);
cfb->resize = Resize;
cfb->fetchSpan = __glFetchSpan;
cfb->fetchStippledSpan = __glFetchSpan;
cfb->storeSpan = SlowStoreSpan;
cfb->storeStippledSpan = SlowStoreStippledSpan;
pfmt = &gengc->gsurf.pfd;
/* XXX! redMax is used for index lighting in soft, and for setting
raster.writeMask
*/
cfb->redMax = (1 << gc->modes.indexBits) - 1;
cfb->redShift = pfmt->cRedShift;
cfb->greenShift = pfmt->cGreenShift;
cfb->blueShift = pfmt->cBlueShift;
cfb->allShifts =
(cfb->redShift << 0) |
(cfb->greenShift << 8) |
(cfb->blueShift << 16) |
(cfb->alphaShift << 24);
glGenInitCommon(gengc, cfb, type);
}
void FASTCALL __glGenFreeCI(__GLcontext *gc, __GLcolorBuffer *cfb)
{
DBGENTRY("__glGenFreeCI\n");
#ifdef __GL_LINT
gc = gc;
cfb = cfb;
#endif
}