[gegl] raw-load: reinitialize library upon path change
- From: Øyvind Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] raw-load: reinitialize library upon path change
- Date: Thu, 18 Feb 2016 20:47:12 +0000 (UTC)
commit 490ee6e55252a8d4bf61d3b869b53ca95f3613c5
Author: Øyvind Kolås <pippin gimp org>
Date: Thu Feb 18 21:46:38 2016 +0100
raw-load: reinitialize library upon path change
Fixing bug #755078
operations/external/raw-load.c | 86 +++++++++++++++++++++++-----------------
1 files changed, 49 insertions(+), 37 deletions(-)
---
diff --git a/operations/external/raw-load.c b/operations/external/raw-load.c
index 9c005fa..8ce0a2f 100644
--- a/operations/external/raw-load.c
+++ b/operations/external/raw-load.c
@@ -36,8 +36,6 @@ struct _GeglOp
{
GeglOperationSource parent_instance;
gpointer properties;
-
- gchar *cached_path; /* Path we have cached. Detects need for recache. */
};
typedef struct
@@ -59,9 +57,24 @@ GEGL_DEFINE_DYNAMIC_OPERATION(GEGL_TYPE_OPERATION_SOURCE)
typedef struct {
libraw_data_t *LibRaw;
libraw_processed_image_t *image;
+ gchar *cached_path;
} Private;
-unsigned char first_pass = 1;
+static void
+raw_close (GeglProperties *o)
+{
+ Private *p = (Private*)o->user_data;
+ if (p->LibRaw != NULL)
+ {
+ if (p->image != NULL)
+ {
+ libraw_dcraw_clear_mem (p->image);
+ p->image = NULL;
+ }
+ libraw_close (p->LibRaw);
+ p->LibRaw = NULL;
+ }
+}
static void
prepare (GeglOperation *operation)
@@ -70,34 +83,45 @@ prepare (GeglOperation *operation)
Private *p = (Private*)o->user_data;
int ret;
- if (p == NULL && first_pass)
+ if (p == NULL)
{
- first_pass = 0;
-
if ((p = g_new0(Private, 1)) == NULL)
g_warning ("raw-load: Error creating private structure");
+ }
+
+ if (p->cached_path && !strcmp (p->cached_path, o->path))
+ {
+ raw_close (o);
+ }
+
+ if (p->LibRaw == NULL)
+ {
+ o->user_data = (gpointer)p;
+ p->LibRaw = NULL;
+ p->image = NULL;
+
+ if ((p->LibRaw = libraw_init(0)) == NULL)
+ g_warning ("raw-load: Error Initializing raw library");
else
{
- o->user_data = (gpointer)p;
- p->LibRaw = NULL;
- p->image = NULL;
+ p->LibRaw->params.shot_select = o->image_num;
+
+ p->LibRaw->params.gamm[0] = 1.0;
+ p->LibRaw->params.gamm[1] = 1.0;
+ p->LibRaw->params.no_auto_bright = 1;
- if ((p->LibRaw = libraw_init(0)) == NULL)
- g_warning ("raw-load: Error Initializing raw library");
- else
- {
- p->LibRaw->params.shot_select = o->image_num;
-
- p->LibRaw->params.gamm[0] = 1.0;
- p->LibRaw->params.gamm[1] = 1.0;
- p->LibRaw->params.no_auto_bright = 1;
+ p->LibRaw->params.output_bps = 16;
+ p->LibRaw->params.user_qual = o->quality;
- p->LibRaw->params.output_bps = 16;
- p->LibRaw->params.user_qual = o->quality;
+ if ((ret = libraw_open_file(p->LibRaw, o->path)) != LIBRAW_SUCCESS)
+ {
- if ((ret = libraw_open_file(p->LibRaw, o->path)) != LIBRAW_SUCCESS)
- g_warning ("raw-load: Unable to open %s: %s", o->path, libraw_strerror (ret));
- }
+ g_warning ("raw-load: Unable to open %s: %s", o->path, libraw_strerror (ret));
+ }
+ else
+ {
+ p->cached_path = strdup (o->path);
+ }
}
}
}
@@ -139,11 +163,7 @@ process (GeglOperation *operation,
const Babl *format = NULL;
int ret;
- if (p == NULL)
- {
- prepare(operation);
- p = (Private*)o->user_data;
- }
+ g_assert (p);
if (p != NULL &&
p->LibRaw != NULL)
@@ -188,15 +208,7 @@ finalize (GObject *object)
if (o->user_data)
{
- Private *p = (Private*)o->user_data;
- if (p->LibRaw != NULL)
- {
- if (p->image != NULL)
- libraw_dcraw_clear_mem (p->image);
-
- libraw_close (p->LibRaw);
- }
-
+ raw_close (o);
g_free (o->user_data);
o->user_data = NULL;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]