From ada67f044a36f9b5368c8905bbb9aa6f1dacd0b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Eric=20Janouch?= Date: Mon, 20 Dec 2021 04:29:19 +0100 Subject: Optimize thumbnail rendering Massive responsivity gains have been achieved here. Rescaling performance doesn't seem to be particularly affected. --- fiv-io.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'fiv-io.c') diff --git a/fiv-io.c b/fiv-io.c index 7b83a09..a78d9c9 100644 --- a/fiv-io.c +++ b/fiv-io.c @@ -2366,9 +2366,15 @@ read_spng_thumbnail( } struct spng_ihdr ihdr = {}; + struct spng_trns trns = {}; spng_get_ihdr(ctx, &ihdr); + bool may_be_translucent = !spng_get_trns(ctx, &trns) || + ihdr.color_type == SPNG_COLOR_TYPE_GRAYSCALE_ALPHA || + ihdr.color_type == SPNG_COLOR_TYPE_TRUECOLOR_ALPHA; + cairo_surface_t *surface = cairo_image_surface_create( - CAIRO_FORMAT_ARGB32, ihdr.width, ihdr.height); + may_be_translucent ? CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24, + ihdr.width, ihdr.height); cairo_status_t surface_status = cairo_surface_status(surface); if (surface_status != CAIRO_STATUS_SUCCESS) { @@ -2396,10 +2402,7 @@ read_spng_thumbnail( } // pixman can be mildly abused to do this operation, but it won't be faster. - struct spng_trns trns = {}; - if (ihdr.color_type == SPNG_COLOR_TYPE_GRAYSCALE_ALPHA || - ihdr.color_type == SPNG_COLOR_TYPE_TRUECOLOR_ALPHA || - !spng_get_trns(ctx, &trns)) { + if (may_be_translucent) { for (size_t i = size / sizeof *data; i--; ) { const uint8_t *unit = (const uint8_t *) &data[i]; uint32_t a = unit[3], -- cgit v1.2.3