diff options
| author | Chong Yidong | 2008-06-15 19:42:11 +0000 |
|---|---|---|
| committer | Chong Yidong | 2008-06-15 19:42:11 +0000 |
| commit | b1868a1a8dbe67fde1489a20a557d0c145f36f9c (patch) | |
| tree | 38a63dbc14ad5a983e8d3d1d8875e95a4494d793 /src | |
| parent | 523dbe64afc7261d8b5453d382b4398c07661abf (diff) | |
| download | emacs-b1868a1a8dbe67fde1489a20a557d0c145f36f9c.tar.gz emacs-b1868a1a8dbe67fde1489a20a557d0c145f36f9c.zip | |
(font_parse_fcname): Only only one decimal point.
(font_unparse_fcname): Handle data in family and foundry indices
as symbols, not strings.
(font_unparse_gtkname, Ffont_face_attributes): New functions.
Diffstat (limited to 'src')
| -rw-r--r-- | src/font.c | 208 |
1 files changed, 194 insertions, 14 deletions
diff --git a/src/font.c b/src/font.c index 9667e031bcf..72b35f820d9 100644 --- a/src/font.c +++ b/src/font.c | |||
| @@ -126,7 +126,9 @@ static struct table_entry width_table[] = | |||
| 126 | extern Lisp_Object Qnormal; | 126 | extern Lisp_Object Qnormal; |
| 127 | 127 | ||
| 128 | /* Symbols representing keys of normal font properties. */ | 128 | /* Symbols representing keys of normal font properties. */ |
| 129 | extern Lisp_Object QCtype, QCfamily, QCweight, QCslant, QCwidth, QCsize, QCname; | 129 | extern Lisp_Object QCtype, QCfamily, QCweight, QCslant, QCwidth; |
| 130 | extern Lisp_Object QCheight, QCsize, QCname; | ||
| 131 | |||
| 130 | Lisp_Object QCfoundry, QCadstyle, QCregistry; | 132 | Lisp_Object QCfoundry, QCadstyle, QCregistry; |
| 131 | /* Symbols representing keys of font extra info. */ | 133 | /* Symbols representing keys of font extra info. */ |
| 132 | Lisp_Object QCspacing, QCdpi, QCscalable, QCotf, QClang, QCscript, QCavgwidth; | 134 | Lisp_Object QCspacing, QCdpi, QCscalable, QCotf, QClang, QCscript, QCavgwidth; |
| @@ -1372,12 +1374,16 @@ font_parse_fcname (name, font) | |||
| 1372 | } | 1374 | } |
| 1373 | else if (*p == '-') | 1375 | else if (*p == '-') |
| 1374 | { | 1376 | { |
| 1375 | int size_found = 1; | 1377 | int decimal = 0, size_found = 1; |
| 1376 | for (q = p + 1; *q && *q != ':'; q++) | 1378 | for (q = p + 1; *q && *q != ':'; q++) |
| 1377 | if (! isdigit(*q) && *q != '.') | 1379 | if (! isdigit(*q)) |
| 1378 | { | 1380 | { |
| 1379 | size_found = 0; | 1381 | if (*q != '.' || decimal) |
| 1380 | break; | 1382 | { |
| 1383 | size_found = 0; | ||
| 1384 | break; | ||
| 1385 | } | ||
| 1386 | decimal = 1; | ||
| 1381 | } | 1387 | } |
| 1382 | if (size_found) | 1388 | if (size_found) |
| 1383 | { | 1389 | { |
| @@ -1593,6 +1599,7 @@ font_unparse_fcname (font, pixel_size, name, nbytes) | |||
| 1593 | char *name; | 1599 | char *name; |
| 1594 | int nbytes; | 1600 | int nbytes; |
| 1595 | { | 1601 | { |
| 1602 | Lisp_Object family, foundry; | ||
| 1596 | Lisp_Object tail, val; | 1603 | Lisp_Object tail, val; |
| 1597 | int point_size; | 1604 | int point_size; |
| 1598 | int dpi; | 1605 | int dpi; |
| @@ -1602,9 +1609,17 @@ font_unparse_fcname (font, pixel_size, name, nbytes) | |||
| 1602 | char *style_names[3] = { "weight", "slant", "width" }; | 1609 | char *style_names[3] = { "weight", "slant", "width" }; |
| 1603 | char work[256]; | 1610 | char work[256]; |
| 1604 | 1611 | ||
| 1605 | val = AREF (font, FONT_FAMILY_INDEX); | 1612 | family = AREF (font, FONT_FAMILY_INDEX); |
| 1606 | if (STRINGP (val)) | 1613 | if (! NILP (family)) |
| 1607 | len += SBYTES (val); | 1614 | { |
| 1615 | if (SYMBOLP (family)) | ||
| 1616 | { | ||
| 1617 | family = SYMBOL_NAME (family); | ||
| 1618 | len += SBYTES (family); | ||
| 1619 | } | ||
| 1620 | else | ||
| 1621 | family = Qnil; | ||
| 1622 | } | ||
| 1608 | 1623 | ||
| 1609 | val = AREF (font, FONT_SIZE_INDEX); | 1624 | val = AREF (font, FONT_SIZE_INDEX); |
| 1610 | if (INTEGERP (val)) | 1625 | if (INTEGERP (val)) |
| @@ -1621,10 +1636,17 @@ font_unparse_fcname (font, pixel_size, name, nbytes) | |||
| 1621 | len += 11; /* for "-NUM" */ | 1636 | len += 11; /* for "-NUM" */ |
| 1622 | } | 1637 | } |
| 1623 | 1638 | ||
| 1624 | val = AREF (font, FONT_FOUNDRY_INDEX); | 1639 | foundry = AREF (font, FONT_FOUNDRY_INDEX); |
| 1625 | if (STRINGP (val)) | 1640 | if (! NILP (foundry)) |
| 1626 | /* ":foundry=NAME" */ | 1641 | { |
| 1627 | len += 9 + SBYTES (val); | 1642 | if (SYMBOLP (foundry)) |
| 1643 | { | ||
| 1644 | foundry = SYMBOL_NAME (foundry); | ||
| 1645 | len += 9 + SBYTES (foundry); /* ":foundry=NAME" */ | ||
| 1646 | } | ||
| 1647 | else | ||
| 1648 | foundry = Qnil; | ||
| 1649 | } | ||
| 1628 | 1650 | ||
| 1629 | for (i = 0; i < 3; i++) | 1651 | for (i = 0; i < 3; i++) |
| 1630 | { | 1652 | { |
| @@ -1656,8 +1678,8 @@ font_unparse_fcname (font, pixel_size, name, nbytes) | |||
| 1656 | if (len > nbytes) | 1678 | if (len > nbytes) |
| 1657 | return -1; | 1679 | return -1; |
| 1658 | p = name; | 1680 | p = name; |
| 1659 | if (! NILP (AREF (font, FONT_FAMILY_INDEX))) | 1681 | if (! NILP (family)) |
| 1660 | p += sprintf(p, "%s", SDATA (SYMBOL_NAME (AREF (font, FONT_FAMILY_INDEX)))); | 1682 | p += sprintf (p, "%s", SDATA (family)); |
| 1661 | if (point_size > 0) | 1683 | if (point_size > 0) |
| 1662 | { | 1684 | { |
| 1663 | if (p == name) | 1685 | if (p == name) |
| @@ -1688,6 +1710,94 @@ font_unparse_fcname (font, pixel_size, name, nbytes) | |||
| 1688 | return (p - name); | 1710 | return (p - name); |
| 1689 | } | 1711 | } |
| 1690 | 1712 | ||
| 1713 | /* Store GTK-style font name of FONT (font-spec or font-entity) in | ||
| 1714 | NAME (NBYTES length), and return the name length. F is the frame | ||
| 1715 | on which the font is displayed; it is used to calculate the point | ||
| 1716 | size. */ | ||
| 1717 | |||
| 1718 | int | ||
| 1719 | font_unparse_gtkname (font, f, name, nbytes) | ||
| 1720 | Lisp_Object font; | ||
| 1721 | struct frame *f; | ||
| 1722 | char *name; | ||
| 1723 | int nbytes; | ||
| 1724 | { | ||
| 1725 | char *p; | ||
| 1726 | int len = 1; | ||
| 1727 | Lisp_Object family, weight, slant, size; | ||
| 1728 | int point_size = -1; | ||
| 1729 | |||
| 1730 | family = AREF (font, FONT_FAMILY_INDEX); | ||
| 1731 | if (! NILP (family)) | ||
| 1732 | { | ||
| 1733 | if (! SYMBOLP (family)) | ||
| 1734 | return -1; | ||
| 1735 | family = SYMBOL_NAME (family); | ||
| 1736 | len += SBYTES (family); | ||
| 1737 | } | ||
| 1738 | |||
| 1739 | weight = font_style_symbolic (font, FONT_WEIGHT_INDEX, 0); | ||
| 1740 | if (weight == Qnormal) | ||
| 1741 | weight = Qnil; | ||
| 1742 | else if (! NILP (weight)) | ||
| 1743 | { | ||
| 1744 | weight = SYMBOL_NAME (weight); | ||
| 1745 | len += SBYTES (weight); | ||
| 1746 | } | ||
| 1747 | |||
| 1748 | slant = font_style_symbolic (font, FONT_SLANT_INDEX, 0); | ||
| 1749 | if (slant == Qnormal) | ||
| 1750 | slant = Qnil; | ||
| 1751 | else if (! NILP (slant)) | ||
| 1752 | { | ||
| 1753 | slant = SYMBOL_NAME (slant); | ||
| 1754 | len += SBYTES (slant); | ||
| 1755 | } | ||
| 1756 | |||
| 1757 | size = AREF (font, FONT_SIZE_INDEX); | ||
| 1758 | /* Convert pixel size to point size. */ | ||
| 1759 | if (INTEGERP (size)) | ||
| 1760 | { | ||
| 1761 | Lisp_Object font_dpi = AREF (font, FONT_DPI_INDEX); | ||
| 1762 | int dpi = 75; | ||
| 1763 | if (INTEGERP (font_dpi)) | ||
| 1764 | dpi = XINT (font_dpi); | ||
| 1765 | else if (f) | ||
| 1766 | dpi = f->resy; | ||
| 1767 | point_size = PIXEL_TO_POINT (XINT (size), dpi); | ||
| 1768 | len += 11; | ||
| 1769 | } | ||
| 1770 | else if (FLOATP (size)) | ||
| 1771 | { | ||
| 1772 | point_size = (int) XFLOAT_DATA (size); | ||
| 1773 | len += 11; | ||
| 1774 | } | ||
| 1775 | |||
| 1776 | if (len > nbytes) | ||
| 1777 | return -1; | ||
| 1778 | |||
| 1779 | p = name + sprintf (name, "%s", SDATA (family)); | ||
| 1780 | |||
| 1781 | if (! NILP (weight)) | ||
| 1782 | { | ||
| 1783 | char *q = p; | ||
| 1784 | p += sprintf (p, " %s", SDATA (weight)); | ||
| 1785 | q[1] = toupper (q[1]); | ||
| 1786 | } | ||
| 1787 | |||
| 1788 | if (! NILP (slant)) | ||
| 1789 | { | ||
| 1790 | char *q = p; | ||
| 1791 | p += sprintf (p, " %s", SDATA (slant)); | ||
| 1792 | q[1] = toupper (q[1]); | ||
| 1793 | } | ||
| 1794 | |||
| 1795 | if (point_size > 0) | ||
| 1796 | p += sprintf (p, " %d", point_size); | ||
| 1797 | |||
| 1798 | return (p - name); | ||
| 1799 | } | ||
| 1800 | |||
| 1691 | /* Parse NAME (null terminated) and store information in FONT | 1801 | /* Parse NAME (null terminated) and store information in FONT |
| 1692 | (font-spec or font-entity). If NAME is successfully parsed, return | 1802 | (font-spec or font-entity). If NAME is successfully parsed, return |
| 1693 | 0. Otherwise return -1. */ | 1803 | 0. Otherwise return -1. */ |
| @@ -3659,6 +3769,75 @@ FONT is a font-spec, a font-entity, or a font-object. */) | |||
| 3659 | return Fcdr (Fassq (key, AREF (font, FONT_EXTRA_INDEX))); | 3769 | return Fcdr (Fassq (key, AREF (font, FONT_EXTRA_INDEX))); |
| 3660 | } | 3770 | } |
| 3661 | 3771 | ||
| 3772 | DEFUN ("font-face-attributes", Ffont_face_attributes, Sfont_face_attributes, 1, 2, 0, | ||
| 3773 | doc: /* Return a plist of face attributes generated by FONT. | ||
| 3774 | FONT is a font name, a font-spec, a font-entity, or a font-object. | ||
| 3775 | The return value is a list of the form | ||
| 3776 | |||
| 3777 | (:family FAMILY :height HEIGHT :weight WEIGHT :slant SLANT :width WIDTH) | ||
| 3778 | |||
| 3779 | where FAMILY, FOUNDRY, HEIGHT, WEIGHT, SLANT, and WIDTH are face | ||
| 3780 | attribute values compatible with `set-face-attribute'. | ||
| 3781 | |||
| 3782 | The optional argument FRAME specifies the frame that the face | ||
| 3783 | attributes are to be displayed on. If omitted, the selected frame is | ||
| 3784 | used. */) | ||
| 3785 | (font, frame) | ||
| 3786 | Lisp_Object font; | ||
| 3787 | { | ||
| 3788 | struct frame *f; | ||
| 3789 | Lisp_Object plist[10]; | ||
| 3790 | Lisp_Object val; | ||
| 3791 | |||
| 3792 | if (NILP (frame)) | ||
| 3793 | frame = selected_frame; | ||
| 3794 | CHECK_LIVE_FRAME (frame); | ||
| 3795 | f = XFRAME (frame); | ||
| 3796 | |||
| 3797 | if (STRINGP (font)) | ||
| 3798 | { | ||
| 3799 | int fontset = fs_query_fontset (font, 0); | ||
| 3800 | Lisp_Object name = font; | ||
| 3801 | if (fontset >= 0) | ||
| 3802 | font = fontset_ascii (fontset); | ||
| 3803 | font = font_spec_from_name (name); | ||
| 3804 | if (! FONTP (font)) | ||
| 3805 | signal_error ("Invalid font name", name); | ||
| 3806 | } | ||
| 3807 | else if (! FONTP (font)) | ||
| 3808 | signal_error ("Invalid font object", font); | ||
| 3809 | |||
| 3810 | plist[0] = QCfamily; | ||
| 3811 | val = AREF (font, FONT_FAMILY_INDEX); | ||
| 3812 | plist[1] = NILP (val) ? Qnil : SYMBOL_NAME (val); | ||
| 3813 | |||
| 3814 | plist[2] = QCheight; | ||
| 3815 | val = AREF (font, FONT_SIZE_INDEX); | ||
| 3816 | if (INTEGERP (val)) | ||
| 3817 | { | ||
| 3818 | Lisp_Object font_dpi = AREF (font, FONT_DPI_INDEX); | ||
| 3819 | int dpi = INTEGERP (font_dpi) ? XINT (font_dpi) : f->resy; | ||
| 3820 | plist[3] = make_number (10 * PIXEL_TO_POINT (XINT (val), dpi)); | ||
| 3821 | } | ||
| 3822 | else if (FLOATP (val)) | ||
| 3823 | plist[3] = make_number (10 * (int) XFLOAT_DATA (val)); | ||
| 3824 | else | ||
| 3825 | plist[3] = Qnil; | ||
| 3826 | |||
| 3827 | plist[4] = QCweight; | ||
| 3828 | val = FONT_WEIGHT_FOR_FACE (font); | ||
| 3829 | plist[5] = NILP (val) ? Qnormal : val; | ||
| 3830 | |||
| 3831 | plist[6] = QCslant; | ||
| 3832 | val = FONT_SLANT_FOR_FACE (font); | ||
| 3833 | plist[7] = NILP (val) ? Qnormal : val; | ||
| 3834 | |||
| 3835 | plist[8] = QCwidth; | ||
| 3836 | val = FONT_WIDTH_FOR_FACE (font); | ||
| 3837 | plist[9] = NILP (val) ? Qnormal : val; | ||
| 3838 | |||
| 3839 | return Flist (10, plist); | ||
| 3840 | } | ||
| 3662 | 3841 | ||
| 3663 | DEFUN ("font-put", Ffont_put, Sfont_put, 3, 3, 0, | 3842 | DEFUN ("font-put", Ffont_put, Sfont_put, 3, 3, 0, |
| 3664 | doc: /* Set one property of FONT-SPEC: give property PROP value VAL. */) | 3843 | doc: /* Set one property of FONT-SPEC: give property PROP value VAL. */) |
| @@ -4701,6 +4880,7 @@ syms_of_font () | |||
| 4701 | defsubr (&Sfontp); | 4880 | defsubr (&Sfontp); |
| 4702 | defsubr (&Sfont_spec); | 4881 | defsubr (&Sfont_spec); |
| 4703 | defsubr (&Sfont_get); | 4882 | defsubr (&Sfont_get); |
| 4883 | defsubr (&Sfont_face_attributes); | ||
| 4704 | defsubr (&Sfont_put); | 4884 | defsubr (&Sfont_put); |
| 4705 | defsubr (&Slist_fonts); | 4885 | defsubr (&Slist_fonts); |
| 4706 | defsubr (&Sfont_family_list); | 4886 | defsubr (&Sfont_family_list); |