[kerx] Start fleshing out Format1

This commit is contained in:
Behdad Esfahbod 2018-10-10 20:37:22 -04:00
parent ab1f30bd05
commit 339036dd97
2 changed files with 52 additions and 9 deletions

View File

@ -99,6 +99,48 @@ struct KerxSubTableFormat0
struct KerxSubTableFormat1 struct KerxSubTableFormat1
{ {
struct EntryData
{
HBUINT16 ligActionIndex; /* Index to the first ligActionTable entry
* for processing this group, if indicated
* by the flags. */
public:
DEFINE_SIZE_STATIC (2);
};
struct driver_context_t
{
static const bool in_place = true;
enum Flags
{
Push = 0x8000, /* If set, push this glyph on the kerning stack. */
DontAdvance = 0x4000, /* If set, don't advance to the next glyph
* before going to the new state. */
Reset = 0x2000, /* If set, reset the kerning data (clear the stack) */
Reserved = 0x1FFF, /* Not used; set to 0. */
};
inline driver_context_t (const KerxSubTableFormat1 *table)
{}
inline bool is_actionable (StateTableDriver<EntryData> *driver,
const Entry<EntryData> *entry)
{
return false; // XXX return (entry->flags & Verb) && start < end;
}
inline bool transition (StateTableDriver<EntryData> *driver,
const Entry<EntryData> *entry)
{
//hb_buffer_t *buffer = driver->buffer;
//unsigned int flags = entry->flags;
return true;
}
public:
private:
};
inline bool apply (hb_aat_apply_context_t *c) const inline bool apply (hb_aat_apply_context_t *c) const
{ {
TRACE_APPLY (this); TRACE_APPLY (this);
@ -106,7 +148,10 @@ struct KerxSubTableFormat1
if (!c->plan->requested_kerning) if (!c->plan->requested_kerning)
return false; return false;
/* TODO */ driver_context_t dc (this);
StateTableDriver<EntryData> driver (machine, c->buffer, c->font->face);
driver.drive (&dc);
return_trace (true); return_trace (true);
} }
@ -114,14 +159,13 @@ struct KerxSubTableFormat1
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 (likely (c->check_struct (this) && return_trace (likely (machine.sanitize (c)));
stateHeader.sanitize (c)));
} }
protected: protected:
KerxSubTableHeader header; KerxSubTableHeader header;
StateTable<HBUINT16> stateHeader; StateTable<EntryData> machine;
LOffsetTo<ArrayOf<HBUINT16> > valueTable; LOffsetTo<UnsizedArrayOf<FWORD>, false> values;
public: public:
DEFINE_SIZE_STATIC (32); DEFINE_SIZE_STATIC (32);
}; };
@ -159,8 +203,7 @@ struct KerxSubTableFormat2
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 (likely (c->check_struct (this) && return_trace (likely (rowWidth.sanitize (c) &&
rowWidth.sanitize (c) &&
leftClassTable.sanitize (c, this) && leftClassTable.sanitize (c, this) &&
rightClassTable.sanitize (c, this) && rightClassTable.sanitize (c, this) &&
array.sanitize (c, this))); array.sanitize (c, this)));

View File

@ -164,7 +164,7 @@ struct RearrangementSubtable
driver_context_t dc (this); driver_context_t dc (this);
StateTableDriver<void> driver (machine, c->buffer, c->face); StateTableDriver<EntryData> driver (machine, c->buffer, c->face);
driver.drive (&dc); driver.drive (&dc);
return_trace (dc.ret); return_trace (dc.ret);