From 0476071164c36b41de5b19e3e8a768feb422f27f Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Tue, 13 Oct 2026 23:00:56 +0200 Subject: Fourth commit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- image.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 20 deletions(-) (limited to 'image.c') diff --git a/image.c b/image.c index ebfb778..d6b8c0c 100644 --- a/image.c +++ b/image.c @@ -1,35 +1,65 @@ /* See LICENSE file for copyright and license details. */ #include "common.h" -GdkPixbuf *transformed_image = NULL; +GdkPixbuf *transformed_raster = NULL; -static void -forget_transformed_image(void) +void +forget_transformed_raster(void) { - if (transformed_image) { - g_object_unref(transformed_image); - transformed_image = NULL; - } + g_clear_object(&transformed_raster); } -GdkPixbuf * -get_image(void) +int +get_image(struct image *image) { struct file *file = get_file(); - if (!file || !file->image) { - forget_transformed_image(); - return NULL; + if (!file || !file->image.raster) + forget_transformed_raster(); + if (!file) + return 0; + image->raster = transformed_raster ? transformed_raster : file->image.raster; + image->vector = (trans & ~7u) ? NULL : file->image.vector; /* TODO implement support for colour manipulation */ + if (swaps_dimensions(trans)) { + image->width = file->image.height; + image->height = file->image.width; + image->has_x_dpi = file->image.has_y_dpi; + image->has_y_dpi = file->image.has_x_dpi; + image->x_dpi = file->image.y_dpi; + image->y_dpi = file->image.x_dpi; + } else { + image->width = file->image.width; + image->height = file->image.height; + image->has_x_dpi = file->image.has_x_dpi; + image->has_y_dpi = file->image.has_y_dpi; + image->x_dpi = file->image.x_dpi; + image->y_dpi = file->image.y_dpi; } - return transformed_image ? transformed_image : file->image; + image->has_transformer = get_affine_matrix(&image->transformer, trans, file->image.width, file->image.height); + + /* TODO there is a bug in cairo or rsvg that prevents rendering when the + * linear part of the transformation has a negative component */ + if (trans) + image->vector = NULL; + + return 1; } -GdkPixbuf * -get_original_image(void) +int +get_original_image(struct image *image) { struct file *file = get_file(); - if (!file || !file->image) { - forget_transformed_image(); - return NULL; - } - return file->image; + if (!file || !file->image.raster) + forget_transformed_raster(); + if (!file) + return 0; + image->raster = file->image.raster; + image->vector = file->image.vector; + image->width = file->image.width; + image->height = file->image.height; + image->has_x_dpi = file->image.has_x_dpi; + image->has_y_dpi = file->image.has_y_dpi; + image->has_transformer = 0; + image->x_dpi = file->image.x_dpi; + image->y_dpi = file->image.y_dpi; + return 1; } -- cgit v1.3.1