]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
[label] Add color control
authorCharlie Brej <cbrej@cs.man.ac.uk>
Sun, 29 Nov 2009 02:35:10 +0000 (02:35 +0000)
committerCharlie Brej <cbrej@cs.man.ac.uk>
Sun, 29 Nov 2009 02:35:10 +0000 (02:35 +0000)
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.

src/libplybootsplash/ply-label-plugin.h
src/libplybootsplash/ply-label.c
src/libplybootsplash/ply-label.h
src/plugins/controls/label/plugin.c

index 8db46263f13b2a6827775bda5516302fe350ad6d..bd3bae95edb8e756c179091dd334a6355e7369ac 100644 (file)
@@ -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);
index ef68081fd77d9f02ba12d72294306176adb731a3..b00874c9d82e24d903e4f721fc8f2864d677d081 100644 (file)
@@ -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)
 {
index b342e17e2cc9e761cf18e10a8fb6496228117066..bca9b7bf7a3835ce748f1ce1cd85ab50f0e13523 100644 (file)
@@ -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);
index 4e053fd1980b9af07fd7f5018c98b0850585ca5f..5be9a71f0d073bf2a271ad6935107836f29ebf2a 100644 (file)
@@ -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
     };