From: Charlie Brej Date: Sun, 29 Nov 2009 02:35:10 +0000 (+0000) Subject: [label] Add color control X-Git-Tag: 0.8.0~93 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1c6adf70daa04c05fd1198c25f0c67508e31183b;p=thirdparty%2Fplymouth.git [label] Add color control Previously we drew two overlapping labels, one in black and one in white, to make sure it was vsible on all backgrounds. Now we can pick an appropreate color for each theme. The default is white. If changing the label color once it has been shown, it will redraw that part of the screen. --- diff --git a/src/libplybootsplash/ply-label-plugin.h b/src/libplybootsplash/ply-label-plugin.h index 8db46263..bd3bae95 100644 --- a/src/libplybootsplash/ply-label-plugin.h +++ b/src/libplybootsplash/ply-label-plugin.h @@ -50,8 +50,13 @@ typedef struct unsigned long height); bool (* is_control_hidden) (ply_label_plugin_control_t *label); - void (* set_text_for_control) (ply_label_plugin_control_t *label, - const char *text); + void (* set_text_for_control) (ply_label_plugin_control_t *label, + const char *text); + void (* set_color_for_control) (ply_label_plugin_control_t *label, + float red, + float green, + float blue, + float alpha); long (* get_width_of_control) (ply_label_plugin_control_t *label); long (* get_height_of_control) (ply_label_plugin_control_t *label); diff --git a/src/libplybootsplash/ply-label.c b/src/libplybootsplash/ply-label.c index ef68081f..b00874c9 100644 --- a/src/libplybootsplash/ply-label.c +++ b/src/libplybootsplash/ply-label.c @@ -46,6 +46,10 @@ struct _ply_label ply_label_plugin_control_t *control; char *text; + float red; + float green; + float blue; + float alpha; }; typedef const ply_label_plugin_interface_t * @@ -59,6 +63,10 @@ ply_label_new (void) ply_label_t *label; label = calloc (1, sizeof (struct _ply_label)); + label->red = 1; + label->green = 1; + label->blue = 1; + label->alpha = 1; return label; } @@ -120,6 +128,11 @@ ply_label_load_plugin (ply_label_t *label) label->plugin_interface->set_text_for_control (label->control, label->text); + label->plugin_interface->set_color_for_control (label->control, + label->red, + label->green, + label->blue, + label->alpha); return true; } @@ -207,6 +220,28 @@ ply_label_set_text (ply_label_t *label, text); } +void +ply_label_set_color (ply_label_t *label, + float red, + float green, + float blue, + float alpha) +{ + label->red = red; + label->green = green; + label->blue = blue; + label->alpha = alpha; + + if (label->plugin_interface == NULL) + return; + + label->plugin_interface->set_color_for_control (label->control, + red, + green, + blue, + alpha); +} + long ply_label_get_width (ply_label_t *label) { diff --git a/src/libplybootsplash/ply-label.h b/src/libplybootsplash/ply-label.h index b342e17e..bca9b7bf 100644 --- a/src/libplybootsplash/ply-label.h +++ b/src/libplybootsplash/ply-label.h @@ -53,6 +53,11 @@ bool ply_label_is_hidden (ply_label_t *label); void ply_label_set_text (ply_label_t *label, const char *text); +void ply_label_set_color (ply_label_t *label, + float red, + float green, + float blue, + float alpha); long ply_label_get_width (ply_label_t *label); long ply_label_get_height (ply_label_t *label); diff --git a/src/plugins/controls/label/plugin.c b/src/plugins/controls/label/plugin.c index 4e053fd1..5be9a71f 100644 --- a/src/plugins/controls/label/plugin.c +++ b/src/plugins/controls/label/plugin.c @@ -56,6 +56,10 @@ struct _ply_label_plugin_control ply_rectangle_t area; char *text; + float red; + float green; + float blue; + float alpha; uint32_t is_hidden : 1; }; @@ -152,8 +156,8 @@ size_control (ply_label_plugin_control_t *label) pango_layout_set_text (pango_layout, label->text, -1); pango_cairo_update_layout (cairo_context, pango_layout); pango_layout_get_size (pango_layout, &text_width, &text_height); - label->area.width = (long) ((double) text_width / PANGO_SCALE) + 1; - label->area.height = (long) ((double) text_height / PANGO_SCALE) + 1; + label->area.width = (long) ((double) text_width / PANGO_SCALE); + label->area.height = (long) ((double) text_height / PANGO_SCALE); g_object_unref (pango_layout); cairo_destroy (cairo_context); @@ -187,21 +191,19 @@ draw_control (ply_label_plugin_control_t *label, pango_layout_set_text (pango_layout, label->text, -1); pango_cairo_update_layout (cairo_context, pango_layout); pango_layout_get_size (pango_layout, &text_width, &text_height); - label->area.width = (long) ((double) text_width / PANGO_SCALE) + 1; - label->area.height = (long) ((double) text_height / PANGO_SCALE) + 1; + label->area.width = (long) ((double) text_width / PANGO_SCALE); + label->area.height = (long) ((double) text_height / PANGO_SCALE); cairo_rectangle (cairo_context, x, y, width, height); cairo_clip (cairo_context); - cairo_move_to (cairo_context, - label->area.x + 1, - label->area.y + 1); - cairo_set_source_rgba (cairo_context, 0.0, 0.0, 0.0, 0.7); - pango_cairo_show_layout (cairo_context, - pango_layout); cairo_move_to (cairo_context, label->area.x, label->area.y); - cairo_set_source_rgb (cairo_context, 1.0, 1.0, 1.0); + cairo_set_source_rgba (cairo_context, + label->red, + label->green, + label->blue, + label->alpha); pango_cairo_show_layout (cairo_context, pango_layout); @@ -229,6 +231,24 @@ set_text_for_control (ply_label_plugin_control_t *label, } } +void +set_color_for_control (ply_label_plugin_control_t *label, + float red, + float green, + float blue, + float alpha) +{ + label->red = red; + label->green = green; + label->blue = blue; + label->alpha = alpha; + + if (!label->is_hidden && label->display != NULL) + ply_pixel_display_draw_area (label->display, + label->area.x, label->area.y, + label->area.width, label->area.height); +} + bool show_control (ply_label_plugin_control_t *label, ply_pixel_display_t *display, @@ -287,6 +307,7 @@ ply_label_plugin_get_interface (void) .draw_control = draw_control, .is_control_hidden = is_control_hidden, .set_text_for_control = set_text_for_control, + .set_color_for_control = set_color_for_control, .get_width_of_control = get_width_of_control, .get_height_of_control = get_height_of_control };