void gegl_cache_invalidate (GeglCache *self, const GeglRectangle *roi) { gint i; g_mutex_lock (&self->mutex); if (roi) { GeglRectangle expanded = gegl_rectangle_expand (roi); GeglRegion *temp_region; temp_region = gegl_region_rectangle (&expanded); for (i = 0; i < GEGL_CACHE_VALID_MIPMAPS; i++) gegl_region_subtract (self->valid_region[i], temp_region); gegl_region_destroy (temp_region); g_signal_emit (self, gegl_cache_signals[INVALIDATED], 0, roi, NULL); } else { GeglRectangle rect = { 0, 0, 0, 0 }; /* should probably be the extent of the cache */ for (i = 0; i < GEGL_CACHE_VALID_MIPMAPS; i++) { if (self->valid_region[i]) gegl_region_destroy (self->valid_region[i]); self->valid_region[i] = gegl_region_new (); } g_signal_emit (self, gegl_cache_signals[INVALIDATED], 0, &rect, NULL); } g_mutex_unlock (&self->mutex); }
static void gegl_cache_constructed (GObject *object) { GeglCache *self = GEGL_CACHE (object); gint i; G_OBJECT_CLASS (gegl_cache_parent_class)->constructed (object); for (i = 0; i < GEGL_CACHE_VALID_MIPMAPS; i++) self->valid_region[i] = gegl_region_new (); }
static GObject * gegl_cache_constructor (GType type, guint n_params, GObjectConstructParam *params) { GObject *object; GeglCache *self; object = G_OBJECT_CLASS (gegl_cache_parent_class)->constructor (type, n_params, params); self = GEGL_CACHE (object); self->valid_region = gegl_region_new (); self->format = GEGL_BUFFER (self)->format; return object; }
void gegl_cache_invalidate (GeglCache *self, const GeglRectangle *roi) { #if 0 if (roi) { gegl_buffer_clear (GEGL_BUFFER (self), roi); } else { g_warning ("XXX: full invalidation of GeglCache NYI\n"); } #endif g_mutex_lock (self->mutex); if (roi) { GeglRectangle expanded = gegl_rectangle_expand (roi); GeglRegion *temp_region; temp_region = gegl_region_rectangle (&expanded); gegl_region_subtract (self->valid_region, temp_region); gegl_region_destroy (temp_region); g_signal_emit (self, gegl_cache_signals[INVALIDATED], 0, roi, NULL); } else { GeglRectangle rect = { 0, 0, 0, 0 }; /* should probably be the extent of the cache */ if (self->valid_region) gegl_region_destroy (self->valid_region); self->valid_region = gegl_region_new (); g_signal_emit (self, gegl_cache_signals[INVALIDATED], 0, &rect, NULL); } g_mutex_unlock (self->mutex); }