diff options
author | Owen Taylor <otaylor@redhat.com> | 2004-11-21 16:24:01 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2004-11-21 16:24:01 +0000 |
commit | 3d737ee8bae66d3395ff7975fafea99f87f1ed40 (patch) | |
tree | b3cf7a30ab9a1ac9c67a3cdc99c74e0c9456a467 /demos | |
parent | 4ef2649257f57961b7e017aeb46afe611a0f73dd (diff) | |
download | gtk+-3d737ee8bae66d3395ff7975fafea99f87f1ed40.tar.gz |
Add GdkPangoRenderer, a subclass of PangoRenderer targeting GDK drawables.
Sat Nov 20 15:13:51 2004 Owen Taylor <otaylor@redhat.com>
* gdk/gdkpango.[ch]: Add GdkPangoRenderer, a subclass of
PangoRenderer targeting GDK drawables. Use to implement the old
gdk_draw_layout() and friends.
* gdk/gdkdraw.c gdk/gdkdrawable.h gdk/gdkwindow.c gdk/gdkpixmap.c:
Add gdk_draw_glyphs_transformed() gdk_draw_trapezoids() and
the corresponding members of GdkDrawableClass. Add a fallback
implementation of gdk_draw_trapezoids() in terms of pixbufs.
* gdk/gdkwindowing.h gdk/x11/gdkg-x11.h: Add
_gdk_windowing_gc_get_foreground() to enable the fallback
trapezoid implementation.
* gdk/x11/gdkdrawable-x11.c gdk/x11/gdkdisplay-x11.h: Implement
draw_glyph_transformed, draw_trapezoids.
* gdk/x11/gdkdrawable-x11.[ch]: Add
_gdk_x11_drawable_draw_xtrapezoids, _gdk_x11_drawable_draw_xft_glyphs
for use of GdkX11Renderer.
* gdk/x11/gdkgc-x11.c gdk/x11/gdkprivate-x11.h: Implement
GDK_TILED, GDK_STIPPLED, GDK_OPAQUE_STIPPLED in the RENDER codepath.
* gdk/gdkpango-x11.c: Add GdkX11Renderer... a subclass of
PangoXftRenderer that does tiles/stipples and fallback rendering
of trapezoids without the RENDER extension.
* gdk/gdkpango-x11.c gdk/x11/gdkscreen-x11.[ch] _gdk_x11_renderer_get:
Add _gdk_x11_renderer_get() to get a singleton GdkX11Renderer
for the screen.
* gdk/x11/gdkdrawable-x11.c (get_impl_drawable): Fix a None/NULL
confusion.
* gtk/gtklabel.[ch] gtk/gtk.symbols: Add gtk_label_set/get_angle(),
and an ::angle property.
* gtk/gtklabel.c: Remove #if 0'd dead code gtk_label_paint_word().
* gtk/gtktextdisplay.c: Switch to using a GtkTextRenderer subclass
of GdkPangoRenderer for drawing.
* gtk/gtktextlayout.[ch] gtk/gtktextdisplay.c: Switch to using
gtk_attr_shape_new_with_data() to store backreferences to
embedded pixmaps and widgets. Leave line_display->shaped_objects
around for backwords compatibility.
* gdk/gdkpango.[ch] (gdk_pango_context_set_colormap): Describe
as deprecated, remove implementation.
* gtk/gtkwidget.c (gtk_widget_create_pango_context): Remove
call to gdk_pango_context_set_colormap.
* demos/gtk-demo/Makefile.am demos/gtk-demo/rotated_text.c: Add
a demo showing drawing rotated text.
* tests/testgtk.c: Add a rotated-label test, and also a rotated
drawing test (differs from demos/gtk-demo/rotated_text by also
using a tile)
Diffstat (limited to 'demos')
-rw-r--r-- | demos/gtk-demo/Makefile.am | 1 | ||||
-rw-r--r-- | demos/gtk-demo/rotated_text.c | 142 |
2 files changed, 143 insertions, 0 deletions
diff --git a/demos/gtk-demo/Makefile.am b/demos/gtk-demo/Makefile.am index 65a52ca9b8..dd904195be 100644 --- a/demos/gtk-demo/Makefile.am +++ b/demos/gtk-demo/Makefile.am @@ -22,6 +22,7 @@ demos = \ menus.c \ panes.c \ pixbufs.c \ + rotated_text.c \ sizegroup.c \ stock_browser.c \ textview.c \ diff --git a/demos/gtk-demo/rotated_text.c b/demos/gtk-demo/rotated_text.c new file mode 100644 index 0000000000..1c37548dd2 --- /dev/null +++ b/demos/gtk-demo/rotated_text.c @@ -0,0 +1,142 @@ +/* Rotated Text + * + * This demo shows how to use GDK and Pango to draw rotated and transformed + * text. The use of GdkPangoRenderer in this example is a somewhat advanced + * technique; most applications can simply use gdk_draw_layout(). We use + * it here mostly because that allows us to work in user coordinates - that is, + * coordinates prior to the application of the transformation matrix, rather + * than device coordinates. + * + * As of GTK+-2.6, the ability to draw transformed and anti-aliased graphics + * as shown in this example is only present for text. With GTK+-2.8, a new + * graphics system called "Cairo" will be introduced that provides these + * capabilities and many more for all types of graphics. + */ +#include <math.h> +#include <gtk/gtk.h> + +static GtkWidget *window = NULL; + +static gboolean +rotated_text_expose_event (GtkWidget *widget, + GdkEventExpose *event, + gpointer data) +{ +#define RADIUS 150 +#define N_WORDS 10 +#define FONT "Sans Bold 27" + + PangoRenderer *renderer; + PangoMatrix matrix = PANGO_MATRIX_INIT; + PangoContext *context; + PangoLayout *layout; + PangoFontDescription *desc; + + int width = widget->allocation.width; + int height = widget->allocation.height; + double device_radius; + int i; + + /* Get the default renderer for the screen, and set it up for drawing */ + 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), widget->style->black_gc); + + /* Set up a transformation matrix so that the user space coordinates for + * the centered square where we draw are [-RADIUS, RADIUS], [-RADIUS, RADIUS] + * We first center, then change the scale */ + device_radius = MIN (width, height) / 2.; + pango_matrix_translate (&matrix, + device_radius + (width - 2 * device_radius) / 2, + device_radius + (height - 2 * device_radius) / 2); + pango_matrix_scale (&matrix, device_radius / RADIUS, device_radius / RADIUS); + + /* Create a PangoLayout, set the font and text */ + context = gtk_widget_create_pango_context (widget); + layout = pango_layout_new (context); + pango_layout_set_text (layout, "Text", -1); + desc = pango_font_description_from_string (FONT); + pango_layout_set_font_description (layout, desc); + pango_font_description_free (desc); + + /* Draw the layout N_WORDS times in a circle */ + for (i = 0; i < N_WORDS; i++) + { + GdkColor color; + PangoMatrix rotated_matrix = matrix; + int width, height; + double angle = (360. * i) / N_WORDS; + + /* Gradient from red at angle == 60 to blue at angle == 300 */ + color.red = 65535 * (1 + cos ((angle - 60) * M_PI / 180.)) / 2; + color.green = 0; + color.blue = 65535 - color.red; + + gdk_pango_renderer_set_override_color (GDK_PANGO_RENDERER (renderer), + PANGO_RENDER_PART_FOREGROUND, &color); + + pango_matrix_rotate (&rotated_matrix, angle); + + pango_context_set_matrix (context, &rotated_matrix); + + /* Inform Pango to re-layout the text with the new transformation matrix */ + pango_layout_context_changed (layout); + + pango_layout_get_size (layout, &width, &height); + pango_renderer_draw_layout (renderer, layout, + - width / 2, - RADIUS * PANGO_SCALE); + } + + /* Clean up default renderer, since it is shared */ + gdk_pango_renderer_set_override_color (GDK_PANGO_RENDERER (renderer), + PANGO_RENDER_PART_FOREGROUND, NULL); + gdk_pango_renderer_set_drawable (GDK_PANGO_RENDERER (renderer), NULL); + gdk_pango_renderer_set_gc (GDK_PANGO_RENDERER (renderer), NULL); + + /* free the objects we created */ + g_object_unref (layout); + g_object_unref (context); + + return FALSE; +} + +GtkWidget * +do_rotated_text (GtkWidget *do_widget) +{ + GtkWidget *drawing_area; + + if (!window) + { + const GdkColor white = { 0, 0xffff, 0xffff, 0xffff }; + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (do_widget)); + gtk_window_set_title (GTK_WINDOW (window), "Rotated Text"); + + g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window); + + drawing_area = gtk_drawing_area_new (); + gtk_container_add (GTK_CONTAINER (window), drawing_area); + + /* This overrides the background color from the theme */ + gtk_widget_modify_bg (drawing_area, GTK_STATE_NORMAL, &white); + + g_signal_connect (drawing_area, "expose-event", + G_CALLBACK (rotated_text_expose_event), NULL); + + gtk_window_set_default_size (GTK_WINDOW (window), 2 * RADIUS, 2 * RADIUS); + } + + if (!GTK_WIDGET_VISIBLE (window)) + { + gtk_widget_show_all (window); + } + else + { + gtk_widget_destroy (window); + window = NULL; + } + + return window; +} |