aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChong Yidong2008-06-15 19:42:11 +0000
committerChong Yidong2008-06-15 19:42:11 +0000
commitb1868a1a8dbe67fde1489a20a557d0c145f36f9c (patch)
tree38a63dbc14ad5a983e8d3d1d8875e95a4494d793 /src
parent523dbe64afc7261d8b5453d382b4398c07661abf (diff)
downloademacs-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.c208
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[] =
126extern Lisp_Object Qnormal; 126extern Lisp_Object Qnormal;
127 127
128/* Symbols representing keys of normal font properties. */ 128/* Symbols representing keys of normal font properties. */
129extern Lisp_Object QCtype, QCfamily, QCweight, QCslant, QCwidth, QCsize, QCname; 129extern Lisp_Object QCtype, QCfamily, QCweight, QCslant, QCwidth;
130extern Lisp_Object QCheight, QCsize, QCname;
131
130Lisp_Object QCfoundry, QCadstyle, QCregistry; 132Lisp_Object QCfoundry, QCadstyle, QCregistry;
131/* Symbols representing keys of font extra info. */ 133/* Symbols representing keys of font extra info. */
132Lisp_Object QCspacing, QCdpi, QCscalable, QCotf, QClang, QCscript, QCavgwidth; 134Lisp_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
1718int
1719font_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
3772DEFUN ("font-face-attributes", Ffont_face_attributes, Sfont_face_attributes, 1, 2, 0,
3773 doc: /* Return a plist of face attributes generated by FONT.
3774FONT is a font name, a font-spec, a font-entity, or a font-object.
3775The return value is a list of the form
3776
3777(:family FAMILY :height HEIGHT :weight WEIGHT :slant SLANT :width WIDTH)
3778
3779where FAMILY, FOUNDRY, HEIGHT, WEIGHT, SLANT, and WIDTH are face
3780attribute values compatible with `set-face-attribute'.
3781
3782The optional argument FRAME specifies the frame that the face
3783attributes are to be displayed on. If omitted, the selected frame is
3784used. */)
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
3663DEFUN ("font-put", Ffont_put, Sfont_put, 3, 3, 0, 3842DEFUN ("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);