gegl r2216 - in trunk: . gegl/buffer



Author: ok
Date: Mon Apr 21 23:05:48 2008
New Revision: 2216
URL: http://svn.gnome.org/viewvc/gegl?rev=2216&view=rev

Log:
* gegl/buffer/gegl-buffer-index.h: added gegl_buffer_read_header and
gegl_buffer_read_index declarations.
* gegl/buffer/gegl-buffer-load.c: 
(gegl_buffer_read_header), (read_block), (gegl_buffer_read_index),
(gegl_buffer_open): refactored to make reusable.
* gegl/buffer/gegl-buffer-private.h: added tile-width and tile-height
properties.
* gegl/buffer/gegl-buffer.c: (get_property), (set_property),
(gegl_buffer_class_init), (gegl_buffer_init): added properties.
* gegl/buffer/gegl-tile-handler-cache.c: indentation.


Modified:
   trunk/ChangeLog
   trunk/gegl/buffer/gegl-buffer-index.h
   trunk/gegl/buffer/gegl-buffer-load.c
   trunk/gegl/buffer/gegl-buffer-private.h
   trunk/gegl/buffer/gegl-buffer.c
   trunk/gegl/buffer/gegl-tile-handler-cache.c

Modified: trunk/gegl/buffer/gegl-buffer-index.h
==============================================================================
--- trunk/gegl/buffer/gegl-buffer-index.h	(original)
+++ trunk/gegl/buffer/gegl-buffer-index.h	Mon Apr 21 23:05:48 2008
@@ -110,6 +110,10 @@
 
 void gegl_tile_entry_destroy (GeglBufferTile *entry);
 
+GeglBufferItem *gegl_buffer_read_header (GInputStream *i,
+                                         goffset      *offset);
+GList          *gegl_buffer_read_index  (GInputStream *i,
+                                         goffset      *offset);
 
 #define struct_check_padding(type, size) \
   if (sizeof (type) != size) \

Modified: trunk/gegl/buffer/gegl-buffer-load.c
==============================================================================
--- trunk/gegl/buffer/gegl-buffer-load.c	(original)
+++ trunk/gegl/buffer/gegl-buffer-load.c	Mon Apr 21 23:05:48 2008
@@ -54,40 +54,38 @@
   GInputStream    *i;
   gint             tile_size;
   Babl            *format;
-  gint             pos;
-  glong            next_block;
+  goffset          offset;
+  goffset          next_block;
   gboolean         got_header;
 } LoadInfo;
 
-static void seekto(LoadInfo *info, gint pos)
+
+static void seekto(LoadInfo *info, gint offset)
 {
-  info->pos = pos;
-  GEGL_NOTE (BUFFER_LOAD, "seek to %i", pos);
-  if(!g_seekable_seek (G_SEEKABLE (info->i), info->pos, G_SEEK_SET, NULL, NULL))
+  info->offset = offset;
+  GEGL_NOTE (BUFFER_LOAD, "seek to %i", offset);
+  if(!g_seekable_seek (G_SEEKABLE (info->i), info->offset, G_SEEK_SET, NULL, NULL))
     {
       g_warning ("failed seeking");
     }
 }
 
-static GeglBufferItem *read_header (LoadInfo *info)
+GeglBufferItem *
+gegl_buffer_read_header (GInputStream *i,
+                         goffset      *offset)
 {
   GeglBufferItem *ret;
 
-  /* XXX: initialize synchronize buffer state */
-
-  if (info->pos != 0)
-    {
-      seekto (info, 0);
-    }
+  if(!g_seekable_seek (G_SEEKABLE (i), 0, G_SEEK_SET, NULL, NULL))
+      g_warning ("failed seeking to %i", 0);
+  *offset = 0;
 
   ret = g_malloc (sizeof (GeglBufferHeader));
-  info->pos+= g_input_stream_read (info->i,
+  *offset += g_input_stream_read (i,
                    ((gchar*)ret),
                    sizeof(GeglBufferHeader),
                    NULL, NULL);
 
-  info->next_block = ret->block.next;
-
   GEGL_NOTE (BUFFER_LOAD, "read header: tile-width: %i tile-height: %i next:%i\n",
                    ret->header.tile_width,
                    ret->header.tile_height,
@@ -95,32 +93,93 @@
   return ret;
 }
 
-
-static GeglBufferItem *read_block (LoadInfo *info)
+/* reads a block of information from a geglbuffer that resides in an GInputStream,
+ * if offset is NULL it is read from the current offsetition of the stream. If offset
+ * is passed in the offset stored at the location is used as the initial seeking
+ * point and will be updated with the offset after the read is completed.
+ */
+static GeglBufferItem *read_block (GInputStream *i,
+                                   goffset      *offset)
 {
   GeglBufferBlock block;
   GeglBufferItem *ret;
+  gsize           read = 0;
+  gint            own_size=0;
 
-  if (!info->next_block)
+  if (*offset==0)
     return NULL;
-  if (info->pos != info->next_block)
+
+  if (offset)
+    if(!g_seekable_seek (G_SEEKABLE (i), *offset, G_SEEK_SET, NULL, NULL))
+      g_warning ("failed seeking to %i", (gint)*offset);
+
+  g_print ("offset: %i\n", (gint)*offset);
+  read += g_input_stream_read (i, &block, sizeof (GeglBufferBlock), NULL, NULL);
+  GEGL_NOTE (BUFFER_LOAD, "read block: length:%i next:%i",
+                          block.length, (guint)block.next);
+
+  switch (block.flags)
+     {
+        case GEGL_FLAG_TILE:
+        case GEGL_FLAG_FREE_TILE:
+          own_size = sizeof (GeglBufferTile); 
+          break;
+        default:
+          g_warning ("skipping unknown type of entry flags=%i", block.flags);
+          break;
+     }
+
+  if (block.length == own_size ||
+      block.length > own_size )
+    {
+      /* we discard any excess information that might have been added in later
+       * versions
+       */
+      ret = g_malloc (own_size);
+      memcpy (ret, &block, sizeof (GeglBufferBlock));
+      read += g_input_stream_read (i, ((gchar*)ret) + sizeof(GeglBufferBlock),
+                                       own_size - sizeof(GeglBufferBlock),
+                                       NULL, NULL);
+    }
+  else if (block.length < own_size)
+    {
+      ret = g_malloc (own_size);
+      memcpy (ret, &block, sizeof (GeglBufferBlock));
+      read += g_input_stream_read (i, ((gchar*)ret) + sizeof(GeglBufferBlock),
+                                       block.length - sizeof (GeglBufferBlock),
+                                       NULL, NULL);
+    }
+  else
     {
-      seekto (info, info->next_block);
+      ret = NULL;
+      g_warning ("skipping block : of flags:%i\n", block.flags);
     }
 
-  info->pos+= g_input_stream_read (info->i, &block, sizeof (GeglBufferBlock),
-                                   NULL, NULL);
-  GEGL_NOTE (BUFFER_LOAD, "read block: length:%i next:%i",
-                   block.length,
-                   (guint)block.next);
+  *offset += read;
+  return ret;
+}
 
-  ret = g_malloc (block.length);
-  memcpy (ret, &block, sizeof (GeglBufferBlock));
-  info->pos+= g_input_stream_read (info->i,
-                   ((gchar*)ret) + sizeof(GeglBufferBlock),
-                   block.length - sizeof(GeglBufferBlock),
-                   NULL, NULL);
-  info->next_block = ret->block.next;
+GList *
+gegl_buffer_read_index (GInputStream *i,
+                        goffset      *offset)
+/* load the index */
+{
+  GList          *ret = NULL;
+  GeglBufferItem *item;
+
+  g_print ("%i\n", (gint)*offset); 
+  for (item = read_block (i, offset); item; item = read_block (i, offset))
+    {
+      g_assert (item);
+      GEGL_NOTE (BUFFER_LOAD,"loaded item: %i, %i, %i offset:%i next:%i", item->tile.x,
+                 item->tile.y,
+                 item->tile.z,
+                 (guint)item->tile.offset,
+                 (guint)item->block.next);
+      *offset = item->block.next;
+      ret = g_list_prepend (ret, item);
+    }
+  ret = g_list_reverse (ret);
   return ret;
 }
 
@@ -151,6 +210,7 @@
 
 static void sanity(void) { GEGL_BUFFER_SANITY; }
 
+
 GeglBuffer *
 gegl_buffer_open (const gchar *path)
 {
@@ -164,24 +224,19 @@
   info->i = G_INPUT_STREAM (g_file_read (info->file, NULL, NULL));
 
   GEGL_NOTE (BUFFER_LOAD, "starting to load buffer %s", path);
-#if 0
-  if (info->fd == -1)
+  if (!info->i)
     {
-      gchar *name = g_filename_display_name (info->path);
-
-      g_message ("Unable to open '%s' for loading a buffer: %s",
-                 name, g_strerror (errno));
-      g_free (name);
-
-      load_info_destroy (info);
-      return;
+      GEGL_NOTE (BUFFER_LOAD, "failed top open %s for reading", path);
+      g_object_unref (info->file);
+      return NULL;
     }
-#endif
 
   {
-    GeglBufferItem *header= read_header (info);
+    GeglBufferItem *header = gegl_buffer_read_header (info->i, &info->offset);
     g_assert (header);
-    memcpy (&(info->header), header, sizeof (GeglBufferHeader));
+    /*memcpy (&(info->header), header, sizeof (GeglBufferHeader));*/
+    info->header = *(&header->header);
+    info->offset = info->header.next;
     /*g_free (header);*/  /* is there a pointer to a string or something we're missing? */
   }
 
@@ -199,23 +254,20 @@
                        info->header.bytes_per_pixel;
   info->format       = babl_format (info->header.description);
 
-  ret = g_object_new (GEGL_TYPE_BUFFER, "format", info->format, NULL);
+  ret = g_object_new (GEGL_TYPE_BUFFER,
+                      "format", info->format,
+                      "tile-width", info->header.tile_width,
+                      "tile-height", info->header.tile_height,
+                      "height", info->header.width,
+                      "width", info->header.height,
+                      "path", path,
+                      NULL);
+
+  /* sanity check, should probably report error condition and return safely instead
+  */
+  g_assert (info->format->format.bytes_per_pixel == info->header.bytes_per_pixel);
 
-  /* load the index */
-  {
-    GeglBufferItem *item; /* = read_block (info);*/
-    for (item = read_block (info); item; item = read_block (info))
-      {
-        g_assert (item);
-        GEGL_NOTE (BUFFER_LOAD,"loaded item: %i, %i, %i offset:%i next:%i", item->tile.x,
-                                    item->tile.y,
-                                    item->tile.z,
-                                    (guint)item->tile.offset,
-                                    (guint)item->block.next);
-        info->tiles = g_list_prepend (info->tiles, item);
-      }
-    info->tiles = g_list_reverse (info->tiles);
-  }
+  info->tiles = gegl_buffer_read_index (info->i, &info->offset);
 
   /* load each tile */
   {
@@ -233,11 +285,11 @@
                                           entry->y,
                                           entry->z);
 
-        if (info->pos != entry->offset)
+        if (info->offset != entry->offset)
           {
             seekto (info, entry->offset);
           }
-        g_assert (info->pos == entry->offset);
+        /*g_assert (info->offset == entry->offset);*/
 
 
         g_assert (tile);
@@ -246,17 +298,18 @@
         data = gegl_tile_get_data (tile);
         g_assert (data);
 
-        info->pos += g_input_stream_read (info->i, data, info->tile_size,
+        info->offset += g_input_stream_read (info->i, data, info->tile_size,
                                           NULL, NULL);
 
-        g_assert (info->pos == entry->offset + info->tile_size);
+        /*g_assert (info->offset == entry->offset + info->tile_size);*/
 
         gegl_tile_unlock (tile);
         g_object_unref (G_OBJECT (tile));
         i++;
       }
-    GEGL_NOTE (BUFFER_LOAD, "buffer loaded %s tiles loaded: %i", info->path, i);
+    GEGL_NOTE (BUFFER_LOAD, "%i tiles loaded",i);
   }
+  GEGL_NOTE (BUFFER_LOAD, "buffer loaded %s", info->path);
 
   load_info_destroy (info);
   return ret;

Modified: trunk/gegl/buffer/gegl-buffer-private.h
==============================================================================
--- trunk/gegl/buffer/gegl-buffer-private.h	(original)
+++ trunk/gegl/buffer/gegl-buffer-private.h	Mon Apr 21 23:05:48 2008
@@ -49,8 +49,8 @@
                                  sized gets/sets)*/
 
   GeglSampler      *sampler; /* cached sampler for speeding up random
-                                     access interpolated fetches from the
-                                     buffer */
+                                access interpolated fetches from the
+                                buffer */
 
   GeglTileStorage  *tile_storage;
 
@@ -59,6 +59,10 @@
   gint              max_x; /* this is used in gegl_buffer_void to narrow */
   gint              max_y; /* down the tiles kill commands are sent for */
   gint              max_z;
+
+  gint              tile_width;
+  gint              tile_height;
+  gchar            *path;
 };
 
 struct _GeglBufferClass
@@ -67,22 +71,22 @@
 };
 
 
-const GeglRectangle* gegl_buffer_get_abyss  (GeglBuffer    *buffer);
+const GeglRectangle* gegl_buffer_get_abyss  (GeglBuffer           *buffer);
 
-gint           gegl_buffer_leaks      (void);
+gint                 gegl_buffer_leaks       (void);
 
-void           gegl_buffer_stats      (void);
+void                 gegl_buffer_stats       (void);
 
-void           gegl_buffer_save       (GeglBuffer          *buffer,
-                                       const gchar         *path,
-                                       const GeglRectangle *roi);
+void                 gegl_buffer_save        (GeglBuffer          *buffer,
+                                              const gchar         *path,
+                                              const GeglRectangle *roi);
 
 
-const gchar *  gegl_swap_dir          (void);
+const gchar         *gegl_swap_dir           (void);
 
 
-void           gegl_tile_cache_init    (void);
+void                 gegl_tile_cache_init    (void);
 
-void           gegl_tile_cache_destroy (void);
+void                 gegl_tile_cache_destroy (void);
 
 #endif

Modified: trunk/gegl/buffer/gegl-buffer.c
==============================================================================
--- trunk/gegl/buffer/gegl-buffer.c	(original)
+++ trunk/gegl/buffer/gegl-buffer.c	Mon Apr 21 23:05:48 2008
@@ -80,9 +80,12 @@
   PROP_ABYSS_Y,
   PROP_ABYSS_WIDTH,
   PROP_ABYSS_HEIGHT,
+  PROP_TILE_WIDTH,
+  PROP_TILE_HEIGHT,
   PROP_FORMAT,
   PROP_PX_SIZE,
-  PROP_PIXELS
+  PROP_PIXELS,
+  PROP_PATH
 };
 
 static GeglBuffer * gegl_buffer_new_from_format (const void *babl_format,
@@ -121,7 +124,17 @@
       case PROP_HEIGHT:
         g_value_set_int (value, buffer->extent.height);
         break;
+      case PROP_TILE_WIDTH:
+        g_value_set_int (value, buffer->tile_width);
+        break;
+
+      case PROP_TILE_HEIGHT:
+        g_value_set_int (value, buffer->tile_height);
+        break;
 
+      case PROP_PATH:
+        g_value_set_string (value, buffer->path);
+        break;
       case PROP_PIXELS:
         g_value_set_int (value, buffer->extent.width * buffer->extent.height);
         break;
@@ -190,6 +203,20 @@
         buffer->extent.height = g_value_get_int (value);
         break;
 
+      case PROP_TILE_WIDTH:
+        buffer->tile_height = g_value_get_int (value);
+        break;
+
+      case PROP_TILE_HEIGHT:
+        buffer->tile_width = g_value_get_int (value);
+        break;
+
+      case PROP_PATH:
+        if (buffer->path)
+          g_free (buffer->path);
+        buffer->path = g_value_dup_string (value);
+        break;
+
       case PROP_SHIFT_X:
         buffer->shift_x = g_value_get_int (value);
         break;
@@ -321,8 +348,8 @@
   GObject         *object;
   GeglBuffer      *buffer;
   GeglTileBackend *backend;
-  GeglTileHandler     *handler;
-  GeglTileSource    *source;
+  GeglTileHandler *handler;
+  GeglTileSource  *source;
   gint             tile_width;
   gint             tile_height;
 
@@ -609,6 +636,23 @@
                                    g_param_spec_pointer ("format", "format", "babl format",
                                                          G_PARAM_READWRITE |
                                                          G_PARAM_CONSTRUCT));
+
+  g_object_class_install_property (gobject_class, PROP_TILE_HEIGHT,
+                                   g_param_spec_int ("tile-height", "tile-height", "height of a tile",
+                                                     -1, G_MAXINT, 64,
+                                                     G_PARAM_READWRITE |
+                                                     G_PARAM_CONSTRUCT_ONLY));
+
+  g_object_class_install_property (gobject_class, PROP_TILE_WIDTH,
+                                   g_param_spec_int ("tile-width", "tile-width", "width of a tile",
+                                                     -1, G_MAXINT, 128,
+                                                     G_PARAM_READWRITE |
+                                                     G_PARAM_CONSTRUCT_ONLY));
+
+  g_object_class_install_property (gobject_class, PROP_PATH,
+                                   g_param_spec_string ("path", "Path", "URI to where the buffer is stored",
+                                                     "/tmp/hm",
+                                                     G_PARAM_READWRITE));
 }
 
 static void
@@ -634,6 +678,10 @@
   buffer->max_y = 0;
   buffer->max_z = 0;
 
+  buffer->path = NULL;
+  buffer->tile_width = 128;
+  buffer->tile_height = 64;
+
   allocated_buffers++;
 }
 

Modified: trunk/gegl/buffer/gegl-tile-handler-cache.c
==============================================================================
--- trunk/gegl/buffer/gegl-tile-handler-cache.c	(original)
+++ trunk/gegl/buffer/gegl-tile-handler-cache.c	Mon Apr 21 23:05:48 2008
@@ -195,30 +195,19 @@
         break; /* chain up */
       case GEGL_TILE_FLUSH:
         {
-          /*FIXME*/
-          /* do this for all tiles belonging to this cache */
-          gboolean exist = gegl_tile_handler_cache_has_tile (cache, x, y, z);
-          GeglTile *tile;
-  GList     *link;
+          GList     *link;
 
-  for (link = g_queue_peek_head_link (cache_queue); link; link = link->next)
-    {
-      CacheItem *item = link->data;
-      GeglTile  *tile = item->tile;
-
-      if (tile != NULL &&
-          item->handler == cache)
-        {
-          gegl_tile_store (tile);
-        }
-    }
-
- /*        
-          if (exist)
+          for (link = g_queue_peek_head_link (cache_queue); link; link = link->next)
             {
-              tile = get_tile (tile_store, x, y, z);
-              gegl_tile_store (tile);
-            }*/
+              CacheItem *item = link->data;
+              GeglTile  *tile = item->tile;
+
+              if (tile != NULL &&
+                  item->handler == cache)
+                {
+                  gegl_tile_store (tile);
+                }
+            }
         }
         break; /* chain up */
       case GEGL_TILE_GET:
@@ -257,13 +246,12 @@
 static void
 gegl_tile_handler_cache_class_init (GeglTileHandlerCacheClass *class)
 {
-  GObjectClass      *gobject_class  = G_OBJECT_CLASS (class);
-  GeglTileSourceClass *source_class = GEGL_TILE_SOURCE_CLASS (class);
+  GObjectClass        *gobject_class = G_OBJECT_CLASS (class);
+  GeglTileSourceClass *source_class  = GEGL_TILE_SOURCE_CLASS (class);
 
-  gobject_class->finalize     = finalize;
-  gobject_class->dispose      = dispose;
-
-  source_class->command  = command;
+  gobject_class->finalize = finalize;
+  gobject_class->dispose  = dispose;
+  source_class->command   = command;
 }
 
 static void
@@ -292,12 +280,8 @@
 
       count++;
       if (!gegl_tile_is_stored (tile))
-        {
-          if (count > cache_size - wash_tiles)
-            {
-              last_dirty = tile;
-            }
-        }
+        if (count > cache_size - wash_tiles)
+          last_dirty = tile;
     }
 
   if (last_dirty != NULL)



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