|
Packit |
bc1512 |
/* This file is part of GEGL.
|
|
Packit |
bc1512 |
*
|
|
Packit |
bc1512 |
* This library is free software; you can redistribute it and/or
|
|
Packit |
bc1512 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit |
bc1512 |
* License as published by the Free Software Foundation; either
|
|
Packit |
bc1512 |
* version 3 of the License, or (at your option) any later version.
|
|
Packit |
bc1512 |
*
|
|
Packit |
bc1512 |
* This library is distributed in the hope that it will be useful,
|
|
Packit |
bc1512 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
bc1512 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
bc1512 |
* Lesser General Public License for more details.
|
|
Packit |
bc1512 |
*
|
|
Packit |
bc1512 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
bc1512 |
* License along with GEGL; if not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
bc1512 |
*
|
|
Packit |
bc1512 |
* Copyright 2006, 2007 Øyvind Kolås <pippin@gimp.org>
|
|
Packit |
bc1512 |
*/
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
#include "config.h"
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
#include <glib-object.h>
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
#include "gegl.h"
|
|
Packit |
bc1512 |
#include "gegl-buffer-types.h"
|
|
Packit |
bc1512 |
#include "gegl-tile-storage.h"
|
|
Packit |
bc1512 |
#include "gegl-tile.h"
|
|
Packit |
bc1512 |
#include "gegl-tile-backend-file.h"
|
|
Packit |
bc1512 |
#include "gegl-tile-backend-ram.h"
|
|
Packit |
bc1512 |
#include "gegl-tile-backend-tiledir.h"
|
|
Packit |
bc1512 |
#include "gegl-tile-handler-empty.h"
|
|
Packit |
bc1512 |
#include "gegl-tile-handler-zoom.h"
|
|
Packit |
bc1512 |
#include "gegl-tile-handler-cache.h"
|
|
Packit |
bc1512 |
#include "gegl-tile-handler-log.h"
|
|
Packit |
bc1512 |
#include "gegl-types-internal.h"
|
|
Packit |
bc1512 |
#include "gegl-utils.h"
|
|
Packit |
bc1512 |
#include "gegl-config.h"
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
G_DEFINE_TYPE (GeglTileStorage, gegl_tile_storage, GEGL_TYPE_TILE_HANDLER_CHAIN)
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
static GObjectClass * parent_class = NULL;
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
enum
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
CHANGED,
|
|
Packit |
bc1512 |
LAST_SIGNAL
|
|
Packit |
bc1512 |
};
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
guint gegl_tile_storage_signals[LAST_SIGNAL] = { 0 };
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
static gboolean
|
|
Packit |
bc1512 |
tile_storage_idle (gpointer data)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
GeglTileStorage *tile_storage = GEGL_TILE_STORAGE (data);
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
if (0 /* nothing to do*/)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
tile_storage->idle_swapper = 0;
|
|
Packit |
bc1512 |
return FALSE;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
return gegl_tile_source_idle (GEGL_TILE_SOURCE (tile_storage));
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
GeglTileBackend *gegl_buffer_backend (GObject *buffer);
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
GeglTileStorage *
|
|
Packit |
bc1512 |
gegl_tile_storage_new (GeglTileBackend *backend)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
GeglTileStorage *tile_storage = g_object_new (GEGL_TYPE_TILE_STORAGE, NULL);
|
|
Packit |
bc1512 |
GeglTileHandlerChain *tile_handler_chain;
|
|
Packit |
bc1512 |
GeglTileHandler *handler;
|
|
Packit |
bc1512 |
GeglTileHandler *empty = NULL;
|
|
Packit |
bc1512 |
GeglTileHandler *zoom = NULL;
|
|
Packit |
bc1512 |
GeglTileHandlerCache *cache = NULL;
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
tile_storage->seen_zoom = 0;
|
|
Packit |
bc1512 |
tile_storage->mutex = g_mutex_new ();
|
|
Packit |
bc1512 |
tile_storage->width = G_MAXINT;
|
|
Packit |
bc1512 |
tile_storage->height = G_MAXINT;
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
if (g_object_class_find_property (G_OBJECT_GET_CLASS (backend), "path"))
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
g_object_get (backend, "path", &tile_storage->path, NULL);
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
tile_handler_chain = GEGL_TILE_HANDLER_CHAIN (tile_storage);
|
|
Packit |
bc1512 |
handler = GEGL_TILE_HANDLER (tile_storage);
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
tile_storage->tile_width = backend->priv->tile_width;
|
|
Packit |
bc1512 |
tile_storage->tile_height = backend->priv->tile_height;
|
|
Packit |
bc1512 |
tile_storage->px_size = backend->priv->px_size;
|
|
Packit |
bc1512 |
tile_storage->format = gegl_tile_backend_get_format (backend);
|
|
Packit |
bc1512 |
tile_storage->tile_size = gegl_tile_backend_get_tile_size (backend);
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
gegl_tile_handler_set_source (handler, (void*)backend);
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
{ /* should perhaps be a.. method on gegl_tile_handler_chain_set_source
|
|
Packit |
bc1512 |
wrapping handler_set_source() and this*/
|
|
Packit |
bc1512 |
GeglTileHandlerChain *tile_handler_chain2 = GEGL_TILE_HANDLER_CHAIN (handler);
|
|
Packit |
bc1512 |
GSList *iter = (void *) tile_handler_chain2->chain;
|
|
Packit |
bc1512 |
while (iter && iter->next)
|
|
Packit |
bc1512 |
iter = iter->next;
|
|
Packit |
bc1512 |
if (iter)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
gegl_tile_handler_set_source (GEGL_TILE_HANDLER (iter->data), handler->source);
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
backend = GEGL_TILE_BACKEND (handler->source);
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
#if 0
|
|
Packit |
bc1512 |
if (g_getenv("GEGL_LOG_TILE_BACKEND")||
|
|
Packit |
bc1512 |
g_getenv("GEGL_TILE_LOG"))
|
|
Packit |
bc1512 |
gegl_tile_handler_chain_add (tile_handler_chain,
|
|
Packit |
bc1512 |
g_object_new (GEGL_TYPE_TILE_HANDLER_LOG, NULL));
|
|
Packit |
bc1512 |
#endif
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
cache = g_object_new (GEGL_TYPE_TILE_HANDLER_CACHE, NULL);
|
|
Packit |
bc1512 |
empty = gegl_tile_handler_empty_new (backend, cache);
|
|
Packit |
bc1512 |
zoom = gegl_tile_handler_zoom_new (backend, tile_storage, cache);
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
gegl_tile_handler_chain_add (tile_handler_chain, (void*)cache);
|
|
Packit |
bc1512 |
gegl_tile_handler_chain_add (tile_handler_chain, zoom);
|
|
Packit |
bc1512 |
gegl_tile_handler_chain_add (tile_handler_chain, empty);
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
#if 0
|
|
Packit |
bc1512 |
if (g_getenv("GEGL_LOG_TILE_CACHE"))
|
|
Packit |
bc1512 |
gegl_tile_handler_chain_add (tile_handler_chain,
|
|
Packit |
bc1512 |
g_object_new (GEGL_TYPE_TILE_HANDLER_LOG, NULL));
|
|
Packit |
bc1512 |
#endif
|
|
Packit |
bc1512 |
tile_storage->cache = cache;
|
|
Packit |
bc1512 |
cache->tile_storage = tile_storage;
|
|
Packit |
bc1512 |
gegl_tile_handler_chain_bind (tile_handler_chain);
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
((GeglTileBackend *)gegl_buffer_backend ((void*)tile_storage))->priv->storage = (gpointer)
|
|
Packit |
bc1512 |
tile_storage;
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
tile_storage->idle_swapper = g_timeout_add_full (G_PRIORITY_LOW,
|
|
Packit |
bc1512 |
250,
|
|
Packit |
bc1512 |
tile_storage_idle,
|
|
Packit |
bc1512 |
tile_storage,
|
|
Packit |
bc1512 |
NULL);
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
return tile_storage;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
static void
|
|
Packit |
bc1512 |
gegl_tile_storage_finalize (GObject *object)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
GeglTileStorage *self = GEGL_TILE_STORAGE (object);
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
if (self->idle_swapper)
|
|
Packit |
bc1512 |
g_source_remove (self->idle_swapper);
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
if (self->path)
|
|
Packit |
bc1512 |
g_free (self->path);
|
|
Packit |
bc1512 |
g_mutex_free (self->mutex);
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
(*G_OBJECT_CLASS (parent_class)->finalize)(object);
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
static void
|
|
Packit |
bc1512 |
gegl_tile_storage_class_init (GeglTileStorageClass *class)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
GObjectClass *gobject_class = G_OBJECT_CLASS (class);
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
parent_class = g_type_class_peek_parent (class);
|
|
Packit |
bc1512 |
gobject_class->finalize = gegl_tile_storage_finalize;
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
gegl_tile_storage_signals[CHANGED] =
|
|
Packit |
bc1512 |
g_signal_new ("changed",
|
|
Packit |
bc1512 |
G_TYPE_FROM_CLASS (gobject_class),
|
|
Packit |
bc1512 |
G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
|
|
Packit |
bc1512 |
0,
|
|
Packit |
bc1512 |
NULL, NULL,
|
|
Packit |
bc1512 |
g_cclosure_marshal_VOID__BOXED,
|
|
Packit |
bc1512 |
G_TYPE_NONE, 1,
|
|
Packit |
bc1512 |
GEGL_TYPE_RECTANGLE);
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
static void
|
|
Packit |
bc1512 |
gegl_tile_storage_init (GeglTileStorage *buffer)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
}
|