summaryrefslogtreecommitdiff
path: root/src/ftfont.c
diff options
context:
space:
mode:
authorKenichi Handa <handa@m17n.org>2008-09-01 02:46:23 +0000
committerKenichi Handa <handa@m17n.org>2008-09-01 02:46:23 +0000
commit7c4bd58d241ab919f53f68def81eb2d43702e387 (patch)
tree242152d31da9095ece83b537e64c13ba697ec638 /src/ftfont.c
parentc3bb7671dee2ecc0de64b740c7e70535ff65c971 (diff)
downloademacs-7c4bd58d241ab919f53f68def81eb2d43702e387.tar.gz
emacs-7c4bd58d241ab919f53f68def81eb2d43702e387.tar.bz2
emacs-7c4bd58d241ab919f53f68def81eb2d43702e387.zip
(ftfont_spec_pattern): Don't create a charset of the
representative chars of the script is a vector. (ftfont_list): Handle the case the representative chars of the script is a vector.
Diffstat (limited to 'src/ftfont.c')
-rw-r--r--src/ftfont.c43
1 files changed, 37 insertions, 6 deletions
diff --git a/src/ftfont.c b/src/ftfont.c
index 0b4b733dbf9..a6637fe1287 100644
--- a/src/ftfont.c
+++ b/src/ftfont.c
@@ -673,7 +673,7 @@ ftfont_spec_pattern (spec, otlayout, otspec)
{
Lisp_Object chars = assq_no_quit (script, Vscript_representative_chars);
- if (CONSP (chars))
+ if (CONSP (chars) && CONSP (CDR (chars)))
{
charset = FcCharSetCreate ();
if (! charset)
@@ -744,6 +744,9 @@ ftfont_list (frame, spec)
FcPattern *pattern;
FcFontSet *fontset = NULL;
FcObjectSet *objset = NULL;
+ FcCharSet *charset;
+ Lisp_Object chars = Qnil;
+ FcResult result;
char otlayout[15]; /* For "otlayout:XXXX" */
struct OpenTypeSpec *otspec = NULL;
int spacing = -1;
@@ -757,6 +760,17 @@ ftfont_list (frame, spec)
pattern = ftfont_spec_pattern (spec, otlayout, &otspec);
if (! pattern)
return Qnil;
+ if (FcPatternGetCharSet (pattern, FC_CHARSET, 0, &charset) != FcResultMatch)
+ {
+ val = assq_no_quit (QCscript, AREF (spec, FONT_EXTRA_INDEX));
+ if (! NILP (val))
+ {
+ val = assq_no_quit (XCDR (val), Vscript_representative_chars);
+ if (CONSP (val) && VECTORP (XCDR (val)))
+ chars = XCDR (val);
+ }
+ val = Qnil;
+ }
if (INTEGERP (AREF (spec, FONT_SPACING_INDEX)))
spacing = XINT (AREF (spec, FONT_SPACING_INDEX));
family = AREF (spec, FONT_FAMILY_INDEX);
@@ -786,10 +800,12 @@ ftfont_list (frame, spec)
NULL);
if (! objset)
goto err;
+ if (! NILP (chars))
+ FcObjectSetAdd (objset, FC_CHARSET);
fontset = FcFontList (NULL, pattern, objset);
- if (! fontset)
- goto err;
+ if (! fontset || fontset->nfont == 0)
+ goto finish;
#if 0
/* Need fix because this finds any fonts. */
if (fontset->nfont == 0 && ! NILP (family))
@@ -836,8 +852,8 @@ ftfont_list (frame, spec)
{
FcChar8 *this;
- if (FcPatternGetString (fontset->fonts[i], FC_CAPABILITY, 0,
- &this) != FcResultMatch
+ if (FcPatternGetString (fontset->fonts[i], FC_CAPABILITY, 0, &this)
+ != FcResultMatch
|| ! strstr ((char *) this, otlayout))
continue;
}
@@ -865,12 +881,26 @@ ftfont_list (frame, spec)
continue;
}
#endif /* HAVE_LIBOTF */
+ if (VECTORP (chars))
+ {
+ int j;
+
+ if (FcPatternGetCharSet (fontset->fonts[i], FC_CHARSET, 0, &charset)
+ != FcResultMatch)
+ continue;
+ for (j = 0; j < ASIZE (chars); j++)
+ if (NATNUMP (AREF (chars, j))
+ && FcCharSetHasChar (charset, XFASTINT (AREF (chars, j))))
+ break;
+ if (j == ASIZE (chars))
+ continue;
+ }
entity = ftfont_pattern_entity (fontset->fonts[i],
AREF (spec, FONT_EXTRA_INDEX));
if (! NILP (entity))
val = Fcons (entity, val);
}
- font_add_log ("ftfont-list", spec, val);
+ val = Fnreverse (val);
goto finish;
err:
@@ -879,6 +909,7 @@ ftfont_list (frame, spec)
val = Qnil;
finish:
+ font_add_log ("ftfont-list", spec, val);
if (objset) FcObjectSetDestroy (objset);
if (fontset) FcFontSetDestroy (fontset);
if (pattern) FcPatternDestroy (pattern);