diff options
| author | Kenichi Handa | 2006-06-19 12:36:58 +0000 |
|---|---|---|
| committer | Kenichi Handa | 2006-06-19 12:36:58 +0000 |
| commit | 63565713ad24051f6a1d4422863a7921cedc8f27 (patch) | |
| tree | e7500812c65c5a54f81fa2e5964971e2db220170 /src | |
| parent | 377a2e5cd6391c79ddc28758599f05c5efdc2fb4 (diff) | |
| download | emacs-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.c | 51 |
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); |