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:
parent
ac48f2330d
commit
331999d84d
@ -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, ¤t_y);
|
line_list = gtk_text_layout_get_lines (layout, y, y + height, ¤t_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, >k_widget_get_style (widget)->text[gtk_widget_get_state (widget)]);
|
gdk_cairo_set_source_color (cr, >k_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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user