summaryrefslogtreecommitdiff
path: root/games/jezzball-kazzmir
diff options
context:
space:
mode:
authorB. Watson <yalhcru@gmail.com>2015-11-22 01:22:02 -0500
committerWilly Sudiarto Raharjo <willysr@slackbuilds.org>2015-11-28 07:26:17 +0700
commitd1e18febcd069fe2fac60cfed8c98d63c4ddbc7f (patch)
tree13521a86d47922a0991a19c3447b3f9c485e2981 /games/jezzball-kazzmir
parent6026b33f74e130f79bfc4264e0923e6201ea36df (diff)
downloadslackbuilds-d1e18febcd069fe2fac60cfed8c98d63c4ddbc7f.tar.gz
games/jezzball-kazzmir: Fix compile issue.
Diffstat (limited to 'games/jezzball-kazzmir')
-rw-r--r--games/jezzball-kazzmir/jezzball-kazzmir.SlackBuild6
-rw-r--r--games/jezzball-kazzmir/loadpng.diff900
2 files changed, 905 insertions, 1 deletions
diff --git a/games/jezzball-kazzmir/jezzball-kazzmir.SlackBuild b/games/jezzball-kazzmir/jezzball-kazzmir.SlackBuild
index 180547aba8..e35c6365dd 100644
--- a/games/jezzball-kazzmir/jezzball-kazzmir.SlackBuild
+++ b/games/jezzball-kazzmir/jezzball-kazzmir.SlackBuild
@@ -12,7 +12,7 @@
PRGNAM=jezzball-kazzmir
VERSION=${VERSION:-1.1}
-BUILD=${BUILD:-1}
+BUILD=${BUILD:-2}
TAG=${TAG:-_SBo}
if [ -z "$ARCH" ]; then
@@ -65,6 +65,10 @@ find -L . \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+# 20151122 bkw: use allegro4's loadpng instead of the bundled one. fixes
+# build on -current, does no harm on 14.1.
+patch -p1 < $CWD/loadpng.diff
+
sed -i 's,\./data\|data/,'"$DATADIR"',' src/main.cpp
sed -i 's,score\.jzb,'$SCOREDIR'/&,' src/score.cpp
diff --git a/games/jezzball-kazzmir/loadpng.diff b/games/jezzball-kazzmir/loadpng.diff
new file mode 100644
index 0000000000..64ab30a2ef
--- /dev/null
+++ b/games/jezzball-kazzmir/loadpng.diff
@@ -0,0 +1,900 @@
+diff -Naur jezzball-1.1/SConstruct jezzball-1.1.patched/SConstruct
+--- jezzball-1.1/SConstruct 2007-09-09 18:07:10.000000000 -0400
++++ jezzball-1.1.patched/SConstruct 2015-11-22 01:16:48.000000000 -0500
+@@ -27,18 +27,13 @@
+ score.cpp
+ """))
+
+-sources.append( map( lambda x: 'build/loadpng/%s' % x, Split("""
+-loadpng.c
+-regpng.c
+-savepng.c
+-""")));
+-
+ env.Append( LIBS = ['jpgal'] )
+
+ if isWindows():
+ env.Append( LIBS = ['png', 'alleg'] )
+ else:
+ env.ParseConfig( 'allegro-config --libs --cflags' )
++ env.Append( LIBS = ['loadpng'] )
+ env.ParseConfig( 'libpng-config --libs' )
+
+ env.Append( CCFLAGS = '-O2' )
+diff -Naur jezzball-1.1/src/loadpng/loadpng.c jezzball-1.1.patched/src/loadpng/loadpng.c
+--- jezzball-1.1/src/loadpng/loadpng.c 2007-09-09 18:02:37.000000000 -0400
++++ jezzball-1.1.patched/src/loadpng/loadpng.c 1969-12-31 19:00:00.000000000 -0500
+@@ -1,400 +0,0 @@
+-/* loadpng, Allegro wrapper routines for libpng
+- * by Peter Wang (tjaden@users.sf.net).
+- *
+- * This file is hereby placed in the public domain.
+- */
+-
+-
+-#include <png.h>
+-#include <allegro.h>
+-#include <allegro/internal/aintern.h>
+-#include "loadpng.h"
+-
+-/* We need internals _color_load_depth and _fixup_loaded_bitmap. The
+- * first can be replaced by the new get_color_depth() function which
+- * is in Allegro 4.1 branch. But it's not worth it to break 4.0
+- * compatibility.
+- */
+-
+-
+-
+-double _png_screen_gamma = -1.0;
+-int _png_compression_level = Z_BEST_COMPRESSION;
+-
+-
+-
+-/* get_gamma:
+- * Get screen gamma value one of three ways.
+- */
+-static double get_gamma(void)
+-{
+- if (_png_screen_gamma == -1.0) {
+- /* Use the environment variable if available.
+- * 2.2 is a good guess for PC monitors.
+- * 1.1 is good for my laptop.
+- */
+- AL_CONST char *gamma_str = getenv("SCREEN_GAMMA");
+- return (gamma_str) ? atof(gamma_str) : 2.2;
+- }
+-
+- return _png_screen_gamma;
+-}
+-
+-
+-
+-/* read_data:
+- * Custom read function to use Allegro packfile routines,
+- * rather than C streams (so we can read from datafiles!)
+- */
+-static void read_data(png_structp png_ptr, png_bytep data, png_uint_32 length)
+-{
+- PACKFILE *f = (PACKFILE *)png_get_io_ptr(png_ptr);
+- if ((png_uint_32)pack_fread(data, length, f) != length)
+- png_error(png_ptr, "read error (loadpng calling pack_fread)");
+-}
+-
+-
+-
+-/* check_if_png:
+- * Check if input file is really PNG format.
+- */
+-#define PNG_BYTES_TO_CHECK 4
+-
+-static int check_if_png(PACKFILE *fp)
+-{
+- unsigned char buf[PNG_BYTES_TO_CHECK];
+-
+- ASSERT(fp);
+-
+- if (pack_fread(buf, PNG_BYTES_TO_CHECK, fp) != PNG_BYTES_TO_CHECK)
+- return 0;
+-
+- return (png_sig_cmp(buf, (png_size_t)0, PNG_BYTES_TO_CHECK) == 0);
+-}
+-
+-
+-
+-/* really_load_png:
+- * Worker routine, used by load_png and load_memory_png.
+- */
+-static BITMAP *really_load_png(png_structp png_ptr, png_infop info_ptr, RGB *pal)
+-{
+- BITMAP *bmp;
+- PALETTE tmppal;
+- png_uint_32 width, height, rowbytes;
+- int bit_depth, color_type, interlace_type;
+- double image_gamma, screen_gamma;
+- int intent;
+- int bpp, dest_bpp;
+- int tRNS_to_alpha = FALSE;
+- int number_passes, pass;
+-
+- ASSERT(png_ptr && info_ptr && rgb);
+-
+- /* The call to png_read_info() gives us all of the information from the
+- * PNG file before the first IDAT (image data chunk).
+- */
+- png_read_info(png_ptr, info_ptr);
+-
+- png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,
+- &interlace_type, NULL, NULL);
+-
+- /* Extract multiple pixels with bit depths of 1, 2, and 4 from a single
+- * byte into separate bytes (useful for paletted and grayscale images).
+- */
+- png_set_packing(png_ptr);
+-
+- /* Expand grayscale images to the full 8 bits from 1, 2, or 4 bits/pixel */
+- if ((color_type == PNG_COLOR_TYPE_GRAY) && (bit_depth < 8))
+- png_set_expand(png_ptr);
+-
+- /* Adds a full alpha channel if there is transparency information
+- * in a tRNS chunk. */
+- if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) {
+- png_set_tRNS_to_alpha(png_ptr);
+- tRNS_to_alpha = TRUE;
+- }
+-
+- /* Convert 16-bits per colour component to 8-bits per colour component. */
+- if (bit_depth == 16)
+- png_set_strip_16(png_ptr);
+-
+- /* Convert grayscale to RGB triplets */
+- if ((color_type == PNG_COLOR_TYPE_GRAY) ||
+- (color_type == PNG_COLOR_TYPE_GRAY_ALPHA))
+- png_set_gray_to_rgb(png_ptr);
+-
+- /* Optionally, tell libpng to handle the gamma correction for us. */
+- if (_png_screen_gamma != 0.0) {
+- screen_gamma = get_gamma();
+-
+- if (png_get_sRGB(png_ptr, info_ptr, &intent))
+- png_set_gamma(png_ptr, screen_gamma, 0.45455);
+- else {
+- if (png_get_gAMA(png_ptr, info_ptr, &image_gamma))
+- png_set_gamma(png_ptr, screen_gamma, image_gamma);
+- else
+- png_set_gamma(png_ptr, screen_gamma, 0.45455);
+- }
+- }
+-
+- /* Turn on interlace handling. */
+- number_passes = png_set_interlace_handling(png_ptr);
+-
+- /* Call to gamma correct and add the background to the palette
+- * and update info structure.
+- */
+- png_read_update_info(png_ptr, info_ptr);
+-
+- /* Even if the user doesn't supply space for a palette, we want
+- * one for the load process.
+- */
+- if (!pal)
+- pal = tmppal;
+-
+- /* Palettes. */
+- if (color_type & PNG_COLOR_MASK_PALETTE) {
+- int num_palette, i;
+- png_colorp palette;
+-
+- if (png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette)) {
+- /* We don't actually dither, we just copy the palette. */
+- for (i = 0; ((i < num_palette) && (i < 256)); i++) {
+- pal[i].r = palette[i].red >> 2; /* 256 -> 64 */
+- pal[i].g = palette[i].green >> 2;
+- pal[i].b = palette[i].blue >> 2;
+- }
+-
+- for (; i < 256; i++)
+- pal[i].r = pal[i].g = pal[i].b = 0;
+- }
+- }
+- else {
+- generate_332_palette(pal);
+- }
+-
+- rowbytes = png_get_rowbytes(png_ptr, info_ptr);
+-
+- /* Allocate the memory to hold the image using the fields of info_ptr. */
+- bpp = rowbytes * 8 / width;
+-
+- /* Allegro cannot handle less than 8 bpp. */
+- if (bpp < 8)
+- bpp = 8;
+-
+- dest_bpp = _color_load_depth(bpp, (bpp == 32));
+- bmp = create_bitmap_ex(bpp, width, height);
+-
+- /* Maybe flip RGB to BGR. */
+- if ((bpp == 24) || (bpp == 32)) {
+- int c = makecol_depth(bpp, 0, 0, 255);
+- unsigned char *pc = (unsigned char *)&c;
+- if (pc[0] == 255)
+- png_set_bgr(png_ptr);
+-#ifdef ALLEGRO_BIG_ENDIAN
+- png_set_swap_alpha(png_ptr);
+-#endif
+- }
+-
+- /* Read the image, one line at a line (easier to debug!) */
+- for (pass = 0; pass < number_passes; pass++) {
+- png_uint_32 y;
+- for (y = 0; y < height; y++)
+- png_read_row(png_ptr, bmp->line[y], NULL);
+- }
+-
+- /* Let Allegro convert the image into the desired colour depth. */
+- if (dest_bpp != bpp)
+- bmp = _fixup_loaded_bitmap(bmp, pal, dest_bpp);
+-
+- /* Read rest of file, and get additional chunks in info_ptr. */
+- png_read_end(png_ptr, info_ptr);
+-
+- return bmp;
+-}
+-
+-
+-
+-/* load_png:
+- * Load a PNG file from disk, doing colour coversion if required.
+- */
+-BITMAP *load_png(AL_CONST char *filename, RGB *pal)
+-{
+- PACKFILE *fp;
+- BITMAP *bmp;
+-
+- ASSERT(filename);
+-
+- fp = pack_fopen(filename, "r");
+- if (!fp)
+- return NULL;
+-
+- bmp = load_png_pf(fp, pal);
+-
+- pack_fclose(fp);
+-
+- return bmp;
+-}
+-
+-
+-
+-/* load_png_pf:
+- * Load a PNG file from disk, doing colour coversion if required.
+- */
+-BITMAP *load_png_pf(PACKFILE *fp, RGB *pal)
+-{
+- BITMAP *bmp;
+- png_structp png_ptr;
+- png_infop info_ptr;
+-
+- ASSERT(fp);
+-
+- if (!check_if_png(fp)) {
+- 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) {
+- 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);
+- return NULL;
+- }
+-
+- /* Set error handling if you are using the setjmp/longjmp method (this is
+- * the normal method of doing things with libpng). REQUIRED unless you
+- * set up your own error handlers in the png_create_read_struct() earlier.
+- */
+- if (setjmp(png_ptr->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 */
+- return 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, pal);
+-
+- /* Clean up after the read, and free any memory allocated. */
+- png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
+-
+- return bmp;
+-}
+-
+-
+-
+-/* read_data_memory:
+- * Custom reader function to read a PNG file from a memory buffer.
+- */
+-
+-typedef struct {
+- AL_CONST unsigned char *buffer;
+- png_uint_32 bufsize;
+- png_uint_32 current_pos;
+-} MEMORY_READER_STATE;
+-
+-static void read_data_memory(png_structp png_ptr, png_bytep data, png_uint_32 length)
+-{
+- MEMORY_READER_STATE *f = (MEMORY_READER_STATE *)png_get_io_ptr(png_ptr);
+-
+- if (length > (f->bufsize - f->current_pos))
+- png_error(png_ptr, "read error in read_data_memory (loadpng)");
+-
+- memcpy(data, f->buffer + f->current_pos, length);
+- f->current_pos += length;
+-}
+-
+-
+-
+-/* check_if_png_memory:
+- * Check if input buffer is really PNG format.
+- */
+-static int check_if_png_memory(AL_CONST void *buffer)
+-{
+- unsigned char *buf = (unsigned char *)buffer;
+- return (png_sig_cmp(buf, (png_size_t)0, PNG_BYTES_TO_CHECK) == 0);
+-}
+-
+-
+-
+-/* load_memory_png:
+- * Load a PNG file from memory, doing colour coversion if required.
+- */
+-BITMAP *load_memory_png(AL_CONST void *buffer, int bufsize, RGB *pal)
+-{
+- MEMORY_READER_STATE memory_reader_state;
+- BITMAP *bmp;
+- png_structp png_ptr;
+- png_infop info_ptr;
+-
+- if (!buffer || (bufsize <= 0))
+- return NULL;
+-
+- if (!check_if_png_memory(buffer))
+- 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)
+- 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);
+- return NULL;
+- }
+-
+- /* Set error handling if you are using the setjmp/longjmp method (this is
+- * the normal method of doing things with libpng). REQUIRED unless you
+- * set up your own error handlers in the png_create_read_struct() earlier.
+- */
+- if (setjmp(png_ptr->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 */
+- return NULL;
+- }
+-
+- /* Set up the reader state. */
+- memory_reader_state.buffer = (unsigned char *)buffer;
+- memory_reader_state.bufsize = bufsize;
+- memory_reader_state.current_pos = PNG_BYTES_TO_CHECK;
+-
+- /* Tell libpng to use our custom reader. */
+- png_set_read_fn(png_ptr, &memory_reader_state, (png_rw_ptr)read_data_memory);
+-
+- /* 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, pal);
+-
+- /* Clean up after the read, and free any memory allocated. */
+- png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
+-
+- return bmp;
+-}
+diff -Naur jezzball-1.1/src/loadpng/loadpng.h jezzball-1.1.patched/src/loadpng/loadpng.h
+--- jezzball-1.1/src/loadpng/loadpng.h 2007-09-09 18:02:37.000000000 -0400
++++ jezzball-1.1.patched/src/loadpng/loadpng.h 1969-12-31 19:00:00.000000000 -0500
+@@ -1,75 +0,0 @@
+-/* loadpng.h */
+-/* This file is hereby placed in the public domain. */
+-#ifndef _included_loadpng_h_
+-#define _included_loadpng_h_
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-
+-
+-/* Overkill :-) */
+-#define LOADPNG_VERSION 1
+-#define LOADPNG_SUBVERSION 5
+-#define LOADPNG_VERSIONSTR "1.5"
+-
+-
+-/* _png_screen_gamma is slightly overloaded (sorry):
+- *
+- * A value of 0.0 means: Don't do any gamma correction in load_png()
+- * and load_memory_png(). This meaning was introduced in v1.4.
+- *
+- * A value of -1.0 means: Use the value from the environment variable
+- * SCREEN_GAMMA (if available), otherwise fallback to a value of 2.2
+- * (a good guess for PC monitors, and the value for sRGB colourspace).
+- * This is the default.
+- *
+- * Otherwise, the value of _png_screen_gamma is taken as-is.
+- */
+-extern double _png_screen_gamma;
+-
+-
+-/* Choose zlib compression level for saving file.
+- * Default is Z_BEST_COMPRESSION.
+- */
+-extern int _png_compression_level;
+-
+-
+-/* Load a PNG from disk. */
+-extern BITMAP *load_png(AL_CONST char *filename, RGB *pal);
+-
+-/* Load a PNG from some place. */
+-extern BITMAP *load_png_pf(PACKFILE *fp, RGB *pal);
+-
+-/* Load a PNG from memory. */
+-extern BITMAP *load_memory_png(AL_CONST void *buffer, int buffer_size, RGB *pal);
+-
+-/* Save a bitmap to disk in PNG format. */
+-extern int save_png(AL_CONST char *filename, BITMAP *bmp, AL_CONST RGB *pal);
+-
+-/* Adds `PNG' to Allegro's internal file type table.
+- * You can then just use load_bitmap and save_bitmap as usual.
+- */
+-extern void register_png_file_type(void);
+-
+-/* Register an datafile type ID with Allegro, so that when an object
+- * with that type ID is encountered while loading a datafile, that
+- * object will be loaded as a PNG file.
+- */
+-extern void register_png_datafile_object(int id);
+-
+-/* This is supposed to resemble jpgalleg_init in JPGalleg 2.0, just in
+- * case you are lazier than lazy. It contains these 3 lines of code:
+- * register_png_datafile_object(DAT_ID('P','N','G',' '));
+- * register_png_file_type();
+- * return 0;
+- */
+-extern int loadpng_init(void);
+-
+-
+-#ifdef __cplusplus
+-}
+-#endif
+-
+-#endif /* _included_loadpng_h */
+diff -Naur jezzball-1.1/src/loadpng/regpng.c jezzball-1.1.patched/src/loadpng/regpng.c
+--- jezzball-1.1/src/loadpng/regpng.c 2007-09-09 18:02:37.000000000 -0400
++++ jezzball-1.1.patched/src/loadpng/regpng.c 1969-12-31 19:00:00.000000000 -0500
+@@ -1,68 +0,0 @@
+-/* loadpng, Allegro wrapper routines for libpng
+- * by Peter Wang (tjaden@users.sf.net).
+- *
+- * This file is hereby placed in the public domain.
+- */
+-
+-
+-#include <allegro.h>
+-#include "loadpng.h"
+-
+-
+-
+-/* register_png_file_type:
+- */
+-void register_png_file_type(void)
+-{
+- register_bitmap_file_type("png", load_png, save_png);
+-}
+-
+-
+-
+-/* register_png_datafile_object:
+- */
+-
+-static void *load_datafile_png(PACKFILE *f, long size)
+-{
+- BITMAP *bmp;
+- void *buffer;
+-
+- buffer = malloc(size);
+- if (!buffer)
+- return NULL;
+-
+- if (pack_fread(buffer, size, f) != size) {
+- free(buffer);
+- return NULL;
+- }
+-
+- bmp = load_memory_png(buffer, size, NULL);
+-
+- free(buffer);
+-
+- return bmp;
+-}
+-
+-static void destroy_datafile_png(void *data)
+-{
+- if (data) {
+- destroy_bitmap((BITMAP *)data);
+- }
+-}
+-
+-void register_png_datafile_object(int id)
+-{
+- register_datafile_object(id, load_datafile_png, destroy_datafile_png);
+-}
+-
+-
+-
+-/* loadpng_init:
+- * This is supposed to resemble jpgalleg_init in JPGalleg 2.0.
+- */
+-int loadpng_init(void)
+-{
+- register_png_datafile_object(DAT_ID('P','N','G',' '));
+- register_png_file_type();
+- return 0;
+-}
+diff -Naur jezzball-1.1/src/loadpng/savepng.c jezzball-1.1.patched/src/loadpng/savepng.c
+--- jezzball-1.1/src/loadpng/savepng.c 2007-09-09 18:02:37.000000000 -0400
++++ jezzball-1.1.patched/src/loadpng/savepng.c 1969-12-31 19:00:00.000000000 -0500
+@@ -1,306 +0,0 @@
+-/* loadpng, Allegro wrapper routines for libpng
+- * by Peter Wang (tjaden@users.sf.net).
+- *
+- * This file is hereby placed in the public domain.
+- */
+-
+-
+-#include <png.h>
+-#include <allegro.h>
+-#include "loadpng.h"
+-
+-
+-
+-/* write_data:
+- * Custom write function to use Allegro packfile routines,
+- * rather than C streams.
+- */
+-static void write_data(png_structp png_ptr, png_bytep data, png_uint_32 length)
+-{
+- PACKFILE *f = (PACKFILE *)png_get_io_ptr(png_ptr);
+- if ((png_uint_32)pack_fwrite(data, length, f) != length)
+- png_error(png_ptr, "write error (loadpng calling pack_fwrite)");
+-}
+-
+-/* Don't think Allegro has any problem with buffering
+- * (rather, Allegro provides no way to flush packfiles).
+- */
+-static void flush_data(png_structp png_ptr) { (void)png_ptr; }
+-
+-
+-
+-/* save_indexed:
+- * Core save routine for 8 bpp images.
+- * */
+-static int save_indexed(png_structp png_ptr, BITMAP *bmp)
+-{
+- ASSERT(bitmap_color_depth(bmp) == 8);
+-
+- if (is_memory_bitmap(bmp)) { /* fast path */
+- int y;
+-
+- for (y=0; y<bmp->h; y++) {
+- png_write_row(png_ptr, bmp->line[y]);
+- }
+-
+- return 1;
+- }
+- else { /* generic case */
+- unsigned char *rowdata;
+- int x, y;
+-
+- rowdata = (unsigned char *)malloc(bmp->w * 3);
+- if (!rowdata)
+- return 0;
+-
+- for (y=0; y<bmp->h; y++) {
+- unsigned char *p = rowdata;
+-
+- for (x=0; x<bmp->w; x++) {
+- *p++ = getpixel(bmp, x, y);
+- }
+-
+- png_write_row(png_ptr, rowdata);
+- }
+-
+- free(rowdata);
+-
+- return 1;
+- }
+-}
+-
+-
+-
+-/* save_rgb:
+- * Core save routine for 15/16/24 bpp images (original by Martijn Versteegh).
+- */
+-static int save_rgb(png_structp png_ptr, BITMAP *bmp)
+-{
+- AL_CONST int depth = bitmap_color_depth(bmp);
+- unsigned char *rowdata;
+- int y, x;
+-
+- ASSERT(depth == 15 || depth == 16 || depth == 24);
+-
+- rowdata = (unsigned char *)malloc(bmp->w * 3);
+- if (!rowdata)
+- return 0;
+-
+- for (y=0; y<bmp->h; y++) {
+- unsigned char *p = rowdata;
+-
+- if (depth == 15) {
+- for (x = 0; x < bmp->w; x++) {
+- int c = getpixel(bmp, x, y);
+- *p++ = getr15(c);
+- *p++ = getg15(c);
+- *p++ = getb15(c);
+- }
+- }
+- else if (depth == 16) {
+- for (x = 0; x < bmp->w; x++) {
+- int c = getpixel(bmp, x, y);
+- *p++ = getr16(c);
+- *p++ = getg16(c);
+- *p++ = getb16(c);
+- }
+- }
+- else { /* depth == 24 */
+- for (x = 0; x < bmp->w; x++) {
+- int c = getpixel(bmp, x, y);
+- *p++ = getr24(c);
+- *p++ = getg24(c);
+- *p++ = getb24(c);
+- }
+- }
+-
+- png_write_row(png_ptr, rowdata);
+- }
+-
+- free(rowdata);
+-
+- return 1;
+-}
+-
+-
+-
+-/* save_rgba:
+- * Core save routine for 32 bpp images.
+- */
+-static int save_rgba(png_structp png_ptr, BITMAP *bmp)
+-{
+- unsigned char *rowdata;
+- int x, y;
+-
+- ASSERT(bitmap_color_depth(bmp) == 32);
+-
+- rowdata = (unsigned char *)malloc(bmp->w * 4);
+- if (!rowdata)
+- return 0;
+-
+- for (y=0; y<bmp->h; y++) {
+- unsigned char *p = rowdata;
+-
+- for (x=0; x<bmp->w; x++) {
+- int c = getpixel(bmp, x, y);
+- *p++ = getr32(c);
+- *p++ = getg32(c);
+- *p++ = getb32(c);
+- *p++ = geta32(c);
+- }
+-
+- png_write_row(png_ptr, rowdata);
+- }
+-
+- free(rowdata);
+-
+- return 1;
+-}
+-
+-
+-
+-/* save_png:
+- * Writes a non-interlaced, no-frills PNG, taking the usual save_xyz
+- * parameters. Returns non-zero on error.
+- */
+-static int really_save_png(PACKFILE *fp, BITMAP *bmp, AL_CONST RGB *pal)
+-{
+- png_structp png_ptr = NULL;
+- png_infop info_ptr = NULL;
+- int depth;
+- int colour_type;
+-
+- depth = bitmap_color_depth(bmp);
+- if (depth == 8 && !pal)
+- return -1;
+-
+- /* Create and initialize the png_struct with the
+- * desired error handler functions.
+- */
+- png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
+- (void *)NULL, NULL, NULL);
+- if (!png_ptr)
+- goto Error;
+-
+- /* Allocate/initialize the image information data. */
+- info_ptr = png_create_info_struct(png_ptr);
+- if (!info_ptr)
+- goto Error;
+-
+- /* Set error handling. */
+- if (setjmp(png_ptr->jmpbuf)) {
+- /* If we get here, we had a problem reading the file. */
+- goto Error;
+- }
+-
+- /* Use packfile routines. */
+- png_set_write_fn(png_ptr, fp, (png_rw_ptr)write_data, flush_data);
+-
+- /* Set the image information here. Width and height are up to 2^31,
+- * bit_depth is one of 1, 2, 4, 8, or 16, but valid values also depend on
+- * the color_type selected. color_type is one of PNG_COLOR_TYPE_GRAY,
+- * PNG_COLOR_TYPE_GRAY_ALPHA, PNG_COLOR_TYPE_PALETTE, PNG_COLOR_TYPE_RGB,
+- * or PNG_COLOR_TYPE_RGB_ALPHA. interlace is either PNG_INTERLACE_NONE or
+- * PNG_INTERLACE_ADAM7, and the compression_type and filter_type MUST
+- * currently be PNG_COMPRESSION_TYPE_BASE and PNG_FILTER_TYPE_BASE.
+- */
+- if (depth == 8)
+- colour_type = PNG_COLOR_TYPE_PALETTE;
+- else if (depth == 32)
+- colour_type = PNG_COLOR_TYPE_RGB_ALPHA;
+- else
+- colour_type = PNG_COLOR_TYPE_RGB;
+-
+- /* Set compression level. */
+- png_set_compression_level(png_ptr, _png_compression_level);
+-
+- png_set_IHDR(png_ptr, info_ptr, bmp->w, bmp->h, 8, colour_type,
+- PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE,
+- PNG_FILTER_TYPE_BASE);
+-
+- /* Set the palette if there is one. Required for indexed-color images. */
+- if (colour_type == PNG_COLOR_TYPE_PALETTE) {
+- png_color palette[256];
+- int i;
+-
+- for (i = 0; i < 256; i++) {
+- palette[i].red = _rgb_scale_6[pal[i].r]; /* 64 -> 256 */
+- palette[i].green = _rgb_scale_6[pal[i].g];
+- palette[i].blue = _rgb_scale_6[pal[i].b];
+- }
+-
+- /* Set palette colors. */
+- png_set_PLTE(png_ptr, info_ptr, palette, 256);
+- }
+-
+- /* Optionally write comments into the image ... Nah. */
+-
+- /* Write the file header information. */
+- png_write_info(png_ptr, info_ptr);
+-
+- /* Once we write out the header, the compression type on the text
+- * chunks gets changed to PNG_TEXT_COMPRESSION_NONE_WR or
+- * PNG_TEXT_COMPRESSION_zTXt_WR, so it doesn't get written out again
+- * at the end.
+- */
+-
+- /* Save the data. */
+- switch (depth) {
+- case 8:
+- if (!save_indexed(png_ptr, bmp))
+- goto Error;
+- break;
+- case 15:
+- case 16:
+- case 24:
+- if (!save_rgb(png_ptr, bmp))
+- goto Error;
+- break;
+- case 32:
+- if (!save_rgba(png_ptr, bmp))
+- goto Error;
+- break;
+- default:
+- ASSERT(FALSE);
+- goto Error;
+- }
+-
+- png_write_end(png_ptr, info_ptr);
+-
+- png_destroy_write_struct(&png_ptr, &info_ptr);
+-
+- return 0;
+-
+- Error:
+-
+- if (png_ptr) {
+- if (info_ptr)
+- png_destroy_write_struct(&png_ptr, &info_ptr);
+- else
+- png_destroy_write_struct(&png_ptr, NULL);
+- }
+-
+- return -1;
+-}
+-
+-
+-int save_png(AL_CONST char *filename, BITMAP *bmp, AL_CONST RGB *pal)
+-{
+- PACKFILE *fp;
+- int result;
+-
+- ASSERT(filename);
+- ASSERT(bmp);
+-
+- fp = pack_fopen(filename, "w");
+- if (!fp)
+- return -1;
+-
+- acquire_bitmap(bmp);
+- result = really_save_png(fp, bmp, pal);
+- release_bitmap(bmp);
+-
+- pack_fclose(fp);
+-
+- return result;
+-}
+diff -Naur jezzball-1.1/src/main.cpp jezzball-1.1.patched/src/main.cpp
+--- jezzball-1.1/src/main.cpp 2007-09-09 18:07:10.000000000 -0400
++++ jezzball-1.1.patched/src/main.cpp 2015-11-22 01:14:03.000000000 -0500
+@@ -2,7 +2,7 @@
+ #include <stdio.h>
+ #include <time.h>
+ #include <stdlib.h>
+-#include "loadpng/loadpng.h"
++#include <loadpng.h>
+ #include <jpgalleg.h>
+ #include "game.h"
+ #include "mouse.h"