[HarfBuzz] harfbuzz: Branch 'master' - 6 commits
Behdad Esfahbod
behdad at kemper.freedesktop.org
Tue Jan 16 00:59:10 UTC 2018
src/hb-aat-layout-common-private.hh | 5
src/hb-aat-layout-morx-table.hh | 86 ++++++++--
src/hb-aat-layout.cc | 20 +-
src/hb-open-type-private.hh | 6
src/hb-set-private.hh | 1
test/shaping/data/text-rendering-tests/Makefile.sources | 2
test/shaping/data/text-rendering-tests/fonts/TestMORXFourteen.ttf |binary
test/shaping/data/text-rendering-tests/fonts/TestMORXThirteen.ttf |binary
test/shaping/data/text-rendering-tests/tests/MORX-13.tests | 1
test/shaping/data/text-rendering-tests/tests/MORX-14.tests | 1
10 files changed, 97 insertions(+), 25 deletions(-)
New commits:
commit 12fffce10eb6ffebdedd655d0b1f10a99adf1808
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Jan 15 15:41:51 2018 -0500
[aat] Sanitize classTable in StateTable
diff --git a/src/hb-aat-layout-common-private.hh b/src/hb-aat-layout-common-private.hh
index a67ee528..f912ed02 100644
--- a/src/hb-aat-layout-common-private.hh
+++ b/src/hb-aat-layout-common-private.hh
@@ -550,7 +550,8 @@ struct StateTable
unsigned int *num_entries_out = nullptr) const
{
TRACE_SANITIZE (this);
- if (unlikely (!c->check_struct (this))) return_trace (false);
+ if (unlikely (!(c->check_struct (this) &&
+ classTable.sanitize (c, this)))) return_trace (false);
const HBUINT16 *states = (this+stateArrayTable).arrayZ;
const Entry<Extra> *entries = (this+entryTable).arrayZ;
commit e6263c7142ca22efd9a3c93353a513f475c1c48d
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Jan 15 15:37:55 2018 -0500
[aat] Wire up table length to apply()
diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh
index d2a66509..766292b3 100644
--- a/src/hb-aat-layout-morx-table.hh
+++ b/src/hb-aat-layout-morx-table.hh
@@ -448,13 +448,13 @@ struct ChainSubtable
Insertion = 5
};
- inline void apply (hb_apply_context_t *c) const
+ inline void apply (hb_apply_context_t *c, const char *end) const
{
- dispatch (c);
+ dispatch (c, end);
}
template <typename context_t>
- inline typename context_t::return_t dispatch (context_t *c) const
+ inline typename context_t::return_t dispatch (context_t *c, const char *end) const
{
unsigned int subtable_type = get_type ();
TRACE_DISPATCH (this, subtable_type);
@@ -476,7 +476,7 @@ struct ChainSubtable
!c->check_range (this, length))
return_trace (false);
- return_trace (dispatch (c));
+ return_trace (dispatch (c, c->end));
}
protected:
@@ -496,13 +496,13 @@ struct ChainSubtable
struct Chain
{
- inline void apply (hb_apply_context_t *c) const
+ inline void apply (hb_apply_context_t *c, const char *end) const
{
const ChainSubtable *subtable = &StructAtOffset<ChainSubtable> (featureZ, featureZ[0].static_size * featureCount);
unsigned int count = subtableCount;
for (unsigned int i = 0; i < count; i++)
{
- subtable->apply (c);
+ subtable->apply (c, end);
subtable = &StructAfter<ChainSubtable> (*subtable);
}
}
@@ -555,13 +555,14 @@ struct morx
{
static const hb_tag_t tableTag = HB_AAT_TAG_MORX;
- inline void apply (hb_apply_context_t *c) const
+ inline void apply (hb_apply_context_t *c, unsigned int length) const
{
+ const char *end = (const char *) this + length;
const Chain *chain = chains;
unsigned int count = chainCount;
for (unsigned int i = 0; i < count; i++)
{
- chain->apply (c);
+ chain->apply (c, end);
chain = &StructAfter<Chain> (*chain);
}
}
diff --git a/src/hb-aat-layout.cc b/src/hb-aat-layout.cc
index 79f0ae65..7455787f 100644
--- a/src/hb-aat-layout.cc
+++ b/src/hb-aat-layout.cc
@@ -37,11 +37,20 @@
*/
static inline const AAT::morx&
-_get_morx (hb_face_t *face)
+_get_morx (hb_face_t *face, unsigned int *length = nullptr)
{
- if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return OT::Null(AAT::morx);
+ if (unlikely (!hb_ot_shaper_face_data_ensure (face)))
+ {
+ if (length)
+ *length = 0;
+ return OT::Null(AAT::morx);
+ }
hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
- return *(layout->morx.get ()); /* XXX this doesn't call set_num_glyphs on sanitizer. */
+ /* XXX this doesn't call set_num_glyphs on sanitizer. */
+ const AAT::morx& morx = *(layout->morx.get ());
+ if (length)
+ *length = hb_blob_get_length (layout->morx.blob);
+ return morx;
}
static inline void
@@ -61,6 +70,7 @@ _hb_aat_layout_create (hb_face_t *face)
void
hb_aat_layout_substitute (OT::hb_apply_context_t *c)
{
- const AAT::morx& morx = _get_morx (c->face);
- morx.apply (c);
+ unsigned int length;
+ const AAT::morx& morx = _get_morx (c->face, &length);
+ morx.apply (c, length);
}
diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh
index 736497d9..04e4a4e1 100644
--- a/src/hb-open-type-private.hh
+++ b/src/hb-open-type-private.hh
@@ -1145,8 +1145,8 @@ struct hb_lazy_table_loader_t
inline void init (hb_face_t *face_)
{
face = face_;
- instance = nullptr;
blob = nullptr;
+ instance = nullptr;
}
inline void fini (void)
@@ -1177,10 +1177,10 @@ struct hb_lazy_table_loader_t
return get();
}
- private:
hb_face_t *face;
- T *instance;
mutable hb_blob_t *blob;
+ private:
+ mutable T *instance;
};
commit 679ae744d07db7746a983ece54c22635a9dc3cff
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Sun Jan 14 15:03:31 2018 -0500
[aat] Towards implementing LigatureSubtable
diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh
index 64c946ec..d2a66509 100644
--- a/src/hb-aat-layout-morx-table.hh
+++ b/src/hb-aat-layout-morx-table.hh
@@ -288,19 +288,74 @@ struct ContextualSubtable
struct LigatureSubtable
{
+ 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 = false;
+ enum Flags {
+ SetComponent = 0x8000, /* Push this glyph onto the component stack for
+ * eventual processing. */
+ DontAdvance = 0x4000, /* Leave the glyph pointer at this glyph for the
+ next iteration. */
+ PerformAction = 0x2000, /* Use the ligActionIndex to process a ligature
+ * group. */
+ Reserved = 0x1FFF, /* These bits are reserved and should be set to 0. */
+ };
+
+ inline driver_context_t (const LigatureSubtable *table) :
+ ret (false) {}
+
+ inline void transition (StateTableDriver<EntryData> *driver,
+ const Entry<EntryData> *entry)
+ {
+ hb_buffer_t *buffer = driver->buffer;
+
+ /* TODO */
+ }
+
+ public:
+ bool ret;
+ private:
+ };
+
inline bool apply (hb_apply_context_t *c) const
{
TRACE_APPLY (this);
- /* TODO */
- return_trace (false);
+
+ driver_context_t dc (this);
+
+ StateTableDriver<EntryData> driver (machine, c->buffer, c->face);
+ driver.drive (&dc);
+
+ return_trace (dc.ret);
}
inline bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
- /* TODO */
+ /* The main sanitization is done at run-time. */
+ return machine.sanitize (c);
return_trace (true);
}
+
+ protected:
+ StateTable<EntryData> machine;
+ OffsetTo<UnsizedArrayOf<HBUINT32>, HBUINT32>
+ ligAction; /* Offset to the ligature action table. */
+ OffsetTo<UnsizedArrayOf<HBUINT16>, HBUINT32>
+ component; /* Offset to the component table. */
+ OffsetTo<UnsizedArrayOf<GlyphID>, HBUINT32>
+ ligature; /* Offset to the actual ligature lists. */
+ public:
+ DEFINE_SIZE_STATIC (28);
};
struct NoncontextualSubtable
commit c9e12a2b9b34d73d37def2261a5c1a7ef20b8349
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Sat Jan 13 17:05:12 2018 +0000
Fix set initializer
diff --git a/src/hb-set-private.hh b/src/hb-set-private.hh
index 9c6f3ee3..576c169e 100644
--- a/src/hb-set-private.hh
+++ b/src/hb-set-private.hh
@@ -185,6 +185,7 @@ struct hb_set_t
inline void init (void)
{
+ in_error = false;
page_map.init ();
pages.init ();
}
commit 54a1e250a839f030b43dbeba66cadc50ab5f90f6
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Sat Jan 13 14:44:39 2018 +0000
[test/text-rendering-tests] Update from upstream
diff --git a/test/shaping/data/text-rendering-tests/Makefile.sources b/test/shaping/data/text-rendering-tests/Makefile.sources
index 3e834243..81b37896 100644
--- a/test/shaping/data/text-rendering-tests/Makefile.sources
+++ b/test/shaping/data/text-rendering-tests/Makefile.sources
@@ -28,6 +28,8 @@ TESTS = \
tests/HVAR-2.tests \
tests/KERN-1.tests \
tests/KERN-2.tests \
+ tests/MORX-13.tests \
+ tests/MORX-14.tests \
tests/SHBALI-3.tests \
tests/SHKNDA-1.tests \
$(NULL)
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXFourteen.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXFourteen.ttf
new file mode 100644
index 00000000..31c30c04
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXFourteen.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirteen.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirteen.ttf
new file mode 100644
index 00000000..f3c6f0f7
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirteen.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-13.tests b/test/shaping/data/text-rendering-tests/tests/MORX-13.tests
new file mode 100644
index 00000000..42d81073
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-13.tests
@@ -0,0 +1 @@
+../fonts/TestMORXThirteen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043,U+0044,U+0045:[B|C at 626,0|D at 1222,0|E at 1896,0|A at 2452,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-14.tests b/test/shaping/data/text-rendering-tests/tests/MORX-14.tests
new file mode 100644
index 00000000..bff742f3
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-14.tests
@@ -0,0 +1 @@
+../fonts/TestMORXFourteen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0043,U+0044,U+0045:[B|C at 626,0|D at 1222,0|E at 1896,0|A at 2452,0]
commit 9009b341c46caaa81deae8ea55e6f7dd98565f59
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Fri Jan 12 12:04:53 2018 +0100
[aat] Fix some struct sizes
I hate it that with my compiler at least, it doesn't catch totally uncompilable
statements in templates if they are not used...
diff --git a/src/hb-aat-layout-common-private.hh b/src/hb-aat-layout-common-private.hh
index 990be2e7..a67ee528 100644
--- a/src/hb-aat-layout-common-private.hh
+++ b/src/hb-aat-layout-common-private.hh
@@ -602,7 +602,7 @@ struct StateTable
entryTable; /* Offset to the entry array. */
public:
- DEFINE_SIZE_UNION (2, format);
+ DEFINE_SIZE_STATIC (16);
};
template <typename EntryData>
diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh
index f0715894..64c946ec 100644
--- a/src/hb-aat-layout-morx-table.hh
+++ b/src/hb-aat-layout-morx-table.hh
@@ -169,7 +169,7 @@ struct RearrangementSubtable
protected:
StateTable<void> machine;
public:
- DEFINE_SIZE_MIN (2);
+ DEFINE_SIZE_STATIC (16);
};
struct ContextualSubtable
@@ -283,7 +283,7 @@ struct ContextualSubtable
OffsetTo<UnsizedOffsetListOf<Lookup<GlyphID>, HBUINT32>, HBUINT32>
substitutionTables;
public:
- DEFINE_SIZE_MIN (2);
+ DEFINE_SIZE_STATIC (20);
};
struct LigatureSubtable
@@ -436,7 +436,7 @@ struct ChainSubtable
InsertionSubtable insertion;
} u;
public:
- DEFINE_SIZE_MIN (2 * sizeof (HBUINT32) + 4);
+ DEFINE_SIZE_MIN (12);
};
struct Chain
@@ -488,7 +488,7 @@ struct Chain
// subtableGlyphCoverageArray if major == 3
public:
- DEFINE_SIZE_MIN (8 + 2 * sizeof (HBUINT32));
+ DEFINE_SIZE_MIN (16);
};
More information about the HarfBuzz
mailing list