static void gegl_buffer_dispose (GObject *object) { GeglBuffer *buffer = GEGL_BUFFER (object); GeglTileHandler *handler = GEGL_TILE_HANDLER (object); gegl_buffer_sample_cleanup (buffer); if (gegl_cl_is_accelerated ()) gegl_buffer_cl_cache_invalidate (GEGL_BUFFER (object), NULL); if (handler->source && GEGL_IS_TILE_STORAGE (handler->source)) { GeglTileBackend *backend = gegl_buffer_backend (buffer); /* only flush non-internal backends,. */ if (!(GEGL_IS_TILE_BACKEND_FILE (backend) || GEGL_IS_TILE_BACKEND_RAM (backend) || GEGL_IS_TILE_BACKEND_TILE_DIR (backend))) gegl_buffer_flush (buffer); gegl_tile_source_reinit (GEGL_TILE_SOURCE (handler->source)); #if 0 g_object_unref (handler->source); handler->source = NULL; /* this might be a dangerous way of marking that we have already voided */ #endif } _gegl_buffer_drop_hot_tile (buffer); G_OBJECT_CLASS (parent_class)->dispose (object); }
static gboolean test_buffer_path (void) { gboolean result = TRUE; gchar *tmpdir = NULL; gchar *buf_a_path = NULL; gchar *buf_a_real_path = NULL; GeglBuffer *buf_a = NULL; GeglTileBackend *backend_a = NULL; GeglRectangle roi = {0, 0, 128, 128}; tmpdir = g_dir_make_tmp ("test-backend-file-XXXXXX", NULL); g_return_val_if_fail (tmpdir, FALSE); buf_a_path = g_build_filename (tmpdir, "buf_a.gegl", NULL); buf_a = g_object_new (GEGL_TYPE_BUFFER, "format", babl_format ("R'G'B'A u8"), "path", buf_a_path, "x", roi.x, "y", roi.y, "width", roi.width, "height", roi.height, NULL); g_object_get (buf_a, "path", &buf_a_real_path, "backend", &backend_a, NULL); if (!GEGL_IS_TILE_BACKEND_FILE (backend_a)) { printf ("Buffer did not use the file backend.\n"); result = FALSE; } if (g_strcmp0 (buf_a_path, buf_a_real_path)) { printf ("Paths do not match:\n%s\n%s\n", buf_a_path, buf_a_real_path); result = FALSE; } g_object_unref (buf_a); g_object_unref (backend_a); g_free (buf_a_real_path); g_unlink (buf_a_path); g_remove (tmpdir); g_free (tmpdir); g_free (buf_a_path); return result; }
static void gegl_buffer_get_property (GObject *gobject, guint property_id, GValue *value, GParamSpec *pspec) { GeglBuffer *buffer = GEGL_BUFFER (gobject); switch (property_id) { case PROP_WIDTH: g_value_set_int (value, buffer->extent.width); break; case PROP_HEIGHT: g_value_set_int (value, buffer->extent.height); break; case PROP_TILE_WIDTH: g_value_set_int (value, buffer->tile_width); break; case PROP_TILE_HEIGHT: g_value_set_int (value, buffer->tile_height); break; case PROP_PATH: { GeglTileBackend *backend = gegl_buffer_backend (buffer); if (GEGL_IS_TILE_BACKEND_FILE(backend)) { if (buffer->path) g_free (buffer->path); buffer->path = NULL; g_object_get (backend, "path", &buffer->path, NULL); } } g_value_set_string (value, buffer->path); break; case PROP_PIXELS: g_value_set_int (value, buffer->extent.width * buffer->extent.height); break; case PROP_PX_SIZE: g_value_set_int (value, buffer->tile_storage->px_size); break; case PROP_FORMAT: /* might already be set the first time, if it was set during * construction, we're caching the value in the buffer itself, * since it will never change. */ { const Babl *format; format = buffer->soft_format; if (format == NULL) format = buffer->format; if (format == NULL) format = gegl_buffer_internal_get_format (buffer); g_value_set_pointer (value, (void*)format); } break; case PROP_BACKEND: g_value_set_pointer (value, buffer->backend); break; case PROP_X: g_value_set_int (value, buffer->extent.x); break; case PROP_Y: g_value_set_int (value, buffer->extent.y); break; case PROP_SHIFT_X: g_value_set_int (value, buffer->shift_x); break; case PROP_SHIFT_Y: g_value_set_int (value, buffer->shift_y); break; case PROP_ABYSS_X: g_value_set_int (value, buffer->abyss.x); break; case PROP_ABYSS_Y: g_value_set_int (value, buffer->abyss.y); break; case PROP_ABYSS_WIDTH: g_value_set_int (value, buffer->abyss.width); break; case PROP_ABYSS_HEIGHT: g_value_set_int (value, buffer->abyss.height); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, property_id, pspec); break; } }