[GPOS] Fix mark-to-mark positioning when one of the marks is a ligature

This commit: a3313e5400 broke MarkMarkPos
when one of the marks itself is a ligature.  That regressed 26 Tibetan
tests (up from zero!).  Fix that.  Tibetan back to zero.
This commit is contained in:
Behdad Esfahbod 2012-07-28 21:05:25 -04:00
parent 338fe662b5
commit 5d874d566f
8 changed files with 29 additions and 9 deletions

View File

@ -1263,14 +1263,27 @@ struct MarkMarkPosFormat1
unsigned int j = skippy_iter.idx; unsigned int j = skippy_iter.idx;
/* Two marks match only if they belong to the same base, or same component unsigned int id1 = get_lig_id (c->buffer->cur());
* of the same ligature. That is, the lig_id numbers must match, and unsigned int id2 = get_lig_id (c->buffer->info[j]);
* if those are non-zero, the lig_comp number should also match. */ unsigned int comp1 = get_lig_comp (c->buffer->cur());
if ((get_lig_id (c->buffer->info[j]) != get_lig_id (c->buffer->cur())) || unsigned int comp2 = get_lig_comp (c->buffer->info[j]);
(get_lig_id (c->buffer->info[j]) > 0 &&
get_lig_comp (c->buffer->info[j]) != get_lig_comp (c->buffer->cur())))
return TRACE_RETURN (false);
if (likely (id1 == id2)) {
if (id1 == 0) /* Marks belonging to the same base. */
goto good;
else if (comp1 == comp2) /* Marks belonging to the same ligature component. */
goto good;
} else {
/* If ligature ids don't match, it may be the case that one of the marks
* itself is a ligature. In which case match. */
if ((id1 > 0 && !comp1) || (id2 > 0 && !comp2))
goto good;
}
/* Didn't match. */
return TRACE_RETURN (false);
good:
unsigned int mark2_index = (this+mark2Coverage) (c->buffer->info[j].codepoint); unsigned int mark2_index = (this+mark2Coverage) (c->buffer->info[j].codepoint);
if (mark2_index == NOT_COVERED) return TRACE_RETURN (false); if (mark2_index == NOT_COVERED) return TRACE_RETURN (false);

View File

@ -73,7 +73,8 @@ _hb_ot_layout_skip_mark (hb_face_t *face,
* *
* When a ligature is formed: * When a ligature is formed:
* *
* - The ligature glyph and any marks in between all get a unique lig_id, * - The ligature glyph and any marks in between all the same newly allocated
* lig_id,
* - The ligature glyph will get lig_comp = 0 * - The ligature glyph will get lig_comp = 0
* - The marks get lig_comp > 0, reflecting which component of the ligature * - The marks get lig_comp > 0, reflecting which component of the ligature
* they were applied to. * they were applied to.
@ -84,7 +85,7 @@ _hb_ot_layout_skip_mark (hb_face_t *face,
* *
* - All resulting glyphs will have lig_id = 0, * - All resulting glyphs will have lig_id = 0,
* - The resulting glyphs will have lig_comp = 0, 1, 2, ... respectively. * - The resulting glyphs will have lig_comp = 0, 1, 2, ... respectively.
* - This is used in GPOS to attack marks to the first component of a * - This is used in GPOS to attach marks to the first component of a
* multiple substitution in MarkBasePos. * multiple substitution in MarkBasePos.
* *
* The numbers are also used in GPOS to do mark-to-mark positioning only * The numbers are also used in GPOS to do mark-to-mark positioning only

View File

@ -1,2 +1,3 @@
indic indic
south-asian
south-east-asian south-east-asian

View File

@ -1,2 +1,3 @@
extensive.txt
misc.txt misc.txt
reph.txt reph.txt

View File

@ -0,0 +1 @@
script-tibetan