]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
[label] Use pixel display instead of window
authorRay Strode <rstrode@redhat.com>
Wed, 16 Sep 2009 19:08:59 +0000 (15:08 -0400)
committerRay Strode <rstrode@redhat.com>
Mon, 28 Sep 2009 15:23:37 +0000 (11:23 -0400)
src/libplybootsplash/ply-label-plugin.h
src/libplybootsplash/ply-label.c
src/libplybootsplash/ply-label.h
src/plugins/controls/label/plugin.c

index fbb65f6fff3f7eee7cfbab390eac29d95ae15ee6..8db46263f13b2a6827775bda5516302fe350ad6d 100644 (file)
@@ -27,7 +27,8 @@
 #include <unistd.h>
 
 #include "ply-event-loop.h"
-#include "ply-window.h"
+#include "ply-pixel-buffer.h"
+#include "ply-pixel-display.h"
 
 typedef struct _ply_label_plugin ply_label_plugin_t;
 typedef struct _ply_label_plugin_control ply_label_plugin_control_t;
@@ -37,11 +38,16 @@ typedef struct
   ply_label_plugin_control_t * (* create_control) (void);
   void (* destroy_control) (ply_label_plugin_control_t        *label);
   bool (* show_control) (ply_label_plugin_control_t        *label,
-                         ply_window_t       *window,
-                         long                x,
-                         long                y);
+                         ply_pixel_display_t               *display,
+                         long                               x,
+                         long                               y);
   void (* hide_control) (ply_label_plugin_control_t        *label);
-  void (* draw_control) (ply_label_plugin_control_t        *label);
+  void (* draw_control) (ply_label_plugin_control_t        *label,
+                         ply_pixel_buffer_t                *pixel_buffer,
+                         long                               x,
+                         long                               y,
+                         unsigned long                      width,
+                         unsigned long                      height);
   bool (* is_control_hidden) (ply_label_plugin_control_t        *label);
 
   void (* set_text_for_control) (ply_label_plugin_control_t        *label,
index 16a8b1fc8e359a0afc416b6ad202594ed0dd3fac..ef68081fd77d9f02ba12d72294306176adb731a3 100644 (file)
@@ -136,10 +136,10 @@ ply_label_unload_plugin (ply_label_t *label)
 }
 
 bool
-ply_label_show (ply_label_t      *label,
-                ply_window_t     *window,
-                long              x,
-                long              y)
+ply_label_show (ply_label_t        *label,
+                ply_pixel_display_t *display,
+                long                x,
+                long                y)
 {
   if (label->plugin_interface == NULL)
     {
@@ -148,16 +148,30 @@ ply_label_show (ply_label_t      *label,
     }
 
   return label->plugin_interface->show_control (label->control,
-                                                window, x, y);
+                                                display, x, y);
 }
 
 void
 ply_label_draw (ply_label_t *label)
+{
+  if (label->plugin_interface == NULL)
+    return;
+}
+
+void
+ply_label_draw_area (ply_label_t        *label,
+                     ply_pixel_buffer_t *buffer,
+                     long                x,
+                     long                y,
+                     unsigned long       width,
+                     unsigned long       height)
 {
   if (label->plugin_interface == NULL)
     return;
 
-  label->plugin_interface->draw_control (label->control);
+  label->plugin_interface->draw_control (label->control,
+                                         buffer,
+                                         x, y, width, height);
 }
 
 void
index c4673a2d26ad7131c8d4ddc83ccc77b5c9bc6c9e..b342e17e2cc9e761cf18e10a8fb6496228117066 100644 (file)
@@ -27,7 +27,8 @@
 #include <unistd.h>
 
 #include "ply-event-loop.h"
-#include "ply-window.h"
+#include "ply-pixel-buffer.h"
+#include "ply-pixel-display.h"
 
 typedef struct _ply_label ply_label_t;
 
@@ -35,13 +36,19 @@ typedef struct _ply_label ply_label_t;
 ply_label_t *ply_label_new (void);
 void ply_label_free (ply_label_t *label);
 
-bool ply_label_show (ply_label_t      *label,
-                     ply_window_t     *window,
-                     long              x,
-                     long              y);
+bool ply_label_show (ply_label_t        *label,
+                     ply_pixel_display_t *display,
+                     long                x,
+                     long                y);
 
 void ply_label_hide (ply_label_t *label);
 void ply_label_draw (ply_label_t      *label);
+void ply_label_draw_area (ply_label_t        *label,
+                          ply_pixel_buffer_t *buffer,
+                          long                x,
+                          long                y,
+                          unsigned long       width,
+                          unsigned long       height);
 bool ply_label_is_hidden (ply_label_t *label);
 
 void ply_label_set_text (ply_label_t *label,
index 24bdf94599f5aee86282247d32bf2c335e7fbd35..54917b18ded9ae1a59cfa6e8bff2a47bbe083691 100644 (file)
 #include <cairo.h>
 #include <pango/pangocairo.h>
 
-#include "ply-frame-buffer.h"
+#include "ply-pixel-buffer.h"
+#include "ply-pixel-display.h"
 #include "ply-utils.h"
-#include "ply-window.h"
 
 #include "ply-label-plugin.h"
 
 struct _ply_label_plugin_control
 {
   ply_event_loop_t   *loop;
-  ply_window_t       *window;
-  ply_frame_buffer_t *frame_buffer;
-  ply_frame_buffer_area_t  area;
+  ply_pixel_display_t       *display;
+  ply_rectangle_t     area;
 
-  PangoLayout        *pango_layout;
-  cairo_t            *cairo_context;
-  cairo_surface_t    *cairo_surface;
   char               *text;
 
   uint32_t is_hidden : 1;
@@ -82,64 +78,135 @@ destroy_control (ply_label_plugin_control_t *label)
   if (label == NULL)
     return;
 
-  cairo_destroy (label->cairo_context);
-  cairo_surface_destroy (label->cairo_surface);
-  g_object_unref (label->pango_layout);
-
   free (label);
 }
 
 long
 get_width_of_control (ply_label_plugin_control_t *label)
 {
-  int width;
-
-  pango_layout_get_size (label->pango_layout, &width, NULL);
-
-  return (long) ((double) width / PANGO_SCALE)+1;
+  return label->area.width;
 }
 
 long
 get_height_of_control (ply_label_plugin_control_t *label)
 {
-  int height;
+  return label->area.height;
+}
 
-  pango_layout_get_size (label->pango_layout, NULL, &height);
+static cairo_t *
+get_cairo_context_for_pixel_buffer (ply_label_plugin_control_t *label,
+                                    ply_pixel_buffer_t         *pixel_buffer)
+{
+  cairo_surface_t *cairo_surface;
+  cairo_t         *cairo_context;
+  unsigned char   *data;
+  ply_rectangle_t  size;
+
+  data = (unsigned char *) ply_pixel_buffer_get_argb32_data (pixel_buffer);
+  ply_pixel_buffer_get_size (pixel_buffer, &size);
+
+  cairo_surface = cairo_image_surface_create_for_data (data,
+                                                       CAIRO_FORMAT_ARGB32,
+                                                       size.width,
+                                                       size.height,
+                                                       size.width * 4);
+  cairo_context = cairo_create (cairo_surface);
+  cairo_surface_destroy (cairo_surface);
+
+  return cairo_context;
+}
 
-  return (long) ((double) height / PANGO_SCALE)+1;
+static cairo_t *
+get_cairo_context_for_sizing (ply_label_plugin_control_t *label)
+{
+  cairo_surface_t *cairo_surface;
+  cairo_t         *cairo_context;
+
+  cairo_surface = cairo_image_surface_create_for_data (NULL, CAIRO_FORMAT_ARGB32, 0, 0, 0);
+  cairo_context = cairo_create (cairo_surface);
+  cairo_surface_destroy (cairo_surface);
+
+  return cairo_context;
 }
 
 static void
-erase_label_area (ply_label_plugin_control_t *label)
+size_control (ply_label_plugin_control_t *label)
 {
-  ply_window_erase_area (label->window,
-                         label->area.x, label->area.y,
-                         label->area.width, label->area.height);
+  cairo_t              *cairo_context;
+  PangoLayout          *pango_layout;
+  PangoFontDescription *description;
+  int                   text_width;
+  int                   text_height;
+
+  if (label->is_hidden)
+    return;
+
+  cairo_context = get_cairo_context_for_sizing (label);
+
+  pango_layout = pango_cairo_create_layout (cairo_context);
+
+  description = pango_font_description_from_string ("Sans 12");
+  pango_layout_set_font_description (pango_layout, description);
+  pango_font_description_free (description);
+
+  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;
+
+  g_object_unref (pango_layout);
+  cairo_destroy (cairo_context);
 }
 
 void
-draw_control (ply_label_plugin_control_t *label)
+draw_control (ply_label_plugin_control_t *label,
+              ply_pixel_buffer_t         *pixel_buffer,
+              long                        x,
+              long                        y,
+              unsigned long               width,
+              unsigned long               height)
 {
+  cairo_t              *cairo_context;
+  PangoLayout          *pango_layout;
+  PangoFontDescription *description;
+  int                   text_width;
+  int                   text_height;
 
   if (label->is_hidden)
     return;
 
-  ply_frame_buffer_pause_updates (label->frame_buffer);
-  erase_label_area (label);
-  cairo_move_to (label->cairo_context,
+  cairo_context = get_cairo_context_for_pixel_buffer (label, pixel_buffer);
+
+  pango_layout = pango_cairo_create_layout (cairo_context);
+
+  description = pango_font_description_from_string ("Sans 12");
+  pango_layout_set_font_description (pango_layout, description);
+  pango_font_description_free (description);
+
+  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;
+
+  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 (label->cairo_context, 0.0, 0.0, 0.0, 0.7);
-  pango_cairo_show_layout (label->cairo_context,
-                           label->pango_layout);
-  cairo_move_to (label->cairo_context,
+  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 (label->cairo_context, 1.0, 1.0, 1.0);
-  pango_cairo_show_layout (label->cairo_context,
-                           label->pango_layout);
-  cairo_surface_flush (label->cairo_surface);
-  ply_frame_buffer_unpause_updates (label->frame_buffer);
+  cairo_set_source_rgb (cairo_context, 1.0, 1.0, 1.0);
+  pango_cairo_show_layout (cairo_context,
+                           pango_layout);
+
+  g_object_unref (pango_layout);
+  cairo_destroy (cairo_context);
 }
 
 void
@@ -151,56 +218,21 @@ set_text_for_control (ply_label_plugin_control_t *label,
       free (label->text);
       label->text = strdup (text);
     }
-
-  if (label->pango_layout != NULL)
-    {
-      pango_layout_set_text (label->pango_layout, text, -1);
-      pango_cairo_update_layout (label->cairo_context, label->pango_layout);
-
-      label->area.width = get_width_of_control (label);
-      label->area.height = get_height_of_control (label);
-
-    }
 }
 
 bool
 show_control (ply_label_plugin_control_t *label,
-              ply_window_t               *window,
+              ply_pixel_display_t        *display,
               long                        x,
               long                        y)
 {
-  PangoFontDescription *description;
-  ply_frame_buffer_area_t size;
-  unsigned char *data;
-
-  label->window = window;
-  label->frame_buffer = ply_window_get_frame_buffer (window);
-  data = (unsigned char *) ply_frame_buffer_get_bytes (label->frame_buffer);
-
+  label->display = display;
   label->area.x = x;
   label->area.y = y;
 
-  ply_frame_buffer_get_size (label->frame_buffer, &size);
-
-  label->cairo_surface = cairo_image_surface_create_for_data (data,
-                                                              CAIRO_FORMAT_ARGB32,
-                                                              size.width,
-                                                              size.height,
-                                                              size.width * 4);
-
-  label->cairo_context = cairo_create (label->cairo_surface);
-  label->pango_layout = pango_cairo_create_layout (label->cairo_context);
-
-  if (label->text != NULL)
-    set_text_for_control (label, label->text);
-
-  description = pango_font_description_from_string ("Sans 12");
-  pango_layout_set_font_description (label->pango_layout, description);
-  pango_font_description_free (description);
-
   label->is_hidden = false;
 
-  draw_control (label);
+  size_control (label);
 
   return true;
 }
@@ -208,22 +240,13 @@ show_control (ply_label_plugin_control_t *label,
 void
 hide_control (ply_label_plugin_control_t *label)
 {
-  erase_label_area (label);
-
-  g_object_unref (label->pango_layout);
-  label->pango_layout = NULL;
-
-  cairo_destroy (label->cairo_context);
-  label->cairo_context = NULL;
-
-  cairo_surface_destroy (label->cairo_surface);
-  label->cairo_surface = NULL;
+  label->is_hidden = true;
+  ply_pixel_display_draw_area (label->display,
+                               label->area.x, label->area.y,
+                               label->area.width, label->area.height);
 
-  label->frame_buffer = NULL;
-  label->window = NULL;
+  label->display = NULL;
   label->loop = NULL;
-
-  label->is_hidden = true;
 }
 
 bool