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.
This commit is contained in:
Dorota Czaplejewicz
2019-10-25 15:55:25 +00:00
parent 01fe433612
commit 8f7f6c05c0
2 changed files with 32 additions and 36 deletions

View File

@ -69,7 +69,7 @@ static void eek_renderer_real_render_button_label (EekRenderer *self,
static void invalidate (EekRenderer *renderer);
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);
struct _CreateKeyboardSurfaceCallbackData {
@ -100,7 +100,7 @@ create_keyboard_surface_button_callback (struct squeek_button *button,
.row = data->row,
.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);
}
@ -131,7 +131,7 @@ render_keyboard_surface (EekRenderer *renderer, struct squeek_view *view)
EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
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));
@ -194,15 +194,17 @@ render_outline (cairo_t *cr,
}
static void render_button_in_context(EekRenderer *self,
gdouble scale,
gint scale_factor,
cairo_t *cr,
GtkStyleContext *ctx,
EekBounds view_bounds,
struct button_place *place,
gboolean active) {
cairo_surface_t *outline_surface = NULL;
PangoLayout *layout;
PangoRectangle extents = { 0, };
EekColor foreground;
EekRendererPrivate *priv = eek_renderer_get_instance_private (self);
/* render outline */
EekBounds bounds = squeek_button_get_bounds(place->button);
@ -223,7 +225,7 @@ static void render_button_in_context(EekRenderer *self,
cairo_paint (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);
cairo_restore (cr);
@ -233,23 +235,22 @@ static void render_button_in_context(EekRenderer *self,
cairo_surface_destroy(outline_surface);
cairo_paint (cr);
eek_renderer_get_foreground_color (self, ctx, &foreground);
eek_renderer_get_foreground_color (ctx, &foreground);
/* render icon (if any) */
const char *icon_name = squeek_button_get_icon_name(place->button);
if (icon_name) {
gint scale = priv->scale_factor;
cairo_surface_t *icon_surface =
eek_renderer_get_icon_surface (icon_name, 16 / priv->scale,
scale);
eek_renderer_get_icon_surface (icon_name, (gint)(16 / scale),
scale_factor);
if (icon_surface) {
gint width = cairo_image_surface_get_width (icon_surface);
gint height = cairo_image_surface_get_height (icon_surface);
cairo_save (cr);
cairo_translate (cr,
(bounds.width - (double)width / scale) / 2,
(bounds.height - (double)height / scale) / 2);
(bounds.width - (double)width / scale_factor) / 2,
(bounds.height - (double)height / scale_factor) / 2);
cairo_rectangle (cr, 0, 0, width, height);
cairo_clip (cr);
/* Draw the shape of the icon using the foreground color */
@ -288,6 +289,7 @@ static void render_button_in_context(EekRenderer *self,
static void
render_button (EekRenderer *self,
cairo_t *cr,
EekBounds view_bounds,
struct button_place *place,
gboolean pressed,
gboolean locked)
@ -314,7 +316,7 @@ render_button (EekRenderer *self,
}
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
gtk_style_context_set_state(ctx, GTK_STATE_FLAG_NORMAL);
@ -340,8 +342,8 @@ render_button (EekRenderer *self,
* normal keys for popups.
*/
void
eek_renderer_apply_transformation_for_button (EekRenderer *self,
cairo_t *cr,
eek_renderer_apply_transformation_for_button (cairo_t *cr,
EekBounds view_bounds,
struct button_place *place,
gdouble scale,
gboolean rotate)
@ -349,8 +351,8 @@ eek_renderer_apply_transformation_for_button (EekRenderer *self,
EekBounds bounds, rotated_bounds;
gdouble s;
eek_renderer_get_button_bounds (self, place, &bounds, FALSE);
eek_renderer_get_button_bounds (self, place, &rotated_bounds, TRUE);
eek_renderer_get_button_bounds (view_bounds, place, &bounds, FALSE);
eek_renderer_get_button_bounds (view_bounds, place, &rotated_bounds, TRUE);
gint angle = squeek_row_get_angle (place->row);
@ -379,7 +381,6 @@ eek_renderer_real_render_button_label (EekRenderer *self,
}
PangoFontDescription *font;
PangoLayoutLine *line;
gdouble scale;
@ -411,9 +412,10 @@ eek_renderer_real_render_button_label (EekRenderer *self,
pango_font_description_free (font);
pango_layout_set_text (layout, label, -1);
line = pango_layout_get_line (layout, 0);
if (line->resolved_dir == PANGO_DIRECTION_RTL)
PangoLayoutLine *line = pango_layout_get_line_readonly(layout, 0);
if (line->resolved_dir == PANGO_DIRECTION_RTL) {
pango_layout_set_alignment (layout, PANGO_ALIGN_RIGHT);
}
pango_layout_set_width (layout,
PANGO_SCALE * bounds.width * scale);
}
@ -439,7 +441,8 @@ eek_renderer_real_render_button (EekRenderer *self,
EekRendererPrivate *priv = eek_renderer_get_instance_private (self);
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);
/* Because this function is called separately from the keyboard rendering
@ -448,10 +451,10 @@ eek_renderer_real_render_button (EekRenderer *self,
cairo_scale (cr, priv->scale, priv->scale);
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);
render_button (
self, cr, place,
self, cr, view_bounds, place,
squeek_key_is_pressed(key) != 0,
squeek_key_is_locked (key) != 0
);
@ -750,7 +753,7 @@ eek_renderer_get_size (EekRenderer *renderer,
}
void
eek_renderer_get_button_bounds (EekRenderer *renderer,
eek_renderer_get_button_bounds (EekBounds view_bounds,
struct button_place *place,
EekBounds *bounds,
gboolean rotate)
@ -758,15 +761,11 @@ eek_renderer_get_button_bounds (EekRenderer *renderer,
gint angle = 0;
EekPoint points[4], min, max;
g_return_if_fail (EEK_IS_RENDERER(renderer));
g_return_if_fail (place);
g_return_if_fail (bounds != NULL);
EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
EekBounds button_bounds = squeek_button_get_bounds(place->button);
EekBounds row_bounds = squeek_row_get_bounds (place->row);
EekBounds view_bounds = squeek_view_get_bounds (level_keyboard_current(priv->keyboard));
if (!rotate) {
button_bounds.x += view_bounds.x + row_bounds.x;
@ -856,7 +855,6 @@ eek_renderer_get_icon_surface (const gchar *icon_name,
g_error_free (error);
return NULL;
}
return surface;
}
@ -884,11 +882,9 @@ eek_renderer_render_keyboard (EekRenderer *renderer,
}
void
eek_renderer_get_foreground_color (EekRenderer *renderer,
GtkStyleContext *context,
eek_renderer_get_foreground_color (GtkStyleContext *context,
EekColor *color)
{
g_return_if_fail (EEK_IS_RENDERER(renderer));
g_return_if_fail (color);
GtkStateFlags flags = GTK_STATE_FLAG_NORMAL;

View File

@ -65,7 +65,7 @@ void eek_renderer_set_allocation_size
void eek_renderer_get_size (EekRenderer *renderer,
gdouble *width,
gdouble *height);
void eek_renderer_get_button_bounds (EekRenderer *renderer,
void eek_renderer_get_button_bounds (EekBounds view_bounds,
struct button_place *button,
EekBounds *bounds,
gboolean rotate);
@ -96,14 +96,14 @@ void eek_renderer_set_default_background_color
(EekRenderer *renderer,
const EekColor *color);
void eek_renderer_get_foreground_color
(EekRenderer *renderer,
GtkStyleContext *context,
(GtkStyleContext *context,
EekColor *color);
void eek_renderer_set_border_width (EekRenderer *renderer,
gdouble border_width);
void eek_renderer_apply_transformation_for_button
(EekRenderer *renderer,
cairo_t *cr, struct button_place *place,
(cairo_t *cr,
EekBounds view_bounds,
struct button_place *place,
gdouble scale,
gboolean rotate);