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;