[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:
parent
338fe662b5
commit
5d874d566f
@ -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);
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
indic
|
indic
|
||||||
|
south-asian
|
||||||
south-east-asian
|
south-east-asian
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
|
extensive.txt
|
||||||
misc.txt
|
misc.txt
|
||||||
reph.txt
|
reph.txt
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
script-tibetan
|
@ -0,0 +1 @@
|
|||||||
|
misc
|
@ -0,0 +1 @@
|
|||||||
|
misc.txt
|
@ -0,0 +1 @@
|
|||||||
|
སྟྲཱ
|
Loading…
Reference in New Issue
Block a user