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 #if 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 #ifndef PANGO_FC_AFM_DECODER_TEST
48 #define PUA_OFFSET 0xe00
53 struct _PangoFcAfmDecoderPrivate
55 GString encoding[256];
56 char const *file_name;
60 static void pango_fc_afm_decoder_init (PangoFcAfmDecoder *fontmap);
61 static void pango_fc_afm_decoder_class_init (PangoFcAfmDecoderClass *clss);
62 static void pango_fc_afm_decoder_finalize (GObject *object);
64 static FcCharSet *pango_fc_afm_get_charset (PangoFcDecoder *decoder,
66 static PangoGlyph pango_fc_afm_get_glyph (PangoFcDecoder *decoder,
67 PangoFcFont *fcfont, guint32 wc);
68 static void pango_fc_afm_decoder_set_file_name (PangoFcAfmDecoder *self,
69 char const *file_name);
71 static PangoFcDecoderClass *parent_class;
73 G_DEFINE_TYPE (PangoFcAfmDecoder, pango_fc_afm_decoder, PANGO_TYPE_FC_DECODER);
76 pango_fc_afm_decoder_init (PangoFcAfmDecoder *fcafmdecoder)
78 PangoFcAfmDecoderPrivate *priv = fcafmdecoder->priv;
79 priv = fcafmdecoder->priv
80 = G_TYPE_INSTANCE_GET_PRIVATE (fcafmdecoder,
81 PANGO_TYPE_FC_AFM_DECODER,
82 PangoFcAfmDecoderPrivate);
86 pango_fc_afm_decoder_class_init (PangoFcAfmDecoderClass *clss)
88 GObjectClass *object_class = G_OBJECT_CLASS (clss);
89 object_class->finalize = pango_fc_afm_decoder_finalize;
90 g_type_class_add_private (object_class, sizeof (PangoFcAfmDecoderPrivate));
92 PangoFcDecoderClass *parent_class = PANGO_FC_DECODER_CLASS (clss);
93 parent_class->get_charset = pango_fc_afm_get_charset;
94 parent_class->get_glyph = pango_fc_afm_get_glyph;
98 pango_fc_afm_decoder_finalize (GObject *object)
100 G_OBJECT_CLASS (parent_class)->finalize (object);
104 pango_fc_afm_get_charset (PangoFcDecoder *decoder, PangoFcFont *fcfont)
107 dprintf ("get charset: \n");
109 FcCharSet *charset = 0;
110 FcPatternGetCharSet (fcfont->font_pattern, FC_CHARSET, 0, &charset);
112 /* Return plain, undecoded charset.
119 FcCharSet *charset = FcCharSetCreate ();
120 for (i = 0; i < 256; i++)
121 if (!FcCharSetAddChar (charset, chr++))
128 pango_fc_afm_get_glyph (PangoFcDecoder *decoder, PangoFcFont *fcfont,
134 xft_font = XftFontOpenPattern (GDK_DISPLAY (),
135 FcPatternDuplicate (fcfont->font_pattern));
136 PangoGlyph g = XftCharIndex (0, xft_font, wc);
137 dprintf ("get glyph! 0x%x --> 0x%x\n", wc, (unsigned)g);
141 Use direct privat usage area (PUA) mapping as shortcut for
142 actual AFM reading. The Feta charsets are encoded without any
143 gaps, and mappend onto PUA. */
144 return wc - PUA_OFFSET;
149 pango_fc_afm_decoder_set_file_name (PangoFcAfmDecoder *self,
150 char const *file_name)
152 self->priv->file_name = file_name;
156 pango_fc_afm_decoder_new (void)
158 return PANGO_FC_AFM_DECODER (g_object_new (PANGO_TYPE_FC_AFM_DECODER, 0));
162 pango_fc_afm_find_decoder (FcPattern *pattern, gpointer user_data)
164 FcChar8 *family_name;
166 if (FcPatternGetString (pattern, FC_FAMILY, 0, &family_name)
169 dprintf ("Family name: %s\n", family_name);
170 dprintf ("user_data: %s\n", (char const*) user_data);
172 if (!strcasecmp ((char const*) family_name, (char const*) user_data))
174 PangoFcAfmDecoder *afm = pango_fc_afm_decoder_new ();
175 char const *file_name = "feta20.afm";
176 pango_fc_afm_decoder_set_file_name (afm, file_name);
177 dprintf ("Adding decoder: %s\n", file_name);
178 return PANGO_FC_DECODER (afm);
185 pango_fc_afm_add_decoder (char const *family_name)
187 PangoFcFontMap *fc_map
188 = PANGO_FC_FONT_MAP (pango_xft_get_font_map (GDK_DISPLAY (), 0));
190 pango_fc_font_map_add_decoder_find_func (fc_map, pango_fc_afm_find_decoder,
191 (gpointer)family_name, 0);
194 #ifdef PANGO_FC_AFM_DECODER_TEST
197 #include <libgnomecanvas/libgnomecanvas.h>
198 #include <pango/pangoft2.h>
199 #include <pango/pangox.h>
200 #include <pango/pangoxft.h>
202 #include "pangofc-afm-decoder.hh"
204 #define CANVAS_WIDTH 600
205 #define CANVAS_HEIGHT 300
208 exit_clicked (GtkWidget *widget, gpointer data)
210 gtk_widget_destroy (GTK_WIDGET (data));
215 delete_event (GtkWidget *widget, GdkEvent *event, gpointer data)
217 gtk_widget_destroy (widget);
223 make_canvas (int width, int height)
225 GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
226 GtkWidget *vbox = gtk_vbox_new (FALSE, 0);
227 GtkWidget *canvas = gnome_canvas_new ();
228 GtkWidget *hbox = gtk_hbox_new (TRUE, 0);
229 GtkWidget *button = gtk_button_new_with_label ("Exit");
231 gtk_container_add (GTK_CONTAINER (window), vbox);
232 gtk_widget_set_size_request (canvas, width, height);
233 gtk_box_pack_start (GTK_BOX (vbox), canvas, TRUE, TRUE, 0);
234 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
235 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
237 gtk_signal_connect (GTK_OBJECT (button), "clicked",
238 (GtkSignalFunc) exit_clicked, window);
240 gtk_signal_connect (GTK_OBJECT (window), "delete_event",
241 (GtkSignalFunc) delete_event, 0);
243 gtk_widget_show_all (window);
244 return GNOME_CANVAS (canvas);
247 #define gnome_canvas_text(x, y, font, text) \
248 gnome_canvas_item_new (root, text_item, "x", x, "y", y, "font", font, \
249 "text", text, "anchor", GTK_ANCHOR_SOUTH_WEST, \
250 "fill_color", "black", 0)
253 main (int argc, char **argv)
255 gtk_init (&argc, &argv);
256 GnomeCanvas *canvas = make_canvas (CANVAS_WIDTH, CANVAS_HEIGHT);
258 /* Register GNU LilyPond FETA AFM decoders. */
259 pango_fc_afm_add_decoder ("lilypond-feta");
260 pango_fc_afm_add_decoder ("lilypond-feta-braces-f");
261 pango_fc_afm_add_decoder ("lilypond-din");
262 pango_fc_afm_add_decoder ("lilypond-parmesan");
264 int text_item = gnome_canvas_text_get_type ();
265 GnomeCanvasGroup *root = gnome_canvas_root (canvas);
266 char const *g_clef_utf8 = "p";
268 gnome_canvas_text (45.0, 122.5, "LilyPond-feta-nummer 16", "3");
269 gnome_canvas_text (45.0, 142.5, "LilyPond-feta-nummer, r 16", "4");
270 gnome_canvas_text (10.0, 142.0, "LilyPond-feta, 32", g_clef_utf8);
271 gnome_canvas_text (10.0, 162.0, "LilyPond-feta-din, 32", "fmsrpz");
272 gnome_canvas_text (5.0, 142.0, "LilyPond-feta-braces-f, 32", "AZ");
277 #endif /* PANGO_FC_AFM_DECODER_TEST */
279 #endif /* HAVE_PANGO_FC_FONT_MAP_ADD_DECODER_FIND_FUNC */