aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKenichi Handa2006-07-14 02:24:13 +0000
committerKenichi Handa2006-07-14 02:24:13 +0000
commit0c363472029f1bfb0df6d7e0d82436190ac90103 (patch)
tree82271717f8f32401f71647708d8fec8e2e850c81 /src
parent9de04ace1f4df74a7399a1963fb94679fae9a82d (diff)
downloademacs-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.c38
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
1580void 1581void
@@ -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));