aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChong Yidong2011-01-26 13:10:04 -0500
committerChong Yidong2011-01-26 13:10:04 -0500
commit6608a7d8fb941119faeb8873df0f56eea0ac1764 (patch)
treebd0ec795e234761deec190592842a0c7824802d9 /src
parente4dbdb099213f183db9b46fa93f998319dfb64cd (diff)
downloademacs-6608a7d8fb941119faeb8873df0f56eea0ac1764.tar.gz
emacs-6608a7d8fb941119faeb8873df0f56eea0ac1764.zip
* src/font.c (font_parse_fcname): Rewrite GTK font name parser.
* test/font-parse-testsuite.el (test-font-parse-data): New file.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog4
-rw-r--r--src/font.c134
2 files changed, 58 insertions, 80 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 76f81d61354..2041b5bb45c 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,7 @@
12011-01-26 Chong Yidong <cyd@stupidchicken.com>
2
3 * font.c (font_parse_fcname): Rewrite GTK font name parser.
4
12011-01-25 Stefan Monnier <monnier@iro.umontreal.ca> 52011-01-25 Stefan Monnier <monnier@iro.umontreal.ca>
2 6
3 * xdisp.c (handle_fontified_prop): Be careful with font-lock changing 7 * xdisp.c (handle_fontified_prop): Be careful with font-lock changing
diff --git a/src/font.c b/src/font.c
index eb217c6f60f..52b239569bd 100644
--- a/src/font.c
+++ b/src/font.c
@@ -1448,109 +1448,83 @@ font_parse_fcname (char *name, Lisp_Object font)
1448 /* Either a fontconfig-style name with no size and property 1448 /* Either a fontconfig-style name with no size and property
1449 data, or a GTK-style name. */ 1449 data, or a GTK-style name. */
1450 Lisp_Object prop; 1450 Lisp_Object prop;
1451 int word_len, prop_found = 0; 1451 Lisp_Object weight = Qnil, slant = Qnil;
1452 Lisp_Object width = Qnil, size = Qnil;
1453 char *word_start;
1454 int word_len;
1455 int size_found = 0;
1456
1457 /* Scan backwards from the end, looking for a size. */
1458 for (p = name + len - 1; p >= name; p--)
1459 if (!isdigit (*p))
1460 break;
1461
1462 if ((p < name + len - 1) && ((p + 1 == name) || *p == ' '))
1463 /* Found a font size. */
1464 size = make_float (strtod (p + 1, NULL));
1465 else
1466 p = name + len;
1452 1467
1453 for (p = name; *p; p = *q ? q + 1 : q) 1468 /* Now P points to the termination of the string, sans size.
1469 Scan backwards, looking for font properties. */
1470 for (; p > name; p = q)
1454 { 1471 {
1455 if (isdigit (*p)) 1472 for (q = p - 1; q >= name; q--)
1456 { 1473 {
1457 int size_found = 1; 1474 if (q > name && *(q-1) == '\\')
1458 1475 --q; /* Skip quoting backslashes. */
1459 for (q = p + 1; *q && *q != ' '; q++) 1476 else if (*q == ' ')
1460 if (! isdigit (*q) && *q != '.') 1477 break;
1461 {
1462 size_found = 0;
1463 break;
1464 }
1465 if (size_found)
1466 {
1467 double point_size = strtod (p, &q);
1468 ASET (font, FONT_SIZE_INDEX, make_float (point_size));
1469 continue;
1470 }
1471 } 1478 }
1472 1479
1473 for (q = p + 1; *q && *q != ' '; q++) 1480 word_start = q + 1;
1474 if (*q == '\\' && q[1]) 1481 word_len = p - word_start;
1475 q++;
1476 word_len = q - p;
1477 1482
1478#define PROP_MATCH(STR,N) ((word_len == N) && memcmp (p, STR, N) == 0) 1483#define PROP_MATCH(STR,N) \
1484 ((word_len == N) && memcmp (word_start, STR, N) == 0)
1485#define PROP_SAVE(VAR,STR,N) \
1486 (VAR = NILP (VAR) ? font_intern_prop (STR, N, 1) : VAR)
1479 1487
1480 if (PROP_MATCH ("Ultra-Light", 11)) 1488 if (PROP_MATCH ("Ultra-Light", 11))
1481 { 1489 PROP_SAVE (weight, "ultra-light", 11);
1482 prop_found = 1;
1483 prop = font_intern_prop ("ultra-light", 11, 1);
1484 FONT_SET_STYLE (font, FONT_WEIGHT_INDEX, prop);
1485 }
1486 else if (PROP_MATCH ("Light", 5)) 1490 else if (PROP_MATCH ("Light", 5))
1487 { 1491 PROP_SAVE (weight, "light", 5);
1488 prop_found = 1;
1489 prop = font_intern_prop ("light", 5, 1);
1490 FONT_SET_STYLE (font, FONT_WEIGHT_INDEX, prop);
1491 }
1492 else if (PROP_MATCH ("Book", 4)) 1492 else if (PROP_MATCH ("Book", 4))
1493 { 1493 PROP_SAVE (weight, "book", 4);
1494 prop_found = 1;
1495 prop = font_intern_prop ("book", 4, 1);
1496 FONT_SET_STYLE (font, FONT_WEIGHT_INDEX, prop);
1497 }
1498 else if (PROP_MATCH ("Medium", 6)) 1494 else if (PROP_MATCH ("Medium", 6))
1499 { 1495 PROP_SAVE (weight, "medium", 6);
1500 prop_found = 1;
1501 prop = font_intern_prop ("medium", 6, 1);
1502 FONT_SET_STYLE (font, FONT_WEIGHT_INDEX, prop);
1503 }
1504 else if (PROP_MATCH ("Semi-Bold", 9)) 1496 else if (PROP_MATCH ("Semi-Bold", 9))
1505 { 1497 PROP_SAVE (weight, "semi-bold", 9);
1506 prop_found = 1;
1507 prop = font_intern_prop ("semi-bold", 9, 1);
1508 FONT_SET_STYLE (font, FONT_WEIGHT_INDEX, prop);
1509 }
1510 else if (PROP_MATCH ("Bold", 4)) 1498 else if (PROP_MATCH ("Bold", 4))
1511 { 1499 PROP_SAVE (weight, "bold", 4);
1512 prop_found = 1;
1513 prop = font_intern_prop ("bold", 4, 1);
1514 FONT_SET_STYLE (font, FONT_WEIGHT_INDEX, prop);
1515 }
1516 else if (PROP_MATCH ("Italic", 6)) 1500 else if (PROP_MATCH ("Italic", 6))
1517 { 1501 PROP_SAVE (slant, "italic", 6);
1518 prop_found = 1;
1519 prop = font_intern_prop ("italic", 4, 1);
1520 FONT_SET_STYLE (font, FONT_SLANT_INDEX, prop);
1521 }
1522 else if (PROP_MATCH ("Oblique", 7)) 1502 else if (PROP_MATCH ("Oblique", 7))
1523 { 1503 PROP_SAVE (slant, "oblique", 7);
1524 prop_found = 1;
1525 prop = font_intern_prop ("oblique", 7, 1);
1526 FONT_SET_STYLE (font, FONT_SLANT_INDEX, prop);
1527 }
1528 else if (PROP_MATCH ("Semi-Condensed", 14)) 1504 else if (PROP_MATCH ("Semi-Condensed", 14))
1529 { 1505 PROP_SAVE (width, "semi-condensed", 14);
1530 prop_found = 1;
1531 prop = font_intern_prop ("semi-condensed", 14, 1);
1532 FONT_SET_STYLE (font, FONT_WIDTH_INDEX, prop);
1533 }
1534 else if (PROP_MATCH ("Condensed", 9)) 1506 else if (PROP_MATCH ("Condensed", 9))
1507 PROP_SAVE (width, "condensed", 9);
1508 /* An unknown word must be part of the font name. */
1509 else
1535 { 1510 {
1536 prop_found = 1; 1511 family_end = p;
1537 prop = font_intern_prop ("condensed", 9, 1); 1512 break;
1538 FONT_SET_STYLE (font, FONT_WIDTH_INDEX, prop);
1539 } 1513 }
1540 else {
1541 if (prop_found)
1542 return -1; /* Unknown property in GTK-style font name. */
1543 family_end = q;
1544 }
1545 } 1514 }
1546#undef PROP_MATCH 1515#undef PROP_MATCH
1547 1516
1548 if (family_end) 1517 if (family_end)
1549 { 1518 ASET (font, FONT_FAMILY_INDEX,
1550 Lisp_Object family; 1519 font_intern_prop (name, family_end - name, 1));
1551 family = font_intern_prop (name, family_end - name, 1); 1520 if (!NILP (size))
1552 ASET (font, FONT_FAMILY_INDEX, family); 1521 ASET (font, FONT_SIZE_INDEX, size);
1553 } 1522 if (!NILP (weight))
1523 FONT_SET_STYLE (font, FONT_WEIGHT_INDEX, weight);
1524 if (!NILP (slant))
1525 FONT_SET_STYLE (font, FONT_SLANT_INDEX, slant);
1526 if (!NILP (width))
1527 FONT_SET_STYLE (font, FONT_WIDTH_INDEX, width);
1554 } 1528 }
1555 1529
1556 return 0; 1530 return 0;