windows-nt/Source/XPSP1/NT/multimedia/media/avi/drawdib.16/dith775.c
2020-09-26 16:20:57 +08:00

899 lines
25 KiB
C

//////////////////////////////////////////////////////////////////////////////
//
// DITH775.C - full color dither (to a palette with 7 red, 7 green 5 blue
// levels)
//
// NOTE this file contains the 'C' code and DITH775A.ASM has the ASM code.
//
// This file does the following dithering
//
// 24bpp -> 8bpp
// 16bpp -> 8bpp
//
// 8bpp -> 4bpp N/I
// 16bpp -> 4bpp N/I
// 24bpp -> 4bpp N/I
//
// Using four different methods
//
// Lookup - fastest 1 table lookup per 16bpp pel (160K for table)
// Scale - fast 2 table lookups per 16bpp pel (128K for tables)
// Table - fast 3 table lookups plus shifting (~1K for tables)
//
// Lookup and Scale are 386 asm code *only* (in dith775a.asm)
// Table is in 'C' and 386 asm.
//
//////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <windowsx.h>
#include "drawdibi.h"
#include "dither.h"
#include "dith775.h"
//#define OLDDITHER
#ifdef WIN32
#define DITHER_DEFAULT DITHER_TABLEC
#else
#define DITHER_DEFAULT DITHER_SCALE
#endif
#define DITHER_TABLEC 0 // table based 'C' code
#define DITHER_TABLE 1 // table based assembler
#define DITHER_SCALE 2 // scale tables
#define DITHER_LOOKUP 3 // 5 lookup tables!
UINT wDitherMethod = (UINT)-1;
LPVOID Dither16InitScale(void);
LPVOID Dither16InitLookup(void);
int giDitherTableUsage = 0;
LPVOID glpDitherTable;
static void Get775Colors(LPBITMAPINFOHEADER lpbi);
//////////////////////////////////////////////////////////////////////////////
//
//
//////////////////////////////////////////////////////////////////////////////
void FAR PASCAL Dither24C(LPBITMAPINFOHEADER,LPVOID,int,int,int,int,LPBITMAPINFOHEADER,LPVOID,int,int,LPVOID);
void FAR PASCAL Dither24S(LPBITMAPINFOHEADER,LPVOID,int,int,int,int,LPBITMAPINFOHEADER,LPVOID,int,int,LPVOID);
void FAR PASCAL Dither32C(LPBITMAPINFOHEADER,LPVOID,int,int,int,int,LPBITMAPINFOHEADER,LPVOID,int,int,LPVOID);
void FAR PASCAL Dither32S(LPBITMAPINFOHEADER,LPVOID,int,int,int,int,LPBITMAPINFOHEADER,LPVOID,int,int,LPVOID);
void FAR PASCAL Dither16C(LPBITMAPINFOHEADER,LPVOID,int,int,int,int,LPBITMAPINFOHEADER,LPVOID,int,int,LPVOID);
void FAR PASCAL Dither16T(LPBITMAPINFOHEADER,LPVOID,int,int,int,int,LPBITMAPINFOHEADER,LPVOID,int,int,LPVOID);
void FAR PASCAL Dither16L(LPBITMAPINFOHEADER,LPVOID,int,int,int,int,LPBITMAPINFOHEADER,LPVOID,int,int,LPVOID);
void FAR PASCAL Dither16S(LPBITMAPINFOHEADER,LPVOID,int,int,int,int,LPBITMAPINFOHEADER,LPVOID,int,int,LPVOID);
//////////////////////////////////////////////////////////////////////////////
//
// DitherTableInit()
//
//////////////////////////////////////////////////////////////////////////////
static LPVOID DitherTableInit()
{
// no need to re-init table.
if (glpDitherTable || wDitherMethod != (UINT)-1)
{
giDitherTableUsage++;
return glpDitherTable;
}
//
// choose a dither method
//
if (wDitherMethod == -1)
{
wDitherMethod = DITHER_DEFAULT;
}
#ifdef DEBUG
wDitherMethod = (int)GetProfileInt(TEXT("DrawDib"), TEXT("DitherMethod"), (UINT)wDitherMethod);
#endif
switch (wDitherMethod)
{
default:
case DITHER_TABLEC:
case DITHER_TABLE:
break;
#ifndef WIN32
case DITHER_SCALE:
glpDitherTable = Dither16InitScale();
if (glpDitherTable == NULL)
wDitherMethod = DITHER_TABLE;
break;
case DITHER_LOOKUP:
glpDitherTable = Dither16InitLookup();
if (glpDitherTable == NULL)
wDitherMethod = DITHER_TABLE;
break;
#endif // WIN32
}
giDitherTableUsage = 1;
return glpDitherTable;
}
//////////////////////////////////////////////////////////////////////////////
//
// DitherTableFree()
//
//////////////////////////////////////////////////////////////////////////////
void FAR PASCAL DitherTableFree()
{
if (giDitherTableUsage == 0 || --giDitherTableUsage > 0)
return;
if (glpDitherTable)
{
GlobalFreePtr(glpDitherTable);
glpDitherTable = NULL;
wDitherMethod = (UINT)-1;
}
}
//////////////////////////////////////////////////////////////////////////////
//
// DitherInit()
//
//////////////////////////////////////////////////////////////////////////////
LPVOID FAR PASCAL Dither8Init(LPBITMAPINFOHEADER lpbi, LPBITMAPINFOHEADER lpbiOut, DITHERPROC FAR *lpDitherProc, LPVOID lpDitherTable)
{
return DitherDeviceInit(lpbi, lpbiOut, lpDitherProc, lpDitherTable);
}
//////////////////////////////////////////////////////////////////////////////
//
// DitherInit()
//
//////////////////////////////////////////////////////////////////////////////
LPVOID FAR PASCAL Dither16Init(LPBITMAPINFOHEADER lpbi, LPBITMAPINFOHEADER lpbiOut, DITHERPROC FAR *lpDitherProc, LPVOID lpDitherTable)
{
Get775Colors(lpbiOut);
//
// choose a dither method
//
if (lpDitherTable == NULL)
lpDitherTable = DitherTableInit();
switch (wDitherMethod)
{
default:
case DITHER_TABLEC:
*lpDitherProc = Dither16C;
break;
#ifndef WIN32
case DITHER_TABLE:
*lpDitherProc = Dither16T;
break;
case DITHER_SCALE:
*lpDitherProc = Dither16S;
break;
case DITHER_LOOKUP:
*lpDitherProc = Dither16L;
break;
#endif // WIN32
}
return lpDitherTable;
}
//////////////////////////////////////////////////////////////////////////////
//
// DitherTerm()
//
//////////////////////////////////////////////////////////////////////////////
void FAR PASCAL Dither16Term(LPVOID lpDitherTable)
{
DitherTableFree();
}
//////////////////////////////////////////////////////////////////////////////
//
// Dither24Init()
//
//////////////////////////////////////////////////////////////////////////////
LPVOID FAR PASCAL Dither24Init(LPBITMAPINFOHEADER lpbi, LPBITMAPINFOHEADER lpbiOut, DITHERPROC FAR *lpDitherProc, LPVOID lpDitherTable)
{
Get775Colors(lpbiOut);
//
// choose a dither method
//
if (lpDitherTable == NULL)
lpDitherTable = DitherTableInit();
switch (wDitherMethod)
{
default:
case DITHER_TABLE:
case DITHER_TABLEC:
*lpDitherProc = Dither24C;
break;
#ifndef WIN32
case DITHER_SCALE:
*lpDitherProc = Dither24S;
break;
#endif // WIN32
}
return lpDitherTable;
}
//////////////////////////////////////////////////////////////////////////////
//
// Dither24Term()
//
//////////////////////////////////////////////////////////////////////////////
void FAR PASCAL Dither24Term(LPVOID lpDitherTable)
{
DitherTableFree();
}
//////////////////////////////////////////////////////////////////////////////
//
// Dither32Init()
//
//////////////////////////////////////////////////////////////////////////////
LPVOID FAR PASCAL Dither32Init(LPBITMAPINFOHEADER lpbi, LPBITMAPINFOHEADER lpbiOut, DITHERPROC FAR *lpDitherProc, LPVOID lpDitherTable)
{
// no need to re-init table.
Get775Colors(lpbiOut);
//
// choose a dither method
//
if (lpDitherTable == NULL)
lpDitherTable = DitherTableInit();
switch (wDitherMethod)
{
default:
case DITHER_TABLE:
case DITHER_TABLEC:
*lpDitherProc = Dither32C;
break;
#ifndef WIN32
case DITHER_SCALE:
*lpDitherProc = Dither32S;
break;
#endif // WIN32
}
return lpDitherTable;
}
//////////////////////////////////////////////////////////////////////////////
//
// Dither32Term()
//
//////////////////////////////////////////////////////////////////////////////
void FAR PASCAL Dither32Term(LPVOID lpDitherTable)
{
DitherTableFree();
}
//////////////////////////////////////////////////////////////////////////////
//
// Dither16InitScale()
//
//////////////////////////////////////////////////////////////////////////////
LPVOID Dither16InitScale()
{
LPVOID p;
LPBYTE pbLookup;
LPWORD pwScale;
UINT r,g,b;
p = GlobalAllocPtr(GMEM_MOVEABLE|GMEM_SHARE, 32768l*2+64000);
if (p == NULL)
return NULL;
pwScale = (LPWORD)p;
for (r=0; r<32; r++)
for (g=0; g<32; g++)
for (b=0; b<32; b++)
*pwScale++ = 1600 * r + 40 * g + b;
/* should this be WORD or UINT ? */
pbLookup = (LPBYTE)(((WORD _huge *)p) + 32768l);
for (r=0; r<40; r++)
for (g=0; g<40; g++)
for (b=0; b<40; b++)
*pbLookup++ = lookup775[35*rlevel[r] + 5*glevel[g] + blevel[b]];
return p;
}
//////////////////////////////////////////////////////////////////////////////
//
// Dither16InitLookup()
//
//////////////////////////////////////////////////////////////////////////////
LPVOID Dither16InitLookup()
{
LPVOID p;
BYTE _huge *pb;
UINT r,g,b,i,j;
p = GlobalAllocPtr(GHND|GMEM_SHARE, 32768l*5);
if (p == NULL)
return NULL;
pb = (BYTE _huge *)p;
for (i=0; i<5; i++) {
j = ((i < 3) ? i*2 : i*2-1);
for (r=0; r<32; r++) {
for (g=0; g<32; g++) {
for (b=0; b<32; b++) {
*pb++ = lookup775[rlevel[r+i]*35 + glevel[g+i]*5 + blevel[b+j]];
}
}
}
}
return p;
}
//////////////////////////////////////////////////////////////////////////////
//
// GetDithColors() get the dither palette
//
//////////////////////////////////////////////////////////////////////////////
static void Get775Colors(LPBITMAPINFOHEADER lpbi)
{
LPRGBQUAD prgb = (LPRGBQUAD)(((LPBYTE)lpbi) + (UINT)lpbi->biSize);
int i;
for (i=0; i<256; i++)
{
prgb[i].rgbRed = dpal775[i][0];
prgb[i].rgbGreen = dpal775[i][1];
prgb[i].rgbBlue = dpal775[i][2];
prgb[i].rgbReserved = 0;
}
lpbi->biClrUsed = 256;
}
#if 0
//////////////////////////////////////////////////////////////////////////////
//
// CreateDith775Palette() create the dither palette
//
//////////////////////////////////////////////////////////////////////////////
HPALETTE FAR CreateDith775Palette()
{
int i;
HDC hdc;
HPALETTE hpal;
struct {
WORD palVersion;
WORD palNumEntries;
PALETTEENTRY palPalEntry[256];
} pal;
pal.palVersion = 0x300;
pal.palNumEntries = 256;
for (i=0; i<(int)pal.palNumEntries; i++)
{
pal.palPalEntry[i].peRed = dpal775[i][0];
pal.palPalEntry[i].peGreen = dpal775[i][1];
pal.palPalEntry[i].peBlue = dpal775[i][2];
pal.palPalEntry[i].peFlags = PC_NOCOLLAPSE;
}
#ifndef OLDDITHER
//
// our palette is built assuming the "cosmic" colors at the
// beging and the end. so put the real mcoy there!
//
hdc = GetDC(NULL);
if (GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE)
{
GetSystemPaletteEntries(hdc, 0, 10, &pal.palPalEntry[0]);
GetSystemPaletteEntries(hdc, 246, 10, &pal.palPalEntry[246]);
}
ReleaseDC(NULL, hdc);
#endif
hpal = CreatePalette((LPLOGPALETTE)&pal);
return hpal;
}
#endif
//////////////////////////////////////////////////////////////////////////////
//
// Dither24TC - dither from 24 to 8 using the Table method in 'C' Code
//
//////////////////////////////////////////////////////////////////////////////
void FAR PASCAL Dither24C(
LPBITMAPINFOHEADER biDst, // --> BITMAPINFO of the dest
LPVOID lpDst, // --> to destination bits
int DstX, // Destination origin - x coordinate
int DstY, // Destination origin - y coordinate
int DstXE, // x extent of the BLT
int DstYE, // y extent of the BLT
LPBITMAPINFOHEADER biSrc, // --> BITMAPINFO of the source
LPVOID lpSrc, // --> to source bits
int SrcX, // Source origin - x coordinate
int SrcY, // Source origin - y coordinate
LPVOID lpDitherTable) // dither table.
{
int x,y;
int r,g,b;
UINT wWidthSrc;
UINT wWidthDst;
BYTE _huge *pbS;
BYTE _huge *pbD;
if (biDst->biBitCount != 8 || biSrc->biBitCount != 24)
return;
DstXE &= ~3;
wWidthSrc = ((UINT)biSrc->biWidth*3+3)&~3;
wWidthDst = ((UINT)biDst->biWidth+3)&~3;
pbD = (BYTE _huge *)lpDst + DstX + (DWORD)(UINT)DstY * (DWORD)wWidthDst;
pbS = (BYTE _huge *)lpSrc + SrcX*3 + (DWORD)(UINT)SrcY * (DWORD)wWidthSrc;
wWidthSrc -= DstXE*3;
wWidthDst -= DstXE;
#define GET24() \
b = (int)*pbS++; \
g = (int)*pbS++; \
r = (int)*pbS++;
#define DITHER24(mr, mg, mb) \
GET24(); *pbD++ = (BYTE)lookup775[ rdith775[r + mr] + gdith775[g + mg] + ((b + mb) >> 6) ];
for (y=0; y<DstYE; y++) {
switch (y & 3) {
case 0:
for (x=0; x<DstXE; x+=4)
{
DITHER24( 1, 1, 2);
DITHER24( 17, 17, 26);
DITHER24( 25, 25, 38);
DITHER24( 41, 41, 62);
}
break;
case 1:
for (x=0; x<DstXE; x+=4)
{
DITHER24( 31, 31, 46);
DITHER24( 36, 36, 54);
DITHER24( 7, 7, 10);
DITHER24( 12, 12, 18);
}
break;
case 2:
for (x=0; x<DstXE; x+=4)
{
DITHER24( 20, 20, 30);
DITHER24( 4, 4, 6);
DITHER24( 39, 39, 58);
DITHER24( 23, 23, 34);
}
break;
case 3:
for (x=0; x<DstXE; x+=4)
{
DITHER24( 33, 33, 50);
DITHER24( 28, 28, 42);
DITHER24( 15, 15, 22);
DITHER24( 9, 9, 14);
}
break;
} /*switch*/
pbS += wWidthSrc;
pbD += wWidthDst;
}
}
//////////////////////////////////////////////////////////////////////////////
//
// Dither32C - dither from 32 to 8 using the Table method in 'C' Code
//
//////////////////////////////////////////////////////////////////////////////
void FAR PASCAL Dither32C(
LPBITMAPINFOHEADER biDst, // --> BITMAPINFO of the dest
LPVOID lpDst, // --> to destination bits
int DstX, // Destination origin - x coordinate
int DstY, // Destination origin - y coordinate
int DstXE, // x extent of the BLT
int DstYE, // y extent of the BLT
LPBITMAPINFOHEADER biSrc, // --> BITMAPINFO of the source
LPVOID lpSrc, // --> to source bits
int SrcX, // Source origin - x coordinate
int SrcY, // Source origin - y coordinate
LPVOID lpDitherTable) // dither table.
{
int x,y;
int r,g,b;
UINT wWidthSrc;
UINT wWidthDst;
BYTE _huge *pbS;
BYTE _huge *pbD;
if (biDst->biBitCount != 8 || biSrc->biBitCount != 32)
return;
DstXE &= ~3;
wWidthSrc = ((UINT)biSrc->biWidth*4+3)&~3;
wWidthDst = ((UINT)biDst->biWidth+3)&~3;
pbD = (BYTE _huge *)lpDst + DstX + (DWORD)(UINT)DstY * (DWORD)wWidthDst;
pbS = (BYTE _huge *)lpSrc + SrcX*4 + (DWORD)(UINT)SrcY * (DWORD)wWidthSrc;
wWidthSrc -= DstXE*4;
wWidthDst -= DstXE;
#define GET32() \
b = (int)*pbS++; \
g = (int)*pbS++; \
r = (int)*pbS++; \
pbS++;
#define DITHER32(mr, mg, mb) \
GET32(); *pbD++ = (BYTE)lookup775[ rdith775[r + mr] + gdith775[g + mg] + ((b + mb) >> 6) ];
for (y=0; y<DstYE; y++) {
switch (y & 3) {
case 0:
for (x=0; x<DstXE; x+=4)
{
DITHER32( 1, 1, 2);
DITHER32( 17, 17, 26);
DITHER32( 25, 25, 38);
DITHER32( 41, 41, 62);
}
break;
case 1:
for (x=0; x<DstXE; x+=4)
{
DITHER32( 31, 31, 46);
DITHER32( 36, 36, 54);
DITHER32( 7, 7, 10);
DITHER32( 12, 12, 18);
}
break;
case 2:
for (x=0; x<DstXE; x+=4)
{
DITHER32( 20, 20, 30);
DITHER32( 4, 4, 6);
DITHER32( 39, 39, 58);
DITHER32( 23, 23, 34);
}
break;
case 3:
for (x=0; x<DstXE; x+=4)
{
DITHER32( 33, 33, 50);
DITHER32( 28, 28, 42);
DITHER32( 15, 15, 22);
DITHER32( 9, 9, 14);
}
break;
} /*switch*/
pbS += wWidthSrc;
pbD += wWidthDst;
}
}
//////////////////////////////////////////////////////////////////////////////
//
// Dither16TC - dither from 16 to 8 using the Table method in 'C' Code
//
//////////////////////////////////////////////////////////////////////////////
void FAR PASCAL Dither16C(
LPBITMAPINFOHEADER biDst, // --> BITMAPINFO of the dest
LPVOID lpDst, // --> to destination bits
int DstX, // Destination origin - x coordinate
int DstY, // Destination origin - y coordinate
int DstXE, // x extent of the BLT
int DstYE, // y extent of the BLT
LPBITMAPINFOHEADER biSrc, // --> BITMAPINFO of the source
LPVOID lpSrc, // --> to source bits
int SrcX, // Source origin - x coordinate
int SrcY, // Source origin - y coordinate
LPVOID lpDitherTable) // dither table.
{
int x,y;
int r,g,b;
WORD w;
UINT wWidthSrc;
UINT wWidthDst;
BYTE _huge *pbS;
BYTE _huge *pbD;
if (biDst->biBitCount != 8 || biSrc->biBitCount != 16)
return;
DstXE = DstXE & ~3; // round down!
wWidthSrc = ((UINT)biSrc->biWidth*2+3)&~3;
wWidthDst = ((UINT)biDst->biWidth+3)&~3;
pbD = (BYTE _huge *)lpDst + DstX + (DWORD)(UINT)DstY * (DWORD)wWidthDst;
pbS = (BYTE _huge *)lpSrc + SrcX*2 + (DWORD)(UINT)SrcY * (DWORD)wWidthSrc;
wWidthSrc -= DstXE*2;
wWidthDst -= DstXE;
#define GET16() \
w = *((WORD _huge *)pbS)++; \
r = (int)((w >> 7) & 0xF8); \
g = (int)((w >> 2) & 0xF8); \
b = (int)((w << 3) & 0xF8);
#define DITHER16(mr, mg, mb) \
GET16(); *pbD++ = (BYTE)lookup775[ rdith775[r + mr] + gdith775[g + mg] + ((b + mb) >> 6)];
for (y=0; y<DstYE; y++) {
switch (y & 3) {
case 0:
for (x=0; x<DstXE; x+=4)
{
DITHER16( 1, 1, 2);
DITHER16( 17, 17, 26);
DITHER16( 25, 25, 38);
DITHER16( 41, 41, 62);
}
break;
case 1:
for (x=0; x<DstXE; x+=4)
{
DITHER16( 31, 31, 46);
DITHER16( 36, 36, 54);
DITHER16( 7, 7, 10);
DITHER16( 12, 12, 18);
}
break;
case 2:
for (x=0; x<DstXE; x+=4)
{
DITHER16( 20, 20, 30);
DITHER16( 4, 4, 6);
DITHER16( 39, 39, 58);
DITHER16( 23, 23, 34);
}
break;
case 3:
for (x=0; x<DstXE; x+=4)
{
DITHER16( 33, 33, 50);
DITHER16( 28, 28, 42);
DITHER16( 15, 15, 22);
DITHER16( 9, 9, 14);
}
break;
} /*switch*/
pbS += wWidthSrc;
pbD += wWidthDst;
}
}
//////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////
#if 0
//
// this is the original code
//
//
void Dith775ScanLine(Rbuf, Gbuf, Bbuf, n, row, paloffset)
DWORD n; // pixels per row
int *Rbuf, *Gbuf, *Bbuf;
int row; // distance from top of image
WORD *paloffset;
{
int i;
// DITHER(x,y,rgb)
switch (row & 3)
{
case 0:
for (i=0; i<n; i+=4)
{
paloffset[i] = lookup775[ rdith775[Rbuf[i] + 1] + gdith775[Gbuf[i] + 1] + ((Bbuf[i] + 2) >> 6) ];
paloffset[i+1] = lookup775[ rdith775[Rbuf[i+1] + 17] + gdith775[Gbuf[i+1] + 17] + ((Bbuf[i+1] + 26) >> 6) ];
paloffset[i+2] = lookup775[ rdith775[Rbuf[i+2] + 25] + gdith775[Gbuf[i+2] + 25] + ((Bbuf[i+2] + 38) >> 6) ];
paloffset[i+3] = lookup775[ rdith775[Rbuf[i+3] + 41] + gdith775[Gbuf[i+3] + 41] + ((Bbuf[i+3] + 62) >> 6) ];
}
break;
case 1:
for (i=0; i<n; i+=4)
{
paloffset[i] = lookup775[ rdith775[Rbuf[i] + 31] + gdith775[Gbuf[i] + 31] + ((Bbuf[i] + 46) >> 6) ];
paloffset[i+1] = lookup775[ rdith775[Rbuf[i+1] + 36] + gdith775[Gbuf[i+1] + 36] + ((Bbuf[i+1] + 54) >> 6) ];
paloffset[i+2] = lookup775[ rdith775[Rbuf[i+2] + 7] + gdith775[Gbuf[i+2] + 7] + ((Bbuf[i+2] + 10) >> 6) ];
paloffset[i+3] = lookup775[ rdith775[Rbuf[i+3] + 12] + gdith775[Gbuf[i+3] + 12] + ((Bbuf[i+3] + 18) >> 6) ];
}
break;
case 2:
for (i=0; i<n; i+=4)
{
paloffset[i] = lookup775[ rdith775[Rbuf[i] + 20] + gdith775[Gbuf[i] + 20] + ((Bbuf[i] + 30) >> 6) ];
paloffset[i+1] = lookup775[ rdith775[Rbuf[i+1] + 4] + gdith775[Gbuf[i+1] + 4] + ((Bbuf[i+1] + 6) >> 6) ];
paloffset[i+2] = lookup775[ rdith775[Rbuf[i+2] + 39] + gdith775[Gbuf[i+2] + 39] + ((Bbuf[i+2] + 58) >> 6) ];
paloffset[i+3] = lookup775[ rdith775[Rbuf[i+3] + 23] + gdith775[Gbuf[i+3] + 23] + ((Bbuf[i+3] + 34) >> 6) ];
}
break;
case 3:
for (i=0; i<n; i+=4)
{
paloffset[i] = lookup775[ rdith775[Rbuf[i] + 33] + gdith775[Gbuf[i] + 33] + ((Bbuf[i] + 50) >> 6) ];
paloffset[i+1] = lookup775[ rdith775[Rbuf[i+1] + 28] + gdith775[Gbuf[i+1] + 28] + ((Bbuf[i+1] + 42) >> 6) ];
paloffset[i+2] = lookup775[ rdith775[Rbuf[i+2] + 15] + gdith775[Gbuf[i+2] + 15] + ((Bbuf[i+2] + 22) >> 6) ];
paloffset[i+3] = lookup775[ rdith775[Rbuf[i+3] + 9] + gdith775[Gbuf[i+3] + 9] + ((Bbuf[i+3] + 14) >> 6) ];
}
break;
} /*switch*/
}
#endif
#if 0
{
HPALETTE hpalT;
HWND hwnd;
BYTE xlat[256];
int fh;
static BOOL fHack = TRUE;
OFSTRUCT of;
char buf[80];
//
// convert palette to a palette that mappes 1:1 to the system
// palette, this will allow us to draw faster
//
hwnd = GetActiveWindow();
hdc = GetDC(hwnd);
if (fHack && (GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE))
{
fHack = FALSE;
for (i=0; i<(int)pal.palNumEntries; i++)
{
pal.palPalEntry[i].peRed = (BYTE)0;
pal.palPalEntry[i].peGreen = (BYTE)0;
pal.palPalEntry[i].peBlue = (BYTE)0;
pal.palPalEntry[i].peFlags = (BYTE)PC_RESERVED;
}
hpalT = CreatePalette((LPLOGPALETTE)&pal);
hpalT = SelectPalette(hdc, hpalT, FALSE);
RealizePalette(hdc);
hpalT = SelectPalette(hdc, hpalT, FALSE);
DeleteObject(hpalT);
hpalT = SelectPalette(hdc, hpal, FALSE);
RealizePalette(hdc);
GetSystemPaletteEntries(hdc, 0, 256, pal.palPalEntry);
SelectPalette(hdc, hpalT, FALSE);
PostMessage(hwnd, WM_QUERYNEWPALETTE, 0, 0);
for (i=0; i<256; i++)
{
// this wont work right for dup's in the palette
j = GetNearestPaletteIndex(hpal,RGB(pal.palPalEntry[i].peRed,
pal.palPalEntry[i].peGreen,pal.palPalEntry[i].peBlue));
xlat[j] = (BYTE)i;
}
SetPaletteEntries(hpal, 0, 256, pal.palPalEntry);
for (i=0; i < sizeof(lookup775)/sizeof(lookup775[0]); i++)
lookup775[i] = xlat[lookup775[i]];
//
// dump the new palette and lookup table out.
//
fh = OpenFile("c:/foo775.h", &of, OF_CREATE|OF_READWRITE);
if (fh != -1)
{
wsprintf(buf, "BYTE lookup775[245] = {\r\n");
_lwrite(fh, buf, lstrlen(buf));
for (i=0; i < sizeof(lookup775)/sizeof(lookup775[0]); i++) {
wsprintf(buf, "%3d,", lookup775[i]);
if (i % 16 == 0 && i != 0)
_lwrite(fh, "\r\n", 2);
_lwrite(fh, buf, lstrlen(buf));
}
wsprintf(buf, "}\r\n\r\nint dpal775[256][3] = {\r\n");
_lwrite(fh, buf, lstrlen(buf));
for (i=0; i < 256; i++) {
wsprintf(buf, "{0x%02x, 0x%02x, 0x%02x},",
pal.palPalEntry[i].peRed,
pal.palPalEntry[i].peGreen,
pal.palPalEntry[i].peBlue);
if (i % 4 == 0 && i != 0)
_lwrite(fh, "\r\n", 2);
_lwrite(fh, buf, lstrlen(buf));
}
wsprintf(buf, "}\r\n");
_lwrite(fh, buf, lstrlen(buf));
_lclose(fh);
}
}
ReleaseDC(hwnd, hdc);
}
#endif