[vte/vte-next] Draw onto the passed-in context
- From: Christian Persch <chpe src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vte/vte-next] Draw onto the passed-in context
- Date: Tue, 3 May 2011 14:02:24 +0000 (UTC)
commit 6f5fa137d4493e8e5198a00a512d62abe9104696
Author: Christian Persch <chpe gnome org>
Date: Tue May 3 15:47:21 2011 +0200
Draw onto the passed-in context
Don't create our own cairo context, but instead draw to the
context passed to ::draw.
src/vte.c | 16 +++++++-------
src/vtedraw.c | 61 +++++++++++++++++++-------------------------------------
src/vtedraw.h | 6 +---
3 files changed, 31 insertions(+), 52 deletions(-)
---
diff --git a/src/vte.c b/src/vte.c
index e044d24..7870c72 100644
--- a/src/vte.c
+++ b/src/vte.c
@@ -4313,6 +4313,7 @@ _vte_terminal_visible_beep(VteTerminal *terminal)
widget = &terminal->widget;
if (gtk_widget_get_realized (widget)) {
+ cairo_t *cr;
style = gtk_widget_get_style (widget);
gtk_widget_get_allocation (widget, &allocation);
@@ -4321,12 +4322,14 @@ _vte_terminal_visible_beep(VteTerminal *terminal)
color.blue = style->fg[gtk_widget_get_state (widget)].blue / 65535.;
color.alpha = 1.0;
- _vte_draw_start(terminal->pvt->draw);
+ cr = gdk_cairo_create(gtk_widget_get_window(widget));
+ _vte_draw_set_cairo(terminal->pvt->draw, cr);
_vte_draw_fill_rectangle(terminal->pvt->draw,
0, 0,
allocation.width, allocation.height,
&color);
- _vte_draw_end(terminal->pvt->draw);
+ _vte_draw_set_cairo(terminal->pvt->draw, NULL);
+ cairo_destroy(cr);
/* Force the repaint, max delay of UPDATE_REPEAT_TIMEOUT */
_vte_invalidate_all (terminal);
@@ -8333,13 +8336,11 @@ vte_terminal_fill_rectangle(VteTerminal *terminal,
gint width,
gint height)
{
- _vte_draw_start(terminal->pvt->draw);
_vte_draw_fill_rectangle(terminal->pvt->draw,
x + terminal->pvt->inner_border.left,
y + terminal->pvt->inner_border.top,
width, height,
color);
- _vte_draw_end(terminal->pvt->draw);
}
static void
@@ -8363,13 +8364,11 @@ vte_terminal_draw_rectangle(VteTerminal *terminal,
gint width,
gint height)
{
- _vte_draw_start(terminal->pvt->draw);
_vte_draw_draw_rectangle(terminal->pvt->draw,
x + terminal->pvt->inner_border.left,
y + terminal->pvt->inner_border.top,
width, height,
color);
- _vte_draw_end(terminal->pvt->draw);
}
static void
@@ -10249,11 +10248,12 @@ vte_terminal_draw(GtkWidget *widget,
clip_rect.width, clip_rect.height);
}
+ _vte_draw_set_cairo(terminal->pvt->draw, cr);
+
allocated_width = gtk_widget_get_allocated_width(widget);
allocated_height = gtk_widget_get_allocated_height(widget);
/* Designate the start of the drawing operation and clear the area. */
- _vte_draw_start(terminal->pvt->draw);
{
if (terminal->pvt->scroll_background) {
_vte_draw_set_background_scroll(terminal->pvt->draw,
@@ -10310,7 +10310,7 @@ vte_terminal_draw(GtkWidget *widget,
vte_terminal_paint_im_preedit_string(terminal);
/* Done with various structures. */
- _vte_draw_end(terminal->pvt->draw);
+ _vte_draw_set_cairo(terminal->pvt->draw, NULL);
cairo_region_destroy (region);
diff --git a/src/vtedraw.c b/src/vtedraw.c
index 4d9bede..1e70249 100644
--- a/src/vtedraw.c
+++ b/src/vtedraw.c
@@ -722,8 +722,6 @@ font_info_get_unistr_info (struct font_info *info,
struct _vte_draw {
GtkWidget *widget;
- gint started;
-
struct font_info *font;
struct font_info *font_bold;
cairo_pattern_t *bg_pattern;
@@ -768,36 +766,18 @@ _vte_draw_free (struct _vte_draw *draw)
}
void
-_vte_draw_start (struct _vte_draw *draw)
+_vte_draw_set_cairo(struct _vte_draw *draw,
+ cairo_t *cr)
{
- GdkWindow *window;
-
- g_return_if_fail (gtk_widget_get_realized (draw->widget));
-
- _vte_debug_print (VTE_DEBUG_DRAW, "draw_start\n");
-
- if (draw->started == 0) {
- window = gtk_widget_get_window(draw->widget);
- g_object_ref (window);
- draw->cr = gdk_cairo_create (window);
- }
-
- draw->started++;
-}
-
-void
-_vte_draw_end (struct _vte_draw *draw)
-{
- g_return_if_fail (draw->started);
-
- draw->started--;
- if (draw->started == 0) {
- cairo_destroy (draw->cr);
- draw->cr = NULL;
- g_object_unref (gtk_widget_get_window(draw->widget));
- }
-
- _vte_debug_print (VTE_DEBUG_DRAW, "draw_end\n");
+ _vte_debug_print (VTE_DEBUG_DRAW, "%s cairo context\n", cr ? "Settings" : "Unsetting");
+
+ if (cr) {
+ g_assert (draw->cr == NULL);
+ draw->cr = cr;
+ } else {
+ g_assert (draw->cr != NULL);
+ draw->cr = NULL;
+ }
}
void
@@ -831,7 +811,8 @@ void
_vte_draw_clip (struct _vte_draw *draw, cairo_region_t *region)
{
_vte_debug_print (VTE_DEBUG_DRAW, "draw_clip\n");
- gdk_cairo_region(draw->cr, region);
+ g_assert(draw->cr);
+ gdk_cairo_region(draw->cr, region);
cairo_clip (draw->cr);
}
@@ -843,7 +824,8 @@ _vte_draw_clear (struct _vte_draw *draw, gint x, gint y, gint width, gint height
_vte_debug_print (VTE_DEBUG_DRAW, "draw_clear (%d, %d, %d, %d)\n",
x,y,width, height);
- cairo_rectangle (draw->cr, x, y, width, height);
+ g_assert(draw->cr);
+ cairo_rectangle (draw->cr, x, y, width, height);
cairo_set_operator (draw->cr, CAIRO_OPERATOR_SOURCE);
cairo_set_source (draw->cr, draw->bg_pattern);
cairo_fill (draw->cr);
@@ -924,6 +906,7 @@ _vte_draw_text_internal (struct _vte_draw *draw,
g_return_if_fail (font != NULL);
+ g_assert(draw->cr);
gdk_cairo_set_source_rgba (draw->cr, color);
cairo_set_operator (draw->cr, CAIRO_OPERATOR_OVER);
@@ -982,7 +965,7 @@ _vte_draw_text (struct _vte_draw *draw,
struct _vte_draw_text_request *requests, gsize n_requests,
const GdkRGBA *color, gboolean bold)
{
- g_return_if_fail (draw->started);
+ g_assert(draw->cr);
if (_vte_debug_on (VTE_DEBUG_DRAW)) {
GString *string = g_string_new ("");
@@ -1057,14 +1040,13 @@ _vte_draw_draw_rectangle (struct _vte_draw *draw,
gint x, gint y, gint width, gint height,
const GdkRGBA *color)
{
- g_return_if_fail (draw->started);
-
_vte_debug_print (VTE_DEBUG_DRAW,
"draw_rectangle (%d, %d, %d, %d, color=(%.3f,%.3f,%.3f,%.3f))\n",
x,y,width,height,
color->red, color->green, color->blue, color->alpha);
- cairo_set_operator (draw->cr, CAIRO_OPERATOR_OVER);
+ g_assert(draw->cr);
+ cairo_set_operator (draw->cr, CAIRO_OPERATOR_OVER);
cairo_rectangle (draw->cr, x+VTE_LINE_WIDTH/2., y+VTE_LINE_WIDTH/2., width-VTE_LINE_WIDTH, height-VTE_LINE_WIDTH);
gdk_cairo_set_source_rgba (draw->cr, color);
cairo_set_line_width (draw->cr, VTE_LINE_WIDTH);
@@ -1076,14 +1058,13 @@ _vte_draw_fill_rectangle (struct _vte_draw *draw,
gint x, gint y, gint width, gint height,
const GdkRGBA *color)
{
- g_return_if_fail (draw->started);
-
_vte_debug_print (VTE_DEBUG_DRAW,
"draw_fill_rectangle (%d, %d, %d, %d, color=(%.3f,%.3f,%.3f,%.3f))\n",
x,y,width,height,
color->red, color->green, color->blue, color->alpha);
- cairo_set_operator (draw->cr, CAIRO_OPERATOR_OVER);
+ g_assert(draw->cr);
+ cairo_set_operator (draw->cr, CAIRO_OPERATOR_OVER);
cairo_rectangle (draw->cr, x, y, width, height);
gdk_cairo_set_source_rgba (draw->cr, color);
cairo_fill (draw->cr);
diff --git a/src/vtedraw.h b/src/vtedraw.h
index 6c1863e..d0d2be9 100644
--- a/src/vtedraw.h
+++ b/src/vtedraw.h
@@ -61,10 +61,8 @@ struct _vte_draw_text_request {
struct _vte_draw *_vte_draw_new(GtkWidget *widget);
void _vte_draw_free(struct _vte_draw *draw);
-/* Begin and end a drawing operation. If anything is buffered locally, it is
- flushed to the window system when _end() is called. */
-void _vte_draw_start(struct _vte_draw *draw);
-void _vte_draw_end(struct _vte_draw *draw);
+void _vte_draw_set_cairo(struct _vte_draw *draw,
+ cairo_t *cr);
void _vte_draw_set_background_pattern (struct _vte_draw *draw,
cairo_pattern_t *pattern);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]