Blame pango/pangocairo-fontmap.c

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
}