]> git.donarmstrong.com Git - lilypond.git/blob - lily/pangofc-afm-decoder.cc
* scm/framework-gnome.scm: Add pango decoders.
[lilypond.git] / lily / pangofc-afm-decoder.cc
1 /*
2   pango-afm-decoder.c -- AFM fontencoding for Pango fontconfig
3
4   source file of the GNU LilyPond music typesetter
5
6   Copyright (C) 2004  Jan Nieuwenhuizen <janneke@gnu.org>
7
8   Note: in C and with explicit LPGL header for easier use with PANGO
9   outside of LilyPond.
10
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.
15  
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.
20  
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
24 */
25
26 #include "config.h"
27 #ifdef HAVE_PANGO_FC_FONT_MAP_ADD_DECODER_FIND_FUNC
28
29 /* Need to access to PangoFcFont.full_pattern.  */
30 #define PANGO_ENABLE_BACKEND
31
32 #include <pango/pango-font.h>
33 #include <pango/pangoxft.h>
34 #include <pango/pangofc-font.h>
35 #include <gdk/gdkx.h>
36 #include <X11/Xft/Xft.h>
37
38 #include "pangofc-afm-decoder.hh"
39
40 #ifdef DEBUG_PANGO_AFM
41 #include <stdio.h>
42 #define dprintf(args...) fprintf (stderr, args)
43 #else
44 #define dprintf(args...)
45 #endif
46
47 struct _PangoFcAfmDecoderPrivate
48 {
49   GString encoding[256];
50   //GString file_name;
51   char const *file_name;
52   PangoFcFont *fc_font;
53 };
54
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);
58
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);
62
63 static PangoFcDecoderClass *parent_class;
64
65 #if 0
66 /* ugly warning */
67 G_DEFINE_TYPE (PangoFcAfmDecoder, pango_fc_afm_decoder, PANGO_TYPE_FC_DECODER);
68 #else
69 GType
70 pango_fc_afm_decoder_get_type (void)
71 {
72   static GType object_type = 0;
73
74   if (!object_type)
75     {
76       static const GTypeInfo object_info =
77       {
78         sizeof (PangoFcAfmDecoderClass),
79         (GBaseInitFunc) 0,
80         (GBaseFinalizeFunc) 0,
81         (GClassInitFunc) pango_fc_afm_decoder_class_init,
82         0,           /* class_finalize */
83         0,           /* class_data */
84         sizeof (PangoFcAfmDecoder),
85         0,              /* n_preallocs */
86         (GInstanceInitFunc) pango_fc_afm_decoder_init,
87         0, /* value table */
88       };
89       
90       object_type = g_type_register_static (PANGO_TYPE_FC_DECODER,
91                                             "PangoFcAfmDecoder",
92                                             &object_info, (GTypeFlags)0);
93     }
94   
95   return object_type;
96 }
97 #endif
98
99 static void 
100 pango_fc_afm_decoder_init (PangoFcAfmDecoder *fcafmdecoder)
101 {
102   PangoFcAfmDecoderPrivate *priv = fcafmdecoder->priv;
103   priv = fcafmdecoder->priv
104     = G_TYPE_INSTANCE_GET_PRIVATE (fcafmdecoder,
105                                    PANGO_TYPE_FC_AFM_DECODER,
106                                    PangoFcAfmDecoderPrivate);
107   /*
108     init members
109    */
110 }
111
112 static void
113 pango_fc_afm_decoder_class_init (PangoFcAfmDecoderClass *clss)
114 {
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));
118
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;
122 }
123
124 static void
125 pango_fc_afm_decoder_finalize (GObject *object)
126 {
127 #if 0  
128   PangoFcAfmDecoder *fcafmdecoder = PANGO_FC_AFM_DECODER (object);
129   PangoFcAfmDecoderPrivate *priv = fcafmdecoder->priv;
130 #endif
131
132   /*
133     destroy members
134    */
135   G_OBJECT_CLASS (parent_class)->finalize (object);
136 }
137
138 static FcCharSet *
139 pango_fc_afm_get_charset (PangoFcFont *fcfont)
140 {
141   //dprintf ("get charset: %s\n", fcfont->font_pattern);
142   dprintf ("get charset: \n");
143 #if 0  
144   FcCharSet *charset = 0;
145   FcPatternGetCharSet (fcfont->font_pattern, FC_CHARSET, 0, &charset);
146 #else
147   /* Return plain, undecoded charset.
148      TODO:
149        - actually read AFM?
150        - caching?
151        - PUA mapping ? */
152   (void) fcfont;
153   int i;
154   FcChar32 chr = 0;
155   FcCharSet *charset = FcCharSetCreate ();
156   for (i = 0; i < 256; i++)
157     if (!FcCharSetAddChar (charset, chr++))
158       return 0;
159 #endif  
160   return charset;
161 }
162
163 static PangoGlyph
164 pango_fc_afm_get_glyph (PangoFcFont *fcfont, guint32 wc)
165 {
166 #if 0
167   XftFont *xft_font;
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);
172 #else
173   /* TODO:
174        - PUA mapping?
175        
176      Shortcut PUA mapping/AFM reading: The Feta charsets are encoded
177      without any gaps, starting at 0x21.  *grin*  */
178   (void) fcfont;
179   return wc - 0x21;
180 #endif  
181 }
182
183 static void
184 pango_fc_afm_decoder_set_file_name (PangoFcAfmDecoder *self,
185                                     char const *file_name)
186 {
187   self->priv->file_name = file_name;
188 }
189
190 PangoFcAfmDecoder *
191 pango_fc_afm_decoder_new (void)
192 {
193   return PANGO_FC_AFM_DECODER (g_object_new (PANGO_TYPE_FC_AFM_DECODER, 0));
194 }
195
196 PangoFcDecoder *
197 pango_fc_afm_find_decoder (FcPattern *pattern, gpointer user_data)
198 {
199   FcChar8 *family_name;
200   
201   if (FcPatternGetString (pattern, FC_FAMILY, 0, &family_name)
202       == FcResultMatch)
203     {
204       dprintf ("Family name: %s\n", family_name);
205       dprintf ("user_data: %s\n", (char const*) user_data);
206
207       if (!strcasecmp ((char const*) family_name, (char const*) user_data))
208         {
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);
214         }
215     }
216   return 0;
217 }
218
219 void
220 pango_fc_afm_add_decoder (char const *family_name)
221 {
222   PangoFcFontMap *fc_map
223     = PANGO_FC_FONT_MAP (pango_xft_get_font_map (GDK_DISPLAY (), 0));
224
225   pango_fc_font_map_add_decoder_find_func (fc_map, pango_fc_afm_find_decoder,
226                                            (gpointer)family_name, 0);
227 }
228
229 #ifdef PANGO_FC_AFM_DECODER_TEST
230
231 #include <gtk/gtk.h>
232 #include <libgnomecanvas/libgnomecanvas.h>
233 #include <pango/pangoft2.h>
234 #include <pango/pangox.h>
235 #include <pango/pangoxft.h>
236
237 #include "pangofc-afm-decoder.h"
238
239 #define CANVAS_WIDTH 600
240 #define CANVAS_HEIGHT 300
241
242 static void
243 exit_clicked (GtkWidget *widget, gpointer data)
244 {
245   gtk_widget_destroy (GTK_WIDGET (data));
246   gtk_main_quit ();
247 }
248
249 static gint
250 delete_event (GtkWidget *widget, GdkEvent *event, gpointer data)
251 {
252   gtk_widget_destroy (widget);
253   gtk_main_quit ();
254   return TRUE;
255 }
256
257 GnomeCanvas *
258 make_canvas (int width, int height)
259 {
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");
265
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);
271
272   gtk_signal_connect (GTK_OBJECT (button), "clicked",
273                       (GtkSignalFunc) exit_clicked, window);
274   
275   gtk_signal_connect (GTK_OBJECT (window), "delete_event",
276                       (GtkSignalFunc) delete_event, 0);
277
278   gtk_widget_show_all (window);
279   return GNOME_CANVAS (canvas);
280 }
281
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)
286
287 int
288 main (int argc, char **argv)
289 {
290   gtk_init (&argc, &argv);
291   GnomeCanvas *canvas = make_canvas (CANVAS_WIDTH, CANVAS_HEIGHT);
292
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");
298
299   int text_item = gnome_canvas_text_get_type ();
300   GnomeCanvasGroup *root = gnome_canvas_root (canvas);
301   char const *g_clef_utf8 = "\302\220";
302
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);
306
307   gtk_main ();
308   return 0;
309 }
310 #endif /* PANGO_FC_AFM_DECODER_TEST */
311
312 #endif /* HAVE_PANGO_FC_FONT_MAP_ADD_DECODER_FIND_FUNC */