Blame gegl/buffer/gegl-tile-storage.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 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
}