diff options
| author | Kenichi Handa | 2006-07-14 02:24:13 +0000 |
|---|---|---|
| committer | Kenichi Handa | 2006-07-14 02:24:13 +0000 |
| commit | 0c363472029f1bfb0df6d7e0d82436190ac90103 (patch) | |
| tree | 82271717f8f32401f71647708d8fec8e2e850c81 /src | |
| parent | 9de04ace1f4df74a7399a1963fb94679fae9a82d (diff) | |
| download | emacs-0c363472029f1bfb0df6d7e0d82436190ac90103.tar.gz emacs-0c363472029f1bfb0df6d7e0d82436190ac90103.zip | |
(font_merge_old_spec): Treat '*' in foundry as a wild
card.
(DEVICE_DELTA): Fix typo.
(font_otf_gpos): Adjusted for the change of LGLYPH format.
(font_prepare_composition): Likewise.
Diffstat (limited to 'src')
| -rw-r--r-- | src/font.c | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/src/font.c b/src/font.c index d423b1804c7..80e23b4ec67 100644 --- a/src/font.c +++ b/src/font.c | |||
| @@ -1398,7 +1398,8 @@ font_merge_old_spec (name, family, registry, spec) | |||
| 1398 | p1 = index (p0, '-'); | 1398 | p1 = index (p0, '-'); |
| 1399 | if (p1) | 1399 | if (p1) |
| 1400 | { | 1400 | { |
| 1401 | if (NILP (AREF (spec, FONT_FOUNDRY_INDEX))) | 1401 | if ((*p0 != '*' || p1 - p0 > 1) |
| 1402 | && NILP (AREF (spec, FONT_FOUNDRY_INDEX))) | ||
| 1402 | ASET (spec, FONT_FOUNDRY_INDEX, | 1403 | ASET (spec, FONT_FOUNDRY_INDEX, |
| 1403 | intern_downcase (p0, p1 - p0)); | 1404 | intern_downcase (p0, p1 - p0)); |
| 1404 | if (NILP (AREF (spec, FONT_FAMILY_INDEX))) | 1405 | if (NILP (AREF (spec, FONT_FAMILY_INDEX))) |
| @@ -1574,7 +1575,7 @@ parse_gsub_gpos_spec (spec, script, langsys, features) | |||
| 1574 | 1575 | ||
| 1575 | #define DEVICE_DELTA(table, size) \ | 1576 | #define DEVICE_DELTA(table, size) \ |
| 1576 | (((size) >= (table).StartSize && (size) <= (table).EndSize) \ | 1577 | (((size) >= (table).StartSize && (size) <= (table).EndSize) \ |
| 1577 | ? (table).DeltaValue[(size) >= (table).StartSize] \ | 1578 | ? (table).DeltaValue[(size) - (table).StartSize] \ |
| 1578 | : 0) | 1579 | : 0) |
| 1579 | 1580 | ||
| 1580 | void | 1581 | void |
| @@ -1741,7 +1742,7 @@ font_otf_gpos (font, gpos_spec, gstring, from, to) | |||
| 1741 | for (i = 0, g = otf_gstring.glyphs; i < otf_gstring.used; i++, g++) | 1742 | for (i = 0, g = otf_gstring.glyphs; i < otf_gstring.used; i++, g++) |
| 1742 | { | 1743 | { |
| 1743 | Lisp_Object prev; | 1744 | Lisp_Object prev; |
| 1744 | int xoff = 0, yoff = 0, width_adjust = 0; | 1745 | int xoff = 0, yoff = 0, width_adjust = 0; |
| 1745 | 1746 | ||
| 1746 | if (! g->glyph_id) | 1747 | if (! g->glyph_id) |
| 1747 | continue; | 1748 | continue; |
| @@ -1805,20 +1806,29 @@ font_otf_gpos (font, gpos_spec, gstring, from, to) | |||
| 1805 | width = font->driver->text_extents (font, &code, 1, NULL); | 1806 | width = font->driver->text_extents (font, &code, 1, NULL); |
| 1806 | LGLYPH_SET_WIDTH (prev, make_number (width)); | 1807 | LGLYPH_SET_WIDTH (prev, make_number (width)); |
| 1807 | } | 1808 | } |
| 1809 | else | ||
| 1810 | width = XINT (LGLYPH_WIDTH (prev)); | ||
| 1808 | xoff = XINT (LGLYPH_XOFF (prev)) + (base_x - width) - mark_x; | 1811 | xoff = XINT (LGLYPH_XOFF (prev)) + (base_x - width) - mark_x; |
| 1809 | yoff = XINT (LGLYPH_YOFF (prev)) + mark_y - base_y; | 1812 | yoff = XINT (LGLYPH_YOFF (prev)) + mark_y - base_y; |
| 1810 | } | 1813 | } |
| 1811 | } | 1814 | } |
| 1815 | |||
| 1816 | if (xoff || yoff || width_adjust) | ||
| 1817 | { | ||
| 1818 | Lisp_Object adjustment = Fmake_vector (make_number (3), Qnil); | ||
| 1819 | |||
| 1820 | ASET (adjustment, 0, make_number (xoff)); | ||
| 1821 | ASET (adjustment, 1, make_number (yoff)); | ||
| 1822 | ASET (adjustment, 2, make_number (width_adjust)); | ||
| 1823 | LGLYPH_SET_ADJUSTMENT (glyph, adjustment); | ||
| 1824 | } | ||
| 1825 | |||
| 1812 | if (g->GlyphClass == OTF_GlyphClass0) | 1826 | if (g->GlyphClass == OTF_GlyphClass0) |
| 1813 | base = mark = glyph; | 1827 | base = mark = glyph; |
| 1814 | else if (g->GlyphClass == OTF_GlyphClassMark) | 1828 | else if (g->GlyphClass == OTF_GlyphClassMark) |
| 1815 | mark = glyph; | 1829 | mark = glyph; |
| 1816 | else | 1830 | else |
| 1817 | base = glyph; | 1831 | base = glyph; |
| 1818 | |||
| 1819 | LGLYPH_SET_XOFF (glyph, make_number (xoff)); | ||
| 1820 | LGLYPH_SET_YOFF (glyph, make_number (yoff)); | ||
| 1821 | LGLYPH_SET_WADJUST (glyph, make_number (width_adjust)); | ||
| 1822 | } | 1832 | } |
| 1823 | 1833 | ||
| 1824 | free (otf_gstring.glyphs); | 1834 | free (otf_gstring.glyphs); |
| @@ -1831,9 +1841,9 @@ font_otf_gpos (font, gpos_spec, gstring, from, to) | |||
| 1831 | /* glyph-string handler */ | 1841 | /* glyph-string handler */ |
| 1832 | 1842 | ||
| 1833 | /* GSTRING is a vector of this form: | 1843 | /* GSTRING is a vector of this form: |
| 1834 | [ [FONT-OBJECT LBEARING RBEARING WITH ASCENT DESCENT] GLYPH ... ] | 1844 | [ [FONT-OBJECT LBEARING RBEARING WIDTH ASCENT DESCENT] GLYPH ... ] |
| 1835 | and GLYPH is a vector of this form: | 1845 | and GLYPH is a vector of this form: |
| 1836 | [ FROM-IDX TO-IDX C CODE X-OFF Y-OFF WIDTH WADJUST ] | 1846 | [ FROM-IDX TO-IDX C CODE [ [X-OFF Y-OFF WIDTH WADJUST] | nil] ] |
| 1837 | where | 1847 | where |
| 1838 | FROM-IDX and TO-IDX are used internally and should not be touched. | 1848 | FROM-IDX and TO-IDX are used internally and should not be touched. |
| 1839 | C is a character of the glyph. | 1849 | C is a character of the glyph. |
| @@ -1866,10 +1876,10 @@ font_prepare_composition (cmp) | |||
| 1866 | 1876 | ||
| 1867 | font->driver->text_extents (font, &code, 1, &metrics); | 1877 | font->driver->text_extents (font, &code, 1, &metrics); |
| 1868 | LGLYPH_SET_WIDTH (g, make_number (metrics.width)); | 1878 | LGLYPH_SET_WIDTH (g, make_number (metrics.width)); |
| 1869 | metrics.lbearing += XINT (LGLYPH_XOFF (g)); | 1879 | metrics.lbearing += LGLYPH_XOFF (g); |
| 1870 | metrics.rbearing += XINT (LGLYPH_XOFF (g)); | 1880 | metrics.rbearing += LGLYPH_XOFF (g); |
| 1871 | metrics.ascent += XINT (LGLYPH_YOFF (g)); | 1881 | metrics.ascent += LGLYPH_YOFF (g); |
| 1872 | metrics.descent += XINT (LGLYPH_YOFF (g)); | 1882 | metrics.descent += LGLYPH_YOFF (g); |
| 1873 | 1883 | ||
| 1874 | if (cmp->lbearing > cmp->pixel_width + metrics.lbearing) | 1884 | if (cmp->lbearing > cmp->pixel_width + metrics.lbearing) |
| 1875 | cmp->lbearing = cmp->pixel_width + metrics.lbearing; | 1885 | cmp->lbearing = cmp->pixel_width + metrics.lbearing; |
| @@ -1879,7 +1889,7 @@ font_prepare_composition (cmp) | |||
| 1879 | cmp->ascent = metrics.ascent; | 1889 | cmp->ascent = metrics.ascent; |
| 1880 | if (cmp->descent < metrics.descent) | 1890 | if (cmp->descent < metrics.descent) |
| 1881 | cmp->descent = metrics.descent; | 1891 | cmp->descent = metrics.descent; |
| 1882 | cmp->pixel_width += metrics.width + XINT (LGLYPH_WADJUST (g)); | 1892 | cmp->pixel_width += metrics.width + LGLYPH_WADJUST (g); |
| 1883 | } | 1893 | } |
| 1884 | LGSTRING_SET_LBEARING (gstring, make_number (cmp->lbearing)); | 1894 | LGSTRING_SET_LBEARING (gstring, make_number (cmp->lbearing)); |
| 1885 | LGSTRING_SET_RBEARING (gstring, make_number (cmp->rbearing)); | 1895 | LGSTRING_SET_RBEARING (gstring, make_number (cmp->rbearing)); |