[aat] Towards implementing ContextualSubtable
This commit is contained in:
parent
62348f647f
commit
335a9c1fe4
@ -151,6 +151,7 @@ struct UnsizedArrayOf
|
|||||||
inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
|
inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
|
||||||
{
|
{
|
||||||
TRACE_SANITIZE (this);
|
TRACE_SANITIZE (this);
|
||||||
|
if (unlikely (!sanitize_shallow (c, count))) return_trace (false);
|
||||||
|
|
||||||
/* Note: for structs that do not reference other structs,
|
/* Note: for structs that do not reference other structs,
|
||||||
* we do not need to call their sanitize() as we already did
|
* we do not need to call their sanitize() as we already did
|
||||||
@ -159,8 +160,34 @@ struct UnsizedArrayOf
|
|||||||
* pointed to do have a simple sanitize(), ie. they do not
|
* pointed to do have a simple sanitize(), ie. they do not
|
||||||
* reference other structs via offsets.
|
* reference other structs via offsets.
|
||||||
*/
|
*/
|
||||||
(void) (false && count && arrayZ->sanitize (c));
|
(void) (false && arrayZ[0].sanitize (c));
|
||||||
|
|
||||||
|
return_trace (true);
|
||||||
|
}
|
||||||
|
inline bool sanitize (hb_sanitize_context_t *c, unsigned int count, const void *base) const
|
||||||
|
{
|
||||||
|
TRACE_SANITIZE (this);
|
||||||
|
if (unlikely (!sanitize_shallow (c, count))) return_trace (false);
|
||||||
|
for (unsigned int i = 0; i < count; i++)
|
||||||
|
if (unlikely (!arrayZ[i].sanitize (c, base)))
|
||||||
|
return_trace (false);
|
||||||
|
return_trace (true);
|
||||||
|
}
|
||||||
|
template <typename T>
|
||||||
|
inline bool sanitize (hb_sanitize_context_t *c, unsigned int count, const void *base, T user_data) const
|
||||||
|
{
|
||||||
|
TRACE_SANITIZE (this);
|
||||||
|
if (unlikely (!sanitize_shallow (c, count))) return_trace (false);
|
||||||
|
for (unsigned int i = 0; i < count; i++)
|
||||||
|
if (unlikely (!arrayZ[i].sanitize (c, base, user_data)))
|
||||||
|
return_trace (false);
|
||||||
|
return_trace (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
inline bool sanitize_shallow (hb_sanitize_context_t *c, unsigned int count) const
|
||||||
|
{
|
||||||
|
TRACE_SANITIZE (this);
|
||||||
return_trace (c->check_array (arrayZ, arrayZ[0].static_size, count));
|
return_trace (c->check_array (arrayZ, arrayZ[0].static_size, count));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -170,6 +197,32 @@ struct UnsizedArrayOf
|
|||||||
DEFINE_SIZE_ARRAY (0, arrayZ);
|
DEFINE_SIZE_ARRAY (0, arrayZ);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Unsized array of offset's */
|
||||||
|
template <typename Type, typename OffsetType>
|
||||||
|
struct UnsizedOffsetArrayOf : UnsizedArrayOf<OffsetTo<Type, OffsetType> > {};
|
||||||
|
|
||||||
|
/* Unsized array of offsets relative to the beginning of the array itself. */
|
||||||
|
template <typename Type, typename OffsetType>
|
||||||
|
struct UnsizedOffsetListOf : UnsizedOffsetArrayOf<Type, OffsetType>
|
||||||
|
{
|
||||||
|
inline const Type& operator [] (unsigned int i) const
|
||||||
|
{
|
||||||
|
return this+this->arrayZ[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
|
||||||
|
{
|
||||||
|
TRACE_SANITIZE (this);
|
||||||
|
return_trace ((UnsizedOffsetArrayOf<Type, OffsetType>::sanitize (c, count, this)));
|
||||||
|
}
|
||||||
|
template <typename T>
|
||||||
|
inline bool sanitize (hb_sanitize_context_t *c, unsigned int count, T user_data) const
|
||||||
|
{
|
||||||
|
TRACE_SANITIZE (this);
|
||||||
|
return_trace ((UnsizedOffsetArrayOf<Type, OffsetType>::sanitize (c, count, this, user_data)));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Lookup Table
|
* Lookup Table
|
||||||
@ -507,10 +560,9 @@ struct StateTable
|
|||||||
return &entries[entry]; /* XXX bound check. */
|
return &entries[entry]; /* XXX bound check. */
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool sanitize (hb_sanitize_context_t *c, unsigned int num_glyphs) const
|
inline bool sanitize (hb_sanitize_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_SANITIZE (this);
|
TRACE_SANITIZE (this);
|
||||||
return_trace (true);
|
|
||||||
return_trace (c->check_struct (this)); /* XXX */
|
return_trace (c->check_struct (this)); /* XXX */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,11 +42,17 @@ using namespace OT;
|
|||||||
template <typename Types>
|
template <typename Types>
|
||||||
struct RearrangementSubtable
|
struct RearrangementSubtable
|
||||||
{
|
{
|
||||||
enum {
|
enum Flags {
|
||||||
MarkFirst = 0x8000,
|
MarkFirst = 0x8000, /* If set, make the current glyph the first
|
||||||
DontAdvance = 0x4000,
|
* glyph to be rearranged. */
|
||||||
MarkLast = 0x2000,
|
DontAdvance = 0x4000, /* If set, don't advance to the next glyph
|
||||||
Verb = 0x000F,
|
* before going to the new state. This means
|
||||||
|
* that the glyph index doesn't change, even
|
||||||
|
* if the glyph at that index has changed. */
|
||||||
|
MarkLast = 0x2000, /* If set, make the current glyph the last
|
||||||
|
* glyph to be rearranged. */
|
||||||
|
Reserved = 0x1FF0, /* These bits are reserved and should be set to 0. */
|
||||||
|
Verb = 0x000F, /* The type of rearrangement specified. */
|
||||||
};
|
};
|
||||||
|
|
||||||
inline bool apply (hb_apply_context_t *c) const
|
inline bool apply (hb_apply_context_t *c) const
|
||||||
@ -161,7 +167,7 @@ struct RearrangementSubtable
|
|||||||
inline bool sanitize (hb_sanitize_context_t *c) const
|
inline bool sanitize (hb_sanitize_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_SANITIZE (this);
|
TRACE_SANITIZE (this);
|
||||||
return_trace (machine.sanitize (c, 0/*XXX*/));
|
return_trace (machine.sanitize (c));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -170,8 +176,27 @@ struct RearrangementSubtable
|
|||||||
DEFINE_SIZE_MIN (2);
|
DEFINE_SIZE_MIN (2);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename Types>
|
||||||
struct ContextualSubtable
|
struct ContextualSubtable
|
||||||
{
|
{
|
||||||
|
typedef typename Types::HBUINT HBUINT;
|
||||||
|
|
||||||
|
enum Flags {
|
||||||
|
SetMark = 0x8000, /* If set, make the current glyph the marked glyph. */
|
||||||
|
DontAdvance = 0x4000, /* If set, don't advance to the next glyph before
|
||||||
|
* going to the new state. */
|
||||||
|
Reserved = 0x3FFF, /* These bits are reserved and should be set to 0. */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* XXX the following is different in mort: it's directly index to sublookups. */
|
||||||
|
struct EntryData
|
||||||
|
{
|
||||||
|
HBUINT16 markIndex; /* Index of the substitution table for the
|
||||||
|
* marked glyph (use 0xFFFF for none). */
|
||||||
|
HBUINT16 currentIndex; /* Index of the substitution table for the
|
||||||
|
* current glyph (use 0xFFFF for none). */
|
||||||
|
};
|
||||||
|
|
||||||
inline bool apply (hb_apply_context_t *c) const
|
inline bool apply (hb_apply_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_APPLY (this);
|
TRACE_APPLY (this);
|
||||||
@ -182,11 +207,19 @@ struct ContextualSubtable
|
|||||||
inline bool sanitize (hb_sanitize_context_t *c) const
|
inline bool sanitize (hb_sanitize_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_SANITIZE (this);
|
TRACE_SANITIZE (this);
|
||||||
/* TODO */
|
return_trace (machine.sanitize (c) &&
|
||||||
return_trace (false);
|
substitutionTables.sanitize (c, this, 0U/*XXX count*/));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
StateTable<Types, EntryData> machine;
|
||||||
|
OffsetTo<UnsizedOffsetListOf<Lookup<GlyphID>, HBUINT>, HBUINT>
|
||||||
|
substitutionTables;
|
||||||
|
public:
|
||||||
|
DEFINE_SIZE_MIN (2);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename Types>
|
||||||
struct LigatureSubtable
|
struct LigatureSubtable
|
||||||
{
|
{
|
||||||
inline bool apply (hb_apply_context_t *c) const
|
inline bool apply (hb_apply_context_t *c) const
|
||||||
@ -204,6 +237,7 @@ struct LigatureSubtable
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename Types>
|
||||||
struct NoncontextualSubtable
|
struct NoncontextualSubtable
|
||||||
{
|
{
|
||||||
inline bool apply (hb_apply_context_t *c) const
|
inline bool apply (hb_apply_context_t *c) const
|
||||||
@ -240,6 +274,7 @@ struct NoncontextualSubtable
|
|||||||
DEFINE_SIZE_MIN (2);
|
DEFINE_SIZE_MIN (2);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename Types>
|
||||||
struct InsertionSubtable
|
struct InsertionSubtable
|
||||||
{
|
{
|
||||||
inline bool apply (hb_apply_context_t *c) const
|
inline bool apply (hb_apply_context_t *c) const
|
||||||
@ -334,12 +369,11 @@ struct ChainSubtable
|
|||||||
HBUINT coverage; /* Coverage flags and subtable type. */
|
HBUINT coverage; /* Coverage flags and subtable type. */
|
||||||
HBUINT32 subFeatureFlags;/* The 32-bit mask identifying which subtable this is. */
|
HBUINT32 subFeatureFlags;/* The 32-bit mask identifying which subtable this is. */
|
||||||
union {
|
union {
|
||||||
RearrangementSubtable<Types>
|
RearrangementSubtable<Types> rearrangement;
|
||||||
rearrangement;
|
ContextualSubtable<Types> contextual;
|
||||||
ContextualSubtable contextual;
|
LigatureSubtable<Types> ligature;
|
||||||
LigatureSubtable ligature;
|
NoncontextualSubtable<Types> noncontextual;
|
||||||
NoncontextualSubtable noncontextual;
|
InsertionSubtable<Types> insertion;
|
||||||
InsertionSubtable insertion;
|
|
||||||
} u;
|
} u;
|
||||||
public:
|
public:
|
||||||
DEFINE_SIZE_MIN (2 * sizeof (HBUINT) + 4);
|
DEFINE_SIZE_MIN (2 * sizeof (HBUINT) + 4);
|
||||||
@ -455,8 +489,22 @@ struct mortmorx
|
|||||||
DEFINE_SIZE_MIN (8);
|
DEFINE_SIZE_MIN (8);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct MortTypes
|
||||||
|
{
|
||||||
|
static const bool extended = false;
|
||||||
|
typedef HBUINT16 HBUINT;
|
||||||
|
typedef HBUINT8 HBUSHORT;
|
||||||
|
struct ClassType : ClassTable
|
||||||
|
{
|
||||||
|
inline unsigned int get_class (hb_codepoint_t glyph_id, unsigned int num_glyphs HB_UNUSED) const
|
||||||
|
{
|
||||||
|
return ClassTable::get_class (glyph_id);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
struct MorxTypes
|
struct MorxTypes
|
||||||
{
|
{
|
||||||
|
static const bool extended = true;
|
||||||
typedef HBUINT32 HBUINT;
|
typedef HBUINT32 HBUINT;
|
||||||
typedef HBUINT16 HBUSHORT;
|
typedef HBUINT16 HBUSHORT;
|
||||||
struct ClassType : Lookup<HBUINT16>
|
struct ClassType : Lookup<HBUINT16>
|
||||||
@ -468,18 +516,6 @@ struct MorxTypes
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
struct MortTypes
|
|
||||||
{
|
|
||||||
typedef HBUINT16 HBUINT;
|
|
||||||
typedef HBUINT8 HBUSHORT;
|
|
||||||
struct ClassType : ClassTable
|
|
||||||
{
|
|
||||||
inline unsigned int get_class (hb_codepoint_t glyph_id, unsigned int num_glyphs HB_UNUSED) const
|
|
||||||
{
|
|
||||||
return ClassTable::get_class (glyph_id);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct mort : mortmorx<MortTypes>
|
struct mort : mortmorx<MortTypes>
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user