2 pango-afm-decoder.c -- AFM fontencoding for Pango fontconfig
4 source file of the GNU LilyPond music typesetter
6 Copyright (C) 2004 Jan Nieuwenhuizen <janneke@gnu.org>
8 Note: in C and with explicit LPGL header for easier use with PANGO
11 This library is free software; you can redistribute it and/or
12 modify it under the terms of the GNU Lesser General Public
13 License as published by the Free Software Foundation; either
14 version 2.1 of the License, or (at your option) any later version.
16 This library is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 Lesser General Public License for more details.
21 You should have received a copy of the GNU Lesser General Public
22 License along with this library; if not, write to the Free Software
23 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #ifdef HAVE_PANGO_FC_FONT_MAP_ADD_DECODER_FIND_FUNC
29 /* Need to access to PangoFcFont.full_pattern. */
30 #define PANGO_ENABLE_BACKEND
32 #include <pango/pango-font.h>
33 #include <pango/pangoxft.h>
34 #include <pango/pangofc-font.h>
36 #include <X11/Xft/Xft.h>
38 #include "pangofc-afm-decoder.hh"
40 #ifdef DEBUG_PANGO_AFM
42 #define dprintf(args...) fprintf (stderr, args)
44 #define dprintf(args...)
47 struct _PangoFcAfmDecoderPrivate
49 GString encoding[256];
51 char const *file_name;
55 static void pango_fc_afm_decoder_init (PangoFcAfmDecoder *fontmap);
56 static void pango_fc_afm_decoder_class_init (PangoFcAfmDecoderClass *clss);
57 static void pango_fc_afm_decoder_finalize (GObject *object);
59 static FcCharSet *pango_fc_afm_get_charset (PangoFcFont *fcfont);
60 static PangoGlyph pango_fc_afm_get_glyph (PangoFcFont *fcfont, guint32 wc);
61 static void pango_fc_afm_decoder_set_file_name (PangoFcAfmDecoder *self, char const *file_name);
63 static PangoFcDecoderClass *parent_class;
67 G_DEFINE_TYPE (PangoFcAfmDecoder, pango_fc_afm_decoder, PANGO_TYPE_FC_DECODER);
70 pango_fc_afm_decoder_get_type (void)
72 static GType object_type = 0;
76 static const GTypeInfo object_info =
78 sizeof (PangoFcAfmDecoderClass),
80 (GBaseFinalizeFunc) 0,
81 (GClassInitFunc) pango_fc_afm_decoder_class_init,
82 0, /* class_finalize */
84 sizeof (PangoFcAfmDecoder),
86 (GInstanceInitFunc) pango_fc_afm_decoder_init,
90 object_type = g_type_register_static (PANGO_TYPE_FC_DECODER,
92 &object_info, (GTypeFlags)0);
100 pango_fc_afm_decoder_init (PangoFcAfmDecoder *fcafmdecoder)
102 PangoFcAfmDecoderPrivate *priv = fcafmdecoder->priv;
103 priv = fcafmdecoder->priv
104 = G_TYPE_INSTANCE_GET_PRIVATE (fcafmdecoder,
105 PANGO_TYPE_FC_AFM_DECODER,
106 PangoFcAfmDecoderPrivate);
113 pango_fc_afm_decoder_class_init (PangoFcAfmDecoderClass *clss)
115 GObjectClass *object_class = G_OBJECT_CLASS (clss);
116 object_class->finalize = pango_fc_afm_decoder_finalize;
117 g_type_class_add_private (object_class, sizeof (PangoFcAfmDecoderPrivate));
119 PangoFcDecoderClass *parent_class = PANGO_FC_DECODER_CLASS (clss);
120 parent_class->get_charset = pango_fc_afm_get_charset;
121 parent_class->get_glyph = pango_fc_afm_get_glyph;
125 pango_fc_afm_decoder_finalize (GObject *object)
128 PangoFcAfmDecoder *fcafmdecoder = PANGO_FC_AFM_DECODER (object);
129 PangoFcAfmDecoderPrivate *priv = fcafmdecoder->priv;
135 G_OBJECT_CLASS (parent_class)->finalize (object);
139 pango_fc_afm_get_charset (PangoFcFont *fcfont)
141 //dprintf ("get charset: %s\n", fcfont->font_pattern);
142 dprintf ("get charset: \n");
144 FcCharSet *charset = 0;
145 FcPatternGetCharSet (fcfont->font_pattern, FC_CHARSET, 0, &charset);
147 /* Return plain, undecoded charset.
155 FcCharSet *charset = FcCharSetCreate ();
156 for (i = 0; i < 256; i++)
157 if (!FcCharSetAddChar (charset, chr++))
164 pango_fc_afm_get_glyph (PangoFcFont *fcfont, guint32 wc)
168 xft_font = XftFontOpenPattern (GDK_DISPLAY (),
169 FcPatternDuplicate (fcfont->font_pattern));
170 PangoGlyph g = XftCharIndex (0, xft_font, wc);
171 dprintf ("get glyph! 0x%x --> 0x%x\n", wc, (unsigned)g);
176 Shortcut PUA mapping/AFM reading: The Feta charsets are encoded
177 without any gaps, starting at 0x21. *grin* */
184 pango_fc_afm_decoder_set_file_name (PangoFcAfmDecoder *self,
185 char const *file_name)
187 self->priv->file_name = file_name;
191 pango_fc_afm_decoder_new (void)
193 return PANGO_FC_AFM_DECODER (g_object_new (PANGO_TYPE_FC_AFM_DECODER, 0));
197 pango_fc_afm_find_decoder (FcPattern *pattern, gpointer user_data)
199 FcChar8 *family_name;
201 if (FcPatternGetString (pattern, FC_FAMILY, 0, &family_name)
204 dprintf ("Family name: %s\n", family_name);
205 dprintf ("user_data: %s\n", (char const*) user_data);
207 if (!strcasecmp ((char const*) family_name, (char const*) user_data))
209 PangoFcAfmDecoder *afm = pango_fc_afm_decoder_new ();
210 char const *file_name = "feta20.afm";
211 pango_fc_afm_decoder_set_file_name (afm, file_name);
212 dprintf ("Adding decoder: %s\n", file_name);
213 return PANGO_FC_DECODER (afm);
220 pango_fc_afm_add_decoder (char const *family_name)
222 PangoFcFontMap *fc_map
223 = PANGO_FC_FONT_MAP (pango_xft_get_font_map (GDK_DISPLAY (), 0));
225 pango_fc_font_map_add_decoder_find_func (fc_map, pango_fc_afm_find_decoder,
226 (gpointer)family_name, 0);
229 #ifdef PANGO_FC_AFM_DECODER_TEST
232 #include <libgnomecanvas/libgnomecanvas.h>
233 #include <pango/pangoft2.h>
234 #include <pango/pangox.h>
235 #include <pango/pangoxft.h>
237 #include "pangofc-afm-decoder.h"
239 #define CANVAS_WIDTH 600
240 #define CANVAS_HEIGHT 300
243 exit_clicked (GtkWidget *widget, gpointer data)
245 gtk_widget_destroy (GTK_WIDGET (data));
250 delete_event (GtkWidget *widget, GdkEvent *event, gpointer data)
252 gtk_widget_destroy (widget);
258 make_canvas (int width, int height)
260 GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
261 GtkWidget *vbox = gtk_vbox_new (FALSE, 0);
262 GtkWidget *canvas = gnome_canvas_new ();
263 GtkWidget *hbox = gtk_hbox_new (TRUE, 0);
264 GtkWidget *button = gtk_button_new_with_label ("Exit");
266 gtk_container_add (GTK_CONTAINER (window), vbox);
267 gtk_widget_set_size_request (canvas, width, height);
268 gtk_box_pack_start (GTK_BOX (vbox), canvas, TRUE, TRUE, 0);
269 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
270 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
272 gtk_signal_connect (GTK_OBJECT (button), "clicked",
273 (GtkSignalFunc) exit_clicked, window);
275 gtk_signal_connect (GTK_OBJECT (window), "delete_event",
276 (GtkSignalFunc) delete_event, 0);
278 gtk_widget_show_all (window);
279 return GNOME_CANVAS (canvas);
282 #define gnome_canvas_text(x, y, font, text) \
283 gnome_canvas_item_new (root, text_item, "x", x, "y", y, "font", font, \
284 "text", text, "anchor", GTK_ANCHOR_SOUTH_WEST, \
285 "fill_color", "black", 0)
288 main (int argc, char **argv)
290 gtk_init (&argc, &argv);
291 GnomeCanvas *canvas = make_canvas (CANVAS_WIDTH, CANVAS_HEIGHT);
293 /* Register GNU LilyPond FETA AFM decoders. */
294 pango_fc_afm_add_decoder ("lilypond-feta");
295 pango_fc_afm_add_decoder ("lilypond-braces");
296 pango_fc_afm_add_decoder ("lilypond-dyn");
297 pango_fc_afm_add_decoder ("lilypond-parmesan");
299 int text_item = gnome_canvas_text_get_type ();
300 GnomeCanvasGroup *root = gnome_canvas_root (canvas);
301 char const *g_clef_utf8 = "\302\220";
303 gnome_canvas_text (45.0, 122.5, "LilyPond-feta-nummer 16", "3");
304 gnome_canvas_text (45.0, 142.5, "LilyPond-feta-nummer, r 16", "4");
305 gnome_canvas_text (10.0, 142.0, "LilyPond-feta, 32", g_clef_utf8);
310 #endif /* PANGO_FC_AFM_DECODER_TEST */
312 #endif /* HAVE_PANGO_FC_FONT_MAP_ADD_DECODER_FIND_FUNC */