X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=image_png.c;h=0d58d4a36f33e95e4b64163c08dd4aef42d3c972;hb=c9a9293b71eae9888690d8c6d8985c6b0a1bec00;hp=b97e9c6d04dfd5bb9f5092916fd02dafc24657fe;hpb=39c4fcd8bfa6a68277054d79062446cf2156c14a;p=xonotic%2Fdarkplaces.git diff --git a/image_png.c b/image_png.c index b97e9c6d..0d58d4a3 100644 --- a/image_png.c +++ b/image_png.c @@ -39,7 +39,6 @@ static void (*qpng_read_info) (void*, void*); static void (*qpng_set_compression_level) (void*, int); static void (*qpng_set_filter) (void*, int, int); static void (*qpng_set_expand) (void*); -static void (*qpng_set_gray_1_2_4_to_8) (void*); static void (*qpng_set_palette_to_rgb) (void*); static void (*qpng_set_tRNS_to_alpha) (void*); static void (*qpng_set_gray_to_rgb) (void*); @@ -60,7 +59,7 @@ static unsigned int (*qpng_get_rowbytes) (void*, void*); static unsigned char (*qpng_get_channels) (void*, void*); static unsigned char (*qpng_get_bit_depth) (void*, void*); static unsigned int (*qpng_get_IHDR) (void*, void*, unsigned long*, unsigned long*, int *, int *, int *, int *, int *); -static char* (*qpng_get_libpng_ver) (void*); +static unsigned int (*qpng_access_version_number) (void); // FIXME is this return type right? It is a png_uint_32 in libpng static void (*qpng_write_info) (void*, void*); static void (*qpng_write_row) (void*, unsigned char*); static void (*qpng_write_end) (void*, void*); @@ -76,7 +75,6 @@ static dllfunction_t pngfuncs[] = {"png_set_compression_level", (void **) &qpng_set_compression_level}, {"png_set_filter", (void **) &qpng_set_filter}, {"png_set_expand", (void **) &qpng_set_expand}, - {"png_set_gray_1_2_4_to_8", (void **) &qpng_set_gray_1_2_4_to_8}, {"png_set_palette_to_rgb", (void **) &qpng_set_palette_to_rgb}, {"png_set_tRNS_to_alpha", (void **) &qpng_set_tRNS_to_alpha}, {"png_set_gray_to_rgb", (void **) &qpng_set_gray_to_rgb}, @@ -97,7 +95,7 @@ static dllfunction_t pngfuncs[] = {"png_get_channels", (void **) &qpng_get_channels}, {"png_get_bit_depth", (void **) &qpng_get_bit_depth}, {"png_get_IHDR", (void **) &qpng_get_IHDR}, - {"png_get_libpng_ver", (void **) &qpng_get_libpng_ver}, + {"png_access_version_number", (void **) &qpng_access_version_number}, {"png_write_info", (void **) &qpng_write_info}, {"png_write_row", (void **) &qpng_write_row}, {"png_write_end", (void **) &qpng_write_end}, @@ -128,10 +126,14 @@ qboolean PNG_OpenLibrary (void) const char* dllnames [] = { #if WIN32 + "libpng14-14.dll", + "libpng14.dll", "libpng12.dll", #elif defined(MACOSX) + "libpng14.14.dylib", "libpng12.0.dylib", #else + "libpng14.so.14", // WTF libtool guidelines anyone? "libpng12.so.0", "libpng.so", // FreeBSD #endif @@ -167,7 +169,8 @@ void PNG_CloseLibrary (void) ================================================================= */ -#define PNG_LIBPNG_VER_STRING "1.2.4" +#define PNG_LIBPNG_VER_STRING_12 "1.2.4" +#define PNG_LIBPNG_VER_STRING_14 "1.4.0" #define PNG_COLOR_MASK_PALETTE 1 #define PNG_COLOR_MASK_COLOR 2 @@ -253,7 +256,7 @@ void PNG_warning_fn(void *png, const char *message) extern int image_width; extern int image_height; -unsigned char *PNG_LoadImage_BGRA (const unsigned char *raw, int filesize) +unsigned char *PNG_LoadImage_BGRA (const unsigned char *raw, int filesize, int *miplevel) { unsigned int c; unsigned int y; @@ -269,7 +272,10 @@ unsigned char *PNG_LoadImage_BGRA (const unsigned char *raw, int filesize) if(qpng_sig_cmp(raw, 0, filesize)) return NULL; - png = (void *)qpng_create_read_struct(PNG_LIBPNG_VER_STRING, 0, PNG_error_fn, PNG_warning_fn); + png = (void *)qpng_create_read_struct( + (qpng_access_version_number() / 100 == 102) ? PNG_LIBPNG_VER_STRING_12 : PNG_LIBPNG_VER_STRING_14, // nasty hack to support both libpng12 and libpng14 + 0, PNG_error_fn, PNG_warning_fn + ); if(!png) return NULL; @@ -339,12 +345,7 @@ unsigned char *PNG_LoadImage_BGRA (const unsigned char *raw, int filesize) if (my_png.ColorType == PNG_COLOR_TYPE_PALETTE) qpng_set_palette_to_rgb(png); if (my_png.ColorType == PNG_COLOR_TYPE_GRAY || my_png.ColorType == PNG_COLOR_TYPE_GRAY_ALPHA) - { qpng_set_gray_to_rgb(png); - if (my_png.BitDepth < 8) - qpng_set_gray_1_2_4_to_8(png); - } - if (qpng_get_valid(png, pnginfo, PNG_INFO_tRNS)) qpng_set_tRNS_to_alpha(png); if (my_png.BitDepth == 8 && !(my_png.ColorType & PNG_COLOR_MASK_ALPHA)) @@ -458,7 +459,10 @@ qboolean PNG_SaveImage_preflipped (const char *filename, int width, int height, return false; } - png = (void *)qpng_create_write_struct(PNG_LIBPNG_VER_STRING, 0, PNG_error_fn, PNG_warning_fn); + png = (void *)qpng_create_write_struct( + (qpng_access_version_number() / 100 == 102) ? PNG_LIBPNG_VER_STRING_12 : PNG_LIBPNG_VER_STRING_14, // nasty hack to support both libpng12 and libpng14 + 0, PNG_error_fn, PNG_warning_fn + ); if(!png) return false; pnginfo = (void *)qpng_create_info_struct(png);