Mercurial > repos > blastem
diff png.c @ 2685:da2e06c42d16
Add a compile-time flag to use RGB565 instead of ABGR/ARGB
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 30 Mar 2025 00:06:53 -0700 |
parents | 0111c8344477 |
children |
line wrap: on
line diff
--- a/png.c Sat Mar 29 23:54:45 2025 -0700 +++ b/png.c Sun Mar 30 00:06:53 2025 -0700 @@ -60,25 +60,37 @@ write_chunk(f, ihdr, chunk, sizeof(chunk)); } -void save_png24_frame(FILE *f, uint32_t *buffer, apng_state *apng, uint32_t width, uint32_t height, uint32_t pitch) +void save_png24_frame(FILE *f, pixel_t *buffer, apng_state *apng, uint32_t width, uint32_t height, uint32_t pitch) { uint32_t idat_size = (1 + width*3) * height; uint8_t *idat_buffer = malloc(idat_size); - uint32_t *pixel = buffer; + pixel_t *pixel = buffer; uint8_t *cur = idat_buffer; for (uint32_t y = 0; y < height; y++) { //save filter type *(cur++) = 0; - uint32_t *start = pixel; + pixel_t *start = pixel; for (uint32_t x = 0; x < width; x++, pixel++) { - uint32_t value = *pixel; + pixel_t value = *pixel; +#ifdef USE_RGB565 + *(cur++) = (value >> 8 & 0xF8) | (value >> (8+5)); + *(cur++) = (value >> 3 & 0xFC) | (value >> (3+5) & 0x3); + *(cur++) = value << 3 | (value >> (5-3) & 0x3); +#else +#ifdef USE_GLES + *(cur++) = value; + *(cur++) = value >> 8; + *(cur++) = value >> 16; +#else *(cur++) = value >> 16; *(cur++) = value >> 8; *(cur++) = value; +#endif +#endif } - pixel = start + pitch / sizeof(uint32_t); + pixel = start + pitch / sizeof(pixel_t); } uLongf compress_buffer_size = idat_size + 5 * (idat_size/16383 + 1) + 3; @@ -147,27 +159,27 @@ free(apng); } -void save_png24(FILE *f, uint32_t *buffer, uint32_t width, uint32_t height, uint32_t pitch) +void save_png24(FILE *f, pixel_t *buffer, uint32_t width, uint32_t height, uint32_t pitch) { write_header(f, width, height, COLOR_TRUE); save_png24_frame(f, buffer, NULL, width, height, pitch); write_chunk(f, iend, NULL, 0); } -void save_png(FILE *f, uint32_t *buffer, uint32_t width, uint32_t height, uint32_t pitch) +void save_png(FILE *f, pixel_t *buffer, uint32_t width, uint32_t height, uint32_t pitch) { - uint32_t palette[256]; + pixel_t palette[256]; uint8_t pal_buffer[256*3]; uint32_t num_pal = 0; uint32_t index_size = (1 + width) * height; uint8_t *index_buffer = malloc(index_size); uint8_t *cur = index_buffer; - uint32_t *pixel = buffer; + pixel_t *pixel = buffer; for (uint32_t y = 0; y < height; y++) { //save filter type *(cur++) = 0; - uint32_t *start = pixel; + pixel_t *start = pixel; for (uint32_t x = 0; x < width; x++, pixel++, cur++) { uint32_t value = (*pixel) & 0xFFFFFF; @@ -189,15 +201,27 @@ } *cur = i; } - pixel = start + pitch / sizeof(uint32_t); + pixel = start + pitch / sizeof(pixel_t); } write_header(f, width, height, COLOR_INDEXED); cur = pal_buffer; for (uint32_t i = 0; i < num_pal; i++) { +#ifdef USE_RGB565 + *(cur++) = (palette[i] >> 8 & 0xF8) | (palette[i] >> (8+5)); + *(cur++) = (palette[i] >> 3 & 0xFC) | (palette[i] >> (3+5) & 0x3); + *(cur++) = palette[i] << 3 | (palette[i] >> (5-3) & 0x3); +#else +#ifdef USE_GLES + *(cur++) = palette[i]; + *(cur++) = palette[i] >> 8; + *(cur++) = palette[i] >> 16; +#else *(cur++) = palette[i] >> 16; *(cur++) = palette[i] >> 8; *(cur++) = palette[i]; +#endif +#endif } write_chunk(f, plte, pal_buffer, num_pal * 3); uLongf compress_buffer_size = index_size + 5 * (index_size/16383 + 1) + 3;