1 /* GdkGLExt - OpenGL Extension to GDK
2  * Copyright (C) 2002-2004  Naofumi Yasufuku
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA.
17  */
18 
19 #include <string.h>
20 
21 #include <pango/pangox.h>
22 
23 #include "gdkglx.h"
24 #include "gdkglprivate-x11.h"
25 #include "gdkglfont.h"
26 
27 #ifdef GDKGLEXT_MULTIHEAD_SUPPORT
28 #include <gdk/gdkdisplay.h>
29 #endif /* GDKGLEXT_MULTIHEAD_SUPPORT */
30 
31 /*
32  * This code is ripped from gdk/x11/gdkfont-x11.c in GTK+.
33  */
34 static char *
gdk_gl_font_charset_for_locale(void)35 gdk_gl_font_charset_for_locale (void)
36 {
37   static char *charset_map[][2] = {
38     { "ANSI_X3.4-1968", "iso8859-1" },
39     { "US-ASCII",   "iso8859-1" },
40     { "ISO-8859-1", "iso8859-1" },
41     { "ISO-8859-2", "iso8859-2" },
42     { "ISO-8859-3", "iso8859-3" },
43     { "ISO-8859-4", "iso8859-4" },
44     { "ISO-8859-5", "iso8859-5" },
45     { "ISO-8859-6", "iso8859-6" },
46     { "ISO-8859-7", "iso8859-7" },
47     { "ISO-8859-8", "iso8859-8" },
48     { "ISO-8859-9", "iso8859-9" },
49     { "UTF-8",      "iso8859-1" }
50   };
51 
52   const char *codeset;
53   char *result = NULL;
54   gsize i;
55 
56   g_get_charset (&codeset);
57 
58   for (i = 0; i < G_N_ELEMENTS (charset_map); i++)
59     if (strcmp (charset_map[i][0], codeset) == 0)
60       {
61 	result = charset_map[i][1];
62 	break;
63       }
64 
65   if (result != NULL)
66     return g_strdup (result);
67   else
68     return g_strdup ("iso8859-1");
69 }
70 
71 static PangoFont *
gdk_gl_font_use_pango_font_common(PangoFontMap * font_map,const PangoFontDescription * font_desc,int first,int count,int list_base)72 gdk_gl_font_use_pango_font_common (PangoFontMap               *font_map,
73                                    const PangoFontDescription *font_desc,
74                                    int                         first,
75                                    int                         count,
76                                    int                         list_base)
77 {
78   PangoFont *font = NULL;
79   gchar *charset = NULL;
80   PangoXSubfont subfont_id;
81   gchar *xlfd = NULL;
82   PangoXFontCache *font_cache;
83   XFontStruct *fs;
84 
85   GDK_GL_NOTE_FUNC_PRIVATE ();
86 
87   font = pango_font_map_load_font (font_map, NULL, font_desc);
88   if (font == NULL)
89     {
90       g_warning ("cannot load PangoFont");
91       goto FAIL;
92     }
93 
94   charset = gdk_gl_font_charset_for_locale ();
95   if (!pango_x_find_first_subfont (font, &charset, 1, &subfont_id))
96     {
97       g_warning ("cannot find PangoXSubfont");
98       font = NULL;
99       goto FAIL;
100     }
101 
102   xlfd = pango_x_font_subfont_xlfd (font, subfont_id);
103   if (xlfd == NULL)
104     {
105       g_warning ("cannot get XLFD");
106       font = NULL;
107       goto FAIL;
108     }
109 
110   font_cache = pango_x_font_map_get_font_cache (font_map);
111 
112   fs = pango_x_font_cache_load (font_cache, xlfd);
113 
114   glXUseXFont (fs->fid, first, count, list_base);
115 
116   pango_x_font_cache_unload (font_cache, fs);
117 
118  FAIL:
119 
120   if (charset != NULL)
121     g_free (charset);
122 
123   if (xlfd != NULL)
124     g_free (xlfd);
125 
126   return font;
127 }
128 
129 /**
130  * gdk_gl_font_use_pango_font:
131  * @font_desc: a #PangoFontDescription describing the font to use.
132  * @first: the index of the first glyph to be taken.
133  * @count: the number of glyphs to be taken.
134  * @list_base: the index of the first display list to be generated.
135  *
136  * Creates bitmap display lists from a #PangoFont.
137  *
138  * Return value: the #PangoFont used, or NULL if no font matched.
139  **/
140 PangoFont *
gdk_gl_font_use_pango_font(const PangoFontDescription * font_desc,int first,int count,int list_base)141 gdk_gl_font_use_pango_font (const PangoFontDescription *font_desc,
142                             int                         first,
143                             int                         count,
144                             int                         list_base)
145 {
146   PangoFontMap *font_map;
147 
148   g_return_val_if_fail (font_desc != NULL, NULL);
149 
150   GDK_GL_NOTE_FUNC ();
151 
152 #ifdef GDKGLEXT_MULTIHEAD_SUPPORT
153   font_map = pango_x_font_map_for_display (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
154 #else  /* GDKGLEXT_MULTIHEAD_SUPPORT */
155   font_map = pango_x_font_map_for_display (gdk_x11_get_default_xdisplay ());
156 #endif /* GDKGLEXT_MULTIHEAD_SUPPORT */
157 
158   return gdk_gl_font_use_pango_font_common (font_map, font_desc,
159                                             first, count, list_base);
160 }
161 
162 #ifdef GDKGLEXT_MULTIHEAD_SUPPORT
163 
164 /**
165  * gdk_gl_font_use_pango_font_for_display:
166  * @display: a #GdkDisplay.
167  * @font_desc: a #PangoFontDescription describing the font to use.
168  * @first: the index of the first glyph to be taken.
169  * @count: the number of glyphs to be taken.
170  * @list_base: the index of the first display list to be generated.
171  *
172  * Creates bitmap display lists from a #PangoFont.
173  *
174  * Return value: the #PangoFont used, or NULL if no font matched.
175  **/
176 PangoFont *
gdk_gl_font_use_pango_font_for_display(GdkDisplay * display,const PangoFontDescription * font_desc,int first,int count,int list_base)177 gdk_gl_font_use_pango_font_for_display (GdkDisplay                 *display,
178                                         const PangoFontDescription *font_desc,
179                                         int                         first,
180                                         int                         count,
181                                         int                         list_base)
182 {
183   PangoFontMap *font_map;
184 
185   g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
186   g_return_val_if_fail (font_desc != NULL, NULL);
187 
188   GDK_GL_NOTE_FUNC ();
189 
190   font_map = pango_x_font_map_for_display (GDK_DISPLAY_XDISPLAY (display));
191 
192   return gdk_gl_font_use_pango_font_common (font_map, font_desc,
193                                             first, count, list_base);
194 }
195 
196 #endif /* GDKGLEXT_MULTIHEAD_SUPPORT */
197