Skip to content
Snippets Groups Projects
Commit 8f7f6c05 authored by Dorota Czaplejewicz's avatar Dorota Czaplejewicz
Browse files

renderer: Remove dependencies on renderer in button rendering functions

The rendering functions become more pure, which, once reached, will allow for better tracking of what they do and easier modularization.
parent 01fe4336
No related branches found
No related tags found
No related merge requests found
...@@ -69,7 +69,7 @@ static void eek_renderer_real_render_button_label (EekRenderer *self, ...@@ -69,7 +69,7 @@ static void eek_renderer_real_render_button_label (EekRenderer *self,
static void invalidate (EekRenderer *renderer); static void invalidate (EekRenderer *renderer);
static void render_button (EekRenderer *self, static void render_button (EekRenderer *self,
cairo_t *cr, struct button_place *place, cairo_t *cr, EekBounds view_bounds, struct button_place *place,
gboolean pressed, gboolean locked); gboolean pressed, gboolean locked);
struct _CreateKeyboardSurfaceCallbackData { struct _CreateKeyboardSurfaceCallbackData {
...@@ -100,7 +100,7 @@ create_keyboard_surface_button_callback (struct squeek_button *button, ...@@ -100,7 +100,7 @@ create_keyboard_surface_button_callback (struct squeek_button *button,
.row = data->row, .row = data->row,
.button = button, .button = button,
}; };
render_button (data->renderer, data->cr, &place, FALSE, FALSE); render_button (data->renderer, data->cr, squeek_view_get_bounds(data->view), &place, FALSE, FALSE);
cairo_restore (data->cr); cairo_restore (data->cr);
} }
...@@ -131,7 +131,7 @@ render_keyboard_surface (EekRenderer *renderer, struct squeek_view *view) ...@@ -131,7 +131,7 @@ render_keyboard_surface (EekRenderer *renderer, struct squeek_view *view)
EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer); EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
EekColor foreground; EekColor foreground;
eek_renderer_get_foreground_color (renderer, priv->layout_context, &foreground); eek_renderer_get_foreground_color (priv->layout_context, &foreground);
EekBounds bounds = squeek_view_get_bounds (level_keyboard_current(priv->keyboard)); EekBounds bounds = squeek_view_get_bounds (level_keyboard_current(priv->keyboard));
...@@ -194,15 +194,17 @@ render_outline (cairo_t *cr, ...@@ -194,15 +194,17 @@ render_outline (cairo_t *cr,
} }
static void render_button_in_context(EekRenderer *self, static void render_button_in_context(EekRenderer *self,
gdouble scale,
gint scale_factor,
cairo_t *cr, cairo_t *cr,
GtkStyleContext *ctx, GtkStyleContext *ctx,
EekBounds view_bounds,
struct button_place *place, struct button_place *place,
gboolean active) { gboolean active) {
cairo_surface_t *outline_surface = NULL; cairo_surface_t *outline_surface = NULL;
PangoLayout *layout; PangoLayout *layout;
PangoRectangle extents = { 0, }; PangoRectangle extents = { 0, };
EekColor foreground; EekColor foreground;
EekRendererPrivate *priv = eek_renderer_get_instance_private (self);
/* render outline */ /* render outline */
EekBounds bounds = squeek_button_get_bounds(place->button); EekBounds bounds = squeek_button_get_bounds(place->button);
...@@ -223,7 +225,7 @@ static void render_button_in_context(EekRenderer *self, ...@@ -223,7 +225,7 @@ static void render_button_in_context(EekRenderer *self,
cairo_paint (cr); cairo_paint (cr);
cairo_save (cr); cairo_save (cr);
eek_renderer_apply_transformation_for_button (self, cr, place, 1.0, FALSE); eek_renderer_apply_transformation_for_button (cr, view_bounds, place, 1.0, FALSE);
render_outline (cr, ctx, bounds); render_outline (cr, ctx, bounds);
cairo_restore (cr); cairo_restore (cr);
...@@ -233,23 +235,22 @@ static void render_button_in_context(EekRenderer *self, ...@@ -233,23 +235,22 @@ static void render_button_in_context(EekRenderer *self,
cairo_surface_destroy(outline_surface); cairo_surface_destroy(outline_surface);
cairo_paint (cr); cairo_paint (cr);
eek_renderer_get_foreground_color (self, ctx, &foreground); eek_renderer_get_foreground_color (ctx, &foreground);
/* render icon (if any) */ /* render icon (if any) */
const char *icon_name = squeek_button_get_icon_name(place->button); const char *icon_name = squeek_button_get_icon_name(place->button);
if (icon_name) { if (icon_name) {
gint scale = priv->scale_factor;
cairo_surface_t *icon_surface = cairo_surface_t *icon_surface =
eek_renderer_get_icon_surface (icon_name, 16 / priv->scale, eek_renderer_get_icon_surface (icon_name, (gint)(16 / scale),
scale); scale_factor);
if (icon_surface) { if (icon_surface) {
gint width = cairo_image_surface_get_width (icon_surface); gint width = cairo_image_surface_get_width (icon_surface);
gint height = cairo_image_surface_get_height (icon_surface); gint height = cairo_image_surface_get_height (icon_surface);
cairo_save (cr); cairo_save (cr);
cairo_translate (cr, cairo_translate (cr,
(bounds.width - (double)width / scale) / 2, (bounds.width - (double)width / scale_factor) / 2,
(bounds.height - (double)height / scale) / 2); (bounds.height - (double)height / scale_factor) / 2);
cairo_rectangle (cr, 0, 0, width, height); cairo_rectangle (cr, 0, 0, width, height);
cairo_clip (cr); cairo_clip (cr);
/* Draw the shape of the icon using the foreground color */ /* Draw the shape of the icon using the foreground color */
...@@ -288,6 +289,7 @@ static void render_button_in_context(EekRenderer *self, ...@@ -288,6 +289,7 @@ static void render_button_in_context(EekRenderer *self,
static void static void
render_button (EekRenderer *self, render_button (EekRenderer *self,
cairo_t *cr, cairo_t *cr,
EekBounds view_bounds,
struct button_place *place, struct button_place *place,
gboolean pressed, gboolean pressed,
gboolean locked) gboolean locked)
...@@ -314,7 +316,7 @@ render_button (EekRenderer *self, ...@@ -314,7 +316,7 @@ render_button (EekRenderer *self,
} }
gtk_style_context_add_class(ctx, outline_name); gtk_style_context_add_class(ctx, outline_name);
render_button_in_context(self, cr, ctx, place, pressed); render_button_in_context(self, priv->scale, priv->scale_factor, cr, ctx, view_bounds, place, pressed);
// Save and restore functions don't work if gtk_render_* was used in between // Save and restore functions don't work if gtk_render_* was used in between
gtk_style_context_set_state(ctx, GTK_STATE_FLAG_NORMAL); gtk_style_context_set_state(ctx, GTK_STATE_FLAG_NORMAL);
...@@ -340,8 +342,8 @@ render_button (EekRenderer *self, ...@@ -340,8 +342,8 @@ render_button (EekRenderer *self,
* normal keys for popups. * normal keys for popups.
*/ */
void void
eek_renderer_apply_transformation_for_button (EekRenderer *self, eek_renderer_apply_transformation_for_button (cairo_t *cr,
cairo_t *cr, EekBounds view_bounds,
struct button_place *place, struct button_place *place,
gdouble scale, gdouble scale,
gboolean rotate) gboolean rotate)
...@@ -349,8 +351,8 @@ eek_renderer_apply_transformation_for_button (EekRenderer *self, ...@@ -349,8 +351,8 @@ eek_renderer_apply_transformation_for_button (EekRenderer *self,
EekBounds bounds, rotated_bounds; EekBounds bounds, rotated_bounds;
gdouble s; gdouble s;
eek_renderer_get_button_bounds (self, place, &bounds, FALSE); eek_renderer_get_button_bounds (view_bounds, place, &bounds, FALSE);
eek_renderer_get_button_bounds (self, place, &rotated_bounds, TRUE); eek_renderer_get_button_bounds (view_bounds, place, &rotated_bounds, TRUE);
gint angle = squeek_row_get_angle (place->row); gint angle = squeek_row_get_angle (place->row);
...@@ -379,7 +381,6 @@ eek_renderer_real_render_button_label (EekRenderer *self, ...@@ -379,7 +381,6 @@ eek_renderer_real_render_button_label (EekRenderer *self,
} }
PangoFontDescription *font; PangoFontDescription *font;
PangoLayoutLine *line;
gdouble scale; gdouble scale;
...@@ -411,9 +412,10 @@ eek_renderer_real_render_button_label (EekRenderer *self, ...@@ -411,9 +412,10 @@ eek_renderer_real_render_button_label (EekRenderer *self,
pango_font_description_free (font); pango_font_description_free (font);
pango_layout_set_text (layout, label, -1); pango_layout_set_text (layout, label, -1);
line = pango_layout_get_line (layout, 0); PangoLayoutLine *line = pango_layout_get_line_readonly(layout, 0);
if (line->resolved_dir == PANGO_DIRECTION_RTL) if (line->resolved_dir == PANGO_DIRECTION_RTL) {
pango_layout_set_alignment (layout, PANGO_ALIGN_RIGHT); pango_layout_set_alignment (layout, PANGO_ALIGN_RIGHT);
}
pango_layout_set_width (layout, pango_layout_set_width (layout,
PANGO_SCALE * bounds.width * scale); PANGO_SCALE * bounds.width * scale);
} }
...@@ -439,7 +441,8 @@ eek_renderer_real_render_button (EekRenderer *self, ...@@ -439,7 +441,8 @@ eek_renderer_real_render_button (EekRenderer *self,
EekRendererPrivate *priv = eek_renderer_get_instance_private (self); EekRendererPrivate *priv = eek_renderer_get_instance_private (self);
EekBounds bounds; EekBounds bounds;
eek_renderer_get_button_bounds (self, place, &bounds, rotate); EekBounds view_bounds = squeek_view_get_bounds (level_keyboard_current(priv->keyboard));
eek_renderer_get_button_bounds (view_bounds, place, &bounds, rotate);
cairo_save (cr); cairo_save (cr);
/* Because this function is called separately from the keyboard rendering /* Because this function is called separately from the keyboard rendering
...@@ -448,10 +451,10 @@ eek_renderer_real_render_button (EekRenderer *self, ...@@ -448,10 +451,10 @@ eek_renderer_real_render_button (EekRenderer *self,
cairo_scale (cr, priv->scale, priv->scale); cairo_scale (cr, priv->scale, priv->scale);
cairo_translate (cr, bounds.x, bounds.y); cairo_translate (cr, bounds.x, bounds.y);
eek_renderer_apply_transformation_for_button (self, cr, place, scale, rotate); eek_renderer_apply_transformation_for_button (cr, view_bounds, place, scale, rotate);
struct squeek_key *key = squeek_button_get_key(place->button); struct squeek_key *key = squeek_button_get_key(place->button);
render_button ( render_button (
self, cr, place, self, cr, view_bounds, place,
squeek_key_is_pressed(key) != 0, squeek_key_is_pressed(key) != 0,
squeek_key_is_locked (key) != 0 squeek_key_is_locked (key) != 0
); );
...@@ -750,7 +753,7 @@ eek_renderer_get_size (EekRenderer *renderer, ...@@ -750,7 +753,7 @@ eek_renderer_get_size (EekRenderer *renderer,
} }
void void
eek_renderer_get_button_bounds (EekRenderer *renderer, eek_renderer_get_button_bounds (EekBounds view_bounds,
struct button_place *place, struct button_place *place,
EekBounds *bounds, EekBounds *bounds,
gboolean rotate) gboolean rotate)
...@@ -758,15 +761,11 @@ eek_renderer_get_button_bounds (EekRenderer *renderer, ...@@ -758,15 +761,11 @@ eek_renderer_get_button_bounds (EekRenderer *renderer,
gint angle = 0; gint angle = 0;
EekPoint points[4], min, max; EekPoint points[4], min, max;
g_return_if_fail (EEK_IS_RENDERER(renderer));
g_return_if_fail (place); g_return_if_fail (place);
g_return_if_fail (bounds != NULL); g_return_if_fail (bounds != NULL);
EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
EekBounds button_bounds = squeek_button_get_bounds(place->button); EekBounds button_bounds = squeek_button_get_bounds(place->button);
EekBounds row_bounds = squeek_row_get_bounds (place->row); EekBounds row_bounds = squeek_row_get_bounds (place->row);
EekBounds view_bounds = squeek_view_get_bounds (level_keyboard_current(priv->keyboard));
if (!rotate) { if (!rotate) {
button_bounds.x += view_bounds.x + row_bounds.x; button_bounds.x += view_bounds.x + row_bounds.x;
...@@ -856,7 +855,6 @@ eek_renderer_get_icon_surface (const gchar *icon_name, ...@@ -856,7 +855,6 @@ eek_renderer_get_icon_surface (const gchar *icon_name,
g_error_free (error); g_error_free (error);
return NULL; return NULL;
} }
return surface; return surface;
} }
...@@ -884,11 +882,9 @@ eek_renderer_render_keyboard (EekRenderer *renderer, ...@@ -884,11 +882,9 @@ eek_renderer_render_keyboard (EekRenderer *renderer,
} }
void void
eek_renderer_get_foreground_color (EekRenderer *renderer, eek_renderer_get_foreground_color (GtkStyleContext *context,
GtkStyleContext *context,
EekColor *color) EekColor *color)
{ {
g_return_if_fail (EEK_IS_RENDERER(renderer));
g_return_if_fail (color); g_return_if_fail (color);
GtkStateFlags flags = GTK_STATE_FLAG_NORMAL; GtkStateFlags flags = GTK_STATE_FLAG_NORMAL;
......
...@@ -65,7 +65,7 @@ void eek_renderer_set_allocation_size ...@@ -65,7 +65,7 @@ void eek_renderer_set_allocation_size
void eek_renderer_get_size (EekRenderer *renderer, void eek_renderer_get_size (EekRenderer *renderer,
gdouble *width, gdouble *width,
gdouble *height); gdouble *height);
void eek_renderer_get_button_bounds (EekRenderer *renderer, void eek_renderer_get_button_bounds (EekBounds view_bounds,
struct button_place *button, struct button_place *button,
EekBounds *bounds, EekBounds *bounds,
gboolean rotate); gboolean rotate);
...@@ -96,14 +96,14 @@ void eek_renderer_set_default_background_color ...@@ -96,14 +96,14 @@ void eek_renderer_set_default_background_color
(EekRenderer *renderer, (EekRenderer *renderer,
const EekColor *color); const EekColor *color);
void eek_renderer_get_foreground_color void eek_renderer_get_foreground_color
(EekRenderer *renderer, (GtkStyleContext *context,
GtkStyleContext *context,
EekColor *color); EekColor *color);
void eek_renderer_set_border_width (EekRenderer *renderer, void eek_renderer_set_border_width (EekRenderer *renderer,
gdouble border_width); gdouble border_width);
void eek_renderer_apply_transformation_for_button void eek_renderer_apply_transformation_for_button
(EekRenderer *renderer, (cairo_t *cr,
cairo_t *cr, struct button_place *place, EekBounds view_bounds,
struct button_place *place,
gdouble scale, gdouble scale,
gboolean rotate); gboolean rotate);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment