diff options
author | Benjamin Otte <otte@redhat.com> | 2012-11-14 00:55:50 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2012-11-14 01:55:28 +0100 |
commit | 78d0ef1d0b444c7a966e72a4359108ab1142a0be (patch) | |
tree | a86a728ef6fe497ecf479ede668f380f5ae53b27 /gtk/gtksizerequestcache.c | |
parent | 14c8e33ab93be91d76d1b301f824c36fd734a45a (diff) | |
download | gtk+-78d0ef1d0b444c7a966e72a4359108ab1142a0be.tar.gz |
sizerequestcache: Move commit function
Diffstat (limited to 'gtk/gtksizerequestcache.c')
-rw-r--r-- | gtk/gtksizerequestcache.c | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/gtk/gtksizerequestcache.c b/gtk/gtksizerequestcache.c index f7597ebb78..778ae2c922 100644 --- a/gtk/gtksizerequestcache.c +++ b/gtk/gtksizerequestcache.c @@ -59,3 +59,110 @@ _gtk_size_request_cache_clear (SizeRequestCache *cache) _gtk_size_request_cache_init (cache); } +void +_gtk_size_request_cache_commit (SizeRequestCache *cache, + GtkSizeGroupMode orientation, + gint for_size, + gint minimum_size, + gint natural_size) +{ + SizeRequest **cached_sizes; + guint i, n_sizes; + + /* First handle caching of the base requests */ + if (for_size < 0) + { + if (orientation == GTK_SIZE_GROUP_HORIZONTAL) + { + cache->cached_width.minimum_size = minimum_size; + cache->cached_width.natural_size = natural_size; + cache->cached_base_width = TRUE; + } + else + { + cache->cached_height.minimum_size = minimum_size; + cache->cached_height.natural_size = natural_size; + cache->cached_base_height = TRUE; + } + return; + } + + /* Check if the minimum_size and natural_size is already + * in the cache and if this result can be used to extend + * that cache entry + */ + if (orientation == GTK_SIZE_GROUP_HORIZONTAL) + { + cached_sizes = cache->widths; + n_sizes = cache->cached_widths; + } + else + { + cached_sizes = cache->heights; + n_sizes = cache->cached_heights; + } + + for (i = 0; i < n_sizes; i++) + { + if (cached_sizes[i]->cached_size.minimum_size == minimum_size && + cached_sizes[i]->cached_size.natural_size == natural_size) + { + cached_sizes[i]->lower_for_size = MIN (cached_sizes[i]->lower_for_size, for_size); + cached_sizes[i]->upper_for_size = MAX (cached_sizes[i]->upper_for_size, for_size); + return; + } + } + + /* If not found, pull a new size from the cache, the returned size cache + * will immediately be used to cache the new computed size so we go ahead + * and increment the last_cached_width/height right away */ + if (orientation == GTK_SIZE_GROUP_HORIZONTAL) + { + if (cache->cached_widths < GTK_SIZE_REQUEST_CACHED_SIZES) + { + cache->cached_widths++; + cache->last_cached_width = cache->cached_widths - 1; + } + else + { + if (++cache->last_cached_width == GTK_SIZE_REQUEST_CACHED_SIZES) + cache->last_cached_width = 0; + } + + if (!cache->widths) + cache->widths = g_slice_alloc0 (sizeof (SizeRequest *) * GTK_SIZE_REQUEST_CACHED_SIZES); + + if (!cache->widths[cache->last_cached_width]) + cache->widths[cache->last_cached_width] = g_slice_new (SizeRequest); + + cache->widths[cache->last_cached_width]->lower_for_size = for_size; + cache->widths[cache->last_cached_width]->upper_for_size = for_size; + cache->widths[cache->last_cached_width]->cached_size.minimum_size = minimum_size; + cache->widths[cache->last_cached_width]->cached_size.natural_size = natural_size; + } + else /* GTK_SIZE_GROUP_VERTICAL */ + { + if (cache->cached_heights < GTK_SIZE_REQUEST_CACHED_SIZES) + { + cache->cached_heights++; + cache->last_cached_height = cache->cached_heights - 1; + } + else + { + if (++cache->last_cached_height == GTK_SIZE_REQUEST_CACHED_SIZES) + cache->last_cached_height = 0; + } + + if (!cache->heights) + cache->heights = g_slice_alloc0 (sizeof (SizeRequest *) * GTK_SIZE_REQUEST_CACHED_SIZES); + + if (!cache->heights[cache->last_cached_height]) + cache->heights[cache->last_cached_height] = g_slice_new (SizeRequest); + + cache->heights[cache->last_cached_height]->lower_for_size = for_size; + cache->heights[cache->last_cached_height]->upper_for_size = for_size; + cache->heights[cache->last_cached_height]->cached_size.minimum_size = minimum_size; + cache->heights[cache->last_cached_height]->cached_size.natural_size = natural_size; + } +} + |