diff options
| author | Stefan Monnier | 2011-03-21 12:42:16 -0400 |
|---|---|---|
| committer | Stefan Monnier | 2011-03-21 12:42:16 -0400 |
| commit | cafdcef32d55cbb44389d7e322e7f973cbb72dfd (patch) | |
| tree | 7ee0c41ea8a589650ce6f4311fb10e61a63807b9 /src/font.c | |
| parent | a08a25d7aaf251aa18f2ef747be53734bc55cae9 (diff) | |
| parent | 4e05e67e4cd0bc1b0a4ef3176a4d0d91c6b3738e (diff) | |
| download | emacs-cafdcef32d55cbb44389d7e322e7f973cbb72dfd.tar.gz emacs-cafdcef32d55cbb44389d7e322e7f973cbb72dfd.zip | |
Merge from trunk
Diffstat (limited to 'src/font.c')
| -rw-r--r-- | src/font.c | 84 |
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) | |||
| 1163 | int | 1162 | int |
| 1164 | font_unparse_xlfd (Lisp_Object font, int pixel_size, char *name, int nbytes) | 1163 | font_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 | ||
| 2605 | Lisp_Object | 2604 | static Lisp_Object |
| 2606 | font_delete_unmatched (Lisp_Object vec, Lisp_Object spec, int size) | 2605 | font_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 | |||
| 2956 | Lisp_Object | ||
| 2957 | font_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 | |||
| 3436 | font_update_drivers (FRAME_PTR f, Lisp_Object new_drivers) | 3419 | font_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; | |||
| 4959 | void | 4942 | void |
| 4960 | font_add_log (const char *action, Lisp_Object arg, Lisp_Object result) | 4943 | font_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 | { |