summaryrefslogtreecommitdiffstats
path: root/src/color.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/color.c')
-rw-r--r--src/color.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/color.c b/src/color.c
new file mode 100644
index 0000000..7057a23
--- /dev/null
+++ b/src/color.c
@@ -0,0 +1,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,unsigned char *Y,unsigned char *Cb,unsigned char *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));
+}
+
+