forked from AuroraMiddleware/gtk
testgtk: Draw rotated text example with pangocairo
This commit is contained in:
parent
8630657324
commit
e8bf80ebea
@ -2747,58 +2747,30 @@ on_rotated_text_expose (GtkWidget *widget,
|
||||
{
|
||||
static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
|
||||
"had", "10,000", "men" };
|
||||
PangoRenderer *renderer;
|
||||
GdkGC *gc;
|
||||
int n_words;
|
||||
int i;
|
||||
double radius;
|
||||
PangoMatrix matrix = PANGO_MATRIX_INIT;
|
||||
PangoLayout *layout;
|
||||
PangoContext *context;
|
||||
PangoFontDescription *desc;
|
||||
cairo_t *cr;
|
||||
|
||||
gc = g_object_get_data (G_OBJECT (widget), "text-gc");
|
||||
if (!gc)
|
||||
cr = gdk_cairo_create (event->window);
|
||||
|
||||
if (tile_pixbuf)
|
||||
{
|
||||
static GdkColor black = { 0, 0, 0, 0 };
|
||||
|
||||
gc = gdk_gc_new (widget->window);
|
||||
gdk_gc_set_rgb_fg_color (gc, &black);
|
||||
|
||||
if (tile_pixbuf)
|
||||
{
|
||||
GdkPixmap *tile;
|
||||
cairo_t *cr;
|
||||
|
||||
gint width = gdk_pixbuf_get_width (tile_pixbuf);
|
||||
gint height = gdk_pixbuf_get_height (tile_pixbuf);
|
||||
|
||||
tile = gdk_pixmap_new (widget->window, width, height, -1);
|
||||
|
||||
cr = gdk_cairo_create (tile);
|
||||
gdk_cairo_set_source_pixbuf (cr, tile_pixbuf, 0, 0);
|
||||
cairo_paint (cr);
|
||||
cairo_destroy (cr);
|
||||
|
||||
gdk_gc_set_tile (gc, tile);
|
||||
gdk_gc_set_fill (gc, GDK_TILED);
|
||||
|
||||
g_object_unref (tile);
|
||||
}
|
||||
|
||||
g_object_set_data_full (G_OBJECT (widget), "text-gc", gc, (GDestroyNotify)g_object_unref);
|
||||
gdk_cairo_set_source_pixbuf (cr, tile_pixbuf, 0, 0);
|
||||
cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
|
||||
}
|
||||
|
||||
renderer = gdk_pango_renderer_get_default (gtk_widget_get_screen (widget));
|
||||
gdk_pango_renderer_set_drawable (GDK_PANGO_RENDERER (renderer), widget->window);
|
||||
gdk_pango_renderer_set_gc (GDK_PANGO_RENDERER (renderer), gc);
|
||||
else
|
||||
cairo_set_source_rgb (cr, 0, 0, 0);
|
||||
|
||||
radius = MIN (widget->allocation.width, widget->allocation.height) / 2.;
|
||||
|
||||
pango_matrix_translate (&matrix,
|
||||
radius + (widget->allocation.width - 2 * radius) / 2,
|
||||
radius + (widget->allocation.height - 2 * radius) / 2);
|
||||
pango_matrix_scale (&matrix, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
|
||||
cairo_translate (cr,
|
||||
radius + (widget->allocation.width - 2 * radius) / 2,
|
||||
radius + (widget->allocation.height - 2 * radius) / 2);
|
||||
cairo_scale (cr, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
|
||||
|
||||
context = gtk_widget_get_pango_context (widget);
|
||||
layout = pango_layout_new (context);
|
||||
@ -2809,25 +2781,24 @@ on_rotated_text_expose (GtkWidget *widget,
|
||||
n_words = G_N_ELEMENTS (words);
|
||||
for (i = 0; i < n_words; i++)
|
||||
{
|
||||
PangoMatrix rotated_matrix = matrix;
|
||||
int width, height;
|
||||
|
||||
pango_matrix_rotate (&rotated_matrix, - (360. * i) / n_words);
|
||||
|
||||
pango_context_set_matrix (context, &rotated_matrix);
|
||||
pango_layout_context_changed (layout);
|
||||
cairo_save (cr);
|
||||
|
||||
cairo_rotate (cr, 2 * G_PI * i / n_words);
|
||||
pango_cairo_update_layout (cr, layout);
|
||||
|
||||
pango_layout_set_text (layout, words[i], -1);
|
||||
|
||||
pango_layout_get_size (layout, &width, &height);
|
||||
|
||||
pango_renderer_draw_layout (renderer, layout,
|
||||
- width / 2, - DEFAULT_TEXT_RADIUS * PANGO_SCALE);
|
||||
}
|
||||
cairo_move_to (cr, - width / 2 / PANGO_SCALE, - DEFAULT_TEXT_RADIUS);
|
||||
pango_cairo_show_layout (cr, layout);
|
||||
|
||||
gdk_pango_renderer_set_drawable (GDK_PANGO_RENDERER (renderer), NULL);
|
||||
gdk_pango_renderer_set_gc (GDK_PANGO_RENDERER (renderer), NULL);
|
||||
cairo_restore (cr);
|
||||
}
|
||||
|
||||
g_object_unref (layout);
|
||||
cairo_destroy (cr);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user