aboutsummaryrefslogtreecommitdiffstats
path: root/image.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--image.c70
1 files changed, 50 insertions, 20 deletions
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;
}