* Use a variable sized array for the scanline array
allocated on the stack instead of the heap, which usually is a lot faster => stack alloc = O(1), heap (malloc=heap allocater) usually O(n) or O(log n) git-svn-id: svn+ssh://svn.gna.org/svn/warzone/trunk@1522 4a71c877-e1ca-e34f-864e-861f7616d084master
parent
b45388b30a
commit
486ac3ed11
|
@ -375,26 +375,23 @@ static void wzpng_flush_data(png_structp png_ptr)
|
||||||
|
|
||||||
// End of PNG callbacks
|
// End of PNG callbacks
|
||||||
|
|
||||||
static inline void PNGCleanup(png_infop *info_ptr, png_structp *png_ptr, const unsigned char** scanlines)
|
static inline void PNGCleanup(png_infop *info_ptr, png_structp *png_ptr)
|
||||||
{
|
{
|
||||||
if (*info_ptr != NULL)
|
if (*info_ptr != NULL)
|
||||||
png_destroy_info_struct(*png_ptr, info_ptr);
|
png_destroy_info_struct(*png_ptr, info_ptr);
|
||||||
if (*png_ptr != NULL)
|
if (*png_ptr != NULL)
|
||||||
png_destroy_write_struct(png_ptr, NULL);
|
png_destroy_write_struct(png_ptr, NULL);
|
||||||
if (scanlines != NULL)
|
|
||||||
free(scanlines);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void screen_DumpPNG(PHYSFS_file* fileHandle, const unsigned char* inputBuffer, unsigned int width, unsigned int height, unsigned int channels)
|
static inline void screen_DumpPNG(PHYSFS_file* fileHandle, const unsigned char* inputBuffer, unsigned int width, unsigned int height, unsigned int channels)
|
||||||
{
|
{
|
||||||
const unsigned char** scanlines = NULL;
|
|
||||||
png_infop info_ptr = NULL;
|
png_infop info_ptr = NULL;
|
||||||
png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
|
png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
|
||||||
|
|
||||||
if (png_ptr == NULL)
|
if (png_ptr == NULL)
|
||||||
{
|
{
|
||||||
debug(LOG_ERROR, "screen_DumpPNG: Unable to create png struct\n");
|
debug(LOG_ERROR, "screen_DumpPNG: Unable to create png struct\n");
|
||||||
return PNGCleanup(&info_ptr, &png_ptr, scanlines);
|
return PNGCleanup(&info_ptr, &png_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
info_ptr = png_create_info_struct(png_ptr);
|
info_ptr = png_create_info_struct(png_ptr);
|
||||||
|
@ -402,7 +399,7 @@ static inline void screen_DumpPNG(PHYSFS_file* fileHandle, const unsigned char*
|
||||||
if (info_ptr == NULL)
|
if (info_ptr == NULL)
|
||||||
{
|
{
|
||||||
debug(LOG_ERROR, "screen_DumpPNG: Unable to create png info struct\n");
|
debug(LOG_ERROR, "screen_DumpPNG: Unable to create png info struct\n");
|
||||||
return PNGCleanup(&info_ptr, &png_ptr, scanlines);
|
return PNGCleanup(&info_ptr, &png_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If libpng encounters an error, it will jump into this if-branch
|
// If libpng encounters an error, it will jump into this if-branch
|
||||||
|
@ -413,15 +410,9 @@ static inline void screen_DumpPNG(PHYSFS_file* fileHandle, const unsigned char*
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
unsigned int currentRow;
|
unsigned int currentRow;
|
||||||
|
const unsigned char* scanlines[height];
|
||||||
unsigned int row_stride = width * channels;
|
unsigned int row_stride = width * channels;
|
||||||
|
|
||||||
scanlines = malloc(sizeof(const unsigned char*) * height);
|
|
||||||
if (scanlines == NULL)
|
|
||||||
{
|
|
||||||
debug(LOG_ERROR, "screen_DumpPNG: Couldn't allocate memory\n");
|
|
||||||
return PNGCleanup(&info_ptr, &png_ptr, scanlines);
|
|
||||||
}
|
|
||||||
|
|
||||||
png_set_write_fn(png_ptr, fileHandle, wzpng_write_data, wzpng_flush_data);
|
png_set_write_fn(png_ptr, fileHandle, wzpng_write_data, wzpng_flush_data);
|
||||||
|
|
||||||
// Set the compression level of ZLIB
|
// Set the compression level of ZLIB
|
||||||
|
@ -466,7 +457,7 @@ static inline void screen_DumpPNG(PHYSFS_file* fileHandle, const unsigned char*
|
||||||
png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
|
png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return PNGCleanup(&info_ptr, &png_ptr, scanlines);
|
return PNGCleanup(&info_ptr, &png_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Retrieves the currently displayed screen and throws it in a buffer
|
/** Retrieves the currently displayed screen and throws it in a buffer
|
||||||
|
|
Loading…
Reference in New Issue