diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2007-02-23 13:21:02 +0000 |
---|---|---|
committer | Chris Wilson <cpwilson@src.gnome.org> | 2007-02-23 13:21:02 +0000 |
commit | 713bb7322e8e012deccabe331b21a5b9a60864ba (patch) | |
tree | fe22bc9c731c74840f5ec04bfefffdfb28d8ed59 | |
parent | 2b0e46223ad2952192f3aa7d2e18b0f636f843f4 (diff) | |
download | vte-713bb7322e8e012deccabe331b21a5b9a60864ba.tar.gz |
Add a new debug flag to monitor draw operations. Don't issue individual
2007-02-23 Chris Wilson <chris@chris-wilson.co.uk>
Add a new debug flag to monitor draw operations.
Don't issue individual glyphs for is_local_graphic() in the middle of
a run.
* src/debug.c: (_vte_debug_parse_string):
* src/debug.h:
* src/vte.c: (vte_terminal_unichar_is_local_graphic),
(vte_terminal_draw_rows), (vte_terminal_paint):
* src/vtedraw.c: (_vte_draw_init_user), (_vte_draw_init_default),
(_vte_draw_new), (_vte_draw_free), (_vte_draw_get_visual),
(_vte_draw_get_colormap), (_vte_draw_start), (_vte_draw_end),
(_vte_draw_set_background_color), (_vte_draw_set_background_image),
(_vte_draw_requires_repaint), (_vte_draw_clip), (_vte_draw_clear),
(_vte_draw_set_text_font), (_vte_draw_get_text_width),
(_vte_draw_get_text_height), (_vte_draw_get_text_ascent),
(_vte_draw_get_char_width), (_vte_draw_get_using_fontconfig),
(_vte_draw_text), (_vte_draw_char), (_vte_draw_has_char),
(_vte_draw_fill_rectangle), (_vte_draw_draw_rectangle),
(_vte_draw_set_scroll):
* src/vtedraw.h:
* src/vteft2.c: (_vte_ft2_draw_has_char):
* src/vtegl.c: (_vte_gl_draw_has_char):
* src/vtepango.c: (_vte_pango_draw_has_char):
* src/vtepangox.c: (_vte_pango_x_draw_has_char):
* src/vteskel.c: (_vte_skel_draw_has_char):
* src/vtexft.c: (_vte_xft_draw_has_char):
svn path=/trunk/; revision=1729
-rw-r--r-- | ChangeLog | 29 | ||||
-rw-r--r-- | src/debug.c | 3 | ||||
-rw-r--r-- | src/debug.h | 3 | ||||
-rw-r--r-- | src/vte.c | 46 | ||||
-rw-r--r-- | src/vtedraw.c | 252 | ||||
-rw-r--r-- | src/vtedraw.h | 2 | ||||
-rw-r--r-- | src/vteft2.c | 16 | ||||
-rw-r--r-- | src/vtegl.c | 16 | ||||
-rw-r--r-- | src/vtepango.c | 7 | ||||
-rw-r--r-- | src/vtepangox.c | 8 | ||||
-rw-r--r-- | src/vteskel.c | 7 | ||||
-rw-r--r-- | src/vtexft.c | 16 |
12 files changed, 281 insertions, 124 deletions
@@ -1,5 +1,34 @@ 2007-02-23 Chris Wilson <chris@chris-wilson.co.uk> + Add a new debug flag to monitor draw operations. + Don't issue individual glyphs for is_local_graphic() in the middle of + a run. + + * src/debug.c: (_vte_debug_parse_string): + * src/debug.h: + * src/vte.c: (vte_terminal_unichar_is_local_graphic), + (vte_terminal_draw_rows), (vte_terminal_paint): + * src/vtedraw.c: (_vte_draw_init_user), (_vte_draw_init_default), + (_vte_draw_new), (_vte_draw_free), (_vte_draw_get_visual), + (_vte_draw_get_colormap), (_vte_draw_start), (_vte_draw_end), + (_vte_draw_set_background_color), (_vte_draw_set_background_image), + (_vte_draw_requires_repaint), (_vte_draw_clip), (_vte_draw_clear), + (_vte_draw_set_text_font), (_vte_draw_get_text_width), + (_vte_draw_get_text_height), (_vte_draw_get_text_ascent), + (_vte_draw_get_char_width), (_vte_draw_get_using_fontconfig), + (_vte_draw_text), (_vte_draw_char), (_vte_draw_has_char), + (_vte_draw_fill_rectangle), (_vte_draw_draw_rectangle), + (_vte_draw_set_scroll): + * src/vtedraw.h: + * src/vteft2.c: (_vte_ft2_draw_has_char): + * src/vtegl.c: (_vte_gl_draw_has_char): + * src/vtepango.c: (_vte_pango_draw_has_char): + * src/vtepangox.c: (_vte_pango_x_draw_has_char): + * src/vteskel.c: (_vte_skel_draw_has_char): + * src/vtexft.c: (_vte_xft_draw_has_char): + +2007-02-23 Chris Wilson <chris@chris-wilson.co.uk> + * src/vte.c: (vte_terminal_draw_rows): Don't break a glyph run for a graphic, issue the draw and continue. diff --git a/src/debug.c b/src/debug.c index 73984ad9..d73d461d 100644 --- a/src/debug.c +++ b/src/debug.c @@ -84,6 +84,9 @@ _vte_debug_parse_string(const char *string) } else if (g_ascii_strcasecmp(flags[i], "TIMEOUT") == 0) { _vte_debug_flags |= VTE_DEBUG_TIMEOUT; + } else + if (g_ascii_strcasecmp(flags[i], "DRAW") == 0) { + _vte_debug_flags |= VTE_DEBUG_DRAW; } } g_strfreev(flags); diff --git a/src/debug.h b/src/debug.h index aa7d8492..05ccff47 100644 --- a/src/debug.h +++ b/src/debug.h @@ -43,7 +43,8 @@ typedef enum { VTE_DEBUG_TRIE = 1 << 13, VTE_DEBUG_WORK = 1 << 14, VTE_DEBUG_CELLS = 1 << 15, - VTE_DEBUG_TIMEOUT = 1 << 16 + VTE_DEBUG_TIMEOUT = 1 << 16, + VTE_DEBUG_DRAW = 1 << 17 } VteDebugFlags; void _vte_debug_parse_string(const char *string); @@ -7796,6 +7796,12 @@ vte_unichar_is_local_graphic(gunichar c) } return FALSE; } +static inline gboolean +vte_terminal_unichar_is_local_graphic(VteTerminal *terminal, gunichar c) +{ + return vte_unichar_is_local_graphic (c) && + !_vte_draw_has_char (terminal->pvt->draw, c); +} static void vte_terminal_fill_rectangle_int(VteTerminal *terminal, @@ -9188,7 +9194,7 @@ vte_terminal_draw_rows(VteTerminal *terminal, j = i + items[0].columns; /* If this is a graphics character, draw it locally. */ - if (vte_unichar_is_local_graphic(cell->c)) { + if (vte_terminal_unichar_is_local_graphic(terminal, cell->c)) { if (vte_terminal_draw_graphic(terminal, items[0].c, fore, back, @@ -9241,7 +9247,7 @@ vte_terminal_draw_rows(VteTerminal *terminal, FALSE, &nfore, &nback); /* Graphic characters must be drawn individually. */ - if (vte_unichar_is_local_graphic(cell->c)) { + if (vte_terminal_unichar_is_local_graphic(terminal, cell->c)) { if (vte_terminal_draw_graphic(terminal, cell->c, nfore, nback, @@ -9603,7 +9609,7 @@ vte_terminal_paint(GtkWidget *widget, GdkRegion *region) &color, VTE_DRAW_OPAQUE); } - if (!vte_unichar_is_local_graphic(item.c) || + if (!vte_terminal_unichar_is_local_graphic(terminal, item.c) || !vte_terminal_draw_graphic(terminal, item.c, fore, back, @@ -9622,16 +9628,18 @@ vte_terminal_paint(GtkWidget *widget, GdkRegion *region) terminal->pvt->match_end.row, TRUE); } - vte_terminal_draw_cells(terminal, + if (cell && cell->c != ' ') { + vte_terminal_draw_cells(terminal, &item, 1, fore, back, TRUE, FALSE, - cell && cell->bold, - cell && cell->underline, - cell && cell->strikethrough, + cell->bold, + cell->underline, + cell->strikethrough, hilite, FALSE, width, height); + } } } else { GdkColor color; @@ -9641,7 +9649,7 @@ draw_cursor_outline: selected, TRUE, &fore, &back); - if (!vte_unichar_is_local_graphic(item.c) || + if (!vte_terminal_unichar_is_local_graphic(terminal, item.c) || !vte_terminal_draw_graphic(terminal, item.c, fore, back, @@ -9661,16 +9669,18 @@ draw_cursor_outline: TRUE); } /* Draw it as a hollow rectangle overtop character. */ - vte_terminal_draw_cells(terminal, - &item, 1, - fore, back, TRUE, FALSE, - cell && cell->bold, - cell && cell->underline, - cell && cell->strikethrough, - hilite, - FALSE, - width, - height); + if (cell && cell->c != ' ') { + vte_terminal_draw_cells(terminal, + &item, 1, + fore, back, TRUE, FALSE, + cell->bold, + cell->underline, + cell->strikethrough, + hilite, + FALSE, + width, + height); + } } vte_terminal_determine_colors(terminal, cell, !terminal->pvt->screen->reverse_mode, diff --git a/src/vtedraw.c b/src/vtedraw.c index f5c098c3..b3d7a8d9 100644 --- a/src/vtedraw.c +++ b/src/vtedraw.c @@ -63,20 +63,20 @@ _vte_draw_init_user (struct _vte_draw *draw) guint i; gboolean success = TRUE; - env = g_getenv("VTE_BACKEND"); + env = g_getenv ("VTE_BACKEND"); if (!env) { return FALSE; } - strv = g_strsplit(env, ":;, \t", -1); + strv = g_strsplit (env, ":;, \t", -1); for (s = strv; *s; s++) { - if (g_ascii_strcasecmp(*s, _vte_draw_skel.name) == 0) { + if (g_ascii_strcasecmp (*s, _vte_draw_skel.name) == 0) { draw->impl = &_vte_draw_skel; goto out; } - for (i = 0; i < G_N_ELEMENTS(_vte_draw_impls); i++) { - if (g_ascii_strcasecmp(*s, _vte_draw_impls[i]->name) == 0) { - if (_vte_draw_impls[i]->check(draw, draw->widget)) { + for (i = 0; i < G_N_ELEMENTS (_vte_draw_impls); i++) { + if (g_ascii_strcasecmp (*s, _vte_draw_impls[i]->name) == 0) { + if (_vte_draw_impls[i]->check (draw, draw->widget)) { draw->impl = _vte_draw_impls[i]; goto out; } @@ -86,7 +86,7 @@ _vte_draw_init_user (struct _vte_draw *draw) success = FALSE; out: - g_strfreev(strv); + g_strfreev (strv); return success; } @@ -96,8 +96,8 @@ _vte_draw_init_default (struct _vte_draw *draw) { guint i; - for (i = 0; i < G_N_ELEMENTS(_vte_draw_impls); i++) { - if (_vte_draw_impls[i]->check(draw, draw->widget)) { + for (i = 0; i < G_N_ELEMENTS (_vte_draw_impls); i++) { + if (_vte_draw_impls[i]->check (draw, draw->widget)) { draw->impl = _vte_draw_impls[i]; return TRUE; } @@ -108,13 +108,13 @@ _vte_draw_init_default (struct _vte_draw *draw) struct _vte_draw * -_vte_draw_new(GtkWidget *widget) +_vte_draw_new (GtkWidget *widget) { struct _vte_draw *draw; /* Create the structure. */ - draw = g_slice_new0(struct _vte_draw); - draw->widget = g_object_ref(widget); + draw = g_slice_new0 (struct _vte_draw); + draw->widget = g_object_ref (widget); draw->started = FALSE; /* Allow the user to specify her preferred backends */ @@ -126,225 +126,267 @@ _vte_draw_new(GtkWidget *widget) draw->impl = &_vte_draw_skel; } - _vte_debug_print(VTE_DEBUG_MISC, "Using %s.\n", draw->impl->name); + _vte_debug_print (VTE_DEBUG_DRAW, + "draw_new (%s)\n", draw->impl->name); + _vte_debug_print (VTE_DEBUG_MISC, "Using %s.\n", draw->impl->name); - draw->impl->create(draw, draw->widget); + draw->impl->create (draw, draw->widget); return draw; } void -_vte_draw_free(struct _vte_draw *draw) +_vte_draw_free (struct _vte_draw *draw) { - draw->impl->destroy(draw); + _vte_debug_print (VTE_DEBUG_DRAW, "draw_free\n"); + draw->impl->destroy (draw); if (draw->widget != NULL) { - g_object_unref(draw->widget); + g_object_unref (draw->widget); } - g_slice_free(struct _vte_draw, draw); + g_slice_free (struct _vte_draw, draw); } GdkVisual * -_vte_draw_get_visual(struct _vte_draw *draw) +_vte_draw_get_visual (struct _vte_draw *draw) { - g_return_val_if_fail(draw->impl != NULL, NULL); - g_return_val_if_fail(draw->impl->get_visual != NULL, NULL); - return draw->impl->get_visual(draw); + g_return_val_if_fail (draw->impl != NULL, NULL); + g_return_val_if_fail (draw->impl->get_visual != NULL, NULL); + _vte_debug_print (VTE_DEBUG_DRAW, "draw_get_visual\n"); + return draw->impl->get_visual (draw); } GdkColormap * -_vte_draw_get_colormap(struct _vte_draw *draw, gboolean maybe_use_default) +_vte_draw_get_colormap (struct _vte_draw *draw, gboolean maybe_use_default) { GdkColormap *colormap; GdkScreen *screen; - g_return_val_if_fail(draw->impl != NULL, NULL); - g_return_val_if_fail(draw->impl->get_colormap != NULL, NULL); - colormap = draw->impl->get_colormap(draw); + g_return_val_if_fail (draw->impl != NULL, NULL); + g_return_val_if_fail (draw->impl->get_colormap != NULL, NULL); + _vte_debug_print (VTE_DEBUG_DRAW, "draw_get_colormap\n"); + colormap = draw->impl->get_colormap (draw); if (colormap) { return colormap; } if (!maybe_use_default) { return NULL; } - screen = gtk_widget_get_screen(draw->widget); - colormap = gdk_screen_get_default_colormap(screen); + screen = gtk_widget_get_screen (draw->widget); + colormap = gdk_screen_get_default_colormap (screen); return colormap; } void -_vte_draw_start(struct _vte_draw *draw) +_vte_draw_start (struct _vte_draw *draw) { - g_return_if_fail(GTK_WIDGET_REALIZED(draw->widget)); - g_return_if_fail(draw->impl != NULL); - g_return_if_fail(draw->impl->start != NULL); - g_object_ref(draw->widget->window); - draw->impl->start(draw); + g_return_if_fail (GTK_WIDGET_REALIZED (draw->widget)); + g_return_if_fail (draw->impl != NULL); + g_return_if_fail (draw->impl->start != NULL); + _vte_debug_print (VTE_DEBUG_DRAW, "draw_start\n"); + g_object_ref (draw->widget->window); + draw->impl->start (draw); draw->started = TRUE; } void -_vte_draw_end(struct _vte_draw *draw) +_vte_draw_end (struct _vte_draw *draw) { - g_return_if_fail(draw->started == TRUE); - g_return_if_fail(draw->impl != NULL); - g_return_if_fail(draw->impl->end != NULL); - draw->impl->end(draw); - g_object_unref(draw->widget->window); + g_return_if_fail (draw->started == TRUE); + g_return_if_fail (draw->impl != NULL); + g_return_if_fail (draw->impl->end != NULL); + draw->impl->end (draw); + g_object_unref (draw->widget->window); draw->started = FALSE; + _vte_debug_print (VTE_DEBUG_DRAW, "draw_end\n"); } void -_vte_draw_set_background_color(struct _vte_draw *draw, +_vte_draw_set_background_color (struct _vte_draw *draw, GdkColor *color, guint16 opacity) { - g_return_if_fail(draw->impl != NULL); - g_return_if_fail(draw->impl->set_background_color != NULL); - draw->impl->set_background_color(draw, color, opacity); + g_return_if_fail (draw->impl != NULL); + g_return_if_fail (draw->impl->set_background_color != NULL); + draw->impl->set_background_color (draw, color, opacity); } void -_vte_draw_set_background_image(struct _vte_draw *draw, +_vte_draw_set_background_image (struct _vte_draw *draw, enum VteBgSourceType type, GdkPixbuf *pixbuf, const char *filename, const GdkColor *color, double saturation) { - g_return_if_fail(draw->impl != NULL); - g_return_if_fail(draw->impl->set_background_image != NULL); - draw->impl->set_background_image(draw, type, pixbuf, filename, + g_return_if_fail (draw->impl != NULL); + g_return_if_fail (draw->impl->set_background_image != NULL); + draw->impl->set_background_image (draw, type, pixbuf, filename, color, saturation); } gboolean -_vte_draw_requires_repaint(struct _vte_draw *draw) +_vte_draw_requires_repaint (struct _vte_draw *draw) { - g_return_val_if_fail(draw->impl != NULL, TRUE); + g_return_val_if_fail (draw->impl != NULL, TRUE); + _vte_debug_print (VTE_DEBUG_DRAW, "draw_requires_repaint = %d\n", + draw->impl->requires_repaint); return draw->impl->requires_repaint; } gboolean -_vte_draw_clip(struct _vte_draw *draw, GdkRegion *region) +_vte_draw_clip (struct _vte_draw *draw, GdkRegion *region) { - g_return_val_if_fail(draw->impl != NULL, FALSE); + g_return_val_if_fail (draw->impl != NULL, FALSE); + _vte_debug_print (VTE_DEBUG_DRAW, "draw_clip\n"); if (draw->impl->clip == NULL) { return FALSE; } - draw->impl->clip(draw, region); + draw->impl->clip (draw, region); return TRUE; } void -_vte_draw_clear(struct _vte_draw *draw, gint x, gint y, gint width, gint height) +_vte_draw_clear (struct _vte_draw *draw, gint x, gint y, gint width, gint height) { - g_return_if_fail(draw->impl != NULL); - g_return_if_fail(draw->impl->clear != NULL); - draw->impl->clear(draw, x, y, width, height); + g_return_if_fail (draw->impl != NULL); + g_return_if_fail (draw->impl->clear != NULL); + _vte_debug_print (VTE_DEBUG_DRAW, "draw_clear (%d, %d, %d, %d)\n", + x,y,width, height); + draw->impl->clear (draw, x, y, width, height); } void -_vte_draw_set_text_font(struct _vte_draw *draw, +_vte_draw_set_text_font (struct _vte_draw *draw, const PangoFontDescription *fontdesc, VteTerminalAntiAlias anti_alias) { - g_return_if_fail(draw->impl != NULL); - g_return_if_fail(draw->impl->set_text_font != NULL); - draw->impl->set_text_font(draw, fontdesc, anti_alias); + g_return_if_fail (draw->impl != NULL); + g_return_if_fail (draw->impl->set_text_font != NULL); + _vte_debug_print (VTE_DEBUG_DRAW, "draw_set_text_font (aa=%d)\n", + anti_alias); + draw->impl->set_text_font (draw, fontdesc, anti_alias); } int -_vte_draw_get_text_width(struct _vte_draw *draw) +_vte_draw_get_text_width (struct _vte_draw *draw) { - g_return_val_if_fail(draw->impl != NULL, 1); - g_return_val_if_fail(draw->impl->get_text_width != NULL, 1); - return draw->impl->get_text_width(draw); + g_return_val_if_fail (draw->impl != NULL, 1); + g_return_val_if_fail (draw->impl->get_text_width != NULL, 1); + return draw->impl->get_text_width (draw); } int -_vte_draw_get_text_height(struct _vte_draw *draw) +_vte_draw_get_text_height (struct _vte_draw *draw) { - g_return_val_if_fail(draw->impl != NULL, 1); - g_return_val_if_fail(draw->impl->get_text_height != NULL, 1); - return draw->impl->get_text_height(draw); + g_return_val_if_fail (draw->impl != NULL, 1); + g_return_val_if_fail (draw->impl->get_text_height != NULL, 1); + return draw->impl->get_text_height (draw); } int -_vte_draw_get_text_ascent(struct _vte_draw *draw) +_vte_draw_get_text_ascent (struct _vte_draw *draw) { - g_return_val_if_fail(draw->impl != NULL, 1); - g_return_val_if_fail(draw->impl->get_text_ascent != NULL, 1); - return draw->impl->get_text_ascent(draw); + g_return_val_if_fail (draw->impl != NULL, 1); + g_return_val_if_fail (draw->impl->get_text_ascent != NULL, 1); + return draw->impl->get_text_ascent (draw); } int -_vte_draw_get_char_width(struct _vte_draw *draw, gunichar c, int columns) +_vte_draw_get_char_width (struct _vte_draw *draw, gunichar c, int columns) { - g_return_val_if_fail(draw->impl != NULL, 1); - g_return_val_if_fail(draw->impl->get_char_width != NULL, 1); - return draw->impl->get_char_width(draw, c, columns); + g_return_val_if_fail (draw->impl != NULL, 1); + g_return_val_if_fail (draw->impl->get_char_width != NULL, 1); + return draw->impl->get_char_width (draw, c, columns); } gboolean -_vte_draw_get_using_fontconfig(struct _vte_draw *draw) +_vte_draw_get_using_fontconfig (struct _vte_draw *draw) { - g_return_val_if_fail(draw->impl != NULL, 1); - g_return_val_if_fail(draw->impl->get_using_fontconfig != NULL, FALSE); - return draw->impl->get_using_fontconfig(draw); + g_return_val_if_fail (draw->impl != NULL, 1); + g_return_val_if_fail (draw->impl->get_using_fontconfig != NULL, FALSE); + return draw->impl->get_using_fontconfig (draw); } void -_vte_draw_text(struct _vte_draw *draw, +_vte_draw_text (struct _vte_draw *draw, struct _vte_draw_text_request *requests, gsize n_requests, GdkColor *color, guchar alpha) { - g_return_if_fail(draw->started == TRUE); - g_return_if_fail(draw->impl != NULL); - g_return_if_fail(draw->impl->draw_text != NULL); - draw->impl->draw_text(draw, requests, n_requests, color, alpha); + g_return_if_fail (draw->started == TRUE); + g_return_if_fail (draw->impl != NULL); + g_return_if_fail (draw->impl->draw_text != NULL); + _vte_debug_print (VTE_DEBUG_DRAW, + "draw_text (len=%u, color= (%d,%d,%d,%d))\n", + n_requests, color->red, color->green, color->blue, + alpha); + draw->impl->draw_text (draw, requests, n_requests, color, alpha); } gboolean -_vte_draw_char(struct _vte_draw *draw, +_vte_draw_char (struct _vte_draw *draw, struct _vte_draw_text_request *request, GdkColor *color, guchar alpha) { - g_return_val_if_fail(draw->started == TRUE, FALSE); - g_return_val_if_fail(draw->impl != NULL, FALSE); + g_return_val_if_fail (draw->started == TRUE, FALSE); + g_return_val_if_fail (draw->impl != NULL, FALSE); + _vte_debug_print (VTE_DEBUG_DRAW, + "draw_char ('%c', color= (%d,%d,%d,%d))\n", + request->c, + color->red, color->green, color->blue, + alpha); if (draw->impl->draw_char == NULL) { - draw->impl->draw_text(draw, request, 1, color, alpha); + draw->impl->draw_text (draw, request, 1, color, alpha); return TRUE; } - return draw->impl->draw_char(draw, request, color, alpha); + return draw->impl->draw_char (draw, request, color, alpha); +} +gboolean +_vte_draw_has_char (struct _vte_draw *draw, gunichar c) +{ + _vte_debug_print (VTE_DEBUG_DRAW, "draw_has_char ('%c')\n", c); + return draw->impl->has_char (draw, c); } void -_vte_draw_fill_rectangle(struct _vte_draw *draw, +_vte_draw_fill_rectangle (struct _vte_draw *draw, gint x, gint y, gint width, gint height, GdkColor *color, guchar alpha) { - g_return_if_fail(draw->started == TRUE); - g_return_if_fail(draw->impl != NULL); - g_return_if_fail(draw->impl->fill_rectangle != NULL); - draw->impl->fill_rectangle(draw, x, y, width, height, color, alpha); + g_return_if_fail (draw->started == TRUE); + g_return_if_fail (draw->impl != NULL); + g_return_if_fail (draw->impl->fill_rectangle != NULL); + _vte_debug_print (VTE_DEBUG_DRAW, + "draw_fill_rectangle (%d, %d, %d, %d, color= (%d,%d,%d,%d))\n", + x,y,width,height, + color->red, color->green, color->blue, + alpha); + draw->impl->fill_rectangle (draw, x, y, width, height, color, alpha); } void -_vte_draw_draw_rectangle(struct _vte_draw *draw, +_vte_draw_draw_rectangle (struct _vte_draw *draw, gint x, gint y, gint width, gint height, GdkColor *color, guchar alpha) { - g_return_if_fail(draw->started == TRUE); - g_return_if_fail(draw->impl != NULL); - g_return_if_fail(draw->impl->draw_rectangle != NULL); - draw->impl->draw_rectangle(draw, x, y, width, height, color, alpha); + g_return_if_fail (draw->started == TRUE); + g_return_if_fail (draw->impl != NULL); + g_return_if_fail (draw->impl->draw_rectangle != NULL); + _vte_debug_print (VTE_DEBUG_DRAW, + "draw_rectangle (%d, %d, %d, %d, color= (%d,%d,%d,%d))\n", + x,y,width,height, + color->red, color->green, color->blue, + alpha); + draw->impl->draw_rectangle (draw, x, y, width, height, color, alpha); } void -_vte_draw_set_scroll(struct _vte_draw *draw, gint x, gint y) +_vte_draw_set_scroll (struct _vte_draw *draw, gint x, gint y) { - g_return_if_fail(draw->impl != NULL); - g_return_if_fail(draw->impl->set_scroll != NULL); - draw->impl->set_scroll(draw, x, y); + g_return_if_fail (draw->impl != NULL); + g_return_if_fail (draw->impl->set_scroll != NULL); + _vte_debug_print (VTE_DEBUG_DRAW, + "draw_set_scroll (%d, %d)\n", + x, y); + draw->impl->set_scroll (draw, x, y); } diff --git a/src/vtedraw.h b/src/vtedraw.h index bbff2f9a..91453cc3 100644 --- a/src/vtedraw.h +++ b/src/vtedraw.h @@ -86,6 +86,7 @@ struct _vte_draw_impl { gboolean (*draw_char)(struct _vte_draw *, struct _vte_draw_text_request *, GdkColor *, guchar); + gboolean (*has_char)(struct _vte_draw *, gunichar); void (*draw_rectangle)(struct _vte_draw *, gint, gint, gint, gint, GdkColor *, guchar); @@ -153,6 +154,7 @@ void _vte_draw_text(struct _vte_draw *draw, gboolean _vte_draw_char(struct _vte_draw *draw, struct _vte_draw_text_request *request, GdkColor *color, guchar alpha); +gboolean _vte_draw_has_char(struct _vte_draw *draw, gunichar c); void _vte_draw_fill_rectangle(struct _vte_draw *draw, gint x, gint y, gint width, gint height, GdkColor *color, guchar alpha); diff --git a/src/vteft2.c b/src/vteft2.c index ac9716d6..4d9a5ade 100644 --- a/src/vteft2.c +++ b/src/vteft2.c @@ -330,6 +330,21 @@ _vte_ft2_draw_char(struct _vte_draw *draw, return FALSE; } +static gboolean +_vte_ft2_draw_has_char(struct _vte_draw *draw, gunichar c) +{ + struct _vte_ft2_data *data; + + data = (struct _vte_ft2_data*) draw->impl_data; + + if (data->cache != NULL) { + if (_vte_glyph_get(data->cache, c) != NULL) { + return TRUE; + } + } + return FALSE; +} + static void _vte_ft2_draw_rectangle(struct _vte_draw *draw, gint x, gint y, gint width, gint height, @@ -402,6 +417,7 @@ const struct _vte_draw_impl _vte_draw_ft2 = { _vte_ft2_get_using_fontconfig, _vte_ft2_draw_text, _vte_ft2_draw_char, + _vte_ft2_draw_has_char, _vte_ft2_draw_rectangle, _vte_ft2_fill_rectangle, _vte_ft2_set_scroll, diff --git a/src/vtegl.c b/src/vtegl.c index 30ca2c4d..3d6ef782 100644 --- a/src/vtegl.c +++ b/src/vtegl.c @@ -518,6 +518,21 @@ _vte_gl_draw_char(struct _vte_draw *draw, return FALSE; } +static gboolean +_vte_gl_draw_has_char(struct _vte_draw *draw, gunichar c) +{ + struct _vte_gl_data *data; + + data = (struct _vte_gl_data*) draw->impl_data; + + if (data->cache != NULL) { + if (_vte_glyph_get(data->cache, c) != NULL) { + return TRUE; + } + } + return FALSE; +} + static void _vte_gl_rectangle(struct _vte_draw *draw, GLenum type, @@ -590,6 +605,7 @@ const struct _vte_draw_impl _vte_draw_gl = { _vte_gl_get_using_fontconfig, _vte_gl_draw_text, _vte_gl_draw_char, + _vte_gl_draw_has_char, _vte_gl_draw_rectangle, _vte_gl_fill_rectangle, _vte_gl_set_scroll, diff --git a/src/vtepango.c b/src/vtepango.c index 7defba01..4b11c9a7 100644 --- a/src/vtepango.c +++ b/src/vtepango.c @@ -377,6 +377,12 @@ _vte_pango_draw_char(struct _vte_draw *draw, return TRUE; } +static gboolean +_vte_pango_draw_has_char(struct _vte_draw *draw, gunichar c) +{ + return FALSE; +} + static void _vte_pango_draw_rectangle(struct _vte_draw *draw, gint x, gint y, gint width, gint height, @@ -444,6 +450,7 @@ const struct _vte_draw_impl _vte_draw_pango = { _vte_pango_get_using_fontconfig, _vte_pango_draw_text, _vte_pango_draw_char, + _vte_pango_draw_has_char, _vte_pango_draw_rectangle, _vte_pango_fill_rectangle, _vte_pango_set_scroll, diff --git a/src/vtepangox.c b/src/vtepangox.c index 58ffedff..baa0c985 100644 --- a/src/vtepangox.c +++ b/src/vtepangox.c @@ -419,6 +419,13 @@ _vte_pango_x_draw_char(struct _vte_draw *draw, return TRUE; } +static gboolean +_vte_pango_x_draw_has_char(struct _vte_draw *draw, gunichar c) +{ + return FALSE; +} + + static void _vte_pango_x_draw_rectangle(struct _vte_draw *draw, gint x, gint y, gint width, gint height, @@ -486,6 +493,7 @@ const struct _vte_draw_impl _vte_draw_pango_x = { _vte_pango_x_get_using_fontconfig, _vte_pango_x_draw_text, _vte_pango_x_draw_char, + _vte_pango_x_draw_has_char, _vte_pango_x_draw_rectangle, _vte_pango_x_fill_rectangle, _vte_pango_x_set_scroll, diff --git a/src/vteskel.c b/src/vteskel.c index 1bd3f640..1cb7a3fa 100644 --- a/src/vteskel.c +++ b/src/vteskel.c @@ -169,6 +169,12 @@ _vte_skel_draw_char(struct _vte_draw *draw, return FALSE; } +static gboolean +_vte_skel_draw_has_char(struct _vte_draw *draw, gunichar c) +{ + return FALSE; +} + static void _vte_skel_draw_rectangle(struct _vte_draw *draw, gint x, gint y, gint width, gint height, @@ -218,6 +224,7 @@ const struct _vte_draw_impl _vte_draw_skel = { _vte_skel_get_using_fontconfig, _vte_skel_draw_text, _vte_skel_draw_char, + _vte_skel_draw_has_char, _vte_skel_draw_rectangle, _vte_skel_fill_rectangle, _vte_skel_set_scroll, diff --git a/src/vtexft.c b/src/vtexft.c index a5782406..c4c10e43 100644 --- a/src/vtexft.c +++ b/src/vtexft.c @@ -862,6 +862,21 @@ _vte_xft_draw_char (struct _vte_draw *draw, return FALSE; } +static gboolean +_vte_xft_draw_has_char (struct _vte_draw *draw, gunichar c) +{ + struct _vte_xft_data *data; + + data = (struct _vte_xft_data*) draw->impl_data; + if (data->font != NULL && + _vte_xft_font_for_char (data->font, c, + data->locked_fonts[data->cur_locked_fonts&1]) != NULL) { + + return TRUE; + } + return FALSE; +} + static void _vte_xft_draw_rectangle (struct _vte_draw *draw, gint x, gint y, gint width, gint height, @@ -951,6 +966,7 @@ const struct _vte_draw_impl _vte_draw_xft = { _vte_xft_get_using_fontconfig, _vte_xft_draw_text, _vte_xft_draw_char, + _vte_xft_draw_has_char, _vte_xft_draw_rectangle, _vte_xft_fill_rectangle, _vte_xft_set_scroll, |