|
Packit |
0ec9dd |
/* Pango
|
|
Packit |
0ec9dd |
* pangocairo-fontmap.c: Cairo font handling
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Copyright (C) 2000-2005 Red Hat Software
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* This library is free software; you can redistribute it and/or
|
|
Packit |
0ec9dd |
* modify it under the terms of the GNU Library General Public
|
|
Packit |
0ec9dd |
* License as published by the Free Software Foundation; either
|
|
Packit |
0ec9dd |
* version 2 of the License, or (at your option) any later version.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* This library is distributed in the hope that it will be useful,
|
|
Packit |
0ec9dd |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
0ec9dd |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
0ec9dd |
* Library General Public License for more details.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* You should have received a copy of the GNU Library General Public
|
|
Packit |
0ec9dd |
* License along with this library; if not, write to the
|
|
Packit |
0ec9dd |
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
Packit |
0ec9dd |
* Boston, MA 02111-1307, USA.
|
|
Packit |
0ec9dd |
*/
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
#include "config.h"
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
#include "pangocairo.h"
|
|
Packit |
0ec9dd |
#include "pangocairo-private.h"
|
|
Packit |
0ec9dd |
#include "pango-impl-utils.h"
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
#if defined (HAVE_CORE_TEXT) && defined (HAVE_CAIRO_QUARTZ)
|
|
Packit |
0ec9dd |
# include "pangocairo-coretext.h"
|
|
Packit |
0ec9dd |
#endif
|
|
Packit |
0ec9dd |
#if defined (HAVE_CAIRO_WIN32)
|
|
Packit |
0ec9dd |
# include "pangocairo-win32.h"
|
|
Packit |
0ec9dd |
#endif
|
|
Packit |
0ec9dd |
#if defined (HAVE_CAIRO_FREETYPE)
|
|
Packit |
0ec9dd |
# include "pangocairo-fc.h"
|
|
Packit |
0ec9dd |
#endif
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
typedef PangoCairoFontMapIface PangoCairoFontMapInterface;
|
|
Packit |
0ec9dd |
G_DEFINE_INTERFACE (PangoCairoFontMap, pango_cairo_font_map, PANGO_TYPE_FONT_MAP)
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static void
|
|
Packit |
0ec9dd |
pango_cairo_font_map_default_init (PangoCairoFontMapIface *iface)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_cairo_font_map_new:
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Creates a new #PangoCairoFontMap object; a fontmap is used
|
|
Packit |
0ec9dd |
* to cache information about available fonts, and holds
|
|
Packit |
0ec9dd |
* certain global parameters such as the resolution.
|
|
Packit |
0ec9dd |
* In most cases, you can use pango_cairo_font_map_get_default()
|
|
Packit |
0ec9dd |
* instead.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Note that the type of the returned object will depend
|
|
Packit |
0ec9dd |
* on the particular font backend Cairo was compiled to use;
|
|
Packit |
0ec9dd |
* You generally should only use the #PangoFontMap and
|
|
Packit |
0ec9dd |
* #PangoCairoFontMap interfaces on the returned object.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* You can override the type of backend returned by using an
|
|
Packit |
0ec9dd |
* environment variable %PANGOCAIRO_BACKEND. Supported types,
|
|
Packit |
0ec9dd |
* based on your build, are fc (fontconfig), win32, and coretext.
|
|
Packit |
0ec9dd |
* If requested type is not available, NULL is returned. Ie.
|
|
Packit |
0ec9dd |
* this is only useful for testing, when at least two backends
|
|
Packit |
0ec9dd |
* are compiled in.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Return value: (transfer full): the newly allocated #PangoFontMap,
|
|
Packit |
0ec9dd |
* which should be freed with g_object_unref().
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.10
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
PangoFontMap *
|
|
Packit |
0ec9dd |
pango_cairo_font_map_new (void)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
const char *backend = getenv ("PANGOCAIRO_BACKEND");
|
|
Packit |
0ec9dd |
if (backend && !*backend)
|
|
Packit |
0ec9dd |
backend = NULL;
|
|
Packit |
0ec9dd |
#if !GLIB_CHECK_VERSION (2, 35, 3)
|
|
Packit |
0ec9dd |
/* Make sure that the type system is initialized */
|
|
Packit |
0ec9dd |
g_type_init ();
|
|
Packit |
0ec9dd |
#endif
|
|
Packit |
0ec9dd |
#if defined(HAVE_CORE_TEXT) && defined (HAVE_CAIRO_QUARTZ)
|
|
Packit |
0ec9dd |
if (!backend || 0 == strcmp (backend, "coretext"))
|
|
Packit |
0ec9dd |
return g_object_new (PANGO_TYPE_CAIRO_CORE_TEXT_FONT_MAP, NULL);
|
|
Packit |
0ec9dd |
#endif
|
|
Packit |
0ec9dd |
#if defined(HAVE_CAIRO_WIN32)
|
|
Packit |
0ec9dd |
if (!backend || 0 == strcmp (backend, "win32"))
|
|
Packit |
0ec9dd |
return g_object_new (PANGO_TYPE_CAIRO_WIN32_FONT_MAP, NULL);
|
|
Packit |
0ec9dd |
#endif
|
|
Packit |
0ec9dd |
#if defined(HAVE_CAIRO_FREETYPE)
|
|
Packit |
0ec9dd |
if (!backend || 0 == strcmp (backend, "fc")
|
|
Packit |
0ec9dd |
|| 0 == strcmp (backend, "fontconfig"))
|
|
Packit |
0ec9dd |
return g_object_new (PANGO_TYPE_CAIRO_FC_FONT_MAP, NULL);
|
|
Packit |
0ec9dd |
#endif
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
const char backends[] = ""
|
|
Packit |
0ec9dd |
#if defined(HAVE_CORE_TEXT) && defined (HAVE_CAIRO_QUARTZ)
|
|
Packit |
0ec9dd |
" coretext"
|
|
Packit |
0ec9dd |
#endif
|
|
Packit |
0ec9dd |
#if defined(HAVE_CAIRO_WIN32)
|
|
Packit |
0ec9dd |
" win32"
|
|
Packit |
0ec9dd |
#endif
|
|
Packit |
0ec9dd |
#if defined(HAVE_CAIRO_FREETYPE)
|
|
Packit |
0ec9dd |
" fontconfig"
|
|
Packit |
0ec9dd |
#endif
|
|
Packit |
0ec9dd |
;
|
|
Packit |
0ec9dd |
g_error ("Unknown $PANGOCAIRO_BACKEND value.\n Available backends are:%s", backends);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
return NULL;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_cairo_font_map_new_for_font_type:
|
|
Packit |
0ec9dd |
* @fonttype: desired #cairo_font_type_t
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Creates a new #PangoCairoFontMap object of the type suitable
|
|
Packit |
0ec9dd |
* to be used with cairo font backend of type @fonttype.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* In most cases one should simply use @pango_cairo_font_map_new(),
|
|
Packit |
0ec9dd |
* or in fact in most of those cases, just use
|
|
Packit |
0ec9dd |
* @pango_cairo_font_map_get_default().
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Return value: (transfer full) (nullable): the newly allocated
|
|
Packit |
0ec9dd |
* #PangoFontMap of suitable type which should be freed
|
|
Packit |
0ec9dd |
* with g_object_unref(), or %NULL if the requested
|
|
Packit |
0ec9dd |
* cairo font backend is not supported / compiled in.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.18
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
PangoFontMap *
|
|
Packit |
0ec9dd |
pango_cairo_font_map_new_for_font_type (cairo_font_type_t fonttype)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
#if !GLIB_CHECK_VERSION (2, 35, 3)
|
|
Packit |
0ec9dd |
/* Make sure that the type system is initialized */
|
|
Packit |
0ec9dd |
g_type_init ();
|
|
Packit |
0ec9dd |
#endif
|
|
Packit |
0ec9dd |
switch ((int) fonttype)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
#if defined(HAVE_CORE_TEXT) && defined (HAVE_CAIRO_QUARTZ)
|
|
Packit |
0ec9dd |
case CAIRO_FONT_TYPE_QUARTZ:
|
|
Packit |
0ec9dd |
return g_object_new (PANGO_TYPE_CAIRO_CORE_TEXT_FONT_MAP, NULL);
|
|
Packit |
0ec9dd |
#endif
|
|
Packit |
0ec9dd |
#if defined(HAVE_CAIRO_WIN32)
|
|
Packit |
0ec9dd |
case CAIRO_FONT_TYPE_WIN32:
|
|
Packit |
0ec9dd |
return g_object_new (PANGO_TYPE_CAIRO_WIN32_FONT_MAP, NULL);
|
|
Packit |
0ec9dd |
#endif
|
|
Packit |
0ec9dd |
#if defined(HAVE_CAIRO_FREETYPE)
|
|
Packit |
0ec9dd |
case CAIRO_FONT_TYPE_FT:
|
|
Packit |
0ec9dd |
return g_object_new (PANGO_TYPE_CAIRO_FC_FONT_MAP, NULL);
|
|
Packit |
0ec9dd |
#endif
|
|
Packit |
0ec9dd |
default:
|
|
Packit |
0ec9dd |
return NULL;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
static GPrivate default_font_map = G_PRIVATE_INIT (g_object_unref); /* MT-safe */
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_cairo_font_map_get_default:
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Gets a default #PangoCairoFontMap to use with Cairo.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Note that the type of the returned object will depend
|
|
Packit |
0ec9dd |
* on the particular font backend Cairo was compiled to use;
|
|
Packit |
0ec9dd |
* You generally should only use the #PangoFontMap and
|
|
Packit |
0ec9dd |
* #PangoCairoFontMap interfaces on the returned object.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* The default Cairo fontmap can be changed by using
|
|
Packit |
0ec9dd |
* pango_cairo_font_map_set_default(). This can be used to
|
|
Packit |
0ec9dd |
* change the Cairo font backend that the default fontmap
|
|
Packit |
0ec9dd |
* uses for example.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Note that since Pango 1.32.6, the default fontmap is per-thread.
|
|
Packit |
0ec9dd |
* Each thread gets its own default fontmap. In this way,
|
|
Packit |
0ec9dd |
* PangoCairo can be used safely from multiple threads.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Return value: (transfer none): the default PangoCairo fontmap
|
|
Packit |
0ec9dd |
* for the current thread. This object is owned by Pango and must not be freed.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.10
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
PangoFontMap *
|
|
Packit |
0ec9dd |
pango_cairo_font_map_get_default (void)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
PangoFontMap *fontmap = g_private_get (&default_font_map);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (G_UNLIKELY (!fontmap))
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
fontmap = pango_cairo_font_map_new ();
|
|
Packit |
0ec9dd |
g_private_replace (&default_font_map, fontmap);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
return fontmap;
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_cairo_font_map_set_default:
|
|
Packit |
0ec9dd |
* @fontmap: (nullable): The new default font map, or %NULL
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Sets a default #PangoCairoFontMap to use with Cairo.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* This can be used to change the Cairo font backend that the
|
|
Packit |
0ec9dd |
* default fontmap uses for example. The old default font map
|
|
Packit |
0ec9dd |
* is unreffed and the new font map referenced.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Note that since Pango 1.32.6, the default fontmap is per-thread.
|
|
Packit |
0ec9dd |
* This function only changes the default fontmap for
|
|
Packit |
0ec9dd |
* the current thread. Default fontmaps of exisiting threads
|
|
Packit |
0ec9dd |
* are not changed. Default fontmaps of any new threads will
|
|
Packit |
0ec9dd |
* still be created using pango_cairo_font_map_new().
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* A value of %NULL for @fontmap will cause the current default
|
|
Packit |
0ec9dd |
* font map to be released and a new default font
|
|
Packit |
0ec9dd |
* map to be created on demand, using pango_cairo_font_map_new().
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.22
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
void
|
|
Packit |
0ec9dd |
pango_cairo_font_map_set_default (PangoCairoFontMap *fontmap)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
g_return_if_fail (fontmap == NULL || PANGO_IS_CAIRO_FONT_MAP (fontmap));
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
if (fontmap)
|
|
Packit |
0ec9dd |
g_object_ref (fontmap);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
g_private_replace (&default_font_map, fontmap);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_cairo_font_map_set_resolution:
|
|
Packit |
0ec9dd |
* @fontmap: a #PangoCairoFontMap
|
|
Packit |
0ec9dd |
* @dpi: the resolution in "dots per inch". (Physical inches aren't actually
|
|
Packit |
0ec9dd |
* involved; the terminology is conventional.)
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Sets the resolution for the fontmap. This is a scale factor between
|
|
Packit |
0ec9dd |
* points specified in a #PangoFontDescription and Cairo units. The
|
|
Packit |
0ec9dd |
* default value is 96, meaning that a 10 point font will be 13
|
|
Packit |
0ec9dd |
* units high. (10 * 96. / 72. = 13.3).
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.10
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
void
|
|
Packit |
0ec9dd |
pango_cairo_font_map_set_resolution (PangoCairoFontMap *fontmap,
|
|
Packit |
0ec9dd |
double dpi)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
g_return_if_fail (PANGO_IS_CAIRO_FONT_MAP (fontmap));
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
(* PANGO_CAIRO_FONT_MAP_GET_IFACE (fontmap)->set_resolution) (fontmap, dpi);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_cairo_font_map_get_resolution:
|
|
Packit |
0ec9dd |
* @fontmap: a #PangoCairoFontMap
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Gets the resolution for the fontmap. See pango_cairo_font_map_set_resolution()
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Return value: the resolution in "dots per inch"
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.10
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
double
|
|
Packit |
0ec9dd |
pango_cairo_font_map_get_resolution (PangoCairoFontMap *fontmap)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
g_return_val_if_fail (PANGO_IS_CAIRO_FONT_MAP (fontmap), 96.);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
return (* PANGO_CAIRO_FONT_MAP_GET_IFACE (fontmap)->get_resolution) (fontmap);
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_cairo_font_map_create_context: (skip)
|
|
Packit |
0ec9dd |
* @fontmap: a #PangoCairoFontMap
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Create a #PangoContext for the given fontmap.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Return value: the newly created context; free with g_object_unref().
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.10
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Deprecated: 1.22: Use pango_font_map_create_context() instead.
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
PangoContext *
|
|
Packit |
0ec9dd |
pango_cairo_font_map_create_context (PangoCairoFontMap *fontmap)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
g_return_val_if_fail (PANGO_IS_CAIRO_FONT_MAP (fontmap), NULL);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
return pango_font_map_create_context (PANGO_FONT_MAP (fontmap));
|
|
Packit |
0ec9dd |
}
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
/**
|
|
Packit |
0ec9dd |
* pango_cairo_font_map_get_font_type:
|
|
Packit |
0ec9dd |
* @fontmap: a #PangoCairoFontMap
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Gets the type of Cairo font backend that @fontmap uses.
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Return value: the #cairo_font_type_t cairo font backend type
|
|
Packit |
0ec9dd |
*
|
|
Packit |
0ec9dd |
* Since: 1.18
|
|
Packit |
0ec9dd |
**/
|
|
Packit |
0ec9dd |
cairo_font_type_t
|
|
Packit |
0ec9dd |
pango_cairo_font_map_get_font_type (PangoCairoFontMap *fontmap)
|
|
Packit |
0ec9dd |
{
|
|
Packit |
0ec9dd |
g_return_val_if_fail (PANGO_IS_CAIRO_FONT_MAP (fontmap), CAIRO_FONT_TYPE_TOY);
|
|
Packit |
0ec9dd |
|
|
Packit |
0ec9dd |
return (* PANGO_CAIRO_FONT_MAP_GET_IFACE (fontmap)->get_font_type) (fontmap);
|
|
Packit |
0ec9dd |
}
|