aboutsummaryrefslogtreecommitdiff
path: root/fiv-browser.c
diff options
context:
space:
mode:
authorPřemysl Eric Janouch <p@janouch.name>2021-12-20 04:29:19 +0100
committerPřemysl Eric Janouch <p@janouch.name>2021-12-20 04:40:35 +0100
commitada67f044a36f9b5368c8905bbb9aa6f1dacd0b6 (patch)
tree8c9e08ffe6921199d2b6a712ea4ac4450d4a551c /fiv-browser.c
parent63955e881dcc958fa871731157a1230a8a41abc0 (diff)
downloadfiv-ada67f044a36f9b5368c8905bbb9aa6f1dacd0b6.tar.gz
fiv-ada67f044a36f9b5368c8905bbb9aa6f1dacd0b6.tar.xz
fiv-ada67f044a36f9b5368c8905bbb9aa6f1dacd0b6.zip
Optimize thumbnail rendering
Massive responsivity gains have been achieved here. Rescaling performance doesn't seem to be particularly affected.
Diffstat (limited to 'fiv-browser.c')
-rw-r--r--fiv-browser.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/fiv-browser.c b/fiv-browser.c
index 7759c3a..345913b 100644
--- a/fiv-browser.c
+++ b/fiv-browser.c
@@ -254,8 +254,12 @@ draw_row(FivBrowser *self, cairo_t *cr, const Row *row)
border.top + extents.height + border.bottom);
}
- gtk_render_background(
- style, cr, border.left, border.top, extents.width, extents.height);
+ // Performance optimization--specifically targeting the checkerboard.
+ if (cairo_image_surface_get_format(item->entry->thumbnail) !=
+ CAIRO_FORMAT_RGB24) {
+ gtk_render_background(style, cr, border.left, border.top,
+ extents.width, extents.height);
+ }
gtk_render_frame(style, cr, 0, 0,
border.left + extents.width + border.right,
@@ -306,8 +310,9 @@ rescale_thumbnail(cairo_surface_t *thumbnail, double row_height)
int projected_width = round(scale_x * width);
int projected_height = round(scale_y * height);
+ cairo_format_t cairo_format = cairo_image_surface_get_format(thumbnail);
cairo_surface_t *scaled = cairo_image_surface_create(
- CAIRO_FORMAT_ARGB32, projected_width, projected_height);
+ cairo_format, projected_width, projected_height);
// pixman can take gamma into account when scaling, unlike Cairo.
struct pixman_f_transform xform_floating;
@@ -315,7 +320,8 @@ rescale_thumbnail(cairo_surface_t *thumbnail, double row_height)
// PIXMAN_a8r8g8b8_sRGB can be used for gamma-correct results,
// but it's an incredibly slow transformation
- pixman_format_code_t format = PIXMAN_a8r8g8b8;
+ pixman_format_code_t format =
+ cairo_format == CAIRO_FORMAT_RGB24 ? PIXMAN_x8r8g8b8 : PIXMAN_a8r8g8b8;
pixman_image_t *src = pixman_image_create_bits(format, width, height,
(uint32_t *) cairo_image_surface_get_data(thumbnail),