aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKenichi Handa2006-06-19 01:38:26 +0000
committerKenichi Handa2006-06-19 01:38:26 +0000
commita9262bb8a2212a118c89da7da023a15e7f1acac9 (patch)
treeaa1ce2b02c532b9db65504750a46721e294f63c5 /src
parenta49d705d68e1e7d72d554ca3eb06168b58b03a93 (diff)
downloademacs-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.c109
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