static void gegl_tile_backend_swap_finalize (GObject *object) { GeglTileBackendSwap *self = GEGL_TILE_BACKEND_SWAP (object); if (self->index) { GList *tiles = g_hash_table_get_keys (self->index); if (tiles != NULL) { GList *iter; for (iter = tiles; iter; iter = iter->next) gegl_tile_backend_swap_entry_destroy (self, iter->data); } g_list_free (tiles); g_hash_table_unref (self->index); self->index = NULL; } (*G_OBJECT_CLASS (parent_class)->finalize)(object); }
static gpointer gegl_tile_backend_swap_set_tile (GeglTileSource *self, GeglTile *tile, gint x, gint y, gint z) { GeglTileBackend *backend; GeglTileBackendSwap *tile_backend_swap; SwapEntry *entry; backend = GEGL_TILE_BACKEND (self); tile_backend_swap = GEGL_TILE_BACKEND_SWAP (backend); entry = gegl_tile_backend_swap_lookup_entry (tile_backend_swap, x, y, z); gegl_tile_backend_swap_ensure_exist (); if (entry == NULL) { entry = gegl_tile_backend_swap_entry_create (x, y, z); entry->offset = gegl_tile_backend_swap_find_offset (gegl_tile_backend_get_tile_size (backend)); g_hash_table_insert (tile_backend_swap->index, entry, entry); } gegl_tile_backend_swap_entry_write (tile_backend_swap, entry, tile); gegl_tile_mark_as_stored (tile); return NULL; }
static GeglTile * gegl_tile_backend_swap_get_tile (GeglTileSource *self, gint x, gint y, gint z) { GeglTileBackend *backend; GeglTileBackendSwap *tile_backend_swap; SwapEntry *entry; GeglTile *tile = NULL; gint tile_size; backend = GEGL_TILE_BACKEND (self); tile_backend_swap = GEGL_TILE_BACKEND_SWAP (backend); entry = gegl_tile_backend_swap_lookup_entry (tile_backend_swap, x, y, z); if (!entry) return NULL; tile_size = gegl_tile_backend_get_tile_size (GEGL_TILE_BACKEND (self)); tile = gegl_tile_new (tile_size); gegl_tile_mark_as_stored (tile); gegl_tile_backend_swap_entry_read (tile_backend_swap, entry, gegl_tile_get_data (tile)); return tile; }
static gpointer gegl_tile_backend_swap_exist_tile (GeglTileSource *self, GeglTile *tile, gint x, gint y, gint z) { GeglTileBackend *backend; GeglTileBackendSwap *tile_backend_swap; SwapEntry *entry; backend = GEGL_TILE_BACKEND (self); tile_backend_swap = GEGL_TILE_BACKEND_SWAP (backend); entry = gegl_tile_backend_swap_lookup_entry (tile_backend_swap, x, y, z); return entry!=NULL?((gpointer)0x1):NULL; }
static GObject * gegl_tile_backend_swap_constructor (GType type, guint n_params, GObjectConstructParam *params) { GObject *object; GeglTileBackendSwap *self; GeglTileBackend *backend; object = G_OBJECT_CLASS (parent_class)->constructor (type, n_params, params); self = GEGL_TILE_BACKEND_SWAP (object); backend = GEGL_TILE_BACKEND (object); self->index = g_hash_table_new (gegl_tile_backend_swap_hashfunc, gegl_tile_backend_swap_equalfunc); backend->priv->shared = FALSE; GEGL_NOTE (GEGL_DEBUG_TILE_BACKEND, "constructing swap backend"); return object; }
static gpointer gegl_tile_backend_swap_void_tile (GeglTileSource *self, GeglTile *tile, gint x, gint y, gint z) { GeglTileBackend *backend; GeglTileBackendSwap *tile_backend_swap; SwapEntry *entry; backend = GEGL_TILE_BACKEND (self); tile_backend_swap = GEGL_TILE_BACKEND_SWAP (backend); entry = gegl_tile_backend_swap_lookup_entry (tile_backend_swap, x, y, z); if (entry != NULL) { GEGL_NOTE (GEGL_DEBUG_TILE_BACKEND, "void tile %i, %i, %i", x, y, z); gegl_tile_backend_swap_entry_destroy (tile_backend_swap, entry); } return NULL; }