aboutsummaryrefslogtreecommitdiffstats
path: root/src/font.c
diff options
context:
space:
mode:
authorStefan Monnier2011-03-21 12:42:16 -0400
committerStefan Monnier2011-03-21 12:42:16 -0400
commitcafdcef32d55cbb44389d7e322e7f973cbb72dfd (patch)
tree7ee0c41ea8a589650ce6f4311fb10e61a63807b9 /src/font.c
parenta08a25d7aaf251aa18f2ef747be53734bc55cae9 (diff)
parent4e05e67e4cd0bc1b0a4ef3176a4d0d91c6b3738e (diff)
downloademacs-cafdcef32d55cbb44389d7e322e7f973cbb72dfd.tar.gz
emacs-cafdcef32d55cbb44389d7e322e7f973cbb72dfd.zip
Merge from trunk
Diffstat (limited to 'src/font.c')
-rw-r--r--src/font.c84
1 files changed, 34 insertions, 50 deletions
diff --git a/src/font.c b/src/font.c
index 35821ae34f9..9e8b7029c22 100644
--- a/src/font.c
+++ b/src/font.c
@@ -311,10 +311,10 @@ font_style_to_value (enum font_property_index prop, Lisp_Object val, int noerror
311{ 311{
312 Lisp_Object table = AREF (font_style_table, prop - FONT_WEIGHT_INDEX); 312 Lisp_Object table = AREF (font_style_table, prop - FONT_WEIGHT_INDEX);
313 int len = ASIZE (table); 313 int len = ASIZE (table);
314 int i, j;
315 314
316 if (SYMBOLP (val)) 315 if (SYMBOLP (val))
317 { 316 {
317 int i, j;
318 char *s; 318 char *s;
319 Lisp_Object args[2], elt; 319 Lisp_Object args[2], elt;
320 320
@@ -500,10 +500,9 @@ font_prop_validate_style (Lisp_Object style, Lisp_Object val)
500 enum font_property_index prop = (EQ (style, QCweight) ? FONT_WEIGHT_INDEX 500 enum font_property_index prop = (EQ (style, QCweight) ? FONT_WEIGHT_INDEX
501 : EQ (style, QCslant) ? FONT_SLANT_INDEX 501 : EQ (style, QCslant) ? FONT_SLANT_INDEX
502 : FONT_WIDTH_INDEX); 502 : FONT_WIDTH_INDEX);
503 int n;
504 if (INTEGERP (val)) 503 if (INTEGERP (val))
505 { 504 {
506 n = XINT (val); 505 int n = XINT (val);
507 if (((n >> 4) & 0xF) 506 if (((n >> 4) & 0xF)
508 >= ASIZE (AREF (font_style_table, prop - FONT_WEIGHT_INDEX))) 507 >= ASIZE (AREF (font_style_table, prop - FONT_WEIGHT_INDEX)))
509 val = Qerror; 508 val = Qerror;
@@ -1163,7 +1162,8 @@ font_parse_xlfd (char *name, Lisp_Object font)
1163int 1162int
1164font_unparse_xlfd (Lisp_Object font, int pixel_size, char *name, int nbytes) 1163font_unparse_xlfd (Lisp_Object font, int pixel_size, char *name, int nbytes)
1165{ 1164{
1166 char *f[XLFD_REGISTRY_INDEX + 1]; 1165 char *p;
1166 const char *f[XLFD_REGISTRY_INDEX + 1];
1167 Lisp_Object val; 1167 Lisp_Object val;
1168 int i, j, len = 0; 1168 int i, j, len = 0;
1169 1169
@@ -1194,14 +1194,14 @@ font_unparse_xlfd (Lisp_Object font, int pixel_size, char *name, int nbytes)
1194 /* Change "jisx0208*" and "jisx0208" to "jisx0208*-*". */ 1194 /* Change "jisx0208*" and "jisx0208" to "jisx0208*-*". */
1195 if (SDATA (val)[SBYTES (val) - 1] == '*') 1195 if (SDATA (val)[SBYTES (val) - 1] == '*')
1196 { 1196 {
1197 f[j] = alloca (SBYTES (val) + 3); 1197 f[j] = p = alloca (SBYTES (val) + 3);
1198 sprintf (f[j], "%s-*", SDATA (val)); 1198 sprintf (p, "%s-*", SDATA (val));
1199 len += SBYTES (val) + 3; 1199 len += SBYTES (val) + 3;
1200 } 1200 }
1201 else 1201 else
1202 { 1202 {
1203 f[j] = alloca (SBYTES (val) + 4); 1203 f[j] = p = alloca (SBYTES (val) + 4);
1204 sprintf (f[j], "%s*-*", SDATA (val)); 1204 sprintf (p, "%s*-*", SDATA (val));
1205 len += SBYTES (val) + 4; 1205 len += SBYTES (val) + 4;
1206 } 1206 }
1207 } 1207 }
@@ -1232,8 +1232,8 @@ font_unparse_xlfd (Lisp_Object font, int pixel_size, char *name, int nbytes)
1232 i = pixel_size; 1232 i = pixel_size;
1233 if (i > 0) 1233 if (i > 0)
1234 { 1234 {
1235 f[XLFD_PIXEL_INDEX] = alloca (22); 1235 f[XLFD_PIXEL_INDEX] = p = alloca (22);
1236 len += sprintf (f[XLFD_PIXEL_INDEX], "%d-*", i) + 1; 1236 len += sprintf (p, "%d-*", i) + 1;
1237 } 1237 }
1238 else 1238 else
1239 f[XLFD_PIXEL_INDEX] = "*-*", len += 4; 1239 f[XLFD_PIXEL_INDEX] = "*-*", len += 4;
@@ -1241,8 +1241,8 @@ font_unparse_xlfd (Lisp_Object font, int pixel_size, char *name, int nbytes)
1241 else if (FLOATP (val)) 1241 else if (FLOATP (val))
1242 { 1242 {
1243 i = XFLOAT_DATA (val) * 10; 1243 i = XFLOAT_DATA (val) * 10;
1244 f[XLFD_PIXEL_INDEX] = alloca (12); 1244 f[XLFD_PIXEL_INDEX] = p = alloca (12);
1245 len += sprintf (f[XLFD_PIXEL_INDEX], "*-%d", i) + 1; 1245 len += sprintf (p, "*-%d", i) + 1;
1246 } 1246 }
1247 else 1247 else
1248 f[XLFD_PIXEL_INDEX] = "*-*", len += 4; 1248 f[XLFD_PIXEL_INDEX] = "*-*", len += 4;
@@ -1250,9 +1250,8 @@ font_unparse_xlfd (Lisp_Object font, int pixel_size, char *name, int nbytes)
1250 if (INTEGERP (AREF (font, FONT_DPI_INDEX))) 1250 if (INTEGERP (AREF (font, FONT_DPI_INDEX)))
1251 { 1251 {
1252 i = XINT (AREF (font, FONT_DPI_INDEX)); 1252 i = XINT (AREF (font, FONT_DPI_INDEX));
1253 f[XLFD_RESX_INDEX] = alloca (22); 1253 f[XLFD_RESX_INDEX] = p = alloca (22);
1254 len += sprintf (f[XLFD_RESX_INDEX], 1254 len += sprintf (p, "%d-%d", i, i) + 1;
1255 "%d-%d", i, i) + 1;
1256 } 1255 }
1257 else 1256 else
1258 f[XLFD_RESX_INDEX] = "*-*", len += 4; 1257 f[XLFD_RESX_INDEX] = "*-*", len += 4;
@@ -1270,8 +1269,8 @@ font_unparse_xlfd (Lisp_Object font, int pixel_size, char *name, int nbytes)
1270 f[XLFD_SPACING_INDEX] = "*", len += 2; 1269 f[XLFD_SPACING_INDEX] = "*", len += 2;
1271 if (INTEGERP (AREF (font, FONT_AVGWIDTH_INDEX))) 1270 if (INTEGERP (AREF (font, FONT_AVGWIDTH_INDEX)))
1272 { 1271 {
1273 f[XLFD_AVGWIDTH_INDEX] = alloca (11); 1272 f[XLFD_AVGWIDTH_INDEX] = p = alloca (11);
1274 len += sprintf (f[XLFD_AVGWIDTH_INDEX], "%ld", 1273 len += sprintf (p, "%ld",
1275 (long) XINT (AREF (font, FONT_AVGWIDTH_INDEX))) + 1; 1274 (long) XINT (AREF (font, FONT_AVGWIDTH_INDEX))) + 1;
1276 } 1275 }
1277 else 1276 else
@@ -1448,12 +1447,10 @@ font_parse_fcname (char *name, Lisp_Object font)
1448 { 1447 {
1449 /* Either a fontconfig-style name with no size and property 1448 /* Either a fontconfig-style name with no size and property
1450 data, or a GTK-style name. */ 1449 data, or a GTK-style name. */
1451 Lisp_Object prop;
1452 Lisp_Object weight = Qnil, slant = Qnil; 1450 Lisp_Object weight = Qnil, slant = Qnil;
1453 Lisp_Object width = Qnil, size = Qnil; 1451 Lisp_Object width = Qnil, size = Qnil;
1454 char *word_start; 1452 char *word_start;
1455 int word_len; 1453 int word_len;
1456 int size_found = 0;
1457 1454
1458 /* Scan backwards from the end, looking for a size. */ 1455 /* Scan backwards from the end, looking for a size. */
1459 for (p = name + len - 1; p >= name; p--) 1456 for (p = name + len - 1; p >= name; p--)
@@ -1569,8 +1566,10 @@ font_unparse_fcname (Lisp_Object font, int pixel_size, char *name, int nbytes)
1569 point_size = -1; 1566 point_size = -1;
1570 len += 21; /* for ":pixelsize=NUM" */ 1567 len += 21; /* for ":pixelsize=NUM" */
1571 } 1568 }
1572 else if (FLOATP (val)) 1569 else
1573 { 1570 {
1571 if (! FLOATP (val))
1572 abort ();
1574 pixel_size = -1; 1573 pixel_size = -1;
1575 point_size = (int) XFLOAT_DATA (val); 1574 point_size = (int) XFLOAT_DATA (val);
1576 len += 11; /* for "-NUM" */ 1575 len += 11; /* for "-NUM" */
@@ -1604,15 +1603,15 @@ font_unparse_fcname (Lisp_Object font, int pixel_size, char *name, int nbytes)
1604 len += strlen (":scalable=false"); /* or ":scalable=true" */ 1603 len += strlen (":scalable=false"); /* or ":scalable=true" */
1605 for (tail = AREF (font, FONT_EXTRA_INDEX); CONSP (tail); tail = XCDR (tail)) 1604 for (tail = AREF (font, FONT_EXTRA_INDEX); CONSP (tail); tail = XCDR (tail))
1606 { 1605 {
1607 Lisp_Object key = XCAR (XCAR (tail)), val = XCDR (XCAR (tail)); 1606 Lisp_Object key = XCAR (XCAR (tail)), value = XCDR (XCAR (tail));
1608 1607
1609 len += SBYTES (SYMBOL_NAME (key)) + 1; /* for :KEY= */ 1608 len += SBYTES (SYMBOL_NAME (key)) + 1; /* for :KEY= */
1610 if (STRINGP (val)) 1609 if (STRINGP (value))
1611 len += SBYTES (val); 1610 len += SBYTES (value);
1612 else if (INTEGERP (val)) 1611 else if (INTEGERP (value))
1613 len += sprintf (work, "%ld", (long) XINT (val)); 1612 len += sprintf (work, "%ld", (long) XINT (value));
1614 else if (SYMBOLP (val)) 1613 else if (SYMBOLP (value))
1615 len += (NILP (val) ? 5 : 4); /* for "false" or "true" */ 1614 len += (NILP (value) ? 5 : 4); /* for "false" or "true" */
1616 } 1615 }
1617 1616
1618 if (len > nbytes) 1617 if (len > nbytes)
@@ -2178,7 +2177,7 @@ font_sort_entities (Lisp_Object list, Lisp_Object prefer, Lisp_Object frame, int
2178 unsigned best_score; 2177 unsigned best_score;
2179 Lisp_Object best_entity; 2178 Lisp_Object best_entity;
2180 struct frame *f = XFRAME (frame); 2179 struct frame *f = XFRAME (frame);
2181 Lisp_Object tail, vec; 2180 Lisp_Object tail, vec IF_LINT (= Qnil);
2182 USE_SAFE_ALLOCA; 2181 USE_SAFE_ALLOCA;
2183 2182
2184 for (i = FONT_WEIGHT_INDEX; i <= FONT_AVGWIDTH_INDEX; i++) 2183 for (i = FONT_WEIGHT_INDEX; i <= FONT_AVGWIDTH_INDEX; i++)
@@ -2602,7 +2601,7 @@ static Lisp_Object scratch_font_spec, scratch_font_prefer;
2602 (2) doesn't match with any regexps in Vface_ignored_fonts (if non-nil). 2601 (2) doesn't match with any regexps in Vface_ignored_fonts (if non-nil).
2603*/ 2602*/
2604 2603
2605Lisp_Object 2604static Lisp_Object
2606font_delete_unmatched (Lisp_Object vec, Lisp_Object spec, int size) 2605font_delete_unmatched (Lisp_Object vec, Lisp_Object spec, int size)
2607{ 2606{
2608 Lisp_Object entity, val; 2607 Lisp_Object entity, val;
@@ -2951,22 +2950,6 @@ font_get_name (Lisp_Object font_object)
2951} 2950}
2952 2951
2953 2952
2954/* Return the specification of FONT_OBJECT. */
2955
2956Lisp_Object
2957font_get_spec (Lisp_Object font_object)
2958{
2959 Lisp_Object spec = font_make_spec ();
2960 int i;
2961
2962 for (i = 0; i < FONT_SIZE_INDEX; i++)
2963 ASET (spec, i, AREF (font_object, i));
2964 ASET (spec, FONT_SIZE_INDEX,
2965 make_number (XFONT_OBJECT (font_object)->pixel_size));
2966 return spec;
2967}
2968
2969
2970/* Create a new font spec from FONT_NAME, and return it. If FONT_NAME 2953/* Create a new font spec from FONT_NAME, and return it. If FONT_NAME
2971 could not be parsed by font_parse_name, return Qnil. */ 2954 could not be parsed by font_parse_name, return Qnil. */
2972 2955
@@ -3436,14 +3419,13 @@ Lisp_Object
3436font_update_drivers (FRAME_PTR f, Lisp_Object new_drivers) 3419font_update_drivers (FRAME_PTR f, Lisp_Object new_drivers)
3437{ 3420{
3438 Lisp_Object active_drivers = Qnil; 3421 Lisp_Object active_drivers = Qnil;
3439 struct font_driver *driver;
3440 struct font_driver_list *list; 3422 struct font_driver_list *list;
3441 3423
3442 /* At first, turn off non-requested drivers, and turn on requested 3424 /* At first, turn off non-requested drivers, and turn on requested
3443 drivers. */ 3425 drivers. */
3444 for (list = f->font_driver_list; list; list = list->next) 3426 for (list = f->font_driver_list; list; list = list->next)
3445 { 3427 {
3446 driver = list->driver; 3428 struct font_driver *driver = list->driver;
3447 if ((EQ (new_drivers, Qt) || ! NILP (Fmemq (driver->type, new_drivers))) 3429 if ((EQ (new_drivers, Qt) || ! NILP (Fmemq (driver->type, new_drivers)))
3448 != list->on) 3430 != list->on)
3449 { 3431 {
@@ -4669,7 +4651,7 @@ the corresponding element is nil. */)
4669 Lisp_Object object) 4651 Lisp_Object object)
4670{ 4652{
4671 struct font *font; 4653 struct font *font;
4672 int i, len, c; 4654 int i, len;
4673 Lisp_Object *chars, vec; 4655 Lisp_Object *chars, vec;
4674 USE_SAFE_ALLOCA; 4656 USE_SAFE_ALLOCA;
4675 4657
@@ -4687,6 +4669,7 @@ the corresponding element is nil. */)
4687 bytepos = CHAR_TO_BYTE (charpos); 4669 bytepos = CHAR_TO_BYTE (charpos);
4688 for (i = 0; charpos < XFASTINT (to); i++) 4670 for (i = 0; charpos < XFASTINT (to); i++)
4689 { 4671 {
4672 int c;
4690 FETCH_CHAR_ADVANCE (c, charpos, bytepos); 4673 FETCH_CHAR_ADVANCE (c, charpos, bytepos);
4691 chars[i] = make_number (c); 4674 chars[i] = make_number (c);
4692 } 4675 }
@@ -4708,7 +4691,7 @@ the corresponding element is nil. */)
4708 if (STRING_MULTIBYTE (object)) 4691 if (STRING_MULTIBYTE (object))
4709 for (i = 0; i < len; i++) 4692 for (i = 0; i < len; i++)
4710 { 4693 {
4711 c = STRING_CHAR_ADVANCE (p); 4694 int c = STRING_CHAR_ADVANCE (p);
4712 chars[i] = make_number (c); 4695 chars[i] = make_number (c);
4713 } 4696 }
4714 else 4697 else
@@ -4959,7 +4942,7 @@ static Lisp_Object Vfont_log_deferred;
4959void 4942void
4960font_add_log (const char *action, Lisp_Object arg, Lisp_Object result) 4943font_add_log (const char *action, Lisp_Object arg, Lisp_Object result)
4961{ 4944{
4962 Lisp_Object tail, val; 4945 Lisp_Object val;
4963 int i; 4946 int i;
4964 4947
4965 if (EQ (Vfont_log, Qt)) 4948 if (EQ (Vfont_log, Qt))
@@ -5015,6 +4998,7 @@ font_add_log (const char *action, Lisp_Object arg, Lisp_Object result)
5015 } 4998 }
5016 else if (CONSP (result)) 4999 else if (CONSP (result))
5017 { 5000 {
5001 Lisp_Object tail;
5018 result = Fcopy_sequence (result); 5002 result = Fcopy_sequence (result);
5019 for (tail = result; CONSP (tail); tail = XCDR (tail)) 5003 for (tail = result; CONSP (tail); tail = XCDR (tail))
5020 { 5004 {