diff options
| author | Kenichi Handa | 2006-06-19 01:38:26 +0000 |
|---|---|---|
| committer | Kenichi Handa | 2006-06-19 01:38:26 +0000 |
| commit | a9262bb8a2212a118c89da7da023a15e7f1acac9 (patch) | |
| tree | aa1ce2b02c532b9db65504750a46721e294f63c5 /src | |
| parent | a49d705d68e1e7d72d554ca3eb06168b58b03a93 (diff) | |
| download | emacs-a9262bb8a2212a118c89da7da023a15e7f1acac9.tar.gz emacs-a9262bb8a2212a118c89da7da023a15e7f1acac9.zip | |
(font_parse_fcname): Fix parsing of point-size.
(font_unparse_fcname): Produce symbolic names for style
properties.
(font_list_entities): Handle float size correctly.
(font_open_by_name): Prefer `normal' property values if the name
doesn't specify them.
Diffstat (limited to 'src')
| -rw-r--r-- | src/font.c | 109 |
1 files changed, 67 insertions, 42 deletions
diff --git a/src/font.c b/src/font.c index 38cf29d0c02..0ec174393ae 100644 --- a/src/font.c +++ b/src/font.c | |||
| @@ -993,13 +993,18 @@ font_parse_fcname (name, font, merge) | |||
| 993 | else | 993 | else |
| 994 | { | 994 | { |
| 995 | for (p0 = name + 1; *p0 && (*p0 != '-' && *p0 != ':'); p0++); | 995 | for (p0 = name + 1; *p0 && (*p0 != '-' && *p0 != ':'); p0++); |
| 996 | family = intern_font_field (name, p0 - name); | 996 | if (isdigit (name[0]) && *p0 != '-') |
| 997 | if (*p0 == '-') | 997 | point_size = strtod (name, NULL); |
| 998 | else | ||
| 998 | { | 999 | { |
| 999 | point_size = strtod (p0 + 1, &p1); | 1000 | family = intern_font_field (name, p0 - name); |
| 1000 | if (*p1 && *p1 != ':') | 1001 | if (*p0 == '-') |
| 1001 | return -1; | 1002 | { |
| 1002 | p0 = p1; | 1003 | point_size = strtod (p0 + 1, &p1); |
| 1004 | if (*p1 && *p1 != ':') | ||
| 1005 | return -1; | ||
| 1006 | p0 = p1; | ||
| 1007 | } | ||
| 1003 | } | 1008 | } |
| 1004 | if (! merge || NILP (AREF (font, FONT_FAMILY_INDEX))) | 1009 | if (! merge || NILP (AREF (font, FONT_FAMILY_INDEX))) |
| 1005 | ASET (font, FONT_FAMILY_INDEX, family); | 1010 | ASET (font, FONT_FAMILY_INDEX, family); |
| @@ -1072,6 +1077,8 @@ font_unparse_fcname (font, pixel_size, name, nbytes) | |||
| 1072 | int pt = 0; | 1077 | int pt = 0; |
| 1073 | int i, j, len = 1; | 1078 | int i, j, len = 1; |
| 1074 | char *p; | 1079 | char *p; |
| 1080 | Lisp_Object styles[3]; | ||
| 1081 | char *style_names[3] = { "weight", "slant", "swidth" }; | ||
| 1075 | 1082 | ||
| 1076 | if (SYMBOLP (AREF (font, FONT_FAMILY_INDEX)) | 1083 | if (SYMBOLP (AREF (font, FONT_FAMILY_INDEX)) |
| 1077 | && ! NILP (AREF (font, FONT_FAMILY_INDEX))) | 1084 | && ! NILP (AREF (font, FONT_FAMILY_INDEX))) |
| @@ -1094,30 +1101,35 @@ font_unparse_fcname (font, pixel_size, name, nbytes) | |||
| 1094 | && ! NILP (AREF (font, FONT_FOUNDRY_INDEX))) | 1101 | && ! NILP (AREF (font, FONT_FOUNDRY_INDEX))) |
| 1095 | /* ":foundry=NAME" */ | 1102 | /* ":foundry=NAME" */ |
| 1096 | len += 9 + SBYTES (SYMBOL_NAME (AREF (font, FONT_FOUNDRY_INDEX))); | 1103 | len += 9 + SBYTES (SYMBOL_NAME (AREF (font, FONT_FOUNDRY_INDEX))); |
| 1097 | if (INTEGERP (AREF (font, FONT_WEIGHT_INDEX))) | 1104 | for (i = FONT_WEIGHT_INDEX; i <= FONT_WIDTH_INDEX; i++) |
| 1098 | len += 18; /* ":weight=NUM" */ | 1105 | { |
| 1099 | if (INTEGERP (AREF (font, FONT_SLANT_INDEX))) | 1106 | val = AREF (font, i); |
| 1100 | len += 17; /* ":slant=NUM" */ | 1107 | if (INTEGERP (val)) |
| 1101 | if (INTEGERP (AREF (font, FONT_WIDTH_INDEX))) | 1108 | { |
| 1102 | len += 17; /* ":width=NUM" */ | 1109 | val = prop_numeric_to_name (i, XINT (val)); |
| 1110 | len += (strlen (style_names[i - FONT_WEIGHT_INDEX]) | ||
| 1111 | + 2 + SBYTES (SYMBOL_NAME (val))); /* :xxx=NAME */ | ||
| 1112 | } | ||
| 1113 | styles[i - FONT_WEIGHT_INDEX] = val; | ||
| 1114 | } | ||
| 1103 | if (len > nbytes) | 1115 | if (len > nbytes) |
| 1104 | return -1; | 1116 | return -1; |
| 1105 | p = name; | 1117 | p = name; |
| 1106 | if (! NILP (AREF (font, FONT_FAMILY_INDEX))) | 1118 | if (! NILP (AREF (font, FONT_FAMILY_INDEX))) |
| 1107 | strcpy (p, SDATA (SYMBOL_NAME (AREF (font, FONT_FAMILY_INDEX)))), | 1119 | p += sprintf(p, "%s", |
| 1108 | p += SBYTES (SYMBOL_NAME (AREF (font, FONT_FAMILY_INDEX))); | 1120 | SDATA (SYMBOL_NAME (AREF (font, FONT_FAMILY_INDEX)))); |
| 1109 | if (pt > 0) | 1121 | if (pt > 0) |
| 1110 | p += sprintf (p, "-%d", pt); | 1122 | p += sprintf (p, "-%d", pt); |
| 1111 | else if (pixel_size > 0) | 1123 | else if (pixel_size > 0) |
| 1112 | p += sprintf (p, ":pixelsize=%d", pixel_size); | 1124 | p += sprintf (p, ":pixelsize=%d", pixel_size); |
| 1113 | if (! NILP (AREF (font, FONT_FOUNDRY_INDEX))) | 1125 | if (SYMBOLP (AREF (font, FONT_FOUNDRY_INDEX)) |
| 1114 | p += sprintf (p, ":foundry=%s", SDATA (AREF (font, FONT_FOUNDRY_INDEX))); | 1126 | && ! NILP (AREF (font, FONT_FOUNDRY_INDEX))) |
| 1115 | if (INTEGERP (AREF (font, FONT_WEIGHT_INDEX))) | 1127 | p += sprintf (p, ":foundry=%s", |
| 1116 | p += sprintf (p, ":weight=%d", XINT (AREF (font, FONT_WEIGHT_INDEX))); | 1128 | SDATA (SYMBOL_NAME (AREF (font, FONT_FOUNDRY_INDEX)))); |
| 1117 | if (INTEGERP (AREF (font, FONT_SLANT_INDEX))) | 1129 | for (i = 0; i < 3; i++) |
| 1118 | p += sprintf (p, ":slant=%d", XINT (AREF (font, FONT_SLANT_INDEX))); | 1130 | if (! NILP (styles [i])) |
| 1119 | if (INTEGERP (AREF (font, FONT_WIDTH_INDEX))) | 1131 | p += sprintf (p, ":%s=%s", style_names[i], |
| 1120 | p += sprintf (p, ":width=%d", XINT (AREF (font, FONT_WIDTH_INDEX))); | 1132 | SDATA (SYMBOL_NAME (styles [i]))); |
| 1121 | return (p - name); | 1133 | return (p - name); |
| 1122 | } | 1134 | } |
| 1123 | 1135 | ||
| @@ -1971,7 +1983,7 @@ font_list_entities (frame, spec) | |||
| 1971 | { | 1983 | { |
| 1972 | FRAME_PTR f = XFRAME (frame); | 1984 | FRAME_PTR f = XFRAME (frame); |
| 1973 | struct font_driver_list *driver_list = f->font_driver_list; | 1985 | struct font_driver_list *driver_list = f->font_driver_list; |
| 1974 | Lisp_Object ftype, family, alternate_familes; | 1986 | Lisp_Object ftype, family, size, alternate_familes; |
| 1975 | Lisp_Object *vec = alloca (sizeof (Lisp_Object) * num_font_drivers); | 1987 | Lisp_Object *vec = alloca (sizeof (Lisp_Object) * num_font_drivers); |
| 1976 | int i; | 1988 | int i; |
| 1977 | 1989 | ||
| @@ -1990,6 +2002,10 @@ font_list_entities (frame, spec) | |||
| 1990 | if (! NILP (alternate_familes)) | 2002 | if (! NILP (alternate_familes)) |
| 1991 | alternate_familes = XCDR (alternate_familes); | 2003 | alternate_familes = XCDR (alternate_familes); |
| 1992 | } | 2004 | } |
| 2005 | size = AREF (spec, FONT_SIZE_INDEX); | ||
| 2006 | if (FLOATP (size)) | ||
| 2007 | ASET (spec, FONT_SIZE_INDEX, POINT_TO_PIXEL (size * 10, f->resy)); | ||
| 2008 | |||
| 1993 | xassert (ASIZE (spec) == FONT_SPEC_MAX); | 2009 | xassert (ASIZE (spec) == FONT_SPEC_MAX); |
| 1994 | ftype = AREF (spec, FONT_TYPE_INDEX); | 2010 | ftype = AREF (spec, FONT_TYPE_INDEX); |
| 1995 | 2011 | ||
| @@ -2029,6 +2045,7 @@ font_list_entities (frame, spec) | |||
| 2029 | } | 2045 | } |
| 2030 | ASET (spec, FONT_TYPE_INDEX, ftype); | 2046 | ASET (spec, FONT_TYPE_INDEX, ftype); |
| 2031 | ASET (spec, FONT_FAMILY_INDEX, family); | 2047 | ASET (spec, FONT_FAMILY_INDEX, family); |
| 2048 | ASET (spec, FONT_SIZE_INDEX, size); | ||
| 2032 | return (i > 0 ? Fvconcat (i, vec) : null_vector); | 2049 | return (i > 0 ? Fvconcat (i, vec) : null_vector); |
| 2033 | } | 2050 | } |
| 2034 | 2051 | ||
| @@ -2317,37 +2334,45 @@ font_open_by_name (f, name) | |||
| 2317 | char *name; | 2334 | char *name; |
| 2318 | { | 2335 | { |
| 2319 | Lisp_Object args[2]; | 2336 | Lisp_Object args[2]; |
| 2320 | Lisp_Object spec; | 2337 | Lisp_Object spec, prefer, size, entities; |
| 2321 | Lisp_Object frame; | 2338 | Lisp_Object frame; |
| 2322 | struct font_driver_list *dlist; | 2339 | struct font_driver_list *dlist; |
| 2340 | int i; | ||
| 2323 | int pixel_size; | 2341 | int pixel_size; |
| 2324 | 2342 | ||
| 2325 | XSETFRAME (frame, f); | 2343 | XSETFRAME (frame, f); |
| 2344 | |||
| 2326 | args[0] = QCname; | 2345 | args[0] = QCname; |
| 2327 | args[1] = make_unibyte_string (name, strlen (name)); | 2346 | args[1] = make_unibyte_string (name, strlen (name)); |
| 2328 | spec = Ffont_spec (2, args); | 2347 | spec = Ffont_spec (2, args); |
| 2329 | 2348 | prefer = scratch_font_prefer; | |
| 2330 | if (INTEGERP (AREF (spec, FONT_SIZE_INDEX))) | 2349 | for (i = FONT_WEIGHT_INDEX; i < FONT_SIZE_INDEX; i++) |
| 2331 | pixel_size = XINT (AREF (spec, FONT_SIZE_INDEX)); | 2350 | if (NILP (AREF (spec, i))) |
| 2332 | else if (FLOATP (AREF (spec, FONT_SIZE_INDEX))) | 2351 | ASET (prefer, i, make_number (100)); |
| 2352 | size = AREF (spec, FONT_SIZE_INDEX); | ||
| 2353 | if (NILP (size)) | ||
| 2354 | pixel_size = 0; | ||
| 2355 | else if (INTEGERP (size)) | ||
| 2356 | pixel_size = XINT (size); | ||
| 2357 | else /* FLOATP (size) */ | ||
| 2333 | { | 2358 | { |
| 2334 | double pt = XFLOAT_DATA (AREF (spec, FONT_SIZE_INDEX)); | 2359 | double pt = XFLOAT_DATA (size) * 10; |
| 2335 | pixel_size = POINT_TO_PIXEL (pt * 10, f->resy); | 2360 | |
| 2361 | pixel_size = POINT_TO_PIXEL (pt, f->resy); | ||
| 2362 | size = make_number (pixel_size); | ||
| 2363 | ASET (spec, FONT_SIZE_INDEX, size); | ||
| 2336 | } | 2364 | } |
| 2337 | else | 2365 | if (pixel_size == 0) |
| 2338 | pixel_size = 12; | ||
| 2339 | for (dlist = f->font_driver_list; dlist; dlist = dlist->next) | ||
| 2340 | { | 2366 | { |
| 2341 | Lisp_Object entities = font_list_entities (frame, spec); | 2367 | pixel_size = POINT_TO_PIXEL (120.0, f->resy); |
| 2342 | Lisp_Object font_object; | 2368 | size = make_number (pixel_size); |
| 2343 | |||
| 2344 | if (ASIZE (entities) == 0) | ||
| 2345 | continue; | ||
| 2346 | font_object = font_open_entity (f, AREF (entities, 0), pixel_size); | ||
| 2347 | if (! NILP (font_object)) | ||
| 2348 | return font_object; | ||
| 2349 | } | 2369 | } |
| 2350 | return Qnil; | 2370 | ASET (prefer, FONT_SIZE_INDEX, size); |
| 2371 | |||
| 2372 | entities = Flist_fonts (spec, frame, make_number (1), prefer); | ||
| 2373 | return (NILP (entities) | ||
| 2374 | ? Qnil | ||
| 2375 | : font_open_entity (f, XCAR (entities), pixel_size)); | ||
| 2351 | } | 2376 | } |
| 2352 | 2377 | ||
| 2353 | 2378 | ||