[HarfBuzz] harfbuzz: Branch 'master' - 8 commits
Behdad Esfahbod
behdad at kemper.freedesktop.org
Thu Oct 11 15:31:03 UTC 2018
src/hb-aat-layout-common.hh | 4
src/hb-aat-layout-trak-table.hh | 135 ++++++++++++++----------
src/hb-aat-layout.cc | 25 ++++
src/hb-aat-layout.hh | 8 +
src/hb-ot-shape.cc | 2
test/shaping/data/in-house/Makefile.sources | 1
test/shaping/data/in-house/fonts/TestTRAK.ttf |binary
test/shaping/data/in-house/tests/aat-trak.tests | 8 +
8 files changed, 126 insertions(+), 57 deletions(-)
New commits:
commit 100e95f48e3d137c654d206e858d6419ea62a12c
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu Oct 11 11:30:45 2018 -0400
[trak] Add tests
diff --git a/test/shaping/data/in-house/Makefile.sources b/test/shaping/data/in-house/Makefile.sources
index 1f7eff20..f2402740 100644
--- a/test/shaping/data/in-house/Makefile.sources
+++ b/test/shaping/data/in-house/Makefile.sources
@@ -1,4 +1,5 @@
TESTS = \
+ tests/aat-trak.tests \
tests/arabic-fallback-shaping.tests \
tests/arabic-feature-order.tests \
tests/arabic-like-joining.tests \
diff --git a/test/shaping/data/in-house/fonts/TestTRAK.ttf b/test/shaping/data/in-house/fonts/TestTRAK.ttf
new file mode 100644
index 00000000..07ae3afd
Binary files /dev/null and b/test/shaping/data/in-house/fonts/TestTRAK.ttf differ
diff --git a/test/shaping/data/in-house/tests/aat-trak.tests b/test/shaping/data/in-house/tests/aat-trak.tests
new file mode 100644
index 00000000..9e650558
--- /dev/null
+++ b/test/shaping/data/in-house/tests/aat-trak.tests
@@ -0,0 +1,8 @@
+../fonts/TestTRAK.ttf::U+0041,U+0042,U+0043:[A.alt=0+1000|B=1+1000|C.alt=2+1000]
+../fonts/TestTRAK.ttf:--font-ptem=.5:U+0041,U+0042,U+0043:[A.alt=0 at 100,0+1200|B=1 at 100,0+1200|C.alt=2 at 100,0+1200]
+../fonts/TestTRAK.ttf:--font-ptem=1:U+0041,U+0042,U+0043:[A.alt=0 at 100,0+1200|B=1 at 100,0+1200|C.alt=2 at 100,0+1200]
+../fonts/TestTRAK.ttf:--font-ptem=2:U+0041,U+0042,U+0043:[A.alt=0 at 93,0+1187|B=1 at 93,0+1187|C.alt=2 at 93,0+1187]
+../fonts/TestTRAK.ttf:--font-ptem=9:U+0041,U+0042,U+0043:[A.alt=0+1000|B=1+1000|C.alt=2+1000]
+../fonts/TestTRAK.ttf:--font-ptem=24:U+0041,U+0042,U+0043:[A.alt=0 at -12,0+976|B=1 at -12,0+976|C.alt=2 at -12,0+976]
+../fonts/TestTRAK.ttf:--font-ptem=72:U+0041,U+0042,U+0043:[A.alt=0 at -50,0+900|B=1 at -50,0+900|C.alt=2 at -50,0+900]
+../fonts/TestTRAK.ttf:--font-ptem=144:U+0041,U+0042,U+0043:[A.alt=0 at -100,0+800|B=1 at -100,0+800|C.alt=2 at -100,0+800]
commit 04f72e8990ea61ffc6b62105c75e0a3e1b1ebab4
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu Oct 11 11:25:07 2018 -0400
[trak] Implement extrapolation
This concludes trak, as well as AAT shaping support!
diff --git a/src/hb-aat-layout-trak-table.hh b/src/hb-aat-layout-trak-table.hh
index b2d69413..e0272175 100644
--- a/src/hb-aat-layout-trak-table.hh
+++ b/src/hb-aat-layout-trak-table.hh
@@ -82,6 +82,22 @@ struct TrackTableEntry
struct TrackData
{
+ inline float interpolate_at (unsigned int idx,
+ float target_size,
+ const TrackTableEntry &trackTableEntry,
+ const void *base) const
+ {
+ unsigned int sizes = nSizes;
+ hb_array_t<Fixed> size_table ((base+sizeTable).arrayZ, sizes);
+
+ float s0 = size_table[idx].to_float ();
+ float s1 = size_table[idx + 1].to_float ();
+ float t = unlikely (s0 == s1) ? 0.f : (target_size - s0) / (s1 - s0);
+ return (float) t * trackTableEntry.get_value (base, idx + 1, sizes) +
+ ((float) 1.0 - t) * trackTableEntry.get_value (base, idx, sizes);
+ return 0;
+ }
+
inline float get_tracking (const void *base, float ptem) const
{
/* CoreText points are CSS pixels (96 per inch),
@@ -90,13 +106,10 @@ struct TrackData
* https://developer.apple.com/library/content/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html
*/
float csspx = ptem * 96.f / 72.f;
- Fixed fixed_size;
- fixed_size.set_float (csspx);
/*
* Choose track.
*/
-
const TrackTableEntry *trackTableEntry = nullptr;
unsigned int count = nTracks;
for (unsigned int i = 0; i < count; i++)
@@ -117,31 +130,19 @@ struct TrackData
/*
* Choose size.
*/
-
unsigned int sizes = nSizes;
-
if (!sizes) return 0.;
if (sizes == 1) return trackTableEntry->get_value (base, 0, sizes);
/* TODO bfind() */
- unsigned int size_index;
hb_array_t<Fixed> size_table ((base+sizeTable).arrayZ, sizes);
+ unsigned int size_index;
for (size_index = 0; size_index < sizes; size_index++)
- if ((int) size_table[size_index] >= (int) fixed_size)
+ if (size_table[size_index].to_float () >= csspx)
break;
- // TODO(ebraminio): We don't attempt to extrapolate to larger or
- // smaller values for now but we should do, per spec
- if (size_index == sizes)
- return trackTableEntry->get_value (base, sizes - 1, sizes);
- if (size_index == 0 || size_table[size_index] == fixed_size)
- return trackTableEntry->get_value (base, size_index, sizes);
-
- float s0 = size_table[size_index - 1].to_float ();
- float s1 = size_table[size_index].to_float ();
- float t = (csspx - s0) / (s1 - s0);
- return (float) t * trackTableEntry->get_value (base, size_index, sizes) +
- ((float) 1.0 - t) * trackTableEntry->get_value (base, size_index - 1, sizes);
+ return interpolate_at (size_index ? size_index - 1 : 0, csspx,
+ *trackTableEntry, base);
}
inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
commit d6a12dba6da6262fd9e5d8397b46ac8516136cae
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu Oct 11 11:10:06 2018 -0400
[trak] Fix, and hook up
Works beautifully! Test coming.
diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh
index 78de04fa..78a27a74 100644
--- a/src/hb-aat-layout-common.hh
+++ b/src/hb-aat-layout-common.hh
@@ -540,7 +540,7 @@ struct hb_aat_apply_context_t :
inline hb_aat_apply_context_t (hb_ot_shape_plan_t *plan_,
hb_font_t *font_,
hb_buffer_t *buffer_,
- hb_blob_t *table,
+ hb_blob_t *blob = const_cast<hb_blob_t *> (&Null(hb_blob_t)),
const ankr &ankr_table_ = Null(ankr),
const char *ankr_end_ = nullptr) :
plan (plan_), font (font_), face (font->face), buffer (buffer_),
@@ -548,7 +548,7 @@ struct hb_aat_apply_context_t :
ankr_table (ankr_table_), ankr_end (ankr_end_),
lookup_index (0), debug_depth (0)
{
- sanitizer.init (table);
+ sanitizer.init (blob);
sanitizer.set_num_glyphs (face->get_num_glyphs ());
sanitizer.start_processing ();
sanitizer.set_max_ops (HB_SANITIZE_MAX_OPS_MAX);
diff --git a/src/hb-aat-layout-trak-table.hh b/src/hb-aat-layout-trak-table.hh
index 368c55c1..b2d69413 100644
--- a/src/hb-aat-layout-trak-table.hh
+++ b/src/hb-aat-layout-trak-table.hh
@@ -125,9 +125,9 @@ struct TrackData
/* TODO bfind() */
unsigned int size_index;
- UnsizedArrayOf<Fixed> size_table = base+sizeTable;
+ hb_array_t<Fixed> size_table ((base+sizeTable).arrayZ, sizes);
for (size_index = 0; size_index < sizes; size_index++)
- if (size_table[size_index] >= fixed_size)
+ if ((int) size_table[size_index] >= (int) fixed_size)
break;
// TODO(ebraminio): We don't attempt to extrapolate to larger or
@@ -169,6 +169,8 @@ struct trak
{
static const hb_tag_t tableTag = HB_AAT_TAG_trak;
+ inline bool has_data (void) const { return version.to_int () != 0; }
+
inline bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
diff --git a/src/hb-aat-layout.cc b/src/hb-aat-layout.cc
index 73ab06d3..2b86ba8c 100644
--- a/src/hb-aat-layout.cc
+++ b/src/hb-aat-layout.cc
@@ -37,7 +37,7 @@
#include "hb-aat-ltag-table.hh" // Just so we compile it; unused otherwise.
/*
- * morx/kerx/trak/ankr
+ * morx/kerx/trak
*/
static inline const AAT::morx&
@@ -82,6 +82,12 @@ _get_ankr (hb_face_t *face, hb_blob_t **blob = nullptr)
*blob = hb_ot_face_data (face)->ankr.get_blob ();
return ankr;
}
+static inline const AAT::trak&
+_get_trak (hb_face_t *face)
+{
+ if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return Null(AAT::trak);
+ return *(hb_ot_face_data (face)->trak.get ());
+}
hb_bool_t
@@ -124,3 +130,20 @@ hb_aat_layout_position (hb_ot_shape_plan_t *plan,
ankr, ankr_blob->data + ankr_blob->length);
kerx.apply (&c);
}
+
+hb_bool_t
+hb_aat_layout_has_tracking (hb_face_t *face)
+{
+ return _get_trak (face).has_data ();
+}
+
+void
+hb_aat_layout_track (hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer)
+{
+ const AAT::trak& trak = _get_trak (font->face);
+
+ AAT::hb_aat_apply_context_t c (plan, font, buffer);
+ trak.apply (&c);
+}
diff --git a/src/hb-aat-layout.hh b/src/hb-aat-layout.hh
index aafc3278..897c26aa 100644
--- a/src/hb-aat-layout.hh
+++ b/src/hb-aat-layout.hh
@@ -47,4 +47,12 @@ hb_aat_layout_position (hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
+HB_INTERNAL hb_bool_t
+hb_aat_layout_has_tracking (hb_face_t *face);
+
+HB_INTERNAL void
+hb_aat_layout_track (hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer);
+
#endif /* HB_AAT_LAYOUT_HH */
diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc
index 75f72eda..3ca54ac8 100644
--- a/src/hb-ot-shape.cc
+++ b/src/hb-ot-shape.cc
@@ -838,6 +838,8 @@ hb_ot_position_complex (const hb_ot_shape_context_t *c)
else if (c->plan->apply_kerx)
hb_aat_layout_position (c->plan, c->font, c->buffer);
+ hb_aat_layout_track (c->plan, c->font, c->buffer);
+
if (!c->plan->apply_kerx)
switch (c->plan->shaper->zero_width_marks)
{
commit 3d7dea6dfdc9e75dcca100a79525aa3736dbe29c
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu Oct 11 10:32:08 2018 -0400
[trak] Handle nSizes=0 and 1
diff --git a/src/hb-aat-layout-trak-table.hh b/src/hb-aat-layout-trak-table.hh
index 63dd890c..368c55c1 100644
--- a/src/hb-aat-layout-trak-table.hh
+++ b/src/hb-aat-layout-trak-table.hh
@@ -93,7 +93,9 @@ struct TrackData
Fixed fixed_size;
fixed_size.set_float (csspx);
- /* XXX Clean this up. Make it work with nSizes==1 and 0. */
+ /*
+ * Choose track.
+ */
const TrackTableEntry *trackTableEntry = nullptr;
unsigned int count = nTracks;
@@ -112,8 +114,15 @@ struct TrackData
}
if (!trackTableEntry) return 0.;
+ /*
+ * Choose size.
+ */
+
unsigned int sizes = nSizes;
+ if (!sizes) return 0.;
+ if (sizes == 1) return trackTableEntry->get_value (base, 0, sizes);
+
/* TODO bfind() */
unsigned int size_index;
UnsizedArrayOf<Fixed> size_table = base+sizeTable;
commit 451f3de521ff1b7f4d3b8ebb2cc0b95d88c9314a
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu Oct 11 10:30:32 2018 -0400
[trak] Fix counting
diff --git a/src/hb-aat-layout-trak-table.hh b/src/hb-aat-layout-trak-table.hh
index 9054922b..63dd890c 100644
--- a/src/hb-aat-layout-trak-table.hh
+++ b/src/hb-aat-layout-trak-table.hh
@@ -95,10 +95,9 @@ struct TrackData
/* XXX Clean this up. Make it work with nSizes==1 and 0. */
- unsigned int sizes = nSizes;
-
const TrackTableEntry *trackTableEntry = nullptr;
- for (unsigned int i = 0; i < sizes; i++)
+ unsigned int count = nTracks;
+ for (unsigned int i = 0; i < count; i++)
{
/* Note: Seems like the track entries are sorted by values. But the
* spec doesn't explicitly say that. It just mentions it in the example. */
@@ -111,9 +110,10 @@ struct TrackData
break;
}
}
-
if (!trackTableEntry) return 0.;
+ unsigned int sizes = nSizes;
+
/* TODO bfind() */
unsigned int size_index;
UnsizedArrayOf<Fixed> size_table = base+sizeTable;
commit a5be380cae9b49ed85c8620f1921209ef61a72ad
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu Oct 11 10:29:02 2018 -0400
[trak] More
diff --git a/src/hb-aat-layout-trak-table.hh b/src/hb-aat-layout-trak-table.hh
index dbad449b..9054922b 100644
--- a/src/hb-aat-layout-trak-table.hh
+++ b/src/hb-aat-layout-trak-table.hh
@@ -98,33 +98,41 @@ struct TrackData
unsigned int sizes = nSizes;
const TrackTableEntry *trackTableEntry = nullptr;
- for (unsigned int i = 0; i < sizes; ++i)
- // For now we only seek for track entries with zero tracking value
+ for (unsigned int i = 0; i < sizes; i++)
+ {
+ /* Note: Seems like the track entries are sorted by values. But the
+ * spec doesn't explicitly say that. It just mentions it in the example. */
+
+ /* For now we only seek for track entries with zero tracking value */
+
if (trackTable[i].get_track_value () == 0.f)
- trackTableEntry = &trackTable[0];
+ {
+ trackTableEntry = &trackTable[0];
+ break;
+ }
+ }
- // We couldn't match any, exit
if (!trackTableEntry) return 0.;
/* TODO bfind() */
unsigned int size_index;
UnsizedArrayOf<Fixed> size_table = base+sizeTable;
- for (size_index = 0; size_index < sizes; ++size_index)
+ for (size_index = 0; size_index < sizes; size_index++)
if (size_table[size_index] >= fixed_size)
break;
// TODO(ebraminio): We don't attempt to extrapolate to larger or
// smaller values for now but we should do, per spec
if (size_index == sizes)
- return trackTableEntry->get_value (base, sizes - 1, nSizes);
+ return trackTableEntry->get_value (base, sizes - 1, sizes);
if (size_index == 0 || size_table[size_index] == fixed_size)
- return trackTableEntry->get_value (base, size_index, nSizes);
+ return trackTableEntry->get_value (base, size_index, sizes);
float s0 = size_table[size_index - 1].to_float ();
float s1 = size_table[size_index].to_float ();
float t = (csspx - s0) / (s1 - s0);
- return (float) t * trackTableEntry->get_value (base, size_index, nSizes) +
- ((float) 1.0 - t) * trackTableEntry->get_value (base, size_index - 1, nSizes);
+ return (float) t * trackTableEntry->get_value (base, size_index, sizes) +
+ ((float) 1.0 - t) * trackTableEntry->get_value (base, size_index - 1, sizes);
}
inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
commit d06c4a867f0d383d8c27f2957e646d9e3fe6853b
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu Oct 11 10:22:01 2018 -0400
[trak] Only adjust around first glyph
Assumes graphemes only have one base glyph.
diff --git a/src/hb-aat-layout-trak-table.hh b/src/hb-aat-layout-trak-table.hh
index 71f169c5..dbad449b 100644
--- a/src/hb-aat-layout-trak-table.hh
+++ b/src/hb-aat-layout-trak-table.hh
@@ -174,24 +174,24 @@ struct trak
{
const TrackData &trackData = this+horizData;
float tracking = trackData.get_tracking (this, ptem);
- hb_position_t advance_to_add = c->font->em_scalef_x (tracking / 2);
+ hb_position_t offset_to_add = c->font->em_scalef_x (tracking / 2);
+ hb_position_t advance_to_add = c->font->em_scalef_x (tracking);
foreach_grapheme (buffer, start, end)
{
- buffer->pos[start].x_offset += advance_to_add;
buffer->pos[start].x_advance += advance_to_add;
- buffer->pos[end].x_advance += advance_to_add;
+ buffer->pos[start].x_offset += offset_to_add;
}
}
else
{
const TrackData &trackData = this+vertData;
float tracking = trackData.get_tracking (this, ptem);
- hb_position_t advance_to_add = c->font->em_scalef_y (tracking / 2);
+ hb_position_t offset_to_add = c->font->em_scalef_y (tracking / 2);
+ hb_position_t advance_to_add = c->font->em_scalef_y (tracking);
foreach_grapheme (buffer, start, end)
{
- buffer->pos[start].y_offset += advance_to_add;
buffer->pos[start].y_advance += advance_to_add;
- buffer->pos[end].y_advance += advance_to_add;
+ buffer->pos[start].y_offset += offset_to_add;
}
}
commit 071a2cbcddcbafae9458e674c21db5001b39518d
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu Oct 11 10:18:46 2018 -0400
[trak] Clean up
diff --git a/src/hb-aat-layout-trak-table.hh b/src/hb-aat-layout-trak-table.hh
index 3b7d4388..71f169c5 100644
--- a/src/hb-aat-layout-trak-table.hh
+++ b/src/hb-aat-layout-trak-table.hh
@@ -46,28 +46,32 @@ struct TrackTableEntry
{
friend struct TrackData;
- inline bool sanitize (hb_sanitize_context_t *c, const void *base,
- unsigned int size) const
+ inline float get_track_value () const
{
- TRACE_SANITIZE (this);
- return_trace (likely (c->check_struct (this) &&
- (valuesZ.sanitize (c, base, size))));
+ return track.to_float ();
}
- private:
- inline float get_track_value () const
+ inline int get_value (const void *base,
+ unsigned int index,
+ unsigned int nSizes) const
{
- return track.to_float ();
+ return hb_array_t<FWORD> ((base+valuesZ).arrayZ, nSizes)[index];
}
- inline int get_value (const void *base, unsigned int index) const
+ public:
+ inline bool sanitize (hb_sanitize_context_t *c, const void *base,
+ unsigned int nSizes) const
{
- return (base+valuesZ)[index];
+ TRACE_SANITIZE (this);
+ return_trace (likely (c->check_struct (this) &&
+ (valuesZ.sanitize (c, base, nSizes))));
}
protected:
Fixed track; /* Track value for this record. */
- NameID trackNameID; /* The 'name' table index for this track */
+ NameID trackNameID; /* The 'name' table index for this track.
+ * (a short word or phrase like "loose"
+ * or "very tight") */
OffsetTo<UnsizedArrayOf<FWORD>, HBUINT16, false>
valuesZ; /* Offset from start of tracking table to
* per-size tracking values for this track. */
@@ -78,14 +82,6 @@ struct TrackTableEntry
struct TrackData
{
- inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) &&
- sizeTable.sanitize (c, base, nSizes) &&
- trackTable.sanitize (c, nTracks, base, nSizes));
- }
-
inline float get_tracking (const void *base, float ptem) const
{
/* CoreText points are CSS pixels (96 per inch),
@@ -120,22 +116,31 @@ struct TrackData
// TODO(ebraminio): We don't attempt to extrapolate to larger or
// smaller values for now but we should do, per spec
if (size_index == sizes)
- return trackTableEntry->get_value (base, sizes - 1);
+ return trackTableEntry->get_value (base, sizes - 1, nSizes);
if (size_index == 0 || size_table[size_index] == fixed_size)
- return trackTableEntry->get_value (base, size_index);
+ return trackTableEntry->get_value (base, size_index, nSizes);
float s0 = size_table[size_index - 1].to_float ();
float s1 = size_table[size_index].to_float ();
float t = (csspx - s0) / (s1 - s0);
- return (float) t * trackTableEntry->get_value (base, size_index) +
- ((float) 1.0 - t) * trackTableEntry->get_value (base, size_index - 1);
+ return (float) t * trackTableEntry->get_value (base, size_index, nSizes) +
+ ((float) 1.0 - t) * trackTableEntry->get_value (base, size_index - 1, nSizes);
+ }
+
+ inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) &&
+ sizeTable.sanitize (c, base, nSizes) &&
+ trackTable.sanitize (c, nTracks, base, nSizes));
}
protected:
HBUINT16 nTracks; /* Number of separate tracks included in this table. */
HBUINT16 nSizes; /* Number of point sizes included in this table. */
LOffsetTo<UnsizedArrayOf<Fixed>, false>
- sizeTable; /* Offset to array[nSizes] of size values. */
+ sizeTable; /* Offset from start of the tracking table to
+ * Array[nSizes] of size values.. */
UnsizedArrayOf<TrackTableEntry>
trackTable; /* Array[nTracks] of TrackTableEntry records. */
@@ -194,15 +199,17 @@ struct trak
}
protected:
- FixedVersion<> version; /* Version of the tracking table--currently
- * 0x00010000u for version 1.0. */
- HBUINT16 format; /* Format of the tracking table */
- OffsetTo<TrackData> horizData; /* TrackData for horizontal text */
- OffsetTo<TrackData> vertData; /* TrackData for vertical text */
+ FixedVersion<> version; /* Version of the tracking table
+ * (0x00010000u for version 1.0). */
+ HBUINT16 format; /* Format of the tracking table (set to 0). */
+ OffsetTo<TrackData> horizData; /* Offset from start of tracking table to TrackData
+ * for horizontal text (or 0 if none). */
+ OffsetTo<TrackData> vertData; /* Offset from start of tracking table to TrackData
+ * for vertical text (or 0 if none). */
HBUINT16 reserved; /* Reserved. Set to 0. */
public:
- DEFINE_SIZE_MIN (12);
+ DEFINE_SIZE_STATIC (12);
};
} /* namespace AAT */
More information about the HarfBuzz
mailing list