From 339036dd970625e03696b4533ced1e25fc4fd131 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 10 Oct 2018 20:37:22 -0400 Subject: [PATCH] [kerx] Start fleshing out Format1 --- src/hb-aat-layout-kerx-table.hh | 59 ++++++++++++++++++++++++++++----- src/hb-aat-layout-morx-table.hh | 2 +- 2 files changed, 52 insertions(+), 9 deletions(-) diff --git a/src/hb-aat-layout-kerx-table.hh b/src/hb-aat-layout-kerx-table.hh index 3cff334a9..4118d8ee1 100644 --- a/src/hb-aat-layout-kerx-table.hh +++ b/src/hb-aat-layout-kerx-table.hh @@ -99,6 +99,48 @@ struct KerxSubTableFormat0 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 *driver, + const Entry *entry) + { + return false; // XXX return (entry->flags & Verb) && start < end; + } + inline bool transition (StateTableDriver *driver, + const Entry *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 { TRACE_APPLY (this); @@ -106,7 +148,10 @@ struct KerxSubTableFormat1 if (!c->plan->requested_kerning) return false; - /* TODO */ + driver_context_t dc (this); + + StateTableDriver driver (machine, c->buffer, c->font->face); + driver.drive (&dc); return_trace (true); } @@ -114,14 +159,13 @@ struct KerxSubTableFormat1 inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this) && - stateHeader.sanitize (c))); + return_trace (likely (machine.sanitize (c))); } protected: - KerxSubTableHeader header; - StateTable stateHeader; - LOffsetTo > valueTable; + KerxSubTableHeader header; + StateTable machine; + LOffsetTo, false> values; public: DEFINE_SIZE_STATIC (32); }; @@ -159,8 +203,7 @@ struct KerxSubTableFormat2 inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this) && - rowWidth.sanitize (c) && + return_trace (likely (rowWidth.sanitize (c) && leftClassTable.sanitize (c, this) && rightClassTable.sanitize (c, this) && array.sanitize (c, this))); diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh index 0020750ce..5de851266 100644 --- a/src/hb-aat-layout-morx-table.hh +++ b/src/hb-aat-layout-morx-table.hh @@ -164,7 +164,7 @@ struct RearrangementSubtable driver_context_t dc (this); - StateTableDriver driver (machine, c->buffer, c->face); + StateTableDriver driver (machine, c->buffer, c->face); driver.drive (&dc); return_trace (dc.ret);