mirror of https://github.com/mgba-emu/mgba.git
Util: Add 8-bit PNG write support
This commit is contained in:
parent
e4d3aefb4a
commit
cea83a5444
1
CHANGES
1
CHANGES
|
@ -60,6 +60,7 @@ Misc:
|
||||||
- Qt: Automatically load controller profile when plugged in
|
- Qt: Automatically load controller profile when plugged in
|
||||||
- OpenGL: Add xBR-lv2 shader
|
- OpenGL: Add xBR-lv2 shader
|
||||||
- GBA, GB: ROM is now unloaded if a patch is applied
|
- GBA, GB: ROM is now unloaded if a patch is applied
|
||||||
|
- Util: Add 8-bit PNG write support
|
||||||
|
|
||||||
0.5.2: (2016-12-31)
|
0.5.2: (2016-12-31)
|
||||||
Bugfixes:
|
Bugfixes:
|
||||||
|
|
|
@ -22,7 +22,10 @@ enum {
|
||||||
|
|
||||||
png_structp PNGWriteOpen(struct VFile* source);
|
png_structp PNGWriteOpen(struct VFile* source);
|
||||||
png_infop PNGWriteHeader(png_structp png, unsigned width, unsigned height);
|
png_infop PNGWriteHeader(png_structp png, unsigned width, unsigned height);
|
||||||
|
png_infop PNGWriteHeader8(png_structp png, unsigned width, unsigned height);
|
||||||
|
bool PNGWritePalette(png_structp png, png_infop info, const uint32_t* palette, unsigned entries);
|
||||||
bool PNGWritePixels(png_structp png, unsigned width, unsigned height, unsigned stride, const void* pixels);
|
bool PNGWritePixels(png_structp png, unsigned width, unsigned height, unsigned stride, const void* pixels);
|
||||||
|
bool PNGWritePixels8(png_structp png, unsigned width, unsigned height, unsigned stride, const void* pixels);
|
||||||
bool PNGWriteCustomChunk(png_structp png, const char* name, size_t size, void* data);
|
bool PNGWriteCustomChunk(png_structp png, const char* name, size_t size, void* data);
|
||||||
void PNGWriteClose(png_structp png, png_infop info);
|
void PNGWriteClose(png_structp png, png_infop info);
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,40 @@ png_infop PNGWriteHeader(png_structp png, unsigned width, unsigned height) {
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
png_infop PNGWriteHeader8(png_structp png, unsigned width, unsigned height) {
|
||||||
|
png_infop info = png_create_info_struct(png);
|
||||||
|
if (!info) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (setjmp(png_jmpbuf(png))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
png_set_IHDR(png, info, width, height, 8, PNG_COLOR_TYPE_PALETTE, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PNGWritePalette(png_structp png, png_infop info, const uint32_t* palette, unsigned entries) {
|
||||||
|
if (!palette || !entries) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (setjmp(png_jmpbuf(png))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
png_color colors[256];
|
||||||
|
png_byte trans[256];
|
||||||
|
unsigned i;
|
||||||
|
for (i = 0; i < entries && i < 256; ++i) {
|
||||||
|
colors[i].red = palette[i];
|
||||||
|
colors[i].green = palette[i] >> 8;
|
||||||
|
colors[i].blue = palette[i] >> 16;
|
||||||
|
trans[i] = palette[i] >> 24;
|
||||||
|
}
|
||||||
|
png_set_PLTE(png, info, colors, entries);
|
||||||
|
png_set_tRNS(png, info, trans, entries, NULL);
|
||||||
|
png_write_info(png, info);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool PNGWritePixels(png_structp png, unsigned width, unsigned height, unsigned stride, const void* pixels) {
|
bool PNGWritePixels(png_structp png, unsigned width, unsigned height, unsigned stride, const void* pixels) {
|
||||||
png_bytep row = malloc(sizeof(png_byte) * width * 3);
|
png_bytep row = malloc(sizeof(png_byte) * width * 3);
|
||||||
if (!row) {
|
if (!row) {
|
||||||
|
@ -94,6 +128,19 @@ bool PNGWritePixels(png_structp png, unsigned width, unsigned height, unsigned s
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool PNGWritePixels8(png_structp png, unsigned width, unsigned height, unsigned stride, const void* pixels) {
|
||||||
|
UNUSED(width);
|
||||||
|
const png_byte* pixelData = pixels;
|
||||||
|
if (setjmp(png_jmpbuf(png))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
unsigned i;
|
||||||
|
for (i = 0; i < height; ++i) {
|
||||||
|
png_write_row(png, &pixelData[stride * i]);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool PNGWriteCustomChunk(png_structp png, const char* name, size_t size, void* data) {
|
bool PNGWriteCustomChunk(png_structp png, const char* name, size_t size, void* data) {
|
||||||
char realName[5];
|
char realName[5];
|
||||||
strncpy(realName, name, 4);
|
strncpy(realName, name, 4);
|
||||||
|
|
Loading…
Reference in New Issue