/* GNU LilyPond -- the music typesetter. canvas-afm.c -- testing the GNOME canvas output backend Copyright (C) 2004 Jan Nieuwenhuizen Use the Pango font-decoder mechanism (pango CVS) to draw characters with index >= 0x80 from a custom font, using the AFM encoding vector, if possible using AFM glyph names. See also: http://le-hacker.org/papers/gobject/ch04.html */ #include #include #include #include #include #include "pangofc-afm-decoder.h" /* This defines the size of the canvas, in pixels */ #define CANVAS_WIDTH 600 #define CANVAS_HEIGHT 300 /* Callback for the clicked signal of the Exit button */ static void exit_clicked (GtkWidget *widget, gpointer data) { /* the user data points to the main window */ gtk_widget_destroy (GTK_WIDGET (data)); gtk_main_quit (); } /* Callback for the delete_event signal of the main application window */ static gint delete_event (GtkWidget *widget, GdkEvent *event, gpointer data) { gtk_widget_destroy (widget); /* destroy the main window */ gtk_main_quit (); return TRUE; } GtkWidget *toplevel_window; GnomeCanvas * make_canvas (int width, int height) { // put in class GtkWidget *window; GtkWidget *vbox; GtkWidget *frame; GtkWidget *canvas; GtkWidget *hbox = 0; GtkWidget *button; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); // urg toplevel_window = window; vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (window), vbox); gtk_widget_show (vbox); frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0); gtk_widget_show (frame); canvas = gnome_canvas_new (); gtk_widget_set_usize (canvas, width, height); gnome_canvas_set_scroll_region (GNOME_CANVAS (canvas), 0.0, 0.0, width, height); gtk_container_add (GTK_CONTAINER (frame), canvas); gtk_widget_show (canvas); if (!hbox) { hbox = gtk_hbox_new (TRUE, 0); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); } button = gtk_button_new_with_label ("Exit"); gtk_signal_connect (GTK_OBJECT (button), "clicked", (GtkSignalFunc) exit_clicked, window); gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); gtk_widget_show (button); gtk_signal_connect (GTK_OBJECT (window), "delete_event", (GtkSignalFunc) delete_event, NULL); gtk_widget_show (window); return GNOME_CANVAS (canvas); } void setup_pango_afm (GtkWidget *widget) { #if 0 /* This may . */ GdkDisplay *gdk_display = gdk_drawable_get_display (widget->window); Display *display = gdk_x11_display_get_xdisplay (gdk_display); PangoFontMap *map = pango_x_font_map_for_display (display); /* FIXME: the decoder_find_func wants a PangoFcFontMap --- but how to get it?*/ // PangoFcFontMap *fc_map = PANGO_FC_FONT_MAP (map2); #else #if 0 /* How do I tell pango to use this new font map? */ PangoFontMap *map = pango_ft2_font_map_new (); #else /* Deprecated, but it works. */ PangoFontMap *map = pango_ft2_font_map_for_display (); #endif PangoFcFontMap *fc_map = PANGO_FC_FONT_MAP (map); #endif pango_fc_font_map_add_decoder_find_func (fc_map, pango_fc_afm_find_decoder, /*user_data*/0, (GDestroyNotify)0); } int main (int argc, char **argv) { gnome_init ("canvas-example", "1.0", argc, argv); GnomeCanvas *canvas = make_canvas (CANVAS_WIDTH, CANVAS_HEIGHT); /* Do the magic LilyPond FETA AFM thingy. */ setup_pango_afm (toplevel_window); int text_item = gnome_canvas_text_get_type (); GnomeCanvasGroup *root = gnome_canvas_root (canvas); /* FIXME: The pango_fc_afm_find_decoder function is never invoked. Does Pango use the wrong map? Should I tell the canvas to use Pango's FT2 backend? */ gnome_canvas_item_new (root, text_item, "x", 45.0, "y", 122.5, "font", "lilypond-feta-nummer 16", "text", "3", "anchor", GTK_ANCHOR_WEST, "fill_color", "black", 0); gnome_canvas_item_new (root, text_item, "x", 45.0, "y", 142.5, "font", "lilypond-feta-nummer, r 16", "text", "4", "anchor", GTK_ANCHOR_WEST, "fill_color", "black", 0); unsigned char g_clef_index = '\220'; /* 144 -> 194 144 -> \302 \220 */ char const *g_clef_utf8 = "ab\302\220"; gnome_canvas_item_new (root, text_item, "x", 10.0, "y", 142.0, //"font", "lilypond-feta, r 32", "text", g_clef_utf8, "font", "LilyPond-feta, 32", "text", g_clef_utf8, "anchor", GTK_ANCHOR_WEST, "fill_color", "black", 0); gtk_main (); return 0; }