Blame gegl/buffer/gegl-tile-handler-chain.c

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
}