Simon Wistow (deflatermouse) wrote,
Simon Wistow
deflatermouse

The Darkness

I had a problem loading TIFF's with alpha channels in Imlib2 as they seemed to be coming out very dark. I noticed in the source code that, on saving, there was a comment about premultiplying if there's an alpha component but no corrollary in the loading method.

        if (has_alpha)
              {
                  /* TIFF makes you pre-mutiply the rgb components by alpha */
                  a = (pixel >> 24) & 0xff;
                  alpha_factor = ((double)a / 255.0);
                  r *= alpha_factor;
                  g *= alpha_factor;
                  b *= alpha_factor;
               }

But surely that would mean that our images would be too bright since, in loading, we'd divide by this alpha factor. In my defence I was heavily dosed up on cold medicine at the time but I eventually twigged that if the alpha was, say, 150 then 150/255 is smaller than 1 and therefore dividing would actually make it larger and hence brighter. One swift patch later and everything is hunky dory.

             for (j = 0; j < w; j++)
               {
        +         int a, r, g, b;
        +         
        +         a = TIFFGetA(pixel_value);
        +         r = TIFFGetR(pixel_value);
        +         g = TIFFGetG(pixel_value);
        +         b = TIFFGetB(pixel_value);
                  pixel_value = (*(pixel++));
        -             (*(buffer_pixel++)) =
        -                 (TIFFGetA(pixel_value) << 24) |
        -                 (TIFFGetR(pixel_value) << 16) | (TIFFGetG(pixel_value) << 8) |
        -                 TIFFGetB(pixel_value);
        +         if ((a > 0) && (a < 255))
        +           {
        +              r = (r * 255) / a;
        +              g = (g * 255) / a;
        +              b = (b * 255) / a;
        +           }
        +             (*(buffer_pixel++)) = (a << 24) | (r << 16) | (g << 8) | b;
           }

Or is it? A user was still reporting the same bug - images were too dark. Again it took a while for the lightbulb to turn on depsite extensive tracing in Totalview and GDB. The problem was that I'd stretched the image to fit a new aspect ration and then composited it onto a black background of the original size to make the black bars thus producing a darker image. Doh. Turning off alpha blending fixed it.

Tags: alpha, black background, cold medicine, doh, gdb, hunky dory, image, images, lightbulb, loading, swift patch, tiff, totalview
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments