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 node_invalidated (GeglNode *source, const GeglRectangle *rect, gpointer data) { GeglCache *cache = GEGL_CACHE (data); GeglRectangle expanded = gegl_rectangle_expand (rect); { GeglRegion *region; region = gegl_region_rectangle (&expanded); gegl_region_subtract (cache->valid_region, region); gegl_region_destroy (region); } g_mutex_lock (cache->mutex); g_signal_emit_by_name (cache, "invalidated", &expanded, NULL); g_mutex_unlock (cache->mutex); }
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); }