aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKenichi Handa2006-06-19 12:36:58 +0000
committerKenichi Handa2006-06-19 12:36:58 +0000
commit63565713ad24051f6a1d4422863a7921cedc8f27 (patch)
treee7500812c65c5a54f81fa2e5964971e2db220170 /src
parent377a2e5cd6391c79ddc28758599f05c5efdc2fb4 (diff)
downloademacs-63565713ad24051f6a1d4422863a7921cedc8f27.tar.gz
emacs-63565713ad24051f6a1d4422863a7921cedc8f27.zip
(ftfont_list): Use assq_no_quit, not Fassq. Don't
include weight in listing pattern, instead check weight of each listed font. Don't include scalable in pattern. Pay attention to FONT_PIXEL_SIZE_QUANTUM.
Diffstat (limited to 'src')
-rw-r--r--src/ftfont.c51
1 files changed, 31 insertions, 20 deletions
diff --git a/src/ftfont.c b/src/ftfont.c
index b7f3ea0b236..c5da03529e5 100644
--- a/src/ftfont.c
+++ b/src/ftfont.c
@@ -311,6 +311,7 @@ ftfont_list (frame, spec)
311 FcFontSet *fontset = NULL; 311 FcFontSet *fontset = NULL;
312 FcObjectSet *objset = NULL; 312 FcObjectSet *objset = NULL;
313 Lisp_Object registry = Qunicode_bmp; 313 Lisp_Object registry = Qunicode_bmp;
314 int weight = 0;
314 315
315 val = null_vector; 316 val = null_vector;
316 317
@@ -320,8 +321,14 @@ ftfont_list (frame, spec)
320 fc_initialized = 1; 321 fc_initialized = 1;
321 } 322 }
322 323
323 if (! NILP (AREF (spec, FONT_ADSTYLE_INDEX))) 324 if (! NILP (AREF (spec, FONT_ADSTYLE_INDEX))
325 && ! EQ (AREF (spec, FONT_ADSTYLE_INDEX), null_string))
324 return val; 326 return val;
327 if (! NILP (AREF (spec, FONT_SLANT_INDEX))
328 && XINT (AREF (spec, FONT_SLANT_INDEX)) < 100)
329 /* Fontconfig doesn't support reverse-italic/obligue. */
330 return val;
331
325 if (! NILP (AREF (spec, FONT_REGISTRY_INDEX))) 332 if (! NILP (AREF (spec, FONT_REGISTRY_INDEX)))
326 { 333 {
327 registry = AREF (spec, FONT_REGISTRY_INDEX); 334 registry = AREF (spec, FONT_REGISTRY_INDEX);
@@ -340,10 +347,10 @@ ftfont_list (frame, spec)
340 font_name = Qnil; 347 font_name = Qnil;
341 if (CONSP (extra)) 348 if (CONSP (extra))
342 { 349 {
343 tmp = Fassq (QCotf, extra); 350 tmp = assq_no_quit (QCotf, extra);
344 if (! NILP (tmp)) 351 if (! NILP (tmp))
345 return val; 352 return val;
346 tmp = Fassq (QClanguage, extra); 353 tmp = assq_no_quit (QClanguage, extra);
347 if (CONSP (tmp)) 354 if (CONSP (tmp))
348 { 355 {
349 langset = FcLangSetCreate (); 356 langset = FcLangSetCreate ();
@@ -367,7 +374,7 @@ ftfont_list (frame, spec)
367 tmp = Fassq (QCname, extra); 374 tmp = Fassq (QCname, extra);
368 if (CONSP (tmp)) 375 if (CONSP (tmp))
369 font_name = XCDR (tmp); 376 font_name = XCDR (tmp);
370 tmp = Fassq (QCscript, extra); 377 tmp = assq_no_quit (QCscript, extra);
371 if (CONSP (tmp) && ! charset) 378 if (CONSP (tmp) && ! charset)
372 { 379 {
373 Lisp_Object script = XCDR (tmp); 380 Lisp_Object script = XCDR (tmp);
@@ -388,13 +395,7 @@ ftfont_list (frame, spec)
388 } 395 }
389 396
390 if (STRINGP (font_name)) 397 if (STRINGP (font_name))
391 { 398 pattern = FcNameParse (SDATA (font_name));
392 pattern = FcNameParse (SDATA (font_name));
393 /* Ignore these values in listing. */
394 FcPatternDel (pattern, FC_PIXEL_SIZE);
395 FcPatternDel (pattern, FC_SIZE);
396 FcPatternDel (pattern, FC_FAMILY);
397 }
398 else 399 else
399 pattern = FcPatternCreate (); 400 pattern = FcPatternCreate ();
400 if (! pattern) 401 if (! pattern)
@@ -408,23 +409,20 @@ ftfont_list (frame, spec)
408 if (SYMBOLP (tmp) && ! NILP (tmp) 409 if (SYMBOLP (tmp) && ! NILP (tmp)
409 && ! FcPatternAddString (pattern, FC_FAMILY, SYMBOL_FcChar8 (tmp))) 410 && ! FcPatternAddString (pattern, FC_FAMILY, SYMBOL_FcChar8 (tmp)))
410 goto err; 411 goto err;
412 /* Emacs conventionally doesn't distinguish normal, regular, and
413 medium weight, but fontconfig does. So, we can't restrict font
414 listing by weight. We check it after getting a list. */
411 tmp = AREF (spec, FONT_WEIGHT_INDEX); 415 tmp = AREF (spec, FONT_WEIGHT_INDEX);
412 if (INTEGERP (tmp) 416 if (INTEGERP (tmp))
413 && ! FcPatternAddInteger (pattern, FC_WEIGHT, XINT (tmp))) 417 weight = XINT (tmp);
414 goto err;
415 tmp = AREF (spec, FONT_SLANT_INDEX); 418 tmp = AREF (spec, FONT_SLANT_INDEX);
416 if (INTEGERP (tmp) 419 if (INTEGERP (tmp)
417 && XINT (tmp) >= 100
418 && ! FcPatternAddInteger (pattern, FC_SLANT, XINT (tmp) - 100)) 420 && ! FcPatternAddInteger (pattern, FC_SLANT, XINT (tmp) - 100))
419 goto err; 421 goto err;
420 tmp = AREF (spec, FONT_WIDTH_INDEX); 422 tmp = AREF (spec, FONT_WIDTH_INDEX);
421 if (INTEGERP (tmp) 423 if (INTEGERP (tmp)
422 && ! FcPatternAddInteger (pattern, FC_WIDTH, XINT (tmp))) 424 && ! FcPatternAddInteger (pattern, FC_WIDTH, XINT (tmp)))
423 goto err; 425 goto err;
424#if 0
425 if (! FcPatternAddBool (pattern, FC_SCALABLE, FcTrue))
426 goto err;
427#endif
428 426
429 if (charset 427 if (charset
430 && ! FcPatternAddCharSet (pattern, FC_CHARSET, charset)) 428 && ! FcPatternAddCharSet (pattern, FC_CHARSET, charset))
@@ -462,7 +460,20 @@ ftfont_list (frame, spec)
462 460
463 if (FcPatternGetDouble (fontset->fonts[i], FC_PIXEL_SIZE, 0, 461 if (FcPatternGetDouble (fontset->fonts[i], FC_PIXEL_SIZE, 0,
464 &this) == FcResultMatch 462 &this) == FcResultMatch
465 && this != pixel_size) 463 && ((this < pixel_size - FONT_PIXEL_SIZE_QUANTUM)
464 || (this > pixel_size + FONT_PIXEL_SIZE_QUANTUM)))
465 continue;
466 }
467 if (weight > 0)
468 {
469 int this;
470
471 if (FcPatternGetInteger (fontset->fonts[i], FC_WEIGHT, 0,
472 &this) != FcResultMatch
473 || (this != weight
474 && (weight != 100
475 || this < FC_WEIGHT_REGULAR
476 || this > FC_WEIGHT_MEDIUM)))
466 continue; 477 continue;
467 } 478 }
468 entity = ftfont_pattern_entity (fontset->fonts[i], frame, registry); 479 entity = ftfont_pattern_entity (fontset->fonts[i], frame, registry);