[mutter/wip/cb2eb3: 38/55] frames: Remove caching



commit 7c11e0b0eb43c23a4bdcda75690c9dbe79814060
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Sun Apr 29 21:49:40 2012 -0400

    frames: Remove caching
    
    XXX hack just to see how slow it is

 src/ui/frames.c |  263 -------------------------------------------------------
 src/ui/frames.h |    3 -
 2 files changed, 0 insertions(+), 266 deletions(-)
---
diff --git a/src/ui/frames.c b/src/ui/frames.c
index c69dfe6..548d5cc 100644
--- a/src/ui/frames.c
+++ b/src/ui/frames.c
@@ -96,7 +96,6 @@ static MetaFrameControl get_control  (MetaFrames        *frames,
                                       MetaUIFrame       *frame,
                                       int                x,
                                       int                y);
-static void invalidate_all_caches (MetaFrames *frames);
 static void invalidate_whole_window (MetaFrames *frames,
                                      MetaUIFrame *frame);
 
@@ -194,9 +193,6 @@ meta_frames_init (MetaFrames *frames)
 
   frames->expose_delay_count = 0;
 
-  frames->invalidate_frames = NULL;
-  frames->cache = g_hash_table_new (g_direct_hash, g_direct_equal);
-
   gtk_widget_set_double_buffered (GTK_WIDGET (frames), FALSE);
 
   meta_prefs_add_listener (prefs_changed_callback, frames);
@@ -247,78 +243,13 @@ meta_frames_finalize (GObject *object)
   meta_prefs_remove_listener (prefs_changed_callback, frames);
   
   g_hash_table_destroy (frames->text_heights);
-
-  invalidate_all_caches (frames);
   
   g_assert (g_hash_table_size (frames->frames) == 0);
   g_hash_table_destroy (frames->frames);
-  g_hash_table_destroy (frames->cache);
 
   G_OBJECT_CLASS (meta_frames_parent_class)->finalize (object);
 }
 
-typedef struct
-{
-  cairo_rectangle_int_t rect;
-  cairo_surface_t *pixmap;
-} CachedFramePiece;
-
-typedef struct
-{
-  /* Caches of the four rendered sides in a MetaFrame.
-   * Order: top (titlebar), left, right, bottom.
-   */
-  CachedFramePiece piece[4];
-} CachedPixels;
-
-static CachedPixels *
-get_cache (MetaFrames *frames,
-           MetaUIFrame *frame)
-{
-  CachedPixels *pixels;
-  
-  pixels = g_hash_table_lookup (frames->cache, frame);
-
-  if (!pixels)
-    {
-      pixels = g_new0 (CachedPixels, 1);
-      g_hash_table_insert (frames->cache, frame, pixels);
-    }
-
-  return pixels;
-}
-
-static void
-invalidate_cache (MetaFrames *frames,
-                  MetaUIFrame *frame)
-{
-  CachedPixels *pixels = get_cache (frames, frame);
-  int i;
-  
-  for (i = 0; i < 4; i++)
-    if (pixels->piece[i].pixmap)
-      cairo_surface_destroy (pixels->piece[i].pixmap);
-  
-  g_free (pixels);
-  g_hash_table_remove (frames->cache, frame);
-}
-
-static void
-invalidate_all_caches (MetaFrames *frames)
-{
-  GList *l;
-
-  for (l = frames->invalidate_frames; l; l = l->next)
-    {
-      MetaUIFrame *frame = l->data;
-
-      invalidate_cache (frames, frame);
-    }
-  
-  g_list_free (frames->invalidate_frames);
-  frames->invalidate_frames = NULL;
-}
-
 static void
 queue_recalc_func (gpointer key, gpointer value, gpointer data)
 {
@@ -580,11 +511,6 @@ meta_frames_unmanage_window (MetaFrames *frames,
 
   if (frame)
     {
-      /* invalidating all caches ensures the frame
-       * is not actually referenced anymore
-       */
-      invalidate_all_caches (frames);
-      
       /* restore the cursor */
       meta_core_set_screen_cursor (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
                                    frame->xwindow,
@@ -836,7 +762,6 @@ redraw_control (MetaFrames *frames,
   rect = control_rect (control, &fgeom);
 
   gdk_window_invalidate_rect (frame->window, rect, FALSE);
-  invalidate_cache (frames, frame);
 }
 
 static gboolean
@@ -1587,151 +1512,6 @@ meta_frames_destroy_event           (GtkWidget           *widget,
   return TRUE;
 }
 
-
-static void
-setup_bg_cr (cairo_t *cr, GdkWindow *window, int x_offset, int y_offset)
-{
-  GdkWindow *parent = gdk_window_get_parent (window);
-  cairo_pattern_t *bg_pattern;
-
-  bg_pattern = gdk_window_get_background_pattern (window);
-  if (bg_pattern == NULL && parent)
-    {
-      gint window_x, window_y;
-
-      gdk_window_get_position (window, &window_x, &window_y);
-      setup_bg_cr (cr, parent, x_offset + window_x, y_offset + window_y);
-    }
-  else if (bg_pattern)
-    {
-      cairo_translate (cr, - x_offset, - y_offset);
-      cairo_set_source (cr, bg_pattern);
-      cairo_translate (cr, x_offset, y_offset);
-    }
-}
-
-/* Returns a pixmap with a piece of the windows frame painted on it.
-*/
-
-static cairo_surface_t *
-generate_pixmap (MetaFrames            *frames,
-                 MetaUIFrame           *frame,
-                 cairo_rectangle_int_t *rect)
-{
-  cairo_surface_t *result;
-  cairo_t *cr;
-
-  /* do not create a pixmap for nonexisting areas */
-  if (rect->width <= 0 || rect->height <= 0)
-    return NULL;
-
-  result = gdk_window_create_similar_surface (frame->window,
-                                              CAIRO_CONTENT_COLOR,
-                                              rect->width, rect->height);
-  
-  cr = cairo_create (result);
-  cairo_translate (cr, -rect->x, -rect->y);
-
-  setup_bg_cr (cr, frame->window, 0, 0);
-  cairo_paint (cr);
-
-  meta_frames_paint (frames, frame, cr);
-
-  cairo_destroy (cr);
-
-  return result;
-}
-
-
-static void
-populate_cache (MetaFrames *frames,
-                MetaUIFrame *frame)
-{
-  MetaFrameBorders borders;
-  int width, height;
-  int frame_width, frame_height, screen_width, screen_height;
-  CachedPixels *pixels;
-  MetaFrameType frame_type;
-  MetaFrameFlags frame_flags;
-  int i;
-
-  meta_core_get (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
-                 frame->xwindow,
-                 META_CORE_GET_FRAME_WIDTH, &frame_width,
-                 META_CORE_GET_FRAME_HEIGHT, &frame_height,
-                 META_CORE_GET_SCREEN_WIDTH, &screen_width,
-                 META_CORE_GET_SCREEN_HEIGHT, &screen_height,
-                 META_CORE_GET_CLIENT_WIDTH, &width,
-                 META_CORE_GET_CLIENT_HEIGHT, &height,
-                 META_CORE_GET_FRAME_TYPE, &frame_type,
-                 META_CORE_GET_FRAME_FLAGS, &frame_flags,
-                 META_CORE_GET_END);
-
-  /* don't cache extremely large windows */
-  if (frame_width > 2 * screen_width ||
-      frame_height > 2 * screen_height)
-    {
-      return;
-    }
-  
-  meta_theme_get_frame_borders (frame->tv->theme,
-                                frame->tv->style_context,
-                                frame_type,
-                                frame->text_height,
-                                frame_flags,
-                                &borders);
-
-  pixels = get_cache (frames, frame);
-
-  /* Setup the rectangles for the four visible frame borders. First top, then
-   * left, right and bottom. Top and bottom extend to the invisible borders
-   * while left and right snugly fit in between:
-   *   -----
-   *   |   |
-   *   -----
-   */
-
-  /* width and height refer to the client window's
-   * size without any border added. */
-
-  /* top */
-  pixels->piece[0].rect.x = borders.invisible.left;
-  pixels->piece[0].rect.y = borders.invisible.top;
-  pixels->piece[0].rect.width = width + borders.visible.left + borders.visible.right;
-  pixels->piece[0].rect.height = borders.visible.top;
-
-  /* left */
-  pixels->piece[1].rect.x = borders.invisible.left;
-  pixels->piece[1].rect.y = borders.total.top;
-  pixels->piece[1].rect.height = height;
-  pixels->piece[1].rect.width = borders.visible.left;
-
-  /* right */
-  pixels->piece[2].rect.x = borders.total.left + width;
-  pixels->piece[2].rect.y = borders.total.top;
-  pixels->piece[2].rect.width = borders.visible.right;
-  pixels->piece[2].rect.height = height;
-
-  /* bottom */
-  pixels->piece[3].rect.x = borders.invisible.left;
-  pixels->piece[3].rect.y = borders.total.top + height;
-  pixels->piece[3].rect.width = width + borders.visible.left + borders.visible.right;
-  pixels->piece[3].rect.height = borders.visible.bottom;
-
-  for (i = 0; i < 4; i++)
-    {
-      CachedFramePiece *piece = &pixels->piece[i];
-      /* generate_pixmap() returns NULL for 0 width/height pieces, but
-       * does so cheaply so we don't need to cache the NULL return */
-      if (!piece->pixmap)
-        piece->pixmap = generate_pixmap (frames, frame, &piece->rect);
-    }
-
-  if (!g_list_find (frames->invalidate_frames, frame))
-    frames->invalidate_frames =
-      g_list_prepend (frames->invalidate_frames, frame);
-}
-
 static void
 clip_to_screen (cairo_region_t *region,
                 MetaUIFrame    *frame)
@@ -1799,39 +1579,12 @@ subtract_client_area (cairo_region_t *region,
   cairo_region_destroy (tmp_region);
 }
 
-static void
-cached_pixels_draw (CachedPixels   *pixels,
-                    cairo_t        *cr,
-                    cairo_region_t *region)
-{
-  cairo_region_t *region_piece;
-  int i;
-
-  for (i = 0; i < 4; i++)
-    {
-      CachedFramePiece *piece;
-      piece = &pixels->piece[i];
-      
-      if (piece->pixmap)
-        {
-          cairo_set_source_surface (cr, piece->pixmap,
-                                    piece->rect.x, piece->rect.y);
-          cairo_paint (cr);
-          
-          region_piece = cairo_region_create_rectangle (&piece->rect);
-          cairo_region_subtract (region, region_piece);
-          cairo_region_destroy (region_piece);
-        }
-    }
-}
-
 static gboolean
 meta_frames_draw (GtkWidget *widget,
                   cairo_t   *cr)
 {
   MetaUIFrame *frame;
   MetaFrames *frames;
-  CachedPixels *pixels;
   cairo_region_t *region;
   cairo_rectangle_int_t clip;
   cairo_surface_t *target;
@@ -1852,18 +1605,7 @@ meta_frames_draw (GtkWidget *widget,
       return TRUE;
     }
 
-  populate_cache (frames, frame);
-
   region = cairo_region_create_rectangle (&clip);
-  
-  pixels = get_cache (frames, frame);
-
-  /* cached_pixels_draw will subtract the painted
-   * parts from the region. */
-  cached_pixels_draw (pixels, cr, region);
-
-  if (cairo_region_num_rectangles (region) == 0)
-    goto out;
 
   clip_to_screen (region, frame);
   subtract_client_area (region, frame);
@@ -1871,12 +1613,8 @@ meta_frames_draw (GtkWidget *widget,
   if (cairo_region_num_rectangles (region) == 0)
     goto out;
 
-  /* OK. Now that we've painted the cached frame
-   * pixels, paint the actual pixels that are left over. */
-
   gdk_cairo_region (cr, region);
   cairo_clip (cr);
-
   meta_frames_paint (frames, frame, cr);
 
  out:
@@ -2321,5 +2059,4 @@ invalidate_whole_window (MetaFrames *frames,
                          MetaUIFrame *frame)
 {
   gdk_window_invalidate_rect (frame->window, NULL, FALSE);
-  invalidate_cache (frames, frame);
 }
diff --git a/src/ui/frames.h b/src/ui/frames.h
index 816fa99..d1002c3 100644
--- a/src/ui/frames.h
+++ b/src/ui/frames.h
@@ -96,9 +96,6 @@ struct _MetaFrames
   MetaUIFrame *last_motion_frame;
 
   int expose_delay_count;
-
-  GList *invalidate_frames;
-  GHashTable *cache;
 };
 
 struct _MetaFramesClass


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]