From a09c33b3ace43be9edec96d880071e9b5097e12a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20=22Zarazek=22=20Wi=C5=9Bniewski?= Date: Thu, 22 Jan 2015 22:03:51 +0100 Subject: [PATCH] Handle 16-bit chennels by stripping them to 8-bit. --- src/ffi.rs | 1 + src/lib.rs | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/src/ffi.rs b/src/ffi.rs index f6b2070..b73110a 100644 --- a/src/ffi.rs +++ b/src/ffi.rs @@ -84,4 +84,5 @@ extern { pub fn RUST_png_set_add_alpha(png_ptr: *mut png_struct, val: u32, flag: c_int); pub fn RUST_png_set_filler(png_ptr: *mut png_struct, val: u32, flag: c_int); pub fn RUST_png_set_interlace_handling(png_ptr: *mut png_struct); + pub fn RUST_png_set_strip_16(png_ptr: *mut png_struct); } diff --git a/src/lib.rs b/src/lib.rs index 3b54695..37d7668 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -106,6 +106,7 @@ pub fn load_png_from_memory(image: &[u8]) -> Result { let width = ffi::RUST_png_get_image_width(png_ptr, info_ptr); let height = ffi::RUST_png_get_image_height(png_ptr, info_ptr); let color_type = ffi::RUST_png_get_color_type(png_ptr, info_ptr); + let bit_depth = ffi::RUST_png_get_bit_depth(png_ptr, info_ptr); // convert palette and grayscale to rgb match color_type as c_int { @@ -118,6 +119,11 @@ pub fn load_png_from_memory(image: &[u8]) -> Result { _ => {} } + // convert 16-bit channels to 8-bit + if bit_depth == 16 { + ffi::RUST_png_set_strip_16(png_ptr); + } + // add alpha channels ffi::RUST_png_set_add_alpha(png_ptr, 0xff, ffi::FILLER_AFTER); if ffi::RUST_png_get_valid(png_ptr, info_ptr, ffi::INFO_tRNS as u32) != 0 {