#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;
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
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;
}
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