[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/src/ftfont.c,v
From: |
Kenichi Handa |
Subject: |
[Emacs-diffs] Changes to emacs/src/ftfont.c,v |
Date: |
Thu, 22 May 2008 02:26:51 +0000 |
CVSROOT: /cvsroot/emacs
Module name: emacs
Changes by: Kenichi Handa <handa> 08/05/22 02:26:51
Index: ftfont.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/ftfont.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- ftfont.c 19 May 2008 07:21:25 -0000 1.13
+++ ftfont.c 22 May 2008 02:26:51 -0000 1.14
@@ -70,7 +70,7 @@
static Lisp_Object ftfont_pattern_entity P_ ((FcPattern *, Lisp_Object, int));
-static Lisp_Object ftfont_list_generic_family P_ ((Lisp_Object));
+static Lisp_Object ftfont_resolve_generic_family P_ ((Lisp_Object));
Lisp_Object ftfont_font_format P_ ((FcPattern *));
#define SYMBOL_FcChar8(SYM) (FcChar8 *) SDATA (SYMBOL_NAME (SYM))
@@ -192,16 +192,14 @@
static Lisp_Object ftfont_generic_family_list;
static Lisp_Object
-ftfont_list_generic_family (family)
+ftfont_resolve_generic_family (family)
Lisp_Object family;
{
- Lisp_Object slot, list;
- FcObjectSet *objset = NULL;
- FcPattern *pattern = NULL, *pat = NULL;
- FcFontSet *fontset = NULL;
- FcChar8 *fam;
- int i;
+ Lisp_Object slot;
+ FcPattern *pattern = NULL, *match;
+ FcResult result;
+ family = Fintern (Fdowncase (SYMBOL_NAME (family)), Qnil);
if (EQ (family, Qmono))
family = Qmonospace;
else if (EQ (family, Qsans) || EQ (family, Qsans__serif))
@@ -209,45 +207,29 @@
slot = assq_no_quit (family, ftfont_generic_family_list);
if (! CONSP (slot))
return Qnil;
- list = XCDR (slot);
- if (! EQ (list, Qt))
- return list;
-
- objset = FcObjectSetBuild (FC_FAMILY, NULL);
- if (! objset)
- goto err;
+ if (! EQ (XCDR (slot), Qt))
+ return XCDR (slot);
pattern = FcPatternBuild (NULL, FC_FAMILY, FcTypeString,
SYMBOL_FcChar8 (family), (char *) 0);
if (! pattern)
goto err;
- pat = FcPatternCreate ();
- if (! pat)
- goto err;
FcConfigSubstitute (NULL, pattern, FcMatchPattern);
- for (i = 0, list = Qnil;
- FcPatternGetString (pattern, FC_FAMILY, i, &fam) == FcResultMatch;
- i++)
+ FcDefaultSubstitute (pattern);
+ match = FcFontMatch (NULL, pattern, &result);
+ if (match)
{
- if (strcmp ((char *) fam, (char *) SYMBOL_FcChar8 (family)) == 0)
- continue;
- if (! FcPatternAddString (pat, FC_FAMILY, fam))
- goto err;
- fontset = FcFontList (NULL, pat, objset);
- if (! fontset)
- goto err;
- if (fontset->nfont > 0)
- list = Fcons (intern ((char *) fam), list);
- FcFontSetDestroy (fontset);
- fontset = NULL;
- FcPatternDel (pat, FC_FAMILY);
+ FcChar8 *fam;
+
+ if (FcPatternGetString (match, FC_FAMILY, 0, &fam) == FcResultMatch)
+ family = intern ((char *) fam);
}
- XSETCDR (slot, list);
+ else
+ family = Qnil;
+ XSETCDR (slot, family);
err:
- if (pat) FcPatternDestroy (pat);
+ if (match) FcPatternDestroy (match);
if (pattern) FcPatternDestroy (pattern);
- if (fontset) FcFontSetDestroy (fontset);
- if (objset) FcObjectSetDestroy (objset);
- return list;
+ return family;
}
Lisp_Object
@@ -588,10 +570,16 @@
goto err;
FcPatternDel (pattern, FC_SIZE);
FcPatternDel (pattern, FC_PIXEL_SIZE);
+ FcPatternDel (pattern, FC_FOUNDRY);
+ FcPatternDel (pattern, FC_FAMILY);
tmp = AREF (spec, FONT_FOUNDRY_INDEX);
if (! NILP (tmp)
&& ! FcPatternAddString (pattern, FC_FOUNDRY, SYMBOL_FcChar8 (tmp)))
goto err;
+ tmp = AREF (spec, FONT_FAMILY_INDEX);
+ if (! NILP (tmp)
+ && ! FcPatternAddString (pattern, FC_FAMILY, SYMBOL_FcChar8 (tmp)))
+ goto err;
if (charset
&& ! FcPatternAddCharSet (pattern, FC_CHARSET, charset))
goto err;
@@ -636,7 +624,7 @@
ftfont_list (frame, spec)
Lisp_Object frame, spec;
{
- Lisp_Object val, registry, family, family_list;
+ Lisp_Object val = Qnil, registry, family;
int i;
FcPattern *pattern;
FcFontSet *fontset = NULL;
@@ -654,6 +642,22 @@
pattern = ftfont_spec_pattern (spec, &fc_charset_idx, otlayout, &otspec);
if (! pattern)
return Qnil;
+ registry = AREF (spec, FONT_REGISTRY_INDEX);
+ family = AREF (spec, FONT_FAMILY_INDEX);
+ if (! NILP (family))
+ {
+ Lisp_Object resolved;
+
+ resolved = ftfont_resolve_generic_family (family);
+ if (! NILP (resolved))
+ {
+ FcPatternDel (pattern, FC_FAMILY);
+ if (! FcPatternAddString (pattern, FC_FAMILY,
+ SYMBOL_FcChar8 (resolved)))
+ goto err;
+ }
+ }
+
objset = FcObjectSetBuild (FC_FOUNDRY, FC_FAMILY, FC_WEIGHT, FC_SLANT,
FC_WIDTH, FC_PIXEL_SIZE, FC_SPACING, FC_SCALABLE,
FC_CHARSET, FC_FILE,
@@ -664,27 +668,6 @@
if (! objset)
goto err;
- registry = AREF (spec, FONT_REGISTRY_INDEX);
- family = AREF (spec, FONT_FAMILY_INDEX);
- if (NILP (family))
- family_list = Fcons (Qnil, Qnil);
- else
- {
- family = Fintern (Fdowncase (SYMBOL_NAME (family)), Qnil);
- family_list = ftfont_list_generic_family (family);
- if (NILP (family_list))
- family_list = Fcons (family, Qnil);
- }
-
- for (val = Qnil; CONSP (family_list); family_list = XCDR (family_list))
- {
- family = XCAR (family_list);
- if (! NILP (family))
- {
- FcPatternDel (pattern, FC_FAMILY);
- if (! FcPatternAddString (pattern, FC_FAMILY, SYMBOL_FcChar8
(family)))
- goto err;
- }
fontset = FcFontList (NULL, pattern, objset);
if (! fontset)
goto err;
@@ -731,9 +714,7 @@
if (! NILP (entity))
val = Fcons (entity, val);
}
- FcFontSetDestroy (fontset);
- fontset = NULL;
- }
+ font_add_log ("ftfont-list", spec, val);
goto finish;
err:
@@ -795,6 +776,7 @@
}
FcPatternDestroy (pattern);
+ font_add_log ("ftfont-match", spec, entity);
return entity;
}
- [Emacs-diffs] Changes to emacs/src/ftfont.c,v, Kenichi Handa, 2008/05/13
- [Emacs-diffs] Changes to emacs/src/ftfont.c,v, Glenn Morris, 2008/05/14
- [Emacs-diffs] Changes to emacs/src/ftfont.c,v, Kenichi Handa, 2008/05/15
- [Emacs-diffs] Changes to emacs/src/ftfont.c,v, Kenichi Handa, 2008/05/19
- [Emacs-diffs] Changes to emacs/src/ftfont.c,v,
Kenichi Handa <=
- [Emacs-diffs] Changes to emacs/src/ftfont.c,v, Kenichi Handa, 2008/05/22
- [Emacs-diffs] Changes to emacs/src/ftfont.c,v, Kenichi Handa, 2008/05/28
- [Emacs-diffs] Changes to emacs/src/ftfont.c,v, Kenichi Handa, 2008/05/30