⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pangoft2.c

📁 GTK+-2.0源码之pango-1.15.6.tar.gz
💻 C
📖 第 1 页 / 共 2 页
字号:
/* Pango * pangoft2.c: Routines for handling FreeType2 fonts * * Copyright (C) 1999 Red Hat Software * Copyright (C) 2000 Tor Lillqvist * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library 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 <config.h>#include <string.h>#include <stdlib.h>#include <math.h>#include <glib.h>#include <glib/gprintf.h>#include "pangoft2.h"#include "pangoft2-private.h"#include "pangofc-fontmap.h"#include "pangofc-private.h"PangoFT2WarningHistory _pango_ft2_warning_history = { FALSE };/* for compatibility with older freetype versions */#ifndef FT_LOAD_TARGET_MONO#define FT_LOAD_TARGET_MONO  FT_LOAD_MONOCHROME#endif#define PANGO_FT2_FONT_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass), PANGO_TYPE_FT2_FONT, PangoFT2FontClass))#define PANGO_FT2_IS_FONT_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), PANGO_TYPE_FT2_FONT))#define PANGO_FT2_FONT_GET_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS ((obj), PANGO_TYPE_FT2_FONT, PangoFT2FontClass))typedef struct _PangoFT2FontClass   PangoFT2FontClass;struct _PangoFT2FontClass{  PangoFcFontClass parent_class;};static void pango_ft2_font_finalize   (GObject         *object);static void                   pango_ft2_font_get_glyph_extents (PangoFont      *font,								PangoGlyph      glyph,								PangoRectangle *ink_rect,								PangoRectangle *logical_rect);static FT_Face    pango_ft2_font_real_lock_face         (PangoFcFont      *font);static void       pango_ft2_font_real_unlock_face       (PangoFcFont      *font);PangoFT2Font *_pango_ft2_font_new (PangoFT2FontMap *ft2fontmap,		     FcPattern       *pattern){  PangoFontMap *fontmap = PANGO_FONT_MAP (ft2fontmap);  PangoFT2Font *ft2font;  double d;  g_return_val_if_fail (fontmap != NULL, NULL);  g_return_val_if_fail (pattern != NULL, NULL);  ft2font = (PangoFT2Font *)g_object_new (PANGO_TYPE_FT2_FONT,					  "pattern", pattern,					  NULL);  if (FcPatternGetDouble (pattern, FC_PIXEL_SIZE, 0, &d) == FcResultMatch)    ft2font->size = d*PANGO_SCALE;  return ft2font;}static voidload_fallback_face (PangoFT2Font *ft2font,		    const char   *original_file){  PangoFcFont *fcfont = PANGO_FC_FONT (ft2font);  FcPattern *sans;  FcPattern *matched;  FcResult result;  FT_Error error;  FcChar8 *filename2 = NULL;  gchar *name;  int id;  sans = FcPatternBuild (NULL,			 FC_FAMILY,     FcTypeString, "sans",			 FC_PIXEL_SIZE, FcTypeDouble, (double)ft2font->size / PANGO_SCALE,			 NULL);  _pango_ft2_font_map_default_substitute (fcfont->fontmap, sans);  matched = FcFontMatch (NULL, sans, &result);  if (FcPatternGetString (matched, FC_FILE, 0, &filename2) != FcResultMatch)    goto bail1;  if (FcPatternGetInteger (matched, FC_INDEX, 0, &id) != FcResultMatch)    goto bail1;  error = FT_New_Face (_pango_ft2_font_map_get_library (fcfont->fontmap),		       (char *) filename2, id, &ft2font->face);  if (error)    {    bail1:      name = pango_font_description_to_string (fcfont->description);      g_warning ("Unable to open font file %s for font %s, exiting\n", filename2, name);      exit (1);    }  else    {      name = pango_font_description_to_string (fcfont->description);      g_warning ("Unable to open font file %s for font %s, falling back to %s\n", original_file, name, filename2);      g_free (name);    }  FcPatternDestroy (sans);  FcPatternDestroy (matched);}static voidset_transform (PangoFT2Font *ft2font){  PangoFcFont *fcfont = (PangoFcFont *)ft2font;  FcMatrix *fc_matrix;  if (FcPatternGetMatrix (fcfont->font_pattern, FC_MATRIX, 0, &fc_matrix) == FcResultMatch)    {      FT_Matrix ft_matrix;      ft_matrix.xx = 0x10000L * fc_matrix->xx;      ft_matrix.yy = 0x10000L * fc_matrix->yy;      ft_matrix.xy = 0x10000L * fc_matrix->xy;      ft_matrix.yx = 0x10000L * fc_matrix->yx;      FT_Set_Transform (ft2font->face, &ft_matrix, NULL);    }}/** * pango_ft2_font_get_face: * @font: a #PangoFont * * Returns the native FreeType2 <type>FT_Face</type> structure used for this #PangoFont. * This may be useful if you want to use FreeType2 functions directly. * * Use pango_fc_font_lock_face() instead; when you are done with a * face from pango_fc_font_lock_face() you must call * pango_fc_font_unlock_face(). * * Return value: a pointer to a <type>FT_Face</type> structure, with the size set correctly **/FT_Facepango_ft2_font_get_face (PangoFont *font){  PangoFT2Font *ft2font = (PangoFT2Font *)font;  PangoFcFont *fcfont = (PangoFcFont *)font;  FT_Error error;  FcPattern *pattern;  FcChar8 *filename;  FcBool antialias, hinting, autohint;  int hintstyle;  int id;  if (G_UNLIKELY (!PANGO_FT2_IS_FONT (font)))    {      if (!_pango_ft2_warning_history.get_face)	{	  _pango_ft2_warning_history.get_face = TRUE;	  g_warning ("pango_ft2_font_get_face called with bad font, expect ugly output");	}      return NULL;    }  pattern = fcfont->font_pattern;  if (!ft2font->face)    {      ft2font->load_flags = 0;      /* disable antialiasing if requested */      if (FcPatternGetBool (pattern,			    FC_ANTIALIAS, 0, &antialias) != FcResultMatch)	antialias = FcTrue;      if (antialias)	ft2font->load_flags |= FT_LOAD_NO_BITMAP;      else	ft2font->load_flags |= FT_LOAD_TARGET_MONO;      /* disable hinting if requested */      if (FcPatternGetBool (pattern,			    FC_HINTING, 0, &hinting) != FcResultMatch)	hinting = FcTrue;#ifdef FC_HINT_STYLE      if (FcPatternGetInteger (pattern, FC_HINT_STYLE, 0, &hintstyle) != FcResultMatch)	hintstyle = FC_HINT_FULL;      if (!hinting || hintstyle == FC_HINT_NONE)          ft2font->load_flags |= FT_LOAD_NO_HINTING;            switch (hintstyle) {      case FC_HINT_SLIGHT:      case FC_HINT_MEDIUM:	ft2font->load_flags |= FT_LOAD_TARGET_LIGHT;	break;      default:	ft2font->load_flags |= FT_LOAD_TARGET_NORMAL;	break;      }#else      if (!hinting)          ft2font->load_flags |= FT_LOAD_NO_HINTING;#endif      /* force autohinting if requested */      if (FcPatternGetBool (pattern,			    FC_AUTOHINT, 0, &autohint) != FcResultMatch)	autohint = FcFalse;      if (autohint)	ft2font->load_flags |= FT_LOAD_FORCE_AUTOHINT;      if (FcPatternGetString (pattern, FC_FILE, 0, &filename) != FcResultMatch)	      goto bail0;      if (FcPatternGetInteger (pattern, FC_INDEX, 0, &id) != FcResultMatch)	      goto bail0;      error = FT_New_Face (_pango_ft2_font_map_get_library (fcfont->fontmap),			   (char *) filename, id, &ft2font->face);      if (error != FT_Err_Ok)	{	bail0:	  load_fallback_face (ft2font, filename);	}      g_assert (ft2font->face);      set_transform (ft2font);      error = FT_Set_Char_Size (ft2font->face,				PANGO_PIXELS_26_6 (ft2font->size),				PANGO_PIXELS_26_6 (ft2font->size),				0, 0);      if (error)	g_warning ("Error in FT_Set_Char_Size: %d", error);    }  return ft2font->face;}G_DEFINE_TYPE (PangoFT2Font, pango_ft2_font, PANGO_TYPE_FC_FONT)static voidpango_ft2_font_init (PangoFT2Font *ft2font){  ft2font->face = NULL;  ft2font->size = 0;  ft2font->glyph_info = g_hash_table_new (NULL, NULL);}static voidpango_ft2_font_class_init (PangoFT2FontClass *class){  GObjectClass *object_class = G_OBJECT_CLASS (class);  PangoFontClass *font_class = PANGO_FONT_CLASS (class);  PangoFcFontClass *fc_font_class = PANGO_FC_FONT_CLASS (class);  object_class->finalize = pango_ft2_font_finalize;  font_class->get_glyph_extents = pango_ft2_font_get_glyph_extents;  fc_font_class->lock_face = pango_ft2_font_real_lock_face;  fc_font_class->unlock_face = pango_ft2_font_real_unlock_face;}static PangoFT2GlyphInfo *pango_ft2_font_get_glyph_info (PangoFont   *font,			       PangoGlyph   glyph,			       gboolean     create){  PangoFT2Font *ft2font = (PangoFT2Font *)font;  PangoFcFont *fcfont = (PangoFcFont *)font;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -