[GSUB] Finish ContextSubstFormat1
This commit is contained in:
parent
5ee2189622
commit
c43562b2a7
|
@ -539,6 +539,13 @@ DEFINE_NULL (LigatureSubst, 2);
|
||||||
|
|
||||||
|
|
||||||
struct SubstLookupRecord {
|
struct SubstLookupRecord {
|
||||||
|
|
||||||
|
friend struct SubRule;
|
||||||
|
|
||||||
|
private:
|
||||||
|
inline bool substitute (SUBTABLE_SUBSTITUTE_ARGS_DEF) const;
|
||||||
|
|
||||||
|
private:
|
||||||
USHORT sequenceIndex; /* Index into current glyph
|
USHORT sequenceIndex; /* Index into current glyph
|
||||||
* sequence--first glyph = 0 */
|
* sequence--first glyph = 0 */
|
||||||
USHORT lookupListIndex; /* Lookup to apply to that
|
USHORT lookupListIndex; /* Lookup to apply to that
|
||||||
|
@ -563,6 +570,9 @@ struct SubRule {
|
||||||
context_length < count))
|
context_length < count))
|
||||||
return false; /* Not enough glyphs in input or context */
|
return false; /* Not enough glyphs in input or context */
|
||||||
|
|
||||||
|
/* XXX context_length should also be checked when skipping glyphs, right?
|
||||||
|
* What does context_length really mean, anyway? */
|
||||||
|
|
||||||
for (i = 1, j = buffer->in_pos + 1; i < count; i++, j++) {
|
for (i = 1, j = buffer->in_pos + 1; i < count; i++, j++) {
|
||||||
while (!_hb_ot_layout_check_glyph_property (layout, IN_ITEM (j), lookup_flag, &property)) {
|
while (!_hb_ot_layout_check_glyph_property (layout, IN_ITEM (j), lookup_flag, &property)) {
|
||||||
if (HB_UNLIKELY (j + count - i == buffer->in_length))
|
if (HB_UNLIKELY (j + count - i == buffer->in_length))
|
||||||
|
@ -574,12 +584,35 @@ struct SubRule {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* XXX right? or j - buffer_inpos? */
|
||||||
return Do_ContextSubst( gsub, sr[k].GlyphCount,
|
context_length = count;
|
||||||
sr[k].SubstCount, sr[k].SubstLookupRecord,
|
|
||||||
buffer,
|
unsigned int subst_count = substCount;
|
||||||
nesting_level );
|
const SubstLookupRecord *subst = (const SubstLookupRecord *) ((const char *) input + sizeof (input[0]) * glyphCount);
|
||||||
*/
|
for (i = 0; i < count;)
|
||||||
|
{
|
||||||
|
if ( subst_count && i == subst->sequenceIndex )
|
||||||
|
{
|
||||||
|
unsigned int old_pos = buffer->in_pos;
|
||||||
|
|
||||||
|
/* Do a substitution */
|
||||||
|
bool done = subst->substitute (SUBTABLE_SUBSTITUTE_ARGS);
|
||||||
|
|
||||||
|
subst++;
|
||||||
|
subst_count--;
|
||||||
|
i += buffer->in_pos - old_pos;
|
||||||
|
|
||||||
|
if (!done)
|
||||||
|
goto no_subst;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
no_subst:
|
||||||
|
/* No substitution for this index */
|
||||||
|
_hb_buffer_copy_output_glyph (buffer);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1038,17 +1071,6 @@ struct SubstLookupSubTable {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Out-of-class implementation for methods chaining */
|
|
||||||
|
|
||||||
inline bool ExtensionSubstFormat1::substitute (SUBTABLE_SUBSTITUTE_ARGS_DEF) const {
|
|
||||||
/* XXX either check in sanitize or here that the lookuptype is not 7 again,
|
|
||||||
* or we can loop indefinitely. */
|
|
||||||
return (*(SubstLookupSubTable *)(((char *) this) + extensionOffset)).substitute (SUBTABLE_SUBSTITUTE_ARGS,
|
|
||||||
get_type ());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct SubstLookup : Lookup {
|
struct SubstLookup : Lookup {
|
||||||
|
|
||||||
inline const SubstLookupSubTable& get_subtable (unsigned int i) const {
|
inline const SubstLookupSubTable& get_subtable (unsigned int i) const {
|
||||||
|
@ -1140,6 +1162,7 @@ struct SubstLookup : Lookup {
|
||||||
};
|
};
|
||||||
DEFINE_NULL_ALIAS (SubstLookup, Lookup);
|
DEFINE_NULL_ALIAS (SubstLookup, Lookup);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GSUB
|
* GSUB
|
||||||
*/
|
*/
|
||||||
|
@ -1159,4 +1182,24 @@ struct GSUB : GSUBGPOS {
|
||||||
DEFINE_NULL_ALIAS (GSUB, GSUBGPOS);
|
DEFINE_NULL_ALIAS (GSUB, GSUBGPOS);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Out-of-class implementation for methods chaining */
|
||||||
|
|
||||||
|
inline bool ExtensionSubstFormat1::substitute (SUBTABLE_SUBSTITUTE_ARGS_DEF) const {
|
||||||
|
/* XXX either check in sanitize or here that the lookuptype is not 7 again,
|
||||||
|
* or we can loop indefinitely. */
|
||||||
|
return (*(SubstLookupSubTable *)(((char *) this) + extensionOffset)).substitute (SUBTABLE_SUBSTITUTE_ARGS,
|
||||||
|
get_type ());
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool SubstLookupRecord::substitute (SUBTABLE_SUBSTITUTE_ARGS_DEF) const {
|
||||||
|
const GSUB &gsub = *(layout->gsub);
|
||||||
|
const SubstLookup &l = gsub.get_lookup (lookupListIndex);
|
||||||
|
|
||||||
|
return l.substitute_once (layout, buffer, context_length, nesting_level_left);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* HB_OT_LAYOUT_GSUB_PRIVATE_H */
|
#endif /* HB_OT_LAYOUT_GSUB_PRIVATE_H */
|
||||||
|
|
|
@ -36,6 +36,20 @@
|
||||||
|
|
||||||
typedef unsigned int hb_ot_layout_class_t;
|
typedef unsigned int hb_ot_layout_class_t;
|
||||||
|
|
||||||
|
struct _hb_ot_layout_t {
|
||||||
|
const struct GDEF *gdef;
|
||||||
|
const struct GSUB *gsub;
|
||||||
|
const struct /*XXX*/GSUBGPOS *gpos;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
unsigned char *klasses;
|
||||||
|
unsigned int len;
|
||||||
|
} new_gdef;
|
||||||
|
|
||||||
|
/* TODO add max-nesting-level here? */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* XXX #define HB_OT_LAYOUT_INTERNAL static */
|
/* XXX #define HB_OT_LAYOUT_INTERNAL static */
|
||||||
#define HB_OT_LAYOUT_INTERNAL
|
#define HB_OT_LAYOUT_INTERNAL
|
||||||
|
|
||||||
|
|
|
@ -42,19 +42,6 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
struct _hb_ot_layout_t {
|
|
||||||
const GDEF *gdef;
|
|
||||||
const GSUB *gsub;
|
|
||||||
const /*XXX*/GSUBGPOS *gpos;
|
|
||||||
|
|
||||||
struct {
|
|
||||||
unsigned char *klasses;
|
|
||||||
unsigned int len;
|
|
||||||
} new_gdef;
|
|
||||||
|
|
||||||
/* TODO add max-nesting-level here? */
|
|
||||||
};
|
|
||||||
|
|
||||||
hb_ot_layout_t *
|
hb_ot_layout_t *
|
||||||
hb_ot_layout_create (void)
|
hb_ot_layout_create (void)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue