summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Williams <samuel.williams@oriontransfer.co.nz>2017-09-06 17:22:46 +1200
committerSamuel Williams <samuel.williams@oriontransfer.co.nz>2017-09-06 17:22:46 +1200
commit95046512a4f7b63b78f8dcfee6462f375f129b44 (patch)
treef34743869d5cd3c3887413afa4e4c251f567cf20
parent4e9839d4536e5509c9409ff99f96dc57addebf8d (diff)
downloadlibpng-95046512a4f7b63b78f8dcfee6462f375f129b44.tar.gz
Add support for loading images with associated alpha.
-rw-r--r--png.h2
-rw-r--r--pngread.c12
2 files changed, 13 insertions, 1 deletions
diff --git a/png.h b/png.h
index 985b16b53..dfe441680 100644
--- a/png.h
+++ b/png.h
@@ -2819,6 +2819,8 @@ typedef struct
# define PNG_FORMAT_FLAG_AFIRST 0x20U /* alpha channel comes first */
#endif
+#define PNG_FORMAT_FLAG_ASSOCIATED_ALPHA 0x40U /* alpha channel is associated */
+
/* Commonly used formats have predefined macros.
*
* First the single byte (sRGB) formats:
diff --git a/pngread.c b/pngread.c
index e34ddd99a..6b9441384 100644
--- a/pngread.c
+++ b/pngread.c
@@ -3759,7 +3759,13 @@ png_image_read_direct(png_voidp argument)
mode = PNG_ALPHA_PNG;
output_gamma = PNG_DEFAULT_sRGB;
}
-
+
+ if ((change & PNG_FORMAT_FLAG_ASSOCIATED_ALPHA) != 0)
+ {
+ mode = PNG_ALPHA_OPTIMIZED;
+ change &= ~PNG_FORMAT_FLAG_ASSOCIATED_ALPHA;
+ }
+
/* If 'do_local_background' is set check for the presence of gamma
* correction; this is part of the work-round for the libpng bug
* described above.
@@ -3985,6 +3991,10 @@ png_image_read_direct(png_voidp argument)
else if (do_local_compose != 0) /* internal error */
png_error(png_ptr, "png_image_read: alpha channel lost");
+ if ((format & PNG_FORMAT_FLAG_ASSOCIATED_ALPHA) != 0) {
+ info_format |= PNG_FORMAT_FLAG_ASSOCIATED_ALPHA;
+ }
+
if (info_ptr->bit_depth == 16)
info_format |= PNG_FORMAT_FLAG_LINEAR;