From 152917d5e1b0214ac9c85047f509ac3439dc2c20 Mon Sep 17 00:00:00 2001 From: Thomas James Alexander Thurman Date: Fri, 6 Feb 2009 04:50:50 +0000 Subject: [PATCH] Lines where x1==x2 or y1==y2 may have the second element null Lines where x1==x2 or y1==y2 may have the second element null. Lines where both are null, and the width is zero, are points. This speeds things up surprisingly much. svn path=/trunk/; revision=4119 --- src/ui/theme-parser.c | 12 ++++++++++-- src/ui/theme.c | 22 +++++++++++++++++++--- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/ui/theme-parser.c b/src/ui/theme-parser.c index a2fe2a27c..da6588fa1 100644 --- a/src/ui/theme-parser.c +++ b/src/ui/theme-parser.c @@ -1658,8 +1658,16 @@ parse_draw_op_element (GMarkupParseContext *context, op->data.line.x1 = meta_draw_spec_new (info->theme, x1, NULL); op->data.line.y1 = meta_draw_spec_new (info->theme, y1, NULL); - op->data.line.x2 = meta_draw_spec_new (info->theme, x2, NULL); - op->data.line.y2 = meta_draw_spec_new (info->theme, y2, NULL); + + if (strcmp(x1, x2)==0) + op->data.line.x2 = NULL; + else + op->data.line.x2 = meta_draw_spec_new (info->theme, x2, NULL); + + if (strcmp(y1, y2)==0) + op->data.line.y2 = NULL; + else + op->data.line.y2 = meta_draw_spec_new (info->theme, y2, NULL); op->data.line.width = width_val; op->data.line.dash_on_length = dash_on_val; diff --git a/src/ui/theme.c b/src/ui/theme.c index 2d9a7ef92..8b3a36926 100644 --- a/src/ui/theme.c +++ b/src/ui/theme.c @@ -2645,6 +2645,7 @@ parse_size_unchecked (MetaDrawSpec *spec, void meta_draw_spec_free (MetaDrawSpec *spec) { + if (!spec) return; free_tokens (spec->tokens, spec->n_tokens); g_slice_free (MetaDrawSpec, spec); } @@ -3489,10 +3490,25 @@ meta_draw_op_draw_with_env (const MetaDrawOp *op, x1 = parse_x_position_unchecked (op->data.line.x1, env); y1 = parse_y_position_unchecked (op->data.line.y1, env); - x2 = parse_x_position_unchecked (op->data.line.x2, env); - y2 = parse_y_position_unchecked (op->data.line.y2, env); - gdk_draw_line (drawable, gc, x1, y1, x2, y2); + if (!op->data.line.x2 && + !op->data.line.y2 && + op->data.line.width==0) + gdk_draw_point (drawable, gc, x1, y1); + else + { + if (op->data.line.x2) + x2 = parse_x_position_unchecked (op->data.line.x2, env); + else + x2 = x1; + + if (op->data.line.y2) + y2 = parse_y_position_unchecked (op->data.line.y2, env); + else + y2 = y1; + + gdk_draw_line (drawable, gc, x1, y1, x2, y2); + } g_object_unref (G_OBJECT (gc)); }