From: Ray Strode Date: Wed, 16 Sep 2009 19:08:59 +0000 (-0400) Subject: [label] Use pixel display instead of window X-Git-Tag: 0.8.0~188^2~29 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d60e817609a9d19befb025e1a38a09a8f9182887;p=thirdparty%2Fplymouth.git [label] Use pixel display instead of window --- diff --git a/src/libplybootsplash/ply-label-plugin.h b/src/libplybootsplash/ply-label-plugin.h index fbb65f6f..8db46263 100644 --- a/src/libplybootsplash/ply-label-plugin.h +++ b/src/libplybootsplash/ply-label-plugin.h @@ -27,7 +27,8 @@ #include #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, diff --git a/src/libplybootsplash/ply-label.c b/src/libplybootsplash/ply-label.c index 16a8b1fc..ef68081f 100644 --- a/src/libplybootsplash/ply-label.c +++ b/src/libplybootsplash/ply-label.c @@ -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 diff --git a/src/libplybootsplash/ply-label.h b/src/libplybootsplash/ply-label.h index c4673a2d..b342e17e 100644 --- a/src/libplybootsplash/ply-label.h +++ b/src/libplybootsplash/ply-label.h @@ -27,7 +27,8 @@ #include #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, diff --git a/src/plugins/controls/label/plugin.c b/src/plugins/controls/label/plugin.c index 24bdf945..54917b18 100644 --- a/src/plugins/controls/label/plugin.c +++ b/src/plugins/controls/label/plugin.c @@ -43,22 +43,18 @@ #include #include -#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