diff options
| author | Kenichi Handa | 2006-06-14 00:42:04 +0000 |
|---|---|---|
| committer | Kenichi Handa | 2006-06-14 00:42:04 +0000 |
| commit | 4485a28ee55d2d75f777c35a5e879245fa16227d (patch) | |
| tree | b42d55e9c77e012e89c4c6821be1db9dec58835d /src | |
| parent | f0365b6f1dfc4fae478d0be768526741d795dfd8 (diff) | |
| download | emacs-4485a28ee55d2d75f777c35a5e879245fa16227d.tar.gz emacs-4485a28ee55d2d75f777c35a5e879245fa16227d.zip | |
(enum xlfd_field_index): Rename XLFD_XXX_SIZE_INDEX to
XLFD_XXX_INDEX.
(enum xlfd_field_mask): New enum.
(intern_font_field): Argument changed. Caller changed. If digits
are followed by non-digits, return a symbol.
(font_expand_wildcards): New function.
(font_parse_xlfd): Fix wildcard handling.
(Ffont_spec): If :name is specified, reflect the info in the other
properties.
Diffstat (limited to 'src')
| -rw-r--r-- | src/font.c | 476 |
1 files changed, 374 insertions, 102 deletions
diff --git a/src/font.c b/src/font.c index 6f6e7f5d096..35575e3ad3f 100644 --- a/src/font.c +++ b/src/font.c | |||
| @@ -358,8 +358,8 @@ enum xlfd_field_index | |||
| 358 | XLFD_SLANT_INDEX, | 358 | XLFD_SLANT_INDEX, |
| 359 | XLFD_SWIDTH_INDEX, | 359 | XLFD_SWIDTH_INDEX, |
| 360 | XLFD_ADSTYLE_INDEX, | 360 | XLFD_ADSTYLE_INDEX, |
| 361 | XLFD_PIXEL_SIZE_INDEX, | 361 | XLFD_PIXEL_INDEX, |
| 362 | XLFD_POINT_SIZE_INDEX, | 362 | XLFD_POINT_INDEX, |
| 363 | XLFD_RESX_INDEX, | 363 | XLFD_RESX_INDEX, |
| 364 | XLFD_RESY_INDEX, | 364 | XLFD_RESY_INDEX, |
| 365 | XLFD_SPACING_INDEX, | 365 | XLFD_SPACING_INDEX, |
| @@ -369,28 +369,49 @@ enum xlfd_field_index | |||
| 369 | XLFD_LAST_INDEX | 369 | XLFD_LAST_INDEX |
| 370 | }; | 370 | }; |
| 371 | 371 | ||
| 372 | /* Return a symbol interned by string at STR and bytes LEN. | 372 | enum xlfd_field_mask |
| 373 | { | ||
| 374 | XLFD_FOUNDRY_MASK = 0x0001, | ||
| 375 | XLFD_FAMILY_MASK = 0x0002, | ||
| 376 | XLFD_WEIGHT_MASK = 0x0004, | ||
| 377 | XLFD_SLANT_MASK = 0x0008, | ||
| 378 | XLFD_SWIDTH_MASK = 0x0010, | ||
| 379 | XLFD_ADSTYLE_MASK = 0x0020, | ||
| 380 | XLFD_PIXEL_MASK = 0x0040, | ||
| 381 | XLFD_POINT_MASK = 0x0080, | ||
| 382 | XLFD_RESX_MASK = 0x0100, | ||
| 383 | XLFD_RESY_MASK = 0x0200, | ||
| 384 | XLFD_SPACING_MASK = 0x0400, | ||
| 385 | XLFD_AVGWIDTH_MASK = 0x0800, | ||
| 386 | XLFD_REGISTRY_MASK = 0x1000, | ||
| 387 | XLFD_ENCODING_MASK = 0x2000 | ||
| 388 | }; | ||
| 389 | |||
| 390 | |||
| 391 | /* Return a Lispy value for string at STR and bytes LEN. | ||
| 373 | If LEN == 0, return a null string. | 392 | If LEN == 0, return a null string. |
| 374 | If the string is "*", return Qnil. | 393 | If the string is "*", return Qnil. |
| 375 | It is assured that LEN < 256. */ | 394 | It is assured that LEN < 256. */ |
| 376 | 395 | ||
| 377 | static Lisp_Object | 396 | static Lisp_Object |
| 378 | intern_font_field (f, xlfd) | 397 | intern_font_field (str, len) |
| 379 | char *f[XLFD_LAST_INDEX + 1]; | 398 | char *str; |
| 380 | int xlfd; | 399 | int len; |
| 381 | { | 400 | { |
| 382 | char *str = f[xlfd] + 1; | 401 | int i; |
| 383 | int len; | ||
| 384 | |||
| 385 | if (xlfd != XLFD_RESY_INDEX) | ||
| 386 | len = f[xlfd + 1] - f[xlfd] - 1; | ||
| 387 | else | ||
| 388 | len = f[XLFD_REGISTRY_INDEX] - f[xlfd] - 1; | ||
| 389 | 402 | ||
| 390 | if (len == 0) | 403 | if (len == 0) |
| 391 | return null_string; | 404 | return null_string; |
| 392 | if (*str == '*' && len == 1) | 405 | if (*str == '*' && len == 1) |
| 393 | return Qnil; | 406 | return Qnil; |
| 407 | if (isdigit (*str)) | ||
| 408 | { | ||
| 409 | for (i = 1; i < len; i++) | ||
| 410 | if (! isdigit (str[i])) | ||
| 411 | break; | ||
| 412 | if (i == len) | ||
| 413 | return make_number (atoi (str)); | ||
| 414 | } | ||
| 394 | return intern_downcase (str, len); | 415 | return intern_downcase (str, len); |
| 395 | } | 416 | } |
| 396 | 417 | ||
| @@ -427,6 +448,184 @@ parse_matrix (p) | |||
| 427 | return (i == 4 ? (int) matrix[3] : -1); | 448 | return (i == 4 ? (int) matrix[3] : -1); |
| 428 | } | 449 | } |
| 429 | 450 | ||
| 451 | /* Expand a wildcard field in FIELD (the first N fields are filled) to | ||
| 452 | multiple fields to fill in all 14 XLFD fields while restring a | ||
| 453 | field position by its contents. */ | ||
| 454 | |||
| 455 | int | ||
| 456 | font_expand_wildcards (field, n) | ||
| 457 | Lisp_Object field[XLFD_LAST_INDEX]; | ||
| 458 | int n; | ||
| 459 | { | ||
| 460 | /* Copy of FIELD. */ | ||
| 461 | Lisp_Object tmp[XLFD_LAST_INDEX]; | ||
| 462 | /* Array of information about where this element can go. Nth | ||
| 463 | element is for Nth element of FIELD. */ | ||
| 464 | struct { | ||
| 465 | /* Minimum possible field. */ | ||
| 466 | int from; | ||
| 467 | /* Maxinum possible field. */ | ||
| 468 | int to; | ||
| 469 | /* Bit mask of possible field. Nth bit corresponds to Nth field. */ | ||
| 470 | int mask; | ||
| 471 | } range[XLFD_LAST_INDEX]; | ||
| 472 | int i, j; | ||
| 473 | unsigned range_mask; | ||
| 474 | |||
| 475 | #define XLFD_SYMBOL_MASK (XLFD_FOUNDRY_MASK | XLFD_FAMILY_MASK \ | ||
| 476 | | XLFD_ADSTYLE_MASK | XLFD_REGISTRY_MASK) | ||
| 477 | #define XLFD_NULL_MASK (XLFD_FOUNDRY_MASK | XLFD_ADSTYLE_MASK) | ||
| 478 | #define XLFD_SMALLNUM_MASK (XLFD_PIXEL_MASK | XLFD_ENCODING_MASK) | ||
| 479 | #define XLFD_LARGENUM_MASK (XLFD_POINT_MASK | XLFD_RESX_MASK | XLFD_RESY_MASK \ | ||
| 480 | | XLFD_AVGWIDTH_MASK | XLFD_ENCODING_MASK) | ||
| 481 | #define XLFD_REGENC_MASK (XLFD_REGISTRY_MASK | XLFD_ENCODING_MASK) | ||
| 482 | |||
| 483 | /* Initialize RANGE_MASK for FIELD[0] which can be 0th to (14 - N)th | ||
| 484 | field. The value is shifted to left one bit by one in the | ||
| 485 | following loop. */ | ||
| 486 | for (i = 0, range_mask = 0; i <= 14 - n; i++) | ||
| 487 | range_mask = (range_mask << 1) | 1; | ||
| 488 | |||
| 489 | for (i = 0; i < n; i++, range_mask <<= 1) | ||
| 490 | { | ||
| 491 | /* The triplet RANGE_FROM, RANGE_TO, and RANGE_MASK is a | ||
| 492 | position-based retriction for FIELD[I]. */ | ||
| 493 | int range_from = i, range_to = 14 - n + i; | ||
| 494 | Lisp_Object val = field[i]; | ||
| 495 | |||
| 496 | tmp[i] = val; | ||
| 497 | if (NILP (val)) | ||
| 498 | { | ||
| 499 | /* Wildcard. */ | ||
| 500 | range[i].from = range_from; | ||
| 501 | range[i].to = range_to; | ||
| 502 | range[i].mask = range_mask; | ||
| 503 | } | ||
| 504 | else | ||
| 505 | { | ||
| 506 | /* The triplet FROM, TO, and MASK is a value-based | ||
| 507 | retriction for FIELD[I]. */ | ||
| 508 | int from, to; | ||
| 509 | unsigned mask; | ||
| 510 | |||
| 511 | if (INTEGERP (val)) | ||
| 512 | { | ||
| 513 | int numeric = XINT (val); | ||
| 514 | |||
| 515 | if (numeric <= 48) | ||
| 516 | from = XLFD_PIXEL_INDEX, to = XLFD_ENCODING_INDEX, | ||
| 517 | mask = XLFD_SMALLNUM_MASK; | ||
| 518 | else | ||
| 519 | from = XLFD_POINT_INDEX, to = XLFD_ENCODING_INDEX, | ||
| 520 | mask = XLFD_LARGENUM_MASK; | ||
| 521 | } | ||
| 522 | else if (EQ (val, null_string)) | ||
| 523 | from = XLFD_FOUNDRY_INDEX, to = XLFD_ADSTYLE_INDEX, | ||
| 524 | mask = XLFD_NULL_MASK; | ||
| 525 | else if (i == 0) | ||
| 526 | from = to = XLFD_FOUNDRY_INDEX, mask = XLFD_FOUNDRY_MASK; | ||
| 527 | else if (i + 1 == n) | ||
| 528 | { | ||
| 529 | Lisp_Object name = SYMBOL_NAME (val); | ||
| 530 | |||
| 531 | if (SDATA (name)[SBYTES (name) - 1] == '*') | ||
| 532 | from = XLFD_REGISTRY_INDEX, to = XLFD_ENCODING_INDEX, | ||
| 533 | mask = XLFD_REGENC_MASK; | ||
| 534 | else | ||
| 535 | from = to = XLFD_ENCODING_INDEX, | ||
| 536 | mask = XLFD_ENCODING_MASK; | ||
| 537 | } | ||
| 538 | else if (!NILP (prop_name_to_numeric (FONT_WEIGHT_INDEX, val))) | ||
| 539 | from = to = XLFD_WEIGHT_INDEX, mask = XLFD_WEIGHT_MASK; | ||
| 540 | else if (!NILP (prop_name_to_numeric (FONT_SLANT_INDEX, val))) | ||
| 541 | from = to = XLFD_SLANT_INDEX, mask = XLFD_SLANT_MASK; | ||
| 542 | else if (!NILP (prop_name_to_numeric (FONT_WIDTH_INDEX, val))) | ||
| 543 | from = to = XLFD_SWIDTH_INDEX, mask = XLFD_SWIDTH_MASK; | ||
| 544 | else | ||
| 545 | { | ||
| 546 | Lisp_Object name = SYMBOL_NAME (val); | ||
| 547 | |||
| 548 | if (SBYTES (name) == 1 | ||
| 549 | && (SDATA (name)[0] == 'c' | ||
| 550 | || SDATA (name)[0] == 'm' | ||
| 551 | || SDATA (name)[0] == 'p')) | ||
| 552 | from = to = XLFD_SPACING_INDEX, mask = XLFD_SPACING_MASK; | ||
| 553 | else | ||
| 554 | from = XLFD_FOUNDRY_INDEX, to = XLFD_ENCODING_INDEX, | ||
| 555 | mask = XLFD_SYMBOL_MASK; | ||
| 556 | } | ||
| 557 | |||
| 558 | /* Merge position-based and value-based restrictions. */ | ||
| 559 | mask &= range_mask; | ||
| 560 | while (from < range_from) | ||
| 561 | mask &= ~(1 << from++); | ||
| 562 | while (from < 14 && ! (mask & (1 << from))) | ||
| 563 | from++; | ||
| 564 | while (to > range_to) | ||
| 565 | mask &= ~(1 << to--); | ||
| 566 | while (to >= 0 && ! (mask & (1 << to))) | ||
| 567 | to--; | ||
| 568 | if (from > to) | ||
| 569 | return -1; | ||
| 570 | range[i].from = from; | ||
| 571 | range[i].to = to; | ||
| 572 | range[i].mask = mask; | ||
| 573 | |||
| 574 | if (from > range_from || to < range_to) | ||
| 575 | /* The range is narrowed by value-based restrictions. | ||
| 576 | Reflect it to the previous fields. */ | ||
| 577 | for (j = i - 1, from--, to--; j >= 0; j--, from--, to--) | ||
| 578 | { | ||
| 579 | /* Check FROM for non-wildcard field. */ | ||
| 580 | if (! NILP (tmp[j]) && range[j].from < from) | ||
| 581 | { | ||
| 582 | while (range[j].from < from) | ||
| 583 | range[j].mask &= ~(1 << range[j].from++); | ||
| 584 | while (from < 14 && ! (range[j].mask & (1 << from))) | ||
| 585 | from++; | ||
| 586 | range[j].from = from; | ||
| 587 | } | ||
| 588 | else | ||
| 589 | from = range[j].from; | ||
| 590 | if (range[j].to > to) | ||
| 591 | { | ||
| 592 | while (range[j].to > to) | ||
| 593 | range[j].mask &= ~(1 << range[j].to--); | ||
| 594 | while (to >= 0 && ! (range[j].mask & (1 << to))) | ||
| 595 | to--; | ||
| 596 | range[j].to = to; | ||
| 597 | } | ||
| 598 | else | ||
| 599 | to = range[j].to; | ||
| 600 | if (from > to) | ||
| 601 | return -1; | ||
| 602 | } | ||
| 603 | } | ||
| 604 | } | ||
| 605 | |||
| 606 | /* Decide all fileds from restrictions in RANGE. */ | ||
| 607 | for (i = j = 0; i < n ; i++) | ||
| 608 | { | ||
| 609 | if (j < range[i].from) | ||
| 610 | { | ||
| 611 | if (i == 0 || ! NILP (tmp[i - 1])) | ||
| 612 | /* None of TMP[X] corresponds to Jth field. */ | ||
| 613 | return -1; | ||
| 614 | for (; j < range[i].from; j++) | ||
| 615 | field[j] = Qnil; | ||
| 616 | } | ||
| 617 | field[j++] = tmp[i]; | ||
| 618 | } | ||
| 619 | if (! NILP (tmp[n - 1]) && j < XLFD_REGISTRY_INDEX) | ||
| 620 | return -1; | ||
| 621 | for (; j < XLFD_LAST_INDEX; j++) | ||
| 622 | field[j] = Qnil; | ||
| 623 | if (INTEGERP (field[XLFD_ENCODING_INDEX])) | ||
| 624 | field[XLFD_ENCODING_INDEX] | ||
| 625 | = Fintern (Fnumber_to_string (field[XLFD_ENCODING_INDEX]), Qnil); | ||
| 626 | return 0; | ||
| 627 | } | ||
| 628 | |||
| 430 | /* Parse NAME (null terminated) as XLFD format, and store information | 629 | /* Parse NAME (null terminated) as XLFD format, and store information |
| 431 | in FONT (font-spec or font-entity). If NAME is successfully | 630 | in FONT (font-spec or font-entity). If NAME is successfully |
| 432 | parsed, return 2 (non-scalable font), 1 (scalable vector font), or | 631 | parsed, return 2 (non-scalable font), 1 (scalable vector font), or |
| @@ -445,137 +644,206 @@ font_parse_xlfd (name, font, merge) | |||
| 445 | { | 644 | { |
| 446 | int len = strlen (name); | 645 | int len = strlen (name); |
| 447 | int i, j; | 646 | int i, j; |
| 448 | int pixel_size, resy, avwidth; | 647 | int pixel_size, resy, avgwidth; |
| 449 | double point_size; | 648 | double point_size; |
| 450 | char *f[XLFD_LAST_INDEX + 1]; | 649 | Lisp_Object f[XLFD_LAST_INDEX]; |
| 451 | Lisp_Object val; | 650 | Lisp_Object val; |
| 452 | int first_wildcard_field = -1, last_wildcard_field = XLFD_LAST_INDEX; | 651 | char *p; |
| 453 | 652 | ||
| 454 | if (len > 255) | 653 | if (len > 255) |
| 455 | /* Maximum XLFD name length is 255. */ | 654 | /* Maximum XLFD name length is 255. */ |
| 456 | return -1; | 655 | return -1; |
| 457 | for (i = 0; *name; name++) | 656 | i = (name[0] == '*' && name[1] == '-'); |
| 458 | if (*name == '-' | 657 | for (p = name + 1; *p; p++) |
| 459 | && i < XLFD_LAST_INDEX) | 658 | { |
| 460 | { | 659 | if (*p == '-') |
| 461 | f[i] = name; | 660 | { |
| 462 | if (name[1] == '*' && (! name[2] || name[2] == '-')) | 661 | i++; |
| 463 | { | 662 | if (i == XLFD_ENCODING_INDEX) |
| 464 | if (first_wildcard_field < 0) | 663 | break; |
| 465 | first_wildcard_field = i; | 664 | } |
| 466 | last_wildcard_field = i; | 665 | } |
| 467 | } | ||
| 468 | i++; | ||
| 469 | } | ||
| 470 | 666 | ||
| 471 | f[XLFD_LAST_INDEX] = name; | 667 | pixel_size = resy = avgwidth = -1; |
| 472 | if (i < XLFD_LAST_INDEX) | 668 | point_size = -1; |
| 669 | |||
| 670 | if (i == XLFD_ENCODING_INDEX) | ||
| 671 | { | ||
| 672 | /* Fully specified XLFD. */ | ||
| 673 | if (name[0] == '-') | ||
| 674 | name++; | ||
| 675 | for (i = 0, p = name; ; p++) | ||
| 676 | { | ||
| 677 | if (*p == '-') | ||
| 678 | { | ||
| 679 | if (i < XLFD_PIXEL_INDEX) | ||
| 680 | f[i++] = intern_font_field (name, p - name); | ||
| 681 | else if (i == XLFD_PIXEL_INDEX) | ||
| 682 | { | ||
| 683 | if (isdigit (*name)) | ||
| 684 | pixel_size = atoi (name); | ||
| 685 | else if (*name == '[') | ||
| 686 | pixel_size = parse_matrix (name); | ||
| 687 | i++; | ||
| 688 | } | ||
| 689 | else if (i == XLFD_POINT_INDEX) | ||
| 690 | { | ||
| 691 | if (pixel_size < 0) | ||
| 692 | { | ||
| 693 | if (isdigit (*name)) | ||
| 694 | point_size = atoi (name); | ||
| 695 | else if (*name == '[') | ||
| 696 | point_size = parse_matrix (name); | ||
| 697 | } | ||
| 698 | i++; | ||
| 699 | } | ||
| 700 | else if (i == XLFD_RESX_INDEX) | ||
| 701 | { | ||
| 702 | /* Skip this field. */ | ||
| 703 | f[i++] = Qnil; | ||
| 704 | } | ||
| 705 | else if (i == XLFD_RESY_INDEX) | ||
| 706 | { | ||
| 707 | /* Stuff RESY, SPACING, and AVGWIDTH. */ | ||
| 708 | if (pixel_size < 0 && isdigit (*name)) | ||
| 709 | resy = atoi (name); | ||
| 710 | for (p++; *p != '-'; p++); | ||
| 711 | if (isdigit (p[1])) | ||
| 712 | avgwidth = atoi (p + 1); | ||
| 713 | else if (p[1] == '~' && isdigit (p[2])) | ||
| 714 | avgwidth = atoi (p + 2); | ||
| 715 | for (p++; *p != '-'; p++); | ||
| 716 | if (FONT_ENTITY_P (font)) | ||
| 717 | f[i] = intern_font_field (name, p - name); | ||
| 718 | else | ||
| 719 | f[i] = Qnil; | ||
| 720 | i = XLFD_REGISTRY_INDEX; | ||
| 721 | } | ||
| 722 | else | ||
| 723 | { | ||
| 724 | /* Stuff REGISTRY and ENCODING. */ | ||
| 725 | for (p++; *p; p++); | ||
| 726 | f[i++] = intern_font_field (name, p - name); | ||
| 727 | break; | ||
| 728 | } | ||
| 729 | name = p + 1; | ||
| 730 | } | ||
| 731 | } | ||
| 732 | xassert (i == XLFD_ENCODING_INDEX); | ||
| 733 | } | ||
| 734 | else | ||
| 473 | { | 735 | { |
| 474 | /* Not a fully specified XLFD. */ | 736 | int wild_card_found = 0; |
| 475 | if (first_wildcard_field < 0 ) | 737 | |
| 476 | /* No wild card. */ | 738 | if (name[0] == '-') |
| 739 | name++; | ||
| 740 | for (i = 0, p = name; ; p++) | ||
| 741 | { | ||
| 742 | if (*p == '-' || ! *p) | ||
| 743 | { | ||
| 744 | if (*name == '*') | ||
| 745 | { | ||
| 746 | if (name + 1 != p) | ||
| 747 | return -1; | ||
| 748 | f[i++] = Qnil; | ||
| 749 | wild_card_found = 1; | ||
| 750 | } | ||
| 751 | else if (isdigit (*name)) | ||
| 752 | { | ||
| 753 | f[i++] = make_number (atoi (name)); | ||
| 754 | /* Check if all chars in this field is number. */ | ||
| 755 | name++; | ||
| 756 | while (isdigit (*name)) name++; | ||
| 757 | if (name != p) | ||
| 758 | return -1; | ||
| 759 | } | ||
| 760 | else if (p == name) | ||
| 761 | f[i++] = null_string; | ||
| 762 | else | ||
| 763 | { | ||
| 764 | f[i++] = intern_downcase (name, p - name); | ||
| 765 | } | ||
| 766 | if (! *p) | ||
| 767 | break; | ||
| 768 | name = p + 1; | ||
| 769 | } | ||
| 770 | } | ||
| 771 | if (! wild_card_found) | ||
| 477 | return -1; | 772 | return -1; |
| 478 | i--; | 773 | if (font_expand_wildcards (f, i) < 0) |
| 479 | if (last_wildcard_field < i) | 774 | return -1; |
| 775 | if (! NILP (f[XLFD_PIXEL_INDEX])) | ||
| 776 | pixel_size = XINT (f[XLFD_PIXEL_INDEX]); | ||
| 777 | if (! NILP (f[XLFD_POINT_INDEX])) | ||
| 778 | point_size = XINT (f[XLFD_POINT_INDEX]); | ||
| 779 | if (! NILP (f[XLFD_RESY_INDEX])) | ||
| 780 | resy = XINT (f[XLFD_RESY_INDEX]); | ||
| 781 | if (! NILP (f[XLFD_AVGWIDTH_INDEX])) | ||
| 782 | avgwidth = XINT (f[XLFD_AVGWIDTH_INDEX]); | ||
| 783 | if (NILP (f[XLFD_REGISTRY_INDEX])) | ||
| 480 | { | 784 | { |
| 481 | /* Shift fields after the last wildcard field. */ | 785 | if (! NILP (f[XLFD_ENCODING_INDEX])) |
| 482 | for (j = XLFD_LAST_INDEX - 1; j > last_wildcard_field; j--, i--) | 786 | f[XLFD_REGISTRY_INDEX] |
| 483 | f[j] = f[i]; | 787 | = Fintern (concat2 (build_string ("*-"), |
| 484 | /* Make all fields between the first and last wildcard fieled | 788 | SYMBOL_NAME (f[XLFD_ENCODING_INDEX])), Qnil); |
| 485 | also wildcard fields. */ | 789 | } |
| 486 | for (j--; j > first_wildcard_field; j--) | 790 | else |
| 487 | f[j] = "-*"; | 791 | { |
| 792 | if (! NILP (f[XLFD_ENCODING_INDEX])) | ||
| 793 | f[XLFD_REGISTRY_INDEX] | ||
| 794 | = Fintern (concat2 (SYMBOL_NAME (f[XLFD_REGISTRY_INDEX]), | ||
| 795 | SYMBOL_NAME (f[XLFD_ENCODING_INDEX])), Qnil); | ||
| 488 | } | 796 | } |
| 489 | } | 797 | } |
| 490 | f[XLFD_ENCODING_INDEX] = f[XLFD_LAST_INDEX]; | ||
| 491 | 798 | ||
| 492 | if (! merge || NILP (AREF (font, FONT_FOUNDRY_INDEX))) | 799 | if (! merge || NILP (AREF (font, FONT_FOUNDRY_INDEX))) |
| 493 | ASET (font, FONT_FOUNDRY_INDEX, intern_font_field (f, XLFD_FOUNDRY_INDEX)); | 800 | ASET (font, FONT_FOUNDRY_INDEX, f[XLFD_FOUNDRY_INDEX]); |
| 494 | if (! merge || NILP (AREF (font, FONT_FAMILY_INDEX))) | 801 | if (! merge || NILP (AREF (font, FONT_FAMILY_INDEX))) |
| 495 | ASET (font, FONT_FAMILY_INDEX, intern_font_field (f, XLFD_FAMILY_INDEX)); | 802 | ASET (font, FONT_FAMILY_INDEX, f[XLFD_FAMILY_INDEX]); |
| 496 | if (! merge || NILP (AREF (font, FONT_ADSTYLE_INDEX))) | 803 | if (! merge || NILP (AREF (font, FONT_ADSTYLE_INDEX))) |
| 497 | ASET (font, FONT_ADSTYLE_INDEX, intern_font_field (f, XLFD_ADSTYLE_INDEX)); | 804 | ASET (font, FONT_ADSTYLE_INDEX, f[XLFD_ADSTYLE_INDEX]); |
| 498 | if (! merge || NILP (AREF (font, FONT_REGISTRY_INDEX))) | 805 | if (! merge || NILP (AREF (font, FONT_REGISTRY_INDEX))) |
| 499 | ASET (font, FONT_REGISTRY_INDEX, intern_font_field (f, XLFD_REGISTRY_INDEX)); | 806 | ASET (font, FONT_REGISTRY_INDEX, f[XLFD_REGISTRY_INDEX]); |
| 500 | 807 | ||
| 501 | for (i = FONT_WEIGHT_INDEX, j = XLFD_WEIGHT_INDEX; | 808 | for (i = FONT_WEIGHT_INDEX, j = XLFD_WEIGHT_INDEX; |
| 502 | j <= XLFD_SWIDTH_INDEX; i++, j++) | 809 | j <= XLFD_SWIDTH_INDEX; i++, j++) |
| 503 | if (! merge || NILP (AREF (font, i))) | 810 | if (! merge || NILP (AREF (font, i))) |
| 504 | { | 811 | { |
| 505 | if (isdigit(f[j][1])) | 812 | if (! INTEGERP (f[j])) |
| 506 | val = make_number (atoi (f[j] + 1)); | ||
| 507 | else | ||
| 508 | { | 813 | { |
| 509 | Lisp_Object sym = intern_font_field (f, j); | 814 | val = prop_name_to_numeric (i, f[j]); |
| 510 | 815 | if (INTEGERP (val)) | |
| 511 | val = prop_name_to_numeric (i, sym); | 816 | f[j] = val; |
| 512 | if (NILP (val)) | ||
| 513 | val = sym; | ||
| 514 | } | 817 | } |
| 515 | ASET (font, i, val); | 818 | ASET (font, i, f[j]); |
| 516 | } | 819 | } |
| 517 | 820 | ||
| 518 | if (f[XLFD_PIXEL_SIZE_INDEX][1] == '*') | ||
| 519 | pixel_size = -1; /* indicates "unspecified" */ | ||
| 520 | else if (f[XLFD_PIXEL_SIZE_INDEX][1] == '[') | ||
| 521 | pixel_size = parse_matrix (f[XLFD_PIXEL_SIZE_INDEX] + 1); | ||
| 522 | else if (isdigit (f[XLFD_PIXEL_SIZE_INDEX][1])) | ||
| 523 | pixel_size = strtod (f[XLFD_PIXEL_SIZE_INDEX] + 1, NULL); | ||
| 524 | else | ||
| 525 | pixel_size = -1; | ||
| 526 | |||
| 527 | if (pixel_size < 0 && FONT_ENTITY_P (font)) | 821 | if (pixel_size < 0 && FONT_ENTITY_P (font)) |
| 528 | return -1; | 822 | return -1; |
| 529 | 823 | ||
| 530 | if (f[XLFD_POINT_SIZE_INDEX][1] == '*') | ||
| 531 | point_size = -1; /* indicates "unspecified" */ | ||
| 532 | else if (f[XLFD_POINT_SIZE_INDEX][1] == '[') | ||
| 533 | point_size = parse_matrix (f[XLFD_POINT_SIZE_INDEX] + 1); | ||
| 534 | else if (isdigit (f[XLFD_POINT_SIZE_INDEX][1])) | ||
| 535 | point_size = strtod (f[XLFD_POINT_SIZE_INDEX] + 1, NULL); | ||
| 536 | else | ||
| 537 | point_size = -1; | ||
| 538 | |||
| 539 | if (f[XLFD_RESY_INDEX][1] == '*') | ||
| 540 | resy = -1; /* indicates "unspecified" */ | ||
| 541 | else | ||
| 542 | resy = strtod (f[XLFD_RESY_INDEX] + 1, NULL); | ||
| 543 | |||
| 544 | if (f[XLFD_AVGWIDTH_INDEX][1] == '*') | ||
| 545 | avwidth = -1; /* indicates "unspecified" */ | ||
| 546 | else if (f[XLFD_AVGWIDTH_INDEX][1] == '~') | ||
| 547 | avwidth = - strtod (f[XLFD_AVGWIDTH_INDEX] + 2, NULL); | ||
| 548 | else | ||
| 549 | avwidth = strtod (f[XLFD_AVGWIDTH_INDEX] + 1, NULL); | ||
| 550 | |||
| 551 | if (! merge || NILP (AREF (font, FONT_SIZE_INDEX))) | 824 | if (! merge || NILP (AREF (font, FONT_SIZE_INDEX))) |
| 552 | { | 825 | { |
| 553 | if (pixel_size >= 0) | 826 | if (pixel_size >= 0) |
| 554 | ASET (font, FONT_SIZE_INDEX, make_number (pixel_size)); | 827 | ASET (font, FONT_SIZE_INDEX, make_number (pixel_size)); |
| 555 | else | 828 | else if (point_size >= 0) |
| 556 | { | 829 | { |
| 557 | if (point_size >= 0) | 830 | if (resy > 0) |
| 558 | { | 831 | { |
| 559 | if (resy > 0) | 832 | pixel_size = POINT_TO_PIXEL (point_size, resy); |
| 560 | { | 833 | ASET (font, FONT_SIZE_INDEX, make_number (pixel_size)); |
| 561 | pixel_size = POINT_TO_PIXEL (point_size, resy); | ||
| 562 | ASET (font, FONT_SIZE_INDEX, make_number (pixel_size)); | ||
| 563 | } | ||
| 564 | else | ||
| 565 | { | ||
| 566 | ASET (font, FONT_SIZE_INDEX, make_float (point_size / 10)); | ||
| 567 | } | ||
| 568 | } | 834 | } |
| 569 | else | 835 | else |
| 570 | ASET (font, FONT_SIZE_INDEX, Qnil); | 836 | { |
| 837 | ASET (font, FONT_SIZE_INDEX, make_float (point_size / 10)); | ||
| 838 | } | ||
| 571 | } | 839 | } |
| 572 | } | 840 | } |
| 573 | 841 | ||
| 574 | if (FONT_ENTITY_P (font) | 842 | if (FONT_ENTITY_P (font) |
| 575 | && EQ (AREF (font, FONT_TYPE_INDEX), Qx)) | 843 | && EQ (AREF (font, FONT_TYPE_INDEX), Qx)) |
| 576 | ASET (font, FONT_EXTRA_INDEX, intern_font_field (f, XLFD_RESY_INDEX)); | 844 | ASET (font, FONT_EXTRA_INDEX, f[XLFD_RESY_INDEX]); |
| 577 | 845 | ||
| 578 | return (avwidth > 0 ? 2 : resy == 0); | 846 | return (avgwidth > 0 ? 2 : resy == 0); |
| 579 | } | 847 | } |
| 580 | 848 | ||
| 581 | /* Store XLFD name of FONT (font-spec or font-entity) in NAME (NBYTES | 849 | /* Store XLFD name of FONT (font-spec or font-entity) in NAME (NBYTES |
| @@ -1998,7 +2266,11 @@ usage: (font-spec &rest properties) */) | |||
| 1998 | if (prop < FONT_EXTRA_INDEX) | 2266 | if (prop < FONT_EXTRA_INDEX) |
| 1999 | ASET (spec, prop, (font_property_table[prop].validater) (prop, val)); | 2267 | ASET (spec, prop, (font_property_table[prop].validater) (prop, val)); |
| 2000 | else | 2268 | else |
| 2001 | extra = Fcons (Fcons (key, val), extra); | 2269 | { |
| 2270 | if (EQ (key, QCname)) | ||
| 2271 | font_parse_xlfd ((char *) SDATA (val), spec, 0); | ||
| 2272 | extra = Fcons (Fcons (key, val), extra); | ||
| 2273 | } | ||
| 2002 | } | 2274 | } |
| 2003 | ASET (spec, FONT_EXTRA_INDEX, extra); | 2275 | ASET (spec, FONT_EXTRA_INDEX, extra); |
| 2004 | return spec; | 2276 | return spec; |