[HarfBuzz] harfbuzz: Branch 'master' - 8 commits
Behdad Esfahbod
behdad at kemper.freedesktop.org
Thu Jan 11 14:24:14 UTC 2018
src/hb-aat-layout-common-private.hh | 58 +++
src/hb-aat-layout-morx-table.hh | 170 +++++++---
test/shaping/CMakeLists.txt | 4
test/shaping/data/text-rendering-tests/DISABLED | 4
test/shaping/data/text-rendering-tests/Makefile.sources | 12
test/shaping/data/text-rendering-tests/fonts/TestMORXEleven.ttf |binary
test/shaping/data/text-rendering-tests/fonts/TestMORXTen.ttf |binary
test/shaping/data/text-rendering-tests/tests/MORX-10.tests | 1
test/shaping/data/text-rendering-tests/tests/MORX-11.tests | 1
9 files changed, 204 insertions(+), 46 deletions(-)
New commits:
commit f6be730994434e706cc27d68b796492d876e82b6
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu Jan 11 15:23:24 2018 +0100
[aat] In NoncontextualSubtable, handle MarkLast with end-of-line transition
Fixes MORX-11 test.
diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh
index 80164af0..5dec189f 100644
--- a/src/hb-aat-layout-morx-table.hh
+++ b/src/hb-aat-layout-morx-table.hh
@@ -91,8 +91,8 @@ struct RearrangementSubtable
last_zero_before_start = last_zero;
}
- if (flags & MarkLast && i < count)
- end = i + 1;
+ if (flags & MarkLast)
+ end = MIN (i + 1, count);
if ((flags & Verb) && start < end)
{
commit 1d20d109a07bf9c775ab91dfbbb55f7bd80fd9d6
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu Jan 11 15:18:22 2018 +0100
[test/text-rendering-tests] Update from upstream
diff --git a/test/shaping/data/text-rendering-tests/DISABLED b/test/shaping/data/text-rendering-tests/DISABLED
index 0e1b89b3..610e1957 100644
--- a/test/shaping/data/text-rendering-tests/DISABLED
+++ b/test/shaping/data/text-rendering-tests/DISABLED
@@ -1,7 +1,7 @@
# Non-Unicode cmap
tests/CMAP-3.tests
-# Not implemented
+# Not hooked up
tests/MORX-1.tests
tests/MORX-2.tests
tests/MORX-3.tests
@@ -12,6 +12,7 @@ tests/MORX-7.tests
tests/MORX-8.tests
tests/MORX-9.tests
tests/MORX-10.tests
+tests/MORX-11.tests
# Rounding differences
tests/SHARAN-1.tests
diff --git a/test/shaping/data/text-rendering-tests/Makefile.sources b/test/shaping/data/text-rendering-tests/Makefile.sources
index 8e0f4318..0c210fa8 100644
--- a/test/shaping/data/text-rendering-tests/Makefile.sources
+++ b/test/shaping/data/text-rendering-tests/Makefile.sources
@@ -28,13 +28,14 @@ TESTS = \
tests/HVAR-2.tests \
tests/KERN-1.tests \
tests/KERN-2.tests \
- tests/MORX-10.tests \
+ tests/MORX-11.tests \
tests/SHBALI-3.tests \
tests/SHKNDA-1.tests \
$(NULL)
DISBALED_TESTS = \
tests/CMAP-3.tests \
+ tests/MORX-10.tests \
tests/MORX-1.tests \
tests/MORX-2.tests \
tests/MORX-3.tests \
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXEleven.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXEleven.ttf
new file mode 100644
index 00000000..92b889ca
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXEleven.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-11.tests b/test/shaping/data/text-rendering-tests/tests/MORX-11.tests
new file mode 100644
index 00000000..1fce69bc
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-11.tests
@@ -0,0 +1 @@
+../fonts/TestMORXEleven.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0042,U+0041,U+0042,U+0042,U+0041,U+0041,U+0042,U+0058:[B|A at 650,0|B at 1288,0|B at 1938,0|A at 2588,0|X at 3226,0|A at 3812,0|B at 4450,0]
commit f9be673814aeb2c8abab52a672598576c6ed20c2
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu Jan 11 15:15:07 2018 +0100
[aat] Implement ContextualSubtable
Tested with Zapfino and text "2nd". Sascha will create tests later.
diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh
index 6c9c5154..80164af0 100644
--- a/src/hb-aat-layout-morx-table.hh
+++ b/src/hb-aat-layout-morx-table.hh
@@ -200,8 +200,70 @@ struct ContextualSubtable
inline bool apply (hb_apply_context_t *c) const
{
TRACE_APPLY (this);
- /* TODO */
- return_trace (false);
+
+ bool ret = false;
+ unsigned int num_glyphs = c->face->get_num_glyphs ();
+
+ const UnsizedOffsetListOf<Lookup<GlyphID>, HBUINT> &subs = this+substitutionTables;
+
+ unsigned int state = 0;
+ unsigned int last_zero = 0;
+ unsigned int last_zero_before_mark = 0;
+ unsigned int mark = 0;
+
+ hb_glyph_info_t *info = c->buffer->info;
+ unsigned int count = c->buffer->len;
+
+ for (unsigned int i = 0; i <= count; i++)
+ {
+ if (!state)
+ last_zero = i;
+
+ unsigned int klass = i < count ?
+ machine.get_class (info[i].codepoint, num_glyphs) :
+ 0 /* End of text */;
+ const Entry<EntryData> *entry = machine.get_entry (state, klass);
+ if (unlikely (!entry))
+ break;
+
+ unsigned int flags = entry->flags;
+
+ if (flags & SetMark)
+ {
+ mark = i;
+ last_zero_before_mark = last_zero;
+ }
+
+ if (entry->data.markIndex != 0xFFFF)
+ {
+ const Lookup<GlyphID> &lookup = subs[entry->data.markIndex]; // XXX bounds
+ const GlyphID *replacement = lookup.get_value (info[mark].codepoint, num_glyphs);
+ if (replacement)
+ {
+ c->buffer->unsafe_to_break (last_zero_before_mark, MIN (i + 1, count));
+ info[mark].codepoint = *replacement;
+ ret = true;
+ }
+ }
+ if (entry->data.currentIndex != 0xFFFF)
+ {
+ const Lookup<GlyphID> &lookup = subs[entry->data.currentIndex]; // XXX bounds
+ const GlyphID *replacement = lookup.get_value (info[i].codepoint, num_glyphs);
+ if (replacement)
+ {
+ c->buffer->unsafe_to_break (last_zero, MIN (i + 1, count));
+ info[i].codepoint = *replacement;
+ ret = true;
+ }
+ }
+
+ if (false/* XXX */ && flags & DontAdvance)
+ i--; /* XXX Detect infinite loop. */
+
+ state = entry->newState;
+ }
+
+ return_trace (ret);
}
inline bool sanitize (hb_sanitize_context_t *c) const
@@ -233,7 +295,7 @@ struct LigatureSubtable
{
TRACE_SANITIZE (this);
/* TODO */
- return_trace (false);
+ return_trace (true);
}
};
@@ -288,7 +350,7 @@ struct InsertionSubtable
{
TRACE_SANITIZE (this);
/* TODO */
- return_trace (false);
+ return_trace (true);
}
};
commit 335a9c1fe489db53549801b4996dd0f6f5eded62
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu Jan 11 14:50:47 2018 +0100
[aat] Towards implementing ContextualSubtable
diff --git a/src/hb-aat-layout-common-private.hh b/src/hb-aat-layout-common-private.hh
index 32ba6326..887350bb 100644
--- a/src/hb-aat-layout-common-private.hh
+++ b/src/hb-aat-layout-common-private.hh
@@ -151,6 +151,7 @@ struct UnsizedArrayOf
inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
{
TRACE_SANITIZE (this);
+ if (unlikely (!sanitize_shallow (c, count))) return_trace (false);
/* Note: for structs that do not reference other structs,
* 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
* 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));
}
@@ -170,6 +197,32 @@ struct UnsizedArrayOf
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
@@ -507,10 +560,9 @@ struct StateTable
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);
- return_trace (true);
return_trace (c->check_struct (this)); /* XXX */
}
diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh
index 86e78b54..6c9c5154 100644
--- a/src/hb-aat-layout-morx-table.hh
+++ b/src/hb-aat-layout-morx-table.hh
@@ -42,11 +42,17 @@ using namespace OT;
template <typename Types>
struct RearrangementSubtable
{
- enum {
- MarkFirst = 0x8000,
- DontAdvance = 0x4000,
- MarkLast = 0x2000,
- Verb = 0x000F,
+ enum Flags {
+ MarkFirst = 0x8000, /* If set, make the current glyph the first
+ * glyph to be rearranged. */
+ DontAdvance = 0x4000, /* If set, don't advance to the next glyph
+ * 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
@@ -161,7 +167,7 @@ struct RearrangementSubtable
inline bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
- return_trace (machine.sanitize (c, 0/*XXX*/));
+ return_trace (machine.sanitize (c));
}
protected:
@@ -170,8 +176,27 @@ struct RearrangementSubtable
DEFINE_SIZE_MIN (2);
};
+template <typename Types>
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
{
TRACE_APPLY (this);
@@ -182,11 +207,19 @@ struct ContextualSubtable
inline bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
- /* TODO */
- return_trace (false);
+ return_trace (machine.sanitize (c) &&
+ 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
{
inline bool apply (hb_apply_context_t *c) const
@@ -204,6 +237,7 @@ struct LigatureSubtable
}
};
+template <typename Types>
struct NoncontextualSubtable
{
inline bool apply (hb_apply_context_t *c) const
@@ -240,6 +274,7 @@ struct NoncontextualSubtable
DEFINE_SIZE_MIN (2);
};
+template <typename Types>
struct InsertionSubtable
{
inline bool apply (hb_apply_context_t *c) const
@@ -334,12 +369,11 @@ struct ChainSubtable
HBUINT coverage; /* Coverage flags and subtable type. */
HBUINT32 subFeatureFlags;/* The 32-bit mask identifying which subtable this is. */
union {
- RearrangementSubtable<Types>
- rearrangement;
- ContextualSubtable contextual;
- LigatureSubtable ligature;
- NoncontextualSubtable noncontextual;
- InsertionSubtable insertion;
+ RearrangementSubtable<Types> rearrangement;
+ ContextualSubtable<Types> contextual;
+ LigatureSubtable<Types> ligature;
+ NoncontextualSubtable<Types> noncontextual;
+ InsertionSubtable<Types> insertion;
} u;
public:
DEFINE_SIZE_MIN (2 * sizeof (HBUINT) + 4);
@@ -455,8 +489,22 @@ struct mortmorx
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
{
+ static const bool extended = true;
typedef HBUINT32 HBUINT;
typedef HBUINT16 HBUSHORT;
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>
{
commit 62348f647f7b1604e008dbed46a54eff245fc106
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu Jan 11 12:00:28 2018 +0100
[aat] Implement end-of-text in state machine
Passes MORX-10 test now.
diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh
index 520ae752..86e78b54 100644
--- a/src/hb-aat-layout-morx-table.hh
+++ b/src/hb-aat-layout-morx-table.hh
@@ -65,12 +65,14 @@ struct RearrangementSubtable
hb_glyph_info_t *info = c->buffer->info;
unsigned int count = c->buffer->len;
- for (unsigned int i = 0; i < count; i++)
+ for (unsigned int i = 0; i <= count; i++)
{
if (!state)
last_zero = i;
- unsigned int klass = machine.get_class (info[i].codepoint, num_glyphs);
+ unsigned int klass = i < count ?
+ machine.get_class (info[i].codepoint, num_glyphs) :
+ 0 /* End of text */;
const Entry<void> *entry = machine.get_entry (state, klass);
if (unlikely (!entry))
break;
@@ -83,7 +85,7 @@ struct RearrangementSubtable
last_zero_before_start = last_zero;
}
- if (flags & MarkLast)
+ if (flags & MarkLast && i < count)
end = i + 1;
if ((flags & Verb) && start < end)
@@ -120,7 +122,7 @@ struct RearrangementSubtable
if (end - start >= l + r)
{
- c->buffer->unsafe_to_break (last_zero_before_start, i + 1);
+ c->buffer->unsafe_to_break (last_zero_before_start, MIN (i + 1, count));
c->buffer->merge_clusters (start, end);
hb_glyph_info_t buf[4];
commit fc405b7ca77088135cb7de11cb32c254b85272fd
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu Jan 11 11:55:29 2018 +0100
[test/text-rendering-tests] Update from upstream
diff --git a/test/shaping/data/text-rendering-tests/DISABLED b/test/shaping/data/text-rendering-tests/DISABLED
index 7d63246c..0e1b89b3 100644
--- a/test/shaping/data/text-rendering-tests/DISABLED
+++ b/test/shaping/data/text-rendering-tests/DISABLED
@@ -11,6 +11,7 @@ tests/MORX-6.tests
tests/MORX-7.tests
tests/MORX-8.tests
tests/MORX-9.tests
+tests/MORX-10.tests
# Rounding differences
tests/SHARAN-1.tests
diff --git a/test/shaping/data/text-rendering-tests/Makefile.sources b/test/shaping/data/text-rendering-tests/Makefile.sources
index 913d4195..8e0f4318 100644
--- a/test/shaping/data/text-rendering-tests/Makefile.sources
+++ b/test/shaping/data/text-rendering-tests/Makefile.sources
@@ -28,11 +28,7 @@ TESTS = \
tests/HVAR-2.tests \
tests/KERN-1.tests \
tests/KERN-2.tests \
- tests/MORX-5.tests \
- tests/MORX-6.tests \
- tests/MORX-7.tests \
- tests/MORX-8.tests \
- tests/MORX-9.tests \
+ tests/MORX-10.tests \
tests/SHBALI-3.tests \
tests/SHKNDA-1.tests \
$(NULL)
@@ -43,6 +39,11 @@ DISBALED_TESTS = \
tests/MORX-2.tests \
tests/MORX-3.tests \
tests/MORX-4.tests \
+ tests/MORX-5.tests \
+ tests/MORX-6.tests \
+ tests/MORX-7.tests \
+ tests/MORX-8.tests \
+ tests/MORX-9.tests \
tests/SHARAN-1.tests \
tests/SHBALI-1.tests \
tests/SHBALI-2.tests \
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXTen.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXTen.ttf
new file mode 100644
index 00000000..5827ec5a
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXTen.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-10.tests b/test/shaping/data/text-rendering-tests/tests/MORX-10.tests
new file mode 100644
index 00000000..a6a5444f
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-10.tests
@@ -0,0 +1 @@
+../fonts/TestMORXTen.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0041,U+0042,U+0041,U+0042:[A|B at 638,0|A at 1288,0|B at 1926,0|B at 2576,0|A at 3226,0]
commit 9adbd938fafe1de4e279489fc37ae33c900e22f0
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu Jan 11 11:55:10 2018 +0100
Minor
diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh
index 8c62b174..520ae752 100644
--- a/src/hb-aat-layout-morx-table.hh
+++ b/src/hb-aat-layout-morx-table.hh
@@ -147,7 +147,7 @@ struct RearrangementSubtable
}
}
- if (false/* XXX*/ && flags & DontAdvance)
+ if (false/* XXX */ && flags & DontAdvance)
i--; /* XXX Detect infinite loop. */
state = entry->newState;
commit 4177f646aa60180f094e064a53e54c5402fe53c6
Author: Ebrahim Byagowi <ebrahim at gnu.org>
Date: Thu Jan 11 15:43:23 2018 +0330
[cmake] Update and unbreak (#700)
diff --git a/test/shaping/CMakeLists.txt b/test/shaping/CMakeLists.txt
index b79d5328..4bdc5c9e 100644
--- a/test/shaping/CMakeLists.txt
+++ b/test/shaping/CMakeLists.txt
@@ -1,5 +1,5 @@
if (HB_BUILD_UTILS)
- file (READ "${CMAKE_CURRENT_SOURCE_DIR}/data/in-house/Makefile.am" INHOUSE)
+ file (READ "${CMAKE_CURRENT_SOURCE_DIR}/data/in-house/Makefile.sources" INHOUSE)
extract_make_variable (TESTS ${INHOUSE})
foreach (test IN ITEMS ${TESTS})
add_test (NAME ${test}
@@ -7,7 +7,7 @@ if (HB_BUILD_UTILS)
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
endforeach ()
- file (READ "${CMAKE_CURRENT_SOURCE_DIR}/data/text-rendering-tests/Makefile.am" TEXTRENDERING)
+ file (READ "${CMAKE_CURRENT_SOURCE_DIR}/data/text-rendering-tests/Makefile.sources" TEXTRENDERING)
extract_make_variable (TESTS ${TEXTRENDERING})
foreach (test IN ITEMS ${TESTS})
add_test (NAME ${test}
More information about the HarfBuzz
mailing list