diff options
| author | Mattias Andrée <m@maandree.se> | 2026-10-13 23:00:56 +0200 |
|---|---|---|
| committer | Mattias Andrée <m@maandree.se> | 2026-10-13 23:00:56 +0200 |
| commit | 0476071164c36b41de5b19e3e8a768feb422f27f (patch) | |
| tree | 09d16e177042b14020a48030176d99e9024bea66 /image.c | |
| parent | Third commit (diff) | |
| download | gbild-0476071164c36b41de5b19e3e8a768feb422f27f.tar.gz gbild-0476071164c36b41de5b19e3e8a768feb422f27f.tar.bz2 gbild-0476071164c36b41de5b19e3e8a768feb422f27f.tar.xz | |
Fourth commit
Signed-off-by: Mattias Andrée <m@maandree.se>
Diffstat (limited to '')
| -rw-r--r-- | image.c | 70 |
1 files changed, 50 insertions, 20 deletions
@@ -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; } |
