/*
 * yuv - rgb<->yuv color conversion routines (simplified)
 * Copyright(c) 2002-2004 of wave++ (Yuri D'Elia) <wavexx@users.sf.net>
 * Distributed under GNU LGPL without ANY warranty.
 */

void rgb2yuv(unsigned char r, unsigned char g, unsigned char b,
    unsigned char* y, unsigned char* u, unsigned char* v)
{
  int buf;

  *y = 0.299 * r + 0.587 * g + 0.114 * b;
  buf = 128 - 0.16874 * r - 0.33126 * g + 0.5 * b;
  *u = (buf < 0? 0: (buf > 255? 255: buf));
  buf = 128 + 0.5 * r - 0.41869 * g - 0.08131 * b;
  *v = (buf < 0? 0: (buf > 255? 255: buf));
}

void yuv2rgb(unsigned char y, unsigned char u, unsigned char v,
    unsigned char* r, unsigned char* g, unsigned char* b)
{
  int buf, v1, u1;

  u1 = -128 + u;
  v1 = -128 + v;

  buf = 1.402 * v1 + y;
  *r = (buf < 0? 0: (buf > 255? 255: buf));
  buf = -0.34414 * u1 - 0.71414 * v1 + y;
  *g = (buf < 0? 0: (buf > 255? 255: buf));
  buf = 1.772 * u1 + y;
  *b = (buf < 0? 0: (buf > 255? 255: buf));
}

