gegl r2216 - in trunk: . gegl/buffer
- From: ok svn gnome org
- To: svn-commits-list gnome org
- Subject: gegl r2216 - in trunk: . gegl/buffer
- Date: Tue, 22 Apr 2008 00:05:48 +0100 (BST)
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]