From 6a59ccf840043fca6424611f9d789dcf9ffc85a0 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Fri, 19 Jul 2019 22:44:22 +0200 Subject: [PATCH] libgimp: remove GimpTile from the public API, and kill the tile cache --- libgimp/Makefile.am | 1 - libgimp/gimp.def | 1 - libgimp/gimp.h | 1 - libgimp/gimpdrawable.c | 47 +------- libgimp/gimpdrawable.h | 2 - libgimp/gimptile.c | 196 +------------------------------- libgimp/gimptile.h | 7 -- libgimp/gimptilebackendplugin.c | 6 +- libgimp/gimptypes.h | 1 - 9 files changed, 3 insertions(+), 259 deletions(-) diff --git a/libgimp/Makefile.am b/libgimp/Makefile.am index c9ef274a3f..a0c984d0a4 100644 --- a/libgimp/Makefile.am +++ b/libgimp/Makefile.am @@ -321,7 +321,6 @@ gimpinclude_HEADERS = \ gimpproceduraldb.h \ gimpprogress.h \ gimpselection.h \ - gimptile.h \ \ gimpui.h \ gimpuitypes.h \ diff --git a/libgimp/gimp.def b/libgimp/gimp.def index b6223fc17f..7bd79ab887 100644 --- a/libgimp/gimp.def +++ b/libgimp/gimp.def @@ -683,7 +683,6 @@ EXPORTS gimp_text_layer_set_letter_spacing gimp_text_layer_set_line_spacing gimp_text_layer_set_text - gimp_tile_cache_ntiles gimp_tile_height gimp_tile_width gimp_uninstall_temp_proc diff --git a/libgimp/gimp.h b/libgimp/gimp.h index 8b408837f8..e0273d1f04 100644 --- a/libgimp/gimp.h +++ b/libgimp/gimp.h @@ -51,7 +51,6 @@ #include #include #include -#include #include diff --git a/libgimp/gimpdrawable.c b/libgimp/gimpdrawable.c index 8edcb97dd5..d2bfccb771 100644 --- a/libgimp/gimpdrawable.c +++ b/libgimp/gimpdrawable.c @@ -23,6 +23,7 @@ #define GIMP_DISABLE_DEPRECATION_WARNINGS #include "gimp.h" +#include "gimptile.h" #include "gimptilebackendplugin.h" @@ -92,8 +93,6 @@ gimp_drawable_detach (GimpDrawable *drawable) { g_return_if_fail (drawable != NULL); - gimp_drawable_flush (drawable); - if (drawable->tiles) g_free (drawable->tiles); @@ -103,50 +102,6 @@ gimp_drawable_detach (GimpDrawable *drawable) g_slice_free (GimpDrawable, drawable); } -/** - * gimp_drawable_flush: - * @drawable: The #GimpDrawable whose tile data is to be transferred - * to the core. - * - * This function causes all tile data in the tile list of @drawable to be - * transferred to the core. It is usually called in situations where a - * plug-in acts on a drawable, and then needs to read the results of its - * actions. Data transferred back from the core will not generally be valid - * unless gimp_drawable_flush() has been called beforehand. - **/ -void -gimp_drawable_flush (GimpDrawable *drawable) -{ - GimpTile *tiles; - gint n_tiles; - gint i; - - g_return_if_fail (drawable != NULL); - - if (drawable->tiles) - { - tiles = drawable->tiles; - n_tiles = drawable->ntile_rows * drawable->ntile_cols; - - for (i = 0; i < n_tiles; i++) - if ((tiles[i].ref_count > 0) && tiles[i].dirty) - _gimp_tile_flush (&tiles[i]); - } - - if (drawable->shadow_tiles) - { - tiles = drawable->shadow_tiles; - n_tiles = drawable->ntile_rows * drawable->ntile_cols; - - for (i = 0; i < n_tiles; i++) - if ((tiles[i].ref_count > 0) && tiles[i].dirty) - _gimp_tile_flush (&tiles[i]); - } - - /* nuke all references to this drawable from the cache */ - _gimp_tile_cache_flush_drawable (drawable); -} - GimpTile * gimp_drawable_get_tile (GimpDrawable *drawable, gboolean shadow, diff --git a/libgimp/gimpdrawable.h b/libgimp/gimpdrawable.h index 41623e7627..038ed5238f 100644 --- a/libgimp/gimpdrawable.h +++ b/libgimp/gimpdrawable.h @@ -52,8 +52,6 @@ GIMP_DEPRECATED_FOR(gimp_drawable_get_buffer) GimpDrawable * gimp_drawable_get (gint32 drawable_ID); GIMP_DEPRECATED void gimp_drawable_detach (GimpDrawable *drawable); -GIMP_DEPRECATED_FOR(gegl_buffer_flush) -void gimp_drawable_flush (GimpDrawable *drawable); GIMP_DEPRECATED_FOR(gimp_drawable_get_buffer) GimpTile * gimp_drawable_get_tile (GimpDrawable *drawable, gboolean shadow, diff --git a/libgimp/gimptile.c b/libgimp/gimptile.c index fdd8e0b213..68e8fe9958 100644 --- a/libgimp/gimptile.c +++ b/libgimp/gimptile.c @@ -31,6 +31,7 @@ #include "libgimpbase/gimpwire.h" #include "gimp.h" +#include "gimptile.h" /** @@ -54,38 +55,10 @@ void gimp_read_expect_msg (GimpWireMessage *msg, static void gimp_tile_get (GimpTile *tile); static void gimp_tile_put (GimpTile *tile); -static void gimp_tile_cache_insert (GimpTile *tile); -static void gimp_tile_cache_flush (GimpTile *tile); - - -/* private variables */ - -static GHashTable * tile_hash_table = NULL; -static GList * tile_list_head = NULL; -static GList * tile_list_tail = NULL; -static gulong max_tile_size = 0; -static gulong cur_cache_size = 0; -static gulong max_cache_size = 0; /* public functions */ -void -_gimp_tile_ref (GimpTile *tile) -{ - g_return_if_fail (tile != NULL); - - tile->ref_count++; - - if (tile->ref_count == 1) - { - gimp_tile_get (tile); - tile->dirty = FALSE; - } - - gimp_tile_cache_insert (tile); -} - void _gimp_tile_ref_nocache (GimpTile *tile, gboolean init) @@ -138,47 +111,6 @@ _gimp_tile_flush (GimpTile *tile) } } -/** - * gimp_tile_cache_ntiles: - * @ntiles: number of tiles that should fit into the cache - * - * Sets the size of the tile cache on the plug-in side. This function - * is similar to gimp_tile_cache_size() but supports specifying the - * number of tiles directly. - * - * If your plug-in access pixels tile-by-tile, it doesn't need a tile - * cache at all. If however the plug-in accesses drawable pixel data - * row-by-row, it should set the tile cache large enough to hold the - * number of tiles per row. Double this size if your plug-in uses - * shadow tiles. - **/ -void -gimp_tile_cache_ntiles (gulong ntiles) -{ - max_cache_size = (ntiles * - gimp_tile_width () * - gimp_tile_height () * 4); -} - -void -_gimp_tile_cache_flush_drawable (GimpDrawable *drawable) -{ - GList *list; - - g_return_if_fail (drawable != NULL); - - list = tile_list_head; - while (list) - { - GimpTile *tile = list->data; - - list = list->next; - - if (tile->drawable == drawable) - gimp_tile_cache_flush (tile); - } -} - /* private functions */ @@ -281,129 +213,3 @@ gimp_tile_put (GimpTile *tile) gp_unlock (); gimp_wire_destroy (&msg); } - -/* This function is nearly identical to the function 'tile_cache_insert' - * in the file 'tile_cache.c' which is part of the main gimp application. - */ -static void -gimp_tile_cache_insert (GimpTile *tile) -{ - GList *list; - - if (!tile_hash_table) - { - tile_hash_table = g_hash_table_new (g_direct_hash, NULL); - max_tile_size = gimp_tile_width () * gimp_tile_height () * 4; - } - - /* First check and see if the tile is already - * in the cache. In that case we will simply place - * it at the end of the tile list to indicate that - * it was the most recently accessed tile. - */ - list = g_hash_table_lookup (tile_hash_table, tile); - - if (list) - { - /* The tile was already in the cache. Place it at - * the end of the tile list. - */ - - /* If the tile is already at the end of the list, we are done */ - if (list == tile_list_tail) - return; - - /* At this point we have at least two elements in our list */ - g_assert (tile_list_head != tile_list_tail); - - tile_list_head = g_list_remove_link (tile_list_head, list); - - tile_list_tail = g_list_last (g_list_concat (tile_list_tail, list)); - } - else - { - /* The tile was not in the cache. First check and see - * if there is room in the cache. If not then we'll have - * to make room first. Note: it might be the case that the - * cache is smaller than the size of a tile in which case - * it won't be possible to put it in the cache. - */ - - if ((cur_cache_size + max_tile_size) > max_cache_size) - { - while (tile_list_head && - (cur_cache_size + - max_cache_size * FREE_QUANTUM) > max_cache_size) - { - gimp_tile_cache_flush ((GimpTile *) tile_list_head->data); - } - - if ((cur_cache_size + max_tile_size) > max_cache_size) - return; - } - - /* Place the tile at the end of the tile list. - */ - tile_list_tail = g_list_append (tile_list_tail, tile); - - if (! tile_list_head) - tile_list_head = tile_list_tail; - - tile_list_tail = g_list_last (tile_list_tail); - - /* Add the tiles list node to the tile hash table. - */ - g_hash_table_insert (tile_hash_table, tile, tile_list_tail); - - /* Note the increase in the number of bytes the cache - * is referencing. - */ - cur_cache_size += max_tile_size; - - /* Reference the tile so that it won't be returned to - * the main gimp application immediately. - */ - tile->ref_count++; - } -} - -static void -gimp_tile_cache_flush (GimpTile *tile) -{ - GList *list; - - if (! tile_hash_table) - return; - - /* Find where the tile is in the cache. - */ - list = g_hash_table_lookup (tile_hash_table, tile); - - if (list) - { - /* If the tile is in the cache, then remove it from the - * tile list. - */ - if (list == tile_list_tail) - tile_list_tail = tile_list_tail->prev; - - tile_list_head = g_list_remove_link (tile_list_head, list); - - if (! tile_list_head) - tile_list_tail = NULL; - - /* Remove the tile from the tile hash table. - */ - g_hash_table_remove (tile_hash_table, tile); - g_list_free (list); - - /* Note the decrease in the number of bytes the cache - * is referencing. - */ - cur_cache_size -= max_tile_size; - - /* Unreference the tile. - */ - _gimp_tile_unref (tile, FALSE); - } -} diff --git a/libgimp/gimptile.h b/libgimp/gimptile.h index 5f5cbe547c..e41c703b46 100644 --- a/libgimp/gimptile.h +++ b/libgimp/gimptile.h @@ -44,13 +44,8 @@ struct _GimpTile }; -GIMP_DEPRECATED -void gimp_tile_cache_ntiles (gulong ntiles); - - /* private function */ -G_GNUC_INTERNAL void _gimp_tile_ref (GimpTile *tile); G_GNUC_INTERNAL void _gimp_tile_unref (GimpTile *tile, gboolean dirty); G_GNUC_INTERNAL void _gimp_tile_ref_nocache (GimpTile *tile, @@ -58,8 +53,6 @@ G_GNUC_INTERNAL void _gimp_tile_ref_nocache (GimpTile *tile, G_GNUC_INTERNAL void _gimp_tile_flush (GimpTile *tile); -G_GNUC_INTERNAL void _gimp_tile_cache_flush_drawable (GimpDrawable *drawable); - G_END_DECLS diff --git a/libgimp/gimptilebackendplugin.c b/libgimp/gimptilebackendplugin.c index abcb4c06ae..929b68a138 100644 --- a/libgimp/gimptilebackendplugin.c +++ b/libgimp/gimptilebackendplugin.c @@ -25,6 +25,7 @@ #define GIMP_DISABLE_DEPRECATION_WARNINGS #include "gimp.h" +#include "gimptile.h" #include "gimptilebackendplugin.h" @@ -158,11 +159,6 @@ gimp_tile_backend_plugin_command (GeglTileSource *tile_store, break; case GEGL_TILE_FLUSH: - g_mutex_lock (&backend_plugin_mutex); - - gimp_drawable_flush (backend_plugin->priv->drawable); - - g_mutex_unlock (&backend_plugin_mutex); break; default: diff --git a/libgimp/gimptypes.h b/libgimp/gimptypes.h index 156dd0a43a..42b3627136 100644 --- a/libgimp/gimptypes.h +++ b/libgimp/gimptypes.h @@ -31,7 +31,6 @@ G_BEGIN_DECLS typedef struct _GimpPlugInInfo GimpPlugInInfo; typedef struct _GimpTile GimpTile; typedef struct _GimpDrawable GimpDrawable; -typedef struct _GimpPixelRgn GimpPixelRgn; typedef struct _GimpParamDef GimpParamDef; typedef struct _GimpParamRegion GimpParamRegion; typedef union _GimpParamData GimpParamData;