Splitted Load_PNG to allow usage by Load_ICO

Introduces Load_PNG_Sub()
some .ico contain PNG images
This commit is contained in:
Thomas Bernard 2018-01-17 10:13:03 +01:00
parent c2486ed629
commit 37a5a0a85c

View File

@ -63,6 +63,10 @@
#include "pages.h" #include "pages.h"
#include "windows.h" // Best_color() #include "windows.h" // Best_color()
#ifndef __no_pnglib__
static void Load_PNG_Sub(T_IO_Context * context, FILE * file);
#endif
//////////////////////////////////// IMG //////////////////////////////////// //////////////////////////////////// IMG ////////////////////////////////////
// -- Tester si un fichier est au format IMG -------------------------------- // -- Tester si un fichier est au format IMG --------------------------------
@ -4151,33 +4155,12 @@ int PNG_read_unknown_chunk(png_structp ptr, png_unknown_chunkp chunk)
} }
png_bytep * Row_pointers;
// -- Lire un fichier au format PNG ----------------------------------------- // -- Lire un fichier au format PNG -----------------------------------------
void Load_PNG(T_IO_Context * context) static void Load_PNG_Sub(T_IO_Context * context, FILE * file)
{ {
FILE *file; // Fichier du fichier
char filename[MAX_PATH_CHARACTERS]; // Nom complet du fichier
byte png_header[8];
byte row_pointers_allocated;
png_bytep trans;
int num_trans;
png_color_16p trans_values;
png_structp png_ptr; png_structp png_ptr;
png_infop info_ptr; png_infop info_ptr;
Get_full_filename(filename, context->File_name, context->File_directory);
File_error=0;
if ((file=fopen(filename, "rb")))
{
// Load header (8 first bytes)
if (Read_bytes(file,png_header,8))
{
// Do we recognize a png file signature ?
if ( !png_sig_cmp(png_header, 0, 8))
{
// Prepare internal PNG loader // Prepare internal PNG loader
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_ptr) if (png_ptr)
@ -4270,6 +4253,11 @@ void Load_PNG(T_IO_Context * context)
int x,y; int x,y;
png_colorp palette; png_colorp palette;
int num_palette; int num_palette;
png_bytep * Row_pointers = NULL;
byte row_pointers_allocated = 0;
int num_trans;
png_bytep trans;
png_color_16p trans_values;
// 16-bit images // 16-bit images
if (bit_depth == 16) if (bit_depth == 16)
@ -4297,13 +4285,13 @@ void Load_PNG(T_IO_Context * context)
// Map low bpp greyscales to full 8bit (0-255 range) // Map low bpp greyscales to full 8bit (0-255 range)
if (bit_depth < 8) if (bit_depth < 8)
{ {
#if (PNG_LIBPNG_VER_MAJOR <= 1) && (PNG_LIBPNG_VER_MINOR < 4) #if (PNG_LIBPNG_VER_MAJOR <= 1) && (PNG_LIBPNG_VER_MINOR < 4)
// Works well with png 1.2.8, but deprecated in 1.4 ... // Works well with png 1.2.8, but deprecated in 1.4 ...
png_set_gray_1_2_4_to_8(png_ptr); png_set_gray_1_2_4_to_8(png_ptr);
#else #else
// ...where this seems to replace it: // ...where this seems to replace it:
png_set_expand_gray_1_2_4_to_8(png_ptr); png_set_expand_gray_1_2_4_to_8(png_ptr);
#endif #endif
} }
// Create greyscale palette // Create greyscale palette
@ -4461,8 +4449,28 @@ void Load_PNG(T_IO_Context * context)
else else
File_error=1; File_error=1;
} }
} }
/*Close_lecture();*/
void Load_PNG(T_IO_Context * context)
{
FILE *file; // Fichier du fichier
char filename[MAX_PATH_CHARACTERS]; // Nom complet du fichier
byte png_header[8];
Get_full_filename(filename, context->File_name, context->File_directory);
File_error=0;
if ((file=fopen(filename, "rb")))
{
// Load header (8 first bytes)
if (Read_bytes(file,png_header,8))
{
// Do we recognize a png file signature ?
if ( !png_sig_cmp(png_header, 0, 8))
Load_PNG_Sub(context, file);
else
File_error=2;
} }
else // Lecture header impossible: Error ne modifiant pas l'image else // Lecture header impossible: Error ne modifiant pas l'image
File_error=1; File_error=1;
@ -4483,6 +4491,7 @@ void Save_PNG(T_IO_Context * context)
png_infop info_ptr; png_infop info_ptr;
png_unknown_chunk crng_chunk; png_unknown_chunk crng_chunk;
byte cycle_data[16*6]; // Storage for color-cycling data, referenced by crng_chunk byte cycle_data[16*6]; // Storage for color-cycling data, referenced by crng_chunk
static png_bytep * Row_pointers;
Get_full_filename(filename, context->File_name, context->File_directory); Get_full_filename(filename, context->File_name, context->File_directory);
File_error=0; File_error=0;