theming: Avoid boxed struct copies throughout the default engine

This commit is contained in:
Carlos Garnacho 2011-03-28 19:34:40 +02:00
parent 21f117c695
commit 6834bace95

View File

@ -1052,26 +1052,26 @@ gtk_theming_engine_render_check (GtkThemingEngine *engine,
gdouble width,
gdouble height)
{
GdkRGBA *fg_color, *bg_color, *border_color;
GdkRGBA fg_color, bg_color;
GtkStateFlags flags;
gint exterior_size, interior_size, thickness, pad;
GtkBorderStyle border_style;
GtkBorder *border;
GtkBorder border;
gint border_width;
flags = gtk_theming_engine_get_state (engine);
cairo_save (cr);
gtk_theming_engine_get_color (engine, flags, &fg_color);
gtk_theming_engine_get_background_color (engine, flags, &bg_color);
gtk_theming_engine_get_border (engine, flags, &border);
gtk_theming_engine_get (engine, flags,
"color", &fg_color,
"background-color", &bg_color,
"border-color", &border_color,
"border-style", &border_style,
"border-width", &border,
NULL);
border_width = MIN (MIN (border->top, border->bottom),
MIN (border->left, border->right));
border_width = MIN (MIN (border.top, border.bottom),
MIN (border.left, border.right));
exterior_size = MIN (width, height);
if (exterior_size % 2 == 0) /* Ensure odd */
@ -1093,21 +1093,20 @@ gtk_theming_engine_render_check (GtkThemingEngine *engine,
if (border_style == GTK_BORDER_STYLE_SOLID)
{
GdkRGBA border_color;
cairo_set_line_width (cr, border_width);
gtk_theming_engine_get_border_color (engine, flags, &border_color);
cairo_rectangle (cr, x + 0.5, y + 0.5, exterior_size - 1, exterior_size - 1);
gdk_cairo_set_source_rgba (cr, bg_color);
gdk_cairo_set_source_rgba (cr, &bg_color);
cairo_fill_preserve (cr);
if (border_color)
gdk_cairo_set_source_rgba (cr, border_color);
else
gdk_cairo_set_source_rgba (cr, fg_color);
gdk_cairo_set_source_rgba (cr, &border_color);
cairo_stroke (cr);
}
gdk_cairo_set_source_rgba (cr, fg_color);
gdk_cairo_set_source_rgba (cr, &fg_color);
if (flags & GTK_STATE_FLAG_INCONSISTENT)
{
@ -1164,11 +1163,6 @@ gtk_theming_engine_render_check (GtkThemingEngine *engine,
}
cairo_restore (cr);
gdk_rgba_free (fg_color);
gdk_rgba_free (bg_color);
gdk_rgba_free (border_color);
gtk_border_free (border);
}
static void
@ -1180,26 +1174,26 @@ gtk_theming_engine_render_option (GtkThemingEngine *engine,
gdouble height)
{
GtkStateFlags flags;
GdkRGBA *fg_color, *bg_color, *border_color;
GdkRGBA fg_color, bg_color;
gint exterior_size, interior_size, pad, thickness, border_width;
GtkBorderStyle border_style;
GtkBorder *border;
GtkBorder border;
flags = gtk_theming_engine_get_state (engine);
cairo_save (cr);
gtk_theming_engine_get_color (engine, flags, &fg_color);
gtk_theming_engine_get_background_color (engine, flags, &bg_color);
gtk_theming_engine_get_border (engine, flags, &border);
gtk_theming_engine_get (engine, flags,
"color", &fg_color,
"background-color", &bg_color,
"border-color", &border_color,
"border-style", &border_style,
"border-width", &border,
NULL);
exterior_size = MIN (width, height);
border_width = MIN (MIN (border->top, border->bottom),
MIN (border->left, border->right));
border_width = MIN (MIN (border.top, border.bottom),
MIN (border.left, border.right));
if (exterior_size % 2 == 0) /* Ensure odd */
exterior_size -= 1;
@ -1209,7 +1203,10 @@ gtk_theming_engine_render_option (GtkThemingEngine *engine,
if (border_style == GTK_BORDER_STYLE_SOLID)
{
GdkRGBA border_color;
cairo_set_line_width (cr, border_width);
gtk_theming_engine_get_border_color (engine, flags, &border_color);
cairo_new_sub_path (cr);
cairo_arc (cr,
@ -1218,18 +1215,14 @@ gtk_theming_engine_render_option (GtkThemingEngine *engine,
(exterior_size - 1) / 2.,
0, 2 * G_PI);
gdk_cairo_set_source_rgba (cr, bg_color);
gdk_cairo_set_source_rgba (cr, &bg_color);
cairo_fill_preserve (cr);
if (border_color)
gdk_cairo_set_source_rgba (cr, border_color);
else
gdk_cairo_set_source_rgba (cr, fg_color);
gdk_cairo_set_source_rgba (cr, &border_color);
cairo_stroke (cr);
}
gdk_cairo_set_source_rgba (cr, fg_color);
gdk_cairo_set_source_rgba (cr, &fg_color);
/* FIXME: thickness */
thickness = 1;
@ -1277,11 +1270,6 @@ gtk_theming_engine_render_option (GtkThemingEngine *engine,
}
cairo_restore (cr);
gdk_rgba_free (fg_color);
gdk_rgba_free (bg_color);
gdk_rgba_free (border_color);
gtk_border_free (border);
}
static void
@ -1313,15 +1301,12 @@ gtk_theming_engine_render_arrow (GtkThemingEngine *engine,
gdouble size)
{
GtkStateFlags flags;
GdkRGBA *fg_color;
GdkRGBA fg_color;
cairo_save (cr);
flags = gtk_theming_engine_get_state (engine);
gtk_theming_engine_get (engine, flags,
"color", &fg_color,
NULL);
gtk_theming_engine_get_color (engine, flags, &fg_color);
if (flags & GTK_STATE_FLAG_INSENSITIVE)
{
@ -1331,12 +1316,10 @@ gtk_theming_engine_render_arrow (GtkThemingEngine *engine,
}
add_path_arrow (cr, angle, x, y, size);
gdk_cairo_set_source_rgba (cr, fg_color);
gdk_cairo_set_source_rgba (cr, &fg_color);
cairo_fill (cr);
cairo_restore (cr);
gdk_rgba_free (fg_color);
}
static void
@ -1507,12 +1490,12 @@ render_background_internal (GtkThemingEngine *engine,
gdouble height,
GtkJunctionSides junction)
{
GdkRGBA *bg_color;
GdkRGBA bg_color;
cairo_pattern_t *pattern;
GtkStateFlags flags;
gboolean running;
gdouble progress, alpha = 1;
GtkBorder *border;
GtkBorder border;
gint radius, border_width;
GtkBorderStyle border_style;
gdouble mat_w, mat_h;
@ -1526,16 +1509,17 @@ render_background_internal (GtkThemingEngine *engine,
cairo_matrix_init_identity (&identity);
gtk_theming_engine_get_background_color (engine, flags, &bg_color);
gtk_theming_engine_get_border (engine, flags, &border);
gtk_theming_engine_get (engine, flags,
"background-image", &pattern,
"background-color", &bg_color,
"border-radius", &radius,
"border-width", &border,
"border-style", &border_style,
NULL);
border_width = MIN (MIN (border->top, border->bottom),
MIN (border->left, border->right));
border_width = MIN (MIN (border.top, border.bottom),
MIN (border.left, border.right));
if (border_width > 1 &&
border_style == GTK_BORDER_STYLE_NONE)
@ -1549,10 +1533,10 @@ render_background_internal (GtkThemingEngine *engine,
}
else
{
x += border->left;
y += border->top;
width -= border->left + border->right;
height -= border->top + border->bottom;
x += border.left;
y += border.top;
width -= border.left + border.right;
height -= border.top + border.bottom;
}
if (width <= 0 || height <= 0)
@ -1574,7 +1558,7 @@ render_background_internal (GtkThemingEngine *engine,
{
cairo_pattern_t *other_pattern;
GtkStateFlags other_flags;
GdkRGBA *other_bg;
GdkRGBA other_bg;
cairo_pattern_t *new_pattern = NULL;
if (flags & GTK_STATE_FLAG_PRELIGHT)
@ -1585,9 +1569,9 @@ render_background_internal (GtkThemingEngine *engine,
else
other_flags = flags | GTK_STATE_FLAG_PRELIGHT;
gtk_theming_engine_get_background_color (engine, other_flags, &other_bg);
gtk_theming_engine_get (engine, other_flags,
"background-image", &other_pattern,
"background-color", &other_bg,
NULL);
if (pattern && other_pattern)
@ -1687,13 +1671,13 @@ render_background_internal (GtkThemingEngine *engine,
if (pattern)
{
p = pattern;
c = other_bg;
c = &other_bg;
progress = 1 - progress;
}
else
{
p = other_pattern;
c = bg_color;
c = &bg_color;
}
if (cairo_pattern_get_type (p) == CAIRO_PATTERN_TYPE_LINEAR)
@ -1727,16 +1711,11 @@ render_background_internal (GtkThemingEngine *engine,
}
else
{
const GdkRGBA *color, *other_color;
/* Merge just colors */
color = bg_color;
other_color = other_bg;
new_pattern = cairo_pattern_create_rgba (CLAMP (color->red + ((other_color->red - color->red) * progress), 0, 1),
CLAMP (color->green + ((other_color->green - color->green) * progress), 0, 1),
CLAMP (color->blue + ((other_color->blue - color->blue) * progress), 0, 1),
CLAMP (color->alpha + ((other_color->alpha - color->alpha) * progress), 0, 1));
new_pattern = cairo_pattern_create_rgba (CLAMP (bg_color.red + ((other_bg.red - bg_color.red) * progress), 0, 1),
CLAMP (bg_color.green + ((other_bg.green - bg_color.green) * progress), 0, 1),
CLAMP (bg_color.blue + ((other_bg.blue - bg_color.blue) * progress), 0, 1),
CLAMP (bg_color.alpha + ((other_bg.alpha - bg_color.alpha) * progress), 0, 1));
}
if (new_pattern)
@ -1748,9 +1727,6 @@ render_background_internal (GtkThemingEngine *engine,
if (other_pattern)
cairo_pattern_destroy (other_pattern);
if (other_bg)
gdk_rgba_free (other_bg);
}
_cairo_round_rectangle_sides (cr, (gdouble) radius,
@ -1762,7 +1738,7 @@ render_background_internal (GtkThemingEngine *engine,
cairo_set_source (cr, pattern);
}
else
gdk_cairo_set_source_rgba (cr, bg_color);
gdk_cairo_set_source_rgba (cr, &bg_color);
if (alpha == 1)
{
@ -1801,9 +1777,6 @@ render_background_internal (GtkThemingEngine *engine,
}
cairo_restore (cr);
gdk_rgba_free (bg_color);
gtk_border_free (border);
}
static void
@ -1857,29 +1830,31 @@ render_frame_internal (GtkThemingEngine *engine,
{
GtkStateFlags state;
GdkRGBA lighter;
GdkRGBA *border_color;
GdkRGBA border_color;
GtkBorderStyle border_style;
gint border_width, radius;
gdouble progress, d1, d2, m;
gboolean running;
GtkBorder *border;
GtkBorder border;
state = gtk_theming_engine_get_state (engine);
gtk_theming_engine_get_border_color (engine, state, &border_color);
gtk_theming_engine_get_border (engine, state, &border);
gtk_theming_engine_get (engine, state,
"border-color", &border_color,
"border-style", &border_style,
"border-width", &border,
"border-radius", &radius,
NULL);
running = gtk_theming_engine_state_is_running (engine, GTK_STATE_PRELIGHT, &progress);
border_width = MIN (MIN (border->top, border->bottom),
MIN (border->left, border->right));
border_width = MIN (MIN (border.top, border.bottom),
MIN (border.left, border.right));
if (running)
{
GtkStateFlags other_state;
GdkRGBA *other_color;
GdkRGBA other_color;
if (state & GTK_STATE_FLAG_PRELIGHT)
{
@ -1889,21 +1864,17 @@ render_frame_internal (GtkThemingEngine *engine,
else
other_state = state | GTK_STATE_FLAG_PRELIGHT;
gtk_theming_engine_get (engine, other_state,
"border-color", &other_color,
NULL);
gtk_theming_engine_get_border_color (engine, other_state, &other_color);
border_color->red = CLAMP (border_color->red + ((other_color->red - border_color->red) * progress), 0, 1);
border_color->green = CLAMP (border_color->green + ((other_color->green - border_color->green) * progress), 0, 1);
border_color->blue = CLAMP (border_color->blue + ((other_color->blue - border_color->blue) * progress), 0, 1);
border_color->alpha = CLAMP (border_color->alpha + ((other_color->alpha - border_color->alpha) * progress), 0, 1);
gdk_rgba_free (other_color);
border_color.red = CLAMP (border_color.red + ((other_color.red - border_color.red) * progress), 0, 1);
border_color.green = CLAMP (border_color.green + ((other_color.green - border_color.green) * progress), 0, 1);
border_color.blue = CLAMP (border_color.blue + ((other_color.blue - border_color.blue) * progress), 0, 1);
border_color.alpha = CLAMP (border_color.alpha + ((other_color.alpha - border_color.alpha) * progress), 0, 1);
}
cairo_save (cr);
color_shade (border_color, 1.8, &lighter);
color_shade (&border_color, 1.8, &lighter);
switch (border_style)
{
@ -1932,7 +1903,7 @@ render_frame_internal (GtkThemingEngine *engine,
x, y, width, height,
SIDE_ALL & ~(hidden_side),
junction);
gdk_cairo_set_source_rgba (cr, border_color);
gdk_cairo_set_source_rgba (cr, &border_color);
cairo_stroke (cr);
break;
@ -1964,7 +1935,7 @@ render_frame_internal (GtkThemingEngine *engine,
if (border_style == GTK_BORDER_STYLE_INSET)
gdk_cairo_set_source_rgba (cr, &lighter);
else
gdk_cairo_set_source_rgba (cr, border_color);
gdk_cairo_set_source_rgba (cr, &border_color);
_cairo_round_rectangle_sides (cr, (gdouble) radius,
x + d1, y + d1,
@ -1974,7 +1945,7 @@ render_frame_internal (GtkThemingEngine *engine,
cairo_stroke (cr);
if (border_style == GTK_BORDER_STYLE_INSET)
gdk_cairo_set_source_rgba (cr, border_color);
gdk_cairo_set_source_rgba (cr, &border_color);
else
gdk_cairo_set_source_rgba (cr, &lighter);
@ -1996,7 +1967,7 @@ render_frame_internal (GtkThemingEngine *engine,
if (border_style == GTK_BORDER_STYLE_INSET)
gdk_cairo_set_source_rgba (cr, &lighter);
else
gdk_cairo_set_source_rgba (cr, border_color);
gdk_cairo_set_source_rgba (cr, &border_color);
cairo_set_line_width (cr, 1);
@ -2020,11 +1991,6 @@ render_frame_internal (GtkThemingEngine *engine,
}
cairo_restore (cr);
if (border_color)
gdk_rgba_free (border_color);
gtk_border_free (border);
}
static void
@ -2068,7 +2034,7 @@ gtk_theming_engine_render_expander (GtkThemingEngine *engine,
gdouble height)
{
GtkStateFlags flags;
GdkRGBA *outline_color, *fg_color;
GdkRGBA outline_color, fg_color;
double vertical_overshoot;
int diameter;
double radius;
@ -2084,12 +2050,8 @@ gtk_theming_engine_render_expander (GtkThemingEngine *engine,
cairo_save (cr);
flags = gtk_theming_engine_get_state (engine);
gtk_theming_engine_get (engine, flags,
"color", &fg_color,
NULL);
gtk_theming_engine_get (engine, flags,
"border-color", &outline_color,
NULL);
gtk_theming_engine_get_color (engine, flags, &fg_color);
gtk_theming_engine_get_border_color (engine, flags, &outline_color);
running = gtk_theming_engine_state_is_running (engine, GTK_STATE_ACTIVE, &progress);
is_rtl = (gtk_theming_engine_get_direction (engine) == GTK_TEXT_DIR_RTL);
@ -2164,17 +2126,14 @@ gtk_theming_engine_render_expander (GtkThemingEngine *engine,
cairo_set_line_width (cr, line_width);
gdk_cairo_set_source_rgba (cr, fg_color);
gdk_cairo_set_source_rgba (cr, &fg_color);
cairo_fill_preserve (cr);
gdk_cairo_set_source_rgba (cr, outline_color);
gdk_cairo_set_source_rgba (cr, &outline_color);
cairo_stroke (cr);
cairo_restore (cr);
gdk_rgba_free (fg_color);
gdk_rgba_free (outline_color);
}
static void
@ -2186,16 +2145,14 @@ gtk_theming_engine_render_focus (GtkThemingEngine *engine,
gdouble height)
{
GtkStateFlags flags;
GdkRGBA *color;
GdkRGBA color;
gint line_width;
gint8 *dash_list;
cairo_save (cr);
flags = gtk_theming_engine_get_state (engine);
gtk_theming_engine_get (engine, flags,
"color", &color,
NULL);
gtk_theming_engine_get_color (engine, flags, &color);
gtk_theming_engine_get_style (engine,
"focus-line-width", &line_width,
@ -2238,12 +2195,11 @@ gtk_theming_engine_render_focus (GtkThemingEngine *engine,
width - line_width,
height - line_width);
gdk_cairo_set_source_rgba (cr, color);
gdk_cairo_set_source_rgba (cr, &color);
cairo_stroke (cr);
cairo_restore (cr);
gdk_rgba_free (color);
g_free (dash_list);
}
@ -2255,7 +2211,7 @@ gtk_theming_engine_render_line (GtkThemingEngine *engine,
gdouble x1,
gdouble y1)
{
GdkRGBA *bg_color, darker, lighter;
GdkRGBA bg_color, darker, lighter;
GtkStateFlags flags;
gint i, thickness, thickness_dark, thickness_light, len;
cairo_matrix_t matrix;
@ -2269,11 +2225,9 @@ gtk_theming_engine_render_line (GtkThemingEngine *engine,
flags = gtk_theming_engine_get_state (engine);
cairo_save (cr);
gtk_theming_engine_get (engine, flags,
"background-color", &bg_color,
NULL);
color_shade (bg_color, 0.7, &darker);
color_shade (bg_color, 1.3, &lighter);
gtk_theming_engine_get_background_color (engine, flags, &bg_color);
color_shade (&bg_color, 0.7, &darker);
color_shade (&bg_color, 1.3, &lighter);
cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
cairo_set_line_width (cr, 1);
@ -2321,8 +2275,6 @@ gtk_theming_engine_render_line (GtkThemingEngine *engine,
}
cairo_restore (cr);
gdk_rgba_free (bg_color);
}
static void
@ -2333,17 +2285,14 @@ gtk_theming_engine_render_layout (GtkThemingEngine *engine,
PangoLayout *layout)
{
const PangoMatrix *matrix;
GdkRGBA *fg_color;
GdkRGBA fg_color;
GtkStateFlags flags;
gdouble progress;
gboolean running;
cairo_save (cr);
flags = gtk_theming_engine_get_state (engine);
gtk_theming_engine_get (engine, flags,
"color", &fg_color,
NULL);
gtk_theming_engine_get_color (engine, flags, &fg_color);
matrix = pango_context_get_matrix (pango_layout_get_context (layout));
@ -2352,7 +2301,7 @@ gtk_theming_engine_render_layout (GtkThemingEngine *engine,
if (running)
{
GtkStateFlags other_flags;
GdkRGBA *other_fg;
GdkRGBA other_fg;
if (flags & GTK_STATE_FLAG_PRELIGHT)
{
@ -2362,20 +2311,12 @@ gtk_theming_engine_render_layout (GtkThemingEngine *engine,
else
other_flags = flags | GTK_STATE_FLAG_PRELIGHT;
gtk_theming_engine_get (engine, other_flags,
"color", &other_fg,
NULL);
gtk_theming_engine_get_color (engine, other_flags, &other_fg);
if (fg_color && other_fg)
{
fg_color->red = CLAMP (fg_color->red + ((other_fg->red - fg_color->red) * progress), 0, 1);
fg_color->green = CLAMP (fg_color->green + ((other_fg->green - fg_color->green) * progress), 0, 1);
fg_color->blue = CLAMP (fg_color->blue + ((other_fg->blue - fg_color->blue) * progress), 0, 1);
fg_color->alpha = CLAMP (fg_color->alpha + ((other_fg->alpha - fg_color->alpha) * progress), 0, 1);
}
if (other_fg)
gdk_rgba_free (other_fg);
fg_color.red = CLAMP (fg_color.red + ((other_fg.red - fg_color.red) * progress), 0, 1);
fg_color.green = CLAMP (fg_color.green + ((other_fg.green - fg_color.green) * progress), 0, 1);
fg_color.blue = CLAMP (fg_color.blue + ((other_fg.blue - fg_color.blue) * progress), 0, 1);
fg_color.alpha = CLAMP (fg_color.alpha + ((other_fg.alpha - fg_color.alpha) * progress), 0, 1);
}
if (matrix)
@ -2415,12 +2356,10 @@ gtk_theming_engine_render_layout (GtkThemingEngine *engine,
cairo_restore (cr);
}
gdk_cairo_set_source_rgba (cr, fg_color);
gdk_cairo_set_source_rgba (cr, &fg_color);
pango_cairo_show_layout (cr, layout);
cairo_restore (cr);
gdk_rgba_free (fg_color);
}
static void
@ -2475,18 +2414,19 @@ gtk_theming_engine_render_frame_gap (GtkThemingEngine *engine,
GtkStateFlags state;
gint border_width, radius;
gdouble x0, y0, x1, y1, xc, yc, wc, hc;
GtkBorder *border;
GtkBorder border;
xc = yc = wc = hc = 0;
state = gtk_theming_engine_get_state (engine);
junction = gtk_theming_engine_get_junction_sides (engine);
gtk_theming_engine_get_border (engine, state, &border);
gtk_theming_engine_get (engine, state,
"border-width", &border,
"border-radius", &radius,
NULL);
border_width = MIN (MIN (border->top, border->bottom),
MIN (border->left, border->right));
border_width = MIN (MIN (border.top, border.bottom),
MIN (border.left, border.right));
cairo_save (cr);
@ -2557,8 +2497,6 @@ gtk_theming_engine_render_frame_gap (GtkThemingEngine *engine,
0, junction);
cairo_restore (cr);
gtk_border_free (border);
}
static void
@ -2666,8 +2604,7 @@ gtk_theming_engine_render_handle (GtkThemingEngine *engine,
gdouble height)
{
GtkStateFlags flags;
GdkRGBA *bg_color;
GdkRGBA lighter, darker;
GdkRGBA bg_color, lighter, darker;
GtkJunctionSides sides;
gint xx, yy;
@ -2676,12 +2613,10 @@ gtk_theming_engine_render_handle (GtkThemingEngine *engine,
cairo_set_line_width (cr, 1.0);
sides = gtk_theming_engine_get_junction_sides (engine);
gtk_theming_engine_get_background_color (engine, flags, &bg_color);
gtk_theming_engine_get (engine, flags,
"background-color", &bg_color,
NULL);
color_shade (bg_color, 0.7, &darker);
color_shade (bg_color, 1.3, &lighter);
color_shade (&bg_color, 0.7, &darker);
color_shade (&bg_color, 1.3, &lighter);
render_background_internal (engine, cr, x, y, width, height, sides);
@ -2952,8 +2887,6 @@ gtk_theming_engine_render_handle (GtkThemingEngine *engine,
}
cairo_restore (cr);
gdk_rgba_free (bg_color);
}
static void
@ -2968,7 +2901,7 @@ gtk_theming_engine_render_activity (GtkThemingEngine *engine,
{
GtkStateFlags state;
guint num_steps, step;
GdkRGBA *color;
GdkRGBA color;
gdouble progress;
gdouble radius;
gdouble half;
@ -2977,9 +2910,7 @@ gtk_theming_engine_render_activity (GtkThemingEngine *engine,
num_steps = 12;
state = gtk_theming_engine_get_state (engine);
gtk_theming_engine_get (engine, state,
"color", &color,
NULL);
gtk_theming_engine_get_color (engine, state, &color);
if (gtk_theming_engine_state_is_running (engine, GTK_STATE_ACTIVE, &progress))
step = (guint) (progress * num_steps);
@ -3005,10 +2936,10 @@ gtk_theming_engine_render_activity (GtkThemingEngine *engine,
gdouble yscale = - cos (i * G_PI / half);
cairo_set_source_rgba (cr,
color->red,
color->green,
color->blue,
color->alpha * t);
color.red,
color.green,
color.blue,
color.alpha * t);
cairo_move_to (cr,
(radius - inset) * xscale,
@ -3020,8 +2951,6 @@ gtk_theming_engine_render_activity (GtkThemingEngine *engine,
}
cairo_restore (cr);
gdk_rgba_free (color);
}
else
{