diff options
Diffstat (limited to 'src/font.c')
| -rw-r--r-- | src/font.c | 265 |
1 files changed, 123 insertions, 142 deletions
diff --git a/src/font.c b/src/font.c index 5aff20b1346..43b74b5b6f8 100644 --- a/src/font.c +++ b/src/font.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* font.c -- "Font" primitives. | 1 | /* font.c -- "Font" primitives. |
| 2 | 2 | ||
| 3 | Copyright (C) 2006-2011 Free Software Foundation, Inc. | 3 | Copyright (C) 2006-2012 Free Software Foundation, Inc. |
| 4 | Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 | 4 | Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 |
| 5 | National Institute of Advanced Industrial Science and Technology (AIST) | 5 | National Institute of Advanced Industrial Science and Technology (AIST) |
| 6 | Registration Number H13PRO009 | 6 | Registration Number H13PRO009 |
| @@ -21,6 +21,7 @@ You should have received a copy of the GNU General Public License | |||
| 21 | along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | 21 | along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ |
| 22 | 22 | ||
| 23 | #include <config.h> | 23 | #include <config.h> |
| 24 | #include <float.h> | ||
| 24 | #include <stdio.h> | 25 | #include <stdio.h> |
| 25 | #include <ctype.h> | 26 | #include <ctype.h> |
| 26 | #include <setjmp.h> | 27 | #include <setjmp.h> |
| @@ -161,7 +162,7 @@ static struct font_driver_list *font_driver_list; | |||
| 161 | 162 | ||
| 162 | 163 | ||
| 163 | 164 | ||
| 164 | /* Creaters of font-related Lisp object. */ | 165 | /* Creators of font-related Lisp object. */ |
| 165 | 166 | ||
| 166 | static Lisp_Object | 167 | static Lisp_Object |
| 167 | font_make_spec (void) | 168 | font_make_spec (void) |
| @@ -613,7 +614,7 @@ static const struct | |||
| 613 | /* Function to validate PROP's value VAL, or NULL if any value is | 614 | /* Function to validate PROP's value VAL, or NULL if any value is |
| 614 | ok. The value is VAL or its regularized value if VAL is valid, | 615 | ok. The value is VAL or its regularized value if VAL is valid, |
| 615 | and Qerror if not. */ | 616 | and Qerror if not. */ |
| 616 | Lisp_Object (*validater) (Lisp_Object prop, Lisp_Object val); | 617 | Lisp_Object (*validator) (Lisp_Object prop, Lisp_Object val); |
| 617 | } font_property_table[] = | 618 | } font_property_table[] = |
| 618 | { { &QCtype, font_prop_validate_symbol }, | 619 | { { &QCtype, font_prop_validate_symbol }, |
| 619 | { &QCfoundry, font_prop_validate_symbol }, | 620 | { &QCfoundry, font_prop_validate_symbol }, |
| @@ -671,7 +672,7 @@ font_prop_validate (int idx, Lisp_Object prop, Lisp_Object val) | |||
| 671 | if (idx < 0) | 672 | if (idx < 0) |
| 672 | return val; | 673 | return val; |
| 673 | } | 674 | } |
| 674 | validated = (font_property_table[idx].validater) (prop, val); | 675 | validated = (font_property_table[idx].validator) (prop, val); |
| 675 | if (EQ (validated, Qerror)) | 676 | if (EQ (validated, Qerror)) |
| 676 | signal_error ("invalid font property", Fcons (prop, val)); | 677 | signal_error ("invalid font property", Fcons (prop, val)); |
| 677 | return validated; | 678 | return validated; |
| @@ -801,7 +802,7 @@ font_expand_wildcards (Lisp_Object *field, int n) | |||
| 801 | struct { | 802 | struct { |
| 802 | /* Minimum possible field. */ | 803 | /* Minimum possible field. */ |
| 803 | int from; | 804 | int from; |
| 804 | /* Maxinum possible field. */ | 805 | /* Maximum possible field. */ |
| 805 | int to; | 806 | int to; |
| 806 | /* Bit mask of possible field. Nth bit corresponds to Nth field. */ | 807 | /* Bit mask of possible field. Nth bit corresponds to Nth field. */ |
| 807 | int mask; | 808 | int mask; |
| @@ -824,7 +825,7 @@ font_expand_wildcards (Lisp_Object *field, int n) | |||
| 824 | range_mask = (range_mask << 1) | 1; | 825 | range_mask = (range_mask << 1) | 1; |
| 825 | 826 | ||
| 826 | /* The triplet RANGE_FROM, RANGE_TO, and RANGE_MASK is a | 827 | /* The triplet RANGE_FROM, RANGE_TO, and RANGE_MASK is a |
| 827 | position-based retriction for FIELD[I]. */ | 828 | position-based restriction for FIELD[I]. */ |
| 828 | for (i = 0, range_from = 0, range_to = 14 - n; i < n; | 829 | for (i = 0, range_from = 0, range_to = 14 - n; i < n; |
| 829 | i++, range_from++, range_to++, range_mask <<= 1) | 830 | i++, range_from++, range_to++, range_mask <<= 1) |
| 830 | { | 831 | { |
| @@ -841,7 +842,7 @@ font_expand_wildcards (Lisp_Object *field, int n) | |||
| 841 | else | 842 | else |
| 842 | { | 843 | { |
| 843 | /* The triplet FROM, TO, and MASK is a value-based | 844 | /* The triplet FROM, TO, and MASK is a value-based |
| 844 | retriction for FIELD[I]. */ | 845 | restriction for FIELD[I]. */ |
| 845 | int from, to; | 846 | int from, to; |
| 846 | unsigned mask; | 847 | unsigned mask; |
| 847 | 848 | ||
| @@ -953,7 +954,7 @@ font_expand_wildcards (Lisp_Object *field, int n) | |||
| 953 | } | 954 | } |
| 954 | } | 955 | } |
| 955 | 956 | ||
| 956 | /* Decide all fileds from restrictions in RANGE. */ | 957 | /* Decide all fields from restrictions in RANGE. */ |
| 957 | for (i = j = 0; i < n ; i++) | 958 | for (i = j = 0; i < n ; i++) |
| 958 | { | 959 | { |
| 959 | if (j < range[i].from) | 960 | if (j < range[i].from) |
| @@ -1180,7 +1181,7 @@ font_unparse_xlfd (Lisp_Object font, int pixel_size, char *name, int nbytes) | |||
| 1180 | char *p; | 1181 | char *p; |
| 1181 | const char *f[XLFD_REGISTRY_INDEX + 1]; | 1182 | const char *f[XLFD_REGISTRY_INDEX + 1]; |
| 1182 | Lisp_Object val; | 1183 | Lisp_Object val; |
| 1183 | int i, j, len = 0; | 1184 | int i, j, len; |
| 1184 | 1185 | ||
| 1185 | font_assert (FONTP (font)); | 1186 | font_assert (FONTP (font)); |
| 1186 | 1187 | ||
| @@ -1195,9 +1196,9 @@ font_unparse_xlfd (Lisp_Object font, int pixel_size, char *name, int nbytes) | |||
| 1195 | if (NILP (val)) | 1196 | if (NILP (val)) |
| 1196 | { | 1197 | { |
| 1197 | if (j == XLFD_REGISTRY_INDEX) | 1198 | if (j == XLFD_REGISTRY_INDEX) |
| 1198 | f[j] = "*-*", len += 4; | 1199 | f[j] = "*-*"; |
| 1199 | else | 1200 | else |
| 1200 | f[j] = "*", len += 2; | 1201 | f[j] = "*"; |
| 1201 | } | 1202 | } |
| 1202 | else | 1203 | else |
| 1203 | { | 1204 | { |
| @@ -1207,21 +1208,15 @@ font_unparse_xlfd (Lisp_Object font, int pixel_size, char *name, int nbytes) | |||
| 1207 | && ! strchr (SSDATA (val), '-')) | 1208 | && ! strchr (SSDATA (val), '-')) |
| 1208 | { | 1209 | { |
| 1209 | /* Change "jisx0208*" and "jisx0208" to "jisx0208*-*". */ | 1210 | /* Change "jisx0208*" and "jisx0208" to "jisx0208*-*". */ |
| 1210 | if (SDATA (val)[SBYTES (val) - 1] == '*') | 1211 | ptrdiff_t alloc = SBYTES (val) + 4; |
| 1211 | { | 1212 | if (nbytes <= alloc) |
| 1212 | f[j] = p = alloca (SBYTES (val) + 3); | 1213 | return -1; |
| 1213 | sprintf (p, "%s-*", SDATA (val)); | 1214 | f[j] = p = alloca (alloc); |
| 1214 | len += SBYTES (val) + 3; | 1215 | sprintf (p, "%s%s-*", SDATA (val), |
| 1215 | } | 1216 | "*" + (SDATA (val)[SBYTES (val) - 1] == '*')); |
| 1216 | else | ||
| 1217 | { | ||
| 1218 | f[j] = p = alloca (SBYTES (val) + 4); | ||
| 1219 | sprintf (p, "%s*-*", SDATA (val)); | ||
| 1220 | len += SBYTES (val) + 4; | ||
| 1221 | } | ||
| 1222 | } | 1217 | } |
| 1223 | else | 1218 | else |
| 1224 | f[j] = SSDATA (val), len += SBYTES (val) + 1; | 1219 | f[j] = SSDATA (val); |
| 1225 | } | 1220 | } |
| 1226 | } | 1221 | } |
| 1227 | 1222 | ||
| @@ -1230,11 +1225,11 @@ font_unparse_xlfd (Lisp_Object font, int pixel_size, char *name, int nbytes) | |||
| 1230 | { | 1225 | { |
| 1231 | val = font_style_symbolic (font, i, 0); | 1226 | val = font_style_symbolic (font, i, 0); |
| 1232 | if (NILP (val)) | 1227 | if (NILP (val)) |
| 1233 | f[j] = "*", len += 2; | 1228 | f[j] = "*"; |
| 1234 | else | 1229 | else |
| 1235 | { | 1230 | { |
| 1236 | val = SYMBOL_NAME (val); | 1231 | val = SYMBOL_NAME (val); |
| 1237 | f[j] = SSDATA (val), len += SBYTES (val) + 1; | 1232 | f[j] = SSDATA (val); |
| 1238 | } | 1233 | } |
| 1239 | } | 1234 | } |
| 1240 | 1235 | ||
| @@ -1242,64 +1237,62 @@ font_unparse_xlfd (Lisp_Object font, int pixel_size, char *name, int nbytes) | |||
| 1242 | font_assert (NUMBERP (val) || NILP (val)); | 1237 | font_assert (NUMBERP (val) || NILP (val)); |
| 1243 | if (INTEGERP (val)) | 1238 | if (INTEGERP (val)) |
| 1244 | { | 1239 | { |
| 1245 | i = XINT (val); | 1240 | EMACS_INT v = XINT (val); |
| 1246 | if (i <= 0) | 1241 | if (v <= 0) |
| 1247 | i = pixel_size; | 1242 | v = pixel_size; |
| 1248 | if (i > 0) | 1243 | if (v > 0) |
| 1249 | { | 1244 | { |
| 1250 | f[XLFD_PIXEL_INDEX] = p = alloca (22); | 1245 | f[XLFD_PIXEL_INDEX] = p = |
| 1251 | len += sprintf (p, "%d-*", i) + 1; | 1246 | alloca (sizeof "-*" + INT_STRLEN_BOUND (EMACS_INT)); |
| 1247 | sprintf (p, "%"pI"d-*", v); | ||
| 1252 | } | 1248 | } |
| 1253 | else | 1249 | else |
| 1254 | f[XLFD_PIXEL_INDEX] = "*-*", len += 4; | 1250 | f[XLFD_PIXEL_INDEX] = "*-*"; |
| 1255 | } | 1251 | } |
| 1256 | else if (FLOATP (val)) | 1252 | else if (FLOATP (val)) |
| 1257 | { | 1253 | { |
| 1258 | i = XFLOAT_DATA (val) * 10; | 1254 | double v = XFLOAT_DATA (val) * 10; |
| 1259 | f[XLFD_PIXEL_INDEX] = p = alloca (12); | 1255 | f[XLFD_PIXEL_INDEX] = p = alloca (sizeof "*-" + 1 + DBL_MAX_10_EXP + 1); |
| 1260 | len += sprintf (p, "*-%d", i) + 1; | 1256 | sprintf (p, "*-%.0f", v); |
| 1261 | } | 1257 | } |
| 1262 | else | 1258 | else |
| 1263 | f[XLFD_PIXEL_INDEX] = "*-*", len += 4; | 1259 | f[XLFD_PIXEL_INDEX] = "*-*"; |
| 1264 | 1260 | ||
| 1265 | if (INTEGERP (AREF (font, FONT_DPI_INDEX))) | 1261 | if (INTEGERP (AREF (font, FONT_DPI_INDEX))) |
| 1266 | { | 1262 | { |
| 1267 | i = XINT (AREF (font, FONT_DPI_INDEX)); | 1263 | EMACS_INT v = XINT (AREF (font, FONT_DPI_INDEX)); |
| 1268 | f[XLFD_RESX_INDEX] = p = alloca (22); | 1264 | f[XLFD_RESX_INDEX] = p = |
| 1269 | len += sprintf (p, "%d-%d", i, i) + 1; | 1265 | alloca (sizeof "-" + 2 * INT_STRLEN_BOUND (EMACS_INT)); |
| 1266 | sprintf (p, "%"pI"d-%"pI"d", v, v); | ||
| 1270 | } | 1267 | } |
| 1271 | else | 1268 | else |
| 1272 | f[XLFD_RESX_INDEX] = "*-*", len += 4; | 1269 | f[XLFD_RESX_INDEX] = "*-*"; |
| 1273 | if (INTEGERP (AREF (font, FONT_SPACING_INDEX))) | 1270 | if (INTEGERP (AREF (font, FONT_SPACING_INDEX))) |
| 1274 | { | 1271 | { |
| 1275 | int spacing = XINT (AREF (font, FONT_SPACING_INDEX)); | 1272 | EMACS_INT spacing = XINT (AREF (font, FONT_SPACING_INDEX)); |
| 1276 | 1273 | ||
| 1277 | f[XLFD_SPACING_INDEX] = (spacing <= FONT_SPACING_PROPORTIONAL ? "p" | 1274 | f[XLFD_SPACING_INDEX] = (spacing <= FONT_SPACING_PROPORTIONAL ? "p" |
| 1278 | : spacing <= FONT_SPACING_DUAL ? "d" | 1275 | : spacing <= FONT_SPACING_DUAL ? "d" |
| 1279 | : spacing <= FONT_SPACING_MONO ? "m" | 1276 | : spacing <= FONT_SPACING_MONO ? "m" |
| 1280 | : "c"); | 1277 | : "c"); |
| 1281 | len += 2; | ||
| 1282 | } | 1278 | } |
| 1283 | else | 1279 | else |
| 1284 | f[XLFD_SPACING_INDEX] = "*", len += 2; | 1280 | f[XLFD_SPACING_INDEX] = "*"; |
| 1285 | if (INTEGERP (AREF (font, FONT_AVGWIDTH_INDEX))) | 1281 | if (INTEGERP (AREF (font, FONT_AVGWIDTH_INDEX))) |
| 1286 | { | 1282 | { |
| 1287 | f[XLFD_AVGWIDTH_INDEX] = p = alloca (22); | 1283 | f[XLFD_AVGWIDTH_INDEX] = p = alloca (INT_BUFSIZE_BOUND (EMACS_INT)); |
| 1288 | len += sprintf (p, "%"pI"d", | 1284 | sprintf (p, "%"pI"d", XINT (AREF (font, FONT_AVGWIDTH_INDEX))); |
| 1289 | XINT (AREF (font, FONT_AVGWIDTH_INDEX))) + 1; | ||
| 1290 | } | 1285 | } |
| 1291 | else | 1286 | else |
| 1292 | f[XLFD_AVGWIDTH_INDEX] = "*", len += 2; | 1287 | f[XLFD_AVGWIDTH_INDEX] = "*"; |
| 1293 | len++; /* for terminating '\0'. */ | 1288 | len = snprintf (name, nbytes, "-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s", |
| 1294 | if (len >= nbytes) | ||
| 1295 | return -1; | ||
| 1296 | return sprintf (name, "-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s", | ||
| 1297 | f[XLFD_FOUNDRY_INDEX], f[XLFD_FAMILY_INDEX], | 1289 | f[XLFD_FOUNDRY_INDEX], f[XLFD_FAMILY_INDEX], |
| 1298 | f[XLFD_WEIGHT_INDEX], f[XLFD_SLANT_INDEX], | 1290 | f[XLFD_WEIGHT_INDEX], f[XLFD_SLANT_INDEX], |
| 1299 | f[XLFD_SWIDTH_INDEX], f[XLFD_ADSTYLE_INDEX], | 1291 | f[XLFD_SWIDTH_INDEX], f[XLFD_ADSTYLE_INDEX], |
| 1300 | f[XLFD_PIXEL_INDEX], f[XLFD_RESX_INDEX], | 1292 | f[XLFD_PIXEL_INDEX], f[XLFD_RESX_INDEX], |
| 1301 | f[XLFD_SPACING_INDEX], f[XLFD_AVGWIDTH_INDEX], | 1293 | f[XLFD_SPACING_INDEX], f[XLFD_AVGWIDTH_INDEX], |
| 1302 | f[XLFD_REGISTRY_INDEX]); | 1294 | f[XLFD_REGISTRY_INDEX]); |
| 1295 | return len < nbytes ? len : -1; | ||
| 1303 | } | 1296 | } |
| 1304 | 1297 | ||
| 1305 | /* Parse NAME (null terminated) and store information in FONT | 1298 | /* Parse NAME (null terminated) and store information in FONT |
| @@ -1341,7 +1334,7 @@ font_parse_fcname (char *name, Lisp_Object font) | |||
| 1341 | { | 1334 | { |
| 1342 | int decimal = 0, size_found = 1; | 1335 | int decimal = 0, size_found = 1; |
| 1343 | for (q = p + 1; *q && *q != ':'; q++) | 1336 | for (q = p + 1; *q && *q != ':'; q++) |
| 1344 | if (! isdigit(*q)) | 1337 | if (! isdigit (*q)) |
| 1345 | { | 1338 | { |
| 1346 | if (*q != '.' || decimal) | 1339 | if (*q != '.' || decimal) |
| 1347 | { | 1340 | { |
| @@ -1553,23 +1546,19 @@ int | |||
| 1553 | font_unparse_fcname (Lisp_Object font, int pixel_size, char *name, int nbytes) | 1546 | font_unparse_fcname (Lisp_Object font, int pixel_size, char *name, int nbytes) |
| 1554 | { | 1547 | { |
| 1555 | Lisp_Object family, foundry; | 1548 | Lisp_Object family, foundry; |
| 1556 | Lisp_Object tail, val; | 1549 | Lisp_Object val; |
| 1557 | int point_size; | 1550 | int point_size; |
| 1558 | int i; | 1551 | int i; |
| 1559 | ptrdiff_t len = 1; | ||
| 1560 | char *p; | 1552 | char *p; |
| 1553 | char *lim; | ||
| 1561 | Lisp_Object styles[3]; | 1554 | Lisp_Object styles[3]; |
| 1562 | const char *style_names[3] = { "weight", "slant", "width" }; | 1555 | const char *style_names[3] = { "weight", "slant", "width" }; |
| 1563 | char work[256]; | ||
| 1564 | 1556 | ||
| 1565 | family = AREF (font, FONT_FAMILY_INDEX); | 1557 | family = AREF (font, FONT_FAMILY_INDEX); |
| 1566 | if (! NILP (family)) | 1558 | if (! NILP (family)) |
| 1567 | { | 1559 | { |
| 1568 | if (SYMBOLP (family)) | 1560 | if (SYMBOLP (family)) |
| 1569 | { | 1561 | family = SYMBOL_NAME (family); |
| 1570 | family = SYMBOL_NAME (family); | ||
| 1571 | len += SBYTES (family); | ||
| 1572 | } | ||
| 1573 | else | 1562 | else |
| 1574 | family = Qnil; | 1563 | family = Qnil; |
| 1575 | } | 1564 | } |
| @@ -1580,7 +1569,6 @@ font_unparse_fcname (Lisp_Object font, int pixel_size, char *name, int nbytes) | |||
| 1580 | if (XINT (val) != 0) | 1569 | if (XINT (val) != 0) |
| 1581 | pixel_size = XINT (val); | 1570 | pixel_size = XINT (val); |
| 1582 | point_size = -1; | 1571 | point_size = -1; |
| 1583 | len += 21; /* for ":pixelsize=NUM" */ | ||
| 1584 | } | 1572 | } |
| 1585 | else | 1573 | else |
| 1586 | { | 1574 | { |
| @@ -1588,80 +1576,91 @@ font_unparse_fcname (Lisp_Object font, int pixel_size, char *name, int nbytes) | |||
| 1588 | abort (); | 1576 | abort (); |
| 1589 | pixel_size = -1; | 1577 | pixel_size = -1; |
| 1590 | point_size = (int) XFLOAT_DATA (val); | 1578 | point_size = (int) XFLOAT_DATA (val); |
| 1591 | len += 11; /* for "-NUM" */ | ||
| 1592 | } | 1579 | } |
| 1593 | 1580 | ||
| 1594 | foundry = AREF (font, FONT_FOUNDRY_INDEX); | 1581 | foundry = AREF (font, FONT_FOUNDRY_INDEX); |
| 1595 | if (! NILP (foundry)) | 1582 | if (! NILP (foundry)) |
| 1596 | { | 1583 | { |
| 1597 | if (SYMBOLP (foundry)) | 1584 | if (SYMBOLP (foundry)) |
| 1598 | { | 1585 | foundry = SYMBOL_NAME (foundry); |
| 1599 | foundry = SYMBOL_NAME (foundry); | ||
| 1600 | len += 9 + SBYTES (foundry); /* ":foundry=NAME" */ | ||
| 1601 | } | ||
| 1602 | else | 1586 | else |
| 1603 | foundry = Qnil; | 1587 | foundry = Qnil; |
| 1604 | } | 1588 | } |
| 1605 | 1589 | ||
| 1606 | for (i = 0; i < 3; i++) | 1590 | for (i = 0; i < 3; i++) |
| 1607 | { | 1591 | styles[i] = font_style_symbolic (font, FONT_WEIGHT_INDEX + i, 0); |
| 1608 | styles[i] = font_style_symbolic (font, FONT_WEIGHT_INDEX + i, 0); | ||
| 1609 | if (! NILP (styles[i])) | ||
| 1610 | len += sprintf (work, ":%s=%s", style_names[i], | ||
| 1611 | SDATA (SYMBOL_NAME (styles[i]))); | ||
| 1612 | } | ||
| 1613 | |||
| 1614 | if (INTEGERP (AREF (font, FONT_DPI_INDEX))) | ||
| 1615 | len += sprintf (work, ":dpi=%"pI"d", XINT (AREF (font, FONT_DPI_INDEX))); | ||
| 1616 | if (INTEGERP (AREF (font, FONT_SPACING_INDEX))) | ||
| 1617 | len += strlen (":spacing=100"); | ||
| 1618 | if (INTEGERP (AREF (font, FONT_AVGWIDTH_INDEX))) | ||
| 1619 | len += strlen (":scalable=false"); /* or ":scalable=true" */ | ||
| 1620 | for (tail = AREF (font, FONT_EXTRA_INDEX); CONSP (tail); tail = XCDR (tail)) | ||
| 1621 | { | ||
| 1622 | Lisp_Object key = XCAR (XCAR (tail)), value = XCDR (XCAR (tail)); | ||
| 1623 | 1592 | ||
| 1624 | len += SBYTES (SYMBOL_NAME (key)) + 1; /* for :KEY= */ | ||
| 1625 | if (STRINGP (value)) | ||
| 1626 | len += SBYTES (value); | ||
| 1627 | else if (INTEGERP (value)) | ||
| 1628 | len += sprintf (work, "%"pI"d", XINT (value)); | ||
| 1629 | else if (SYMBOLP (value)) | ||
| 1630 | len += (NILP (value) ? 5 : 4); /* for "false" or "true" */ | ||
| 1631 | } | ||
| 1632 | |||
| 1633 | if (len > nbytes) | ||
| 1634 | return -1; | ||
| 1635 | p = name; | 1593 | p = name; |
| 1594 | lim = name + nbytes; | ||
| 1636 | if (! NILP (family)) | 1595 | if (! NILP (family)) |
| 1637 | p += sprintf (p, "%s", SDATA (family)); | 1596 | { |
| 1597 | int len = snprintf (p, lim - p, "%s", SSDATA (family)); | ||
| 1598 | if (! (0 <= len && len < lim - p)) | ||
| 1599 | return -1; | ||
| 1600 | p += len; | ||
| 1601 | } | ||
| 1638 | if (point_size > 0) | 1602 | if (point_size > 0) |
| 1639 | { | 1603 | { |
| 1640 | if (p == name) | 1604 | int len = snprintf (p, lim - p, "-%d" + (p == name), point_size); |
| 1641 | p += sprintf (p, "%d", point_size); | 1605 | if (! (0 <= len && len < lim - p)) |
| 1642 | else | 1606 | return -1; |
| 1643 | p += sprintf (p, "-%d", point_size); | 1607 | p += len; |
| 1644 | } | 1608 | } |
| 1645 | else if (pixel_size > 0) | 1609 | else if (pixel_size > 0) |
| 1646 | p += sprintf (p, ":pixelsize=%d", pixel_size); | 1610 | { |
| 1611 | int len = snprintf (p, lim - p, ":pixelsize=%d", pixel_size); | ||
| 1612 | if (! (0 <= len && len < lim - p)) | ||
| 1613 | return -1; | ||
| 1614 | p += len; | ||
| 1615 | } | ||
| 1647 | if (! NILP (AREF (font, FONT_FOUNDRY_INDEX))) | 1616 | if (! NILP (AREF (font, FONT_FOUNDRY_INDEX))) |
| 1648 | p += sprintf (p, ":foundry=%s", | 1617 | { |
| 1649 | SDATA (SYMBOL_NAME (AREF (font, FONT_FOUNDRY_INDEX)))); | 1618 | int len = snprintf (p, lim - p, ":foundry=%s", |
| 1619 | SSDATA (SYMBOL_NAME (AREF (font, | ||
| 1620 | FONT_FOUNDRY_INDEX)))); | ||
| 1621 | if (! (0 <= len && len < lim - p)) | ||
| 1622 | return -1; | ||
| 1623 | p += len; | ||
| 1624 | } | ||
| 1650 | for (i = 0; i < 3; i++) | 1625 | for (i = 0; i < 3; i++) |
| 1651 | if (! NILP (styles[i])) | 1626 | if (! NILP (styles[i])) |
| 1652 | p += sprintf (p, ":%s=%s", style_names[i], | 1627 | { |
| 1653 | SDATA (SYMBOL_NAME (styles[i]))); | 1628 | int len = snprintf (p, lim - p, ":%s=%s", style_names[i], |
| 1629 | SSDATA (SYMBOL_NAME (styles[i]))); | ||
| 1630 | if (! (0 <= len && len < lim - p)) | ||
| 1631 | return -1; | ||
| 1632 | p += len; | ||
| 1633 | } | ||
| 1634 | |||
| 1654 | if (INTEGERP (AREF (font, FONT_DPI_INDEX))) | 1635 | if (INTEGERP (AREF (font, FONT_DPI_INDEX))) |
| 1655 | p += sprintf (p, ":dpi=%"pI"d", XINT (AREF (font, FONT_DPI_INDEX))); | 1636 | { |
| 1637 | int len = snprintf (p, lim - p, ":dpi=%"pI"d", | ||
| 1638 | XINT (AREF (font, FONT_DPI_INDEX))); | ||
| 1639 | if (! (0 <= len && len < lim - p)) | ||
| 1640 | return -1; | ||
| 1641 | p += len; | ||
| 1642 | } | ||
| 1643 | |||
| 1656 | if (INTEGERP (AREF (font, FONT_SPACING_INDEX))) | 1644 | if (INTEGERP (AREF (font, FONT_SPACING_INDEX))) |
| 1657 | p += sprintf (p, ":spacing=%"pI"d", XINT (AREF (font, FONT_SPACING_INDEX))); | 1645 | { |
| 1646 | int len = snprintf (p, lim - p, ":spacing=%"pI"d", | ||
| 1647 | XINT (AREF (font, FONT_SPACING_INDEX))); | ||
| 1648 | if (! (0 <= len && len < lim - p)) | ||
| 1649 | return -1; | ||
| 1650 | p += len; | ||
| 1651 | } | ||
| 1652 | |||
| 1658 | if (INTEGERP (AREF (font, FONT_AVGWIDTH_INDEX))) | 1653 | if (INTEGERP (AREF (font, FONT_AVGWIDTH_INDEX))) |
| 1659 | { | 1654 | { |
| 1660 | if (XINT (AREF (font, FONT_AVGWIDTH_INDEX)) == 0) | 1655 | int len = snprintf (p, lim - p, |
| 1661 | p += sprintf (p, ":scalable=true"); | 1656 | (XINT (AREF (font, FONT_AVGWIDTH_INDEX)) == 0 |
| 1662 | else | 1657 | ? ":scalable=true" |
| 1663 | p += sprintf (p, ":scalable=false"); | 1658 | : ":scalable=false")); |
| 1659 | if (! (0 <= len && len < lim - p)) | ||
| 1660 | return -1; | ||
| 1661 | p += len; | ||
| 1664 | } | 1662 | } |
| 1663 | |||
| 1665 | return (p - name); | 1664 | return (p - name); |
| 1666 | } | 1665 | } |
| 1667 | 1666 | ||
| @@ -1738,8 +1737,7 @@ font_parse_family_registry (Lisp_Object family, Lisp_Object registry, Lisp_Objec | |||
| 1738 | #define LGSTRING_GLYPH_SIZE 8 | 1737 | #define LGSTRING_GLYPH_SIZE 8 |
| 1739 | 1738 | ||
| 1740 | static int | 1739 | static int |
| 1741 | check_gstring (gstring) | 1740 | check_gstring (Lisp_Object gstring) |
| 1742 | Lisp_Object gstring; | ||
| 1743 | { | 1741 | { |
| 1744 | Lisp_Object val; | 1742 | Lisp_Object val; |
| 1745 | int i, j; | 1743 | int i, j; |
| @@ -1793,8 +1791,7 @@ check_gstring (gstring) | |||
| 1793 | } | 1791 | } |
| 1794 | 1792 | ||
| 1795 | static void | 1793 | static void |
| 1796 | check_otf_features (otf_features) | 1794 | check_otf_features (Lisp_Object otf_features) |
| 1797 | Lisp_Object otf_features; | ||
| 1798 | { | 1795 | { |
| 1799 | Lisp_Object val; | 1796 | Lisp_Object val; |
| 1800 | 1797 | ||
| @@ -1827,8 +1824,7 @@ check_otf_features (otf_features) | |||
| 1827 | Lisp_Object otf_list; | 1824 | Lisp_Object otf_list; |
| 1828 | 1825 | ||
| 1829 | static Lisp_Object | 1826 | static Lisp_Object |
| 1830 | otf_tag_symbol (tag) | 1827 | otf_tag_symbol (OTF_Tag tag) |
| 1831 | OTF_Tag tag; | ||
| 1832 | { | 1828 | { |
| 1833 | char name[5]; | 1829 | char name[5]; |
| 1834 | 1830 | ||
| @@ -1837,8 +1833,7 @@ otf_tag_symbol (tag) | |||
| 1837 | } | 1833 | } |
| 1838 | 1834 | ||
| 1839 | static OTF * | 1835 | static OTF * |
| 1840 | otf_open (file) | 1836 | otf_open (Lisp_Object file) |
| 1841 | Lisp_Object file; | ||
| 1842 | { | 1837 | { |
| 1843 | Lisp_Object val = Fassoc (file, otf_list); | 1838 | Lisp_Object val = Fassoc (file, otf_list); |
| 1844 | OTF *otf; | 1839 | OTF *otf; |
| @@ -1860,8 +1855,7 @@ otf_open (file) | |||
| 1860 | (struct font_driver).otf_capability. */ | 1855 | (struct font_driver).otf_capability. */ |
| 1861 | 1856 | ||
| 1862 | Lisp_Object | 1857 | Lisp_Object |
| 1863 | font_otf_capability (font) | 1858 | font_otf_capability (struct font *font) |
| 1864 | struct font *font; | ||
| 1865 | { | 1859 | { |
| 1866 | OTF *otf; | 1860 | OTF *otf; |
| 1867 | Lisp_Object capability = Fcons (Qnil, Qnil); | 1861 | Lisp_Object capability = Fcons (Qnil, Qnil); |
| @@ -1935,9 +1929,7 @@ font_otf_capability (font) | |||
| 1935 | FEATURES. */ | 1929 | FEATURES. */ |
| 1936 | 1930 | ||
| 1937 | static void | 1931 | static void |
| 1938 | generate_otf_features (spec, features) | 1932 | generate_otf_features (Lisp_Object spec, char *features) |
| 1939 | Lisp_Object spec; | ||
| 1940 | char *features; | ||
| 1941 | { | 1933 | { |
| 1942 | Lisp_Object val; | 1934 | Lisp_Object val; |
| 1943 | char *p; | 1935 | char *p; |
| @@ -1959,12 +1951,12 @@ generate_otf_features (spec, features) | |||
| 1959 | else if (! asterisk) | 1951 | else if (! asterisk) |
| 1960 | { | 1952 | { |
| 1961 | val = SYMBOL_NAME (val); | 1953 | val = SYMBOL_NAME (val); |
| 1962 | p += sprintf (p, "%s", SDATA (val)); | 1954 | p += esprintf (p, "%s", SDATA (val)); |
| 1963 | } | 1955 | } |
| 1964 | else | 1956 | else |
| 1965 | { | 1957 | { |
| 1966 | val = SYMBOL_NAME (val); | 1958 | val = SYMBOL_NAME (val); |
| 1967 | p += sprintf (p, "~%s", SDATA (val)); | 1959 | p += esprintf (p, "~%s", SDATA (val)); |
| 1968 | } | 1960 | } |
| 1969 | } | 1961 | } |
| 1970 | if (CONSP (spec)) | 1962 | if (CONSP (spec)) |
| @@ -1972,8 +1964,7 @@ generate_otf_features (spec, features) | |||
| 1972 | } | 1964 | } |
| 1973 | 1965 | ||
| 1974 | Lisp_Object | 1966 | Lisp_Object |
| 1975 | font_otf_DeviceTable (device_table) | 1967 | font_otf_DeviceTable (OTF_DeviceTable *device_table) |
| 1976 | OTF_DeviceTable *device_table; | ||
| 1977 | { | 1968 | { |
| 1978 | int len = device_table->StartSize - device_table->EndSize + 1; | 1969 | int len = device_table->StartSize - device_table->EndSize + 1; |
| 1979 | 1970 | ||
| @@ -1982,9 +1973,7 @@ font_otf_DeviceTable (device_table) | |||
| 1982 | } | 1973 | } |
| 1983 | 1974 | ||
| 1984 | Lisp_Object | 1975 | Lisp_Object |
| 1985 | font_otf_ValueRecord (value_format, value_record) | 1976 | font_otf_ValueRecord (int value_format, OTF_ValueRecord *value_record) |
| 1986 | int value_format; | ||
| 1987 | OTF_ValueRecord *value_record; | ||
| 1988 | { | 1977 | { |
| 1989 | Lisp_Object val = Fmake_vector (make_number (8), Qnil); | 1978 | Lisp_Object val = Fmake_vector (make_number (8), Qnil); |
| 1990 | 1979 | ||
| @@ -2008,8 +1997,7 @@ font_otf_ValueRecord (value_format, value_record) | |||
| 2008 | } | 1997 | } |
| 2009 | 1998 | ||
| 2010 | Lisp_Object | 1999 | Lisp_Object |
| 2011 | font_otf_Anchor (anchor) | 2000 | font_otf_Anchor (OTF_Anchor *anchor) |
| 2012 | OTF_Anchor *anchor; | ||
| 2013 | { | 2001 | { |
| 2014 | Lisp_Object val; | 2002 | Lisp_Object val; |
| 2015 | 2003 | ||
| @@ -3172,14 +3160,7 @@ font_find_for_lface (FRAME_PTR f, Lisp_Object *attrs, Lisp_Object spec, int c) | |||
| 3172 | else | 3160 | else |
| 3173 | { | 3161 | { |
| 3174 | Lisp_Object alters | 3162 | Lisp_Object alters |
| 3175 | = Fassoc_string (val, Vface_alternative_font_family_alist, | 3163 | = Fassoc_string (val, Vface_alternative_font_family_alist, Qt); |
| 3176 | /* Font family names are case-sensitive under NS. */ | ||
| 3177 | #ifndef HAVE_NS | ||
| 3178 | Qt | ||
| 3179 | #else | ||
| 3180 | Qnil | ||
| 3181 | #endif | ||
| 3182 | ); | ||
| 3183 | 3164 | ||
| 3184 | if (! NILP (alters)) | 3165 | if (! NILP (alters)) |
| 3185 | { | 3166 | { |
| @@ -3251,7 +3232,7 @@ font_open_for_lface (FRAME_PTR f, Lisp_Object entity, Lisp_Object *attrs, Lisp_O | |||
| 3251 | if (INTEGERP (height)) | 3232 | if (INTEGERP (height)) |
| 3252 | pt = XINT (height); | 3233 | pt = XINT (height); |
| 3253 | else | 3234 | else |
| 3254 | abort(); /* We should never end up here. */ | 3235 | abort (); /* We should never end up here. */ |
| 3255 | } | 3236 | } |
| 3256 | 3237 | ||
| 3257 | pt /= 10; | 3238 | pt /= 10; |
| @@ -3259,7 +3240,7 @@ font_open_for_lface (FRAME_PTR f, Lisp_Object entity, Lisp_Object *attrs, Lisp_O | |||
| 3259 | #ifdef HAVE_NS | 3240 | #ifdef HAVE_NS |
| 3260 | if (size == 0) | 3241 | if (size == 0) |
| 3261 | { | 3242 | { |
| 3262 | Lisp_Object ffsize = get_frame_param(f, Qfontsize); | 3243 | Lisp_Object ffsize = get_frame_param (f, Qfontsize); |
| 3263 | size = NUMBERP (ffsize) ? POINT_TO_PIXEL (XINT (ffsize), f->resy) : 0; | 3244 | size = NUMBERP (ffsize) ? POINT_TO_PIXEL (XINT (ffsize), f->resy) : 0; |
| 3264 | } | 3245 | } |
| 3265 | #endif | 3246 | #endif |
| @@ -5156,7 +5137,7 @@ the corresponding glyph code. If ENCODING is a char-table, looking up | |||
| 5156 | the table by a character gives the corresponding glyph code. | 5137 | the table by a character gives the corresponding glyph code. |
| 5157 | 5138 | ||
| 5158 | REPERTORY specifies a repertory of characters supported by the font. | 5139 | REPERTORY specifies a repertory of characters supported by the font. |
| 5159 | If REPERTORY is a charset, all characters beloging to the charset are | 5140 | If REPERTORY is a charset, all characters belonging to the charset are |
| 5160 | supported. If REPERTORY is a char-table, all characters who have a | 5141 | supported. If REPERTORY is a char-table, all characters who have a |
| 5161 | non-nil value in the table are supported. If REPERTORY is nil, Emacs | 5142 | non-nil value in the table are supported. If REPERTORY is nil, Emacs |
| 5162 | gets the repertory information by an opened font and ENCODING. */); | 5143 | gets the repertory information by an opened font and ENCODING. */); |