]> mj.ucw.cz Git - libucw.git/blobdiff - images/io-libpng.c
rest of bbuf printf
[libucw.git] / images / io-libpng.c
index fe60fef60437ae765dee89a3821d38da5ca509ec..f15955a64cf83c045bd953cb1afa33fd96908b96 100644 (file)
@@ -217,7 +217,6 @@ libpng_read_data(struct image_io *io)
   switch (rd->color_type)
     {
       case PNG_COLOR_TYPE_PALETTE:
-       /* FIXME: add support for palette with colors */
        if ((io->flags & IMAGE_COLOR_SPACE) == COLOR_SPACE_GRAYSCALE)
          {
            png_set_palette_to_rgb(rd->png_ptr);
@@ -225,10 +224,20 @@ libpng_read_data(struct image_io *io)
          }
        else
          png_set_palette_to_rgb(rd->png_ptr);
-       if ((io->flags & IMAGE_ALPHA) || (io->flags & IMAGE_PIXEL_FORMAT) == (COLOR_SPACE_RGB | IMAGE_PIXELS_ALIGNED))
-          png_set_add_alpha(rd->png_ptr, 255, PNG_FILLER_AFTER);
+       if (!(io->flags & IMAGE_ALPHA))
+         {
+           if (io->flags & IMAGE_IO_USE_BACKGROUND)
+             {
+                png_set_add_alpha(rd->png_ptr, 255, PNG_FILLER_AFTER);
+               read_flags = (read_flags | IMAGE_ALPHA) & IMAGE_CHANNELS_FORMAT;
+             }
+           else if ((io->flags & IMAGE_PIXEL_FORMAT) == (COLOR_SPACE_RGB | IMAGE_PIXELS_ALIGNED))
+              png_set_add_alpha(rd->png_ptr, 255, PNG_FILLER_AFTER);
+            else
+             png_set_strip_alpha(rd->png_ptr);
+         }
        else
-         png_set_strip_alpha(rd->png_ptr);
+          png_set_add_alpha(rd->png_ptr, 255, PNG_FILLER_AFTER);
        break;
       case PNG_COLOR_TYPE_GRAY:
        if ((io->flags & IMAGE_COLOR_SPACE) == COLOR_SPACE_RGB)
@@ -242,7 +251,7 @@ libpng_read_data(struct image_io *io)
        if (!(io->flags & IMAGE_ALPHA))
          {
            if (io->flags & IMAGE_IO_USE_BACKGROUND)
-             read_flags |= IMAGE_ALPHA;
+             read_flags = (read_flags | IMAGE_ALPHA) & IMAGE_CHANNELS_FORMAT;
            else
               png_set_strip_alpha(rd->png_ptr);
          }  
@@ -258,7 +267,7 @@ libpng_read_data(struct image_io *io)
          png_set_rgb_to_gray_fixed(rd->png_ptr, 1, 21267, 71514);
        if (!(io->flags & IMAGE_ALPHA))
          if (io->flags & IMAGE_IO_USE_BACKGROUND)
-           read_flags |= IMAGE_ALPHA;
+           read_flags = (read_flags | IMAGE_ALPHA) & IMAGE_CHANNELS_FORMAT;
          else if ((io->flags & IMAGE_PIXEL_FORMAT) != (COLOR_SPACE_RGB | IMAGE_PIXELS_ALIGNED))
             png_set_strip_alpha(rd->png_ptr);
        break;