/*
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;
}