diff options
| author | Kenichi Handa | 2007-12-27 01:15:39 +0000 |
|---|---|---|
| committer | Kenichi Handa | 2007-12-27 01:15:39 +0000 |
| commit | 7d2fd5451842b2aa38810b4f28d542fd0210cb93 (patch) | |
| tree | ae0fb7a169420f2c6420e6e78c16f8def1d3e515 /src | |
| parent | 778686b1903df7ee1f9e068caafc2b672217a51a (diff) | |
| download | emacs-7d2fd5451842b2aa38810b4f28d542fd0210cb93.tar.gz emacs-7d2fd5451842b2aa38810b4f28d542fd0210cb93.zip | |
(ftfont_drive_otf): Fix setting of FROM and TO slots of
glyphs.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ftfont.c | 45 |
1 files changed, 36 insertions, 9 deletions
diff --git a/src/ftfont.c b/src/ftfont.c index d420b9af7ad..316f8f3cf09 100644 --- a/src/ftfont.c +++ b/src/ftfont.c | |||
| @@ -1307,25 +1307,52 @@ ftfont_drive_otf (font, spec, in, from, to, out, adjustment) | |||
| 1307 | goto simple_copy; | 1307 | goto simple_copy; |
| 1308 | if (out->allocated < out->used + otf_gstring.used) | 1308 | if (out->allocated < out->used + otf_gstring.used) |
| 1309 | return -2; | 1309 | return -2; |
| 1310 | for (i = 0, otfg = otf_gstring.glyphs; i < otf_gstring.used; i++, otfg++) | 1310 | for (i = 0, otfg = otf_gstring.glyphs; i < otf_gstring.used; ) |
| 1311 | { | 1311 | { |
| 1312 | MFLTGlyph *g = out->glyphs + out->used; | 1312 | OTF_Glyph *endg; |
| 1313 | MFLTGlyph *g; | ||
| 1314 | int min_from, max_to; | ||
| 1313 | int j; | 1315 | int j; |
| 1314 | 1316 | ||
| 1317 | g = out->glyphs + out->used; | ||
| 1315 | *g = in->glyphs[from + otfg->f.index.from]; | 1318 | *g = in->glyphs[from + otfg->f.index.from]; |
| 1316 | g->c = 0; | ||
| 1317 | for (j = from + otfg->f.index.from; j <= from + otfg->f.index.to; j++) | ||
| 1318 | if (in->glyphs[j].code == otfg->glyph_id) | ||
| 1319 | { | ||
| 1320 | g->c = in->glyphs[j].c; | ||
| 1321 | break; | ||
| 1322 | } | ||
| 1323 | if (g->code != otfg->glyph_id) | 1319 | if (g->code != otfg->glyph_id) |
| 1324 | { | 1320 | { |
| 1321 | g->c = 0; | ||
| 1325 | g->code = otfg->glyph_id; | 1322 | g->code = otfg->glyph_id; |
| 1326 | g->measured = 0; | 1323 | g->measured = 0; |
| 1327 | } | 1324 | } |
| 1328 | out->used++; | 1325 | out->used++; |
| 1326 | min_from = g->from; | ||
| 1327 | max_to = g->to; | ||
| 1328 | if (otfg->f.index.from < otfg->f.index.to) | ||
| 1329 | { | ||
| 1330 | /* OTFG substitutes multiple glyphs in IN. */ | ||
| 1331 | for (j = from + otfg->f.index.from + 1; | ||
| 1332 | j <= from + otfg->f.index.to; j++) | ||
| 1333 | { | ||
| 1334 | if (min_from > in->glyphs[j].from) | ||
| 1335 | min_from = in->glyphs[j].from; | ||
| 1336 | if (max_to < in->glyphs[j].to) | ||
| 1337 | max_to = in->glyphs[j].to; | ||
| 1338 | } | ||
| 1339 | g->from = min_from; | ||
| 1340 | g->to = max_to; | ||
| 1341 | } | ||
| 1342 | for (i++, otfg++; (i < otf_gstring.used | ||
| 1343 | && otfg->f.index.from == otfg[-1].f.index.from); | ||
| 1344 | i++, otfg++) | ||
| 1345 | { | ||
| 1346 | g = out->glyphs + out->used; | ||
| 1347 | *g = in->glyphs[from + otfg->f.index.to]; | ||
| 1348 | if (g->code != otfg->glyph_id) | ||
| 1349 | { | ||
| 1350 | g->c = 0; | ||
| 1351 | g->code = otfg->glyph_id; | ||
| 1352 | g->measured = 0; | ||
| 1353 | } | ||
| 1354 | out->used++; | ||
| 1355 | } | ||
| 1329 | } | 1356 | } |
| 1330 | } | 1357 | } |
| 1331 | else | 1358 | else |