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