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.
This commit is contained in:
Benjamin Otte 2010-08-15 19:41:51 +02:00
parent ac48f2330d
commit 331999d84d
4 changed files with 33 additions and 63 deletions

View File

@ -799,22 +799,9 @@ get_text_renderer (void)
void void
gtk_text_layout_draw (GtkTextLayout *layout, gtk_text_layout_draw (GtkTextLayout *layout,
GtkWidget *widget, GtkWidget *widget,
GdkDrawable *drawable, cairo_t *cr,
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 */
GList **widgets) GList **widgets)
{ {
GdkRectangle clip;
gint current_y; gint current_y;
GSList *cursor_list; GSList *cursor_list;
GtkTextRenderer *text_renderer; GtkTextRenderer *text_renderer;
@ -823,33 +810,21 @@ gtk_text_layout_draw (GtkTextLayout *layout,
GSList *line_list; GSList *line_list;
GSList *tmp_list; GSList *tmp_list;
GList *tmp_widgets; GList *tmp_widgets;
cairo_t *cr; double x, y, width, height;
g_return_if_fail (GTK_IS_TEXT_LAYOUT (layout)); g_return_if_fail (GTK_IS_TEXT_LAYOUT (layout));
g_return_if_fail (layout->default_style != NULL); g_return_if_fail (layout->default_style != NULL);
g_return_if_fail (layout->buffer != NULL); g_return_if_fail (layout->buffer != NULL);
g_return_if_fail (drawable != NULL); g_return_if_fail (cr != NULL);
g_return_if_fail (width >= 0);
g_return_if_fail (height >= 0);
if (width == 0 || height == 0) cairo_clip_extents (cr, &x, &y, &width, &height);
return;
line_list = gtk_text_layout_get_lines (layout, y + y_offset, y + y_offset + height, &current_y); line_list = gtk_text_layout_get_lines (layout, y, y + height, &current_y);
current_y -= y_offset;
if (line_list == NULL) if (line_list == NULL)
return; /* nothing on the screen */ return; /* nothing on the screen */
cr = gdk_cairo_create (drawable); cairo_save (cr);
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;
gdk_cairo_set_source_color (cr, &gtk_widget_get_style (widget)->text[gtk_widget_get_state (widget)]); 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, render_para (text_renderer, line_display,
- x_offset, 0, current_y,
current_y,
selection_start_index, selection_end_index); selection_start_index, selection_end_index);
/* We paint the cursors last, because they overlap another chunk /* We paint the cursors last, because they overlap another chunk
@ -945,12 +919,12 @@ gtk_text_layout_draw (GtkTextLayout *layout,
dir = (dir == GTK_TEXT_DIR_RTL) ? GTK_TEXT_DIR_LTR : GTK_TEXT_DIR_RTL; 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.y = current_y + line_display->top_margin + cursor->y;
cursor_location.width = 0; cursor_location.width = 0;
cursor_location.height = cursor->height; cursor_location.height = cursor->height;
gtk_draw_insertion_cursor (widget, drawable, &clip, &cursor_location, gtk_cairo_draw_insertion_cursor (widget, cr, &cursor_location,
cursor->is_strong, cursor->is_strong,
dir, have_strong && have_weak); dir, have_strong && have_weak);
@ -975,7 +949,7 @@ gtk_text_layout_draw (GtkTextLayout *layout,
g_list_free (tmp_widgets); g_list_free (tmp_widgets);
} }
cairo_destroy (cr); cairo_restore (cr);
g_slist_free (line_list); g_slist_free (line_list);
} }

View File

@ -87,23 +87,13 @@ G_BEGIN_DECLS
/* The drawable should be pre-initialized to your preferred background. /* The drawable should be pre-initialized to your preferred background.
* widget - Widget to grab some style info from * widget - Widget to grab some style info from
* drawable - Drawable to render to * cr - Context to render to, matrix set so that (0, 0)
* cursor_gc - Graphics context to use for cursor * is the top left of the layout
* 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.
* widgets - list of widgets that need exposing * widgets - list of widgets that need exposing
*/ */
void gtk_text_layout_draw (GtkTextLayout *layout, void gtk_text_layout_draw (GtkTextLayout *layout,
GtkWidget *widget, GtkWidget *widget,
GdkDrawable *drawable, cairo_t *cr,
gpointer cursor_gc,
gint x_offset,
gint y_offset,
gint x,
gint y,
gint width,
gint height,
GList **widgets); GList **widgets);

View File

@ -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)]); gdk_cairo_set_source_color (cr, &widget_style->base [gtk_widget_get_state (widget)]);
cairo_paint (cr); cairo_paint (cr);
gtk_text_layout_draw (layout, widget, drawable, cairo_save (cr);
NULL,
- (1 + DRAG_ICON_LAYOUT_BORDER), cairo_translate (cr, 1 + DRAG_ICON_LAYOUT_BORDER, 1 + DRAG_ICON_LAYOUT_BORDER);
- (1 + DRAG_ICON_LAYOUT_BORDER), gtk_text_layout_draw (layout, widget, cr, NULL);
0, 0,
pixmap_width, pixmap_height, NULL); cairo_restore (cr);
cairo_set_source_rgb (cr, 0, 0, 0); cairo_set_source_rgb (cr, 0, 0, 0);
cairo_rectangle (cr, 0.5, 0.5, pixmap_width + 1, pixmap_height + 1); cairo_rectangle (cr, 0.5, 0.5, pixmap_width + 1, pixmap_height + 1);

View File

@ -4789,6 +4789,7 @@ gtk_text_view_paint (GtkWidget *widget,
GtkTextViewPrivate *priv; GtkTextViewPrivate *priv;
GList *child_exposes; GList *child_exposes;
GList *tmp_list; GList *tmp_list;
cairo_t *cr;
text_view = GTK_TEXT_VIEW (widget); text_view = GTK_TEXT_VIEW (widget);
priv = text_view->priv; priv = text_view->priv;
@ -4817,16 +4818,21 @@ gtk_text_view_paint (GtkWidget *widget,
#endif #endif
child_exposes = NULL; 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, gtk_text_layout_draw (priv->layout,
widget, widget,
priv->text_window->bin_window, cr,
NULL,
priv->xoffset,
priv->yoffset,
area->x, area->y,
area->width, area->height,
&child_exposes); &child_exposes);
cairo_destroy (cr);
tmp_list = child_exposes; tmp_list = child_exposes;
while (tmp_list != NULL) while (tmp_list != NULL)
{ {