[gtk+/rendering-cleanup: 52/141] textview: API: change gtk_text_layout_draw() to take a cairo_t



commit 6798935b961ff5d0516fe1f3491b261404b5f1ba
Author: Benjamin Otte <otte redhat com>
Date:   Sun Aug 15 19:41:51 2010 +0200

    textview: API: change gtk_text_layout_draw() to take a cairo_t
    
    This simplifies the API a lot and allows more magic to happen later.

 gtk/gtktextdisplay.c |   50 ++++++++++++--------------------------------------
 gtk/gtktextdisplay.h |   16 +++-------------
 gtk/gtktextutil.c    |   12 ++++++------
 gtk/gtktextview.c    |   18 ++++++++++++------
 4 files changed, 33 insertions(+), 63 deletions(-)
---
diff --git a/gtk/gtktextdisplay.c b/gtk/gtktextdisplay.c
index 6793828..1f4e558 100644
--- a/gtk/gtktextdisplay.c
+++ b/gtk/gtktextdisplay.c
@@ -799,22 +799,9 @@ get_text_renderer (void)
 void
 gtk_text_layout_draw (GtkTextLayout *layout,
                       GtkWidget *widget,
-                      GdkDrawable *drawable,
-		      gpointer     cursor_gc,
-                      /* Location of the drawable
-                         in layout coordinates */
-                      gint x_offset,
-                      gint y_offset,
-                      /* Region of the layout to
-                         render */
-                      gint x,
-                      gint y,
-                      gint width,
-                      gint height,
-                      /* widgets to expose */
+                      cairo_t *cr,
                       GList **widgets)
 {
-  GdkRectangle clip;
   gint current_y;
   GSList *cursor_list;
   GtkTextRenderer *text_renderer;
@@ -823,33 +810,21 @@ gtk_text_layout_draw (GtkTextLayout *layout,
   GSList *line_list;
   GSList *tmp_list;
   GList *tmp_widgets;
-  cairo_t *cr;
+  double x, y, width, height;
   
   g_return_if_fail (GTK_IS_TEXT_LAYOUT (layout));
   g_return_if_fail (layout->default_style != NULL);
   g_return_if_fail (layout->buffer != NULL);
-  g_return_if_fail (drawable != NULL);
-  g_return_if_fail (width >= 0);
-  g_return_if_fail (height >= 0);
+  g_return_if_fail (cr != NULL);
 
-  if (width == 0 || height == 0)
-    return;
+  cairo_clip_extents (cr, &x, &y, &width, &height);
 
-  line_list =  gtk_text_layout_get_lines (layout, y + y_offset, y + y_offset + height, &current_y);
-  current_y -= y_offset;
+  line_list =  gtk_text_layout_get_lines (layout, y, y + height, &current_y);
 
   if (line_list == NULL)
     return; /* nothing on the screen */
 
-  cr = gdk_cairo_create (drawable);
-  cairo_rectangle (cr, x, y, width, height);
-  cairo_clip (cr);
-
-  /* cursor code needs this */
-  clip.x = x;
-  clip.y = y;
-  clip.width = width;
-  clip.height = height;
+  cairo_save (cr);
 
   gdk_cairo_set_source_color (cr, &gtk_widget_get_style (widget)->text[gtk_widget_get_state (widget)]);
 
@@ -909,8 +884,7 @@ gtk_text_layout_draw (GtkTextLayout *layout,
             }
 
           render_para (text_renderer, line_display,
-                       - x_offset,
-                       current_y,
+                       0, current_y,
                        selection_start_index, selection_end_index);
 
           /* We paint the cursors last, because they overlap another chunk
@@ -945,14 +919,14 @@ gtk_text_layout_draw (GtkTextLayout *layout,
  		    dir = (dir == GTK_TEXT_DIR_RTL) ? GTK_TEXT_DIR_LTR : GTK_TEXT_DIR_RTL;
  		}
  
- 	      cursor_location.x = line_display->x_offset + cursor->x - x_offset;
+ 	      cursor_location.x = line_display->x_offset + cursor->x;
  	      cursor_location.y = current_y + line_display->top_margin + cursor->y;
  	      cursor_location.width = 0;
  	      cursor_location.height = cursor->height;
 
-	      gtk_draw_insertion_cursor (widget, drawable, &clip, &cursor_location,
-					 cursor->is_strong,
-					 dir, have_strong && have_weak);
+	      gtk_cairo_draw_insertion_cursor (widget, cr, &cursor_location,
+                                               cursor->is_strong,
+                                               dir, have_strong && have_weak);
 
               cursor_list = cursor_list->next;
             }
@@ -975,7 +949,7 @@ gtk_text_layout_draw (GtkTextLayout *layout,
       g_list_free (tmp_widgets);
     }
 
-  cairo_destroy (cr);
+  cairo_restore (cr);
 
   g_slist_free (line_list);
 }
diff --git a/gtk/gtktextdisplay.h b/gtk/gtktextdisplay.h
index 3b6e96c..d7127e3 100644
--- a/gtk/gtktextdisplay.h
+++ b/gtk/gtktextdisplay.h
@@ -87,23 +87,13 @@ G_BEGIN_DECLS
 
 /* The drawable should be pre-initialized to your preferred background.
  * widget            - Widget to grab some style info from
- * drawable          - Drawable to render to
- * cursor_gc         - Graphics context to use for cursor
- * x_offset/y_offset - Position of the drawable in layout coordinates
- * x/y/width/height  - Region of the layout to render. x,y must be inside
- *                     the drawable.
+ * cr                - Context to render to, matrix set so that (0, 0)
+ *                     is the top left of the layout
  * widgets           - list of widgets that need exposing
  */
 void gtk_text_layout_draw (GtkTextLayout        *layout,
                            GtkWidget            *widget,
-                           GdkDrawable          *drawable,
-			   gpointer              cursor_gc,
-                           gint                  x_offset,
-                           gint                  y_offset,
-                           gint                  x,
-                           gint                  y,
-                           gint                  width,
-                           gint                  height,
+                           cairo_t              *cr,
                            GList               **widgets);
 
 
diff --git a/gtk/gtktextutil.c b/gtk/gtktextutil.c
index 723a5ee..262f89b 100644
--- a/gtk/gtktextutil.c
+++ b/gtk/gtktextutil.c
@@ -367,12 +367,12 @@ _gtk_text_util_create_rich_drag_icon (GtkWidget     *widget,
   gdk_cairo_set_source_color (cr, &widget_style->base [gtk_widget_get_state (widget)]);
    cairo_paint (cr);
 
-   gtk_text_layout_draw (layout, widget, drawable,
-                         NULL,
-                         - (1 + DRAG_ICON_LAYOUT_BORDER),
-                         - (1 + DRAG_ICON_LAYOUT_BORDER),
-                         0, 0,
-                         pixmap_width, pixmap_height, NULL);
+   cairo_save (cr);
+
+   cairo_translate (cr, 1 + DRAG_ICON_LAYOUT_BORDER, 1 + DRAG_ICON_LAYOUT_BORDER);
+   gtk_text_layout_draw (layout, widget, cr, NULL);
+
+   cairo_restore (cr);
 
    cairo_set_source_rgb (cr, 0, 0, 0);
    cairo_rectangle (cr, 0.5, 0.5, pixmap_width + 1, pixmap_height + 1);
diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c
index 27b1399..6ae5f1e 100644
--- a/gtk/gtktextview.c
+++ b/gtk/gtktextview.c
@@ -4786,6 +4786,7 @@ gtk_text_view_paint (GtkWidget      *widget,
   GtkTextViewPrivate *priv;
   GList *child_exposes;
   GList *tmp_list;
+  cairo_t *cr;
   
   text_view = GTK_TEXT_VIEW (widget);
   priv = text_view->priv;
@@ -4814,16 +4815,21 @@ gtk_text_view_paint (GtkWidget      *widget,
 #endif
 
   child_exposes = NULL;
+
+  cr = gdk_cairo_create (priv->text_window->bin_window);
+
+  gdk_cairo_region (cr, event->region);
+  cairo_clip (cr);
+
+  cairo_translate (cr, -priv->xoffset, -priv->yoffset);
+
   gtk_text_layout_draw (priv->layout,
                         widget,
-                        priv->text_window->bin_window,
-			NULL,
-                        priv->xoffset,
-                        priv->yoffset,
-                        area->x, area->y,
-                        area->width, area->height,
+                        cr,
                         &child_exposes);
 
+  cairo_destroy (cr);
+
   tmp_list = child_exposes;
   while (tmp_list != NULL)
     {



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