|
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 this library; 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.h>
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
#include "glib-object.h"
|
|
Packit |
bc1512 |
#include "gegl-buffer-types.h"
|
|
Packit |
bc1512 |
#include "gegl-tile-handler-chain.h"
|
|
Packit |
bc1512 |
#include "gegl-tile-handler-cache.h"
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
G_DEFINE_TYPE (GeglTileHandlerChain, gegl_tile_handler_chain, GEGL_TYPE_TILE_HANDLER)
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
static void
|
|
Packit |
bc1512 |
gegl_tile_handler_chain_nuke_cache (GeglTileHandlerChain *tile_handler_chain)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
GSList *iter;
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
while (gegl_tile_handler_chain_get_first (tile_handler_chain, GEGL_TYPE_TILE_HANDLER_CACHE))
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
iter = tile_handler_chain->chain;
|
|
Packit |
bc1512 |
while (iter)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
if (GEGL_IS_TILE_HANDLER_CACHE (iter->data))
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
g_object_unref (iter->data);
|
|
Packit |
bc1512 |
tile_handler_chain->chain = g_slist_remove (tile_handler_chain->chain, iter->data);
|
|
Packit |
bc1512 |
break;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
iter = iter->next;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
static void
|
|
Packit |
bc1512 |
gegl_tile_handler_chain_dispose (GObject *object)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
GeglTileHandlerChain *tile_handler_chain = GEGL_TILE_HANDLER_CHAIN (object);
|
|
Packit |
bc1512 |
GSList *iter;
|
|
Packit |
bc1512 |
GSList *chain;
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
/* Get rid of the cache before any further parts of the deconstruction of the
|
|
Packit |
bc1512 |
* TileStore chain, unwritten tiles need a living TileStore for their
|
|
Packit |
bc1512 |
* deconstruction.
|
|
Packit |
bc1512 |
*/
|
|
Packit |
bc1512 |
gegl_tile_handler_chain_nuke_cache (tile_handler_chain);
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
/* While we destroy tile_handler_chain->chain, don't have
|
|
Packit |
bc1512 |
* tile_handler_chain->chain set, because it might otherwise be used
|
|
Packit |
bc1512 |
* by other objects in the dispose phase
|
|
Packit |
bc1512 |
*/
|
|
Packit |
bc1512 |
chain = tile_handler_chain->chain;
|
|
Packit |
bc1512 |
tile_handler_chain->chain = NULL;
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
iter = chain;
|
|
Packit |
bc1512 |
while (iter)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
if (iter->data)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
if (G_IS_OBJECT (iter->data))
|
|
Packit |
bc1512 |
g_object_unref (iter->data);
|
|
Packit |
bc1512 |
else
|
|
Packit |
bc1512 |
g_free (iter->data);
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
iter = iter->next;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
if (chain)
|
|
Packit |
bc1512 |
g_slist_free (chain);
|
|
Packit |
bc1512 |
chain = NULL;
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
G_OBJECT_CLASS (gegl_tile_handler_chain_parent_class)->dispose (object);
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
static void
|
|
Packit |
bc1512 |
gegl_tile_handler_chain_finalize (GObject *object)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
G_OBJECT_CLASS (gegl_tile_handler_chain_parent_class)->finalize (object);
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
static gpointer
|
|
Packit |
bc1512 |
gegl_tile_handler_chain_command (GeglTileSource *tile_store,
|
|
Packit |
bc1512 |
GeglTileCommand command,
|
|
Packit |
bc1512 |
gint x,
|
|
Packit |
bc1512 |
gint y,
|
|
Packit |
bc1512 |
gint z,
|
|
Packit |
bc1512 |
gpointer data)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
GeglTileHandlerChain *tile_handler_chain = (GeglTileHandlerChain *) tile_store;
|
|
Packit |
bc1512 |
GeglTileSource *source = ((GeglTileHandler *) tile_store)->source;
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
if (tile_handler_chain->chain != NULL)
|
|
Packit |
bc1512 |
return gegl_tile_source_command ((GeglTileSource *)(tile_handler_chain->chain->data),
|
|
Packit |
bc1512 |
command, x, y, z, data);
|
|
Packit |
bc1512 |
else if (source)
|
|
Packit |
bc1512 |
return gegl_tile_source_command (source, command, x, y, z, data);
|
|
Packit |
bc1512 |
else
|
|
Packit |
bc1512 |
g_assert (0);
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
return FALSE;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
static void
|
|
Packit |
bc1512 |
gegl_tile_handler_chain_class_init (GeglTileHandlerChainClass *class)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
GObjectClass *gobject_class;
|
|
Packit |
bc1512 |
gobject_class = (GObjectClass *) class;
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
gobject_class->finalize = gegl_tile_handler_chain_finalize;
|
|
Packit |
bc1512 |
gobject_class->dispose = gegl_tile_handler_chain_dispose;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
static void
|
|
Packit |
bc1512 |
gegl_tile_handler_chain_init (GeglTileHandlerChain *self)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
((GeglTileSource*)self)->command = gegl_tile_handler_chain_command;
|
|
Packit |
bc1512 |
self->chain = NULL;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
void
|
|
Packit |
bc1512 |
gegl_tile_handler_chain_bind (GeglTileHandlerChain *tile_handler_chain)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
GSList *iter;
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
iter = tile_handler_chain->chain;
|
|
Packit |
bc1512 |
while (iter)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
GeglTileHandler *handler;
|
|
Packit |
bc1512 |
GeglTileSource *source = NULL;
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
handler = iter->data;
|
|
Packit |
bc1512 |
if (iter->next)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
source = iter->next->data;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
else
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
source = gegl_tile_handler_get_source (tile_handler_chain);
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
gegl_tile_handler_set_source (handler, source);
|
|
Packit |
bc1512 |
iter = iter->next;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
GeglTileHandler *
|
|
Packit |
bc1512 |
gegl_tile_handler_chain_add (GeglTileHandlerChain *tile_handler_chain,
|
|
Packit |
bc1512 |
GeglTileHandler *handler)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
tile_handler_chain->chain = g_slist_prepend (tile_handler_chain->chain, handler);
|
|
Packit |
bc1512 |
/*gegl_tile_handler_chain_bind (tile_handler_chain);*/
|
|
Packit |
bc1512 |
return handler;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
/*
|
|
Packit |
bc1512 |
* return the first handler of a given type
|
|
Packit |
bc1512 |
*/
|
|
Packit |
bc1512 |
GeglTileHandler *
|
|
Packit |
bc1512 |
gegl_tile_handler_chain_get_first (GeglTileHandlerChain *tile_handler_chain,
|
|
Packit |
bc1512 |
GType type)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
GSList *iter;
|
|
Packit |
bc1512 |
|
|
Packit |
bc1512 |
iter = tile_handler_chain->chain;
|
|
Packit |
bc1512 |
while (iter)
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
if ((G_TYPE_CHECK_INSTANCE_TYPE ((iter->data), type)))
|
|
Packit |
bc1512 |
{
|
|
Packit |
bc1512 |
return iter->data;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
iter = iter->next;
|
|
Packit |
bc1512 |
}
|
|
Packit |
bc1512 |
return NULL;
|
|
Packit |
bc1512 |
}
|