summaryrefslogtreecommitdiff
path: root/plugins/gtkui/gtkglext-gtk2/gdk/x11/gdkglfont-x11.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/gtkui/gtkglext-gtk2/gdk/x11/gdkglfont-x11.c')
-rw-r--r--plugins/gtkui/gtkglext-gtk2/gdk/x11/gdkglfont-x11.c196
1 files changed, 196 insertions, 0 deletions
diff --git a/plugins/gtkui/gtkglext-gtk2/gdk/x11/gdkglfont-x11.c b/plugins/gtkui/gtkglext-gtk2/gdk/x11/gdkglfont-x11.c
new file mode 100644
index 00000000..d4ec881f
--- /dev/null
+++ b/plugins/gtkui/gtkglext-gtk2/gdk/x11/gdkglfont-x11.c
@@ -0,0 +1,196 @@
+/* GdkGLExt - OpenGL Extension to GDK
+ * Copyright (C) 2002-2004 Naofumi Yasufuku
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include <string.h>
+
+#include <pango/pangox.h>
+
+#include "gdkglx.h"
+#include "gdkglprivate-x11.h"
+#include "gdkglfont.h"
+
+#ifdef GDKGLEXT_MULTIHEAD_SUPPORT
+#include <gdk/gdkdisplay.h>
+#endif /* GDKGLEXT_MULTIHEAD_SUPPORT */
+
+/*
+ * This code is ripped from gdk/x11/gdkfont-x11.c in GTK+.
+ */
+static char *
+gdk_gl_font_charset_for_locale (void)
+{
+ static char *charset_map[][2] = {
+ { "ANSI_X3.4-1968", "iso8859-1" },
+ { "US-ASCII", "iso8859-1" },
+ { "ISO-8859-1", "iso8859-1" },
+ { "ISO-8859-2", "iso8859-2" },
+ { "ISO-8859-3", "iso8859-3" },
+ { "ISO-8859-4", "iso8859-4" },
+ { "ISO-8859-5", "iso8859-5" },
+ { "ISO-8859-6", "iso8859-6" },
+ { "ISO-8859-7", "iso8859-7" },
+ { "ISO-8859-8", "iso8859-8" },
+ { "ISO-8859-9", "iso8859-9" },
+ { "UTF-8", "iso8859-1" }
+ };
+
+ const char *codeset;
+ char *result = NULL;
+ gsize i;
+
+ g_get_charset (&codeset);
+
+ for (i = 0; i < G_N_ELEMENTS (charset_map); i++)
+ if (strcmp (charset_map[i][0], codeset) == 0)
+ {
+ result = charset_map[i][1];
+ break;
+ }
+
+ if (result != NULL)
+ return g_strdup (result);
+ else
+ return g_strdup ("iso8859-1");
+}
+
+static PangoFont *
+gdk_gl_font_use_pango_font_common (PangoFontMap *font_map,
+ const PangoFontDescription *font_desc,
+ int first,
+ int count,
+ int list_base)
+{
+ PangoFont *font = NULL;
+ gchar *charset = NULL;
+ PangoXSubfont subfont_id;
+ gchar *xlfd = NULL;
+ PangoXFontCache *font_cache;
+ XFontStruct *fs;
+
+ GDK_GL_NOTE_FUNC_PRIVATE ();
+
+ font = pango_font_map_load_font (font_map, NULL, font_desc);
+ if (font == NULL)
+ {
+ g_warning ("cannot load PangoFont");
+ goto FAIL;
+ }
+
+ charset = gdk_gl_font_charset_for_locale ();
+ if (!pango_x_find_first_subfont (font, &charset, 1, &subfont_id))
+ {
+ g_warning ("cannot find PangoXSubfont");
+ font = NULL;
+ goto FAIL;
+ }
+
+ xlfd = pango_x_font_subfont_xlfd (font, subfont_id);
+ if (xlfd == NULL)
+ {
+ g_warning ("cannot get XLFD");
+ font = NULL;
+ goto FAIL;
+ }
+
+ font_cache = pango_x_font_map_get_font_cache (font_map);
+
+ fs = pango_x_font_cache_load (font_cache, xlfd);
+
+ glXUseXFont (fs->fid, first, count, list_base);
+
+ pango_x_font_cache_unload (font_cache, fs);
+
+ FAIL:
+
+ if (charset != NULL)
+ g_free (charset);
+
+ if (xlfd != NULL)
+ g_free (xlfd);
+
+ return font;
+}
+
+/**
+ * gdk_gl_font_use_pango_font:
+ * @font_desc: a #PangoFontDescription describing the font to use.
+ * @first: the index of the first glyph to be taken.
+ * @count: the number of glyphs to be taken.
+ * @list_base: the index of the first display list to be generated.
+ *
+ * Creates bitmap display lists from a #PangoFont.
+ *
+ * Return value: the #PangoFont used, or NULL if no font matched.
+ **/
+PangoFont *
+gdk_gl_font_use_pango_font (const PangoFontDescription *font_desc,
+ int first,
+ int count,
+ int list_base)
+{
+ PangoFontMap *font_map;
+
+ g_return_val_if_fail (font_desc != NULL, NULL);
+
+ GDK_GL_NOTE_FUNC ();
+
+#ifdef GDKGLEXT_MULTIHEAD_SUPPORT
+ font_map = pango_x_font_map_for_display (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
+#else /* GDKGLEXT_MULTIHEAD_SUPPORT */
+ font_map = pango_x_font_map_for_display (gdk_x11_get_default_xdisplay ());
+#endif /* GDKGLEXT_MULTIHEAD_SUPPORT */
+
+ return gdk_gl_font_use_pango_font_common (font_map, font_desc,
+ first, count, list_base);
+}
+
+#ifdef GDKGLEXT_MULTIHEAD_SUPPORT
+
+/**
+ * gdk_gl_font_use_pango_font_for_display:
+ * @display: a #GdkDisplay.
+ * @font_desc: a #PangoFontDescription describing the font to use.
+ * @first: the index of the first glyph to be taken.
+ * @count: the number of glyphs to be taken.
+ * @list_base: the index of the first display list to be generated.
+ *
+ * Creates bitmap display lists from a #PangoFont.
+ *
+ * Return value: the #PangoFont used, or NULL if no font matched.
+ **/
+PangoFont *
+gdk_gl_font_use_pango_font_for_display (GdkDisplay *display,
+ const PangoFontDescription *font_desc,
+ int first,
+ int count,
+ int list_base)
+{
+ PangoFontMap *font_map;
+
+ g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
+ g_return_val_if_fail (font_desc != NULL, NULL);
+
+ GDK_GL_NOTE_FUNC ();
+
+ font_map = pango_x_font_map_for_display (GDK_DISPLAY_XDISPLAY (display));
+
+ return gdk_gl_font_use_pango_font_common (font_map, font_desc,
+ first, count, list_base);
+}
+
+#endif /* GDKGLEXT_MULTIHEAD_SUPPORT */