diff --git a/src/cmdline_sprite.c b/src/cmdline_sprite.c index dff9acbf18..7f4c12974f 100644 --- a/src/cmdline_sprite.c +++ b/src/cmdline_sprite.c @@ -21,6 +21,7 @@ #include #include "cmdline.h" #include "drawing/drawing.h" +#include "image_io.h" #include "platform/platform.h" #include "util/util.h" #include "openrct2.h" @@ -168,33 +169,11 @@ bool sprite_file_export(int spriteIndex, const char *outPath) memcpy(spriteFilePalette, _standardPalette, 256 * 4); gfx_rle_sprite_to_buffer(spriteHeader->offset, pixels, (uint8*)spriteFilePalette, &dpi, IMAGE_TYPE_NO_BACKGROUND, 0, spriteHeader->height, 0, spriteHeader->width); - LodePNGState pngState; - unsigned int pngError; - unsigned char* pngData; - size_t pngSize; - - lodepng_state_init(&pngState); - pngState.info_raw.colortype = LCT_PALETTE; - lodepng_palette_add(&pngState.info_raw, 0, 0, 0, 0); - for (int i = 1; i < 256; i++) { - lodepng_palette_add( - &pngState.info_raw, - spriteFilePalette[i].r, - spriteFilePalette[i].g, - spriteFilePalette[i].b, - 255 - ); - } - - pngError = lodepng_encode(&pngData, &pngSize, pixels, spriteHeader->width, spriteHeader->height, &pngState); - if (pngError != 0) { - free(pngData); - fprintf(stderr, "Error creating PNG data, %u: %s", pngError, lodepng_error_text(pngError)); - return false; - } else { - lodepng_save_file(pngData, pngSize, outPath); - free(pngData); + if (image_io_png_write(&dpi, (rct_palette*)spriteFilePalette, outPath)) { return true; + } else { + fprintf(stderr, "Error writing PNG"); + return false; } } diff --git a/src/image_io.c b/src/image_io.c index 0dbb87ace5..d6e90decbc 100644 --- a/src/image_io.c +++ b/src/image_io.c @@ -61,6 +61,8 @@ bool image_io_png_write(const rct_drawpixelinfo *dpi, const rct_palette *palette png_ptr, info_ptr, dpi->width, dpi->height, 8, PNG_COLOR_TYPE_PALETTE, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT ); + png_byte transparentIndex = 0; + png_set_tRNS(png_ptr, info_ptr, &transparentIndex, 1, NULL); png_write_info(png_ptr, info_ptr); // Write pixels @@ -89,7 +91,8 @@ bool image_io_png_write(const rct_drawpixelinfo *dpi, const rct_palette *palette // Get image size int stride = dpi->width + dpi->pitch; - for (int i = 0; i < 256; i++) { + lodepng_palette_add(&state.info_raw, 0, 0, 0, 0); + for (int i = 1; i < 256; i++) { const rct_palette_entry *entry = &palette->entries[i]; uint8 r = entry->red; uint8 g = entry->green; @@ -100,6 +103,7 @@ bool image_io_png_write(const rct_drawpixelinfo *dpi, const rct_palette *palette error = lodepng_encode(&png, &pngSize, dpi->bits, stride, dpi->height, &state); if (error != 0) { + log_error("Error creating PNG data, %u: %s", error, lodepng_error_text(error)); free(png); return false; } else {