[gtksourceview/wip/gutter-draw-refactoring] gutter: split on_view_draw: draw_cells()



commit c43f8ba35c6905e6cd8db294d4bfe742c88c17e0
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Sun Nov 23 16:44:29 2014 +0100

    gutter: split on_view_draw: draw_cells()

 gtksourceview/gtksourcegutter.c |  234 +++++++++++++++++++++------------------
 1 files changed, 128 insertions(+), 106 deletions(-)
---
diff --git a/gtksourceview/gtksourcegutter.c b/gtksourceview/gtksourcegutter.c
index 3f6f71a..5d2ece0 100644
--- a/gtksourceview/gtksourcegutter.c
+++ b/gtksourceview/gtksourcegutter.c
@@ -1021,111 +1021,32 @@ begin_draw (GtkSourceGutter *gutter,
 }
 
 static void
-end_draw (GtkSourceGutter *gutter)
-{
-       GList *l;
-
-       for (l = gutter->priv->renderers; l != NULL; l = l->next)
-       {
-               Renderer *renderer = l->data;
-
-               if (gtk_source_gutter_renderer_get_visible (renderer->renderer))
-               {
-                       gtk_source_gutter_renderer_end (renderer->renderer);
-               }
-       }
-}
-
-static gboolean
-on_view_draw (GtkSourceView   *view,
-              cairo_t         *cr,
-              GtkSourceGutter *gutter)
+draw_cells (GtkSourceGutter *gutter,
+           GtkTextView     *view,
+           GArray          *sizes,
+           GArray          *pixels,
+           GArray          *heights,
+           GArray          *numbers,
+           gint             count,
+           GtkTextIter     *first_line,
+           cairo_t         *cr)
 {
-       GdkRectangle clip;
-       GtkTextView *text_view;
        GtkTextBuffer *buffer;
-       GArray *sizes;
-       GArray *pixels;
-       GArray *heights;
-       GArray *numbers;
-       gint y1;
-       gint y2;
-       GtkTextIter cur;
+       GtkTextIter insert_iter;
        gint cur_line;
-       gint count;
-       gint i;
-       GtkTextIter start;
-       GtkTextIter end;
-       GdkRectangle background_area;
        GtkTextIter selection_start;
        GtkTextIter selection_end;
        gboolean has_selection;
-       GtkStyleContext *style_context;
-
-       if (!get_clip_rectangle (gutter, view, cr, &clip))
-       {
-               return GDK_EVENT_PROPAGATE;
-       }
-
-       gutter->priv->is_drawing = TRUE;
-
-       text_view = GTK_TEXT_VIEW (view);
-       buffer = gtk_text_view_get_buffer (text_view);
-
-       y1 = clip.y;
-       y2 = y1 + clip.height;
-
-       /* get the extents of the line printing */
-       gtk_text_view_window_to_buffer_coords (text_view,
-                                              gutter->priv->window_type,
-                                              0,
-                                              y1,
-                                              NULL,
-                                              &y1);
-
-       gtk_text_view_window_to_buffer_coords (text_view,
-                                              gutter->priv->window_type,
-                                              0,
-                                              y2,
-                                              NULL,
-                                              &y2);
-
-       sizes = g_array_new (FALSE, FALSE, sizeof (gint));
-       calculate_gutter_size (gutter, sizes);
-
-       pixels = g_array_new (FALSE, FALSE, sizeof (gint));
-       heights = g_array_new (FALSE, FALSE, sizeof (gint));
-       numbers = g_array_new (FALSE, FALSE, sizeof (gint));
-
-       background_area.x = 0;
-       background_area.height = get_lines (text_view,
-                                           y1,
-                                           y2,
-                                           pixels,
-                                           heights,
-                                           numbers,
-                                           &count,
-                                           &start,
-                                           &end);
-
-       gtk_text_view_buffer_to_window_coords (text_view,
-                                              gutter->priv->window_type,
-                                              0,
-                                              g_array_index (pixels, gint, 0),
-                                              NULL,
-                                              &background_area.y);
-
-       style_context = gtk_widget_get_style_context (GTK_WIDGET (view));
-       gtk_style_context_save (style_context);
-       apply_style (gutter, view, style_context, cr);
+       GtkTextIter start;
+       gint i;
 
-       begin_draw (gutter, sizes, background_area, &start, &end, cr);
+       buffer = gtk_text_view_get_buffer (view);
 
        gtk_text_buffer_get_iter_at_mark (buffer,
-                                         &cur,
+                                         &insert_iter,
                                          gtk_text_buffer_get_insert (buffer));
 
-       cur_line = gtk_text_iter_get_line (&cur);
+       cur_line = gtk_text_iter_get_line (&insert_iter);
 
        gtk_text_buffer_get_selection_bounds (buffer,
                                              &selection_start,
@@ -1146,11 +1067,15 @@ on_view_draw (GtkSourceView   *view,
                }
        }
 
-       for (i = 0; i < count; ++i)
+       start = *first_line;
+
+       for (i = 0; i < count; i++)
        {
+               GtkTextIter end;
+               GdkRectangle background_area;
                gint pos;
                gint line_to_paint;
-               GList *item;
+               GList *l;
                gint idx;
 
                end = start;
@@ -1160,7 +1085,7 @@ on_view_draw (GtkSourceView   *view,
                        gtk_text_iter_forward_to_line_end (&end);
                }
 
-               gtk_text_view_buffer_to_window_coords (text_view,
+               gtk_text_view_buffer_to_window_coords (view,
                                                       gutter->priv->window_type,
                                                       0,
                                                       g_array_index (pixels, gint, i),
@@ -1173,9 +1098,9 @@ on_view_draw (GtkSourceView   *view,
                background_area.height = g_array_index (heights, gint, i);
                background_area.x = 0;
 
-               for (item = gutter->priv->renderers, idx = 0;
-                    item != NULL;
-                    item = g_list_next (item), idx++)
+               for (l = gutter->priv->renderers, idx = 0;
+                    l != NULL;
+                    l = l->next, idx++)
                {
                        Renderer *renderer;
                        GdkRectangle cell_area;
@@ -1184,7 +1109,7 @@ on_view_draw (GtkSourceView   *view,
                        gint xpad;
                        gint ypad;
 
-                       renderer = item->data;
+                       renderer = l->data;
                        width = g_array_index (sizes, gint, idx);
 
                        if (!gtk_source_gutter_renderer_get_visible (renderer->renderer))
@@ -1219,7 +1144,8 @@ on_view_draw (GtkSourceView   *view,
                                state |= GTK_SOURCE_GUTTER_RENDERER_STATE_SELECTED;
                        }
 
-                       if (renderer->prelit >= 0 && cell_area.y <= renderer->prelit && cell_area.y + 
cell_area.height >= renderer->prelit)
+                       if (renderer->prelit >= 0 &&
+                           cell_area.y <= renderer->prelit && renderer->prelit <= cell_area.y + 
cell_area.height)
                        {
                                state |= GTK_SOURCE_GUTTER_RENDERER_STATE_PRELIT;
                        }
@@ -1251,18 +1177,114 @@ on_view_draw (GtkSourceView   *view,
 
                gtk_text_iter_forward_line (&start);
        }
+}
+
+static void
+end_draw (GtkSourceGutter *gutter)
+{
+       GList *l;
+
+       for (l = gutter->priv->renderers; l != NULL; l = l->next)
+       {
+               Renderer *renderer = l->data;
+
+               if (gtk_source_gutter_renderer_get_visible (renderer->renderer))
+               {
+                       gtk_source_gutter_renderer_end (renderer->renderer);
+               }
+       }
+}
+
+static gboolean
+on_view_draw (GtkSourceView   *view,
+              cairo_t         *cr,
+              GtkSourceGutter *gutter)
+{
+       GdkRectangle clip;
+       GtkTextView *text_view;
+       GArray *sizes;
+       GArray *pixels;
+       GArray *heights;
+       GArray *numbers;
+       gint y1;
+       gint y2;
+       gint count;
+       GtkTextIter start;
+       GtkTextIter end;
+       GdkRectangle background_area;
+       GtkStyleContext *style_context;
+
+       if (!get_clip_rectangle (gutter, view, cr, &clip))
+       {
+               return GDK_EVENT_PROPAGATE;
+       }
+
+       gutter->priv->is_drawing = TRUE;
+
+       text_view = GTK_TEXT_VIEW (view);
+
+       y1 = clip.y;
+       y2 = y1 + clip.height;
+
+       /* get the extents of the line printing */
+       gtk_text_view_window_to_buffer_coords (text_view,
+                                              gutter->priv->window_type,
+                                              0,
+                                              y1,
+                                              NULL,
+                                              &y1);
+
+       gtk_text_view_window_to_buffer_coords (text_view,
+                                              gutter->priv->window_type,
+                                              0,
+                                              y2,
+                                              NULL,
+                                              &y2);
+
+       sizes = g_array_new (FALSE, FALSE, sizeof (gint));
+       calculate_gutter_size (gutter, sizes);
+
+       pixels = g_array_new (FALSE, FALSE, sizeof (gint));
+       heights = g_array_new (FALSE, FALSE, sizeof (gint));
+       numbers = g_array_new (FALSE, FALSE, sizeof (gint));
+
+       background_area.x = 0;
+       background_area.height = get_lines (text_view,
+                                           y1,
+                                           y2,
+                                           pixels,
+                                           heights,
+                                           numbers,
+                                           &count,
+                                           &start,
+                                           &end);
+
+       gtk_text_view_buffer_to_window_coords (text_view,
+                                              gutter->priv->window_type,
+                                              0,
+                                              g_array_index (pixels, gint, 0),
+                                              NULL,
+                                              &background_area.y);
+
+       style_context = gtk_widget_get_style_context (GTK_WIDGET (view));
+       gtk_style_context_save (style_context);
+       apply_style (gutter, view, style_context, cr);
+
+       begin_draw (gutter, sizes, background_area, &start, &end, cr);
+
+       draw_cells (gutter, text_view, sizes, pixels, heights, numbers, count, &start, cr);
 
        /* Allow to call queue_redraw() in ::end. */
        gutter->priv->is_drawing = FALSE;
 
        end_draw (gutter);
 
-       g_array_free (numbers, TRUE);
+       gtk_style_context_restore (style_context);
+
+       g_array_free (sizes, TRUE);
        g_array_free (pixels, TRUE);
        g_array_free (heights, TRUE);
-       g_array_free (sizes, TRUE);
-
-       gtk_style_context_restore (style_context);
+       g_array_free (numbers, TRUE);
 
        return GDK_EVENT_PROPAGATE;
 }


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