Optimize thumbnail rendering

Massive responsivity gains have been achieved here.

Rescaling performance doesn't seem to be particularly affected.
This commit is contained in:
2021-12-20 04:29:19 +01:00
parent 63955e881d
commit ada67f044a
2 changed files with 18 additions and 9 deletions

View File

@@ -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],