libeek: reuse key texture when resizing EekGtkKeyboard

This commit is contained in:
Daiki Ueno
2010-06-18 23:28:34 +09:00
parent 5b51134643
commit c08befda74

View File

@ -50,10 +50,10 @@ struct _EekGtkKeyboardPrivate
GdkPixmap *pixmap; GdkPixmap *pixmap;
/* mapping from outline pointer to pixmap */ /* mapping from outline pointer to pixmap */
GHashTable *outline_pixmaps; GHashTable *outline_textures;
/* mapping from outline pointer to large pixmap */ /* mapping from outline pointer to large pixmap */
GHashTable *outline_large_pixmaps; GHashTable *large_outline_textures;
PangoFontDescription *fonts[EEK_KEYSYM_CATEGORY_LAST]; PangoFontDescription *fonts[EEK_KEYSYM_CATEGORY_LAST];
@ -109,8 +109,8 @@ eek_gtk_keyboard_finalize (GObject *object)
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(object); EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(object);
gint i; gint i;
g_hash_table_unref (priv->outline_pixmaps); g_hash_table_unref (priv->outline_textures);
g_hash_table_unref (priv->outline_large_pixmaps); g_hash_table_unref (priv->large_outline_textures);
for (i = 0; i < EEK_KEYSYM_CATEGORY_LAST; i++) for (i = 0; i < EEK_KEYSYM_CATEGORY_LAST; i++)
pango_font_description_free (priv->fonts[i]); pango_font_description_free (priv->fonts[i]);
@ -138,12 +138,12 @@ eek_gtk_keyboard_init (EekGtkKeyboard *self)
priv = self->priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self); priv = self->priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
priv->widget = NULL; priv->widget = NULL;
priv->pixmap = NULL; priv->pixmap = NULL;
priv->outline_pixmaps = priv->outline_textures =
g_hash_table_new_full (g_direct_hash, g_hash_table_new_full (g_direct_hash,
g_direct_equal, g_direct_equal,
NULL, NULL,
g_object_unref); g_object_unref);
priv->outline_large_pixmaps = priv->large_outline_textures =
g_hash_table_new_full (g_direct_hash, g_hash_table_new_full (g_direct_hash,
g_direct_equal, g_direct_equal,
NULL, NULL,
@ -181,31 +181,31 @@ prepare_keyboard_pixmap_key_callback (EekElement *element,
EekKey *key = EEK_KEY(element); EekKey *key = EEK_KEY(element);
EekBounds bounds; EekBounds bounds;
EekOutline *outline; EekOutline *outline;
GdkPixmap *pixmap; GdkPixmap *texture;
eek_element_get_bounds (element, &bounds); eek_element_get_bounds (element, &bounds);
outline = eek_key_get_outline (key); outline = eek_key_get_outline (key);
pixmap = g_hash_table_lookup (priv->outline_pixmaps, outline); texture = g_hash_table_lookup (priv->outline_textures, outline);
if (!pixmap) { if (!texture) {
cairo_t *cr; cairo_t *cr;
pixmap = texture =
gdk_pixmap_new (gtk_widget_get_window (GTK_WIDGET (priv->widget)), gdk_pixmap_new (gtk_widget_get_window (GTK_WIDGET (priv->widget)),
bounds.width, bounds.height, -1); bounds.width, bounds.height, -1);
cr = gdk_cairo_create (GDK_DRAWABLE (pixmap)); cr = gdk_cairo_create (GDK_DRAWABLE (texture));
gdk_cairo_set_source_color (cr, context->bg); gdk_cairo_set_source_color (cr, context->bg);
cairo_rectangle (cr, 0, 0, bounds.width, bounds.height); cairo_rectangle (cr, 0, 0, bounds.width, bounds.height);
gdk_cairo_set_source_color (cr, context->fg); gdk_cairo_set_source_color (cr, context->fg);
eek_draw_outline (cr, outline); eek_draw_outline (cr, outline);
cairo_destroy (cr); cairo_destroy (cr);
g_hash_table_insert (priv->outline_pixmaps, outline, pixmap); g_hash_table_insert (priv->outline_textures, outline, texture);
} }
cairo_save (context->cr); cairo_save (context->cr);
cairo_translate (context->cr, bounds.x, bounds.y); cairo_translate (context->cr, bounds.x, bounds.y);
gdk_cairo_set_source_pixmap (context->cr, pixmap, 0, 0); gdk_cairo_set_source_pixmap (context->cr, texture, 0, 0);
cairo_rectangle (context->cr, 0, 0, bounds.width, bounds.height); cairo_rectangle (context->cr, 0, 0, bounds.width, bounds.height);
cairo_fill (context->cr); cairo_fill (context->cr);
@ -331,7 +331,7 @@ key_enlarge (EekGtkKeyboard *keyboard, EekKey *key)
eek_element_get_absolute_position (EEK_ELEMENT(key), &ax, &ay); eek_element_get_absolute_position (EEK_ELEMENT(key), &ax, &ay);
outline = eek_key_get_outline (key); outline = eek_key_get_outline (key);
texture = g_hash_table_lookup (priv->outline_large_pixmaps, outline); texture = g_hash_table_lookup (priv->large_outline_textures, outline);
if (!texture) { if (!texture) {
texture = texture =
gdk_pixmap_new (gtk_widget_get_window (GTK_WIDGET (priv->widget)), gdk_pixmap_new (gtk_widget_get_window (GTK_WIDGET (priv->widget)),
@ -343,7 +343,7 @@ key_enlarge (EekGtkKeyboard *keyboard, EekKey *key)
gdk_cairo_set_source_color (cr, context.fg); gdk_cairo_set_source_color (cr, context.fg);
eek_draw_outline (cr, outline); eek_draw_outline (cr, outline);
cairo_destroy (cr); cairo_destroy (cr);
g_hash_table_insert (priv->outline_large_pixmaps, outline, texture); g_hash_table_insert (priv->large_outline_textures, outline, texture);
} }
pixmap = pixmap =
@ -367,8 +367,10 @@ key_enlarge (EekGtkKeyboard *keyboard, EekKey *key)
gtk_widget_get_style (priv->widget)->fg_gc[state], gtk_widget_get_style (priv->widget)->fg_gc[state],
pixmap, pixmap,
0, 0, 0, 0,
(ax - (bounds.width * SCALE - bounds.width) / 2) * priv->scale, (ax - (bounds.width * SCALE - bounds.width) / 2) *
(ay - (bounds.height * SCALE - bounds.height) / 2) * priv->scale, priv->scale,
(ay - (bounds.height * SCALE - bounds.height) / 2) *
priv->scale,
bounds.width * SCALE * priv->scale, bounds.width * SCALE * priv->scale,
bounds.height * SCALE * priv->scale); bounds.height * SCALE * priv->scale);
g_object_unref (pixmap); g_object_unref (pixmap);
@ -445,23 +447,13 @@ on_size_allocate (GtkWidget *widget,
EekGtkKeyboardPrivate *priv = EekGtkKeyboardPrivate *priv =
EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard); EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard);
EekBounds bounds; EekBounds bounds;
GdkPixmap *pixmap;
if (priv->pixmap) { if (priv->pixmap) {
g_object_unref (priv->pixmap); pixmap = priv->pixmap;
priv->pixmap = NULL; priv->pixmap = NULL;
g_object_unref (pixmap);
} }
g_hash_table_unref (priv->outline_pixmaps);
g_hash_table_unref (priv->outline_large_pixmaps);
priv->outline_pixmaps =
g_hash_table_new_full (g_direct_hash,
g_direct_equal,
NULL,
g_object_unref);
priv->outline_large_pixmaps =
g_hash_table_new_full (g_direct_hash,
g_direct_equal,
NULL,
g_object_unref);
eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds); eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds);
priv->scale = allocation->width > allocation->height ? priv->scale = allocation->width > allocation->height ?