static void fz_saturation_rgb(int *bdr, int *bdg, int *bdb, int sr, int sg, int sb) { int tr, tg, tb; setsat(*bdr, *bdg, *bdb, sat(sr, sg, sb), &tr, &tg, &tb); setlum(tr, tg, tb, lum(*bdr, *bdg, *bdb), bdr, bdg, bdb); }
void tone(){ double maxl=0; double a=0.8; for(int y=0;y<screenHeight;y++){ for(int x=0;x<screenWidth;x++){ double l=lum(image[y*screenWidth+x]); maxl=maxl>l?maxl:l; } } for(int y=0;y<screenHeight;y++){ for(int x=0;x<screenWidth;x++){ double l=lum(image[y*screenWidth+x]); double d=l*a/(l*a-l+maxl); image[y*screenWidth+x]=image[y*screenWidth+x]*d; } } double t=1; }
static void clipcolor(int r, int g, int b, int *dr, int *dg, int *db) { int l = lum(r, g, b); int n = MIN(MIN(r, g), b); int x = MAX(MAX(r, g), b); if (n < 0) { *dr = l + 255 * (r - l) / (l - n); *dg = l + 255 * (g - l) / (l - n); *db = l + 255 * (b - l) / (l - n); } else { *dr = l + 255 * (255 - l) / (x - l); *dg = l + 255 * (255 - l) / (x - l); *db = l + 255 * (255 - l) / (x - l); } }
static void fz_luminosity_rgb(int *bdr, int *bdg, int *bdb, int sr, int sg, int sb) { setlum(*bdr, *bdg, *bdb, lum(sr, sg, sb), bdr, bdg, bdb); }
static void fz_color_rgb(int *bdr, int *bdg, int *bdb, int sr, int sg, int sb) { setlum(sr, sg, sb, lum(*bdr, *bdg, *bdb), bdr, bdg, bdb); }
static void setlum(int r, int g, int b, int l, int *dr, int *dg, int *db) { int d = 255 - lum(r, g, b); clipcolor(r + d, g + d, b + d, dr, dg, db); }