[Gimp-developer] Porting the decompose/compose plugin



Hi,

recently I recommenced porting the decompose/compose plugin to babl and so far 
nearly everything's fine. The only exception consists in the YCbCr-colorspace-
algorithms which are causing some headache. Below I post the original code and 
what I've done with it. The conversion-problems are illustrated in the 
screenshots respectively (tried to keep them small, where do you normally link 
things like that?).
I think the errors in the conversion are kind of a type-casting problem. But 
until now I couldn't come up with a right way to port the algorithm. Any ideas 
about what is the problem are appreciated!

Thx,
Alex

First the original code as it resides in decompose.c.

---> gimp/plug-ins/common/decompose.c:

#define FIX(a) ((int)((a)*256.0*256.0 + 0.5))
#define FIXY(a) ((int)((a)*256.0*256.0*219.0/255.0 + 0.5))
#define FIXC(a) ((int)((a)*256.0*256.0*224.0/255.0 + 0.5))

static void
extract_ycbcr470 (const guchar  *src,
                  gint           bpp,
                  gint           numpix,
                  guchar       **dst)
{
  register const guchar *rgb_src = src;
  register guchar *y_dst  = dst[0];
  register guchar *cb_dst = dst[1];
  register guchar *cr_dst = dst[2];
  register gint count = numpix, offset = bpp-3;

  while (count-- > 0)
    {
      register int r, g, b;
      r= *(rgb_src++);
      g= *(rgb_src++);
      b= *(rgb_src++);
      *(y_dst++)  = ( FIXY(0.2989)*r + FIXY(0.5866)*g + FIXY(0.1145)*b + 
FIX(16.5))>>16;
      *(cb_dst++) = (-FIXC(0.1688)*r - FIXC(0.3312)*g + FIXC(0.5000)*b + 
FIX(128.5))>>16;
      *(cr_dst++) = ( FIXC(0.5000)*r - FIXC(0.4184)*g - FIXC(0.0816)*b + 
FIX(128.5))>>16;

      rgb_src += offset;
    }
}




Here is how I ported the conversion to a babl-extensions and 
substituted the code in decompose.c

---> gimp/plug-ins/common/decompose.c:

static void
extract_ycbcr470 (const guchar  *src,
                  gint           bpp_src,
                  gint           numpix,
                  guchar       **dst)
{
  register const guchar *rgb_src = src;
  register guchar *y_dst = dst[0];
  register guchar *cb_dst = dst[1];
  register guchar *cr_dst = dst[2];
  register gint count = numpix;
  register const int bpp_dst = 3;
  gdouble *ycbcr470_buffer;

  const Babl *rgb         = babl_format ("RGB u8");
  const Babl *rgba        = babl_format ("RGBA u8");
  const Babl *ycbcr470    = babl_format ("YCbCr470 double");
  const Babl *rgb_to_ycbcr470  = babl_fish (rgb, ycbcr470);
  const Babl *rgba_to_ycbcr470 = babl_fish (rgba, ycbcr470);

  ycbcr470_buffer = malloc (numpix * bpp_dst * sizeof (gdouble));

  if (bpp_src == 4)
    {
      babl_process (rgba_to_ycbcr470, rgb_src, ycbcr470_buffer, numpix);
    }
  else
    {
      babl_process (rgb_to_ycbcr470, rgb_src, ycbcr470_buffer, numpix);
    }

  while (count--)
    {
      *y_dst++  = (guchar) (ycbcr470_buffer[0] * 255.0);
      *cb_dst++ = (guchar) (ycbcr470_buffer[1] * 255.0);
      *cr_dst++ = (guchar) (ycbcr470_buffer[2] * 255.0);

      ycbcr470_buffer += bpp_dst;
    }
}


Here the babl-extension

---> babl/extensions/ycbcr.c:

#define FIX_1(a) ((double)((a)*256.0*256.0 + 0.5))
#define FIXY_1(a) ((double)((a)*256.0*256.0*219.0/255.0 + 0.5))
#define FIXC_1(a) ((double)((a)*256.0*256.0*224.0/255.0 + 0.5))

static long
rgba_to_ycbcr470 (char *src,
                  char *dst,
                  long  n)
{
  double y, cb, cr;

  while (n--)
    {
      double red   = ((double *) src)[0];
      double green = ((double *) src)[1];
      double blue  = ((double *) src)[2];

      y  = ( FIXY_1(0.2989)*red + FIXY_1(0.5866)*green + FIXY_1(0.1145)*blue + 
FIX_1( 16.5))/65536;
      cb = (-FIXC_1(0.1688)*red - FIXC_1(0.3312)*green + FIXC_1(0.5000)*blue + 
FIX_1(128.5))/65536;
      cr = ( FIXC_1(0.5000)*red - FIXC_1(0.4184)*green - FIXC_1(0.0816)*blue + 
FIX_1(128.5))/65536;

      ((double *) dst)[0] = y;
      ((double *) dst)[1] = cb;
      ((double *) dst)[2] = cr;

      src += 4 * sizeof (double);
      dst += 3 * sizeof (double);
    }

  return n;
}

Attachment: cb_new.jpg
Description: JPEG image

Attachment: cb_original.jpg
Description: JPEG image

Attachment: cr_new.jpg
Description: JPEG image

Attachment: cr_original.jpg
Description: JPEG image

Attachment: y_original.jpg
Description: JPEG image

Attachment: y_new.jpg
Description: JPEG image



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]