aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/font.c476
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. 372enum 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
377static Lisp_Object 396static Lisp_Object
378intern_font_field (f, xlfd) 397intern_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
455int
456font_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;