[HarfBuzz] harfbuzz: Branch 'master' - 11 commits

Behdad Esfahbod behdad at kemper.freedesktop.org
Thu Jan 11 09:43:54 UTC 2018


 .circleci/config.yml                                           |  133 +++---
 CMakeLists.txt                                                 |   11 
 src/hb-aat-layout-common-private.hh                            |   89 ++++
 src/hb-aat-layout-morx-table.hh                                |  194 ++++++++--
 src/hb-open-type-private.hh                                    |    2 
 src/hb-private.hh                                              |   11 
 test/shaping/data/Makefile.am                                  |    4 
 test/shaping/data/in-house/Makefile.am                         |    4 
 test/shaping/data/text-rendering-tests/COPYING                 |   13 
 test/shaping/data/text-rendering-tests/Makefile.am             |   58 --
 test/shaping/data/text-rendering-tests/Makefile.sources        |   51 ++
 test/shaping/data/text-rendering-tests/README                  |    4 
 test/shaping/data/text-rendering-tests/fonts/TestMORXEight.ttf |binary
 test/shaping/data/text-rendering-tests/fonts/TestMORXNine.ttf  |binary
 test/shaping/data/text-rendering-tests/tests/MORX-5.tests      |   25 +
 test/shaping/data/text-rendering-tests/tests/MORX-6.tests      |    1 
 test/shaping/data/text-rendering-tests/tests/MORX-7.tests      |    1 
 test/shaping/data/text-rendering-tests/tests/MORX-8.tests      |    3 
 test/shaping/data/text-rendering-tests/tests/MORX-9.tests      |    1 
 test/shaping/data/text-rendering-tests/update.sh               |   48 ++
 test/shaping/run-tests.py                                      |   18 
 21 files changed, 511 insertions(+), 160 deletions(-)

New commits:
commit a5adc5aa84c03184fd1c8a486be80ff0af1f448c
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Jan 11 10:30:22 2018 +0100

    [test/text-rendering-tests] Update from upstream
    
    Also adds an update.sh script that does this automatically.

diff --git a/test/shaping/data/text-rendering-tests/Makefile.am b/test/shaping/data/text-rendering-tests/Makefile.am
index 56247b7b..788db1f6 100644
--- a/test/shaping/data/text-rendering-tests/Makefile.am
+++ b/test/shaping/data/text-rendering-tests/Makefile.am
@@ -6,61 +6,21 @@ NULL =
 lib:
 	@$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
 
+update:
+	(cd $(srcdir) && ./update.sh)
+
 EXTRA_DIST = \
 	README \
 	COPYING \
+	update.sh \
 	extract-tests.py \
 	fonts \
-	$(TESTS) \
+	tests \
 	$(NULL)
 
 TEST_EXTENSIONS = .tests
 TESTS_LOG_COMPILER = $(srcdir)/../../run-tests.py $(top_builddir)/util/hb-shape$(EXEEXT)
 
-TESTS = \
-	tests/AVAR-1.tests \
-	tests/CFF-1.tests \
-	tests/CFF2-1.tests \
-	tests/CFF-2.tests \
-	tests/CMAP-1.tests \
-	tests/CMAP-2.tests \
-	tests/CVAR-1.tests \
-	tests/CVAR-2.tests \
-	tests/GLYF-1.tests \
-	tests/GPOS-1.tests \
-	tests/GPOS-2.tests \
-	tests/GPOS-3.tests \
-	tests/GPOS-4.tests \
-	tests/GPOS-5.tests \
-	tests/GSUB-1.tests \
-	tests/GSUB-2.tests \
-	tests/GVAR-1.tests \
-	tests/GVAR-2.tests \
-	tests/GVAR-3.tests \
-	tests/GVAR-4.tests \
-	tests/GVAR-5.tests \
-	tests/GVAR-6.tests \
-	tests/GVAR-7.tests \
-	tests/GVAR-8.tests \
-	tests/GVAR-9.tests \
-	tests/HVAR-1.tests \
-	tests/HVAR-2.tests \
-	tests/KERN-1.tests \
-	tests/KERN-2.tests \
-	tests/SHBALI-3.tests \
-	tests/SHKNDA-1.tests \
-	$(NULL)
-DISABLED_TESTS = \
-	tests/CMAP-3.tests # Non-Unicode cmap \
-	tests/MORX-1.tests # Not implemented \
-	tests/MORX-2.tests # Not implemented \
-	tests/MORX-3.tests # Not implemented \
-	tests/MORX-4.tests # Not implemented \
-	tests/SHARAN-1.tests # Rounding difference \
-	tests/SHBALI-1.tests # Rounding difference \
-	tests/SHBALI-2.tests # Rounding difference \
-	tests/SHKNDA-2.tests # Rounding difference \
-	tests/SHKNDA-3.tests # Rounding difference \
-	$(NULL)
+include Makefile.sources
 
 -include $(top_srcdir)/git.mk
diff --git a/test/shaping/data/text-rendering-tests/Makefile.sources b/test/shaping/data/text-rendering-tests/Makefile.sources
new file mode 100644
index 00000000..913d4195
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/Makefile.sources
@@ -0,0 +1,51 @@
+TESTS = \
+	tests/AVAR-1.tests \
+	tests/CFF-1.tests \
+	tests/CFF2-1.tests \
+	tests/CFF-2.tests \
+	tests/CMAP-1.tests \
+	tests/CMAP-2.tests \
+	tests/CVAR-1.tests \
+	tests/CVAR-2.tests \
+	tests/GLYF-1.tests \
+	tests/GPOS-1.tests \
+	tests/GPOS-2.tests \
+	tests/GPOS-3.tests \
+	tests/GPOS-4.tests \
+	tests/GPOS-5.tests \
+	tests/GSUB-1.tests \
+	tests/GSUB-2.tests \
+	tests/GVAR-1.tests \
+	tests/GVAR-2.tests \
+	tests/GVAR-3.tests \
+	tests/GVAR-4.tests \
+	tests/GVAR-5.tests \
+	tests/GVAR-6.tests \
+	tests/GVAR-7.tests \
+	tests/GVAR-8.tests \
+	tests/GVAR-9.tests \
+	tests/HVAR-1.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/SHBALI-3.tests \
+	tests/SHKNDA-1.tests \
+	$(NULL)
+
+DISBALED_TESTS = \
+	tests/CMAP-3.tests \
+	tests/MORX-1.tests \
+	tests/MORX-2.tests \
+	tests/MORX-3.tests \
+	tests/MORX-4.tests \
+	tests/SHARAN-1.tests \
+	tests/SHBALI-1.tests \
+	tests/SHBALI-2.tests \
+	tests/SHKNDA-2.tests \
+	tests/SHKNDA-3.tests \
+	$(NULL)
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXEight.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXEight.ttf
new file mode 100644
index 00000000..9255e996
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXEight.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXNine.ttf b/test/shaping/data/text-rendering-tests/fonts/TestMORXNine.ttf
new file mode 100644
index 00000000..4371df45
Binary files /dev/null and b/test/shaping/data/text-rendering-tests/fonts/TestMORXNine.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-5.tests b/test/shaping/data/text-rendering-tests/tests/MORX-5.tests
new file mode 100644
index 00000000..ca8d0864
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-5.tests
@@ -0,0 +1,25 @@
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0033:[P|Q at 333,0|R at 699,0|A at 1050,0|X at 1880,0|Y at 2244,0|Z at 2576,0|three at 2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0034:[P|Q at 333,0|R at 699,0|A at 1050,0|X at 1880,0|Y at 2244,0|Z at 2576,0|four at 2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0035:[P|Q at 333,0|R at 699,0|A at 1050,0|X at 1880,0|Y at 2244,0|Z at 2576,0|five at 2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0036:[P|Q at 333,0|R at 699,0|A at 1050,0|X at 1880,0|Y at 2244,0|Z at 2576,0|six at 2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0037:[P|Q at 333,0|R at 699,0|A at 1050,0|X at 1880,0|Y at 2244,0|Z at 2576,0|seven at 2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0038:[P|Q at 333,0|R at 699,0|A at 1050,0|X at 1880,0|Y at 2244,0|Z at 2576,0|eight at 2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+0038:[P|Q at 333,0|R at 699,0|A at 1050,0|B at 1880,0|X at 2710,0|Y at 3074,0|Z at 3406,0|eight at 3728,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+0039:[P|Q at 333,0|R at 699,0|A at 1050,0|X at 1880,0|Y at 2244,0|Z at 2576,0|nine at 2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+0039:[P|Q at 333,0|R at 699,0|A at 1050,0|B at 1880,0|X at 2710,0|Y at 3074,0|Z at 3406,0|nine at 3728,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+2793:[P|Q at 333,0|R at 699,0|A at 1050,0|X at 1880,0|Y at 2244,0|Z at 2576,0|one_zero at 2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+2793:[P|Q at 333,0|R at 699,0|A at 1050,0|B at 1880,0|X at 2710,0|Y at 3074,0|Z at 3406,0|one_zero at 3728,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+24EB:[P|Q at 333,0|R at 699,0|A at 1050,0|X at 1880,0|Y at 2244,0|Z at 2576,0|one_one at 2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+24EB:[P|Q at 333,0|R at 699,0|A at 1050,0|B at 1880,0|X at 2710,0|Y at 3074,0|Z at 3406,0|one_one at 3728,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+24EC:[P|Q at 333,0|R at 699,0|A at 1050,0|X at 1880,0|Y at 2244,0|Z at 2576,0|one_two at 2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+24EC:[P|Q at 333,0|R at 699,0|A at 1050,0|B at 1880,0|X at 2710,0|Y at 3074,0|Z at 3406,0|one_two at 3728,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0058,U+0059,U+005A,U+24EC:[P|Q at 333,0|R at 699,0|A at 1050,0|B at 1880,0|C at 2710,0|X at 3540,0|Y at 3904,0|Z at 4236,0|one_two at 4558,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+24ED:[P|Q at 333,0|R at 699,0|A at 1050,0|X at 1880,0|Y at 2244,0|Z at 2576,0|one_three at 2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+24ED:[P|Q at 333,0|R at 699,0|A at 1050,0|B at 1880,0|X at 2710,0|Y at 3074,0|Z at 3406,0|one_three at 3728,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0058,U+0059,U+005A,U+24ED:[P|Q at 333,0|R at 699,0|A at 1050,0|B at 1880,0|C at 2710,0|X at 3540,0|Y at 3904,0|Z at 4236,0|one_three at 4558,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+24EE:[P|Q at 333,0|R at 699,0|A at 1050,0|X at 1880,0|Y at 2244,0|Z at 2576,0|one_four at 2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+24EE:[P|Q at 333,0|R at 699,0|A at 1050,0|B at 1880,0|X at 2710,0|Y at 3074,0|Z at 3406,0|one_four at 3728,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0058,U+0059,U+005A,U+24EE:[P|Q at 333,0|R at 699,0|A at 1050,0|B at 1880,0|C at 2710,0|X at 3540,0|Y at 3904,0|Z at 4236,0|one_four at 4558,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0058,U+0059,U+005A,U+24EF:[P|Q at 333,0|R at 699,0|A at 1050,0|X at 1880,0|Y at 2244,0|Z at 2576,0|one_five at 2898,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0058,U+0059,U+005A,U+24EF:[P|Q at 333,0|R at 699,0|A at 1050,0|B at 1880,0|X at 2710,0|Y at 3074,0|Z at 3406,0|one_five at 3728,0]
+../fonts/TestMORXFour.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0050,U+0051,U+0052,U+0041,U+0042,U+0043,U+0058,U+0059,U+005A,U+24EF:[P|Q at 333,0|R at 699,0|A at 1050,0|B at 1880,0|C at 2710,0|X at 3540,0|Y at 3904,0|Z at 4236,0|one_five at 4558,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-6.tests b/test/shaping/data/text-rendering-tests/tests/MORX-6.tests
new file mode 100644
index 00000000..ff9c061a
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-6.tests
@@ -0,0 +1 @@
+../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+004F,U+004F,U+0041,U+0042,U+0043,U+0044,U+0045,U+0046,U+0047,U+004F,U+004F,U+004F,U+0033,U+0031,U+0034,U+0031:[O|O at 418,0|O at 836,0|E at 1254,0|F at 2084,0|A at 2914,0|G at 3744,0|B at 4574,0|C at 5404,0|D at 6234,0|O at 7064,0|O at 7482,0|O at 7900,0|three at 8318,0|one at 9168,0|four at 10018,0|one at 10868,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-7.tests b/test/shaping/data/text-rendering-tests/tests/MORX-7.tests
new file mode 100644
index 00000000..f2508486
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-7.tests
@@ -0,0 +1 @@
+../fonts/TestMORXTwo.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+004F,U+0042,U+0043,U+0044,U+0031:[B|C at 830,0|D at 1660,0|O at 2490,0|one at 2908,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-8.tests b/test/shaping/data/text-rendering-tests/tests/MORX-8.tests
new file mode 100644
index 00000000..aa0d28b5
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-8.tests
@@ -0,0 +1,3 @@
+../fonts/TestMORXEight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0030,U+0041,U+0042,U+0043:[zero|A at 914,0|B at 1552,0|C at 2202,0]
+../fonts/TestMORXEight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0031,U+0041,U+0042,U+0043:[one|B at 914,0|C at 1564,0|A at 2196,0]
+../fonts/TestMORXEight.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0032,U+0041,U+0042,U+0043:[two|C at 914,0|A at 1546,0|B at 2184,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-9.tests b/test/shaping/data/text-rendering-tests/tests/MORX-9.tests
new file mode 100644
index 00000000..a8999087
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-9.tests
@@ -0,0 +1 @@
+../fonts/TestMORXNine.ttf:--font-size=1000 --ned --remove-default-ignorables --font-funcs=ft:U+0041,U+0042,U+0058,U+0041,U+0042:[B|A at 650,0|X at 1288,0|A at 1874,0|B at 2512,0]
diff --git a/test/shaping/data/text-rendering-tests/update.sh b/test/shaping/data/text-rendering-tests/update.sh
new file mode 100755
index 00000000..31960a14
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/update.sh
@@ -0,0 +1,48 @@
+#!/bin/sh
+
+dir=`dirname "$0"`
+
+set -ex
+if test -d text-rendering-tests; then
+	cd text-rendering-tests
+	git pull
+	cd ..
+else
+	git clone https://github.com/unicode-org/text-rendering-tests
+fi
+
+test -d fonts && git rm -rf fonts
+test -d fonts && (echo "fonts/ dir not empty; investigate."; false)
+cp -a text-rendering-tests/fonts .
+git add fonts
+
+rmdir tests || true
+test -d tests && git rm -rf tests || true
+test -d tests && (echo "tests/ dir not empty; investigate."; false)
+mkdir tests
+
+echo "NULL =" > Makefile.sources
+echo > Makefile.sources
+echo "TESTS = \\" > Makefile.sources
+
+DISABLED="DISBALED_TESTS = \\"
+for x in text-rendering-tests/testcases/*.html; do
+	test "x$x" = xtext-rendering-tests/testcases/index.html && continue
+	out=tests/`basename "$x" .html`.tests
+	"$dir"/extract-tests.py < "$x" > "$out"
+	if grep -q "^$out$" DISABLED; then
+		DISABLED="$DISABLED
+	$out \\"
+	else
+		echo "	$out \\" >> Makefile.sources
+	fi
+done
+git add tests
+
+echo '	$(NULL)' >> Makefile.sources
+echo >> Makefile.sources
+echo "$DISABLED" >> Makefile.sources
+echo '	$(NULL)' >> Makefile.sources
+git add Makefile.sources
+
+git commit -e -m "[test/text-rendering-tests] Update from upstream"
commit c861daacc4255d41d2358868b917277422949dc9
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Jan 11 10:11:01 2018 +0100

    [test/text-rendering-tests] Add README and COPYING

diff --git a/test/shaping/data/text-rendering-tests/COPYING b/test/shaping/data/text-rendering-tests/COPYING
new file mode 100644
index 00000000..7758b2e5
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/COPYING
@@ -0,0 +1,13 @@
+Copyright 2016 Unicode Inc. All rights reserved.
+
+Licensed under the Apache License, Version 2.0 (the “License”);
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an “AS IS” BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/test/shaping/data/text-rendering-tests/Makefile.am b/test/shaping/data/text-rendering-tests/Makefile.am
index 385270a2..56247b7b 100644
--- a/test/shaping/data/text-rendering-tests/Makefile.am
+++ b/test/shaping/data/text-rendering-tests/Makefile.am
@@ -7,6 +7,8 @@ lib:
 	@$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
 
 EXTRA_DIST = \
+	README \
+	COPYING \
 	extract-tests.py \
 	fonts \
 	$(TESTS) \
diff --git a/test/shaping/data/text-rendering-tests/README b/test/shaping/data/text-rendering-tests/README
new file mode 100644
index 00000000..351f8301
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/README
@@ -0,0 +1,4 @@
+Tests in this directory are automatically imported from the
+text-rendering-tests repository owned by Unicode Consortium:
+
+  https://github.com/unicode-org/text-rendering-tests
commit 14b4d84eef18bd54287c10ce44eaef4f642f6238
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Jan 11 10:08:25 2018 +0100

    [aat] Fix RearrangementSubtable action

diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh
index 76c9a608..cbc69d26 100644
--- a/src/hb-aat-layout-morx-table.hh
+++ b/src/hb-aat-layout-morx-table.hh
@@ -121,7 +121,7 @@ struct RearrangementSubtable
 	  memcpy (buf + 2, info + end - r, r * sizeof (buf[0]));
 
 	  if (l != r)
-	    memmove (info + start + r - l, info + start + l, (end - start - l - r) * sizeof (buf[0]));
+	    memmove (info + start + r, info + start + l, (end - start - l - r) * sizeof (buf[0]));
 
 	  memcpy (info + start, buf + 2, r * sizeof (buf[0]));
 	  memcpy (info + end - l, buf, l * sizeof (buf[0]));
commit ea3e86c6401d41cf54d82692eccbf44c87be2fd5
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Jan 11 09:58:42 2018 +0100

    Minor

diff --git a/test/shaping/data/Makefile.am b/test/shaping/data/Makefile.am
index e76b3b87..4f2c1136 100644
--- a/test/shaping/data/Makefile.am
+++ b/test/shaping/data/Makefile.am
@@ -6,4 +6,8 @@ SUBDIRS = \
 	text-rendering-tests \
 	$(NULL)
 
+# Convenience targets:
+lib:
+	@$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
 -include $(top_srcdir)/git.mk
diff --git a/test/shaping/data/in-house/Makefile.am b/test/shaping/data/in-house/Makefile.am
index a9893a89..2f955191 100644
--- a/test/shaping/data/in-house/Makefile.am
+++ b/test/shaping/data/in-house/Makefile.am
@@ -2,6 +2,10 @@
 
 NULL =
 
+# Convenience targets:
+lib:
+	@$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
 EXTRA_DIST = \
 	COPYING \
 	fonts \
diff --git a/test/shaping/data/text-rendering-tests/Makefile.am b/test/shaping/data/text-rendering-tests/Makefile.am
index 2798e512..385270a2 100644
--- a/test/shaping/data/text-rendering-tests/Makefile.am
+++ b/test/shaping/data/text-rendering-tests/Makefile.am
@@ -2,6 +2,10 @@
 
 NULL =
 
+# Convenience targets:
+lib:
+	@$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
 EXTRA_DIST = \
 	extract-tests.py \
 	fonts \
commit 800e4ae80232f022404be155afd497b0421a6a64
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Jan 11 09:57:55 2018 +0100

    [aat] Mark state-machine-based lookup as completely unsafe-to-break
    
    To be improved later.

diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh
index f4e5cccc..76c9a608 100644
--- a/src/hb-aat-layout-morx-table.hh
+++ b/src/hb-aat-layout-morx-table.hh
@@ -63,6 +63,8 @@ struct RearrangementSubtable
     hb_glyph_info_t *info = c->buffer->info;
     unsigned int count = c->buffer->len;
 
+    c->buffer->unsafe_to_break (0, count); /* TODO Improve. */
+
     for (unsigned int i = 0; i < count; i++)
     {
       unsigned int klass = machine.get_class (info[i].codepoint, num_glyphs);
commit ca42d961293a9e4dfd0817c1a02d454008583282
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Jan 11 09:15:34 2018 +0100

    [aat] Implement RearrangementSubtable

diff --git a/src/hb-aat-layout-common-private.hh b/src/hb-aat-layout-common-private.hh
index 4b96ee6c..32ba6326 100644
--- a/src/hb-aat-layout-common-private.hh
+++ b/src/hb-aat-layout-common-private.hh
@@ -164,7 +164,7 @@ struct UnsizedArrayOf
     return_trace (c->check_array (arrayZ, arrayZ[0].static_size, count));
   }
 
-  protected:
+  public:
   Type	arrayZ[VAR];
   public:
   DEFINE_SIZE_ARRAY (0, arrayZ);
@@ -221,7 +221,7 @@ struct LookupSegmentSingle
   GlyphID	first;		/* First GlyphID in this segment */
   T		value;		/* The lookup value (only one) */
   public:
-  DEFINE_SIZE_STATIC (4 + sizeof (T));
+  DEFINE_SIZE_STATIC (4 + T::static_size);
 };
 
 template <typename T>
@@ -323,7 +323,7 @@ struct LookupSingle
   GlyphID	glyph;		/* Last GlyphID */
   T		value;		/* The lookup value (only one) */
   public:
-  DEFINE_SIZE_STATIC (4 + sizeof (T));
+  DEFINE_SIZE_STATIC (4 + T::static_size);
 };
 
 template <typename T>
@@ -424,7 +424,7 @@ struct Lookup
 };
 
 
-struct Class
+struct ClassTable
 {
   inline unsigned int get_class (hb_codepoint_t glyph_id) const
   {
@@ -448,6 +448,87 @@ struct Class
   DEFINE_SIZE_ARRAY (4, classArrayZ);
 };
 
+
+/*
+ * (Extended) State Table
+ */
+
+template <typename T>
+struct Entry
+{
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && data.sanitize (c));
+  }
+
+  public:
+  HBUINT16	newState;	/* Byte offset from beginning of state table to the new state. */
+  HBUINT16	flags;		/* Table specific. */
+  T		data;		/* Optional offsets to per-glyph tables. */
+  public:
+  DEFINE_SIZE_STATIC (4 + T::static_size);
+};
+
+template <>
+struct Entry<void>
+{
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  HBUINT16	newState;	/* Byte offset from beginning of state table to the new state. */
+  HBUINT16	flags;		/* Table specific. */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+template <typename Types, typename Extra>
+struct StateTable
+{
+  typedef typename Types::HBUINT HBUINT;
+  typedef typename Types::HBUSHORT HBUSHORT;
+  typedef typename Types::ClassType ClassType;
+
+  inline unsigned int get_class (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
+  { return (this+classTable).get_class (glyph_id, num_glyphs); }
+
+
+  inline const Entry<Extra> *get_entry (unsigned int state, unsigned int klass) const
+  {
+    const HBUSHORT *states = (this+stateArrayTable).arrayZ;
+    const Entry<Extra> *entries = (this+entryTable).arrayZ;
+
+    unsigned int entry = states[state * nClasses + klass]; /* XXX bound check. */
+
+    return &entries[entry]; /* XXX bound check. */
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int num_glyphs) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (true);
+    return_trace (c->check_struct (this)); /* XXX */
+  }
+
+  protected:
+  HBUINT	nClasses;	/* Number of classes, which is the number of indices
+				 * in a single line in the state array. */
+  OffsetTo<ClassType, HBUINT>
+		classTable;	/* Offset to the class table. */
+  OffsetTo<UnsizedArrayOf<HBUSHORT>, HBUINT>
+		stateArrayTable;/* Offset to the state array. */
+  OffsetTo<UnsizedArrayOf<Entry<Extra> >, HBUINT>
+		entryTable;	/* Offset to the entry array. */
+
+  public:
+  DEFINE_SIZE_UNION (2, format);
+};
+
+
 } /* namespace AAT */
 
 
diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh
index e7eac2b2..f4e5cccc 100644
--- a/src/hb-aat-layout-morx-table.hh
+++ b/src/hb-aat-layout-morx-table.hh
@@ -39,21 +39,124 @@ namespace AAT {
 using namespace OT;
 
 
+template <typename Types>
 struct RearrangementSubtable
 {
+  enum {
+    MarkFirst	= 0x8000,
+    DontAdvance	= 0x4000,
+    MarkLast	= 0x2000,
+    Verb	= 0x000F,
+  };
+
   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 ();
+
+    unsigned int state = 0;
+    unsigned int start = 0;
+    unsigned int end = 0;
+
+    hb_glyph_info_t *info = c->buffer->info;
+    unsigned int count = c->buffer->len;
+
+    for (unsigned int i = 0; i < count; i++)
+    {
+      unsigned int klass = machine.get_class (info[i].codepoint, num_glyphs);
+      const Entry<void> *entry = machine.get_entry (state, klass);
+      if (unlikely (!entry))
+        break;
+
+      unsigned int flags = entry->flags;
+
+      if (flags & MarkFirst)
+	start = i;
+
+      if (flags & MarkLast)
+	end = i + 1;
+
+      if ((flags & Verb) && start < end)
+      {
+	/* The following map has two nibbles, for start-side
+	 * and end-side. Values of 0,1,2 mean move that many
+	 * to the other side. Value of 3 means move 2 and
+	 * flip them. */
+	static const unsigned char map[16] =
+	{
+	  0x00,	/* 0	no change */
+	  0x10,	/* 1	Ax => xA */
+	  0x01,	/* 2	xD => Dx */
+	  0x11,	/* 3	AxD => DxA */
+	  0x20,	/* 4	ABx => xAB */
+	  0x30,	/* 5	ABx => xBA */
+	  0x02,	/* 6	xCD => CDx */
+	  0x03,	/* 7	xCD => DCx */
+	  0x12,	/* 8	AxCD => CDxA */
+	  0x13,	/* 9	AxCD => DCxA */
+	  0x21,	/* 10	ABxD => DxAB */
+	  0x31,	/* 11	ABxD => DxBA */
+	  0x22,	/* 12	ABxCD => CDxAB */
+	  0x32,	/* 13	ABxCD => CDxBA */
+	  0x23,	/* 14	ABxCD => DCxAB */
+	  0x33,	/* 15	ABxCD => DCxBA */
+	};
+
+	unsigned int m = map[flags & Verb];
+	unsigned int l = MIN<unsigned int> (2, m >> 4);
+	unsigned int r = MIN<unsigned int> (2, m & 0x0F);
+	bool reverse_l = 3 == (m >> 4);
+	bool reverse_r = 3 == (m & 0x0F);
+
+	if (end - start >= l + r)
+	{
+	  c->buffer->merge_clusters (start, end);
+
+	  hb_glyph_info_t buf[4];
+	  memcpy (buf, info + start, l * sizeof (buf[0]));
+	  memcpy (buf + 2, info + end - r, r * sizeof (buf[0]));
+
+	  if (l != r)
+	    memmove (info + start + r - l, info + start + l, (end - start - l - r) * sizeof (buf[0]));
+
+	  memcpy (info + start, buf + 2, r * sizeof (buf[0]));
+	  memcpy (info + end - l, buf, l * sizeof (buf[0]));
+	  if (reverse_l)
+	  {
+	    buf[0] = info[end - 1];
+	    info[end - 1] = info[end - 2];
+	    info[end - 2] = buf[0];
+	  }
+	  if (reverse_r)
+	  {
+	    buf[0] = info[start];
+	    info[start] = info[start + 1];
+	    info[start + 1] = buf[0];
+	  }
+	}
+      }
+
+      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
   {
     TRACE_SANITIZE (this);
-    /* TODO */
-    return_trace (false);
+    return_trace (machine.sanitize (c, 0/*XXX*/));
   }
+
+  protected:
+  StateTable<Types, void>	machine;
+  public:
+  DEFINE_SIZE_MIN (2);
 };
 
 struct ContextualSubtable
@@ -95,11 +198,12 @@ struct NoncontextualSubtable
   inline bool apply (hb_apply_context_t *c) const
   {
     TRACE_APPLY (this);
-    hb_buffer_t *buffer = c->buffer;
-    hb_glyph_info_t *info = buffer->info;
-    unsigned int num_glyphs = c->face->get_num_glyphs ();
+
     bool ret = false;
-    unsigned int count = buffer->len;
+    unsigned int num_glyphs = c->face->get_num_glyphs ();
+
+    hb_glyph_info_t *info = c->buffer->info;
+    unsigned int count = c->buffer->len;
     for (unsigned int i = 0; i < count; i++)
     {
       const GlyphID *replacement = substitute.get_value (info[i].codepoint, num_glyphs);
@@ -109,6 +213,7 @@ struct NoncontextualSubtable
 	ret = true;
       }
     }
+
     return_trace (ret);
   }
 
@@ -163,11 +268,13 @@ struct Feature
 };
 
 
-template <typename HBUINT>
+template <typename Types>
 struct ChainSubtable
 {
   template <typename> struct Chain;
-  friend struct Chain<HBUINT>;
+  friend struct Chain<Types>;
+
+  typedef typename Types::HBUINT HBUINT;
 
   inline unsigned int get_size (void) const { return length; }
   inline unsigned int get_type (void) const { return coverage & 0xFF; }
@@ -214,9 +321,10 @@ struct ChainSubtable
   protected:
   HBUINT		length;		/* Total subtable length, including this header. */
   HBUINT		coverage;	/* Coverage flags and subtable type. */
-  HBUINT32	subFeatureFlags;/* The 32-bit mask identifying which subtable this is. */
+  HBUINT32		subFeatureFlags;/* The 32-bit mask identifying which subtable this is. */
   union {
-  RearrangementSubtable	rearrangement;
+  RearrangementSubtable<Types>
+			rearrangement;
   ContextualSubtable	contextual;
   LigatureSubtable	ligature;
   NoncontextualSubtable	noncontextual;
@@ -226,17 +334,19 @@ struct ChainSubtable
   DEFINE_SIZE_MIN (2 * sizeof (HBUINT) + 4);
 };
 
-template <typename HBUINT>
+template <typename Types>
 struct Chain
 {
+  typedef typename Types::HBUINT HBUINT;
+
   inline void apply (hb_apply_context_t *c) const
   {
-    const ChainSubtable<HBUINT> *subtable = &StructAtOffset<ChainSubtable<HBUINT> > (featureZ, featureZ[0].static_size * featureCount);
+    const ChainSubtable<Types> *subtable = &StructAtOffset<ChainSubtable<Types> > (featureZ, featureZ[0].static_size * featureCount);
     unsigned int count = subtableCount;
     for (unsigned int i = 0; i < count; i++)
     {
       subtable->apply (c);
-      subtable = &StructAfter<ChainSubtable<HBUINT> > (*subtable);
+      subtable = &StructAfter<ChainSubtable<Types> > (*subtable);
     }
   }
 
@@ -253,13 +363,13 @@ struct Chain
     if (!c->check_array (featureZ, featureZ[0].static_size, featureCount))
       return_trace (false);
 
-    const ChainSubtable<HBUINT> *subtable = &StructAtOffset<ChainSubtable<HBUINT> > (featureZ, featureZ[0].static_size * featureCount);
+    const ChainSubtable<Types> *subtable = &StructAtOffset<ChainSubtable<Types> > (featureZ, featureZ[0].static_size * featureCount);
     unsigned int count = subtableCount;
     for (unsigned int i = 0; i < count; i++)
     {
       if (!subtable->sanitize (c))
 	return_trace (false);
-      subtable = &StructAfter<ChainSubtable<HBUINT> > (*subtable);
+      subtable = &StructAfter<ChainSubtable<Types> > (*subtable);
     }
 
     return_trace (true);
@@ -272,7 +382,7 @@ struct Chain
   HBUINT		subtableCount;	/* The number of subtables in the chain. */
 
   Feature		featureZ[VAR];	/* Features. */
-  ChainSubtable<HBUINT>	subtableX[VAR];	/* Subtables. */
+  ChainSubtable<Types>	subtableX[VAR];	/* Subtables. */
   // subtableGlyphCoverageArray if major == 3
 
   public:
@@ -284,20 +394,22 @@ struct Chain
  * The 'mort'/'morx' Tables
  */
 
-template <typename HBUINT>
+template <typename Types>
 struct mortmorx
 {
   static const hb_tag_t mortTag	= HB_AAT_TAG_MORT;
   static const hb_tag_t morxTag	= HB_AAT_TAG_MORX;
 
+  typedef typename Types::HBUINT HBUINT;
+
   inline void apply (hb_apply_context_t *c) const
   {
-    const Chain<HBUINT> *chain = chains;
+    const Chain<Types> *chain = chains;
     unsigned int count = chainCount;
     for (unsigned int i = 0; i < count; i++)
     {
       chain->apply (c);
-      chain = &StructAfter<Chain<HBUINT> > (*chain);
+      chain = &StructAfter<Chain<Types> > (*chain);
     }
   }
 
@@ -305,17 +417,17 @@ struct mortmorx
   {
     TRACE_SANITIZE (this);
     if (!version.sanitize (c) ||
-	version.major >> (sizeof (HBUINT) == 4) != 1 ||
+	(version.major >> (sizeof (HBUINT) == 4 ? 1 : 0)) != 1 ||
 	!chainCount.sanitize (c))
       return_trace (false);
 
-    const Chain<HBUINT> *chain = chains;
+    const Chain<Types> *chain = chains;
     unsigned int count = chainCount;
     for (unsigned int i = 0; i < count; i++)
     {
       if (!chain->sanitize (c, version.major))
 	return_trace (false);
-      chain = &StructAfter<Chain<HBUINT> > (*chain);
+      chain = &StructAfter<Chain<Types> > (*chain);
     }
 
     return_trace (true);
@@ -326,18 +438,44 @@ struct mortmorx
 				 * 1 for mort, 2 or 3 for morx. */
   HBUINT32	chainCount;	/* Number of metamorphosis chains contained in this
 				 * table. */
-  Chain<HBUINT>	chains[VAR];	/* Chains. */
+  Chain<Types>	chains[VAR];	/* Chains. */
 
   public:
   DEFINE_SIZE_MIN (8);
 };
 
-struct mort : mortmorx<HBUINT16>
+struct MorxTypes
+{
+  typedef HBUINT32 HBUINT;
+  typedef HBUINT16 HBUSHORT;
+  struct ClassType : Lookup<HBUINT16>
+  {
+    inline unsigned int get_class (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
+    {
+      const HBUINT16 *v = get_value (glyph_id, num_glyphs);
+      return v ? *v : 1;
+    }
+  };
+};
+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>
 {
   static const hb_tag_t tableTag	= HB_AAT_TAG_MORT;
 };
 
-struct morx : mortmorx<HBUINT32>
+struct morx : mortmorx<MorxTypes>
 {
   static const hb_tag_t tableTag	= HB_AAT_TAG_MORX;
 };
diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh
index 29bf7ba2..6d8bc6cb 100644
--- a/src/hb-open-type-private.hh
+++ b/src/hb-open-type-private.hh
@@ -527,8 +527,6 @@ struct Supplier
 };
 
 
-
-
 /*
  *
  * The OpenType Font File: Data Types
diff --git a/src/hb-private.hh b/src/hb-private.hh
index 9cad5685..62c9fb27 100644
--- a/src/hb-private.hh
+++ b/src/hb-private.hh
@@ -298,9 +298,10 @@ static_assert ((sizeof (hb_var_int_t) == 4), "");
 
 /* Misc */
 
-/* Void! */
-struct _hb_void_t {};
-typedef const _hb_void_t *hb_void_t;
+/*
+ * Void!
+ */
+typedef const struct _hb_void_t *hb_void_t;
 #define HB_VOID ((const _hb_void_t *) nullptr)
 
 /* Return the number of 1 bits in mask. */
commit 5dbbd0fdb9a343554112a846b392803f11c13197
Author: Ebrahim Byagowi <ebrahim at gnu.org>
Date:   Thu Jan 11 12:33:22 2018 +0330

    Move the #define of _GNU_SOURCE to the top of hb-private.hh (#697)
    
    This fixes the build on Cygwin.

diff --git a/src/hb-private.hh b/src/hb-private.hh
index 9a1f2c51..9cad5685 100644
--- a/src/hb-private.hh
+++ b/src/hb-private.hh
@@ -29,6 +29,8 @@
 #ifndef HB_PRIVATE_HH
 #define HB_PRIVATE_HH
 
+#define _GNU_SOURCE 1
+
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
@@ -87,8 +89,6 @@ extern "C" void  hb_free_impl(void *ptr);
 
 #endif // __cplusplus < 201103L
 
-#define _GNU_SOURCE 1
-
 #if (defined(__GNUC__) || defined(__clang__)) && defined(__OPTIMIZE__)
 #define likely(expr) (__builtin_expect (!!(expr), 1))
 #define unlikely(expr) (__builtin_expect (!!(expr), 0))
commit 90e3c9e69e93e05d9fb534fd43b5c99cf58a7cb4
Author: Ebrahim Byagowi <ebrahim at gnu.org>
Date:   Thu Jan 11 12:31:05 2018 +0330

    [cmake] Fix hb-blob test (#699)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index e45c5bc0..4d52668b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -107,10 +107,10 @@ check_include_file(unistd.h HAVE_UNIST_H)
 if (${HAVE_UNIST_H})
   add_definitions(-DHAVE_UNIST_H)
 endif ()
-check_include_file(sys/mman.h HAVE_SYS_MMAN_H)
-if (${HAVE_SYS_MMAN_H})
-  add_definitions(-DHAVE_SYS_MMAN_H)
-endif ()
+#check_include_file(sys/mman.h HAVE_SYS_MMAN_H)
+#if (${HAVE_SYS_MMAN_H})
+#  add_definitions(-DHAVE_SYS_MMAN_H)
+#endif ()
 check_include_file(xlocale.h HAVE_XLOCALE_H)
 if (${HAVE_XLOCALE_H})
   add_definitions(-DHAVE_XLOCALE_H)
commit 1461965c2220cd957c26b3fe5835200e426bc715
Author: Ebrahim Byagowi <ebrahim at gnu.org>
Date:   Thu Jan 11 08:48:22 2018 +0330

    [test] Better tests output by converting stderr to stdout (#696)
    
    https://gitlab.kitware.com/cmake/cmake/issues/17630

diff --git a/test/shaping/run-tests.py b/test/shaping/run-tests.py
index 36ec0657..c65e7142 100755
--- a/test/shaping/run-tests.py
+++ b/test/shaping/run-tests.py
@@ -8,8 +8,8 @@ def cmd(command):
 	p = subprocess.Popen (
 		command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 	p.wait ()
-	print (p.stderr.read (), file=sys.stderr, end='')
-	return p.stdout.read ().decode ("utf-8").strip(), p.returncode
+	print (p.stderr.read (), end="") # file=sys.stderr
+	return p.stdout.read ().decode ("utf-8").strip (), p.returncode
 
 
 args = sys.argv[1:]
@@ -61,7 +61,7 @@ for filename in args:
 			unicodes] + (options.split (' ') if options else []))
 
 		if returncode:
-			print ("hb-shape --font-funcs=ft failed.")
+			print ("hb-shape --font-funcs=ft failed.") # file=sys.stderr
 			fails = fails + 1
 			#continue
 
@@ -70,13 +70,13 @@ for filename in args:
 			unicodes] + (options.split (' ') if options else []))
 
 		if returncode:
-			print ("ERROR: hb-shape --font-funcs=ot failed.")
+			print ("ERROR: hb-shape --font-funcs=ot failed.") # file=sys.stderr
 			fails = fails + 1
 			#continue
 
 		if glyphs1 != glyphs2:
-			print ("FT funcs: " + glyphs1)
-			print ("OT funcs: " + glyphs2)
+			print ("FT funcs: " + glyphs1) # file=sys.stderr
+			print ("OT funcs: " + glyphs2) # file=sys.stderr
 			fails = fails + 1
 
 		if reference:
@@ -84,13 +84,13 @@ for filename in args:
 			continue
 
 		if glyphs1.strip() != glyphs_expected.strip():
-			print ("Actual:   " + glyphs1, file=sys.stderr)
-			print ("Expected: " + glyphs_expected, file=sys.stderr)
+			print ("Actual:   " + glyphs1) # file=sys.stderr
+			print ("Expected: " + glyphs_expected) # file=sys.stderr
 			fails = fails + 1
 
 if fails != 0:
 	if not reference:
-		print (str (fails) + " tests failed.")
+		print (str (fails) + " tests failed.") # file=sys.stderr
 	sys.exit (1)
 
 else:
commit ebb9b7d6335536804b50002fb83dd30da42a8ad5
Author: Ebrahim Byagowi <ebrahim at gnu.org>
Date:   Thu Jan 11 08:15:06 2018 +0330

    [test] Print shaping output on CI fails (#695)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index 43ddc4ac..874c587d 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -46,7 +46,7 @@ jobs:
       - run: apt update && apt install -y pkg-config ragel gtk-doc-tools libfreetype6-dev libglib2.0-dev libcairo2-dev libicu-dev libgraphite2-dev
       - run: cmake -DHB_HAVE_FREETYPE=ON -DHB_HAVE_GRAPHITE2=ON -DHB_BUILTIN_UCDN=ON -DHB_HAVE_GLIB=ON -DHB_HAVE_ICU=ON -DHB_BUILD_UTILS=ON -Bbuild -H. -GNinja
       - run: ninja -Cbuild
-      - run: ninja -Cbuild test
+      - run: CTEST_OUTPUT_ON_FAILURE=1 ninja -Cbuild test
       - run: ninja -Cbuild install
 
   cmake-oracledeveloperstudio:
@@ -58,7 +58,7 @@ jobs:
       - run: wget http://$ODSUSER:$ODSPASS@behdad.org/harfbuzz-private/OracleDeveloperStudio12.6-linux-x86-bin.tar.bz2 && tar xf OracleDeveloperStudio12.6-linux-x86-bin.tar.bz2 --owner root --group root --no-same-owner
       - run: CC=/root/project/OracleDeveloperStudio12.6-linux-x86-bin/developerstudio12.6/bin/suncc CXX=/root/project/OracleDeveloperStudio12.6-linux-x86-bin/developerstudio12.6/bin/sunCC cmake -DHB_HAVE_GRAPHITE2=ON -DHB_BUILTIN_UCDN=ON -DHB_HAVE_GLIB=ON -DHB_HAVE_ICU=ON -DHB_HAVE_FREETYPE=ON -Bbuild -H.
       - run: make -Cbuild
-      - run: make -Cbuild test
+      - run: CTEST_OUTPUT_ON_FAILURE=1 make -Cbuild test
       - run: make -Cbuild install
 
   crosscompile-notest-djgpp:
diff --git a/test/shaping/run-tests.py b/test/shaping/run-tests.py
index b3f5ffcd..36ec0657 100755
--- a/test/shaping/run-tests.py
+++ b/test/shaping/run-tests.py
@@ -61,7 +61,7 @@ for filename in args:
 			unicodes] + (options.split (' ') if options else []))
 
 		if returncode:
-			print ("hb-shape --font-funcs=ft failed.", file=sys.stderr)
+			print ("hb-shape --font-funcs=ft failed.")
 			fails = fails + 1
 			#continue
 
@@ -70,13 +70,13 @@ for filename in args:
 			unicodes] + (options.split (' ') if options else []))
 
 		if returncode:
-			print ("ERROR: hb-shape --font-funcs=ot failed.", file=sys.stderr)
+			print ("ERROR: hb-shape --font-funcs=ot failed.")
 			fails = fails + 1
 			#continue
 
 		if glyphs1 != glyphs2:
-			print ("FT funcs: " + glyphs1, file=sys.stderr)
-			print ("OT funcs: " + glyphs2, file=sys.stderr)
+			print ("FT funcs: " + glyphs1)
+			print ("OT funcs: " + glyphs2)
 			fails = fails + 1
 
 		if reference:
commit e24bea8e91ba9f447f1f7f252bdefacef1f83593
Author: Ebrahim Byagowi <ebrahim at gnu.org>
Date:   Wed Jan 10 23:51:56 2018 +0330

    [cmake] Another try on making sure feature testing is working (#691)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index 8c02624e..43ddc4ac 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -2,26 +2,23 @@ version: 2
 
 jobs:
 
-  oracledeveloperstudio:
+  distcheck:
     docker:
-      - image: fedora
+      - image: dockcross/base
     steps:
       - checkout
-      - run: dnf install -y gcc ragel cmake make which glib2-devel freetype-devel cairo-devel libicu-devel graphite2-devel wget tar bzip2 python || true
-      - run: wget http://$ODSUSER:$ODSPASS@behdad.org/harfbuzz-private/OracleDeveloperStudio12.6-linux-x86-bin.tar.bz2 && tar xf OracleDeveloperStudio12.6-linux-x86-bin.tar.bz2 --owner root --group root --no-same-owner
-      - run: CC=/root/project/OracleDeveloperStudio12.6-linux-x86-bin/developerstudio12.6/bin/suncc CXX=/root/project/OracleDeveloperStudio12.6-linux-x86-bin/developerstudio12.6/bin/sunCC cmake -DHB_HAVE_GRAPHITE2=ON -DHB_BUILTIN_UCDN=ON -DHB_HAVE_GLIB=ON -DHB_HAVE_ICU=ON -DHB_HAVE_FREETYPE=ON -Bbuild -H.
-      - run: make -Cbuild
-      - run: make -Cbuild test
-      - run: make -Cbuild install
+      - run: apt update && apt install -y pkg-config ragel gtk-doc-tools libfreetype6-dev libglib2.0-dev libcairo2-dev libicu-dev libgraphite2-dev
+      - run: ./autogen.sh && make distcheck
+      - run: make distdir && cd harfbuzz-* && cmake -DDHB_CHECK=ON -Bbuild -H. -GNinja && ninja -Cbuild && CTEST_OUTPUT_ON_FAILURE=1 ninja -Cbuild test && ninja -Cbuild install
 
-  fedora-out-of-tree:
+  alpine:
     docker:
-      - image: fedora
+      - image: alpine
     steps:
       - checkout
-      - run: dnf install -y pkg-config ragel gcc gcc-c++ automake autoconf libtool make which glib2-devel freetype-devel cairo-devel libicu-devel gobject-introspection-devel graphite2-devel redhat-rpm-config || true
-      - run: NOCONFIGURE=1 ./autogen.sh --with-freetype --with-glib --with-gobject --with-cairo --with-icu --with-graphite2
-      - run: mkdir build && cd build && ../configure && make && make check
+      - run: apk update && apk add ragel make pkgconfig libtool autoconf automake gettext gcc g++ glib-dev freetype-dev cairo-dev
+      - run: ./autogen.sh
+      - run: make && make check
 
   archlinux:
     docker:
@@ -32,16 +29,16 @@ jobs:
       - run: ./autogen.sh --with-freetype --with-glib --with-gobject --with-cairo --with-icu --with-graphite2
       - run: make && make check
 
-  freebsd9:
+  fedora-outoftreebuild:
     docker:
-      - image: donbowman/freebsd-cross-build
+      - image: fedora
     steps:
       - checkout
-      - run: apt update && apt install -y pkg-config ragel
-      - run: ./autogen.sh --prefix=/freebsd --host=x86_64-pc-freebsd9
-      - run: make
+      - run: dnf install -y pkg-config ragel gcc gcc-c++ automake autoconf libtool make which glib2-devel freetype-devel cairo-devel libicu-devel gobject-introspection-devel graphite2-devel redhat-rpm-config || true
+      - run: NOCONFIGURE=1 ./autogen.sh --with-freetype --with-glib --with-gobject --with-cairo --with-icu --with-graphite2
+      - run: mkdir build && cd build && ../configure && make && make check
 
-  base:
+  cmake-gcc:
     docker:
       - image: dockcross/base
     steps:
@@ -52,16 +49,37 @@ jobs:
       - run: ninja -Cbuild test
       - run: ninja -Cbuild install
 
-  distcheck:
+  cmake-oracledeveloperstudio:
     docker:
-      - image: dockcross/base
+      - image: fedora
     steps:
       - checkout
-      - run: apt update && apt install -y pkg-config ragel gtk-doc-tools libfreetype6-dev libglib2.0-dev libcairo2-dev libicu-dev libgraphite2-dev
-      - run: ./autogen.sh && make distcheck
-      - run: make distdir && cd harfbuzz-* && cmake -DDHB_CHECK=ON -Bbuild -H. -GNinja && ninja -Cbuild && CTEST_OUTPUT_ON_FAILURE=1 ninja -Cbuild test && ninja -Cbuild install
+      - run: dnf install -y gcc ragel cmake make which glib2-devel freetype-devel cairo-devel libicu-devel graphite2-devel wget tar bzip2 python || true
+      - run: wget http://$ODSUSER:$ODSPASS@behdad.org/harfbuzz-private/OracleDeveloperStudio12.6-linux-x86-bin.tar.bz2 && tar xf OracleDeveloperStudio12.6-linux-x86-bin.tar.bz2 --owner root --group root --no-same-owner
+      - run: CC=/root/project/OracleDeveloperStudio12.6-linux-x86-bin/developerstudio12.6/bin/suncc CXX=/root/project/OracleDeveloperStudio12.6-linux-x86-bin/developerstudio12.6/bin/sunCC cmake -DHB_HAVE_GRAPHITE2=ON -DHB_BUILTIN_UCDN=ON -DHB_HAVE_GLIB=ON -DHB_HAVE_ICU=ON -DHB_HAVE_FREETYPE=ON -Bbuild -H.
+      - run: make -Cbuild
+      - run: make -Cbuild test
+      - run: make -Cbuild install
+
+  crosscompile-notest-djgpp:
+    docker:
+      - image: quay.io/ebraminio/djgpp
+    steps:
+      - checkout
+      - run: apt update && apt install -y ragel pkg-config libtool autoconf
+      - run: CFLAGS="-Wno-attributes" CXXFLAGS="-Wno-attributes" ./autogen.sh --prefix=/usr/local/djgpp --host=i586-pc-msdosdjgpp
+      - run: make
 
-  psvita:
+  crosscompile-notest-freebsd9:
+    docker:
+      - image: donbowman/freebsd-cross-build
+    steps:
+      - checkout
+      - run: apt update && apt install -y pkg-config ragel
+      - run: ./autogen.sh --prefix=/freebsd --host=x86_64-pc-freebsd9
+      - run: make
+
+  crosscompile-notest-psvita:
     docker:
       - image: dockcross/base
     steps:
@@ -71,7 +89,7 @@ jobs:
       - run: ./autogen.sh --prefix=/usr/local/vitasdk/arm-vita-eabi --host=arm-vita-eabi
       - run: make
 
-  android-arm:
+  crosscompile-cmake-notest-android-arm:
     docker:
       - image: dockcross/android-arm
     steps:
@@ -80,7 +98,7 @@ jobs:
       - run: cmake -Bbuild -H. -GNinja
       - run: ninja -Cbuild
 
-  browser-asmjs:
+  crosscompile-cmake-notest-browser-asmjs:
     docker:
       - image: dockcross/browser-asmjs
     steps:
@@ -89,7 +107,7 @@ jobs:
       - run: cmake -Bbuild -H. -GNinja
       - run: ninja -Cbuild
 
-  linux-arm64:
+  crosscompile-cmake-notest-linux-arm64:
     docker:
       - image: dockcross/linux-arm64
     steps:
@@ -98,7 +116,7 @@ jobs:
       - run: cmake -Bbuild -H. -GNinja
       - run: ninja -Cbuild
 
-  linux-mips:
+  crosscompile-cmake-notest-linux-mips:
     docker:
       - image: dockcross/linux-mips
     steps:
@@ -107,7 +125,7 @@ jobs:
       - run: cmake -Bbuild -H. -GNinja
       - run: ninja -Cbuild
 
-  windows-x64:
+  crosscompile-cmake-notest-windows-x64:
     docker:
       - image: dockcross/windows-x64
     steps:
@@ -116,39 +134,32 @@ jobs:
       - run: cmake -Bbuild -H. -GNinja
       - run: ninja -Cbuild
 
-  alpine:
-    docker:
-      - image: alpine
-    steps:
-      - checkout
-      - run: apk update && apk add ragel make pkgconfig libtool autoconf automake gettext gcc g++ glib-dev freetype-dev cairo-dev
-      - run: ./autogen.sh
-      - run: make && make check
-
-  dos:
-    docker:
-      - image: quay.io/ebraminio/djgpp
-    steps:
-      - checkout
-      - run: apt update && apt install -y ragel pkg-config libtool autoconf
-      - run: CFLAGS="-Wno-attributes" CXXFLAGS="-Wno-attributes" ./autogen.sh --prefix=/usr/local/djgpp --host=i586-pc-msdosdjgpp
-      - run: make
-
 workflows:
   version: 2
   build:
     jobs:
-      #- oracledeveloperstudio
-      #- fedora-out-of-tree
-      - archlinux
-      - freebsd9
-      - base
+      # both autotools and cmake
       - distcheck
-      - psvita
-      - android-arm
-      - browser-asmjs
-      - linux-arm64
-      - linux-mips
-      - windows-x64
+
+      # autotools based builds
       - alpine
-      - dos
+      - archlinux
+      - fedora-outoftreebuild
+
+      # cmake based builds
+      - cmake-gcc
+      - cmake-oracledeveloperstudio
+
+      # crosscompiles
+      # they can't be test thus are without tests
+      ## autotools
+      - crosscompile-notest-djgpp
+      - crosscompile-notest-freebsd9
+      - crosscompile-notest-psvita
+
+      ## cmake
+      - crosscompile-cmake-notest-android-arm
+      - crosscompile-cmake-notest-browser-asmjs
+      - crosscompile-cmake-notest-linux-arm64
+      - crosscompile-cmake-notest-linux-mips
+      - crosscompile-cmake-notest-windows-x64
diff --git a/CMakeLists.txt b/CMakeLists.txt
index a2599b54..e45c5bc0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -94,24 +94,23 @@ include (CheckFunctionExists)
 include (CheckIncludeFile)
 macro (check_funcs) # Similar to AC_CHECK_FUNCS of autotools
   foreach (func_name ${ARGN})
-    set (RESULT OFF)
-    check_function_exists(${func_name} RESULT)
-    if (${RESULT})
-      string(TOUPPER ${func_name} definiton_to_add)
+    string(TOUPPER ${func_name} definiton_to_add)
+    check_function_exists(${func_name} HAVE_${definiton_to_add})
+    if (${HAVE_${definiton_to_add}})
       add_definitions(-DHAVE_${definiton_to_add})
     endif ()
   endforeach ()
 endmacro ()
-check_funcs(atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l)
+check_funcs(atexit mprotect sysconf mmap strtod_l) #TODO: getpagesize newlocale isatty
 
 check_include_file(unistd.h HAVE_UNIST_H)
 if (${HAVE_UNIST_H})
   add_definitions(-DHAVE_UNIST_H)
 endif ()
-#check_include_file(sys/mman.h HAVE_SYS_MMAN_H) enable this sometime
-#if (${HAVE_SYS_MMAN_H})
-#  add_definitions(-DHAVE_SYS_MMAN_H)
-#endif ()
+check_include_file(sys/mman.h HAVE_SYS_MMAN_H)
+if (${HAVE_SYS_MMAN_H})
+  add_definitions(-DHAVE_SYS_MMAN_H)
+endif ()
 check_include_file(xlocale.h HAVE_XLOCALE_H)
 if (${HAVE_XLOCALE_H})
   add_definitions(-DHAVE_XLOCALE_H)


More information about the HarfBuzz mailing list