summaryrefslogtreecommitdiffstats
path: root/src/color.c
blob: cc4abae3cc81bb1ed095355e55f6141207843c63 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include "color.h"

#define Mul_Shift(x,y)	((x*y)>>8)

unsigned char clip(int value) {
   if (value < 0) return (char) 0;
   if (value > 255) return (char) 255;
   return (unsigned char) value;
}

/* RGB -> YCbCr (also from BMP to JPEG) */
// Y = 0.299 R + 0.587 G + 0.114 B
// Cb = - 0.1687 R - 0.3313 G + 0.5 B + 128
// Cr = 0.5 R - 0.4187 G - 0.0813 B + 128
void RGB2YCbCr (unsigned char R, unsigned char G, unsigned char B,int *Y,int *Cb,int *Cr) {
   *Y =  clip(Mul_Shift(R,77) +  Mul_Shift(G,150) + Mul_Shift(B,29));
   *Cb = clip((B>>1)-Mul_Shift(R,43) - Mul_Shift(G,85) + 128);
   *Cr = clip((R>>1) - Mul_Shift(G,107) - Mul_Shift(B,21) + 128);
}

/* RGB -> YCbCr (also from JPEG to BMP) */
// R = Y + 1.402 (Cr-128)
// G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)
// B = Y + 1.772 (Cb-128)
void YCbCr2RGB (unsigned char Y, unsigned char Cb, unsigned char Cr,unsigned char *R,unsigned char *G,unsigned char *B) {
   *R = clip(Y + Mul_Shift((Cr-128),359));
   *G = clip(Y - Mul_Shift((Cb-128),88) - Mul_Shift((Cr-128),183));
   *B = clip(Y + Mul_Shift((Cb-128),454));
}