Files
FireBee_Setup/sources/z-tools/trunk/zview/zvdi/dither.c

62 lines
2.4 KiB
C

#include "../general.h"
extern uint32 cube216[216];
extern uint32 graymap[32];
/* prototype */
inline uint8 dither_true ( uint8 * rgb, int16 * err, int8 ** buf);
inline uint8 dither_gray( uint8 *gray, int16 *err, int8 **buf);
inline uint8 ditherize_32 ( uint8 * rgb, int16 * err, int8 ** buf)
{
int8 *dth = *buf;
unsigned short r = (( err[0] += ( int16)dth[0] + rgb[1]) <= 42 ? 0 : err[0] >= 213 ? 5 : ( err[0] * 3) >> 7);
unsigned short g = (( err[1] += ( int16)dth[1] + rgb[2]) <= 42 ? 0 : err[1] >= 213 ? 5 : ( err[1] * 3) >> 7);
unsigned short b = (( err[2] += ( int16)dth[2] + rgb[3]) <= 42 ? 0 : err[2] >= 213 ? 5 : ( err[2] * 3) >> 7);
uint8 * irgb = ( uint8*)&cube216[( r * 6 + g) * 6 + b];
err[0] -= irgb[1];
dth[0] = ( err[0] <= -254 ? ( err[0] =- 127) : err[0] >= +254 ? ( err[0] =+ 127) : ( err[0] >>= 1));
err[1] -= irgb[2];
dth[1] = ( err[1] <= -254 ? ( err[1] =- 127) : err[1] >= +254 ? ( err[1] =+ 127) : ( err[1] >>= 1));
err[2] -= irgb[3];
dth[2] = ( err[2] <= -254 ? ( err[2] = -127) : err[2] >= +254 ? ( err[2] = +127) : ( err[2] >>= 1));
( *buf) += 3;
return irgb[0];
}
inline uint8 dither_true ( uint8 * rgb, int16 * err, int8 ** buf)
{
int8 *dth = *buf;
unsigned short r = (( err[0] += ( int16)dth[0] + rgb[0]) <= 42 ? 0 : err[0] >= 213 ? 5 : ( err[0] * 3) >> 7);
unsigned short g = (( err[1] += ( int16)dth[1] + rgb[1]) <= 42 ? 0 : err[1] >= 213 ? 5 : ( err[1] * 3) >> 7);
unsigned short b = (( err[2] += ( int16)dth[2] + rgb[2]) <= 42 ? 0 : err[2] >= 213 ? 5 : ( err[2] * 3) >> 7);
uint8 * irgb = ( uint8*)&cube216[( r * 6 + g) * 6 + b];
err[0] -= irgb[1];
dth[0] = ( err[0] <= -254 ? ( err[0] =- 127) : err[0] >= +254 ? ( err[0] =+ 127) : ( err[0] >>= 1));
err[1] -= irgb[2];
dth[1] = ( err[1] <= -254 ? ( err[1] =- 127) : err[1] >= +254 ? ( err[1] =+ 127) : ( err[1] >>= 1));
err[2] -= irgb[3];
dth[2] = ( err[2] <= -254 ? ( err[2] = -127) : err[2] >= +254 ? ( err[2] = +127) : ( err[2] >>= 1));
( *buf) += 3;
return irgb[0];
}
inline uint8 dither_gray( uint8 *gray, int16 *err, int8 **buf)
{
int8 *dth = *buf;
unsigned short idx = (( err[0] += ( int16)dth[0] + gray[0]) <= 0x07 ? 0 : err[0] >= 0xF8 ? 0x1F : err[0] >> 3);
uint8 *irgb = ( uint8*)&graymap[idx];
err[0] -= irgb[1];
dth[0] = ( err[0] <= -254 ? ( err[0] = -127) : err[0] >= +254 ? ( err[0] =+ 127) : ( err[0] >>= 1));
(*buf) += 1;
return irgb[0];
}