// pastel.c
#include <stdio.h>
#include <stdlib.h>
#include "io_bmp.h"
void to_pastel_PIXEL(struct PIXEL* p)
{
const double o=1.2;
const double q=0.5;
const double s=0.2;
double r = p->r; r /= 255;
double g = p->g; g /= 255;
double b = p->b; b /= 255;
double* u = (r>g) ? ((r>b) ? &r : &b) : ((g>b) ? &g : &b);
double* d = (r<g) ? ((r<b) ? &r : &b) : ((g<b) ? &g : &b);
double _u = *u;
double _d = *d;
r += (1 - _u) * ((_u - _d + s) * o);
g += (1 - _u) * ((_u - _d + s) * o);
b += (1 - _u) * ((_u - _d + s) * o);
_u = *u;
_d = *d;
r += (_u - r) * ((_u - _d + s) * q);
g += (_u - g) * ((_u - _d + s) * q);
b += (_u - b) * ((_u - _d + s) * q);
p->r = (r>=1) ? 255 : r * 255;
p->g = (g>=1) ? 255 : g * 255;
p->b = (b>=1) ? 255 : b * 255;
}
void main(int argc,char** argv)
{
struct BMP* a = (struct BMP*)malloc(sizeof(struct BMP));
read_BMP(a, argv[1]);
struct PIXEL* p = a->p;
int i = a->w * a->h; while (i-- > 0) {
to_pastel_PIXEL(p++);
}
write_BMP(a, "a.bmp");
}