[gthumb] pixbuf loader: convert to a cairo surface and set the metadata
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] pixbuf loader: convert to a cairo surface and set the metadata
- Date: Sat, 9 Nov 2013 20:00:12 +0000 (UTC)
commit 8f4a883b49943502a477283eb6ab7b678c9cb06f
Author: Paolo Bacchilega <paobac src gnome org>
Date: Sun Oct 6 14:24:56 2013 +0200
pixbuf loader: convert to a cairo surface and set the metadata
gthumb/pixbuf-io.c | 41 ++++++++++++++++++++++++++++++++++++++---
gthumb/pixbuf-io.h | 1 +
2 files changed, 39 insertions(+), 3 deletions(-)
---
diff --git a/gthumb/pixbuf-io.c b/gthumb/pixbuf-io.c
index b826748..0fbf208 100644
--- a/gthumb/pixbuf-io.c
+++ b/gthumb/pixbuf-io.c
@@ -23,6 +23,7 @@
#include <string.h>
#include <glib/gi18n.h>
#define GDK_PIXBUF_ENABLE_BACKEND 1
+#include "cairo-utils.h"
#include "gio-utils.h"
#include "glib-utils.h"
#include "gth-error.h"
@@ -137,6 +138,7 @@ gth_pixbuf_new_from_file (GInputStream *istream,
int requested_size,
int *original_width,
int *original_height,
+ gboolean *loaded_original,
gboolean scale_to_original,
GCancellable *cancellable,
GError **error)
@@ -145,6 +147,7 @@ gth_pixbuf_new_from_file (GInputStream *istream,
GdkPixbufLoader *pixbuf_loader;
GdkPixbuf *pixbuf;
GthImage *image;
+ gboolean original_size_rotated = FALSE;
if (original_width != NULL)
*original_width = -1;
@@ -174,24 +177,55 @@ gth_pixbuf_new_from_file (GInputStream *istream,
pixbuf = tmp;
}
+ if ((original_width != NULL) && (original_height != NULL)) {
+ if (file_data != NULL) {
+ char *path;
+
+ path = g_file_get_path (file_data->file);
+ if (path != NULL) {
+ gdk_pixbuf_get_file_info (path, &scale_data.original_width,
&scale_data.original_height);
+ original_size_rotated = TRUE;
+ g_free (path);
+ }
+ }
+ }
+
if (pixbuf != NULL) {
GdkPixbuf *rotated;
rotated = gdk_pixbuf_apply_embedded_orientation (pixbuf);
if (rotated != NULL) {
- scale_data.original_width = gdk_pixbuf_get_width (rotated);
- scale_data.original_height = gdk_pixbuf_get_height (rotated);
+ if (! original_size_rotated) {
+ /* swap width and height */
+ int tmp = scale_data.original_width;
+ scale_data.original_width = scale_data.original_height;
+ scale_data.original_height =tmp;
+ }
+
g_object_unref (pixbuf);
pixbuf = rotated;
}
}
- image = gth_image_new_for_pixbuf (pixbuf);
+ image = gth_image_new ();
+ if (pixbuf != NULL) {
+ cairo_surface_t *surface;
+ cairo_surface_metadata_t *metadata;
+
+ surface = _cairo_image_surface_create_from_pixbuf (pixbuf);
+ metadata = _cairo_image_surface_get_metadata (surface);
+ metadata->original_width = scale_data.original_width;
+ metadata->original_height = scale_data.original_height;
+ metadata->has_alpha = gdk_pixbuf_get_has_alpha (pixbuf);
+ gth_image_set_cairo_surface (image, surface);
+ }
if (original_width != NULL)
*original_width = scale_data.original_width;
if (original_height != NULL)
*original_height = scale_data.original_height;
+ if (loaded_original != NULL)
+ *loaded_original = (pixbuf != NULL) && (scale_data.original_width == gdk_pixbuf_get_width
(pixbuf)) && (scale_data.original_height == gdk_pixbuf_get_height (pixbuf));
_g_object_unref (pixbuf);
@@ -225,6 +259,7 @@ gth_pixbuf_animation_new_from_file (GInputStream *istream,
requested_size,
original_width,
original_height,
+ loaded_original,
FALSE,
cancellable,
error);
diff --git a/gthumb/pixbuf-io.h b/gthumb/pixbuf-io.h
index f38468a..7026bc5 100644
--- a/gthumb/pixbuf-io.h
+++ b/gthumb/pixbuf-io.h
@@ -35,6 +35,7 @@ GthImage * gth_pixbuf_new_from_file (GInputStream *istream,
int requested_size,
int *original_width,
int *original_height,
+ gboolean *loaded_original,
gboolean scale_to_original,
GCancellable *cancellable,
GError **error);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]