/* Load a PNG file from disk, doing colour coversion if required. */ ALLEGRO_BITMAP *_al_load_png_f(ALLEGRO_FILE *fp, int flags) { jmp_buf jmpbuf; ALLEGRO_BITMAP *bmp; png_structp png_ptr; png_infop info_ptr; ALLEGRO_ASSERT(fp); if (!check_if_png(fp)) { ALLEGRO_ERROR("Not a png.\n"); return NULL; } /* Create and initialize the png_struct with the desired error handler * functions. If you want to use the default stderr and longjump method, * you can supply NULL for the last three parameters. We also supply the * the compiler header file version, so that we know if the application * was compiled with a compatible version of the library. */ png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, (void *)NULL, NULL, NULL); if (!png_ptr) { ALLEGRO_ERROR("png_ptr == NULL\n"); return NULL; } /* Allocate/initialize the memory for image information. */ info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { png_destroy_read_struct(&png_ptr, (png_infopp) NULL, (png_infopp) NULL); ALLEGRO_ERROR("png_create_info_struct failed\n"); return NULL; } /* Set error handling. */ if (setjmp(jmpbuf)) { /* Free all of the memory associated with the png_ptr and info_ptr */ png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp) NULL); /* If we get here, we had a problem reading the file */ ALLEGRO_ERROR("Error reading PNG file\n"); return NULL; } png_set_error_fn(png_ptr, jmpbuf, user_error_fn, NULL); /* Use Allegro packfile routines. */ png_set_read_fn(png_ptr, fp, (png_rw_ptr) read_data); /* We have already read some of the signature. */ png_set_sig_bytes(png_ptr, PNG_BYTES_TO_CHECK); /* Really load the image now. */ bmp = really_load_png(png_ptr, info_ptr, flags); /* Clean up after the read, and free any memory allocated. */ png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp) NULL); return bmp; }
unicap_status_t ucil_load_png( char *filename, unicap_data_buffer_t *buffer ) { FILE *f; if( !check_if_png( filename, &f ) ) { TRACE( "File '%s' is not a valid PNG image\n", filename ); return STATUS_FAILURE; } if( read_png( f, PNG_BYTES_TO_CHECK, buffer ) < 0 ) { TRACE( "File '%s' could not be loaded\n", filename ); return STATUS_FAILURE; } return STATUS_SUCCESS; }