[gegl] Fix some issues with creating a buffer from an existing file



commit 65490fa142c2c0e1415772fc155ee768497cf425
Author: Daniel Sabo <DanielSabo gmail com>
Date:   Sat Mar 15 00:08:24 2014 -0700

    Fix some issues with creating a buffer from an existing file
    
    Buffers will now correctly inherit the files properties, a value
    still needs to be passed in for "format" so there is a default
    if the file does not exist.

 gegl/buffer/gegl-buffer-load.c             |    8 +++++++-
 gegl/buffer/gegl-buffer.c                  |    8 ++++++++
 gegl/buffer/gegl-tile-backend-file-async.c |    4 ++++
 3 files changed, 19 insertions(+), 1 deletions(-)
---
diff --git a/gegl/buffer/gegl-buffer-load.c b/gegl/buffer/gegl-buffer-load.c
index d8401be..b7005fb 100644
--- a/gegl/buffer/gegl-buffer-load.c
+++ b/gegl/buffer/gegl-buffer-load.c
@@ -233,7 +233,13 @@ gegl_buffer_open (const gchar *path)
 {
   sanity();
 
-  return g_object_new (GEGL_TYPE_BUFFER, "path", path, NULL);
+  return g_object_new (GEGL_TYPE_BUFFER,
+                       /* FIXME: Currently the buffer must always have a format specified,
+                                 this format will be used if the path did not point to an
+                                 existing file. */
+                       "format", babl_format ("RGBA float"),
+                       "path", path,
+                       NULL);
 }
 
 GeglBuffer *
diff --git a/gegl/buffer/gegl-buffer.c b/gegl/buffer/gegl-buffer.c
index 572da68..88a624b 100644
--- a/gegl/buffer/gegl-buffer.c
+++ b/gegl/buffer/gegl-buffer.c
@@ -559,6 +559,14 @@ gegl_buffer_constructor (GType                  type,
                                       "format",      buffer->format,
                                       "path",        buffer->path,
                                       NULL);
+
+              /* Re-inherit values in case path pointed to an existing buffer */
+              buffer->format = gegl_tile_backend_get_format (backend);
+              buffer->tile_width = gegl_tile_backend_get_tile_width (backend);
+              buffer->tile_height = gegl_tile_backend_get_tile_height (backend);
+
+              if (buffer->extent.width == -1 || buffer->extent.height == -1)
+                buffer->extent = gegl_tile_backend_get_extent (backend);
             }
           else
             {
diff --git a/gegl/buffer/gegl-tile-backend-file-async.c b/gegl/buffer/gegl-tile-backend-file-async.c
index 2f0cb01..57c0362 100644
--- a/gegl/buffer/gegl-tile-backend-file-async.c
+++ b/gegl/buffer/gegl-tile-backend-file-async.c
@@ -1186,6 +1186,10 @@ gegl_tile_backend_file_constructed (GObject *object)
       backend->priv->tile_size   = backend->priv->tile_width *
                                     backend->priv->tile_height *
                                     backend->priv->px_size;
+      backend->priv->extent      = (GeglRectangle) {self->header.x,
+                                                    self->header.y,
+                                                    self->header.width,
+                                                    self->header.height};
 
       /* insert each of the entries into the hash table */
       gegl_tile_backend_file_load_index (self, TRUE);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]