[gtk+] textview: Get rid of the pixel cache



commit a9c05448a89e284327d4e0c1e662688d7395d941
Author: Benjamin Otte <otte redhat com>
Date:   Wed Oct 26 23:45:57 2016 +0200

    textview: Get rid of the pixel cache

 gtk/gtktextview.c |  142 +++--------------------------------------------------
 1 files changed, 7 insertions(+), 135 deletions(-)
---
diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c
index 9197bf7..7debc17 100644
--- a/gtk/gtktextview.c
+++ b/gtk/gtktextview.c
@@ -56,7 +56,6 @@
 #include "gtkcssstylepropertyprivate.h"
 #include "gtkpopover.h"
 #include "gtktoolbar.h"
-#include "gtkpixelcacheprivate.h"
 #include "gtkmagnifierprivate.h"
 
 #include "a11y/gtktextviewaccessibleprivate.h"
@@ -237,8 +236,6 @@ struct _GtkTextViewPrivate
 
   GtkTextPendingScroll *pending_scroll;
 
-  GtkPixelCache *pixel_cache;
-
   GtkGesture *multipress_gesture;
   GtkGesture *drag_gesture;
 
@@ -392,8 +389,6 @@ static void gtk_text_view_measure (GtkWidget      *widget,
                                    int            *natural_baseline);
 static void gtk_text_view_size_allocate        (GtkWidget        *widget,
                                                 GtkAllocation    *allocation);
-static void gtk_text_view_map                  (GtkWidget        *widget);
-static void gtk_text_view_unmap                (GtkWidget        *widget);
 static void gtk_text_view_realize              (GtkWidget        *widget);
 static void gtk_text_view_unrealize            (GtkWidget        *widget);
 static void gtk_text_view_style_updated        (GtkWidget        *widget);
@@ -616,9 +611,6 @@ static void gtk_text_view_update_handles       (GtkTextView           *text_view
 static void gtk_text_view_selection_bubble_popup_unset (GtkTextView *text_view);
 static void gtk_text_view_selection_bubble_popup_set   (GtkTextView *text_view);
 
-static void gtk_text_view_queue_draw_region (GtkWidget            *widget,
-                                             const cairo_region_t *region);
-
 static void gtk_text_view_get_rendered_rect (GtkTextView  *text_view,
                                              GdkRectangle *rect);
 
@@ -741,8 +733,6 @@ gtk_text_view_class_init (GtkTextViewClass *klass)
   gobject_class->finalize = gtk_text_view_finalize;
 
   widget_class->destroy = gtk_text_view_destroy;
-  widget_class->map = gtk_text_view_map;
-  widget_class->unmap = gtk_text_view_unmap;
   widget_class->realize = gtk_text_view_realize;
   widget_class->unrealize = gtk_text_view_unrealize;
   widget_class->style_updated = gtk_text_view_style_updated;
@@ -770,8 +760,6 @@ gtk_text_view_class_init (GtkTextViewClass *klass)
 
   widget_class->popup_menu = gtk_text_view_popup_menu;
 
-  widget_class->queue_draw_region = gtk_text_view_queue_draw_region;
-
   container_class->add = gtk_text_view_add;
   container_class->remove = gtk_text_view_remove;
   container_class->forall = gtk_text_view_forall;
@@ -1672,8 +1660,6 @@ gtk_text_view_init (GtkTextView *text_view)
 
   gtk_widget_set_can_focus (widget, TRUE);
 
-  priv->pixel_cache = _gtk_pixel_cache_new ();
-
   context = gtk_widget_get_style_context (GTK_WIDGET (text_view));
   gtk_style_context_add_class (context, GTK_STYLE_CLASS_VIEW);
 
@@ -3633,12 +3619,6 @@ gtk_text_view_destroy (GtkWidget *widget)
       priv->im_spot_idle = 0;
     }
 
-  if (priv->pixel_cache)
-    {
-      _gtk_pixel_cache_free (priv->pixel_cache);
-      priv->pixel_cache = NULL;
-    }
-
   if (priv->magnifier)
     _gtk_magnifier_set_inspected (GTK_MAGNIFIER (priv->magnifier), NULL);
 
@@ -4215,9 +4195,6 @@ gtk_text_view_size_allocate (GtkWidget *widget,
 
   DV(g_print(G_STRLOC"\n"));
 
-  _gtk_pixel_cache_set_extra_size (priv->pixel_cache, 64,
-                                   allocation->height / 2 + priv->top_border);
-
   gtk_widget_get_allocation (widget, &widget_allocation);
   size_changed =
     widget_allocation.width != allocation->width ||
@@ -4739,34 +4716,6 @@ gtk_text_view_unrealize (GtkWidget *widget)
 }
 
 static void
-gtk_text_view_map (GtkWidget *widget)
-{
-  GtkTextView *text_view;
-  GtkTextViewPrivate *priv;
-
-  text_view = GTK_TEXT_VIEW (widget);
-  priv = text_view->priv;
-
-  _gtk_pixel_cache_map (priv->pixel_cache);
-
-  GTK_WIDGET_CLASS (gtk_text_view_parent_class)->map (widget);
-}
-
-static void
-gtk_text_view_unmap (GtkWidget *widget)
-{
-  GtkTextView *text_view;
-  GtkTextViewPrivate *priv;
-
-  text_view = GTK_TEXT_VIEW (widget);
-  priv = text_view->priv;
-
-  GTK_WIDGET_CLASS (gtk_text_view_parent_class)->unmap (widget);
-
-  _gtk_pixel_cache_unmap (priv->pixel_cache);
-}
-
-static void
 text_window_set_padding (GtkTextView     *text_view,
                          GtkStyleContext *context)
 {
@@ -5836,10 +5785,9 @@ gtk_text_view_paint (GtkWidget      *widget,
 }
 
 static void
-draw_text (cairo_t  *cr,
-           gpointer  user_data)
+draw_text (GtkWidget *widget,
+           cairo_t   *cr)
 {
-  GtkWidget *widget = user_data;
   GtkTextView *text_view = GTK_TEXT_VIEW (widget);
   GtkTextViewPrivate *priv = text_view->priv;
   GtkStyleContext *context;
@@ -5938,29 +5886,11 @@ gtk_text_view_draw (GtkWidget *widget,
                                      GTK_TEXT_WINDOW_TEXT);
   if (gtk_cairo_should_draw_window (cr, window))
     {
-      cairo_rectangle_int_t view_rect;
-      cairo_rectangle_int_t canvas_rect;
-      GtkAllocation alloc;
-
       DV(g_print (">Exposed ("G_STRLOC")\n"));
 
-      gtk_widget_get_allocation (widget, &alloc);
-
-      view_rect.x = 0;
-      view_rect.y = 0;
-      view_rect.width = gdk_window_get_width (window);
-      view_rect.height = gdk_window_get_height (window);
-
-      canvas_rect.x = -gtk_adjustment_get_value (priv->hadjustment);
-      canvas_rect.y = -gtk_adjustment_get_value (priv->vadjustment);
-      canvas_rect.width = priv->width;
-      canvas_rect.height = priv->height;
-
       cairo_save (cr);
       gtk_cairo_transform_to_window (cr, widget, window);
-      _gtk_pixel_cache_draw (priv->pixel_cache, cr, window,
-                             &view_rect, &canvas_rect,
-                             draw_text, widget);
+      draw_text (widget, cr); 
       cairo_restore (cr);
     }
 
@@ -9672,18 +9602,10 @@ node_style_changed_cb (GtkCssNode        *node,
                        GtkCssStyleChange *change,
                        GtkWidget         *widget)
 {
-  GtkTextViewPrivate *priv = GTK_TEXT_VIEW (widget)->priv;
-
   if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_SIZE | GTK_CSS_AFFECTS_CLIP))
     gtk_widget_queue_resize (widget);
   else
     gtk_widget_queue_draw (widget);
-
-  if (node == priv->text_window->css_node)
-    {
-      GtkCssStyle *style = gtk_css_style_change_get_new_style (change);
-      gtk_pixel_cache_set_is_opaque (priv->pixel_cache, gtk_css_style_render_background_is_opaque (style));
-    }
 }
 
 static void
@@ -9793,60 +9715,14 @@ gtk_text_view_get_rendered_rect (GtkTextView  *text_view,
 {
   GtkTextViewPrivate *priv = text_view->priv;
   GdkWindow *window;
-  guint extra_w;
-  guint extra_h;
-
-  _gtk_pixel_cache_get_extra_size (priv->pixel_cache, &extra_w, &extra_h);
 
   window = gtk_text_view_get_window (text_view, GTK_TEXT_WINDOW_TEXT);
 
-  rect->x = gtk_adjustment_get_value (priv->hadjustment) - extra_w;
-  rect->y = gtk_adjustment_get_value (priv->vadjustment) - extra_h - priv->top_border;
-
-  rect->height = gdk_window_get_height (window) + (extra_h * 2);
-  rect->width = gdk_window_get_width (window) + (extra_w * 2);
-}
-
-static void
-gtk_text_view_queue_draw_region (GtkWidget            *widget,
-                                 const cairo_region_t *region)
-{
-  GtkTextView *text_view = GTK_TEXT_VIEW (widget);
-
-  /* There is no way we can know if a region targets the
-     not-currently-visible but in pixel cache region, so we
-     always just invalidate the whole thing whenever the
-     text view gets a queue draw. This doesn't normally happen
-     in normal scrolling cases anyway. */
-  _gtk_pixel_cache_invalidate (text_view->priv->pixel_cache, NULL);
+  rect->x = gtk_adjustment_get_value (priv->hadjustment);
+  rect->y = gtk_adjustment_get_value (priv->vadjustment) - priv->top_border;
 
-  GTK_WIDGET_CLASS (gtk_text_view_parent_class)->queue_draw_region (widget, region);
-}
-
-static void
-text_window_invalidate_handler (GdkWindow      *window,
-                                cairo_region_t *region)
-{
-  gpointer widget;
-  GtkTextView *text_view;
-  GtkTextViewPrivate *priv;
-  int x, y;
-
-  gdk_window_get_user_data (window, &widget);
-  text_view = GTK_TEXT_VIEW (widget);
-  priv = text_view->priv;
-
-  /* Scrolling will invalidate everything in the bin window,
-   * but we already have it in the cache, so we can ignore that */
-  if (priv->in_scroll)
-    return;
-
-  x = priv->xoffset;
-  y = priv->yoffset + priv->top_border;
-
-  cairo_region_translate (region, x, y);
-  _gtk_pixel_cache_invalidate (priv->pixel_cache, region);
-  cairo_region_translate (region, -x, -y);
+  rect->height = gdk_window_get_height (window);
+  rect->width = gdk_window_get_width (window);
 }
 
 static void
@@ -9881,10 +9757,6 @@ text_window_realize (GtkTextWindow *win,
 
   gtk_widget_register_window (win->widget, win->bin_window);
 
-  if (win->type == GTK_TEXT_WINDOW_TEXT)
-    gdk_window_set_invalidate_handler (win->bin_window,
-                                       text_window_invalidate_handler);
-
   gdk_window_show (win->bin_window);
 
   switch (win->type)


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