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.
83 lines
3.0 KiB
83 lines
3.0 KiB
#ifndef _DITHERS_H
|
|
#define _DITHERS_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Dithering stuff.
|
|
//
|
|
// This code implements error-diffusion to an arbitrary set of colors,
|
|
// optionally with transparency. Since the output colors can be arbitrary,
|
|
// the color picker for the dither is a 32k inverse-mapping table. 24bpp
|
|
// values are whacked down to 16bpp (555) and used as indices into the table.
|
|
// To compensate for posterization effects when converting 24bpp to 16bpp, an
|
|
// ordered dither (16bpp halftone) is used to generate the 555 color.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
typedef struct
|
|
{
|
|
int r, g, b;
|
|
|
|
} ERRBUF;
|
|
|
|
__inline size_t ErrbufBytes(size_t pels)
|
|
{
|
|
return (pels + 2) * sizeof(ERRBUF);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
void Dith8to8(BYTE *dst, const BYTE *src, int dst_next_scan, int src_next_scan,
|
|
const RGBQUAD *colorsIN, const RGBQUAD *colorsOUT, const BYTE *map,
|
|
ERRBUF *cur_err, ERRBUF *nxt_err, UINT x, UINT cx, UINT y, int cy);
|
|
|
|
void Convert8to8( BYTE* pbDest, const BYTE* pbSrc, int nDestPitch,
|
|
int nSrcPitch, const RGBQUAD* prgbColors, const BYTE* pbMap, UINT x,
|
|
UINT nWidth, UINT y, int nHeight );
|
|
|
|
void DithGray8to8( BYTE* pbDest, const BYTE* pbSrc, int nDestPitch,
|
|
int nSrcPitch, const RGBQUAD* prgbColors, const BYTE* pbMap,
|
|
ERRBUF* pCurrentError, ERRBUF* pNextError, UINT x, UINT cx, UINT y,
|
|
int cy );
|
|
|
|
void ConvertGray8to8( BYTE* pbDest, const BYTE* pbSrc, int nDestPitch,
|
|
int nSrcPitch, const BYTE* pbMap, UINT x, UINT nWidth, UINT y,
|
|
int nHeight );
|
|
|
|
void Dith8to8t(BYTE *dst, const BYTE *src, int dst_next_scan,
|
|
int src_next_scan, const RGBQUAD *colorsIN, const RGBQUAD *colorsOUT,
|
|
const BYTE *map, ERRBUF *cur_err, ERRBUF *nxt_err, UINT x, UINT cx, UINT y,
|
|
int cy, BYTE indexTxpOUT, BYTE indexTxpIN);
|
|
|
|
void Dith8to16(WORD *dst, const BYTE *src, int dst_next_scan,
|
|
int src_next_scan, const RGBQUAD *colors, ERRBUF *cur_err, ERRBUF *nxt_err,
|
|
UINT x, UINT cx, UINT y, int cy);
|
|
|
|
void Dith8to16t(WORD *dst, const BYTE *src, int dst_next_scan,
|
|
int src_next_scan, const RGBQUAD *colors, ERRBUF *cur_err, ERRBUF *nxt_err,
|
|
UINT x, UINT cx, UINT y, int cy, WORD wColorTxpOUT, BYTE indexTxpIN);
|
|
|
|
void Dith24to8(BYTE *dst, const BYTE *src, int dst_next_scan,
|
|
int src_next_scan, const RGBQUAD *colors, const BYTE *map, ERRBUF *cur_err,
|
|
ERRBUF *nxt_err, UINT x, UINT cx, UINT y, int cy);
|
|
|
|
void Convert24to8( BYTE* pbDest, const BYTE* pbSrc, int nDestPitch,
|
|
int nSrcPitch, const BYTE* pbMap, UINT x, UINT nWidth, UINT y,
|
|
int nHeight );
|
|
|
|
void Dith24to16(WORD *dst, const BYTE *src, int dst_next_scan,
|
|
int src_next_scan, ERRBUF *cur_err, ERRBUF *nxt_err, UINT x, UINT cx,
|
|
UINT y, int cy);
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // _DITHERS_H
|
|
|