r9576 jmb - /trunk/libnspng/src/pngrender.c

netsurf at semichrome.net netsurf at semichrome.net
Tue Sep 15 20:34:15 BST 2009


Author: jmb
Date: Tue Sep 15 14:34:15 2009
New Revision: 9576

URL: http://source.netsurf-browser.org?rev=9576&view=rev
Log:
Optimise redraw for non-interlaced, non-paletted, 8bpc images.

Modified:
    trunk/libnspng/src/pngrender.c

Modified: trunk/libnspng/src/pngrender.c
URL: http://source.netsurf-browser.org/trunk/libnspng/src/pngrender.c?rev=9576&r1=9575&r2=9576&view=diff
==============================================================================
--- trunk/libnspng/src/pngrender.c (original)
+++ trunk/libnspng/src/pngrender.c Tue Sep 15 14:34:15 2009
@@ -83,8 +83,8 @@
 	}
 }
 
-static void process_scanline(nspng_ctx *ctx, const uint8_t *data, uint32_t len,
-		uint32_t pass, uint8_t *rowbuf)
+static void process_scanline_slow(nspng_ctx *ctx, const uint8_t *data, 
+		uint32_t len, uint32_t pass, uint8_t *rowbuf)
 {
 	/* LUTs for interlacing */
 	/* Byte offsets for initial pixel in pass N */
@@ -101,8 +101,9 @@
 	const uint32_t step = pix_step[pass];
 	uint8_t *curpix = rowbuf + pix_init[pass];
 	uint32_t bytes_read_for_pixel = 0;
-
-	for (uint32_t byte = 0; byte < len; byte++) {
+	uint32_t byte;
+
+	for (byte = 0; byte < len; byte++) {
 		/* Reconstruct original byte value */
 		const uint8_t x = data[byte];
 
@@ -154,6 +155,49 @@
 	}
 }
 
+static void process_scanline(nspng_ctx *ctx, const uint8_t *data, uint32_t len,
+		uint32_t pass, uint8_t *rowbuf)
+{
+	const uint32_t colour_type = ctx->image.colour_type;
+	uint32_t byte;
+
+	/* Optimise for non-interlaced, non-paletted, 8bpc scanlines */
+	if (pass == 6 && ctx->image.bit_depth == 8 && 
+			colour_type != COLOUR_TYPE_INDEXED) {
+		if (colour_type == COLOUR_TYPE_RGBA) {
+			memcpy(rowbuf, data, len);
+		} else if (colour_type == COLOUR_TYPE_GREY_A) {
+			for (byte = 0; byte < len - 1; byte += 2) {
+				const uint8_t g = data[byte + 0];
+
+				*rowbuf++ = g;
+				*rowbuf++ = g;
+				*rowbuf++ = g;
+				*rowbuf++ = data[byte + 1];
+			}
+		} else if (colour_type == COLOUR_TYPE_RGB) {
+			for (byte = 0; byte < len - 2; byte += 3) {
+				*rowbuf++ = data[byte + 0];
+				*rowbuf++ = data[byte + 1];
+				*rowbuf++ = data[byte + 2];
+				*rowbuf++ = 0xff;
+			}
+		} else if (colour_type == COLOUR_TYPE_GREY) {
+			for (byte = 0; byte < len; byte++) {
+				const uint8_t g = data[byte];
+
+				*rowbuf++ = g;
+				*rowbuf++ = g;
+				*rowbuf++ = g;
+				*rowbuf++ = 0xff;
+			}
+		}
+	} else {
+		/* Fall back to the slow code for the unhelpful cases */
+		process_scanline_slow(ctx, data, len, pass, rowbuf);
+	}
+}
+
 /******************************************************************************
  * Public API                                                                 *
  ******************************************************************************/




More information about the netsurf-commits mailing list