From 195333ec4faf3e06abf5b94d2d5cf304d723e549 Mon Sep 17 00:00:00 2001 From: Akira Kakuto Date: Sat, 23 Jul 2022 21:54:27 +0000 Subject: harfbuzz 5.0.1 git-svn-id: svn://tug.org/texlive/trunk@63966 c570f23f-e606-0410-a88d-b1316a301751 --- Build/source/libs/README | 4 +- Build/source/libs/harfbuzz/ChangeLog | 7 +- Build/source/libs/harfbuzz/Makefile.am | 50 +- Build/source/libs/harfbuzz/Makefile.in | 50 +- .../0001-Fix-harfbuzz-4.4.1-for-older-g.patch | 52 - ...002-Fix-dispatch_recurse_func-for-older-g.patch | 62 - Build/source/libs/harfbuzz/TLpatches/ChangeLog | 7 + Build/source/libs/harfbuzz/TLpatches/TL-Changes | 4 +- Build/source/libs/harfbuzz/configure | 26 +- .../libs/harfbuzz/harfbuzz-src/CMakeLists.txt | 12 +- Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog | 3065 ++++++++++++++++++++ Build/source/libs/harfbuzz/harfbuzz-src/NEWS | 47 + .../source/libs/harfbuzz/harfbuzz-src/config.h.in | 7 +- .../source/libs/harfbuzz/harfbuzz-src/configure.ac | 10 +- .../source/libs/harfbuzz/harfbuzz-src/meson.build | 10 +- .../libs/harfbuzz/harfbuzz-src/src/Makefile.am | 14 +- .../harfbuzz/harfbuzz-src/src/Makefile.sources | 94 +- .../harfbuzz-src/src/OT/Layout/Common/Coverage.hh | 338 +++ .../src/OT/Layout/Common/CoverageFormat1.hh | 126 + .../src/OT/Layout/Common/CoverageFormat2.hh | 233 ++ .../src/OT/Layout/Common/RangeRecord.hh | 85 + .../harfbuzz/harfbuzz-src/src/OT/Layout/GPOS.hh | 165 -- .../src/OT/Layout/GPOS/CursivePosFormat1.hh | 8 +- .../harfbuzz-src/src/OT/Layout/GPOS/GPOS.hh | 171 ++ .../src/OT/Layout/GPOS/LigatureArray.hh | 56 + .../harfbuzz-src/src/OT/Layout/GPOS/MarkBasePos.hh | 10 +- .../src/OT/Layout/GPOS/MarkBasePosFormat1.hh | 14 +- .../harfbuzz-src/src/OT/Layout/GPOS/MarkLigPos.hh | 10 +- .../src/OT/Layout/GPOS/MarkLigPosFormat1.hh | 56 +- .../harfbuzz-src/src/OT/Layout/GPOS/MarkMarkPos.hh | 10 +- .../src/OT/Layout/GPOS/MarkMarkPosFormat1.hh | 15 +- .../harfbuzz-src/src/OT/Layout/GPOS/PairPos.hh | 14 +- .../src/OT/Layout/GPOS/PairPosFormat1.hh | 253 +- .../src/OT/Layout/GPOS/PairPosFormat2.hh | 11 +- .../harfbuzz-src/src/OT/Layout/GPOS/PairSet.hh | 173 ++ .../src/OT/Layout/GPOS/PairValueRecord.hh | 97 + .../harfbuzz-src/src/OT/Layout/GPOS/SinglePos.hh | 3 - .../src/OT/Layout/GPOS/SinglePosFormat1.hh | 6 +- .../src/OT/Layout/GSUB/AlternateSet.hh | 5 +- .../src/OT/Layout/GSUB/AlternateSubst.hh | 17 +- .../src/OT/Layout/GSUB/AlternateSubstFormat1.hh | 16 +- .../src/OT/Layout/GSUB/ChainContextSubst.hh | 2 +- .../harfbuzz-src/src/OT/Layout/GSUB/Common.hh | 2 +- .../src/OT/Layout/GSUB/ContextSubst.hh | 2 +- .../src/OT/Layout/GSUB/ExtensionSubst.hh | 2 +- .../harfbuzz-src/src/OT/Layout/GSUB/GSUB.hh | 17 +- .../harfbuzz-src/src/OT/Layout/GSUB/Ligature.hh | 12 +- .../harfbuzz-src/src/OT/Layout/GSUB/LigatureSet.hh | 15 +- .../src/OT/Layout/GSUB/LigatureSubst.hh | 18 +- .../src/OT/Layout/GSUB/LigatureSubstFormat1.hh | 23 +- .../src/OT/Layout/GSUB/MultipleSubst.hh | 17 +- .../src/OT/Layout/GSUB/MultipleSubstFormat1.hh | 15 +- .../src/OT/Layout/GSUB/ReverseChainSingleSubst.hh | 2 +- .../Layout/GSUB/ReverseChainSingleSubstFormat1.hh | 24 +- .../harfbuzz-src/src/OT/Layout/GSUB/Sequence.hh | 5 +- .../harfbuzz-src/src/OT/Layout/GSUB/SingleSubst.hh | 40 +- .../src/OT/Layout/GSUB/SingleSubstFormat1.hh | 54 +- .../src/OT/Layout/GSUB/SingleSubstFormat2.hh | 13 +- .../harfbuzz-src/src/OT/Layout/GSUB/SubstLookup.hh | 13 +- .../src/OT/Layout/GSUB/SubstLookupSubTable.hh | 2 +- .../harfbuzz/harfbuzz-src/src/OT/Layout/types.hh | 66 + .../harfbuzz-src/src/OT/glyf/CompositeGlyph.hh | 36 +- .../harfbuzz/harfbuzz-src/src/OT/glyf/Glyph.hh | 20 +- .../harfbuzz-src/src/OT/glyf/GlyphHeader.hh | 8 +- .../harfbuzz-src/src/OT/glyf/SubsetGlyph.hh | 4 +- .../libs/harfbuzz/harfbuzz-src/src/OT/glyf/glyf.hh | 59 +- .../libs/harfbuzz/harfbuzz-src/src/gen-def.py | 4 +- .../harfbuzz/harfbuzz-src/src/gen-harfbuzzcc.py | 4 +- .../harfbuzz/harfbuzz-src/src/gen-use-table.py | 69 +- .../libs/harfbuzz/harfbuzz-src/src/graph/graph.hh | 80 +- .../harfbuzz/harfbuzz-src/src/harfbuzz-subset.cc | 56 + .../libs/harfbuzz/harfbuzz-src/src/harfbuzz.cc | 18 +- .../harfbuzz-src/src/hb-aat-layout-bsln-table.hh | 4 +- .../harfbuzz-src/src/hb-aat-layout-common.hh | 20 +- .../harfbuzz-src/src/hb-aat-layout-feat-table.hh | 2 +- .../harfbuzz-src/src/hb-aat-layout-just-table.hh | 12 +- .../harfbuzz-src/src/hb-aat-layout-kerx-table.hh | 2 +- .../harfbuzz-src/src/hb-aat-layout-morx-table.hh | 9 + .../harfbuzz-src/src/hb-aat-layout-opbd-table.hh | 2 +- .../harfbuzz/harfbuzz-src/src/hb-aat-layout.cc | 6 +- .../libs/harfbuzz/harfbuzz-src/src/hb-aat-map.hh | 6 +- .../libs/harfbuzz/harfbuzz-src/src/hb-algs.hh | 21 +- .../libs/harfbuzz/harfbuzz-src/src/hb-array.hh | 14 +- .../libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh | 13 + .../libs/harfbuzz/harfbuzz-src/src/hb-bit-page.hh | 2 +- .../libs/harfbuzz/harfbuzz-src/src/hb-bit-set.hh | 17 +- .../libs/harfbuzz/harfbuzz-src/src/hb-blob.cc | 12 +- .../libs/harfbuzz/harfbuzz-src/src/hb-blob.hh | 12 +- .../harfbuzz-src/src/hb-buffer-deserialize-json.hh | 431 +-- .../harfbuzz-src/src/hb-buffer-deserialize-json.rl | 33 +- .../harfbuzz-src/src/hb-buffer-deserialize-text.hh | 572 ++-- .../harfbuzz-src/src/hb-buffer-deserialize-text.rl | 13 +- .../harfbuzz-src/src/hb-buffer-serialize.cc | 24 +- .../libs/harfbuzz/harfbuzz-src/src/hb-buffer.cc | 38 +- .../libs/harfbuzz/harfbuzz-src/src/hb-buffer.h | 6 +- .../harfbuzz-src/src/hb-cff-interp-cs-common.hh | 7 + .../libs/harfbuzz/harfbuzz-src/src/hb-common.cc | 58 +- .../libs/harfbuzz/harfbuzz-src/src/hb-common.h | 3 + .../libs/harfbuzz/harfbuzz-src/src/hb-config.hh | 5 + .../libs/harfbuzz/harfbuzz-src/src/hb-cplusplus.hh | 13 +- .../libs/harfbuzz/harfbuzz-src/src/hb-deprecated.h | 2 +- .../harfbuzz/harfbuzz-src/src/hb-directwrite.cc | 36 +- .../libs/harfbuzz/harfbuzz-src/src/hb-draw.cc | 8 +- .../libs/harfbuzz/harfbuzz-src/src/hb-face.cc | 4 +- .../libs/harfbuzz/harfbuzz-src/src/hb-font.cc | 45 +- .../libs/harfbuzz/harfbuzz-src/src/hb-font.h | 14 +- .../source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc | 147 +- .../libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc | 8 +- .../libs/harfbuzz/harfbuzz-src/src/hb-iter.hh | 2 + .../libs/harfbuzz/harfbuzz-src/src/hb-map.cc | 14 +- .../libs/harfbuzz/harfbuzz-src/src/hb-map.hh | 72 +- .../libs/harfbuzz/harfbuzz-src/src/hb-meta.hh | 2 +- .../libs/harfbuzz/harfbuzz-src/src/hb-null.hh | 31 +- .../harfbuzz/harfbuzz-src/src/hb-number-parser.hh | 8 +- .../libs/harfbuzz/harfbuzz-src/src/hb-object.hh | 8 +- .../libs/harfbuzz/harfbuzz-src/src/hb-open-type.hh | 47 +- .../harfbuzz-src/src/hb-ot-color-colr-table.hh | 5 +- .../libs/harfbuzz/harfbuzz-src/src/hb-ot-color.cc | 8 +- .../libs/harfbuzz/harfbuzz-src/src/hb-ot-color.h | 4 + .../libs/harfbuzz/harfbuzz-src/src/hb-ot-font.cc | 40 +- .../harfbuzz/harfbuzz-src/src/hb-ot-hmtx-table.hh | 80 +- .../harfbuzz-src/src/hb-ot-layout-base-table.hh | 2 +- .../harfbuzz-src/src/hb-ot-layout-common.hh | 1746 +++++------ .../harfbuzz-src/src/hb-ot-layout-gdef-table.hh | 376 ++- .../harfbuzz-src/src/hb-ot-layout-gpos-table.hh | 6 +- .../harfbuzz-src/src/hb-ot-layout-gsub-table.hh | 9 +- .../harfbuzz-src/src/hb-ot-layout-gsubgpos.hh | 844 +++--- .../libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.cc | 42 +- .../libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.hh | 4 +- .../libs/harfbuzz/harfbuzz-src/src/hb-ot-map.cc | 19 +- .../libs/harfbuzz/harfbuzz-src/src/hb-ot-map.hh | 20 +- .../libs/harfbuzz/harfbuzz-src/src/hb-ot-math.cc | 4 +- .../harfbuzz/harfbuzz-src/src/hb-ot-metrics.cc | 12 +- .../harfbuzz/harfbuzz-src/src/hb-ot-name-table.hh | 14 +- .../harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh | 8 +- .../libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc | 10 +- .../libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.hh | 4 +- .../harfbuzz-src/src/hb-ot-shaper-arabic.cc | 31 +- .../harfbuzz-src/src/hb-ot-shaper-default.cc | 8 +- .../harfbuzz-src/src/hb-ot-shaper-hangul.cc | 4 +- .../harfbuzz-src/src/hb-ot-shaper-hebrew.cc | 32 +- .../harfbuzz-src/src/hb-ot-shaper-indic-machine.hh | 14 +- .../harfbuzz-src/src/hb-ot-shaper-indic.cc | 16 +- .../harfbuzz-src/src/hb-ot-shaper-khmer-machine.hh | 14 +- .../harfbuzz-src/src/hb-ot-shaper-khmer.cc | 4 +- .../src/hb-ot-shaper-myanmar-machine.hh | 14 +- .../harfbuzz-src/src/hb-ot-shaper-myanmar.cc | 8 +- .../harfbuzz/harfbuzz-src/src/hb-ot-shaper-thai.cc | 4 +- .../harfbuzz-src/src/hb-ot-shaper-use-machine.hh | 14 +- .../harfbuzz-src/src/hb-ot-shaper-use-table.hh | 1690 ++--------- .../harfbuzz/harfbuzz-src/src/hb-ot-shaper-use.cc | 6 +- .../libs/harfbuzz/harfbuzz-src/src/hb-ot-shaper.hh | 16 +- .../harfbuzz/harfbuzz-src/src/hb-ot-stat-table.hh | 262 +- .../libs/harfbuzz/harfbuzz-src/src/hb-ot-tag.cc | 2 + .../harfbuzz-src/src/hb-ot-var-avar-table.hh | 82 +- .../harfbuzz/harfbuzz-src/src/hb-ot-var-common.hh | 63 +- .../harfbuzz-src/src/hb-ot-var-fvar-table.hh | 61 +- .../harfbuzz-src/src/hb-ot-var-hvar-table.hh | 31 +- .../libs/harfbuzz/harfbuzz-src/src/hb-ot-var.cc | 4 +- .../libs/harfbuzz/harfbuzz-src/src/hb-repacker.hh | 7 +- .../libs/harfbuzz/harfbuzz-src/src/hb-set.cc | 24 +- .../libs/harfbuzz/harfbuzz-src/src/hb-set.hh | 6 +- .../harfbuzz/harfbuzz-src/src/hb-shape-plan.cc | 10 +- .../harfbuzz/harfbuzz-src/src/hb-shape-plan.hh | 3 +- .../libs/harfbuzz/harfbuzz-src/src/hb-shape.cc | 12 +- .../libs/harfbuzz/harfbuzz-src/src/hb-shaper.cc | 2 +- .../libs/harfbuzz/harfbuzz-src/src/hb-static.cc | 9 +- .../harfbuzz/harfbuzz-src/src/hb-subset-input.cc | 66 +- .../harfbuzz/harfbuzz-src/src/hb-subset-input.hh | 5 +- .../harfbuzz/harfbuzz-src/src/hb-subset-plan.cc | 320 +- .../harfbuzz/harfbuzz-src/src/hb-subset-plan.hh | 29 + .../harfbuzz-src/src/hb-subset-repacker.cc | 2 +- .../harfbuzz/harfbuzz-src/src/hb-subset-repacker.h | 8 +- .../libs/harfbuzz/harfbuzz-src/src/hb-subset.cc | 41 +- .../libs/harfbuzz/harfbuzz-src/src/hb-subset.h | 18 + .../libs/harfbuzz/harfbuzz-src/src/hb-unicode.cc | 8 +- .../libs/harfbuzz/harfbuzz-src/src/hb-unicode.h | 4 +- .../libs/harfbuzz/harfbuzz-src/src/hb-vector.hh | 1 - .../source/libs/harfbuzz/harfbuzz-src/src/main.cc | 8 +- .../libs/harfbuzz/harfbuzz-src/src/meson.build | 103 +- .../harfbuzz-src/src/test-buffer-serialize.cc | 6 +- .../libs/harfbuzz/harfbuzz-src/src/test-iter.cc | 3 +- .../libs/harfbuzz/harfbuzz-src/src/test-map.cc | 17 + .../harfbuzz/harfbuzz-src/src/test-ot-glyphname.cc | 2 +- .../harfbuzz/harfbuzz-src/src/test-repacker.cc | 84 + .../harfbuzz/harfbuzz-src/src/test-serialize.cc | 3 +- Build/source/libs/harfbuzz/version.ac | 2 +- 187 files changed, 9270 insertions(+), 5090 deletions(-) delete mode 100644 Build/source/libs/harfbuzz/TLpatches/0001-Fix-harfbuzz-4.4.1-for-older-g.patch delete mode 100644 Build/source/libs/harfbuzz/TLpatches/0002-Fix-dispatch_recurse_func-for-older-g.patch create mode 100644 Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/Common/Coverage.hh create mode 100644 Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/Common/CoverageFormat1.hh create mode 100644 Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/Common/CoverageFormat2.hh create mode 100644 Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/Common/RangeRecord.hh delete mode 100644 Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS.hh create mode 100644 Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/GPOS.hh create mode 100644 Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/LigatureArray.hh create mode 100644 Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/PairSet.hh create mode 100644 Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/PairValueRecord.hh create mode 100644 Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/types.hh create mode 100644 Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz-subset.cc (limited to 'Build/source') diff --git a/Build/source/libs/README b/Build/source/libs/README index e1f7132bebb..d2e477c0204 100644 --- a/Build/source/libs/README +++ b/Build/source/libs/README @@ -25,8 +25,8 @@ graphite2 1.3.14 - checked 10apr20 http://sourceforge.net/projects/silgraphite/files/graphite2/ (requires C++11) -harfbuzz 4.4.1 - checked 30jun22 - https://github.com/harfbuzz/harfbuzz/releases/download/4.4.1/ +harfbuzz 5.0.1 - checked 24jul22 + https://github.com/harfbuzz/harfbuzz/releases/download/5.0.1/ icu 70.1 - checked 16jan22 https://github.com/unicode-org/icu/releases/ diff --git a/Build/source/libs/harfbuzz/ChangeLog b/Build/source/libs/harfbuzz/ChangeLog index 6e5f3ce6239..a312e752ab1 100644 --- a/Build/source/libs/harfbuzz/ChangeLog +++ b/Build/source/libs/harfbuzz/ChangeLog @@ -1,6 +1,11 @@ +2022-07-24 Akira Kakuto + + Import harfbuzz-5.0.1. + * version.ac, Makefile.am: Adjusted. + 2022-07/18 Andreas Scherer - Add a patch 0001-Fix-harfbuzz-4.4.1-for-older-g for older gcc. + Add a patch 0001-Fix-harfbuzz-4.4.1-for-older-g.patch for older gcc. 2022-06-30 Akira Kakuto diff --git a/Build/source/libs/harfbuzz/Makefile.am b/Build/source/libs/harfbuzz/Makefile.am index 5ed755b7c9f..2ac75f325d1 100644 --- a/Build/source/libs/harfbuzz/Makefile.am +++ b/Build/source/libs/harfbuzz/Makefile.am @@ -239,6 +239,10 @@ libharfbuzz_a_SOURCES += \ @HARFBUZZ_TREE@/src/OT/glyf/SimpleGlyph.hh \ @HARFBUZZ_TREE@/src/OT/glyf/CompositeGlyph.hh \ @HARFBUZZ_TREE@/src/OT/glyf/SubsetGlyph.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/Common/Coverage.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/Common/CoverageFormat1.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/Common/CoverageFormat2.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/Common/RangeRecord.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GSUB/Common.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GSUB/Sequence.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GSUB/SingleSubstFormat1.hh \ @@ -261,35 +265,39 @@ libharfbuzz_a_SOURCES += \ @HARFBUZZ_TREE@/src/OT/Layout/GSUB/SubstLookupSubTable.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GSUB/SubstLookup.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GSUB/GSUB.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/CursivePosFormat1.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkLigPos.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PairPos.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/Anchor.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GPOS/AnchorFormat1.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkLigPosFormat1.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PairPosFormat1.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/ExtensionPos.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/AnchorFormat2.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/AnchorFormat3.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/Anchor.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/AnchorMatrix.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GPOS/ChainContextPos.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GPOS/Common.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/ValueFormat.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/AnchorMatrix.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/ContextPos.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/CursivePosFormat1.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/CursivePos.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/ExtensionPos.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/GPOS.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/LigatureArray.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkArray.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkBasePosFormat1.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/AnchorFormat3.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PosLookup.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkMarkPos.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PairPosFormat2.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkBasePos.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkLigPosFormat1.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkLigPos.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/SinglePos.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkArray.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/CursivePos.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PosLookupSubTable.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkMarkPos.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkRecord.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/AnchorFormat2.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/ContextPos.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/SinglePosFormat2.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PairPosFormat1.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PairPosFormat2.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PairPos.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PairSet.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PairValueRecord.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PosLookup.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PosLookupSubTable.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GPOS/SinglePosFormat1.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/SinglePosFormat2.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/SinglePos.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/ValueFormat.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/types.hh \ @HARFBUZZ_TREE@/src/graph/graph.hh \ @HARFBUZZ_TREE@/src/graph/serialize.hh diff --git a/Build/source/libs/harfbuzz/Makefile.in b/Build/source/libs/harfbuzz/Makefile.in index b65437a5d0c..35a9836881e 100644 --- a/Build/source/libs/harfbuzz/Makefile.in +++ b/Build/source/libs/harfbuzz/Makefile.in @@ -908,6 +908,10 @@ libharfbuzz_a_SOURCES = @HARFBUZZ_TREE@/src/hb-algs.hh \ @HARFBUZZ_TREE@/src/OT/glyf/SimpleGlyph.hh \ @HARFBUZZ_TREE@/src/OT/glyf/CompositeGlyph.hh \ @HARFBUZZ_TREE@/src/OT/glyf/SubsetGlyph.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/Common/Coverage.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/Common/CoverageFormat1.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/Common/CoverageFormat2.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/Common/RangeRecord.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GSUB/Common.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GSUB/Sequence.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GSUB/SingleSubstFormat1.hh \ @@ -930,35 +934,39 @@ libharfbuzz_a_SOURCES = @HARFBUZZ_TREE@/src/hb-algs.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GSUB/SubstLookupSubTable.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GSUB/SubstLookup.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GSUB/GSUB.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/CursivePosFormat1.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkLigPos.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PairPos.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/Anchor.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GPOS/AnchorFormat1.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkLigPosFormat1.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PairPosFormat1.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/ExtensionPos.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/AnchorFormat2.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/AnchorFormat3.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/Anchor.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/AnchorMatrix.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GPOS/ChainContextPos.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GPOS/Common.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/ValueFormat.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/AnchorMatrix.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/ContextPos.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/CursivePosFormat1.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/CursivePos.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/ExtensionPos.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/GPOS.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/LigatureArray.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkArray.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkBasePosFormat1.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/AnchorFormat3.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PosLookup.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkMarkPos.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PairPosFormat2.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkBasePos.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkLigPosFormat1.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkLigPos.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/SinglePos.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkArray.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/CursivePos.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PosLookupSubTable.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkMarkPos.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GPOS/MarkRecord.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/AnchorFormat2.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/ContextPos.hh \ - @HARFBUZZ_TREE@/src/OT/Layout/GPOS/SinglePosFormat2.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PairPosFormat1.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PairPosFormat2.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PairPos.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PairSet.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PairValueRecord.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PosLookup.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/PosLookupSubTable.hh \ @HARFBUZZ_TREE@/src/OT/Layout/GPOS/SinglePosFormat1.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/SinglePosFormat2.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/SinglePos.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/GPOS/ValueFormat.hh \ + @HARFBUZZ_TREE@/src/OT/Layout/types.hh \ @HARFBUZZ_TREE@/src/graph/graph.hh \ @HARFBUZZ_TREE@/src/graph/serialize.hh \ @HARFBUZZ_TREE@/src/hb-graphite2.cc diff --git a/Build/source/libs/harfbuzz/TLpatches/0001-Fix-harfbuzz-4.4.1-for-older-g.patch b/Build/source/libs/harfbuzz/TLpatches/0001-Fix-harfbuzz-4.4.1-for-older-g.patch deleted file mode 100644 index ed778de2df6..00000000000 --- a/Build/source/libs/harfbuzz/TLpatches/0001-Fix-harfbuzz-4.4.1-for-older-g.patch +++ /dev/null @@ -1,52 +0,0 @@ -From d4005a1970a82222198d0a106ee54a71707d059b Mon Sep 17 00:00:00 2001 -From: Andreas Scherer -Date: Sun, 17 Jul 2022 19:46:50 +0200 -Subject: [PATCH 1/2] Fix harfbuzz 4.4.1 for older g++. - ---- - libs/harfbuzz/harfbuzz-src/src/hb-cplusplus.hh | 15 +++++++++------ - 1 file changed, 9 insertions(+), 6 deletions(-) - -diff --git a/libs/harfbuzz/harfbuzz-src/src/hb-cplusplus.hh b/libs/harfbuzz/harfbuzz-src/src/hb-cplusplus.hh -index 86d045208..c79d15506 100644 ---- a/libs/harfbuzz/harfbuzz-src/src/hb-cplusplus.hh -+++ b/libs/harfbuzz/harfbuzz-src/src/hb-cplusplus.hh -@@ -166,26 +166,29 @@ HB_DEFINE_VTABLE (unicode_funcs); - - } // namespace hb - -+namespace std { -+ - template --struct std::hash> -+struct hash> - { -- std::size_t operator()(const hb::shared_ptr& v) const noexcept -+ size_t operator()(const hb::shared_ptr& v) const noexcept - { -- std::size_t h = std::hash{}(v.get ()); -+ size_t h = hash{}(v.get ()); - return h; - } - }; - - template --struct std::hash> -+struct hash> - { -- std::size_t operator()(const hb::unique_ptr& v) const noexcept -+ size_t operator()(const hb::unique_ptr& v) const noexcept - { -- std::size_t h = std::hash{}(v.get ()); -+ size_t h = hash{}(v.get ()); - return h; - } - }; - -+} // namespace std - - #endif /* __cplusplus */ - --- -2.37.1 - diff --git a/Build/source/libs/harfbuzz/TLpatches/0002-Fix-dispatch_recurse_func-for-older-g.patch b/Build/source/libs/harfbuzz/TLpatches/0002-Fix-dispatch_recurse_func-for-older-g.patch deleted file mode 100644 index 96104282eb9..00000000000 --- a/Build/source/libs/harfbuzz/TLpatches/0002-Fix-dispatch_recurse_func-for-older-g.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 72135e7c1af4812dc5e856d94ff1ba3fda867365 Mon Sep 17 00:00:00 2001 -From: Andreas Scherer -Date: Mon, 18 Jul 2022 17:24:20 +0200 -Subject: [PATCH 2/2] Fix 'dispatch_recurse_func' for older g++. - ---- - libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh | 6 +++++- - libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh | 7 +++++-- - 2 files changed, 10 insertions(+), 3 deletions(-) - -diff --git a/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh b/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh -index 064d31cdf..59795cbba 100644 ---- a/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh -+++ b/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh -@@ -35,6 +35,9 @@ namespace OT { - - using Layout::GPOS_impl::PosLookup; - -+namespace Layout { -+namespace GPOS_impl { -+ - // TODO(garretrieger): Move into new layout directory. - /* Out-of-class implementation for methods recursing */ - #ifndef HB_NO_OT_LAYOUT -@@ -68,7 +71,8 @@ inline bool PosLookup::dispatch_recurse_func (hb_ot_apply - } - #endif - -+} /* namespace GPOS_impl */ -+} /* namespace Layout */ - } /* namespace OT */ - -- - #endif /* HB_OT_LAYOUT_GPOS_TABLE_HH */ -diff --git a/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh b/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh -index 462542025..9e7f40c07 100644 ---- a/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh -+++ b/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh -@@ -36,6 +36,9 @@ namespace OT { - using Layout::GSUB::SubstLookup; - using Layout::GSUB::ExtensionSubst; - -+namespace Layout { -+namespace GSUB { -+ - // TODO(garretrieger): Move into the new layout directory. - /* Out-of-class implementation for methods recursing */ - -@@ -82,8 +85,8 @@ inline bool SubstLookup::dispatch_recurse_func (hb_ot_app - } - #endif - -- -+} /* namespace GSUB */ -+} /* namespace Layout */ - } /* namespace OT */ - -- - #endif /* HB_OT_LAYOUT_GSUB_TABLE_HH */ --- -2.37.1 - diff --git a/Build/source/libs/harfbuzz/TLpatches/ChangeLog b/Build/source/libs/harfbuzz/TLpatches/ChangeLog index 0f4a2c04e81..8f3cb648bd1 100644 --- a/Build/source/libs/harfbuzz/TLpatches/ChangeLog +++ b/Build/source/libs/harfbuzz/TLpatches/ChangeLog @@ -1,3 +1,10 @@ +2022-07-24 Akira Kakuto + + Imported harfbuzz-5.0.1 source tree from: + https://github.com/harfbuzz/harfbuzz/releases/download/5.0.1/ + * 0001-Fix-harfbuzz-4.4.1-for-older-g.patch: Remove. + * 0002-Fix-dispatch_recurse_func-for-older-g.patch: Remove. + 2022-07-18 Andreas Scherer * 0001-Fix-harfbuzz-4.4.1-for-older-g.patch, diff --git a/Build/source/libs/harfbuzz/TLpatches/TL-Changes b/Build/source/libs/harfbuzz/TLpatches/TL-Changes index 2d284498e9c..c3fbe22f149 100644 --- a/Build/source/libs/harfbuzz/TLpatches/TL-Changes +++ b/Build/source/libs/harfbuzz/TLpatches/TL-Changes @@ -1,5 +1,5 @@ -Changes applied to the harfbuzz-4.4.1/ tree as obtained from: - https://github.com/harfbuzz/harfbuzz/releases/download/4.4.1/ +Changes applied to the harfbuzz-5.0.1/ tree as obtained from: + https://github.com/harfbuzz/harfbuzz/releases/download/5.0.1/ Removed: COPYING diff --git a/Build/source/libs/harfbuzz/configure b/Build/source/libs/harfbuzz/configure index a5b48895c60..ad5f1932ea7 100755 --- a/Build/source/libs/harfbuzz/configure +++ b/Build/source/libs/harfbuzz/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for harfbuzz (TeX Live) 4.4.1. +# Generated by GNU Autoconf 2.71 for harfbuzz (TeX Live) 5.0.1. # # Report bugs to . # @@ -611,8 +611,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='harfbuzz (TeX Live)' PACKAGE_TARNAME='harfbuzz--tex-live-' -PACKAGE_VERSION='4.4.1' -PACKAGE_STRING='harfbuzz (TeX Live) 4.4.1' +PACKAGE_VERSION='5.0.1' +PACKAGE_STRING='harfbuzz (TeX Live) 5.0.1' PACKAGE_BUGREPORT='tex-k@tug.org' PACKAGE_URL='' @@ -1346,7 +1346,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures harfbuzz (TeX Live) 4.4.1 to adapt to many kinds of systems. +\`configure' configures harfbuzz (TeX Live) 5.0.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1418,7 +1418,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of harfbuzz (TeX Live) 4.4.1:";; + short | recursive ) echo "Configuration of harfbuzz (TeX Live) 5.0.1:";; esac cat <<\_ACEOF @@ -1523,7 +1523,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -harfbuzz (TeX Live) configure 4.4.1 +harfbuzz (TeX Live) configure 5.0.1 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. @@ -2064,7 +2064,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by harfbuzz (TeX Live) $as_me 4.4.1, which was +It was created by harfbuzz (TeX Live) $as_me 5.0.1, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -4823,7 +4823,7 @@ fi # Define the identity of the package. PACKAGE='harfbuzz--tex-live-' - VERSION='4.4.1' + VERSION='5.0.1' # Some tools Automake needs. @@ -5033,10 +5033,10 @@ WARNING_CFLAGS=$kpse_cv_warning_cflags -HB_VERSION_MAJOR=4 -HB_VERSION_MINOR=4 +HB_VERSION_MAJOR=5 +HB_VERSION_MINOR=0 HB_VERSION_MICRO=1 -HB_VERSION=4.4.1 +HB_VERSION=5.0.1 ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -8817,7 +8817,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by harfbuzz (TeX Live) $as_me 4.4.1, which was +This file was extended by harfbuzz (TeX Live) $as_me 5.0.1, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -8885,7 +8885,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -harfbuzz (TeX Live) config.status 4.4.1 +harfbuzz (TeX Live) config.status 5.0.1 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt b/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt index 9a1d9032fcd..d4759ce131d 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt +++ b/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt @@ -80,6 +80,7 @@ include (FindPythonInterp) ## Functions and headers include (CheckFunctionExists) include (CheckIncludeFile) +include (CheckIncludeFiles) macro (check_funcs) # Similar to AC_CHECK_FUNCS of autotools foreach (func_name ${ARGN}) string(TOUPPER ${func_name} definition_to_add) @@ -308,9 +309,16 @@ if (WIN32 AND HB_HAVE_UNISCRIBE) endif () if (WIN32 AND HB_HAVE_DIRECTWRITE) + if (CMAKE_VERSION VERSION_GREATER 3.12) + check_include_files("windows.h;dwrite_1.h" HAVE_DWRITE_1_H LANGUAGE CXX) + else () + check_include_files("windows.h;dwrite_1.h" HAVE_DWRITE_1_H) + endif () + if (NOT HAVE_DWRITE_1_H) + message(FATAL_ERROR "DirectWrite was enabled explicitly, but required header is missing") + endif () add_definitions(-DHAVE_DIRECTWRITE) list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-directwrite.h) - list(APPEND THIRD_PARTY_LIBS dwrite rpcrt4) endif () if (HB_HAVE_GOBJECT) @@ -426,7 +434,7 @@ target_include_directories(harfbuzz PUBLIC "$" "$") if (HB_HAVE_FREETYPE AND TARGET freetype) - target_link_libraries(harfbuzz PUBLIC freetype) + target_link_libraries(harfbuzz freetype) endif () diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog b/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog index 59b5b780d27..c4d54f469dc 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog +++ b/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog @@ -1,3 +1,3068 @@ +commit cbccadba8d1e51d6cc03a891b7c3a17f598e774c +Author: Khaled Hosny +Date: Sat Jul 23 22:09:06 2022 +0200 + + 5.0.1 + + NEWS | 6 ++++++ + configure.ac | 2 +- + meson.build | 2 +- + src/hb-version.h | 4 ++-- + 4 files changed, 10 insertions(+), 4 deletions(-) + +commit 61d0c547010096e37ced5b8629a0638cceaefddb +Author: Behdad Esfahbod +Date: Sat Jul 23 13:25:54 2022 -0600 + + [ft] Pass design, not normalized, coords to freetype + + Needed for avar2 to work. + + src/hb-ft.cc | 6 +++--- + util/helper-cairo-ft.hh | 6 +++--- + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit 473a5e5651f36cfade809f78e5322860fe4fc194 +Author: Behdad Esfahbod +Date: Sat Jul 23 13:25:40 2022 -0600 + + [font] Fix design-coords + + Ouch! + + src/hb-font.cc | 4 ++++ + src/hb-ot-var-fvar-table.hh | 6 +++++- + 2 files changed, 9 insertions(+), 1 deletion(-) + +commit efab763885d73376018dab07a7c4006ecdf4a6ac +Author: Khaled Hosny +Date: Sat Jul 23 20:26:56 2022 +0200 + + [ci] Fix docs deployment + + Trigger build on tag pushes, and simplify the condition for calling + .ci/deploy-docs.sh. + + .ci/deploy-docs.sh | 5 ----- + .github/workflows/linux-ci.yml | 3 ++- + 2 files changed, 2 insertions(+), 6 deletions(-) + +commit 40b21edf48932cde4df94f081959aa61386da3d5 +Author: Khaled Hosny +Date: Sat Jul 23 16:45:32 2022 +0200 + + 5.0.0 + + NEWS | 41 +++++++++++++++++++++++++++++++++++++++++ + configure.ac | 2 +- + docs/harfbuzz-docs.xml | 1 + + meson.build | 2 +- + src/hb-common.cc | 2 +- + src/hb-subset.h | 2 +- + src/hb-version.h | 8 ++++---- + 7 files changed, 50 insertions(+), 8 deletions(-) + +commit 4cb83967aacf0aaf2622fc55539f04eb9ce2b7a0 +Author: Behdad Esfahbod +Date: Sat Jul 23 10:59:42 2022 -0600 + + [subset/ClassDefFormat2] Fix timeout + + Fixes https://oss-fuzz.com/testcase-detail/5417800474165248 + + src/hb-ot-layout-common.hh | 3 ++- + ...-testcase-minimized-hb-subset-fuzzer-5417800474165248 | Bin 0 -> 3161 bytes + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit 32c85b8c8c1994e318dce49b928a7298a0b23560 +Author: Behdad Esfahbod +Date: Sat Jul 23 10:50:26 2022 -0600 + + [avar2] Fix mapping when coords length don't match + + Ouch. + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=49407 + + src/hb-ot-var-avar-table.hh | 3 +++ + ...zz-testcase-minimized-hb-shape-fuzzer-4523349576908800 | Bin 0 -> 140 bytes + 2 files changed, 3 insertions(+) + +commit 06c3ec0a19e6f552275773fdd667229ccd9b1977 +Author: Behdad Esfahbod +Date: Sat Jul 23 10:36:39 2022 -0600 + + [avar2] Minor sanitize rewrite + + src/hb-ot-var-avar-table.hh | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit f94a3ba1db674591952fcae00864f97bd67713fa +Author: Behdad Esfahbod +Date: Sat Jul 23 10:36:08 2022 -0600 + + [varStore] Better protect against HB_NO_VAR builds + + src/hb-ot-layout-common.hh | 25 +++++++++++++++++++++++-- + 1 file changed, 23 insertions(+), 2 deletions(-) + +commit 17863bd16bc82c54fb68627cbf1e65702693dd09 +Author: Behdad Esfahbod +Date: Fri Jul 22 22:38:08 2022 -0600 + + [config/avar2] add HB_NO_VARIATIONS2 + + src/hb-config.hh | 1 + + src/hb-ot-var-avar-table.hh | 14 +++++++++++--- + 2 files changed, 12 insertions(+), 3 deletions(-) + +commit 5a9c7930efc8ec055f60cae5ec2567ff8de0e972 +Author: Behdad Esfahbod +Date: Fri Jul 22 21:33:15 2022 -0600 + + Add HB_NO_BEYOND_64K + + src/hb-config.hh | 4 ++++ + src/hb-ot-hmtx-table.hh | 2 +- + src/hb-ot-layout-common.hh | 26 +++++++++++++------------- + src/hb-ot-layout-gdef-table.hh | 32 ++++++++++++++++---------------- + src/hb-ot-layout-gsubgpos.hh | 40 ++++++++++++++++++++-------------------- + src/hb-ot-var-avar-table.hh | 2 +- + src/hb-static.cc | 4 ++-- + 7 files changed, 57 insertions(+), 53 deletions(-) + +commit c76fd3c5f9fca4fc095031ce41d35b6d04d8ebfa +Author: Behdad Esfahbod +Date: Fri Jul 22 15:29:38 2022 -0600 + + [avar2] Add link to "Spec". + + src/hb-ot-var-avar-table.hh | 1 + + 1 file changed, 1 insertion(+) + +commit edca52c3b644f6ebc90eeeb307ed3e87a7245348 +Author: Behdad Esfahbod +Date: Fri Jul 22 15:17:32 2022 -0600 + + [avar2] Use a varStore cache + + src/hb-ot-var-avar-table.hh | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 59f8afa73e3e0e1a7e3db5ffab06014dad5fd151 +Author: Behdad Esfahbod +Date: Fri Jul 22 15:12:21 2022 -0600 + + [avar2] Remove XXX item + + src/hb-ot-var-avar-table.hh | 2 -- + 1 file changed, 2 deletions(-) + +commit d6c4f757a4bfeabfea35804103cfce10650a101e +Author: Behdad Esfahbod +Date: Wed Jun 29 11:09:54 2022 -0600 + + [avar2] Clamp out values + + src/hb-ot-var-avar-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d0e2ad9297053635b65d0ad4c97c49f14f0cccee +Author: Behdad Esfahbod +Date: Tue Jun 28 21:19:15 2022 -0600 + + [avar] Pre-alloc vector + + src/hb-ot-var-avar-table.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 2a877b554a4377f1c973ed007ae17ff5448483d1 +Author: Behdad Esfahbod +Date: Tue Jun 28 17:10:10 2022 -0600 + + [avar2] First stab at mapping v2 values + + src/hb-ot-var-avar-table.hh | 28 +++++++++++++++++++++++++++- + 1 file changed, 27 insertions(+), 1 deletion(-) + +commit c3eb6713e90340109e1084924945d570e52bbe28 +Author: Behdad Esfahbod +Date: Tue Jun 28 16:42:28 2022 -0600 + + [avar2] Add v2 structure and sanitize + + src/hb-ot-var-avar-table.hh | 32 +++++++++++++++++++++++++++++++- + 1 file changed, 31 insertions(+), 1 deletion(-) + +commit c9e843942e39fb053cc5c05df85603720cbcbc2e +Author: Behdad Esfahbod +Date: Fri Jul 22 09:01:07 2022 -0600 + + [min/max] Don't forward argument + + src/hb-algs.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 7a219ca9f0f8140906cb7fd3b879b5bf5259badc +Author: Khaled Hosny +Date: Fri Jul 22 14:18:59 2022 +0200 + + [ci] Install glib-utils on macOS + + The glib utils have been split into a separate homebrew package. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/3747 + + .github/workflows/macos-ci.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cb5ca6be29ef61d13b2d0dae7cf3fbf740ae20ec +Author: Behdad Esfahbod +Date: Fri Jul 22 05:48:27 2022 -0600 + + [ft] Actually call check_changed() from _changed() + + Ouch! + + Fixes https://github.com/harfbuzz/harfbuzz/issues/3746 + + src/hb-ft.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit fd535a240bf56afcb4787c2038b0e33b4a6ddba3 +Author: Behdad Esfahbod +Date: Fri Jul 22 05:48:12 2022 -0600 + + [ft] Remove check_changed from get_glyph_shape() + + Leftover. + + src/hb-ft.cc | 2 -- + 1 file changed, 2 deletions(-) + +commit 7cdde6a24174ea2f29da141bcb265feb9b15eb2b +Author: Behdad Esfahbod +Date: Thu Jul 21 17:17:59 2022 -0600 + + [ClassDef] Write a loop as range for + + src/hb-ot-layout-common.hh | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +commit 0cc2f3c218ec60377ef284ab0cded150fc57650a +Author: Behdad Esfahbod +Date: Thu Jul 21 16:46:45 2022 -0600 + + [algs] Remove hb_pair_t() + + src/hb-algs.hh | 1 - + 1 file changed, 1 deletion(-) + +commit 9eab3ac72dc9cbd404da3dc4ef82b798d5e42c0e +Author: Behdad Esfahbod +Date: Thu Jul 21 12:35:19 2022 -0600 + + [CoverageFormat2] Remove hand-written loop + + While on a fuzzer-found test case (added) that loop was faster, + on real fonts, including NotoNastaliq in our benchmark, it was + actually slower, which intuitively I would have expected. + + Still no idea why on that fuzzer case it's faster though. :( + + src/OT/Layout/Common/CoverageFormat2.hh | 35 +++------------------ + ...ase-minimized-hb-subset-fuzzer-4549523149553664 | Bin 0 -> 66032 bytes + 2 files changed, 5 insertions(+), 30 deletions(-) + +commit bbb4db90dd2f24b237c3bbcf6ab24389f970d1b8 +Author: Behdad Esfahbod +Date: Thu Jul 21 12:34:46 2022 -0600 + + [Coverage/SingleSubst] Move hand-written loop to Coverage + + src/OT/Layout/Common/CoverageFormat2.hh | 35 ++++++++++++++++++++++++----- + src/OT/Layout/GSUB/SingleSubstFormat1.hh | 38 ++++++-------------------------- + 2 files changed, 37 insertions(+), 36 deletions(-) + +commit 7b95783efb36e35cc6acf579e4bb88bcefd50ae9 +Author: Behdad Esfahbod +Date: Thu Jul 21 12:18:51 2022 -0600 + + [Coverage] Internal rename + + src/OT/Layout/Common/Coverage.hh | 6 +++--- + src/OT/Layout/Common/CoverageFormat1.hh | 6 +++--- + src/OT/Layout/Common/CoverageFormat2.hh | 6 +++--- + 3 files changed, 9 insertions(+), 9 deletions(-) + +commit afa65f2903b2a1d32bbb70d445666b9343c86837 +Author: Behdad Esfahbod +Date: Thu Jul 21 12:17:08 2022 -0600 + + [Coverage] Minor type change + + src/OT/Layout/Common/CoverageFormat2.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b38587aa0ba3521c2b6aa22594e46e026035f70b +Author: Behdad Esfahbod +Date: Thu Jul 21 12:14:06 2022 -0600 + + [Coverage] Internal renames + + src/OT/Layout/Common/Coverage.hh | 16 ++++++++-------- + src/OT/Layout/Common/CoverageFormat1.hh | 5 ++--- + src/OT/Layout/Common/CoverageFormat2.hh | 7 +++---- + 3 files changed, 13 insertions(+), 15 deletions(-) + +commit 84d38df828e69e6ac1a796fc0460ba33e3bd3f29 +Author: Behdad Esfahbod +Date: Thu Jul 21 12:12:04 2022 -0600 + + [Coverage] Minor use range-based loop + + src/OT/Layout/Common/CoverageFormat2.hh | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit b017b73ffe0e24bf7c621592ee3c31cc209a2155 +Author: Behdad Esfahbod +Date: Thu Jul 21 12:06:55 2022 -0600 + + [Coverage] Minor remove a couple unnecessary as_array()'s + + src/OT/Layout/Common/CoverageFormat2.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 9e650b4e0cd0571caf9e67f0186ea3690e615710 +Author: Behdad Esfahbod +Date: Thu Jul 21 12:01:52 2022 -0600 + + [Coverage] Speedup intersect_set + + src/OT/Layout/Common/CoverageFormat2.hh | 1 - + 1 file changed, 1 deletion(-) + +commit efa388074d76339c2dc80fec675c6dbbb6511c91 +Author: Behdad Esfahbod +Date: Thu Jul 21 11:52:36 2022 -0600 + + [subset/SingleSubsetFormat1] Use Coverage.intersect_set + + src/OT/Layout/GSUB/SingleSubstFormat1.hh | 12 +++++------- + 1 file changed, 5 insertions(+), 7 deletions(-) + +commit 00dfbbce1c65c2e709b3ffaac45d234bdd02528d +Author: Behdad Esfahbod +Date: Thu Jul 21 11:39:32 2022 -0600 + + [Coverage] Rename and templatize intersected_coverage_glyphs + + src/OT/Layout/Common/Coverage.hh | 12 ++++++----- + src/OT/Layout/Common/CoverageFormat1.hh | 8 +++++--- + src/OT/Layout/Common/CoverageFormat2.hh | 12 ++++++----- + src/OT/Layout/Common/RangeRecord.hh | 4 ++-- + src/OT/Layout/GPOS/SinglePosFormat1.hh | 2 +- + src/OT/Layout/GSUB/SingleSubstFormat1.hh | 2 +- + src/hb-ot-layout-common.hh | 6 +++--- + src/hb-ot-layout-gsubgpos.hh | 35 ++++++++++++++++---------------- + 8 files changed, 43 insertions(+), 38 deletions(-) + +commit d0eb273791814b36d3a9298caf99f60bef857dc3 +Author: Behdad Esfahbod +Date: Thu Jul 21 11:24:56 2022 -0600 + + [subset/GSUB/GPOS] Use more intersected_coverage_glyphs() + + src/OT/Layout/GPOS/SinglePosFormat1.hh | 6 ++++-- + src/OT/Layout/GSUB/SingleSubstFormat1.hh | 34 ++------------------------------ + 2 files changed, 6 insertions(+), 34 deletions(-) + +commit 450d834679738820e1d9afa579de125bb8087dbf +Author: Behdad Esfahbod +Date: Thu Jul 21 11:05:35 2022 -0600 + + [subset/PairPosFormat1] Speed up significantly + + src/OT/Layout/GPOS/SinglePosFormat1.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 5d7556e1841bafc851d043bb9d0195651edb0ce3 +Author: Behdad Esfahbod +Date: Thu Jul 21 10:42:29 2022 -0600 + + Revert "[subst/SingleSubstFormat1] Rewrite nicer" + + This reverts commit bababe10724c27b2cbb09bf25e7dcf4aeea07588. + + The hand-written code is still much faster :(. + + src/OT/Layout/GSUB/SingleSubstFormat1.hh | 64 +++++++++++++++++++++++++------- + 1 file changed, 50 insertions(+), 14 deletions(-) + +commit 71ce931e6ddbb7ba31b9ec3243d3c09eda251ff1 +Author: Behdad Esfahbod +Date: Thu Jul 21 10:41:29 2022 -0600 + + [PairPos] Don't compute newFormat + + It was wrong, because it would be writing wrong values. + + Test suite doesn't seem to catch any. + + src/OT/Layout/GPOS/SinglePos.hh | 3 --- + src/OT/Layout/GSUB/AlternateSubstFormat1.hh | 1 - + 2 files changed, 4 deletions(-) + +commit 02ca02544348edc9d89f436ed2000f4ba4f50231 +Author: Behdad Esfahbod +Date: Thu Jul 21 10:30:23 2022 -0600 + + [layout] Add large_int to Types + + src/OT/Layout/Common/CoverageFormat2.hh | 6 +++--- + src/OT/Layout/types.hh | 2 ++ + 2 files changed, 5 insertions(+), 3 deletions(-) + +commit bababe10724c27b2cbb09bf25e7dcf4aeea07588 +Author: Behdad Esfahbod +Date: Thu Jul 21 10:25:27 2022 -0600 + + [subst/SingleSubstFormat1] Rewrite nicer + + src/OT/Layout/GSUB/SingleSubstFormat1.hh | 64 +++++++------------------------- + 1 file changed, 14 insertions(+), 50 deletions(-) + +commit cf123e6a0dae59131b028676ed919c5a09dae919 +Author: Behdad Esfahbod +Date: Thu Jul 21 10:21:57 2022 -0600 + + [Coverage] Add get_population () + + src/OT/Layout/Common/Coverage.hh | 13 +++++++++++++ + src/OT/Layout/Common/CoverageFormat1.hh | 5 +++++ + src/OT/Layout/Common/CoverageFormat2.hh | 8 ++++++++ + src/OT/Layout/Common/RangeRecord.hh | 6 ++++++ + 4 files changed, 32 insertions(+) + +commit 2ad3c0c7709fe07122934e4842225f55267ce84c +Author: Behdad Esfahbod +Date: Thu Jul 21 09:46:25 2022 -0600 + + Fix uninitialized variable + + src/hb-ot-map.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fa471043fccb94444510e3300ac2573297c82137 +Author: Behdad Esfahbod +Date: Wed Jul 20 22:42:18 2022 -0600 + + [subset] Fix previous commit + + src/OT/Layout/GSUB/SingleSubstFormat1.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c4d2ef90047e8b6747adcf99a42984730979fbc3 +Author: Behdad Esfahbod +Date: Wed Jul 20 22:36:35 2022 -0600 + + [subset] Speed up subsetting of SingleSubstFormat1_3 + + src/OT/Layout/GSUB/SingleSubstFormat1.hh | 36 ++++++++++++++++++++++++++++++-- + 1 file changed, 34 insertions(+), 2 deletions(-) + +commit d01e6babe6660ca5ac3b941b1e977af9dcda954f +Author: Behdad Esfahbod +Date: Wed Jul 20 22:17:33 2022 -0600 + + [subset] Speed up SingleSubstFormat1_3 closure + + src/OT/Layout/GSUB/SingleSubstFormat1.hh | 38 +++++++++++++++++++++++++++----- + 1 file changed, 33 insertions(+), 5 deletions(-) + +commit 0f800769379d05a3086cd3fc56f0c4c1a19076f8 +Author: Qunxin Liu +Date: Wed Jul 20 14:59:02 2022 -0700 + + [subset] Do not repeat COLR table closure + + src/hb-subset-plan.cc | 24 +++++++++--------------- + 1 file changed, 9 insertions(+), 15 deletions(-) + +commit 9fc31db6faa29eeac734bbb3196dbce2eabaa4c7 +Author: Behdad Esfahbod +Date: Wed Jul 20 16:03:02 2022 -0600 + + [blob] Initialize members if ever on the stack + + src/hb-blob.hh | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 60a9175f2c711e5b1b76b25c8121440177848513 +Author: Behdad Esfahbod +Date: Wed Jul 20 15:59:46 2022 -0600 + + [blob] Remove fini_shallow() + + src/hb-blob.cc | 2 -- + src/hb-blob.hh | 2 +- + 2 files changed, 1 insertion(+), 3 deletions(-) + +commit bcd59b5142d6c8bee71c252c8f44240542ab9dab +Author: Behdad Esfahbod +Date: Wed Jul 20 15:57:09 2022 -0600 + + [set/map] Remove init_shallow/fini_shallow() + + src/hb-map.hh | 18 ++++++------------ + src/hb-set.hh | 6 ++---- + 2 files changed, 8 insertions(+), 16 deletions(-) + +commit 79b23cc25d1e029ce87676a13a41f2ff8c6b980c +Author: Behdad Esfahbod +Date: Wed Jul 20 15:38:34 2022 -0600 + + Fix another leak + + src/hb-shape-plan.hh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 3fad942ee21f7e5bbb29b2c5af6b1c3b77f484dd +Author: Behdad Esfahbod +Date: Wed Jul 20 15:26:32 2022 -0600 + + Try fix leak + + src/hb-ot-shape.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit e1b5f2f806f4aafec5eaa26cb528622e7e0b1606 +Author: Behdad Esfahbod +Date: Wed Jul 20 15:03:20 2022 -0600 + + [object] Call destructor in hb_object_destroy() + + src/hb-map.cc | 2 -- + src/hb-map.hh | 2 +- + src/hb-object.hh | 5 ++++- + src/hb-set.cc | 2 -- + src/hb-shape-plan.cc | 4 ---- + src/hb-subset-plan.cc | 2 -- + 6 files changed, 5 insertions(+), 12 deletions(-) + +commit 9ea4ab60514d5f22d360a0a199cf8a126adf5e18 +Author: Behdad Esfahbod +Date: Wed Jul 20 14:57:32 2022 -0600 + + [object] Call constructor + + src/hb-font.cc | 1 + + src/hb-map.cc | 2 -- + src/hb-map.hh | 2 -- + src/hb-object.hh | 3 +++ + src/hb-set.cc | 2 -- + 5 files changed, 4 insertions(+), 6 deletions(-) + +commit 61c04384256390d3ef5d0fd576bd2bc2fb34624e +Author: Behdad Esfahbod +Date: Wed Jul 20 14:43:58 2022 -0600 + + [map] Allow geting non-const value pointer out with has() + + src/hb-map.hh | 3 ++- + src/test-map.cc | 4 ++++ + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 00cfc5c17d3b792a579356ca998e361bcb414260 +Author: Behdad Esfahbod +Date: Wed Jul 20 14:38:28 2022 -0600 + + [map] Don't set out value in has() if not found + + src/hb-map.hh | 6 ------ + 1 file changed, 6 deletions(-) + +commit 485f043211ad21d6b0d926505f41c772330890a1 +Author: Behdad Esfahbod +Date: Wed Jul 20 14:34:55 2022 -0600 + + [map] Enable using hashmap with unique_ptr + + src/hb-map.hh | 11 +++++++++++ + src/test-map.cc | 6 ++++++ + 2 files changed, 17 insertions(+) + +commit 53fd4c92368abe260673649330e5eb19e9df7a60 +Author: Behdad Esfahbod +Date: Wed Jul 20 13:33:49 2022 -0600 + + [set] A variable rename + + src/hb-bit-page.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6826b2c3fdd881a98bd0eb3be5c114bda0282bbe +Author: Behdad Esfahbod +Date: Wed Jul 20 13:25:34 2022 -0600 + + [gsubgpos/closure] Minor condition use bool operator + + src/hb-ot-layout-gsubgpos.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 55a1e0bb1195332414acc2f832600269894e2f7b +Author: Behdad Esfahbod +Date: Wed Jul 20 13:10:28 2022 -0600 + + [ot-map] Use hb_array for a return value + + src/hb-ot-map.hh | 14 +++++--------- + src/hb-ot-shaper-indic.cc | 12 +++++------- + 2 files changed, 10 insertions(+), 16 deletions(-) + +commit a92d988d3d793f1f5660b443de301eedd715fd7d +Author: Behdad Esfahbod +Date: Wed Jul 20 13:01:29 2022 -0600 + + Revert "[ci] Upgrade codecov-action to v3.1" + + This reverts commit 5b8bff8dca3a81de02878c596f3721d268d29bb4. + + .github/workflows/linux-ci.yml | 2 +- + .github/workflows/macos-ci.yml | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 5b8bff8dca3a81de02878c596f3721d268d29bb4 +Author: Behdad Esfahbod +Date: Wed Jul 20 12:59:36 2022 -0600 + + [ci] Upgrade codecov-action to v3.1 + + .github/workflows/linux-ci.yml | 2 +- + .github/workflows/macos-ci.yml | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 8d923363dbc7738d0c53a1f78e9407c24010ac53 +Author: Behdad Esfahbod +Date: Wed Jul 20 12:08:18 2022 -0600 + + [layout] Reduce number of closure rounds + + src/hb-ot-layout-common.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 2eb561ebead8276c6c905e33585d4aa216a25b41 +Author: Behdad Esfahbod +Date: Wed Jul 20 12:02:38 2022 -0600 + + [ci] Upgrade macos runner from 10.15 to latest (11) + + .github/workflows/macos-ci.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit aae8c74e0551fd889f041a0c0cce708f8fab0c5a +Author: Behdad Esfahbod +Date: Wed Jul 20 11:51:09 2022 -0600 + + [>64k:layout:SingleSubstFormat3] Fix masking + + https://github.com/be-fonts/boring-expansion-spec/issues/31 + + src/OT/Layout/GSUB/SingleSubstFormat1.hh | 30 +++++++++++++++++++----------- + 1 file changed, 19 insertions(+), 11 deletions(-) + +commit 3c137ef041850150d54e4817388cdcdc3a3ff0bc +Author: Behdad Esfahbod +Date: Wed Jul 20 11:29:30 2022 -0600 + + [GPOS/CursivePos] Fix unsafe-to-break marking + + Fixes test. + + src/OT/Layout/GPOS/CursivePosFormat1.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7050021fedf549e11056f37cec7234238e7cd7e8 +Author: Behdad Esfahbod +Date: Wed Jul 20 11:27:12 2022 -0600 + + [cursive-positioning.tests] Fix test specification + + Still failing. Figuring out. + + test/shape/data/in-house/tests/cursive-positioning.tests | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit 5998cd00c83864d76788f1a7ee47f4b429ecc866 +Author: Behdad Esfahbod +Date: Wed Jul 20 11:16:32 2022 -0600 + + [hebrew] Break out of reordering loop when pattern found + + src/hb-ot-shaper-hebrew.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 42f1d7794b9b4e46cf45de6d6e8139667f1c18bd +Author: Behdad Esfahbod +Date: Wed Jul 20 11:13:16 2022 -0600 + + Add tests for multiple cursive positioning + + From https://github.com/harfbuzz/harfbuzz/issues/2469 + + .../fonts/be10ea33f28a139f3305db2302af6220f2f9a583.ttf | Bin 0 -> 1076 bytes + test/shape/data/in-house/tests/cursive-positioning.tests | 11 +++++++++++ + 2 files changed, 11 insertions(+) + +commit d861303797e09f202acfe19740ceafdc7726b1b7 +Author: Behdad Esfahbod +Date: Wed Jul 20 10:57:12 2022 -0600 + + [hebrew] Comment + + src/hb-ot-shaper-hebrew.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c60d810d509e16bf29fa7399d35c173b17c924c3 +Author: Behdad Esfahbod +Date: Wed Jul 20 10:24:54 2022 -0600 + + [hebrew] Implement Jerusalem mark reordering + + Fixes https://github.com/harfbuzz/harfbuzz/issues/2947 + + src/hb-ot-shaper-hebrew.cc | 27 ++++++++++++++++++++++++++- + 1 file changed, 26 insertions(+), 1 deletion(-) + +commit 605bb1ee3dd1d6ef19676be0194d001c21533d60 +Author: Khaled Hosny +Date: Tue Jul 19 21:15:21 2022 +0200 + + [subset] Add amalgam harfbuzz-subset.cc + + Fixes https://github.com/harfbuzz/harfbuzz/issues/3733 + + .circleci/config.yml | 2 +- + src/Makefile.am | 14 ++++++++++++- + src/gen-harfbuzzcc.py | 4 +++- + src/harfbuzz-subset.cc | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ + src/harfbuzz.cc | 18 ++++++++-------- + src/meson.build | 8 ++++++++ + 6 files changed, 90 insertions(+), 12 deletions(-) + +commit a66ba594b4a31a85de8960b2ddf294aaea2348e8 +Author: Behdad Esfahbod +Date: Tue Jul 19 16:32:32 2022 -0600 + + [util] Fix stack-underflow + + Fixes https://github.com/harfbuzz/harfbuzz/issues/3737 + + util/hb-subset.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c6ef11daf51bba4e06c4eabbc387b1058e8ce8ab +Author: Behdad Esfahbod +Date: Tue Jul 19 15:19:52 2022 -0600 + + [util] Fix build with HB_NO_VAR + + util/font-options.hh | 10 ++++++++++ + util/helper-cairo-ft.hh | 2 +- + 2 files changed, 11 insertions(+), 1 deletion(-) + +commit 712bfa8872532b19e6c5be9bf16c9bee36b50922 +Author: Qunxin Liu +Date: Tue Jul 19 13:57:14 2022 -0700 + + build fix for HB_NO_VAR + + src/hb-subset-plan.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 798a0c8a58852d1eb177db9054ead9e897672175 +Author: Behdad Esfahbod +Date: Tue Jul 19 14:40:47 2022 -0600 + + Fix build + + src/hb-ot-layout-gdef-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8737dea4d9012ea4636db12274532c5f3c6abb40 +Author: Behdad Esfahbod +Date: Tue Jul 19 14:39:47 2022 -0600 + + [>64k:layout:GDEF] Implement version 2 + + Implements https://github.com/be-fonts/boring-expansion-spec/issues/36 + + Subset does NOT lower format. + + src/hb-ot-layout-gdef-table.hh | 48 ++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 48 insertions(+) + +commit 8080e01afc86fe4921c8fa87c85134f076f40675 +Author: Behdad Esfahbod +Date: Tue Jul 19 14:35:58 2022 -0600 + + [>64k:layout] Templatize GDEFVersion1 + + src/hb-ot-layout-gdef-table.hh | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit 1665cf6bc4ac1c57d2e43070cd0aeab7c562e2bc +Author: Behdad Esfahbod +Date: Tue Jul 19 13:56:23 2022 -0600 + + [>64k:layout] Split GDEFVersion1 + + https://github.com/be-fonts/boring-expansion-spec/issues/36 + + src/hb-ot-layout-gdef-table.hh | 315 ++++++++++++++++++++++++++++------------- + src/hb-ot-layout-gsubgpos.hh | 1 - + 2 files changed, 213 insertions(+), 103 deletions(-) + +commit 1de5591cf743a789b240b1c1f8536d909f63a857 +Author: Behdad Esfahbod +Date: Tue Jul 19 13:37:30 2022 -0600 + + [>64k:layout] Prepare GDEF for templatizing + + https://github.com/be-fonts/boring-expansion-spec/issues/36 + + src/hb-ot-layout-gdef-table.hh | 41 +++++++++++++++++++++++------------------ + src/main.cc | 8 ++++---- + 2 files changed, 27 insertions(+), 22 deletions(-) + +commit c0d60bd4964701402aacf98390e0936c9dcba953 +Author: Khaled Hosny +Date: Tue Jul 19 18:21:09 2022 +0200 + + [meta] Fix warning with emscripten + + For whatever reason, em++ takes the first branch and spouts a gazillion + warnings like: + + ./harfbuzz/src/hb-vector.hh:229:20: warning: builtin __has_trivial_assign is deprecated; use __is_trivially_assignable instead [-Wdeprecated-builtins] + hb_enable_if (hb_is_trivially_copy_assignable(T))> + ^ + ./harfbuzz/src/hb-meta.hh:193:44: note: expanded from macro 'hb_is_trivially_copy_assignable' + + src/hb-meta.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 91c60802e646ee10daa8eda0ab2d2ea06206cc41 +Author: Behdad Esfahbod +Date: Mon Jul 18 22:24:28 2022 -0600 + + [open-type] Fix overflow check + + Without the cast, the compiler is within its rights to reason that + overflow didn't happen and optimize away the check, as clang was. + + src/hb-open-type.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 4279304a627d467866aac751548e728eaa841b73 +Author: Behdad Esfahbod +Date: Mon Jul 18 22:20:06 2022 -0600 + + [stat] Fix double-promotion warnings + + src/hb-ot-stat-table.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 54e9ab4a91a762dc8a730e22a5b103b206b05db7 +Author: Behdad Esfahbod +Date: Mon Jul 18 18:57:14 2022 -0600 + + [GPOS/Cursive] Fix breaking of parent-child attachment + + Mostly fixes https://github.com/harfbuzz/harfbuzz/issues/2469 + + src/OT/Layout/GPOS/CursivePosFormat1.hh | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit c2baf2796cd1c2de60788897502bd42905c78cb0 +Author: Behdad Esfahbod +Date: Mon Jul 18 15:41:20 2022 -0600 + + [arabic] Make more features F_MANUAL_ZWJ + + The change to `ccmp` fixes shaping of certain sequences with + Calibri on Windows 11. Addition of `liga` and `clig` is + speculative. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/3530 + + src/hb-ot-shaper-arabic.cc | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +commit ddeef8c87548a57356ec72c3ed6d277c916330c7 +Author: Behdad Esfahbod +Date: Mon Jul 18 15:13:47 2022 -0600 + + [test-ot-glyphname] Fix return value + + src/test-ot-glyphname.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f1a69ff1b94a4fd4de69fddcbc80fba6f819e16b +Author: Qunxin Liu +Date: Thu Jun 30 16:22:15 2022 -0700 + + [instance] update scripts for testing instancing + + ...lt.retain-all-codepoint.wght=400,wdth=100.0.ttf | Bin 0 -> 6584 bytes + ...ult.retain-all-codepoint.wght=drop,wdth=100.ttf | Bin 0 -> 6584 bytes + test/subset/data/fonts/Roboto-Variable.ABC.ttf | Bin 0 -> 13480 bytes + test/subset/data/tests/pin_all_at_default.tests | 12 ++++++++ + test/subset/generate-expected-outputs.py | 25 ++++++++++++++-- + test/subset/run-tests.py | 3 ++ + test/subset/subset_test_suite.py | 32 +++++++++++++++++---- + 7 files changed, 65 insertions(+), 7 deletions(-) + +commit be8e8e8c80cc69d9d3a02f357a3ef252738d96e6 +Author: Qunxin Liu +Date: Thu Jun 30 14:24:36 2022 -0700 + + [instance] prune name tables after axes pinned at fixed locations + + Restricting axes to ranges is not supported yet. + + src/hb-ot-stat-table.hh | 19 +++++++++++++++- + src/hb-ot-var-fvar-table.hh | 53 +++++++++++++++++++++++++++++++++------------ + src/hb-subset-plan.cc | 11 ++++++---- + 3 files changed, 64 insertions(+), 19 deletions(-) + +commit df55f840cb4cf2d5cfe9e93e289aa59e7d592f7f +Author: Qunxin Liu +Date: Thu Jun 30 09:36:19 2022 -0700 + + [instance] instantiate STAT table when axes are pinned at fixed locations + + restricting ranges is not supported yet. + + src/hb-ot-stat-table.hh | 235 ++++++++++++++++++++++++++++++++++++++++++++---- + src/hb-subset-input.cc | 11 +-- + src/hb-subset-plan.cc | 10 +++ + src/hb-subset-plan.hh | 2 + + src/hb-subset.cc | 6 ++ + 5 files changed, 236 insertions(+), 28 deletions(-) + +commit 2a4773e43d528343a1b4a305905d275ba5eda829 +Author: Qunxin Liu +Date: Tue Jun 21 19:29:52 2022 -0700 + + add option "--instance", store axes_location in subset_plan and drop all + variation tables when all axes are pinned at default + + src/gen-def.py | 4 ++- + src/hb-map.hh | 24 +++++++++++++ + src/hb-ot-var-avar-table.hh | 8 +++++ + src/hb-ot-var-fvar-table.hh | 2 ++ + src/hb-subset-input.cc | 65 ++++++++++++++++++++++++++++++++++- + src/hb-subset-input.hh | 4 ++- + src/hb-subset-plan.cc | 84 ++++++++++++++++++++++++++++++--------------- + src/hb-subset-plan.hh | 3 ++ + src/hb-subset.cc | 10 ++++++ + src/hb-subset.h | 15 ++++++++ + util/hb-subset.cc | 78 +++++++++++++++++++++++++++++++++++++++++ + 11 files changed, 267 insertions(+), 30 deletions(-) + +commit 5744e951fc5e647c42a8e75652d2a32c7479fc1f +Author: Behdad Esfahbod +Date: Mon Jul 18 14:54:44 2022 -0600 + + [gir] Skip graphite API + + Fixes https://github.com/harfbuzz/harfbuzz/issues/2557 + + src/hb-graphite2.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 1eb8e820864771509b7aed4ce76a83e8cd2272b0 +Author: Behdad Esfahbod +Date: Mon Jul 18 14:47:49 2022 -0600 + + [util] Accept space as delimiter for --features/--variations + + Fixes https://github.com/harfbuzz/harfbuzz/issues/3715 + + util/font-options.hh | 4 ++-- + util/shape-options.hh | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 378663409ac9d2a54d8a738c88a76a5b9873181f +Author: Khaled Hosny +Date: Mon Jul 18 21:02:41 2022 +0200 + + [ci] Deploy docs only on tagged builds + + Fixes https://github.com/harfbuzz/harfbuzz/issues/2786 + + .ci/deploy-docs.sh | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 3723b8544b63d4eb95ff1448e4ebfc6a25127360 +Author: Behdad Esfahbod +Date: Mon Jul 18 14:00:14 2022 -0600 + + [cff] Better max op counting + + src/hb-cff-interp-cs-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3c84aa8416cac7aba1430cc18ec76a393c47f3cd +Author: Behdad Esfahbod +Date: Mon Jul 18 13:57:59 2022 -0600 + + [cff] Add a max work counter + + Set to 10,000 per interpretation right now. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/3700 + Fixes https://oss-fuzz.com/testcase-detail/5667125715927040 + + src/hb-cff-interp-cs-common.hh | 7 +++++++ + ...uzz-testcase-minimized-hb-draw-fuzzer-5667125715927040 | Bin 0 -> 472 bytes + test/fuzzing/hb-draw-fuzzer.cc | 1 + + 3 files changed, 8 insertions(+) + +commit 89de8c700f16bd50617c20a81b77c6555f3a8988 +Author: Behdad Esfahbod +Date: Mon Jul 18 13:07:29 2022 -0600 + + [CoverageFormat2] Another fix for broken tables + + Fixes https://oss-fuzz.com/testcase-detail/6005342714068992 + + src/OT/Layout/Common/CoverageFormat2.hh | 1 + + 1 file changed, 1 insertion(+) + +commit faac252f9f6876d971c7d487f064261eb6070952 +Author: Behdad Esfahbod +Date: Mon Jul 18 12:23:57 2022 -0600 + + [util/hb-ot-shape-closure] Fix showing glyph names + + util/hb-ot-shape-closure.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 38f2ec1703655d1527170c6e48f2647047716d46 +Author: Behdad Esfahbod +Date: Mon Jul 18 12:17:08 2022 -0600 + + [hb-shape] Move shape_output_t into separate file + + util/Makefile.sources | 1 + + util/hb-shape.cc | 126 +-------------------------------------- + util/shape-output.hh | 159 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 161 insertions(+), 125 deletions(-) + +commit 94be45980883bea99bb1028445c6ab7100c11409 +Author: Behdad Esfahbod +Date: Mon Jul 18 12:13:48 2022 -0600 + + [hb-shape] Internal rename + + util/hb-shape.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 4f22397f05f8b0b65897e58a0176c8fa9b85f2a4 +Author: Behdad Esfahbod +Date: Mon Jul 18 11:03:54 2022 -0600 + + [ft] A couple of introspection fixes + + src/hb-ft.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit faa8cdc89877888fbcc182b368490f64a721b067 +Author: Behdad Esfahbod +Date: Mon Jul 18 10:22:19 2022 -0600 + + [util] Allow HB_CHAFA=2/3 to enable wedges/all symbols in Chafa + + util/helper-cairo-ansi.hh | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +commit b4e95965c8b9b508aca2afdc7483b89d4a56eb99 +Author: Behdad Esfahbod +Date: Mon Jul 18 10:14:14 2022 -0600 + + [util] Revert Chafa to use simple blocks only + + The wedges are nice but not available on Mac. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/3729 + + util/helper-cairo-ansi.hh | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit f7f6d278bb166942c9a87fd7cefbd7fa294a0ba2 +Author: Behdad Esfahbod +Date: Sun Jul 17 22:15:42 2022 -0600 + + Add hb_language_matches() + + New API: + + hb_language_matches() + + docs/harfbuzz-sections.txt | 1 + + src/hb-aat-layout-morx-table.hh | 2 +- + src/hb-common.cc | 32 ++++++++++++++++++++++++++++++++ + src/hb-common.h | 3 +++ + src/hb-ot-name-table.hh | 14 +++++--------- + src/hb-ot-tag.cc | 2 ++ + 6 files changed, 44 insertions(+), 10 deletions(-) + +commit d57ce30054ec7bf03fe27fa9bbb3c2e6963e05d6 +Author: Behdad Esfahbod +Date: Sun Jul 17 21:56:56 2022 -0600 + + [ot-shape] Pass reference to props instead of pointer + + Since cannot be nullptr. + + src/hb-aat-map.hh | 4 ++-- + src/hb-ot-map.cc | 4 ++-- + src/hb-ot-map.hh | 2 +- + src/hb-ot-shape.cc | 10 +++++----- + src/hb-ot-shape.hh | 2 +- + 5 files changed, 11 insertions(+), 11 deletions(-) + +commit a972d05d7eea86516d98d494f99b1b0ce719e260 +Author: Behdad Esfahbod +Date: Sun Jul 17 21:42:04 2022 -0600 + + [aat] Fix build + + src/hb-aat-layout-morx-table.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit a5dad50072e1881a5fc7595cfbe4942534d2ea5a +Author: Behdad Esfahbod +Date: Sun Jul 17 21:39:24 2022 -0600 + + [aat/morx] Add test for previous commit + + https://github.com/harfbuzz/harfbuzz/issues/1373 + + test/shape/data/in-house/tests/macos.tests | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 2124ad8906bb77eee099071dccc49d3c60fe331f +Author: Behdad Esfahbod +Date: Sun Jul 17 21:32:27 2022 -0600 + + [aat/morx] Implement language-specific forms + + Test on Mac with, eg. + + $ hb-view /Library/Fonts/BigCaslon.ttf -u 107 + vs + $ hb-view /Library/Fonts/BigCaslon.ttf -u 107 --language pl + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1373 + + src/hb-aat-layout-morx-table.hh | 7 +++++++ + src/hb-aat-map.hh | 6 ++++-- + 2 files changed, 11 insertions(+), 2 deletions(-) + +commit d8574b44ccde97fc7111b4d983f5303e200f0ae8 +Author: Behdad Esfahbod +Date: Sun Jul 17 18:44:27 2022 -0600 + + [CoverageFormat2] Fix iterator to avoid infinite loop + + on invalid data. + + Fixes https://oss-fuzz.com/testcase-detail/5304497047470080 + + src/OT/Layout/Common/CoverageFormat2.hh | 1 + + 1 file changed, 1 insertion(+) + +commit b475a2ab29eec981ac92c5ebc555b2c30288fe57 +Author: Behdad Esfahbod +Date: Sun Jul 17 18:44:11 2022 -0600 + + [array] Adjust operator != + + src/hb-array.hh | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 9518d602f33d157343b273fe1846b8b5c60fe56e +Author: Behdad Esfahbod +Date: Sun Jul 17 17:03:40 2022 -0600 + + [atomic] Disable compiler memory barrier on MSVC + + It keeps giving me internal compiler error. + + https://github.com/harfbuzz/harfbuzz/issues/3728 + + src/hb-atomic.hh | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit f0707e2348c455113e5ef9efc86b85920bb107b1 +Author: Behdad Esfahbod +Date: Sun Jul 17 16:47:16 2022 -0600 + + [atomic] Add compiler memory_r_barrier + + https://github.com/harfbuzz/harfbuzz/issues/3728 + + src/hb-atomic.hh | 7 +++++++ + src/hb-open-type.hh | 28 ++++++++++++++-------------- + 2 files changed, 21 insertions(+), 14 deletions(-) + +commit f3151b6582a38fb1a377eb6070b8cecedb2ea711 +Author: Behdad Esfahbod +Date: Sun Jul 17 16:19:28 2022 -0600 + + [ArrayOf family] Use memory barrier before accessing array + + Without it, the compiler was reordering and batching the read + of array length and array[0] if the 0'th member was accessed + constantly and function was inlined. This felt safe to the + compiler because HB_VAR_ARRAY is 1, but could be unsafe actually. + The memory barrier disallows that. + + This was found by afl/honggfuzz address sanitizers. + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=49187 + + src/hb-open-type.hh | 14 ++++++++++++++ + src/hb-ot-layout-common.hh | 2 +- + 2 files changed, 15 insertions(+), 1 deletion(-) + +commit 90e40f24fed3e0a8ccb16e56fbe926fd5953b970 +Author: Behdad Esfahbod +Date: Sun Jul 17 15:01:04 2022 -0600 + + [algs] Tweak attribute(packed) usage + + Allow disabling it. Also don't cast this pointer. + + src/hb-algs.hh | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +commit af84680f23d1a3078f2a3eb8651e174b40f99bf8 +Author: Behdad Esfahbod +Date: Sun Jul 17 12:00:04 2022 -0600 + + [GSUB] Remove a reinterpret_cast + + src/OT/Layout/GSUB/SubstLookup.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9843f07658ae6b9b7b586f9c69cdb2c99b24ad18 +Author: Behdad Esfahbod +Date: Fri Jul 15 16:03:55 2022 -0600 + + [OffsetTo] Try catching nullable offsets to unbounded types + + Doesn't catch all cases; if type is not fully defined at + OffsetTo time, we can't know. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1300 + to the best we can do. + + src/hb-open-type.hh | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 1327d8e3dfcaadba6c5029f830ffaa0903a8647b +Author: Behdad Esfahbod +Date: Fri Jul 15 16:03:38 2022 -0600 + + [layout-common] Reshuffle code so Feature is defined before it's used + + src/hb-ot-layout-common.hh | 865 ++++++++++++++++++++++----------------------- + 1 file changed, 432 insertions(+), 433 deletions(-) + +commit f7147835eb3e3397ec5ad37bd6b9e1a4dfbd4f9d +Author: Behdad Esfahbod +Date: Fri Jul 15 16:03:25 2022 -0600 + + [colr] Add MIN_SIZE to Paint + + src/hb-ot-color-colr-table.hh | 3 +++ + 1 file changed, 3 insertions(+) + +commit e1d2facd5363951adec78b080cf616e4bc3ff9d3 +Author: Behdad Esfahbod +Date: Fri Jul 15 16:02:58 2022 -0600 + + [null] Add hb_has_null_size() and hb_has_min_size() + + src/hb-null.hh | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit c8908f92d77e88d69d6f365290f82c4d3c3d629b +Merge: 3ac110560 6ed57de15 +Author: Behdad Esfahbod +Date: Fri Jul 15 15:32:58 2022 -0600 + + Merge pull request #3726 from harfbuzz/ft-bitmap + + Ft bitmap + +commit 6ed57de15c92f5bf04d9872d989d6eb129f4bec0 +Author: Behdad Esfahbod +Date: Fri Jul 15 15:09:28 2022 -0600 + + [ft] Fix negative font sizes for bitmaps + + src/hb-ft.cc | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 307ee9baff687912e4f451a0cc463ff84314554f +Author: Behdad Esfahbod +Date: Fri Jul 15 14:48:29 2022 -0600 + + [ft] Fix bitmap-only vertical metrics + + src/hb-ft.cc | 17 ++++++++++++++--- + 1 file changed, 14 insertions(+), 3 deletions(-) + +commit 87d338eb61e35d6d8270b083c8225e004f73c03f +Author: Behdad Esfahbod +Date: Fri Jul 15 14:19:17 2022 -0600 + + [ft] Fix test + + src/hb-ft.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit e294200dac3d7cd41a02e0753f63acfbb5e24820 +Author: Khaled Hosny +Date: Fri Jul 15 21:36:50 2022 +0200 + + [ft] Check for FT_Get_Transform at build time + + configure.ac | 2 +- + meson.build | 1 + + src/hb-ft.cc | 22 ++++++++++++++++++++++ + 3 files changed, 24 insertions(+), 1 deletion(-) + +commit 901236f721e59e9955637cd44121b28f89c5bebe +Author: Behdad Esfahbod +Date: Fri Jul 15 12:55:31 2022 -0600 + + [ft] Implement loading (color) bitmap fonts + + Fixes https://github.com/harfbuzz/harfbuzz/issues/489 + + Something about the vertical metrics is still off, not matching + hb-ot. I cannot figure out what. + + src/hb-ft.cc | 92 ++++++++++++++++++++++++++++++++++++------------------------ + 1 file changed, 56 insertions(+), 36 deletions(-) + +commit 3ac110560dc3f103d4b95e543afc6e4b6c302728 +Author: Behdad Esfahbod +Date: Fri Jul 15 12:48:11 2022 -0600 + + [ft] Fix scale when font-sizes are negative + + src/hb-ft.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d68507d06212904661d51907e81012f3ce21821c +Author: Behdad Esfahbod +Date: Thu Jul 14 11:20:00 2022 -0600 + + [arabic] Pause after calt only if no rclt + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1573 + + src/hb-ot-map.cc | 15 +++++++++++++++ + src/hb-ot-map.hh | 2 ++ + src/hb-ot-shaper-arabic.cc | 14 +++++++------- + 3 files changed, 24 insertions(+), 7 deletions(-) + +commit 8b379ddc765dc1912f768dbc903b94ef106e6a32 +Author: Behdad Esfahbod +Date: Thu Jul 14 16:20:04 2022 -0600 + + [test-iter] Add back test of OT namespace iteration + + src/test-iter.cc | 1 + + 1 file changed, 1 insertion(+) + +commit ab21c4c283f2ab37ba4c9ba759d9b92a7eb52b94 +Author: Behdad Esfahbod +Date: Thu Jul 14 16:02:10 2022 -0600 + + [hb-view] Add one to row of padding + + util/helper-cairo-ansi.hh | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 2da36cf99a737d8cf4a145f1f5d540cbb4eb1b95 +Author: Behdad Esfahbod +Date: Thu Jul 14 15:57:43 2022 -0600 + + [hb-view] Use envvar HB_CHAFA=0 to disable Chafa output + + util/helper-cairo-ansi.hh | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 76e6feb77f373a47fa035620e518daee199e66c9 +Author: Behdad Esfahbod +Date: Thu Jul 14 13:45:39 2022 -0600 + + [util/ansi] Enable all symbols in Chafa + + Gives vastly smoother output. The previous setting was + equivalent to our in-house renderer. + + util/helper-cairo-ansi.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 679c87ca369b4bac851cd7c70b09b6187cacf03a +Author: Behdad Esfahbod +Date: Thu Jul 14 13:39:14 2022 -0600 + + [util/ansi] Fix chafa cell width/height + + No idea why it was set to 10/20 instead of 8/16. + + util/helper-cairo-ansi.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b706be540c4db61e228ac0433ee9b88e5286d50b +Author: Behdad Esfahbod +Date: Thu Jul 14 11:03:04 2022 -0600 + + [mingw32] Update instructions + + README.mingw.md | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 5363e40de13425938bc833ae2b6c1d9d565bcf65 +Author: Garret Rieger +Date: Wed Jul 13 23:03:54 2022 +0000 + + [reorg] update build files. + + src/Makefile.sources | 5 +++++ + src/meson.build | 5 +++++ + 2 files changed, 10 insertions(+) + +commit d82ace5c6feba702eea0d869273f5c3090139d0a +Author: Garret Rieger +Date: Wed Jul 13 23:00:01 2022 +0000 + + [reorg] add TODO to RangeRecord. + + src/OT/Layout/Common/RangeRecord.hh | 4 ++++ + 1 file changed, 4 insertions(+) + +commit c1e280ea7824a06c8f3bc14714a255c8e2b35aa3 +Author: Garret Rieger +Date: Wed Jul 13 22:43:38 2022 +0000 + + [reorg] Move Coverage, RangeRecord into new namespace layout. + + src/OT/Layout/Common/Coverage.hh | 323 +++++++++++++++++ + src/OT/Layout/Common/CoverageFormat1.hh | 120 +++++++ + src/OT/Layout/Common/CoverageFormat2.hh | 224 ++++++++++++ + src/OT/Layout/Common/RangeRecord.hh | 75 ++++ + src/OT/Layout/types.hh | 64 ++++ + src/hb-ot-layout-common.hh | 601 +------------------------------- + src/test-iter.cc | 2 - + src/test-serialize.cc | 3 +- + 8 files changed, 816 insertions(+), 596 deletions(-) + +commit 9c2518988dcdafb8388f8f1f5e76db6e08ef6a0e +Author: Garret Rieger +Date: Wed Jul 13 22:55:58 2022 +0000 + + [repack] Don't count space isolation against round limit. + + Restore max rounds to 20 but don't count space isolation against the limit. The number of iterations space isolation can make changes for is already bounded to a reasonable max (the number of lookups in the font) so no need to cap the number of iterations. + + src/hb-repacker.hh | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit a2f0723148e8bdca7a024929cb8dba6961f26485 +Author: Behdad Esfahbod +Date: Wed Jul 13 16:02:39 2022 -0600 + + [GPOS] Adjust mark attachment on multiple substitution some more + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1545 + + src/OT/Layout/GPOS/MarkBasePosFormat1.hh | 1 + + .../fonts/7c24183f26d60df414578a0a9f5e79ab9d32a22b.ttf | Bin 0 -> 2544 bytes + test/shape/data/in-house/tests/use.tests | 1 + + 3 files changed, 2 insertions(+) + +commit ac216972abd3803947d4f2208380648965d26e94 +Author: Behdad Esfahbod +Date: Wed Jul 13 15:32:19 2022 -0600 + + [subset] Add table size blowup bound + + Fixes https://github.com/harfbuzz/harfbuzz/issues/3091 + + src/hb-subset.cc | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 4b3afafb000f7aa0fbad3695a5faf7ef68c77897 +Author: Behdad Esfahbod +Date: Wed Jul 13 15:13:07 2022 -0600 + + [array] Use hb_swap() in reverse() + + src/hb-array.hh | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +commit 87167acfe3aee9e23b2a256f6e3785ee4de5122e +Merge: a369ab133 7549d447b +Author: Behdad Esfahbod +Date: Wed Jul 13 14:58:09 2022 -0600 + + Merge pull request #3704 from harfbuzz/64k + + Towards breaking the 64k in GSUB/GPOS + +commit a369ab133b77d17fe58abdac613d8e33215c0820 +Author: Garret Rieger +Date: Wed Jul 13 19:00:08 2022 +0000 + + [repacker] Increase max_rounds when called via public api. + + src/hb-repacker.hh | 2 +- + src/hb-subset-repacker.cc | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 4ee471922d6d99a81bbd6582134ac1a4e07bdcb8 +Author: Behdad Esfahbod +Date: Wed Jul 13 10:36:53 2022 -0600 + + More -Wcomma fixes + + Fixes https://github.com/harfbuzz/harfbuzz/issues/3716 + + src/hb-algs.hh | 2 +- + src/hb-ot-metrics.cc | 12 ++++++------ + 2 files changed, 7 insertions(+), 7 deletions(-) + +commit c2712ff4f5451145e28c760841646313bc0b8873 +Author: Behdad Esfahbod +Date: Wed Jul 13 13:34:11 2022 -0600 + + Reorder hb_ot_shaper_t members to save 8 bytes of data per shaper + + src/hb-ot-shaper-arabic.cc | 4 ++-- + src/hb-ot-shaper-default.cc | 8 ++++---- + src/hb-ot-shaper-hangul.cc | 4 ++-- + src/hb-ot-shaper-hebrew.cc | 4 ++-- + src/hb-ot-shaper-indic.cc | 4 ++-- + src/hb-ot-shaper-khmer.cc | 4 ++-- + src/hb-ot-shaper-myanmar.cc | 8 ++++---- + src/hb-ot-shaper-thai.cc | 4 ++-- + src/hb-ot-shaper-use.cc | 4 ++-- + src/hb-ot-shaper.hh | 16 ++++++++-------- + 10 files changed, 30 insertions(+), 30 deletions(-) + +commit e5f0bc8f0a903db5f7080bf9116fd258cbb036c0 +Author: Behdad Esfahbod +Date: Wed Jul 13 13:22:34 2022 -0600 + + [set] Save a few kilobytes via type erasure of process() + + src/hb-bit-set.hh | 17 ++++++++++++----- + 1 file changed, 12 insertions(+), 5 deletions(-) + +commit 42da7da5efe76057b177ed9589947d7b1982435e +Author: Behdad Esfahbod +Date: Wed Jul 13 12:46:36 2022 -0600 + + Fix HB_NO_SHAPER HB_NO_OT_SHAPE build + + src/hb-shape-plan.cc | 2 +- + src/hb-shaper.cc | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 015aecfcdd82382e19e85dd4c396ce45667f2548 +Author: Behdad Esfahbod +Date: Wed Jul 13 12:15:01 2022 -0600 + + [use-table] Port to using packtab + + Saves around 9kb. + + src/gen-use-table.py | 69 +- + src/hb-ot-shaper-use-table.hh | 1690 +++++++---------------------------------- + src/hb-ot-shaper-use.cc | 2 +- + 3 files changed, 266 insertions(+), 1495 deletions(-) + +commit 0fcd1decb7ab9bf0b298b302bdd51976620119ab +Author: Behdad Esfahbod +Date: Wed Jul 13 12:17:35 2022 -0600 + + Fix file permissions + + src/fix_get_types.py | 0 + src/gen-arabic-pua.py | 0 + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 7549d447ba4bb1ef031dedbde764690ff082b22a +Author: Behdad Esfahbod +Date: Mon Jul 11 21:52:25 2022 -0600 + + [>64k:glyf] Implement composites for >64k + + Implements https://github.com/be-fonts/boring-expansion-spec/issues/42 + + src/OT/glyf/CompositeGlyph.hh | 36 ++++++++++++++++++++++++++++++------ + 1 file changed, 30 insertions(+), 6 deletions(-) + +commit 09de94788b3c588542e6f3f50b6d73577dca8456 +Author: Behdad Esfahbod +Date: Mon Jul 11 15:08:22 2022 -0600 + + [>64k:glyf] Hid composite glyphIndex + + src/OT/glyf/CompositeGlyph.hh | 4 ++++ + src/OT/glyf/Glyph.hh | 2 +- + src/OT/glyf/SubsetGlyph.hh | 4 ++-- + src/hb-subset-plan.cc | 2 +- + 4 files changed, 8 insertions(+), 4 deletions(-) + +commit df7eebf40a080655bd56795b5d3c57f4cce03f08 +Author: Behdad Esfahbod +Date: Mon Jul 11 14:14:55 2022 -0600 + + [>64k:layout] Fix layout of RangeRecord + + https://github.com/be-fonts/boring-expansion-spec/issues/30 + + src/hb-ot-layout-common.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 99f017f41dfcb2add11d3f9e748882d7fe061132 +Author: Behdad Esfahbod +Date: Mon Jul 11 13:13:19 2022 -0600 + + [>64k:layout:GSUBGPOS] Implement format 2 + + Implements https://github.com/be-fonts/boring-expansion-spec/issues/58 + + Subset does NOT lower format. + + src/hb-ot-layout-gsubgpos.hh | 35 ++++++++++++++++++++++++++++++----- + 1 file changed, 30 insertions(+), 5 deletions(-) + +commit 9ef9fc01148ace504d38ecf304f0e49827e4d27b +Author: Behdad Esfahbod +Date: Mon Jul 11 13:29:23 2022 -0600 + + [>64k:layout] Templatize GSUBGPOSFormat1 + + src/hb-open-type.hh | 2 +- + src/hb-ot-layout-common.hh | 4 ++-- + src/hb-ot-layout-gsubgpos.hh | 12 ++++++------ + 3 files changed, 9 insertions(+), 9 deletions(-) + +commit 5fd0a3f0b9235a50a72e3a89fb8ae41a28fc049e +Author: Behdad Esfahbod +Date: Mon Jul 11 13:10:04 2022 -0600 + + [>64k:layout] Templatize GSUBGPOSFormat1 + + src/hb-ot-layout-common.hh | 3 ++- + src/hb-ot-layout-gsubgpos.hh | 15 ++++++++------- + 2 files changed, 10 insertions(+), 8 deletions(-) + +commit f6c2aaeea46bc10833d225d1514a96254a3e6434 +Author: Behdad Esfahbod +Date: Mon Jul 11 13:06:48 2022 -0600 + + [>64k:layout] Add List16OfOffsetTo + + src/hb-open-type.hh | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 6d0e3e677be11f330c44f5e1037f61d268f6a621 +Author: Behdad Esfahbod +Date: Mon Jul 11 12:28:53 2022 -0600 + + [>64k:layout] Split GSUBGPOSVersion1 into own struct + + src/hb-ot-layout-gsubgpos.hh | 280 +++++++++++++++++++++++++++---------------- + 1 file changed, 175 insertions(+), 105 deletions(-) + +commit 04c5cd4085837cf627aaab328b142a73de6a9c93 +Author: Behdad Esfahbod +Date: Mon Jul 11 11:39:41 2022 -0600 + + [subset/layout] Move find_duplicate_features to subset from layout + + src/hb-ot-layout-gsubgpos.hh | 62 ---------------------------------------- + src/hb-subset-plan.cc | 67 +++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 66 insertions(+), 63 deletions(-) + +commit 1bf8fa2f1f67a4f72d14c53bc4242e38e46ab475 +Author: Behdad Esfahbod +Date: Fri Jul 8 14:22:21 2022 -0600 + + [>64k:layout:(Chain)Context] Implement format 4 + + Implements rest of https://github.com/be-fonts/boring-expansion-spec/issues/34 + + Subset does NOT lower format. + + src/hb-ot-layout-gsubgpos.hh | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 0f13eb1f5ceee50be88a9c5864b0d80a3266b7a5 +Author: Behdad Esfahbod +Date: Fri Jul 8 13:43:33 2022 -0600 + + [>64k:layout] Templatize (Chain)ContextFormat1 + + src/hb-ot-layout-gsubgpos.hh | 64 ++++++++++++++++++++++++++++++-------------- + 1 file changed, 44 insertions(+), 20 deletions(-) + +commit d1f58e5979bb8227e1136fbf72facce7c2e9bb7c +Author: Behdad Esfahbod +Date: Fri Jul 8 13:25:07 2022 -0600 + + [>64k:layout:(Chain)Context] Implement format 5 + + Implements part of https://github.com/be-fonts/boring-expansion-spec/issues/34 + + Subset does NOT lower format. + + src/hb-ot-layout-gsubgpos.hh | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit a90c5af9d2a9b3fdbf083359d2d6ab7ba73d35e6 +Author: Behdad Esfahbod +Date: Fri Jul 8 13:11:47 2022 -0600 + + [>64k:layout] Templatize (Chain)ContextFormat2 + + src/hb-ot-layout-gsubgpos.hh | 48 +++++++++++++++++++++++--------------------- + 1 file changed, 25 insertions(+), 23 deletions(-) + +commit cc83b0b8fde5a6ac5e1800663238c4c9354da1ec +Author: Behdad Esfahbod +Date: Fri Jul 8 12:25:15 2022 -0600 + + [>64k:layout:MarkBasePos/MarkMarkPos/MarkLigPos] Implement format 2 + + Implements https://github.com/be-fonts/boring-expansion-spec/issues/40 + + Subset does NOT lower format. + + src/OT/Layout/GPOS/MarkBasePos.hh | 6 ++++++ + src/OT/Layout/GPOS/MarkLigPos.hh | 6 ++++++ + src/OT/Layout/GPOS/MarkMarkPos.hh | 6 ++++++ + 3 files changed, 18 insertions(+) + +commit 4b43070e2f67b2ea42673056f3f38b87ee9e5a06 +Author: Behdad Esfahbod +Date: Fri Jul 8 12:22:16 2022 -0600 + + [>64k:layout] Templatize MarkBasePos/MarkMarkPos/MarkLigPos + + src/OT/Layout/GPOS/MarkBasePos.hh | 4 ++-- + src/OT/Layout/GPOS/MarkBasePosFormat1.hh | 13 +++++++------ + src/OT/Layout/GPOS/MarkLigPos.hh | 4 ++-- + src/OT/Layout/GPOS/MarkLigPosFormat1.hh | 13 +++++++------ + src/OT/Layout/GPOS/MarkMarkPos.hh | 4 ++-- + src/OT/Layout/GPOS/MarkMarkPosFormat1.hh | 13 +++++++------ + 6 files changed, 27 insertions(+), 24 deletions(-) + +commit f0d6dda5a61649226ddf82b41a611c147d19729f +Author: Behdad Esfahbod +Date: Thu Jul 7 16:28:24 2022 -0600 + + [>64k:layout:PairPos] Implement format 3 + + Implements rest of https://github.com/be-fonts/boring-expansion-spec/issues/38 + + Subset does NOT lower format. + + src/OT/Layout/GPOS/PairPos.hh | 4 +++- + src/OT/Layout/GPOS/PairPosFormat1.hh | 12 ++++++------ + 2 files changed, 9 insertions(+), 7 deletions(-) + +commit 298ee47c55640c1ea68409451cf4bad979cafebd +Author: Behdad Esfahbod +Date: Thu Jul 7 16:27:49 2022 -0600 + + [>64k:layout] Templatize PairPosFormat1 + + src/OT/Layout/GPOS/PairPos.hh | 2 +- + src/OT/Layout/GPOS/PairPosFormat1.hh | 8 ++++++-- + src/OT/Layout/GPOS/PairSet.hh | 8 ++++++-- + src/OT/Layout/GPOS/PairValueRecord.hh | 7 +++++-- + 4 files changed, 18 insertions(+), 7 deletions(-) + +commit e9f8010fd0ca12ff008e72e669e4ce5c0f1fa836 +Author: Behdad Esfahbod +Date: Thu Jul 7 13:55:26 2022 -0600 + + [>64k:layout:PairPos] Templatize & implement format 4 + + Implements part of https://github.com/be-fonts/boring-expansion-spec/issues/38 + + Subset does NOT lower format. + + src/OT/Layout/GPOS/PairPos.hh | 12 +++++++++--- + src/OT/Layout/GPOS/PairPosFormat2.hh | 11 ++++++----- + 2 files changed, 15 insertions(+), 8 deletions(-) + +commit ecd8bc5a9cc9ec1616a4f20cc98319fa839c2067 +Author: Behdad Esfahbod +Date: Wed Jul 6 17:49:56 2022 -0600 + + [>64k:layout:LigatureSubst] Implement format 2 + + Implements https://github.com/be-fonts/boring-expansion-spec/issues/33 + + Subset does NOT lower format. + + src/OT/Layout/GSUB/LigatureSubst.hh | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit 9d0e9faa4358b9800989918fa4710694aa3cb732 +Author: Behdad Esfahbod +Date: Wed Jul 6 17:49:07 2022 -0600 + + [>64k:layout] Templatable bunch of GSUBGPOS internal functions + + src/hb-ot-layout-gsubgpos.hh | 66 +++++++++++++++++++++++++++----------------- + 1 file changed, 41 insertions(+), 25 deletions(-) + +commit 429b387a6f620dc590a3d22e4274519b4f220321 +Author: Behdad Esfahbod +Date: Wed Jul 6 17:37:11 2022 -0600 + + [>64k:layout] Support HBUINT24 in skippy_iter + + src/hb-ot-layout-gsubgpos.hh | 61 ++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 53 insertions(+), 8 deletions(-) + +commit 1ef67a6d6663b8cc50bdea1a67775e9fc95f9dc8 +Author: Behdad Esfahbod +Date: Wed Jul 6 17:28:02 2022 -0600 + + [gsubgpos] Remove HBUINT16 from matcher + + src/hb-ot-layout-gsubgpos.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 704e696ad08db74b45baff78acac8ebe53589edb +Author: Behdad Esfahbod +Date: Wed Jul 6 14:19:20 2022 -0600 + + [>64k:layout] Templatize LigatureSubst + + src/OT/Layout/GSUB/Ligature.hh | 10 ++++++---- + src/OT/Layout/GSUB/LigatureSet.hh | 13 +++++++------ + src/OT/Layout/GSUB/LigatureSubst.hh | 4 ++-- + src/OT/Layout/GSUB/LigatureSubstFormat1.hh | 21 +++++++++++---------- + 4 files changed, 26 insertions(+), 22 deletions(-) + +commit 27d24212db0c61cf2802409e55a55dff39590dd4 +Author: Behdad Esfahbod +Date: Wed Jul 6 14:05:21 2022 -0600 + + [>64k:layout:AlternateSubst] Implement format 2 + + Implements rest of https://github.com/be-fonts/boring-expansion-spec/issues/32 + + Subset does NOT lower format. + + src/OT/Layout/GSUB/AlternateSubst.hh | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit c53d3ad51eddc9a6945aa07e64c85bdb20f3cdcd +Author: Behdad Esfahbod +Date: Wed Jul 6 14:03:45 2022 -0600 + + [>64k:layout] Templatize AlternateSet + + src/OT/Layout/GSUB/AlternateSet.hh | 3 ++- + src/OT/Layout/GSUB/AlternateSubst.hh | 4 ++-- + src/OT/Layout/GSUB/AlternateSubstFormat1.hh | 13 +++++++------ + 3 files changed, 11 insertions(+), 9 deletions(-) + +commit a58a48622adc2d24daefbc62b1e71e5d850a0f58 +Author: Behdad Esfahbod +Date: Wed Jul 6 13:58:35 2022 -0600 + + [>64k:layout:MultipleSubst] Implement format 2 + + Implements part of https://github.com/be-fonts/boring-expansion-spec/issues/32 + + Subset is NOT updated to lower format. + + src/OT/Layout/GSUB/MultipleSubst.hh | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit 684c8fcea7a1ac91dcef256d6242a68445664dd4 +Author: Behdad Esfahbod +Date: Wed Jul 6 13:37:52 2022 -0600 + + [>64k:layout] Templatize MultipleSubst + + src/OT/Layout/GSUB/MultipleSubst.hh | 4 ++-- + src/OT/Layout/GSUB/MultipleSubstFormat1.hh | 13 +++++++------ + src/OT/Layout/GSUB/Sequence.hh | 3 ++- + 3 files changed, 11 insertions(+), 9 deletions(-) + +commit 8775e9b4a4f985ec29bba609b7fc53424f24834c +Author: Behdad Esfahbod +Date: Wed Jul 6 13:28:17 2022 -0600 + + [>64k:layout:SingleSubst] Implement format 3/4 + + Implements https://github.com/be-fonts/boring-expansion-spec/issues/31 + + src/OT/Layout/GSUB/SingleSubst.hh | 32 ++++++++++++++++++++++++++++++-- + src/OT/Layout/GSUB/SingleSubstFormat2.hh | 2 +- + 2 files changed, 31 insertions(+), 3 deletions(-) + +commit e3caf8d50a2c033039c2609b7bf6ebae302741a7 +Author: Behdad Esfahbod +Date: Wed Jul 6 13:11:53 2022 -0600 + + [>64k:layout] Templatize SingleSubst + + src/OT/Layout/GSUB/SingleSubst.hh | 6 +++--- + src/OT/Layout/GSUB/SingleSubstFormat1.hh | 10 ++++++---- + src/OT/Layout/GSUB/SingleSubstFormat2.hh | 9 +++++---- + 3 files changed, 14 insertions(+), 11 deletions(-) + +commit ca5c8a64191e7bb7ccd79687d1c2c4e7231cbdd7 +Author: Behdad Esfahbod +Date: Wed Jul 6 13:02:49 2022 -0600 + + [>64k:layout:Coverage] Implement format 3/4 + + Implements rest of https://github.com/be-fonts/boring-expansion-spec/issues/30 + + src/hb-ot-layout-common.hh | 65 ++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 65 insertions(+) + +commit 25de6fb4e7153fee6ce1792aa2c24c556726a116 +Author: Behdad Esfahbod +Date: Wed Jul 6 12:52:03 2022 -0600 + + [>64k:layout:ClassDef] Implement format 3/4 + + This implements part of https://github.com/be-fonts/boring-expansion-spec/issues/30 + + src/hb-ot-layout-common.hh | 59 ++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 57 insertions(+), 2 deletions(-) + +commit 9286526f3746b7fec0624141632e7859775717cf +Author: Behdad Esfahbod +Date: Wed Jul 6 12:26:58 2022 -0600 + + [>64k:layout] Templatize Coverage & ClassDef + + Have not added new formats yet. + + src/hb-ot-layout-common.hh | 76 +++++++++++++++++++++++++--------------------- + 1 file changed, 41 insertions(+), 35 deletions(-) + +commit e8cce9d1b3211550b584728c2c5b9a4a6d9efb09 +Author: Behdad Esfahbod +Date: Tue Jul 5 14:05:43 2022 -0600 + + [>64k:layout] Add SmallTypes & MediumTypes + + src/hb-ot-layout-common.hh | 28 +++++++++++++++++++++++++++- + 1 file changed, 27 insertions(+), 1 deletion(-) + +commit d8f9d517801c5c361f329764329731bc0bde950f +Author: Behdad Esfahbod +Date: Tue Jul 12 13:19:31 2022 -0600 + + [hashmap] Add keys_ref() and values_ref() + + src/hb-map.hh | 12 ++++++++++++ + src/test-map.cc | 7 +++++++ + 2 files changed, 19 insertions(+) + +commit cddcb31065939928050f2804b7a1fc0b69e10c76 +Author: Behdad Esfahbod +Date: Tue Jul 12 13:15:38 2022 -0600 + + [vector] Remove residual nullptr_t from when hashmap needed it + + src/hb-vector.hh | 1 - + 1 file changed, 1 deletion(-) + +commit 46a36771f4369994df67535e15ac7af71fad345a +Author: Behdad Esfahbod +Date: Tue Jul 12 12:03:00 2022 -0600 + + [draw] Fix leak from e0a5231657a6f09ca4afc93e1b2224eba7a0b544 + + src/hb-draw.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit f8544cbfc09cbd52cdb7f9241df2eeb2262a9f68 +Author: Behdad Esfahbod +Date: Tue Jul 12 11:52:33 2022 -0600 + + [draw] Fix regression from e0a5231657a6f09ca4afc93e1b2224eba7a0b544 + + src/hb-draw.cc | 1 + + 1 file changed, 1 insertion(+) + +commit d15041be7dbbfbd17f1ec21f3acf4a6c6e91ba9f +Author: Behdad Esfahbod +Date: Mon Jul 11 13:39:21 2022 -0600 + + [GSUB/GPOS] Trace toplevel sanitize + + src/OT/Layout/GPOS/GPOS.hh | 5 ++++- + src/OT/Layout/GSUB/GSUB.hh | 5 ++++- + 2 files changed, 8 insertions(+), 2 deletions(-) + +commit 7c4e9080c0f135c1f82e71b946e7883b91a81d0f +Author: Behdad Esfahbod +Date: Mon Jul 11 14:01:52 2022 -0600 + + [sanitize] Minor trace format fixup + + This likely() is unlikely to make a difference, and obscures + the return_trace() message by writing out "something" instead + of the true/false value. + + src/hb-aat-layout-bsln-table.hh | 4 ++-- + src/hb-aat-layout-feat-table.hh | 2 +- + src/hb-aat-layout-just-table.hh | 12 ++++++------ + src/hb-aat-layout-kerx-table.hh | 2 +- + src/hb-aat-layout-opbd-table.hh | 2 +- + src/hb-open-type.hh | 4 ++-- + src/hb-ot-color-colr-table.hh | 2 +- + src/hb-ot-layout-base-table.hh | 2 +- + src/hb-ot-post-table.hh | 8 ++++---- + src/hb-ot-stat-table.hh | 12 ++++++------ + 10 files changed, 25 insertions(+), 25 deletions(-) + +commit d826a5920cc6dec5d942768f1c44e1a155de87c2 +Author: Matthias Clasen +Date: Sat Jul 9 21:57:25 2022 -0400 + + docs: Clarify 0xFFFF as palette index + + Mention that a palette index of 0xFFFF + means to use the foreground color. + + src/hb-ot-color.h | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 0cd404d0b815898afc695de6e68f0177c43056e4 +Author: jfkthame +Date: Sat Jul 9 20:23:22 2022 +0100 + + Typo fix in hb-subset + + s/substract/subtract/ + + util/hb-subset.cc | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 6d051f4018e21ce1ec93fe4876c4a15819d0940a +Author: Behdad Esfahbod +Date: Fri Jul 8 14:08:51 2022 -0600 + + [layout] Simplify StructAfter<> usage + + src/hb-ot-layout-gsubgpos.hh | 107 ++++++++++++++++++++++--------------------- + 1 file changed, 54 insertions(+), 53 deletions(-) + +commit 5192294f83a0f6be13bbf7a7c38b9cf4a38d33b2 +Author: Behdad Esfahbod +Date: Fri Jul 8 14:00:24 2022 -0600 + + . + + .../Layout/GSUB/ReverseChainSingleSubstFormat1.hh | 22 ++-- + src/hb-ot-layout-gsubgpos.hh | 124 ++++++++++----------- + 2 files changed, 73 insertions(+), 73 deletions(-) + +commit 29f149c16cdee85a1cd2d953e307e27262deee1a +Author: Garret Rieger +Date: Thu Jul 7 20:16:16 2022 +0000 + + [subset] cache sanitized tables in subset plan to avoid sanitizing tables multiple times. + + src/hb-subset-plan.cc | 39 +++++++++++++++++++++++++-------------- + src/hb-subset-plan.hh | 21 +++++++++++++++++++++ + src/hb-subset.cc | 16 ++++++++-------- + 3 files changed, 54 insertions(+), 22 deletions(-) + +commit 8b349e1139dfdc8e29d1d19734bff8941024bf2a +Author: Behdad Esfahbod +Date: Wed Jul 6 17:22:34 2022 -0600 + + [gsubgpos] Remove HBUINT16 from match functions signatures + + src/hb-ot-layout-gsubgpos.hh | 37 ++++++++++++++++++++----------------- + 1 file changed, 20 insertions(+), 17 deletions(-) + +commit f114b18c5871f891c4e59a9d698f7be9eb8df557 +Author: Behdad Esfahbod +Date: Wed Jul 6 17:31:46 2022 -0600 + + [gsubgpos] Break skippy_iter set_match_func into two + + src/hb-ot-layout-gsubgpos.hh | 15 ++++++++++----- + 1 file changed, 10 insertions(+), 5 deletions(-) + +commit 8a107125a5637583ec80256f59dbb348e774863e +Author: Behdad Esfahbod +Date: Wed Jul 6 13:46:30 2022 -0600 + + [layout] Make SubstLookup:serialize_single take iterators + + src/OT/Layout/GSUB/SubstLookup.hh | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit 8a971d01e98c98dc8848ca1e89894f6dddb73f91 +Author: Behdad Esfahbod +Date: Wed Jul 6 12:37:43 2022 -0600 + + [layout] Use is_source_of instead of is_iterator + + src/hb-ot-layout-common.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 0dc0da054d03584a1526ce852d0d3c7839e1d630 +Author: Behdad Esfahbod +Date: Wed Jul 6 12:33:37 2022 -0600 + + [iter] Add hb_is_sorted_iterator(_of) + + src/hb-iter.hh | 2 ++ + src/hb-ot-layout-common.hh | 6 +++--- + 2 files changed, 5 insertions(+), 3 deletions(-) + +commit 2c67261723a9a3081ee89549b89a3409ac8306fb +Author: Behdad Esfahbod +Date: Wed Jul 6 12:26:16 2022 -0600 + + [open-type] Add HBGlyph24 + + src/hb-open-type.hh | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 7cfe7fe651fbf479db75e4f96869b9248227f728 +Author: Behdad Esfahbod +Date: Wed Jul 6 12:25:54 2022 -0600 + + [null] Change null bytes for RangeRecord + + Should be harmless. + + src/hb-static.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 486555c6916750a97f1e35f506447594bf03639f +Author: Behdad Esfahbod +Date: Tue Jul 5 17:12:59 2022 -0600 + + [open-type] Add Array24Of<> and SortedArray24Of<> + + src/hb-open-type.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 1e503f587b3ce368b6b759c1927aa9708096c8f3 +Author: Behdad Esfahbod +Date: Tue Jul 5 15:44:58 2022 -0600 + + [null] Add DECLARE_NULL_NAMESPACE_BYTES_TEMPLATE1 + + src/hb-aat-layout-common.hh | 13 +------------ + src/hb-null.hh | 13 ++++++++++++- + src/hb-static.cc | 3 +-- + 3 files changed, 14 insertions(+), 15 deletions(-) + +commit ea11029a6e72be7b5f0f3b815dd7b78a105195fa +Author: Behdad Esfahbod +Date: Fri Jul 8 11:58:43 2022 -0600 + + [GPOS] Split LigatureArray.hh + + src/Makefile.sources | 1 + + src/OT/Layout/GPOS/LigatureArray.hh | 56 +++++++++++++++++++++++++++++++++ + src/OT/Layout/GPOS/MarkLigPosFormat1.hh | 43 ++----------------------- + src/meson.build | 1 + + 4 files changed, 60 insertions(+), 41 deletions(-) + +commit 68b2742fe4eebddf0a8388ca8c57be41e45cee41 +Author: Behdad Esfahbod +Date: Thu Jul 7 16:11:15 2022 -0600 + + [GPOS] Move code around + + src/OT/Layout/GPOS/PairPosFormat1.hh | 1 - + src/OT/Layout/GPOS/PairSet.hh | 60 +++++++++++++++++------------------ + src/OT/Layout/GPOS/PairValueRecord.hh | 18 +++++------ + 3 files changed, 39 insertions(+), 40 deletions(-) + +commit 6a3043a0c146d01f878c4d3b446cb8ff8c52ae7c +Author: Behdad Esfahbod +Date: Thu Jul 7 14:51:37 2022 -0600 + + Fix tests + + src/OT/Layout/GPOS/PairSet.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit aa68657434f186f6792d2facda085859b15bbae5 +Author: Behdad Esfahbod +Date: Thu Jul 7 14:07:45 2022 -0600 + + [Makefile.sources/meson.build] Sort file names + + src/Makefile.sources | 90 ++++++++++++++++++++++++++-------------------------- + src/meson.build | 90 ++++++++++++++++++++++++++-------------------------- + 2 files changed, 90 insertions(+), 90 deletions(-) + +commit 0b0e3b30ce44b3f305d85827780d374bd94ff077 +Author: Behdad Esfahbod +Date: Thu Jul 7 14:06:44 2022 -0600 + + [GPOS] Break down PairPosFormat1 into new layout + + src/Makefile.sources | 2 + + src/OT/Layout/GPOS/PairPosFormat1.hh | 234 +--------------------------------- + src/OT/Layout/GPOS/PairSet.hh | 169 ++++++++++++++++++++++++ + src/OT/Layout/GPOS/PairValueRecord.hh | 94 ++++++++++++++ + src/meson.build | 2 + + 5 files changed, 269 insertions(+), 232 deletions(-) + +commit aec34e17eb69b67cb0beb5d2f50f544b6f95d22c +Author: Not-a-Bug Won't Fix +Date: Thu Jul 7 15:42:51 2022 +0300 + + Fix target_link_libraries signatures mixing + + CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a64fc71033a4cff9bb5911ee28ac45ba93f4867a +Merge: 3a722c535 6fad6b411 +Author: Behdad Esfahbod +Date: Thu Jul 7 13:35:38 2022 -0600 + + Merge pull request #3710 from googlefonts/24bit_repacking + + [subset] Prepare the repacker for handling 24bit offsets in GSUB/GPOS. + +commit 6fad6b4113750d3aabea633685bc272f98a2ef83 +Author: Garret Rieger +Date: Wed Jul 6 19:18:27 2022 +0000 + + [repacker] add tests for special casing of 24bit offsets. + + src/test-repacker.cc | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 84 insertions(+) + +commit b4f561dbbf61c7df9b284d1f2d4989b4517fb908 +Author: Garret Rieger +Date: Wed Jul 6 18:49:23 2022 +0000 + + [subset] Add some comments to find_space_roots/find_32_bit_roots methods. + + src/graph/graph.hh | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +commit 401066bf3d20bf8913d340811fd1c61ed65bb5f1 +Author: Garret Rieger +Date: Wed Jul 6 18:44:40 2022 +0000 + + [subset] Prepare the repacker for handling 24bit offsets in GSUB/GPOS. + + The boring expansion (https://github.com/be-fonts/boring-expansion-spec) plans to introduce 24bit offsets into GSUB/GPOS. This changes the repacker to treat 24 bit offsets similar to 32 bit offsets and assign the top level 24 bit offsets into spaces to improve packing. + + src/graph/graph.hh | 73 +++++++++++++++++++++++++++++++++++++++++++----------- + src/hb-repacker.hh | 2 +- + 2 files changed, 59 insertions(+), 16 deletions(-) + +commit 3a722c53545a5e8fb504a81acaa38f230433fadf +Author: Luca Bacci +Date: Wed Jul 6 19:22:38 2022 +0200 + + Fixes for DWrite header checks + + CMakeLists.txt | 11 ++++++++--- + configure.ac | 2 +- + 2 files changed, 9 insertions(+), 4 deletions(-) + +commit c091d029c2038de28f77d104f472b2d3bd417f0c +Merge: 2587dced4 1abc14b46 +Author: Behdad Esfahbod +Date: Wed Jul 6 10:51:04 2022 -0600 + + Merge pull request #3706 from lb90/dwrite-dll + + Load DirectWrite dynamically + +commit 1abc14b4635970b6f6358e0f15505f19d34e3612 +Author: Luca Bacci +Date: Wed Jul 6 17:52:29 2022 +0200 + + Do not link with the DWrite lib + + It's loaded dynamically now + + CMakeLists.txt | 5 ++++- + configure.ac | 4 ---- + meson.build | 7 +------ + src/meson.build | 1 - + 4 files changed, 5 insertions(+), 12 deletions(-) + +commit c22acfa8bd4529583079338150fea4c05abcad41 +Author: Luca Bacci +Date: Wed Jul 6 13:50:47 2022 +0200 + + Fix function pointer typedef + + src/hb-directwrite.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2587dced4ceac75950272949610f6b2780522605 +Merge: 386e1bbad 79eb0f748 +Author: Behdad Esfahbod +Date: Wed Jul 6 09:38:18 2022 -0600 + + Merge pull request #3707 from kleisauke/workaround-gcc-bug + + Fix build on GCC < 7 + +commit 79eb0f74860fb6309e3162b4f17f98481c05a318 +Author: Kleis Auke Wolthuizen +Date: Wed Jul 6 13:29:55 2022 +0200 + + [GSUB] Fix build on GCC < 7 + + src/OT/Layout/GSUB/GSUB.hh | 5 +++-- + src/hb-ot-layout-gsub-table.hh | 8 ++++---- + 2 files changed, 7 insertions(+), 6 deletions(-) + +commit 3238cb744bb570a75326ab4438968c59069e9af2 +Author: Kleis Auke Wolthuizen +Date: Wed Jul 6 13:18:14 2022 +0200 + + [GPOS] Fix build on GCC < 7 + + src/OT/Layout/GPOS/GPOS.hh | 17 ++++++++++------- + src/hb-ot-layout-gpos-table.hh | 6 ++++-- + 2 files changed, 14 insertions(+), 9 deletions(-) + +commit 3e881efbe4e8ad0a6c67112b150205297561c38e +Author: Luca Bacci +Date: Mon Jun 27 14:34:18 2022 +0200 + + Revert "Revert "Revert "[hb-directwrite] Don't load dwrit.dll dynamically""" + + This reverts commit 361a438658dcddea29d7c8b9c68bf2bc88109bde. + + src/hb-directwrite.cc | 36 ++++++++++++++++++++++++++++++++++-- + 1 file changed, 34 insertions(+), 2 deletions(-) + +commit 7b51bc95d9cf0d9a2e91a37319fa34e4e5f26927 +Author: Kleis Auke Wolthuizen +Date: Wed Jul 6 12:58:15 2022 +0200 + + [cplusplus] Fix build on GCC < 7 + + src/hb-cplusplus.hh | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +commit 386e1bbad81e720ac58a1a18c3028d47b27c6de9 +Merge: d9ab805e6 30309ec8d +Author: Behdad Esfahbod +Date: Tue Jul 5 12:46:05 2022 -0600 + + Merge pull request #3699 from googlefonts/filter_scripts + + [subset] Add support for --layout-scripts + +commit 30309ec8d3eb39f6f5c05ff0e7464095c5d7bfbf +Author: Garret Rieger +Date: Tue Jul 5 18:33:19 2022 +0000 + + [subset] add null element in _filter_tag_list. + + src/hb-subset-plan.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 216cf5946bdea85b954c73669c085437f9e99a72 +Author: Garret Rieger +Date: Tue Jul 5 17:49:12 2022 +0000 + + [subset] Allocate space for null entry in script/feature list. + + src/hb-subset-plan.cc | 8 +++----- + src/hb-subset.h | 2 +- + 2 files changed, 4 insertions(+), 6 deletions(-) + +commit d9ab805e61e0d0aca6623203b4d7b68c84b026b8 +Author: Behdad Esfahbod +Date: Tue Jul 5 11:45:10 2022 -0600 + + Fix LookupFlag negation + + Fixes https://github.com/harfbuzz/harfbuzz/issues/3703 + + src/OT/Layout/GPOS/MarkMarkPosFormat1.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b0cb9a1a635e65889e8bb9888b3c48f556d69db9 +Author: Behdad Esfahbod +Date: Sun Jul 3 15:32:32 2022 -0600 + + Make get_leading_bearing return bool + + Fixes https://github.com/harfbuzz/harfbuzz/issues/3496 + + Part of supporting >64k glyphs correctly. + + src/OT/glyf/Glyph.hh | 8 +++++--- + src/OT/glyf/GlyphHeader.hh | 4 +++- + src/OT/glyf/glyf.hh | 13 +++++-------- + src/hb-ot-font.cc | 13 +++++++------ + src/hb-ot-hmtx-table.hh | 45 ++++++++++++++++++++++++++++----------------- + 5 files changed, 48 insertions(+), 35 deletions(-) + +commit 115e1a03e7612a888ed248505ef5bd25a55eedb1 +Author: Behdad Esfahbod +Date: Sun Jul 3 14:45:12 2022 -0600 + + [glyf] Relax condition for matching number of coords + + src/OT/glyf/glyf.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 800760c5bd894687e5ae1ff9b08cc27e5abdfcf6 +Author: Behdad Esfahbod +Date: Sun Jul 3 13:21:06 2022 -0600 + + [glyf] Rename get_extents functions for clarity + + src/OT/glyf/Glyph.hh | 6 +++--- + src/OT/glyf/GlyphHeader.hh | 4 ++-- + src/OT/glyf/glyf.hh | 2 +- + 3 files changed, 6 insertions(+), 6 deletions(-) + +commit ab327f93b79863c598a3497bef82ed9aa43db69e +Author: Behdad Esfahbod +Date: Sun Jul 3 13:17:03 2022 -0600 + + [glyf] Fix another bug with scaling + + Of advances this time. + + That codepath is never exercised though, if font has HVAR table. + + src/OT/glyf/glyf.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f46ddeba48bee8c8f7a8a4ceadc0e02b7d197632 +Author: Behdad Esfahbod +Date: Sun Jul 3 13:12:49 2022 -0600 + + [hmtx/glyf] Rename side-bearing functions for clarity + + src/OT/glyf/Glyph.hh | 4 ++-- + src/OT/glyf/GlyphHeader.hh | 2 +- + src/OT/glyf/glyf.hh | 6 +++--- + src/hb-ot-font.cc | 6 +++--- + src/hb-ot-hmtx-table.hh | 12 ++++++------ + 5 files changed, 15 insertions(+), 15 deletions(-) + +commit 23435d52855b477408548100bb5e5ff3a956b27b +Author: Behdad Esfahbod +Date: Sun Jul 3 13:04:27 2022 -0600 + + [hvar] Rename advance function for clarity + + src/hb-ot-hmtx-table.hh | 6 +++--- + src/hb-ot-var-hvar-table.hh | 6 +++--- + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit 9f974cae4a0f94f069f710ad04541f791d2aef16 +Author: Behdad Esfahbod +Date: Sun Jul 3 13:03:12 2022 -0600 + + [hvar] Rename lsb function for clarity + + src/hb-ot-hmtx-table.hh | 4 ++-- + src/hb-ot-var-hvar-table.hh | 6 +++--- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit ab5ce6431387be417bd312c9579208d902c9e222 +Author: Behdad Esfahbod +Date: Sun Jul 3 13:00:22 2022 -0600 + + [VVAR] Rename vorg function for clarity + + src/hb-ot-font.cc | 6 +++--- + src/hb-ot-var-hvar-table.hh | 6 +++--- + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit b2d60cbd6ebbcaa51291144701312578efd90ebd +Author: Behdad Esfahbod +Date: Sun Jul 3 12:56:48 2022 -0600 + + [glyf] Rename advance functions for clarity + + src/OT/glyf/glyf.hh | 2 +- + src/hb-ot-font.cc | 4 ++-- + src/hb-ot-hmtx-table.hh | 4 ++-- + 3 files changed, 5 insertions(+), 5 deletions(-) + +commit 35c00c1216f85ca543057bb7faff7247c4e8a491 +Author: Behdad Esfahbod +Date: Sun Jul 3 12:54:17 2022 -0600 + + [hmtx] Rename advance functions for clarity + + src/OT/glyf/Glyph.hh | 4 ++-- + src/OT/glyf/glyf.hh | 4 ++-- + src/hb-ot-font.cc | 6 +++--- + src/hb-ot-hmtx-table.hh | 18 +++++++++--------- + 4 files changed, 16 insertions(+), 16 deletions(-) + +commit 6b82d4faa15e6ac00303f086160a61bc8d2027e3 +Author: Behdad Esfahbod +Date: Sun Jul 3 12:45:27 2022 -0600 + + [glyf] Make an optional argument non-optional + + src/OT/glyf/glyf.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 3ef590808fb57cc3879c86ed5bf4c7301a2237da +Author: Behdad Esfahbod +Date: Sun Jul 3 12:44:24 2022 -0600 + + [glyf] Internal flip a variable + + src/OT/glyf/glyf.hh | 28 ++++++++++++++-------------- + 1 file changed, 14 insertions(+), 14 deletions(-) + +commit b07fa2bb1a07712bf5350955573512e60cecd53f +Author: Behdad Esfahbod +Date: Sat Jul 2 13:43:23 2022 -0600 + + [ot-font] Respect VORG even if it has no variations + + src/hb-ot-font.cc | 12 ++++-------- + 1 file changed, 4 insertions(+), 8 deletions(-) + +commit 71d52e10aa353ab5e6161c66aeb00fcc68d510da +Author: Behdad Esfahbod +Date: Sat Jul 2 11:21:36 2022 -0600 + + [var] Fix getting side-bearing variations + + In HVAR/VVAR, if the side-bearing mappings are null, it means the + table does not have them and they should be loaded from glyf table. + Previous logic was returning zer0. + + Part of fixing https://github.com/harfbuzz/harfbuzz/issues/1694 + + src/hb-ot-hmtx-table.hh | 5 +++-- + src/hb-ot-var-hvar-table.hh | 12 ++++++------ + 2 files changed, 9 insertions(+), 8 deletions(-) + +commit 78b4f3982193fdd0714853dd39fa60e5eafeb379 +Author: Behdad Esfahbod +Date: Sat Jul 2 16:37:26 2022 -0600 + + [glyf] Fix confusion between scaled vs unscaled lsb + + Was always broken. + + src/OT/glyf/glyf.hh | 28 ++++++++++++++++++++-------- + 1 file changed, 20 insertions(+), 8 deletions(-) + +commit 6665881c7da58c32e243121809e154eeca33968c +Author: Behdad Esfahbod +Date: Sat Jul 2 11:21:12 2022 -0600 + + [glyf] Change side-bearing rounding + + src/OT/glyf/glyf.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0a295fcde6a07271de27bbbd9ca1b47612427cdf +Author: Behdad Esfahbod +Date: Fri Jul 1 17:16:24 2022 -0600 + + [var] Fix DeltaSetIndexMapFormat1 + + Fixes https://github.com/harfbuzz/harfbuzz/issues/3692 + + src/hb-ot-var-common.hh | 63 ++++++++++--------------------------------------- + 1 file changed, 12 insertions(+), 51 deletions(-) + +commit 351cccdb75c434a46dc6193b71ba71d3d12c1857 +Author: Behdad Esfahbod +Date: Fri Jul 1 16:52:49 2022 -0600 + + [buffer-deserialize] Deserialize glyph flags + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1482 + + src/hb-buffer-deserialize-json.hh | 425 +++++++++++++++------------ + src/hb-buffer-deserialize-json.rl | 31 +- + src/hb-buffer-deserialize-text.hh | 570 ++++++++++++++++++++++++------------ + src/hb-buffer-deserialize-text.rl | 13 +- + src/hb-number-parser.hh | 8 +- + src/hb-ot-shaper-indic-machine.hh | 14 +- + src/hb-ot-shaper-khmer-machine.hh | 14 +- + src/hb-ot-shaper-myanmar-machine.hh | 14 +- + src/hb-ot-shaper-use-machine.hh | 14 +- + src/test-buffer-serialize.cc | 6 +- + 10 files changed, 694 insertions(+), 415 deletions(-) + +commit 5134041f216bbe0941ea5d068e008fc534d0732e +Author: Behdad Esfahbod +Date: Fri Jul 1 16:48:47 2022 -0600 + + [deserialize-json] Make it actually work! + + Was not correctly deserializing glyph names as it was not dropping + double-quotes from glyph name before parsing. + + src/hb-buffer-deserialize-json.hh | 12 ++++++------ + src/hb-buffer-deserialize-json.rl | 2 +- + src/hb-buffer-deserialize-text.hh | 10 +++++----- + 3 files changed, 12 insertions(+), 12 deletions(-) + +commit 534b0911f7e6f95e77edf853be2d90d059012b16 +Author: Behdad Esfahbod +Date: Fri Jul 1 16:20:31 2022 -0600 + + [aat-layout] Add an unlikely() + + src/hb-aat-layout-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b8c7c0a0e6ceb133f8c2e8f4ab15ca1633123fd2 +Author: Behdad Esfahbod +Date: Fri Jul 1 12:11:15 2022 -0600 + + [fuzzer] In 50% of runs don't fail the allocator + + test/fuzzing/hb-draw-fuzzer.cc | 2 +- + test/fuzzing/hb-fuzzer.hh | 16 ++++++++++++++++ + test/fuzzing/hb-set-fuzzer.cc | 2 +- + test/fuzzing/hb-shape-fuzzer.cc | 2 +- + test/fuzzing/hb-subset-fuzzer.cc | 2 +- + 5 files changed, 20 insertions(+), 4 deletions(-) + +commit 14b018124c52da6c7bc8ab93a2c571ca2e8c2f80 +Author: Stephan Bergmann +Date: Mon Aug 9 17:17:48 2021 +0200 + + hb_graphite2_cluster_t::advance can apparently be negative + + ...as seen with HarfBuzz used by LibreOffice, with `instdir/program/soffice + --headless --convert-to pdf` of doc/abi6073-2.doc from the LibreOffice crash- + testing corpus when run under UBSan, + + > hb-graphite2.cc:361:15: runtime error: -1024 is outside the range of representable values of type 'unsigned int' + > #0 in _hb_graphite2_shape at workdir/UnpackedTarball/harfbuzz/src/hb-graphite2.cc:361:15 + > #1 in _hb_shape_plan_execute_internal(hb_shape_plan_t*, hb_font_t*, hb_buffer_t*, hb_feature_t const*, unsigned int) at workdir/UnpackedTarball/harfbuzz/src/./hb-shaper-list.hh:38:1 + > #2 in hb_shape_plan_execute at workdir/UnpackedTarball/harfbuzz/src/hb-shape-plan.cc:453:14 + > #3 in hb_shape_full at workdir/UnpackedTarball/harfbuzz/src/hb-shape.cc:139:19 + > #4 in GenericSalLayout::LayoutText(ImplLayoutArgs&, SalLayoutGlyphsImpl const*) at vcl/source/gdi/CommonSalLayout.cxx:495:23 + > #5 in OutputDevice::getFallbackLayout(LogicalFontInstance*, int, ImplLayoutArgs&, SalLayoutGlyphs const*) const at vcl/source/outdev/font.cxx:1232:21 + > #6 in OutputDevice::ImplGlyphFallbackLayout(std::unique_ptr >, ImplLayoutArgs&, SalLayoutGlyphs const*) const at vcl/source/outdev/font.cxx:1300:48 + > #7 in OutputDevice::ImplLayout(rtl::OUString const&, int, int, Point const&, long, long const*, SalLayoutFlags, vcl::TextLayoutCache const*, SalLayoutGlyphs const*) const at vcl/source/outdev/text.cxx:1332:22 + > #8 in lcl_CreateLayout(SwTextGlyphsKey const&, __gnu_debug::_Safe_iterator >, std::__debug::map, std::allocator > >, std::bidirectional_iterator_tag>) at sw/source/core/txtnode/fntcache.cxx:233:33 + > #9 in SwFntObj::GetCachedSalLayoutGlyphs(SwTextGlyphsKey const&) at sw/source/core/txtnode/fntcache.cxx:257:12 + > #10 in SwFont::GetTextBreak(SwDrawTextInfo const&, long) at sw/source/core/txtnode/fntcache.cxx:2551:58 + > #11 in SwTextSizeInfo::GetTextBreak(long, o3tl::strong_int, unsigned short, vcl::TextLayoutCache const*) const at sw/source/core/text/inftxt.cxx:450:20 + > #12 in SwTextGuess::Guess(SwTextPortion const&, SwTextFormatInfo&, unsigned short) at sw/source/core/text/guess.cxx:205:26 + > #13 in SwTextPortion::Format_(SwTextFormatInfo&) at sw/source/core/text/portxt.cxx:305:32 + > #14 in SwTextPortion::Format(SwTextFormatInfo&) at sw/source/core/text/portxt.cxx:456:12 + > #15 in SwLineLayout::Format(SwTextFormatInfo&) at sw/source/core/text/porlay.cxx:260:31 + + (where in frame #4 GenericSalLayout::LayoutText, pHbBuffer->props.direction is + HB_DIRECTION_RTL, in case that is relevant). + + It is unclear to me whether it is sufficient to only change + hb_graphite2_cluster_t::advance from signed to unsigned int, as there are other + unsigned int variables (like curradv in _hb_graphite2_shape) whose value depend + on hb_graphite2_cluster_t::advance, and which thus might also become negative. + But unlike the float -> unsigned int conversion that UBSan warned about here + (where gr_slot_origin_X() and xscale are float), those are signed int -> + unsigned int conversions that do not cause undefined behavior. At least, with + this change, the above --convert-to pdf and a full `make check screenshot` + succeeded for me under without further UBSan warnings. + + (For the version of HarfBuzz optionally built as part of the LibreOffice build, + this has been addressed with + + "external/harfbuzz: hb_graphite2_cluster_t::advance can apparently be + negative.") + + src/hb-graphite2.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit dbfd2bf3275466ea507a8a41614e4785873213f4 +Author: Garret Rieger +Date: Thu Jun 30 23:04:35 2022 +0000 + + minor. + + src/hb-subset-plan.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d6f579e96affe78919936f24cb54cb18cffe2ea5 +Author: Garret Rieger +Date: Thu Jun 30 22:22:03 2022 +0000 + + [subset] add tests that exercise script filtering. + + ...egular.filter-scripts-features.1FC,21,41,20,62,63.ttf | Bin 0 -> 2856 bytes + ...ular.filter-scripts-features.2.1FC,21,41,20,62,63.ttf | Bin 0 -> 2856 bytes + ...ripts-features.2.61,62,63,64,65,66,67,68,69,6A,6B.ttf | Bin 0 -> 4560 bytes + ...Roboto-Regular.filter-scripts-features.2.61,62,63.ttf | Bin 0 -> 2484 bytes + ...-Regular.filter-scripts-features.2.D7,D8,D9,DA,DE.ttf | Bin 0 -> 2828 bytes + ...scripts-features.61,62,63,64,65,66,67,68,69,6A,6B.ttf | Bin 0 -> 3932 bytes + .../Roboto-Regular.filter-scripts-features.61,62,63.ttf | Bin 0 -> 2484 bytes + ...to-Regular.filter-scripts-features.D7,D8,D9,DA,DE.ttf | Bin 0 -> 2828 bytes + .../Roboto-Regular.filter-scripts.1FC,21,41,20,62,63.ttf | Bin 0 -> 2972 bytes + ...r.filter-scripts.61,62,63,64,65,66,67,68,69,6A,6B.ttf | Bin 0 -> 4140 bytes + .../full-font/Roboto-Regular.filter-scripts.61,62,63.ttf | Bin 0 -> 2600 bytes + .../Roboto-Regular.filter-scripts.D7,D8,D9,DA,DE.ttf | Bin 0 -> 2928 bytes + .../Roboto-Regular.no-scripts.1FC,21,41,20,62,63.ttf | Bin 0 -> 2836 bytes + ...gular.no-scripts.61,62,63,64,65,66,67,68,69,6A,6B.ttf | Bin 0 -> 3912 bytes + .../full-font/Roboto-Regular.no-scripts.61,62,63.ttf | Bin 0 -> 2464 bytes + .../Roboto-Regular.no-scripts.D7,D8,D9,DA,DE.ttf | Bin 0 -> 2808 bytes + ...-Roman.filter-scripts-features.1FC,21,41,20,62,63.ttf | Bin 0 -> 3476 bytes + ...oman.filter-scripts-features.2.1FC,21,41,20,62,63.ttf | Bin 0 -> 3476 bytes + ...ripts-features.2.61,62,63,64,65,66,67,68,69,6A,6B.ttf | Bin 0 -> 8700 bytes + ...Variable-Roman.filter-scripts-features.2.61,62,63.ttf | Bin 0 -> 3476 bytes + ...le-Roman.filter-scripts-features.2.D7,D8,D9,DA,DE.ttf | Bin 0 -> 3948 bytes + ...scripts-features.61,62,63,64,65,66,67,68,69,6A,6B.ttf | Bin 0 -> 6584 bytes + ...ifVariable-Roman.filter-scripts-features.61,62,63.ttf | Bin 0 -> 3476 bytes + ...able-Roman.filter-scripts-features.D7,D8,D9,DA,DE.ttf | Bin 0 -> 3948 bytes + ...fVariable-Roman.filter-scripts.1FC,21,41,20,62,63.ttf | Bin 0 -> 3856 bytes + ...n.filter-scripts.61,62,63,64,65,66,67,68,69,6A,6B.ttf | Bin 0 -> 9548 bytes + ...SourceSerifVariable-Roman.filter-scripts.61,62,63.ttf | Bin 0 -> 3752 bytes + ...SerifVariable-Roman.filter-scripts.D7,D8,D9,DA,DE.ttf | Bin 0 -> 4292 bytes + ...SerifVariable-Roman.no-scripts.1FC,21,41,20,62,63.ttf | Bin 0 -> 3456 bytes + ...Roman.no-scripts.61,62,63,64,65,66,67,68,69,6A,6B.ttf | Bin 0 -> 6564 bytes + .../SourceSerifVariable-Roman.no-scripts.61,62,63.ttf | Bin 0 -> 3456 bytes + ...urceSerifVariable-Roman.no-scripts.D7,D8,D9,DA,DE.ttf | Bin 0 -> 3928 bytes + test/subset/data/profiles/filter-scripts-features.2.txt | 2 ++ + test/subset/data/profiles/filter-scripts-features.txt | 2 ++ + test/subset/data/profiles/filter-scripts.txt | 1 + + test/subset/data/profiles/no-scripts.txt | 1 + + test/subset/data/tests/full-font.tests | 4 ++++ + 37 files changed, 10 insertions(+) + +commit 79bdcbef0d63607ac8f652168848e19651c5819f +Author: Garret Rieger +Date: Thu Jun 30 22:20:32 2022 +0000 + + [subset] Fix GDEF version downgrade logic. + + src/hb-ot-layout-gdef-table.hh | 18 +++++++++++------- + 1 file changed, 11 insertions(+), 7 deletions(-) + +commit 587969af42dad7342871de693bd37683822eb6cf +Author: Garret Rieger +Date: Thu Jun 30 21:37:42 2022 +0000 + + [subset] Drop scripts that are not in the layout_scripts list. + + src/hb-ot-layout-common.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 900476c635b3baaff4b1316d1220d5a073b9b51a +Author: Garret Rieger +Date: Thu Jun 30 19:21:23 2022 +0000 + + Move GSUB.hh GPOS.hh back into the GPOS/GSUB sub directories. + + src/Makefile.sources | 4 ++-- + src/OT/Layout/{ => GPOS}/GPOS.hh | 14 +++++++------- + src/OT/Layout/{ => GSUB}/GSUB.hh | 12 ++++++------ + src/hb-ot-layout-gpos-table.hh | 2 +- + src/hb-ot-layout-gsub-table.hh | 2 +- + src/meson.build | 4 ++-- + 6 files changed, 19 insertions(+), 19 deletions(-) + +commit 5fdae68481a4d53eb5a23285c62986340d7e5715 +Author: Garret Rieger +Date: Wed Jun 29 23:52:08 2022 +0000 + + [reorg] Move GSUB.hh up one level and change GSUB namespace to GSUB_impl. + + src/Makefile.sources | 2 +- + src/OT/Layout/{GSUB => }/GSUB.hh | 21 +++++++++------------ + src/OT/Layout/GSUB/AlternateSet.hh | 2 +- + src/OT/Layout/GSUB/AlternateSubst.hh | 2 +- + src/OT/Layout/GSUB/AlternateSubstFormat1.hh | 2 +- + src/OT/Layout/GSUB/ChainContextSubst.hh | 2 +- + src/OT/Layout/GSUB/Common.hh | 2 +- + src/OT/Layout/GSUB/ContextSubst.hh | 2 +- + src/OT/Layout/GSUB/ExtensionSubst.hh | 2 +- + src/OT/Layout/GSUB/Ligature.hh | 2 +- + src/OT/Layout/GSUB/LigatureSet.hh | 2 +- + src/OT/Layout/GSUB/LigatureSubst.hh | 2 +- + src/OT/Layout/GSUB/LigatureSubstFormat1.hh | 2 +- + src/OT/Layout/GSUB/MultipleSubst.hh | 2 +- + src/OT/Layout/GSUB/MultipleSubstFormat1.hh | 2 +- + src/OT/Layout/GSUB/ReverseChainSingleSubst.hh | 2 +- + .../Layout/GSUB/ReverseChainSingleSubstFormat1.hh | 2 +- + src/OT/Layout/GSUB/Sequence.hh | 2 +- + src/OT/Layout/GSUB/SingleSubst.hh | 2 +- + src/OT/Layout/GSUB/SingleSubstFormat1.hh | 2 +- + src/OT/Layout/GSUB/SingleSubstFormat2.hh | 2 +- + src/OT/Layout/GSUB/SubstLookup.hh | 2 +- + src/OT/Layout/GSUB/SubstLookupSubTable.hh | 2 +- + src/hb-ot-layout-gsub-table.hh | 6 +++--- + src/hb-ot-layout.cc | 2 +- + src/hb-ot-layout.hh | 4 ++-- + src/hb-subset-plan.cc | 2 +- + src/hb-subset.cc | 2 +- + src/meson.build | 2 +- + 29 files changed, 40 insertions(+), 43 deletions(-) + +commit 38e81f2be9711f5dcde3b9cae40fdddb9104c493 +Author: Garret Rieger +Date: Thu Jun 30 21:09:11 2022 +0000 + + [subset] Add --layout-scripts command line flag. + + util/hb-subset.cc | 61 +++++++++++++++++++++++++++++++++++++++++++------------ + 1 file changed, 48 insertions(+), 13 deletions(-) + +commit 70e32a662f53409a849ad175d460dd524da14489 +Author: Garret Rieger +Date: Thu Jun 30 21:00:48 2022 +0000 + + [subset] Add layout_scripts to subset input. + + src/hb-subset-input.cc | 2 ++ + src/hb-subset-input.hh | 1 + + src/hb-subset-plan.cc | 3 +-- + src/hb-subset.h | 3 +++ + 4 files changed, 7 insertions(+), 2 deletions(-) + +commit 13c499cb26e11494f53709efabcff79a962b3d95 +Author: Behdad Esfahbod +Date: Thu Jun 30 14:25:09 2022 -0600 + + [hvar] Minor internal rewiring + + Not passing font to functions makes it more clear that they don't + scale values. + + src/hb-ot-hmtx-table.hh | 10 ++++++---- + src/hb-ot-var-hvar-table.hh | 5 ++--- + 2 files changed, 8 insertions(+), 7 deletions(-) + +commit 41d2c335bcf7f4f57b91ec8469dbfaa4d7b47e84 +Author: Garret Rieger +Date: Thu Jun 30 20:24:42 2022 +0000 + + [subset] Apply script list filter when doing layout collection. + + src/hb-subset-plan.cc | 27 ++++++++++++--------------- + 1 file changed, 12 insertions(+), 15 deletions(-) + +commit e5c8a2f4e11fa2b5b1b64ecf1d210fc3dc862381 +Author: Garret Rieger +Date: Thu Jun 30 20:14:29 2022 +0000 + + [subset] Pass plan through to collect methods. + + Allows to more easily access the filtering sets as they are added and enables propagating errors to the plan. + + src/hb-subset-plan.cc | 40 ++++++++++++++++------------------------ + 1 file changed, 16 insertions(+), 24 deletions(-) + +commit aba4a4957ad48fd34917d44d7005ffe73b3065e9 +Author: Behdad Esfahbod +Date: Thu Jun 30 14:13:44 2022 -0600 + + [ot-font] Disable VORG variation code in HB_NO_VAR + + src/hb-ot-font.cc | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit d5921b379b91bdb4a3d5b2b62036d6f8d8613b0f +Author: Behdad Esfahbod +Date: Thu Jun 30 14:08:29 2022 -0600 + + [tt-font] Apply VVAR.vOrg variation to VORG origin + + Mostly fixes https://github.com/harfbuzz/harfbuzz/issues/1694 + + src/hb-ot-font.cc | 13 ++++++++++++- + src/hb-ot-var-hvar-table.hh | 10 ++++++++++ + 2 files changed, 22 insertions(+), 1 deletion(-) + +commit eee29f7327de51d735c56b26798f2d296d1cb485 +Author: Behdad Esfahbod +Date: Thu Jun 30 14:03:07 2022 -0600 + + [hmtx] Specialize var_table + + src/hb-ot-font.cc | 4 ++-- + src/hb-ot-hmtx-table.hh | 10 +++++----- + 2 files changed, 7 insertions(+), 7 deletions(-) + +commit 031fd20a5a9e86f96f7fea1598a18f76875d828d +Author: Behdad Esfahbod +Date: Thu Jun 30 13:50:18 2022 -0600 + + [perf] Update README + + perf/README.md | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +commit 1bf051ef3bafe2d6c24983863dc3bf2f04505b3c +Author: Garret Rieger +Date: Thu Jun 30 20:03:33 2022 +0000 + + [subset] refactor feature tag filtering so it can be used for scripts as well. + + src/hb-subset-plan.cc | 68 +++++++++++++++++++++++++++++++++------------------ + src/hb-subset-plan.hh | 3 +++ + 2 files changed, 47 insertions(+), 24 deletions(-) + +commit f6f93c30f3dd966dd0a041f3a5876a892ebcacfa +Author: Khaled Hosny +Date: Thu Jun 30 08:50:59 2022 +0200 + + [docs] Fix warning + + These comment blocks don’t use gtk-doc syntax. + + src/hb-subset-repacker.h | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit d9c5292b277116af5317afc46c745f0058e6c042 +Author: Khaled Hosny +Date: Thu Jun 30 08:47:49 2022 +0200 + + [docs] Remove duplicate or non existing symbols + + docs/harfbuzz-sections.txt | 5 ----- + 1 file changed, 5 deletions(-) + +commit 98e90cc67cdff8cee730e8459692bc4a07d9a279 +Author: Khaled Hosny +Date: Thu Jun 30 08:43:57 2022 +0200 + + [docs] Reduce warnings + + Use markdown syntax for inline code blocks instead of %true, %false, and + %NULL. + + src/hb-aat-layout.cc | 6 +++--- + src/hb-blob.cc | 10 +++++----- + src/hb-buffer-serialize.cc | 24 ++++++++++++------------ + src/hb-buffer.cc | 38 +++++++++++++++++++------------------- + src/hb-buffer.h | 6 +++--- + src/hb-common.cc | 26 +++++++++++++------------- + src/hb-deprecated.h | 2 +- + src/hb-draw.cc | 4 ++-- + src/hb-face.cc | 4 ++-- + src/hb-font.cc | 36 ++++++++++++++++++------------------ + src/hb-font.h | 14 +++++++------- + src/hb-ft.cc | 4 ++-- + src/hb-graphite2.cc | 2 +- + src/hb-map.cc | 10 +++++----- + src/hb-ot-color.cc | 8 ++++---- + src/hb-ot-layout.cc | 40 ++++++++++++++++++++-------------------- + src/hb-ot-math.cc | 4 ++-- + src/hb-ot-var.cc | 4 ++-- + src/hb-set.cc | 20 ++++++++++---------- + src/hb-shape-plan.cc | 4 ++-- + src/hb-shape.cc | 12 ++++++------ + src/hb-subset-input.cc | 4 ++-- + src/hb-subset-plan.cc | 2 +- + src/hb-unicode.cc | 8 ++++---- + src/hb-unicode.h | 4 ++-- + 25 files changed, 148 insertions(+), 148 deletions(-) + +commit c69ec6f5bb42f9efe56e9c8086624458a359c5ae +Author: Behdad Esfahbod +Date: Wed Jun 29 16:32:30 2022 -0600 + + [kern2] Fix sanitize issue on 32bit systems + + Fixes https://github.com/harfbuzz/harfbuzz/issues/3483 + + src/hb-aat-layout-common.hh | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 32e542d6f00992e0c2c1f51248242ab52ec278ab +Author: Frédéric Wang +Date: Wed Jun 29 06:45:38 2022 +0200 + + try & fix build errors on the bot + + test/api/test-ot-face.c | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +commit 03d23767455539ebcaf01d4407a532c073d227ed +Author: Frédéric Wang +Date: Wed Jun 29 06:21:31 2022 +0200 + + [math] Improve fuzzing coverage + + Extend testing to cover parts that are missing according to the recent + oss-fuzz-coverage report: + - Retriving all constants from MathConstants. + - Retrieving entries from MathKern, MathGlyphPartRecord and + MathGlyphAssembly. + - Retrieving italic correction from MathGlyphAssembly. + - Choosing between horizontal/vertical offset in MathVariants. + + https://storage.googleapis.com/oss-fuzz-coverage/harfbuzz/reports/20220627/linux/src/harfbuzz/src/hb-ot-math-table.hh.html + https://github.com/harfbuzz/harfbuzz/issues/3688 + + test/api/test-ot-face.c | 37 +++++++++++++++++++++++++++++++------ + 1 file changed, 31 insertions(+), 6 deletions(-) + +commit 22835dea292fb476dbce157d7dea5e57effcde47 +Author: Khaled Hosny +Date: Wed Jun 29 07:49:28 2022 +0200 + + [docs] Add missing symbol + + docs/harfbuzz-sections.txt | 1 + + 1 file changed, 1 insertion(+) + +commit 34d3d49e7898566b8a70177b8b8f934a485cc040 +Author: Khaled Hosny +Date: Wed Jun 29 07:46:21 2022 +0200 + + [docs] Fix Since annotation + + src/hb-font.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + commit 096aaa62a6e0d07c02a4894fc036efc927e5aaf9 Author: Khaled Hosny Date: Wed Jun 29 07:30:05 2022 +0200 diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/NEWS b/Build/source/libs/harfbuzz/harfbuzz-src/NEWS index b146f6a6f49..7de793e5bad 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/NEWS +++ b/Build/source/libs/harfbuzz/harfbuzz-src/NEWS @@ -1,3 +1,50 @@ +Overview of changes leading to 5.0.1 +Saturday, July 23, 2022 +==================================== +- Fix version 2 “avar” table with hb-ft. (Behdad Esfahbod) + + +Overview of changes leading to 5.0.0 +Saturday, July 23, 2022 +==================================== +- Support fonts with more than 65535 glyphs in “GDEF”, “GSUB”, and “GPOS” + tables. This is part of https://github.com/be-fonts/boring-expansion-spec to + extend OpenType in a backward-compatible way. + (Behdad Esfahbod, Garret Rieger) +- Complete support for more than 65535 glyphs in “glyf” table that started in + 4.0.0 release. Part of boring-expansion-spec. (Behdad Esfahbod) +- Support version 2 of “avar” table. Part of boring-expansion-spec. + (Behdad Esfahbod) +- Fix mark attachment on multiple substitutions in some cases. + (Behdad Esfahbod) +- Fix application of “calt”, “rclt”, and “ccmp” features to better match + Uniscribe behaviour with some Arabic fonts. (Behdad Esfahbod) +- Improvement to interaction between multiple cursive attachments. + (Behdad Esfahbod) +- Improve multiple mark interactions in Hebrew. (Behdad Esfahbod) +- Implement language-specific forms in AAT shaping. (Behdad Esfahbod) +- Fix variation of “VORG” table. (Behdad Esfahbod) +- Support for specific script tags to be retained in the subsetter, and add + “--layout-scripts” option to “hb-subset” tool. (Garret Rieger) +- Accept space as delimiter for --features/--variations in command line tools. +- Improve subsetting of “COLR” table. (Qunxin Liu) +- Improved fuzzing coverage for ot-math API. (Frédéric Wang) +- Fix “kern” table version 2 (AAT) sanitization on 32-bit systems. + (Behdad Esfahbod) +- Allow negative glyph advances from “graphite2” shaper. (Stephan Bergmann) +- Implement loading (color) bitmap fonts with hb-ft. (Behdad Esfahbod) +- Fix regression in hb-ft when changing font size. (Behdad Esfahbod) +- Fix build on GCC < 7. (Kleis Auke Wolthuizen) +- Dynamically load dwrite.dll on windows if “directwrite” shaper is enabled. + (Luca Bacci) +- Provide a single-file harfbuzz-subset.cc file for easier alternate building + of hb-subset library, similar to harfbuzz.cc. (Khaled Hosny) + +- New API ++HB_SUBSET_SETS_LAYOUT_SCRIPT_TAG ++hb_language_matches() + + Overview of changes leading to 4.4.1 Wednesday, June 29, 2022 ==================================== diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in b/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in index 03db0581777..9ca8bb2c55d 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in +++ b/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in @@ -31,8 +31,8 @@ /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H -/* Define to 1 if you have the header file. */ -#undef HAVE_DWRITE_H +/* Define to 1 if you have the header file. */ +#undef HAVE_DWRITE_1_H /* Have FreeType 2 library */ #undef HAVE_FREETYPE @@ -40,6 +40,9 @@ /* Define to 1 if you have the `FT_Done_MM_Var' function. */ #undef HAVE_FT_DONE_MM_VAR +/* Define to 1 if you have the `FT_Get_Transform' function. */ +#undef HAVE_FT_GET_TRANSFORM + /* Define to 1 if you have the `FT_Get_Var_Blend_Coordinates' function. */ #undef HAVE_FT_GET_VAR_BLEND_COORDINATES diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac b/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac index bc52d34f3f2..50fde646d72 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac +++ b/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac @@ -1,6 +1,6 @@ AC_PREREQ([2.64]) AC_INIT([HarfBuzz], - [4.4.1], + [5.0.1], [https://github.com/harfbuzz/harfbuzz/issues/new], [harfbuzz], [http://harfbuzz.org/]) @@ -308,7 +308,7 @@ if $have_freetype; then AC_DEFINE(HAVE_FREETYPE, 1, [Have FreeType 2 library]) save_libs=$LIBS LIBS="$LIBS $FREETYPE_LIBS" - AC_CHECK_FUNCS(FT_Get_Var_Blend_Coordinates FT_Set_Var_Blend_Coordinates FT_Done_MM_Var) + AC_CHECK_FUNCS(FT_Get_Var_Blend_Coordinates FT_Set_Var_Blend_Coordinates FT_Done_MM_Var FT_Get_Transform) LIBS=$save_libs fi AM_CONDITIONAL(HAVE_FREETYPE, $have_freetype) @@ -366,17 +366,13 @@ AC_ARG_WITH(directwrite, have_directwrite=false AC_LANG_PUSH([C++]) if test "x$with_directwrite" = "xyes" -o "x$with_directwrite" = "xauto"; then - AC_CHECK_HEADERS(dwrite.h, have_directwrite=true) + AC_CHECK_HEADERS(dwrite_1.h, have_directwrite=true) fi AC_LANG_POP([C++]) if test "x$with_directwrite" = "xyes" -a "x$have_directwrite" != "xtrue"; then AC_MSG_ERROR([directwrite support requested but not found]) fi if $have_directwrite; then - DIRECTWRITE_CXXFLAGS= - DIRECTWRITE_LIBS=-ldwrite - AC_SUBST(DIRECTWRITE_CXXFLAGS) - AC_SUBST(DIRECTWRITE_LIBS) AC_DEFINE(HAVE_DIRECTWRITE, 1, [Have DirectWrite library]) fi AM_CONDITIONAL(HAVE_DIRECTWRITE, $have_directwrite) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/meson.build b/Build/source/libs/harfbuzz/harfbuzz-src/meson.build index 4a69d6d9ec3..33908a2c320 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/meson.build +++ b/Build/source/libs/harfbuzz/harfbuzz-src/meson.build @@ -1,6 +1,6 @@ project('harfbuzz', 'c', 'cpp', meson_version: '>= 0.55.0', - version: '4.4.1', + version: '5.0.1', default_options: [ 'cpp_rtti=false', # Just to support msvc, we are passing -fno-exceptions also anyway 'cpp_std=c++11', @@ -198,6 +198,7 @@ if freetype_dep.found() ['FT_Get_Var_Blend_Coordinates', {'deps': freetype_dep}], ['FT_Set_Var_Blend_Coordinates', {'deps': freetype_dep}], ['FT_Done_MM_Var', {'deps': freetype_dep}], + ['FT_Get_Transform', {'deps': freetype_dep}], ] if freetype_dep.type_name() == 'internal' @@ -232,17 +233,12 @@ if host_machine.system() == 'windows' and not get_option('gdi').disabled() endif # DirectWrite (Windows) -directwrite_dep = null_dep if host_machine.system() == 'windows' and not get_option('directwrite').disabled() if get_option('directwrite').enabled() and not cpp.has_header('dwrite_1.h') error('DirectWrite was enabled explicitly, but required header is missing.') endif - directwrite_dep = cpp.find_library('dwrite', required: get_option('directwrite')) - - if directwrite_dep.found() - conf.set('HAVE_DIRECTWRITE', 1) - endif + conf.set('HAVE_DIRECTWRITE', 1) endif # CoreText (macOS) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am b/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am index e1b56a5e9a7..b0327368362 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am @@ -12,7 +12,7 @@ DISTCHECK_CONFIGURE_FLAGS = --enable-introspection TESTS = check_PROGRAMS = -EXTRA_DIST += harfbuzz.cc +EXTRA_DIST += harfbuzz.cc harfbuzz-subset.cc EXTRA_DIST += meson.build EXTRA_DIST += fix_get_types.py @@ -160,6 +160,17 @@ pkginclude_HEADERS += $(HB_SUBSET_headers) pkgconfig_DATA += harfbuzz-subset.pc EXTRA_DIST += harfbuzz-subset.pc.in +harfbuzz-subset.cc: Makefile.sources + $(AM_V_GEN) \ + for f in \ + $(HB_BASE_sources) \ + $(HB_SUBSET_sources) \ + ; do echo '#include "'$$f'"'; done | \ + sort -u | \ + grep '[.]cc"' > $(srcdir)/harfbuzz-subset.cc \ + || ($(RM) $(srcdir)/harfbuzz-subset.cc; false) +BUILT_SOURCES += harfbuzz-subset.cc + if HAVE_ICU if HAVE_ICU_BUILTIN HBCFLAGS += $(ICU_CFLAGS) @@ -294,6 +305,7 @@ harfbuzz.cc: Makefile.sources $(HB_DIRECTWRITE_sources) \ $(HB_CORETEXT_sources) \ ; do echo '#include "'$$f'"'; done | \ + sort -u | \ grep '[.]cc"' > $(srcdir)/harfbuzz.cc \ || ($(RM) $(srcdir)/harfbuzz.cc; false) BUILT_SOURCES += harfbuzz.cc diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources b/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources index 7211fb0d5f2..fbf9b9be863 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources @@ -97,57 +97,65 @@ HB_BASE_sources = \ OT/glyf/SimpleGlyph.hh \ OT/glyf/CompositeGlyph.hh \ OT/glyf/SubsetGlyph.hh \ - OT/Layout/GSUB/Common.hh \ - OT/Layout/GSUB/Sequence.hh \ - OT/Layout/GSUB/SingleSubstFormat1.hh \ - OT/Layout/GSUB/SingleSubstFormat2.hh \ - OT/Layout/GSUB/SingleSubst.hh \ - OT/Layout/GSUB/MultipleSubstFormat1.hh \ - OT/Layout/GSUB/MultipleSubst.hh \ - OT/Layout/GSUB/AlternateSubstFormat1.hh \ - OT/Layout/GSUB/AlternateSubst.hh \ - OT/Layout/GSUB/AlternateSet.hh \ - OT/Layout/GSUB/LigatureSubstFormat1.hh \ - OT/Layout/GSUB/LigatureSubst.hh \ - OT/Layout/GSUB/LigatureSet.hh \ - OT/Layout/GSUB/Ligature.hh \ - OT/Layout/GSUB/ReverseChainSingleSubst.hh \ - OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh \ - OT/Layout/GSUB/ContextSubst.hh \ - OT/Layout/GSUB/ChainContextSubst.hh \ - OT/Layout/GSUB/ExtensionSubst.hh \ - OT/Layout/GSUB/SubstLookupSubTable.hh \ - OT/Layout/GSUB/SubstLookup.hh \ - OT/Layout/GSUB/GSUB.hh \ - OT/Layout/GPOS.hh \ - OT/Layout/GPOS/CursivePosFormat1.hh \ - OT/Layout/GPOS/MarkLigPos.hh \ - OT/Layout/GPOS/PairPos.hh \ - OT/Layout/GPOS/Anchor.hh \ + OT/Layout/types.hh \ + OT/Layout/Common/Coverage.hh \ + OT/Layout/Common/CoverageFormat1.hh \ + OT/Layout/Common/CoverageFormat2.hh \ + OT/Layout/Common/RangeRecord.hh \ OT/Layout/GPOS/AnchorFormat1.hh \ - OT/Layout/GPOS/MarkLigPosFormat1.hh \ - OT/Layout/GPOS/PairPosFormat1.hh \ - OT/Layout/GPOS/ExtensionPos.hh \ + OT/Layout/GPOS/AnchorFormat2.hh \ + OT/Layout/GPOS/AnchorFormat3.hh \ + OT/Layout/GPOS/Anchor.hh \ + OT/Layout/GPOS/AnchorMatrix.hh \ OT/Layout/GPOS/ChainContextPos.hh \ OT/Layout/GPOS/Common.hh \ - OT/Layout/GPOS/ValueFormat.hh \ - OT/Layout/GPOS/AnchorMatrix.hh \ + OT/Layout/GPOS/ContextPos.hh \ + OT/Layout/GPOS/CursivePosFormat1.hh \ + OT/Layout/GPOS/CursivePos.hh \ + OT/Layout/GPOS/ExtensionPos.hh \ + OT/Layout/GPOS/GPOS.hh \ + OT/Layout/GPOS/LigatureArray.hh \ + OT/Layout/GPOS/MarkArray.hh \ OT/Layout/GPOS/MarkBasePosFormat1.hh \ - OT/Layout/GPOS/AnchorFormat3.hh \ - OT/Layout/GPOS/PosLookup.hh \ - OT/Layout/GPOS/MarkMarkPos.hh \ - OT/Layout/GPOS/PairPosFormat2.hh \ OT/Layout/GPOS/MarkBasePos.hh \ + OT/Layout/GPOS/MarkLigPosFormat1.hh \ + OT/Layout/GPOS/MarkLigPos.hh \ OT/Layout/GPOS/MarkMarkPosFormat1.hh \ - OT/Layout/GPOS/SinglePos.hh \ - OT/Layout/GPOS/MarkArray.hh \ - OT/Layout/GPOS/CursivePos.hh \ - OT/Layout/GPOS/PosLookupSubTable.hh \ + OT/Layout/GPOS/MarkMarkPos.hh \ OT/Layout/GPOS/MarkRecord.hh \ - OT/Layout/GPOS/AnchorFormat2.hh \ - OT/Layout/GPOS/ContextPos.hh \ - OT/Layout/GPOS/SinglePosFormat2.hh \ + OT/Layout/GPOS/PairPosFormat1.hh \ + OT/Layout/GPOS/PairPosFormat2.hh \ + OT/Layout/GPOS/PairPos.hh \ + OT/Layout/GPOS/PairSet.hh \ + OT/Layout/GPOS/PairValueRecord.hh \ + OT/Layout/GPOS/PosLookup.hh \ + OT/Layout/GPOS/PosLookupSubTable.hh \ OT/Layout/GPOS/SinglePosFormat1.hh \ + OT/Layout/GPOS/SinglePosFormat2.hh \ + OT/Layout/GPOS/SinglePos.hh \ + OT/Layout/GPOS/ValueFormat.hh \ + OT/Layout/GSUB/AlternateSet.hh \ + OT/Layout/GSUB/AlternateSubstFormat1.hh \ + OT/Layout/GSUB/AlternateSubst.hh \ + OT/Layout/GSUB/ChainContextSubst.hh \ + OT/Layout/GSUB/Common.hh \ + OT/Layout/GSUB/ContextSubst.hh \ + OT/Layout/GSUB/ExtensionSubst.hh \ + OT/Layout/GSUB/GSUB.hh \ + OT/Layout/GSUB/Ligature.hh \ + OT/Layout/GSUB/LigatureSet.hh \ + OT/Layout/GSUB/LigatureSubstFormat1.hh \ + OT/Layout/GSUB/LigatureSubst.hh \ + OT/Layout/GSUB/MultipleSubstFormat1.hh \ + OT/Layout/GSUB/MultipleSubst.hh \ + OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh \ + OT/Layout/GSUB/ReverseChainSingleSubst.hh \ + OT/Layout/GSUB/Sequence.hh \ + OT/Layout/GSUB/SingleSubstFormat1.hh \ + OT/Layout/GSUB/SingleSubstFormat2.hh \ + OT/Layout/GSUB/SingleSubst.hh \ + OT/Layout/GSUB/SubstLookup.hh \ + OT/Layout/GSUB/SubstLookupSubTable.hh \ hb-ot-layout-gsubgpos.hh \ hb-ot-layout-jstf-table.hh \ hb-ot-layout.cc \ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/Common/Coverage.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/Common/Coverage.hh new file mode 100644 index 00000000000..e52a617c86e --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/Common/Coverage.hh @@ -0,0 +1,338 @@ +/* + * Copyright © 2007,2008,2009 Red Hat, Inc. + * Copyright © 2010,2012 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod, Garret Rieger + */ + +#ifndef OT_LAYOUT_COMMON_COVERAGE_HH +#define OT_LAYOUT_COMMON_COVERAGE_HH + +#include "../types.hh" +#include "CoverageFormat1.hh" +#include "CoverageFormat2.hh" + +namespace OT { +namespace Layout { +namespace Common { + +template +static inline void Coverage_serialize (hb_serialize_context_t *c, + Iterator it); + +struct Coverage +{ + + protected: + union { + HBUINT16 format; /* Format identifier */ + CoverageFormat1_3 format1; + CoverageFormat2_4 format2; +#ifndef HB_NO_BORING_EXPANSION + CoverageFormat1_3format3; + CoverageFormat2_4format4; +#endif + } u; + public: + DEFINE_SIZE_UNION (2, format); + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + if (!u.format.sanitize (c)) return_trace (false); + switch (u.format) + { + case 1: return_trace (u.format1.sanitize (c)); + case 2: return_trace (u.format2.sanitize (c)); +#ifndef HB_NO_BORING_EXPANSION + case 3: return_trace (u.format3.sanitize (c)); + case 4: return_trace (u.format4.sanitize (c)); +#endif + default:return_trace (true); + } + } + + /* Has interface. */ + static constexpr unsigned SENTINEL = NOT_COVERED; + typedef unsigned int value_t; + value_t operator [] (hb_codepoint_t k) const { return get (k); } + bool has (hb_codepoint_t k) const { return (*this)[k] != SENTINEL; } + /* Predicate. */ + bool operator () (hb_codepoint_t k) const { return has (k); } + + unsigned int get (hb_codepoint_t k) const { return get_coverage (k); } + unsigned int get_coverage (hb_codepoint_t glyph_id) const + { + switch (u.format) { + case 1: return u.format1.get_coverage (glyph_id); + case 2: return u.format2.get_coverage (glyph_id); +#ifndef HB_NO_BORING_EXPANSION + case 3: return u.format3.get_coverage (glyph_id); + case 4: return u.format4.get_coverage (glyph_id); +#endif + default:return NOT_COVERED; + } + } + + unsigned get_population () const + { + switch (u.format) { + case 1: return u.format1.get_population (); + case 2: return u.format2.get_population (); +#ifndef HB_NO_BORING_EXPANSION + case 3: return u.format3.get_population (); + case 4: return u.format4.get_population (); +#endif + default:return NOT_COVERED; + } + } + + template + bool serialize (hb_serialize_context_t *c, Iterator glyphs) + { + TRACE_SERIALIZE (this); + if (unlikely (!c->extend_min (this))) return_trace (false); + + unsigned count = 0; + unsigned num_ranges = 0; + hb_codepoint_t last = (hb_codepoint_t) -2; + for (auto g: glyphs) + { + if (last + 1 != g) + num_ranges++; + last = g; + count++; + } + u.format = count <= num_ranges * 3 ? 1 : 2; + +#ifndef HB_NO_BORING_EXPANSION + if (count && last > 0xFFFFu) + u.format += 2; +#endif + + switch (u.format) + { + case 1: return_trace (u.format1.serialize (c, glyphs)); + case 2: return_trace (u.format2.serialize (c, glyphs)); +#ifndef HB_NO_BORING_EXPANSION + case 3: return_trace (u.format3.serialize (c, glyphs)); + case 4: return_trace (u.format4.serialize (c, glyphs)); +#endif + default:return_trace (false); + } + } + + bool subset (hb_subset_context_t *c) const + { + TRACE_SUBSET (this); + auto it = + + iter () + | hb_filter (c->plan->glyph_map_gsub) + | hb_map_retains_sorting (c->plan->glyph_map_gsub) + ; + + // Cache the iterator result as it will be iterated multiple times + // by the serialize code below. + hb_sorted_vector_t glyphs (it); + Coverage_serialize (c->serializer, glyphs.iter ()); + return_trace (bool (glyphs)); + } + + bool intersects (const hb_set_t *glyphs) const + { + switch (u.format) + { + case 1: return u.format1.intersects (glyphs); + case 2: return u.format2.intersects (glyphs); +#ifndef HB_NO_BORING_EXPANSION + case 3: return u.format3.intersects (glyphs); + case 4: return u.format4.intersects (glyphs); +#endif + default:return false; + } + } + bool intersects_coverage (const hb_set_t *glyphs, unsigned int index) const + { + switch (u.format) + { + case 1: return u.format1.intersects_coverage (glyphs, index); + case 2: return u.format2.intersects_coverage (glyphs, index); +#ifndef HB_NO_BORING_EXPANSION + case 3: return u.format3.intersects_coverage (glyphs, index); + case 4: return u.format4.intersects_coverage (glyphs, index); +#endif + default:return false; + } + } + + /* Might return false if array looks unsorted. + * Used for faster rejection of corrupt data. */ + template + bool collect_coverage (set_t *glyphs) const + { + switch (u.format) + { + case 1: return u.format1.collect_coverage (glyphs); + case 2: return u.format2.collect_coverage (glyphs); +#ifndef HB_NO_BORING_EXPANSION + case 3: return u.format3.collect_coverage (glyphs); + case 4: return u.format4.collect_coverage (glyphs); +#endif + default:return false; + } + } + + template + void intersect_set (const hb_set_t &glyphs, IterableOut &intersect_glyphs) const + { + switch (u.format) + { + case 1: return u.format1.intersect_set (glyphs, intersect_glyphs); + case 2: return u.format2.intersect_set (glyphs, intersect_glyphs); +#ifndef HB_NO_BORING_EXPANSION + case 3: return u.format3.intersect_set (glyphs, intersect_glyphs); + case 4: return u.format4.intersect_set (glyphs, intersect_glyphs); +#endif + default:return ; + } + } + + struct iter_t : hb_iter_with_fallback_t + { + static constexpr bool is_sorted_iterator = true; + iter_t (const Coverage &c_ = Null (Coverage)) + { + memset (this, 0, sizeof (*this)); + format = c_.u.format; + switch (format) + { + case 1: u.format1.init (c_.u.format1); return; + case 2: u.format2.init (c_.u.format2); return; +#ifndef HB_NO_BORING_EXPANSION + case 3: u.format3.init (c_.u.format3); return; + case 4: u.format4.init (c_.u.format4); return; +#endif + default: return; + } + } + bool __more__ () const + { + switch (format) + { + case 1: return u.format1.__more__ (); + case 2: return u.format2.__more__ (); +#ifndef HB_NO_BORING_EXPANSION + case 3: return u.format3.__more__ (); + case 4: return u.format4.__more__ (); +#endif + default:return false; + } + } + void __next__ () + { + switch (format) + { + case 1: u.format1.__next__ (); break; + case 2: u.format2.__next__ (); break; +#ifndef HB_NO_BORING_EXPANSION + case 3: u.format3.__next__ (); break; + case 4: u.format4.__next__ (); break; +#endif + default: break; + } + } + typedef hb_codepoint_t __item_t__; + __item_t__ __item__ () const { return get_glyph (); } + + hb_codepoint_t get_glyph () const + { + switch (format) + { + case 1: return u.format1.get_glyph (); + case 2: return u.format2.get_glyph (); +#ifndef HB_NO_BORING_EXPANSION + case 3: return u.format3.get_glyph (); + case 4: return u.format4.get_glyph (); +#endif + default:return 0; + } + } + bool operator != (const iter_t& o) const + { + if (unlikely (format != o.format)) return true; + switch (format) + { + case 1: return u.format1 != o.u.format1; + case 2: return u.format2 != o.u.format2; +#ifndef HB_NO_BORING_EXPANSION + case 3: return u.format3 != o.u.format3; + case 4: return u.format4 != o.u.format4; +#endif + default:return false; + } + } + iter_t __end__ () const + { + iter_t it = {}; + it.format = format; + switch (format) + { + case 1: it.u.format1 = u.format1.__end__ (); break; + case 2: it.u.format2 = u.format2.__end__ (); break; +#ifndef HB_NO_BORING_EXPANSION + case 3: it.u.format3 = u.format3.__end__ (); break; + case 4: it.u.format4 = u.format4.__end__ (); break; +#endif + default: break; + } + return it; + } + + private: + unsigned int format; + union { +#ifndef HB_NO_BORING_EXPANSION + CoverageFormat2_4::iter_t format4; /* Put this one first since it's larger; helps shut up compiler. */ + CoverageFormat1_3::iter_t format3; +#endif + CoverageFormat2_4::iter_t format2; /* Put this one first since it's larger; helps shut up compiler. */ + CoverageFormat1_3::iter_t format1; + } u; + }; + iter_t iter () const { return iter_t (*this); } +}; + +template +static inline void +Coverage_serialize (hb_serialize_context_t *c, + Iterator it) +{ c->start_embed ()->serialize (c, it); } + +} +} +} + +#endif // #ifndef OT_LAYOUT_COMMON_COVERAGE_HH diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/Common/CoverageFormat1.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/Common/CoverageFormat1.hh new file mode 100644 index 00000000000..886babd2d1c --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/Common/CoverageFormat1.hh @@ -0,0 +1,126 @@ +/* + * Copyright © 2007,2008,2009 Red Hat, Inc. + * Copyright © 2010,2012 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod, Garret Rieger + */ + + +#ifndef OT_LAYOUT_COMMON_COVERAGEFORMAT1_HH +#define OT_LAYOUT_COMMON_COVERAGEFORMAT1_HH + +namespace OT { +namespace Layout { +namespace Common { + +#define NOT_COVERED ((unsigned int) -1) + +template +struct CoverageFormat1_3 +{ + friend struct Coverage; + + protected: + HBUINT16 coverageFormat; /* Format identifier--format = 1 */ + SortedArray16Of + glyphArray; /* Array of GlyphIDs--in numerical order */ + public: + DEFINE_SIZE_ARRAY (4, glyphArray); + + private: + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (glyphArray.sanitize (c)); + } + + unsigned int get_coverage (hb_codepoint_t glyph_id) const + { + unsigned int i; + glyphArray.bfind (glyph_id, &i, HB_NOT_FOUND_STORE, NOT_COVERED); + return i; + } + + unsigned get_population () const + { + return glyphArray.len; + } + + template + bool serialize (hb_serialize_context_t *c, Iterator glyphs) + { + TRACE_SERIALIZE (this); + return_trace (glyphArray.serialize (c, glyphs)); + } + + bool intersects (const hb_set_t *glyphs) const + { + /* TODO Speed up, using hb_set_next() and bsearch()? */ + for (const auto& g : glyphArray.as_array ()) + if (glyphs->has (g)) + return true; + return false; + } + bool intersects_coverage (const hb_set_t *glyphs, unsigned int index) const + { return glyphs->has (glyphArray[index]); } + + template + void intersect_set (const hb_set_t &glyphs, IterableOut &intersect_glyphs) const + { + unsigned count = glyphArray.len; + for (unsigned i = 0; i < count; i++) + if (glyphs.has (glyphArray[i])) + intersect_glyphs << glyphArray[i]; + } + + template + bool collect_coverage (set_t *glyphs) const + { return glyphs->add_sorted_array (glyphArray.as_array ()); } + + public: + /* Older compilers need this to be public. */ + struct iter_t + { + void init (const struct CoverageFormat1_3 &c_) { c = &c_; i = 0; } + bool __more__ () const { return i < c->glyphArray.len; } + void __next__ () { i++; } + hb_codepoint_t get_glyph () const { return c->glyphArray[i]; } + bool operator != (const iter_t& o) const + { return i != o.i; } + iter_t __end__ () const { iter_t it; it.init (*c); it.i = c->glyphArray.len; return it; } + + private: + const struct CoverageFormat1_3 *c; + unsigned int i; + }; + private: +}; + +} +} +} + +#endif // #ifndef OT_LAYOUT_COMMON_COVERAGEFORMAT1_HH diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/Common/CoverageFormat2.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/Common/CoverageFormat2.hh new file mode 100644 index 00000000000..4ddb2a73e4b --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/Common/CoverageFormat2.hh @@ -0,0 +1,233 @@ +/* + * Copyright © 2007,2008,2009 Red Hat, Inc. + * Copyright © 2010,2012 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod, Garret Rieger + */ + +#ifndef OT_LAYOUT_COMMON_COVERAGEFORMAT2_HH +#define OT_LAYOUT_COMMON_COVERAGEFORMAT2_HH + +#include "RangeRecord.hh" + +namespace OT { +namespace Layout { +namespace Common { + +template +struct CoverageFormat2_4 +{ + friend struct Coverage; + + protected: + HBUINT16 coverageFormat; /* Format identifier--format = 2 */ + SortedArray16Of> + rangeRecord; /* Array of glyph ranges--ordered by + * Start GlyphID. rangeCount entries + * long */ + public: + DEFINE_SIZE_ARRAY (4, rangeRecord); + + private: + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (rangeRecord.sanitize (c)); + } + + unsigned int get_coverage (hb_codepoint_t glyph_id) const + { + const RangeRecord &range = rangeRecord.bsearch (glyph_id); + return likely (range.first <= range.last) + ? (unsigned int) range.value + (glyph_id - range.first) + : NOT_COVERED; + } + + unsigned get_population () const + { + typename Types::large_int ret = 0; + for (const auto &r : rangeRecord) + ret += r.get_population (); + return ret > UINT_MAX ? UINT_MAX : (unsigned) ret; + } + + template + bool serialize (hb_serialize_context_t *c, Iterator glyphs) + { + TRACE_SERIALIZE (this); + if (unlikely (!c->extend_min (this))) return_trace (false); + + /* TODO(iter) Write more efficiently? */ + + unsigned num_ranges = 0; + hb_codepoint_t last = (hb_codepoint_t) -2; + for (auto g: glyphs) + { + if (last + 1 != g) + num_ranges++; + last = g; + } + + if (unlikely (!rangeRecord.serialize (c, num_ranges))) return_trace (false); + if (!num_ranges) return_trace (true); + + unsigned count = 0; + unsigned range = (unsigned) -1; + last = (hb_codepoint_t) -2; + for (auto g: glyphs) + { + if (last + 1 != g) + { + range++; + rangeRecord[range].first = g; + rangeRecord[range].value = count; + } + rangeRecord[range].last = g; + last = g; + count++; + } + + return_trace (true); + } + + bool intersects (const hb_set_t *glyphs) const + { + return hb_any (+ hb_iter (rangeRecord) + | hb_map ([glyphs] (const RangeRecord &range) { return range.intersects (*glyphs); })); + } + bool intersects_coverage (const hb_set_t *glyphs, unsigned int index) const + { + auto cmp = [] (const void *pk, const void *pr) -> int + { + unsigned index = * (const unsigned *) pk; + const RangeRecord &range = * (const RangeRecord *) pr; + if (index < range.value) return -1; + if (index > (unsigned int) range.value + (range.last - range.first)) return +1; + return 0; + }; + + auto arr = rangeRecord.as_array (); + unsigned idx; + if (hb_bsearch_impl (&idx, index, + arr.arrayZ, arr.length, sizeof (arr[0]), + (int (*)(const void *_key, const void *_item)) cmp)) + return arr.arrayZ[idx].intersects (*glyphs); + return false; + } + + template + void intersect_set (const hb_set_t &glyphs, IterableOut &intersect_glyphs) const + { + for (const auto& range : rangeRecord) + { + hb_codepoint_t last = range.last; + for (hb_codepoint_t g = range.first - 1; + glyphs.next (&g) && g <= last;) + intersect_glyphs << g; + } + } + + template + bool collect_coverage (set_t *glyphs) const + { + for (const auto& range: rangeRecord) + if (unlikely (!range.collect_coverage (glyphs))) + return false; + return true; + } + + public: + /* Older compilers need this to be public. */ + struct iter_t + { + void init (const CoverageFormat2_4 &c_) + { + c = &c_; + coverage = 0; + i = 0; + j = c->rangeRecord.len ? c->rangeRecord[0].first : 0; + if (unlikely (c->rangeRecord[0].first > c->rangeRecord[0].last)) + { + /* Broken table. Skip. */ + i = c->rangeRecord.len; + j = 0; + } + } + bool __more__ () const { return i < c->rangeRecord.len; } + void __next__ () + { + if (j >= c->rangeRecord[i].last) + { + i++; + if (__more__ ()) + { + unsigned int old = coverage; + j = c->rangeRecord[i].first; + coverage = c->rangeRecord[i].value; + if (unlikely (coverage != old + 1)) + { + /* Broken table. Skip. Important to avoid DoS. + * Also, our callers depend on coverage being + * consecutive and monotonically increasing, + * ie. iota(). */ + i = c->rangeRecord.len; + j = 0; + return; + } + } + else + j = 0; + return; + } + coverage++; + j++; + } + hb_codepoint_t get_glyph () const { return j; } + bool operator != (const iter_t& o) const + { return i != o.i || j != o.j; } + iter_t __end__ () const + { + iter_t it; + it.init (*c); + it.i = c->rangeRecord.len; + it.j = 0; + return it; + } + + private: + const struct CoverageFormat2_4 *c; + unsigned int i, coverage; + hb_codepoint_t j; + }; + private: +}; + +} +} +} + +#endif // #ifndef OT_LAYOUT_COMMON_COVERAGEFORMAT2_HH diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/Common/RangeRecord.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/Common/RangeRecord.hh new file mode 100644 index 00000000000..a62629fad34 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/Common/RangeRecord.hh @@ -0,0 +1,85 @@ +/* + * Copyright © 2007,2008,2009 Red Hat, Inc. + * Copyright © 2010,2012 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod, Garret Rieger + */ + +#ifndef OT_LAYOUT_COMMON_RANGERECORD_HH +#define OT_LAYOUT_COMMON_RANGERECORD_HH + +namespace OT { +namespace Layout { +namespace Common { + +template +struct RangeRecord +{ + typename Types::HBGlyphID first; /* First GlyphID in the range */ + typename Types::HBGlyphID last; /* Last GlyphID in the range */ + HBUINT16 value; /* Value */ + + DEFINE_SIZE_STATIC (2 + 2 * Types::size); + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + int cmp (hb_codepoint_t g) const + { return g < first ? -1 : g <= last ? 0 : +1; } + + unsigned get_population () const + { + if (unlikely (last < first)) return 0; + return (last - first + 1); + } + + bool intersects (const hb_set_t &glyphs) const + { return glyphs.intersects (first, last); } + + template + bool collect_coverage (set_t *glyphs) const + { return glyphs->add_range (first, last); } +}; + +} +} +} + +// TODO(garretrieger): This was previously implemented using +// DECLARE_NULL_NAMESPACE_BYTES_TEMPLATE1 (OT, RangeRecord, 9); +// but that only works when there is only a single namespace level. +// The macro should probably be fixed so it can work in this situation. +extern HB_INTERNAL const unsigned char _hb_Null_OT_RangeRecord[9]; +template +struct Null> { + static OT::Layout::Common::RangeRecord const & get_null () { + return *reinterpret_cast *> (_hb_Null_OT_RangeRecord); + } +}; + + +#endif // #ifndef OT_LAYOUT_COMMON_RANGERECORD_HH diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS.hh deleted file mode 100644 index 224d6b746bd..00000000000 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS.hh +++ /dev/null @@ -1,165 +0,0 @@ -#ifndef OT_LAYOUT_GPOS_HH -#define OT_LAYOUT_GPOS_HH - -#include "../../hb-ot-layout-common.hh" -#include "../../hb-ot-layout-gsubgpos.hh" -#include "GPOS/Common.hh" -#include "GPOS/PosLookup.hh" - -namespace OT { -namespace Layout { - -static void -propagate_attachment_offsets (hb_glyph_position_t *pos, - unsigned int len, - unsigned int i, - hb_direction_t direction, - unsigned nesting_level = HB_MAX_NESTING_LEVEL); - -/* - * GPOS -- Glyph Positioning - * https://docs.microsoft.com/en-us/typography/opentype/spec/gpos - */ - -struct GPOS : GSUBGPOS -{ - static constexpr hb_tag_t tableTag = HB_OT_TAG_GPOS; - - using Lookup = GPOS_impl::PosLookup; - - const GPOS_impl::PosLookup& get_lookup (unsigned int i) const - { return static_cast (GSUBGPOS::get_lookup (i)); } - - static inline void position_start (hb_font_t *font, hb_buffer_t *buffer); - static inline void position_finish_advances (hb_font_t *font, hb_buffer_t *buffer); - static inline void position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer); - - bool subset (hb_subset_context_t *c) const - { - hb_subset_layout_context_t l (c, tableTag, c->plan->gpos_lookups, c->plan->gpos_langsys, c->plan->gpos_features); - return GSUBGPOS::subset (&l); - } - - bool sanitize (hb_sanitize_context_t *c) const - { return GSUBGPOS::sanitize (c); } - - HB_INTERNAL bool is_blocklisted (hb_blob_t *blob, - hb_face_t *face) const; - - void collect_variation_indices (hb_collect_variation_indices_context_t *c) const - { - for (unsigned i = 0; i < GSUBGPOS::get_lookup_count (); i++) - { - if (!c->gpos_lookups->has (i)) continue; - const GPOS_impl::PosLookup &l = get_lookup (i); - l.dispatch (c); - } - } - - void closure_lookups (hb_face_t *face, - const hb_set_t *glyphs, - hb_set_t *lookup_indexes /* IN/OUT */) const - { GSUBGPOS::closure_lookups (face, glyphs, lookup_indexes); } - - typedef GSUBGPOS::accelerator_t accelerator_t; -}; - - -static void -propagate_attachment_offsets (hb_glyph_position_t *pos, - unsigned int len, - unsigned int i, - hb_direction_t direction, - unsigned nesting_level) -{ - /* Adjusts offsets of attached glyphs (both cursive and mark) to accumulate - * offset of glyph they are attached to. */ - int chain = pos[i].attach_chain(), type = pos[i].attach_type(); - if (likely (!chain)) - return; - - pos[i].attach_chain() = 0; - - unsigned int j = (int) i + chain; - - if (unlikely (j >= len)) - return; - - if (unlikely (!nesting_level)) - return; - - propagate_attachment_offsets (pos, len, j, direction, nesting_level - 1); - - assert (!!(type & GPOS_impl::ATTACH_TYPE_MARK) ^ !!(type & GPOS_impl::ATTACH_TYPE_CURSIVE)); - - if (type & GPOS_impl::ATTACH_TYPE_CURSIVE) - { - if (HB_DIRECTION_IS_HORIZONTAL (direction)) - pos[i].y_offset += pos[j].y_offset; - else - pos[i].x_offset += pos[j].x_offset; - } - else /*if (type & GPOS_impl::ATTACH_TYPE_MARK)*/ - { - pos[i].x_offset += pos[j].x_offset; - pos[i].y_offset += pos[j].y_offset; - - assert (j < i); - if (HB_DIRECTION_IS_FORWARD (direction)) - for (unsigned int k = j; k < i; k++) { - pos[i].x_offset -= pos[k].x_advance; - pos[i].y_offset -= pos[k].y_advance; - } - else - for (unsigned int k = j + 1; k < i + 1; k++) { - pos[i].x_offset += pos[k].x_advance; - pos[i].y_offset += pos[k].y_advance; - } - } -} - -void -GPOS::position_start (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer) -{ - unsigned int count = buffer->len; - for (unsigned int i = 0; i < count; i++) - buffer->pos[i].attach_chain() = buffer->pos[i].attach_type() = 0; -} - -void -GPOS::position_finish_advances (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer HB_UNUSED) -{ - //_hb_buffer_assert_gsubgpos_vars (buffer); -} - -void -GPOS::position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer) -{ - _hb_buffer_assert_gsubgpos_vars (buffer); - - unsigned int len; - hb_glyph_position_t *pos = hb_buffer_get_glyph_positions (buffer, &len); - hb_direction_t direction = buffer->props.direction; - - /* Handle attachments */ - if (buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT) - for (unsigned i = 0; i < len; i++) - propagate_attachment_offsets (pos, len, i, direction); - - if (unlikely (font->slant)) - { - for (unsigned i = 0; i < len; i++) - if (unlikely (pos[i].y_offset)) - pos[i].x_offset += _hb_roundf (font->slant_xy * pos[i].y_offset); - } -} - -} - -struct GPOS_accelerator_t : Layout::GPOS::accelerator_t { - GPOS_accelerator_t (hb_face_t *face) : Layout::GPOS::accelerator_t (face) {} -}; - -} - -#endif /* OT_LAYOUT_GPOS_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/CursivePosFormat1.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/CursivePosFormat1.hh index e212fab976b..7c34bb3c93d 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/CursivePosFormat1.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/CursivePosFormat1.hh @@ -140,7 +140,7 @@ struct CursivePosFormat1 unsigned int i = skippy_iter.idx; unsigned int j = buffer->idx; - buffer->unsafe_to_break (i, j); + buffer->unsafe_to_break (i, j + 1); float entry_x, entry_y, exit_x, exit_y; (this+prev_record.exitAnchor).get_anchor (c, buffer->info[i].codepoint, &exit_x, &exit_y); (this+this_record.entryAnchor).get_anchor (c, buffer->info[j].codepoint, &entry_x, &entry_y); @@ -223,7 +223,13 @@ struct CursivePosFormat1 * https://github.com/harfbuzz/harfbuzz/issues/2469 */ if (unlikely (pos[parent].attach_chain() == -pos[child].attach_chain())) + { pos[parent].attach_chain() = 0; + if (likely (HB_DIRECTION_IS_HORIZONTAL (c->direction))) + pos[parent].y_offset = 0; + else + pos[parent].x_offset = 0; + } buffer->idx++; return_trace (true); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/GPOS.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/GPOS.hh new file mode 100644 index 00000000000..72829377a69 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/GPOS.hh @@ -0,0 +1,171 @@ +#ifndef OT_LAYOUT_GPOS_GPOS_HH +#define OT_LAYOUT_GPOS_GPOS_HH + +#include "../../../hb-ot-layout-common.hh" +#include "../../../hb-ot-layout-gsubgpos.hh" +#include "Common.hh" +#include "PosLookup.hh" + +namespace OT { + +using Layout::GPOS_impl::PosLookup; + +namespace Layout { + +static void +propagate_attachment_offsets (hb_glyph_position_t *pos, + unsigned int len, + unsigned int i, + hb_direction_t direction, + unsigned nesting_level = HB_MAX_NESTING_LEVEL); + +/* + * GPOS -- Glyph Positioning + * https://docs.microsoft.com/en-us/typography/opentype/spec/gpos + */ + +struct GPOS : GSUBGPOS +{ + static constexpr hb_tag_t tableTag = HB_OT_TAG_GPOS; + + using Lookup = PosLookup; + + const PosLookup& get_lookup (unsigned int i) const + { return static_cast (GSUBGPOS::get_lookup (i)); } + + static inline void position_start (hb_font_t *font, hb_buffer_t *buffer); + static inline void position_finish_advances (hb_font_t *font, hb_buffer_t *buffer); + static inline void position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer); + + bool subset (hb_subset_context_t *c) const + { + hb_subset_layout_context_t l (c, tableTag, c->plan->gpos_lookups, c->plan->gpos_langsys, c->plan->gpos_features); + return GSUBGPOS::subset (&l); + } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (GSUBGPOS::sanitize (c)); + } + + HB_INTERNAL bool is_blocklisted (hb_blob_t *blob, + hb_face_t *face) const; + + void collect_variation_indices (hb_collect_variation_indices_context_t *c) const + { + for (unsigned i = 0; i < GSUBGPOS::get_lookup_count (); i++) + { + if (!c->gpos_lookups->has (i)) continue; + const PosLookup &l = get_lookup (i); + l.dispatch (c); + } + } + + void closure_lookups (hb_face_t *face, + const hb_set_t *glyphs, + hb_set_t *lookup_indexes /* IN/OUT */) const + { GSUBGPOS::closure_lookups (face, glyphs, lookup_indexes); } + + typedef GSUBGPOS::accelerator_t accelerator_t; +}; + + +static void +propagate_attachment_offsets (hb_glyph_position_t *pos, + unsigned int len, + unsigned int i, + hb_direction_t direction, + unsigned nesting_level) +{ + /* Adjusts offsets of attached glyphs (both cursive and mark) to accumulate + * offset of glyph they are attached to. */ + int chain = pos[i].attach_chain(), type = pos[i].attach_type(); + if (likely (!chain)) + return; + + pos[i].attach_chain() = 0; + + unsigned int j = (int) i + chain; + + if (unlikely (j >= len)) + return; + + if (unlikely (!nesting_level)) + return; + + propagate_attachment_offsets (pos, len, j, direction, nesting_level - 1); + + assert (!!(type & GPOS_impl::ATTACH_TYPE_MARK) ^ !!(type & GPOS_impl::ATTACH_TYPE_CURSIVE)); + + if (type & GPOS_impl::ATTACH_TYPE_CURSIVE) + { + if (HB_DIRECTION_IS_HORIZONTAL (direction)) + pos[i].y_offset += pos[j].y_offset; + else + pos[i].x_offset += pos[j].x_offset; + } + else /*if (type & GPOS_impl::ATTACH_TYPE_MARK)*/ + { + pos[i].x_offset += pos[j].x_offset; + pos[i].y_offset += pos[j].y_offset; + + assert (j < i); + if (HB_DIRECTION_IS_FORWARD (direction)) + for (unsigned int k = j; k < i; k++) { + pos[i].x_offset -= pos[k].x_advance; + pos[i].y_offset -= pos[k].y_advance; + } + else + for (unsigned int k = j + 1; k < i + 1; k++) { + pos[i].x_offset += pos[k].x_advance; + pos[i].y_offset += pos[k].y_advance; + } + } +} + +void +GPOS::position_start (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer) +{ + unsigned int count = buffer->len; + for (unsigned int i = 0; i < count; i++) + buffer->pos[i].attach_chain() = buffer->pos[i].attach_type() = 0; +} + +void +GPOS::position_finish_advances (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer HB_UNUSED) +{ + //_hb_buffer_assert_gsubgpos_vars (buffer); +} + +void +GPOS::position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer) +{ + _hb_buffer_assert_gsubgpos_vars (buffer); + + unsigned int len; + hb_glyph_position_t *pos = hb_buffer_get_glyph_positions (buffer, &len); + hb_direction_t direction = buffer->props.direction; + + /* Handle attachments */ + if (buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT) + for (unsigned i = 0; i < len; i++) + propagate_attachment_offsets (pos, len, i, direction); + + if (unlikely (font->slant)) + { + for (unsigned i = 0; i < len; i++) + if (unlikely (pos[i].y_offset)) + pos[i].x_offset += _hb_roundf (font->slant_xy * pos[i].y_offset); + } +} + +} + +struct GPOS_accelerator_t : Layout::GPOS::accelerator_t { + GPOS_accelerator_t (hb_face_t *face) : Layout::GPOS::accelerator_t (face) {} +}; + +} + +#endif /* OT_LAYOUT_GPOS_GPOS_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/LigatureArray.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/LigatureArray.hh new file mode 100644 index 00000000000..a2d807cc320 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/LigatureArray.hh @@ -0,0 +1,56 @@ +#ifndef OT_LAYOUT_GPOS_LIGATUREARRAY_HH +#define OT_LAYOUT_GPOS_LIGATUREARRAY_HH + +namespace OT { +namespace Layout { +namespace GPOS_impl { + + +typedef AnchorMatrix LigatureAttach; /* component-major-- + * in order of writing direction--, + * mark-minor-- + * ordered by class--zero-based. */ + +/* Array of LigatureAttach tables ordered by LigatureCoverage Index */ +struct LigatureArray : List16OfOffset16To +{ + template + bool subset (hb_subset_context_t *c, + Iterator coverage, + unsigned class_count, + const hb_map_t *klass_mapping) const + { + TRACE_SUBSET (this); + const hb_set_t &glyphset = *c->plan->glyphset_gsub (); + + auto *out = c->serializer->start_embed (this); + if (unlikely (!c->serializer->extend_min (out))) return_trace (false); + + for (const auto _ : + hb_zip (coverage, *this) + | hb_filter (glyphset, hb_first)) + { + auto *matrix = out->serialize_append (c->serializer); + if (unlikely (!matrix)) return_trace (false); + + const LigatureAttach& src = (this + _.second); + auto indexes = + + hb_range (src.rows * class_count) + | hb_filter ([=] (unsigned index) { return klass_mapping->has (index % class_count); }) + ; + matrix->serialize_subset (c, + _.second, + this, + src.rows, + indexes); + } + return_trace (this->len); + } +}; + + +} +} +} + +#endif /* OT_LAYOUT_GPOS_LIGATUREARRAY_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkBasePos.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkBasePos.hh index e99e13ff84f..c99b6b2e4b7 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkBasePos.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkBasePos.hh @@ -11,8 +11,11 @@ struct MarkBasePos { protected: union { - HBUINT16 format; /* Format identifier */ - MarkBasePosFormat1 format1; + HBUINT16 format; /* Format identifier */ + MarkBasePosFormat1_2 format1; +#ifndef HB_NO_BORING_EXPANSION + MarkBasePosFormat1_2 format2; +#endif } u; public: @@ -23,6 +26,9 @@ struct MarkBasePos if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { case 1: return_trace (c->dispatch (u.format1, std::forward (ds)...)); +#ifndef HB_NO_BORING_EXPANSION + case 2: return_trace (c->dispatch (u.format2, std::forward (ds)...)); +#endif default:return_trace (c->default_return_value ()); } } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkBasePosFormat1.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkBasePosFormat1.hh index a10b806fe5f..ebb8c31c679 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkBasePosFormat1.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkBasePosFormat1.hh @@ -12,26 +12,27 @@ typedef AnchorMatrix BaseArray; /* base-major-- * mark-minor-- * ordered by class--zero-based. */ -struct MarkBasePosFormat1 +template +struct MarkBasePosFormat1_2 { protected: HBUINT16 format; /* Format identifier--format = 1 */ - Offset16To + typename Types::template OffsetTo markCoverage; /* Offset to MarkCoverage table--from * beginning of MarkBasePos subtable */ - Offset16To + typename Types::template OffsetTo baseCoverage; /* Offset to BaseCoverage table--from * beginning of MarkBasePos subtable */ HBUINT16 classCount; /* Number of classes defined for marks */ - Offset16To + typename Types::template OffsetTo markArray; /* Offset to MarkArray table--from * beginning of MarkBasePos subtable */ - Offset16To + typename Types::template OffsetTo baseArray; /* Offset to BaseArray table--from * beginning of MarkBasePos subtable */ public: - DEFINE_SIZE_STATIC (12); + DEFINE_SIZE_STATIC (4 + 4 * Types::size); bool sanitize (hb_sanitize_context_t *c) const { @@ -117,6 +118,7 @@ struct MarkBasePosFormat1 0 == _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx]) || (skippy_iter.idx == 0 || _hb_glyph_info_is_mark (&buffer->info[skippy_iter.idx - 1]) || + !_hb_glyph_info_multiplied (&buffer->info[skippy_iter.idx - 1]) || _hb_glyph_info_get_lig_id (&buffer->info[skippy_iter.idx]) != _hb_glyph_info_get_lig_id (&buffer->info[skippy_iter.idx - 1]) || _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx]) != diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkLigPos.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkLigPos.hh index 7e74aa73e0a..8a4de9ffaa6 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkLigPos.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkLigPos.hh @@ -11,8 +11,11 @@ struct MarkLigPos { protected: union { - HBUINT16 format; /* Format identifier */ - MarkLigPosFormat1 format1; + HBUINT16 format; /* Format identifier */ + MarkLigPosFormat1_2 format1; +#ifndef HB_NO_BORING_EXPANSION + MarkLigPosFormat1_2 format2; +#endif } u; public: @@ -23,6 +26,9 @@ struct MarkLigPos if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { case 1: return_trace (c->dispatch (u.format1, std::forward (ds)...)); +#ifndef HB_NO_BORING_EXPANSION + case 2: return_trace (c->dispatch (u.format2, std::forward (ds)...)); +#endif default:return_trace (c->default_return_value ()); } } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkLigPosFormat1.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkLigPosFormat1.hh index 4382aa6c6cb..1a8021237e2 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkLigPosFormat1.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkLigPosFormat1.hh @@ -1,72 +1,34 @@ #ifndef OT_LAYOUT_GPOS_MARKLIGPOSFORMAT1_HH #define OT_LAYOUT_GPOS_MARKLIGPOSFORMAT1_HH +#include "LigatureArray.hh" + namespace OT { namespace Layout { namespace GPOS_impl { -typedef AnchorMatrix LigatureAttach; /* component-major-- - * in order of writing direction--, - * mark-minor-- - * ordered by class--zero-based. */ - -/* Array of LigatureAttach tables ordered by LigatureCoverage Index */ -struct LigatureArray : List16OfOffset16To -{ - template - bool subset (hb_subset_context_t *c, - Iterator coverage, - unsigned class_count, - const hb_map_t *klass_mapping) const - { - TRACE_SUBSET (this); - const hb_set_t &glyphset = *c->plan->glyphset_gsub (); - - auto *out = c->serializer->start_embed (this); - if (unlikely (!c->serializer->extend_min (out))) return_trace (false); - - for (const auto _ : + hb_zip (coverage, *this) - | hb_filter (glyphset, hb_first)) - { - auto *matrix = out->serialize_append (c->serializer); - if (unlikely (!matrix)) return_trace (false); - - const LigatureAttach& src = (this + _.second); - auto indexes = - + hb_range (src.rows * class_count) - | hb_filter ([=] (unsigned index) { return klass_mapping->has (index % class_count); }) - ; - matrix->serialize_subset (c, - _.second, - this, - src.rows, - indexes); - } - return_trace (this->len); - } -}; -struct MarkLigPosFormat1 +template +struct MarkLigPosFormat1_2 { protected: HBUINT16 format; /* Format identifier--format = 1 */ - Offset16To + typename Types::template OffsetTo markCoverage; /* Offset to Mark Coverage table--from * beginning of MarkLigPos subtable */ - Offset16To + typename Types::template OffsetTo ligatureCoverage; /* Offset to Ligature Coverage * table--from beginning of MarkLigPos * subtable */ HBUINT16 classCount; /* Number of defined mark classes */ - Offset16To + typename Types::template OffsetTo markArray; /* Offset to MarkArray table--from * beginning of MarkLigPos subtable */ - Offset16To + typename Types::template OffsetTo ligatureArray; /* Offset to LigatureArray table--from * beginning of MarkLigPos subtable */ public: - DEFINE_SIZE_STATIC (12); + DEFINE_SIZE_STATIC (4 + 4 * Types::size); bool sanitize (hb_sanitize_context_t *c) const { diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkMarkPos.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkMarkPos.hh index c0eee6d54cf..74b5105c423 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkMarkPos.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkMarkPos.hh @@ -11,8 +11,11 @@ struct MarkMarkPos { protected: union { - HBUINT16 format; /* Format identifier */ - MarkMarkPosFormat1 format1; + HBUINT16 format; /* Format identifier */ + MarkMarkPosFormat1_2 format1; +#ifndef HB_NO_BORING_EXPANSION + MarkMarkPosFormat1_2 format2; +#endif } u; public: @@ -23,6 +26,9 @@ struct MarkMarkPos if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { case 1: return_trace (c->dispatch (u.format1, std::forward (ds)...)); +#ifndef HB_NO_BORING_EXPANSION + case 2: return_trace (c->dispatch (u.format2, std::forward (ds)...)); +#endif default:return_trace (c->default_return_value ()); } } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh index c48a74f7738..fbcebb80441 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh @@ -12,27 +12,28 @@ typedef AnchorMatrix Mark2Array; /* mark2-major-- * mark1-minor-- * ordered by class--zero-based. */ -struct MarkMarkPosFormat1 +template +struct MarkMarkPosFormat1_2 { protected: HBUINT16 format; /* Format identifier--format = 1 */ - Offset16To + typename Types::template OffsetTo mark1Coverage; /* Offset to Combining Mark1 Coverage * table--from beginning of MarkMarkPos * subtable */ - Offset16To + typename Types::template OffsetTo mark2Coverage; /* Offset to Combining Mark2 Coverage * table--from beginning of MarkMarkPos * subtable */ HBUINT16 classCount; /* Number of defined mark classes */ - Offset16To + typename Types::template OffsetTo mark1Array; /* Offset to Mark1Array table--from * beginning of MarkMarkPos subtable */ - Offset16To + typename Types::template OffsetTo mark2Array; /* Offset to Mark2Array table--from * beginning of MarkMarkPos subtable */ public: - DEFINE_SIZE_STATIC (12); + DEFINE_SIZE_STATIC (4 + 4 * Types::size); bool sanitize (hb_sanitize_context_t *c) const { @@ -100,7 +101,7 @@ struct MarkMarkPosFormat1 /* now we search backwards for a suitable mark glyph until a non-mark glyph */ hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; skippy_iter.reset (buffer->idx, 1); - skippy_iter.set_lookup_props (c->lookup_props & ~LookupFlag::IgnoreFlags); + skippy_iter.set_lookup_props (c->lookup_props & ~(uint32_t)LookupFlag::IgnoreFlags); unsigned unsafe_from; if (!skippy_iter.prev (&unsafe_from)) { diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/PairPos.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/PairPos.hh index 8479178d384..72bfc43dc43 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/PairPos.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/PairPos.hh @@ -12,9 +12,13 @@ struct PairPos { protected: union { - HBUINT16 format; /* Format identifier */ - PairPosFormat1 format1; - PairPosFormat2 format2; + HBUINT16 format; /* Format identifier */ + PairPosFormat1_3 format1; + PairPosFormat2_4 format2; +#ifndef HB_NO_BORING_EXPANSION + PairPosFormat1_3 format3; + PairPosFormat2_4 format4; +#endif } u; public: @@ -26,6 +30,10 @@ struct PairPos switch (u.format) { case 1: return_trace (c->dispatch (u.format1, std::forward (ds)...)); case 2: return_trace (c->dispatch (u.format2, std::forward (ds)...)); +#ifndef HB_NO_BORING_EXPANSION + case 3: return_trace (c->dispatch (u.format3, std::forward (ds)...)); + case 4: return_trace (c->dispatch (u.format4, std::forward (ds)...)); +#endif default:return_trace (c->default_return_value ()); } } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/PairPosFormat1.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/PairPosFormat1.hh index 35a2db2d45e..3cb207281d9 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/PairPosFormat1.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/PairPosFormat1.hh @@ -1,248 +1,22 @@ #ifndef OT_LAYOUT_GPOS_PAIRPOSFORMAT1_HH #define OT_LAYOUT_GPOS_PAIRPOSFORMAT1_HH +#include "PairSet.hh" + namespace OT { namespace Layout { namespace GPOS_impl { -struct PairValueRecord -{ - friend struct PairSet; - - int cmp (hb_codepoint_t k) const - { return secondGlyph.cmp (k); } - - struct context_t - { - const void *base; - const ValueFormat *valueFormats; - const ValueFormat *newFormats; - unsigned len1; /* valueFormats[0].get_len() */ - const hb_map_t *glyph_map; - const hb_map_t *layout_variation_idx_map; - }; - - bool subset (hb_subset_context_t *c, - context_t *closure) const - { - TRACE_SERIALIZE (this); - auto *s = c->serializer; - auto *out = s->start_embed (*this); - if (unlikely (!s->extend_min (out))) return_trace (false); - - out->secondGlyph = (*closure->glyph_map)[secondGlyph]; - - closure->valueFormats[0].copy_values (s, - closure->newFormats[0], - closure->base, &values[0], - closure->layout_variation_idx_map); - closure->valueFormats[1].copy_values (s, - closure->newFormats[1], - closure->base, - &values[closure->len1], - closure->layout_variation_idx_map); - - return_trace (true); - } - - void collect_variation_indices (hb_collect_variation_indices_context_t *c, - const ValueFormat *valueFormats, - const void *base) const - { - unsigned record1_len = valueFormats[0].get_len (); - unsigned record2_len = valueFormats[1].get_len (); - const hb_array_t values_array = values.as_array (record1_len + record2_len); - - if (valueFormats[0].has_device ()) - valueFormats[0].collect_variation_indices (c, base, values_array.sub_array (0, record1_len)); - - if (valueFormats[1].has_device ()) - valueFormats[1].collect_variation_indices (c, base, values_array.sub_array (record1_len, record2_len)); - } - - bool intersects (const hb_set_t& glyphset) const - { - return glyphset.has(secondGlyph); - } - - const Value* get_values_1 () const - { - return &values[0]; - } - - const Value* get_values_2 (ValueFormat format1) const - { - return &values[format1.get_len ()]; - } - protected: - HBGlyphID16 secondGlyph; /* GlyphID of second glyph in the - * pair--first glyph is listed in the - * Coverage table */ - ValueRecord values; /* Positioning data for the first glyph - * followed by for second glyph */ - public: - DEFINE_SIZE_ARRAY (2, values); -}; - -struct PairSet +template +struct PairPosFormat1_3 { - friend struct PairPosFormat1; - - bool intersects (const hb_set_t *glyphs, - const ValueFormat *valueFormats) const - { - unsigned int len1 = valueFormats[0].get_len (); - unsigned int len2 = valueFormats[1].get_len (); - unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2); - - const PairValueRecord *record = &firstPairValueRecord; - unsigned int count = len; - for (unsigned int i = 0; i < count; i++) - { - if (glyphs->has (record->secondGlyph)) - return true; - record = &StructAtOffset (record, record_size); - } - return false; - } - - void collect_glyphs (hb_collect_glyphs_context_t *c, - const ValueFormat *valueFormats) const - { - unsigned int len1 = valueFormats[0].get_len (); - unsigned int len2 = valueFormats[1].get_len (); - unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2); - - const PairValueRecord *record = &firstPairValueRecord; - c->input->add_array (&record->secondGlyph, len, record_size); - } - - void collect_variation_indices (hb_collect_variation_indices_context_t *c, - const ValueFormat *valueFormats) const - { - unsigned len1 = valueFormats[0].get_len (); - unsigned len2 = valueFormats[1].get_len (); - unsigned record_size = HBUINT16::static_size * (1 + len1 + len2); - - const PairValueRecord *record = &firstPairValueRecord; - unsigned count = len; - for (unsigned i = 0; i < count; i++) - { - if (c->glyph_set->has (record->secondGlyph)) - { record->collect_variation_indices (c, valueFormats, this); } - - record = &StructAtOffset (record, record_size); - } - } + using PairSet = GPOS_impl::PairSet; + using PairValueRecord = GPOS_impl::PairValueRecord; - bool apply (hb_ot_apply_context_t *c, - const ValueFormat *valueFormats, - unsigned int pos) const - { - TRACE_APPLY (this); - hb_buffer_t *buffer = c->buffer; - unsigned int len1 = valueFormats[0].get_len (); - unsigned int len2 = valueFormats[1].get_len (); - unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2); - - const PairValueRecord *record = hb_bsearch (buffer->info[pos].codepoint, - &firstPairValueRecord, - len, - record_size); - if (record) - { - bool applied_first = valueFormats[0].apply_value (c, this, &record->values[0], buffer->cur_pos()); - bool applied_second = valueFormats[1].apply_value (c, this, &record->values[len1], buffer->pos[pos]); - if (applied_first || applied_second) - buffer->unsafe_to_break (buffer->idx, pos + 1); - if (len2) - pos++; - buffer->idx = pos; - return_trace (true); - } - buffer->unsafe_to_concat (buffer->idx, pos + 1); - return_trace (false); - } - - bool subset (hb_subset_context_t *c, - const ValueFormat valueFormats[2], - const ValueFormat newFormats[2]) const - { - TRACE_SUBSET (this); - auto snap = c->serializer->snapshot (); - - auto *out = c->serializer->start_embed (*this); - if (unlikely (!c->serializer->extend_min (out))) return_trace (false); - out->len = 0; - - const hb_set_t &glyphset = *c->plan->glyphset_gsub (); - const hb_map_t &glyph_map = *c->plan->glyph_map; - - unsigned len1 = valueFormats[0].get_len (); - unsigned len2 = valueFormats[1].get_len (); - unsigned record_size = HBUINT16::static_size + Value::static_size * (len1 + len2); - - PairValueRecord::context_t context = - { - this, - valueFormats, - newFormats, - len1, - &glyph_map, - c->plan->layout_variation_idx_map - }; - - const PairValueRecord *record = &firstPairValueRecord; - unsigned count = len, num = 0; - for (unsigned i = 0; i < count; i++) - { - if (glyphset.has (record->secondGlyph) - && record->subset (c, &context)) num++; - record = &StructAtOffset (record, record_size); - } - - out->len = num; - if (!num) c->serializer->revert (snap); - return_trace (num); - } - - struct sanitize_closure_t - { - const ValueFormat *valueFormats; - unsigned int len1; /* valueFormats[0].get_len() */ - unsigned int stride; /* 1 + len1 + len2 */ - }; - - bool sanitize (hb_sanitize_context_t *c, const sanitize_closure_t *closure) const - { - TRACE_SANITIZE (this); - if (!(c->check_struct (this) - && c->check_range (&firstPairValueRecord, - len, - HBUINT16::static_size, - closure->stride))) return_trace (false); - - unsigned int count = len; - const PairValueRecord *record = &firstPairValueRecord; - return_trace (closure->valueFormats[0].sanitize_values_stride_unsafe (c, this, &record->values[0], count, closure->stride) && - closure->valueFormats[1].sanitize_values_stride_unsafe (c, this, &record->values[closure->len1], count, closure->stride)); - } - - protected: - HBUINT16 len; /* Number of PairValueRecords */ - PairValueRecord firstPairValueRecord; - /* Array of PairValueRecords--ordered - * by GlyphID of the second glyph */ - public: - DEFINE_SIZE_MIN (2); -}; - -struct PairPosFormat1 -{ protected: HBUINT16 format; /* Format identifier--format = 1 */ - Offset16To + typename Types::template OffsetTo coverage; /* Offset to Coverage table--from * beginning of subtable */ ValueFormat valueFormat[2]; /* [0] Defines the types of data in @@ -251,11 +25,11 @@ struct PairPosFormat1 /* [1] Defines the types of data in * ValueRecord2--for the second glyph * in the pair--may be zero (0) */ - Array16OfOffset16To + Array16Of> pairSet; /* Array of PairSet tables * ordered by Coverage Index */ public: - DEFINE_SIZE_ARRAY (10, pairSet); + DEFINE_SIZE_ARRAY (8 + Types::size, pairSet); bool sanitize (hb_sanitize_context_t *c) const { @@ -265,7 +39,7 @@ struct PairPosFormat1 unsigned int len1 = valueFormat[0].get_len (); unsigned int len2 = valueFormat[1].get_len (); - PairSet::sanitize_closure_t closure = + typename PairSet::sanitize_closure_t closure = { valueFormat, len1, @@ -275,14 +49,13 @@ struct PairPosFormat1 return_trace (coverage.sanitize (c, this) && pairSet.sanitize (c, this, &closure)); } - bool intersects (const hb_set_t *glyphs) const { return + hb_zip (this+coverage, pairSet) | hb_filter (*glyphs, hb_first) | hb_map (hb_second) - | hb_map ([glyphs, this] (const Offset16To &_) + | hb_map ([glyphs, this] (const typename Types::template OffsetTo &_) { return (this+_).intersects (glyphs, valueFormat); }) | hb_any ; @@ -358,7 +131,7 @@ struct PairPosFormat1 + hb_zip (this+coverage, pairSet) | hb_filter (glyphset, hb_first) - | hb_filter ([this, c, out] (const Offset16To& _) + | hb_filter ([this, c, out] (const typename Types::template OffsetTo& _) { auto snap = c->serializer->snapshot (); auto *o = out->pairSet.serialize_append (c->serializer); @@ -391,7 +164,7 @@ struct PairPosFormat1 unsigned format1 = 0; unsigned format2 = 0; - for (const Offset16To& _ : + for (const auto & _ : + hb_zip (this+coverage, pairSet) | hb_filter (glyphset, hb_first) | hb_map (hb_second)) { const PairSet& set = (this + _); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/PairPosFormat2.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/PairPosFormat2.hh index 3f5f9959c46..f58bcb1b303 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/PairPosFormat2.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/PairPosFormat2.hh @@ -7,11 +7,12 @@ namespace OT { namespace Layout { namespace GPOS_impl { -struct PairPosFormat2 +template +struct PairPosFormat2_4 { protected: HBUINT16 format; /* Format identifier--format = 2 */ - Offset16To + typename Types::template OffsetTo coverage; /* Offset to Coverage table--from * beginning of subtable */ ValueFormat valueFormat1; /* ValueRecord definition--for the @@ -20,11 +21,11 @@ struct PairPosFormat2 ValueFormat valueFormat2; /* ValueRecord definition--for the * second glyph of the pair--may be * zero (0) */ - Offset16To + typename Types::template OffsetTo classDef1; /* Offset to ClassDef table--from * beginning of PairPos subtable--for * the first glyph of the pair */ - Offset16To + typename Types::template OffsetTo classDef2; /* Offset to ClassDef table--from * beginning of PairPos subtable--for * the second glyph of the pair */ @@ -36,7 +37,7 @@ struct PairPosFormat2 * class1-major, class2-minor, * Each entry has value1 and value2 */ public: - DEFINE_SIZE_ARRAY (16, values); + DEFINE_SIZE_ARRAY (10 + 3 * Types::size, values); bool sanitize (hb_sanitize_context_t *c) const { diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/PairSet.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/PairSet.hh new file mode 100644 index 00000000000..58ba4de6c19 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/PairSet.hh @@ -0,0 +1,173 @@ +#ifndef OT_LAYOUT_GPOS_PAIRSET_HH +#define OT_LAYOUT_GPOS_PAIRSET_HH + +#include "PairValueRecord.hh" + +namespace OT { +namespace Layout { +namespace GPOS_impl { + + +template +struct PairSet +{ + template + friend struct PairPosFormat1_3; + + using PairValueRecord = GPOS_impl::PairValueRecord; + + protected: + HBUINT16 len; /* Number of PairValueRecords */ + PairValueRecord firstPairValueRecord; + /* Array of PairValueRecords--ordered + * by GlyphID of the second glyph */ + public: + DEFINE_SIZE_MIN (2); + + struct sanitize_closure_t + { + const ValueFormat *valueFormats; + unsigned int len1; /* valueFormats[0].get_len() */ + unsigned int stride; /* 1 + len1 + len2 */ + }; + + bool sanitize (hb_sanitize_context_t *c, const sanitize_closure_t *closure) const + { + TRACE_SANITIZE (this); + if (!(c->check_struct (this) + && c->check_range (&firstPairValueRecord, + len, + HBUINT16::static_size, + closure->stride))) return_trace (false); + + unsigned int count = len; + const PairValueRecord *record = &firstPairValueRecord; + return_trace (closure->valueFormats[0].sanitize_values_stride_unsafe (c, this, &record->values[0], count, closure->stride) && + closure->valueFormats[1].sanitize_values_stride_unsafe (c, this, &record->values[closure->len1], count, closure->stride)); + } + + bool intersects (const hb_set_t *glyphs, + const ValueFormat *valueFormats) const + { + unsigned int len1 = valueFormats[0].get_len (); + unsigned int len2 = valueFormats[1].get_len (); + unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2); + + const PairValueRecord *record = &firstPairValueRecord; + unsigned int count = len; + for (unsigned int i = 0; i < count; i++) + { + if (glyphs->has (record->secondGlyph)) + return true; + record = &StructAtOffset (record, record_size); + } + return false; + } + + void collect_glyphs (hb_collect_glyphs_context_t *c, + const ValueFormat *valueFormats) const + { + unsigned int len1 = valueFormats[0].get_len (); + unsigned int len2 = valueFormats[1].get_len (); + unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2); + + const PairValueRecord *record = &firstPairValueRecord; + c->input->add_array (&record->secondGlyph, len, record_size); + } + + void collect_variation_indices (hb_collect_variation_indices_context_t *c, + const ValueFormat *valueFormats) const + { + unsigned len1 = valueFormats[0].get_len (); + unsigned len2 = valueFormats[1].get_len (); + unsigned record_size = HBUINT16::static_size * (1 + len1 + len2); + + const PairValueRecord *record = &firstPairValueRecord; + unsigned count = len; + for (unsigned i = 0; i < count; i++) + { + if (c->glyph_set->has (record->secondGlyph)) + { record->collect_variation_indices (c, valueFormats, this); } + + record = &StructAtOffset (record, record_size); + } + } + + bool apply (hb_ot_apply_context_t *c, + const ValueFormat *valueFormats, + unsigned int pos) const + { + TRACE_APPLY (this); + hb_buffer_t *buffer = c->buffer; + unsigned int len1 = valueFormats[0].get_len (); + unsigned int len2 = valueFormats[1].get_len (); + unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2); + + const PairValueRecord *record = hb_bsearch (buffer->info[pos].codepoint, + &firstPairValueRecord, + len, + record_size); + if (record) + { + bool applied_first = valueFormats[0].apply_value (c, this, &record->values[0], buffer->cur_pos()); + bool applied_second = valueFormats[1].apply_value (c, this, &record->values[len1], buffer->pos[pos]); + if (applied_first || applied_second) + buffer->unsafe_to_break (buffer->idx, pos + 1); + if (len2) + pos++; + buffer->idx = pos; + return_trace (true); + } + buffer->unsafe_to_concat (buffer->idx, pos + 1); + return_trace (false); + } + + bool subset (hb_subset_context_t *c, + const ValueFormat valueFormats[2], + const ValueFormat newFormats[2]) const + { + TRACE_SUBSET (this); + auto snap = c->serializer->snapshot (); + + auto *out = c->serializer->start_embed (*this); + if (unlikely (!c->serializer->extend_min (out))) return_trace (false); + out->len = 0; + + const hb_set_t &glyphset = *c->plan->glyphset_gsub (); + const hb_map_t &glyph_map = *c->plan->glyph_map; + + unsigned len1 = valueFormats[0].get_len (); + unsigned len2 = valueFormats[1].get_len (); + unsigned record_size = HBUINT16::static_size + Value::static_size * (len1 + len2); + + typename PairValueRecord::context_t context = + { + this, + valueFormats, + newFormats, + len1, + &glyph_map, + c->plan->layout_variation_idx_map + }; + + const PairValueRecord *record = &firstPairValueRecord; + unsigned count = len, num = 0; + for (unsigned i = 0; i < count; i++) + { + if (glyphset.has (record->secondGlyph) + && record->subset (c, &context)) num++; + record = &StructAtOffset (record, record_size); + } + + out->len = num; + if (!num) c->serializer->revert (snap); + return_trace (num); + } +}; + + +} +} +} + +#endif // OT_LAYOUT_GPOS_PAIRSET_HH diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/PairValueRecord.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/PairValueRecord.hh new file mode 100644 index 00000000000..55de5abebf6 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/PairValueRecord.hh @@ -0,0 +1,97 @@ +#ifndef OT_LAYOUT_GPOS_PAIRVALUERECORD_HH +#define OT_LAYOUT_GPOS_PAIRVALUERECORD_HH + +namespace OT { +namespace Layout { +namespace GPOS_impl { + + +template +struct PairValueRecord +{ + template + friend struct PairSet; + + protected: + typename Types::HBGlyphID + secondGlyph; /* GlyphID of second glyph in the + * pair--first glyph is listed in the + * Coverage table */ + ValueRecord values; /* Positioning data for the first glyph + * followed by for second glyph */ + public: + DEFINE_SIZE_ARRAY (Types::size, values); + + int cmp (hb_codepoint_t k) const + { return secondGlyph.cmp (k); } + + struct context_t + { + const void *base; + const ValueFormat *valueFormats; + const ValueFormat *newFormats; + unsigned len1; /* valueFormats[0].get_len() */ + const hb_map_t *glyph_map; + const hb_map_t *layout_variation_idx_map; + }; + + bool subset (hb_subset_context_t *c, + context_t *closure) const + { + TRACE_SERIALIZE (this); + auto *s = c->serializer; + auto *out = s->start_embed (*this); + if (unlikely (!s->extend_min (out))) return_trace (false); + + out->secondGlyph = (*closure->glyph_map)[secondGlyph]; + + closure->valueFormats[0].copy_values (s, + closure->newFormats[0], + closure->base, &values[0], + closure->layout_variation_idx_map); + closure->valueFormats[1].copy_values (s, + closure->newFormats[1], + closure->base, + &values[closure->len1], + closure->layout_variation_idx_map); + + return_trace (true); + } + + void collect_variation_indices (hb_collect_variation_indices_context_t *c, + const ValueFormat *valueFormats, + const void *base) const + { + unsigned record1_len = valueFormats[0].get_len (); + unsigned record2_len = valueFormats[1].get_len (); + const hb_array_t values_array = values.as_array (record1_len + record2_len); + + if (valueFormats[0].has_device ()) + valueFormats[0].collect_variation_indices (c, base, values_array.sub_array (0, record1_len)); + + if (valueFormats[1].has_device ()) + valueFormats[1].collect_variation_indices (c, base, values_array.sub_array (record1_len, record2_len)); + } + + bool intersects (const hb_set_t& glyphset) const + { + return glyphset.has(secondGlyph); + } + + const Value* get_values_1 () const + { + return &values[0]; + } + + const Value* get_values_2 (ValueFormat format1) const + { + return &values[format1.get_len ()]; + } +}; + + +} +} +} + +#endif // OT_LAYOUT_GPOS_PAIRVALUERECORD_HH diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/SinglePos.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/SinglePos.hh index 57e146befd6..702f578b3c7 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/SinglePos.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/SinglePos.hh @@ -45,10 +45,7 @@ struct SinglePos ValueFormat new_format = src->get_value_format (); if (glyph_val_iter_pairs) - { format = get_format (glyph_val_iter_pairs); - new_format = src->get_value_format ().get_effective_format (+ glyph_val_iter_pairs | hb_map (hb_second)); - } u.format = format; switch (u.format) { diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/SinglePosFormat1.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/SinglePosFormat1.hh index 8b7840ed0eb..c0e7d29ceab 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/SinglePosFormat1.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GPOS/SinglePosFormat1.hh @@ -104,9 +104,11 @@ struct SinglePosFormat1 const hb_set_t &glyphset = *c->plan->glyphset_gsub (); const hb_map_t &glyph_map = *c->plan->glyph_map; + hb_set_t intersection; + (this+coverage).intersect_set (glyphset, intersection); + auto it = - + hb_iter (this+coverage) - | hb_filter (glyphset) + + hb_iter (intersection) | hb_map_retains_sorting (glyph_map) | hb_zip (hb_repeat (values.as_array (valueFormat.get_len ()))) ; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/AlternateSet.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/AlternateSet.hh index 484f3474686..a5dcb653599 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/AlternateSet.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/AlternateSet.hh @@ -5,12 +5,13 @@ namespace OT { namespace Layout { -namespace GSUB { +namespace GSUB_impl { +template struct AlternateSet { protected: - Array16Of + Array16Of alternates; /* Array of alternate GlyphIDs--in * arbitrary order */ public: diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/AlternateSubst.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/AlternateSubst.hh index e5d999261fc..37406179a28 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/AlternateSubst.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/AlternateSubst.hh @@ -6,14 +6,17 @@ namespace OT { namespace Layout { -namespace GSUB { +namespace GSUB_impl { struct AlternateSubst { protected: union { - HBUINT16 format; /* Format identifier */ - AlternateSubstFormat1 format1; + HBUINT16 format; /* Format identifier */ + AlternateSubstFormat1_2 format1; +#ifndef HB_NO_BORING_EXPANSION + AlternateSubstFormat1_2 format2; +#endif } u; public: @@ -24,10 +27,15 @@ struct AlternateSubst if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { case 1: return_trace (c->dispatch (u.format1, std::forward (ds)...)); +#ifndef HB_NO_BORING_EXPANSION + case 2: return_trace (c->dispatch (u.format2, std::forward (ds)...)); +#endif default:return_trace (c->default_return_value ()); } } + /* TODO This function is unused and not updated to 24bit GIDs. Should be done by using + * iterators. While at it perhaps using iterator of arrays of hb_codepoint_t instead. */ bool serialize (hb_serialize_context_t *c, hb_sorted_array_t glyphs, hb_array_t alternate_len_list, @@ -42,6 +50,9 @@ struct AlternateSubst default:return_trace (false); } } + + /* TODO subset() should choose format. */ + }; } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/AlternateSubstFormat1.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/AlternateSubstFormat1.hh index af1cd7bedba..adec65d5864 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/AlternateSubstFormat1.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/AlternateSubstFormat1.hh @@ -6,20 +6,21 @@ namespace OT { namespace Layout { -namespace GSUB { +namespace GSUB_impl { -struct AlternateSubstFormat1 +template +struct AlternateSubstFormat1_2 { protected: HBUINT16 format; /* Format identifier--format = 1 */ - Offset16To + typename Types::template OffsetTo coverage; /* Offset to Coverage table--from * beginning of Substitution table */ - Array16OfOffset16To + Array16Of>> alternateSet; /* Array of AlternateSet tables * ordered by Coverage Index */ public: - DEFINE_SIZE_ARRAY (6, alternateSet); + DEFINE_SIZE_ARRAY (2 + 2 * Types::size, alternateSet); bool sanitize (hb_sanitize_context_t *c) const { @@ -39,9 +40,8 @@ struct AlternateSubstFormat1 | hb_filter (c->parent_active_glyphs (), hb_first) | hb_map (hb_second) | hb_map (hb_add (this)) - | hb_apply ([c] (const AlternateSet &_) { _.closure (c); }) + | hb_apply ([c] (const AlternateSet &_) { _.closure (c); }) ; - } void closure_lookups (hb_closure_lookups_context_t *c) const {} @@ -52,7 +52,7 @@ struct AlternateSubstFormat1 + hb_zip (this+coverage, alternateSet) | hb_map (hb_second) | hb_map (hb_add (this)) - | hb_apply ([c] (const AlternateSet &_) { _.collect_glyphs (c); }) + | hb_apply ([c] (const AlternateSet &_) { _.collect_glyphs (c); }) ; } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/ChainContextSubst.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/ChainContextSubst.hh index bbb88b222f8..08fd779f730 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/ChainContextSubst.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/ChainContextSubst.hh @@ -7,7 +7,7 @@ namespace OT { namespace Layout { -namespace GSUB { +namespace GSUB_impl { struct ChainContextSubst : ChainContext {}; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/Common.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/Common.hh index f4c78a9f020..968bba0481a 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/Common.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/Common.hh @@ -6,7 +6,7 @@ namespace OT { namespace Layout { -namespace GSUB { +namespace GSUB_impl { typedef hb_pair_t hb_codepoint_pair_t; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/ContextSubst.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/ContextSubst.hh index 2af54e8ff47..9f8cb46b5e2 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/ContextSubst.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/ContextSubst.hh @@ -7,7 +7,7 @@ namespace OT { namespace Layout { -namespace GSUB { +namespace GSUB_impl { struct ContextSubst : Context {}; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/ExtensionSubst.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/ExtensionSubst.hh index 40a3ff439f1..831a7dfa2d1 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/ExtensionSubst.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/ExtensionSubst.hh @@ -7,7 +7,7 @@ namespace OT { namespace Layout { -namespace GSUB { +namespace GSUB_impl { struct ExtensionSubst : Extension { diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/GSUB.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/GSUB.hh index 3f0c4b2ad9a..c0ff098f491 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/GSUB.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/GSUB.hh @@ -1,16 +1,15 @@ #ifndef OT_LAYOUT_GSUB_GSUB_HH #define OT_LAYOUT_GSUB_GSUB_HH -// TODO(garretrieger): move to new layout. #include "../../../hb-ot-layout-gsubgpos.hh" #include "Common.hh" #include "SubstLookup.hh" -using OT::Layout::GSUB::SubstLookup; - namespace OT { + +using Layout::GSUB_impl::SubstLookup; + namespace Layout { -namespace GSUB { /* * GSUB -- Glyph Substitution @@ -33,7 +32,10 @@ struct GSUB : GSUBGPOS } bool sanitize (hb_sanitize_context_t *c) const - { return GSUBGPOS::sanitize (c); } + { + TRACE_SANITIZE (this); + return_trace (GSUBGPOS::sanitize (c)); + } HB_INTERNAL bool is_blocklisted (hb_blob_t *blob, hb_face_t *face) const; @@ -47,11 +49,10 @@ struct GSUB : GSUBGPOS }; -} } -struct GSUB_accelerator_t : Layout::GSUB::GSUB::accelerator_t { - GSUB_accelerator_t (hb_face_t *face) : Layout::GSUB::GSUB::accelerator_t (face) {} +struct GSUB_accelerator_t : Layout::GSUB::accelerator_t { + GSUB_accelerator_t (hb_face_t *face) : Layout::GSUB::accelerator_t (face) {} }; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/Ligature.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/Ligature.hh index 0448d925d12..22ed65f858a 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/Ligature.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/Ligature.hh @@ -5,18 +5,20 @@ namespace OT { namespace Layout { -namespace GSUB { +namespace GSUB_impl { +template struct Ligature { protected: - HBGlyphID16 ligGlyph; /* GlyphID of ligature to substitute */ - HeadlessArrayOf - component; /* Array of component GlyphIDs--start + typename Types::HBGlyphID + ligGlyph; /* GlyphID of ligature to substitute */ + HeadlessArrayOf + component; /* Array of component GlyphIDs--start * with the second component--ordered * in writing direction */ public: - DEFINE_SIZE_ARRAY (4, component); + DEFINE_SIZE_ARRAY (Types::size + 2, component); bool sanitize (hb_sanitize_context_t *c) const { diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/LigatureSet.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/LigatureSet.hh index 185b324b35b..637cec71377 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/LigatureSet.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/LigatureSet.hh @@ -6,12 +6,13 @@ namespace OT { namespace Layout { -namespace GSUB { +namespace GSUB_impl { +template struct LigatureSet { protected: - Array16OfOffset16To + Array16OfOffset16To> ligature; /* Array LigatureSet tables * ordered by preference */ public: @@ -28,7 +29,7 @@ struct LigatureSet return + hb_iter (ligature) | hb_map (hb_add (this)) - | hb_map ([glyphs] (const Ligature &_) { return _.intersects (glyphs); }) + | hb_map ([glyphs] (const Ligature &_) { return _.intersects (glyphs); }) | hb_any ; } @@ -37,7 +38,7 @@ struct LigatureSet { + hb_iter (ligature) | hb_map (hb_add (this)) - | hb_apply ([c] (const Ligature &_) { _.closure (c); }) + | hb_apply ([c] (const Ligature &_) { _.closure (c); }) ; } @@ -45,7 +46,7 @@ struct LigatureSet { + hb_iter (ligature) | hb_map (hb_add (this)) - | hb_apply ([c] (const Ligature &_) { _.collect_glyphs (c); }) + | hb_apply ([c] (const Ligature &_) { _.collect_glyphs (c); }) ; } @@ -54,7 +55,7 @@ struct LigatureSet return + hb_iter (ligature) | hb_map (hb_add (this)) - | hb_map ([c] (const Ligature &_) { return _.would_apply (c); }) + | hb_map ([c] (const Ligature &_) { return _.would_apply (c); }) | hb_any ; } @@ -65,7 +66,7 @@ struct LigatureSet unsigned int num_ligs = ligature.len; for (unsigned int i = 0; i < num_ligs; i++) { - const Ligature &lig = this+ligature[i]; + const auto &lig = this+ligature[i]; if (lig.apply (c)) return_trace (true); } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/LigatureSubst.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/LigatureSubst.hh index a029bf5e9f4..63707972a81 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/LigatureSubst.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/LigatureSubst.hh @@ -6,14 +6,17 @@ namespace OT { namespace Layout { -namespace GSUB { +namespace GSUB_impl { struct LigatureSubst { protected: union { - HBUINT16 format; /* Format identifier */ - LigatureSubstFormat1 format1; + HBUINT16 format; /* Format identifier */ + LigatureSubstFormat1_2 format1; +#ifndef HB_NO_BORING_EXPANSION + LigatureSubstFormat1_2 format2; +#endif } u; public: @@ -24,10 +27,16 @@ struct LigatureSubst if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { case 1: return_trace (c->dispatch (u.format1, std::forward (ds)...)); +#ifndef HB_NO_BORING_EXPANSION + case 2: return_trace (c->dispatch (u.format2, std::forward (ds)...)); +#endif default:return_trace (c->default_return_value ()); } } + /* TODO This function is only used by small GIDs, and not updated to 24bit GIDs. Should + * be done by using iterators. While at it perhaps using iterator of arrays of hb_codepoint_t + * instead. */ bool serialize (hb_serialize_context_t *c, hb_sorted_array_t first_glyphs, hb_array_t ligature_per_first_glyph_count_list, @@ -49,6 +58,9 @@ struct LigatureSubst default:return_trace (false); } } + + /* TODO subset() should choose format. */ + }; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/LigatureSubstFormat1.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/LigatureSubstFormat1.hh index 19dfe984694..32b642c38ad 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/LigatureSubstFormat1.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/LigatureSubstFormat1.hh @@ -6,20 +6,21 @@ namespace OT { namespace Layout { -namespace GSUB { +namespace GSUB_impl { -struct LigatureSubstFormat1 +template +struct LigatureSubstFormat1_2 { protected: HBUINT16 format; /* Format identifier--format = 1 */ - Offset16To + typename Types::template OffsetTo coverage; /* Offset to Coverage table--from * beginning of Substitution table */ - Array16OfOffset16To + Array16Of>> ligatureSet; /* Array LigatureSet tables * ordered by Coverage Index */ public: - DEFINE_SIZE_ARRAY (6, ligatureSet); + DEFINE_SIZE_ARRAY (4 + Types::size, ligatureSet); bool sanitize (hb_sanitize_context_t *c) const { @@ -33,7 +34,7 @@ struct LigatureSubstFormat1 + hb_zip (this+coverage, ligatureSet) | hb_filter (*glyphs, hb_first) | hb_map (hb_second) - | hb_map ([this, glyphs] (const Offset16To &_) + | hb_map ([this, glyphs] (const typename Types::template OffsetTo> &_) { return (this+_).intersects (glyphs); }) | hb_any ; @@ -48,7 +49,7 @@ struct LigatureSubstFormat1 | hb_filter (c->parent_active_glyphs (), hb_first) | hb_map (hb_second) | hb_map (hb_add (this)) - | hb_apply ([c] (const LigatureSet &_) { _.closure (c); }) + | hb_apply ([c] (const LigatureSet &_) { _.closure (c); }) ; } @@ -62,7 +63,7 @@ struct LigatureSubstFormat1 + hb_zip (this+coverage, ligatureSet) | hb_map (hb_second) | hb_map (hb_add (this)) - | hb_apply ([c] (const LigatureSet &_) { _.collect_glyphs (c); }) + | hb_apply ([c] (const LigatureSet &_) { _.collect_glyphs (c); }) ; } @@ -73,7 +74,7 @@ struct LigatureSubstFormat1 unsigned int index = (this+coverage).get_coverage (c->glyphs[0]); if (likely (index == NOT_COVERED)) return false; - const LigatureSet &lig_set = this+ligatureSet[index]; + const auto &lig_set = this+ligatureSet[index]; return lig_set.would_apply (c); } @@ -84,7 +85,7 @@ struct LigatureSubstFormat1 unsigned int index = (this+coverage).get_coverage (c->buffer->cur ().codepoint); if (likely (index == NOT_COVERED)) return_trace (false); - const LigatureSet &lig_set = this+ligatureSet[index]; + const auto &lig_set = this+ligatureSet[index]; return_trace (lig_set.apply (c)); } @@ -128,7 +129,7 @@ struct LigatureSubstFormat1 hb_set_t new_coverage; + hb_zip (this+coverage, hb_iter (ligatureSet) | hb_map (hb_add (this))) | hb_filter (glyphset, hb_first) - | hb_filter ([&] (const LigatureSet& _) { + | hb_filter ([&] (const LigatureSet& _) { return _.intersects (&glyphset); }, hb_second) | hb_map (hb_first) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/MultipleSubst.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/MultipleSubst.hh index b2891755048..98f2f5fe7a3 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/MultipleSubst.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/MultipleSubst.hh @@ -6,14 +6,17 @@ namespace OT { namespace Layout { -namespace GSUB { +namespace GSUB_impl { struct MultipleSubst { protected: union { - HBUINT16 format; /* Format identifier */ - MultipleSubstFormat1 format1; + HBUINT16 format; /* Format identifier */ + MultipleSubstFormat1_2 format1; +#ifndef HB_NO_BORING_EXPANSION + MultipleSubstFormat1_2 format2; +#endif } u; public: @@ -25,10 +28,15 @@ struct MultipleSubst if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { case 1: return_trace (c->dispatch (u.format1, std::forward (ds)...)); +#ifndef HB_NO_BORING_EXPANSION + case 2: return_trace (c->dispatch (u.format2, std::forward (ds)...)); +#endif default:return_trace (c->default_return_value ()); } } + /* TODO This function is unused and not updated to 24bit GIDs. Should be done by using + * iterators. While at it perhaps using iterator of arrays of hb_codepoint_t instead. */ bool serialize (hb_serialize_context_t *c, hb_sorted_array_t glyphs, hb_array_t substitute_len_list, @@ -43,6 +51,9 @@ struct MultipleSubst default:return_trace (false); } } + + /* TODO subset() should choose format. */ + }; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/MultipleSubstFormat1.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/MultipleSubstFormat1.hh index 54c6dc84783..89a04ec3b12 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/MultipleSubstFormat1.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/MultipleSubstFormat1.hh @@ -6,20 +6,21 @@ namespace OT { namespace Layout { -namespace GSUB { +namespace GSUB_impl { -struct MultipleSubstFormat1 +template +struct MultipleSubstFormat1_2 { protected: HBUINT16 format; /* Format identifier--format = 1 */ - Offset16To + typename Types::template OffsetTo coverage; /* Offset to Coverage table--from * beginning of Substitution table */ - Array16OfOffset16To + Array16Of>> sequence; /* Array of Sequence tables * ordered by Coverage Index */ public: - DEFINE_SIZE_ARRAY (6, sequence); + DEFINE_SIZE_ARRAY (4 + Types::size, sequence); bool sanitize (hb_sanitize_context_t *c) const { @@ -39,7 +40,7 @@ struct MultipleSubstFormat1 | hb_filter (c->parent_active_glyphs (), hb_first) | hb_map (hb_second) | hb_map (hb_add (this)) - | hb_apply ([c] (const Sequence &_) { _.closure (c); }) + | hb_apply ([c] (const Sequence &_) { _.closure (c); }) ; } @@ -51,7 +52,7 @@ struct MultipleSubstFormat1 + hb_zip (this+coverage, sequence) | hb_map (hb_second) | hb_map (hb_add (this)) - | hb_apply ([c] (const Sequence &_) { _.collect_glyphs (c); }) + | hb_apply ([c] (const Sequence &_) { _.collect_glyphs (c); }) ; } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/ReverseChainSingleSubst.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/ReverseChainSingleSubst.hh index 435d80fd310..48e208efb9c 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/ReverseChainSingleSubst.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/ReverseChainSingleSubst.hh @@ -6,7 +6,7 @@ namespace OT { namespace Layout { -namespace GSUB { +namespace GSUB_impl { struct ReverseChainSingleSubst { diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh index 7a79a9df25e..1d27df95dda 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh @@ -5,7 +5,7 @@ namespace OT { namespace Layout { -namespace GSUB { +namespace GSUB_impl { struct ReverseChainSingleSubstFormat1 { @@ -33,10 +33,10 @@ struct ReverseChainSingleSubstFormat1 TRACE_SANITIZE (this); if (!(coverage.sanitize (c, this) && backtrack.sanitize (c, this))) return_trace (false); - const Array16OfOffset16To &lookahead = StructAfter> (backtrack); + const auto &lookahead = StructAfter (backtrack); if (!lookahead.sanitize (c, this)) return_trace (false); - const Array16Of &substitute = StructAfter> (lookahead); + const auto &substitute = StructAfter (lookahead); return_trace (substitute.sanitize (c)); } @@ -45,7 +45,7 @@ struct ReverseChainSingleSubstFormat1 if (!(this+coverage).intersects (glyphs)) return false; - const Array16OfOffset16To &lookahead = StructAfter> (backtrack); + const auto &lookahead = StructAfter (backtrack); unsigned int count; @@ -69,8 +69,8 @@ struct ReverseChainSingleSubstFormat1 { if (!intersects (c->glyphs)) return; - const Array16OfOffset16To &lookahead = StructAfter> (backtrack); - const Array16Of &substitute = StructAfter> (lookahead); + const auto &lookahead = StructAfter (backtrack); + const auto &substitute = StructAfter (lookahead); + hb_zip (this+coverage, substitute) | hb_filter (c->parent_active_glyphs (), hb_first) @@ -91,12 +91,12 @@ struct ReverseChainSingleSubstFormat1 for (unsigned int i = 0; i < count; i++) if (unlikely (!(this+backtrack[i]).collect_coverage (c->before))) return; - const Array16OfOffset16To &lookahead = StructAfter> (backtrack); + const auto &lookahead = StructAfter (backtrack); count = lookahead.len; for (unsigned int i = 0; i < count; i++) if (unlikely (!(this+lookahead[i]).collect_coverage (c->after))) return; - const Array16Of &substitute = StructAfter> (lookahead); + const auto &substitute = StructAfter (lookahead); count = substitute.len; c->output->add_array (substitute.arrayZ, substitute.len); } @@ -115,8 +115,8 @@ struct ReverseChainSingleSubstFormat1 unsigned int index = (this+coverage).get_coverage (c->buffer->cur ().codepoint); if (likely (index == NOT_COVERED)) return_trace (false); - const Array16OfOffset16To &lookahead = StructAfter> (backtrack); - const Array16Of &substitute = StructAfter> (lookahead); + const auto &lookahead = StructAfter (backtrack); + const auto &substitute = StructAfter (lookahead); if (unlikely (index >= substitute.len)) return_trace (false); @@ -206,8 +206,8 @@ struct ReverseChainSingleSubstFormat1 const hb_set_t &glyphset = *c->plan->glyphset_gsub (); const hb_map_t &glyph_map = *c->plan->glyph_map; - const Array16OfOffset16To &lookahead = StructAfter> (backtrack); - const Array16Of &substitute = StructAfter> (lookahead); + const auto &lookahead = StructAfter (backtrack); + const auto &substitute = StructAfter (lookahead); auto it = + hb_zip (this+coverage, substitute) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/Sequence.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/Sequence.hh index ebd451e6ba3..c5cd15bb23d 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/Sequence.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/Sequence.hh @@ -5,12 +5,13 @@ namespace OT { namespace Layout { -namespace GSUB { +namespace GSUB_impl { +template struct Sequence { protected: - Array16Of + Array16Of substitute; /* String of GlyphIDs to substitute */ public: DEFINE_SIZE_ARRAY (2, substitute); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SingleSubst.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SingleSubst.hh index 786428fe453..6942e6997f6 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SingleSubst.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SingleSubst.hh @@ -7,15 +7,19 @@ namespace OT { namespace Layout { -namespace GSUB { +namespace GSUB_impl { struct SingleSubst { protected: union { - HBUINT16 format; /* Format identifier */ - SingleSubstFormat1 format1; - SingleSubstFormat2 format2; + HBUINT16 format; /* Format identifier */ + SingleSubstFormat1_3 format1; + SingleSubstFormat2_4 format2; +#ifndef HB_NO_BORING_EXPANSION + SingleSubstFormat1_3 format3; + SingleSubstFormat2_4 format4; +#endif } u; public: @@ -28,6 +32,10 @@ struct SingleSubst switch (u.format) { case 1: return_trace (c->dispatch (u.format1, std::forward (ds)...)); case 2: return_trace (c->dispatch (u.format2, std::forward (ds)...)); +#ifndef HB_NO_BORING_EXPANSION + case 3: return_trace (c->dispatch (u.format3, std::forward (ds)...)); + case 4: return_trace (c->dispatch (u.format4, std::forward (ds)...)); +#endif default:return_trace (c->default_return_value ()); } } @@ -45,11 +53,24 @@ struct SingleSubst if (glyphs) { format = 1; + hb_codepoint_t mask = 0xFFFFu; + +#ifndef HB_NO_BORING_EXPANSION + if (+ glyphs + | hb_map_retains_sorting (hb_first) + | hb_filter ([] (hb_codepoint_t gid) { return gid > 0xFFFFu; })) + { + format += 2; + mask = 0xFFFFFFu; + } +#endif + auto get_delta = [=] (hb_codepoint_pair_t _) - { return (unsigned) (_.second - _.first) & 0xFFFF; }; + { return (unsigned) (_.second - _.first) & mask; }; delta = get_delta (*glyphs); - if (!hb_all (++(+glyphs), delta, get_delta)) format = 2; + if (!hb_all (++(+glyphs), delta, get_delta)) format += 1; } + u.format = format; switch (u.format) { case 1: return_trace (u.format1.serialize (c, @@ -57,6 +78,13 @@ struct SingleSubst | hb_map_retains_sorting (hb_first), delta)); case 2: return_trace (u.format2.serialize (c, glyphs)); +#ifndef HB_NO_BORING_EXPANSION + case 3: return_trace (u.format3.serialize (c, + + glyphs + | hb_map_retains_sorting (hb_first), + delta)); + case 4: return_trace (u.format4.serialize (c, glyphs)); +#endif default:return_trace (false); } } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SingleSubstFormat1.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SingleSubstFormat1.hh index 3c6b2954cec..dd445957417 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SingleSubstFormat1.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SingleSubstFormat1.hh @@ -5,20 +5,22 @@ namespace OT { namespace Layout { -namespace GSUB { +namespace GSUB_impl { -struct SingleSubstFormat1 +template +struct SingleSubstFormat1_3 { protected: HBUINT16 format; /* Format identifier--format = 1 */ - Offset16To + typename Types::template OffsetTo coverage; /* Offset to Coverage table--from * beginning of Substitution table */ - HBUINT16 deltaGlyphID; /* Add to original GlyphID to get + typename Types::HBUINT + deltaGlyphID; /* Add to original GlyphID to get * substitute GlyphID, modulo 0x10000 */ public: - DEFINE_SIZE_STATIC (6); + DEFINE_SIZE_STATIC (2 + 2 * Types::size); bool sanitize (hb_sanitize_context_t *c) const { @@ -26,6 +28,9 @@ struct SingleSubstFormat1 return_trace (coverage.sanitize (c, this) && deltaGlyphID.sanitize (c)); } + hb_codepoint_t get_mask () const + { return (1 << (8 * Types::size)) - 1; } + bool intersects (const hb_set_t *glyphs) const { return (this+coverage).intersects (glyphs); } @@ -34,14 +39,16 @@ struct SingleSubstFormat1 void closure (hb_closure_context_t *c) const { - unsigned d = deltaGlyphID; + hb_codepoint_t d = deltaGlyphID; + hb_codepoint_t mask = get_mask (); - + hb_iter (this+coverage) - | hb_filter (c->parent_active_glyphs ()) - | hb_map ([d] (hb_codepoint_t g) { return (g + d) & 0xFFFFu; }) + hb_set_t intersection; + (this+coverage).intersect_set (c->parent_active_glyphs (), intersection); + + + hb_iter (intersection) + | hb_map ([d, mask] (hb_codepoint_t g) { return (g + d) & mask; }) | hb_sink (c->output) ; - } void closure_lookups (hb_closure_lookups_context_t *c) const {} @@ -49,9 +56,11 @@ struct SingleSubstFormat1 void collect_glyphs (hb_collect_glyphs_context_t *c) const { if (unlikely (!(this+coverage).collect_coverage (c->input))) return; - unsigned d = deltaGlyphID; + hb_codepoint_t d = deltaGlyphID; + hb_codepoint_t mask = get_mask (); + + hb_iter (this+coverage) - | hb_map ([d] (hb_codepoint_t g) { return (g + d) & 0xFFFFu; }) + | hb_map ([d, mask] (hb_codepoint_t g) { return (g + d) & mask; }) | hb_sink (c->output) ; } @@ -68,9 +77,11 @@ struct SingleSubstFormat1 unsigned int index = (this+coverage).get_coverage (glyph_id); if (likely (index == NOT_COVERED)) return_trace (false); - /* According to the Adobe Annotated OpenType Suite, result is always - * limited to 16bit. */ - glyph_id = (glyph_id + deltaGlyphID) & 0xFFFFu; + hb_codepoint_t d = deltaGlyphID; + hb_codepoint_t mask = get_mask (); + + glyph_id = (glyph_id + d) & mask; + c->replace_glyph (glyph_id); return_trace (true); @@ -95,14 +106,17 @@ struct SingleSubstFormat1 const hb_set_t &glyphset = *c->plan->glyphset_gsub (); const hb_map_t &glyph_map = *c->plan->glyph_map; - hb_codepoint_t delta = deltaGlyphID; + hb_codepoint_t d = deltaGlyphID; + hb_codepoint_t mask = get_mask (); + + hb_set_t intersection; + (this+coverage).intersect_set (glyphset, intersection); auto it = - + hb_iter (this+coverage) - | hb_filter (glyphset) - | hb_map_retains_sorting ([&] (hb_codepoint_t g) { + + hb_iter (intersection) + | hb_map_retains_sorting ([d, mask] (hb_codepoint_t g) { return hb_codepoint_pair_t (g, - (g + delta) & 0xFFFF); }) + (g + d) & mask); }) | hb_filter (glyphset, hb_second) | hb_map_retains_sorting ([&] (hb_codepoint_pair_t p) -> hb_codepoint_pair_t { return hb_pair (glyph_map[p.first], glyph_map[p.second]); }) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SingleSubstFormat2.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SingleSubstFormat2.hh index df75bb52bbc..386419a2a5b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SingleSubstFormat2.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SingleSubstFormat2.hh @@ -5,21 +5,22 @@ namespace OT { namespace Layout { -namespace GSUB { +namespace GSUB_impl { -struct SingleSubstFormat2 +template +struct SingleSubstFormat2_4 { protected: HBUINT16 format; /* Format identifier--format = 2 */ - Offset16To + typename Types::template OffsetTo coverage; /* Offset to Coverage table--from * beginning of Substitution table */ - Array16Of + Array16Of substitute; /* Array of substitute * GlyphIDs--ordered by Coverage Index */ public: - DEFINE_SIZE_ARRAY (6, substitute); + DEFINE_SIZE_ARRAY (4 + Types::size, substitute); bool sanitize (hb_sanitize_context_t *c) const { @@ -103,7 +104,7 @@ struct SingleSubstFormat2 + hb_zip (this+coverage, substitute) | hb_filter (glyphset, hb_first) | hb_filter (glyphset, hb_second) - | hb_map_retains_sorting ([&] (hb_pair_t p) -> hb_codepoint_pair_t + | hb_map_retains_sorting ([&] (hb_pair_t p) -> hb_codepoint_pair_t { return hb_pair (glyph_map[p.first], glyph_map[p.second]); }) ; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SubstLookup.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SubstLookup.hh index 8fb3b550976..320685b868b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SubstLookup.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SubstLookup.hh @@ -6,7 +6,7 @@ namespace OT { namespace Layout { -namespace GSUB { +namespace GSUB_impl { struct SubstLookup : Lookup { @@ -25,7 +25,7 @@ struct SubstLookup : Lookup { unsigned int type = get_type (); if (unlikely (type == SubTable::Extension)) - return reinterpret_cast (get_subtable (0)).is_reverse (); + return get_subtable (0).u.extension.is_reverse (); return lookup_type_is_reverse (type); } @@ -98,10 +98,15 @@ struct SubstLookup : Lookup return dispatch (c); } + template bool serialize_single (hb_serialize_context_t *c, uint32_t lookup_props, - hb_sorted_array_t glyphs, - hb_array_t substitutes) + Glyphs glyphs, + Substitutes substitutes) { TRACE_SERIALIZE (this); if (unlikely (!Lookup::serialize (c, SubTable::Single, lookup_props, 1))) return_trace (false); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SubstLookupSubTable.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SubstLookupSubTable.hh index 53e963e2a29..a525fba0399 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SubstLookupSubTable.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/GSUB/SubstLookupSubTable.hh @@ -13,7 +13,7 @@ namespace OT { namespace Layout { -namespace GSUB { +namespace GSUB_impl { struct SubstLookupSubTable { diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/types.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/types.hh new file mode 100644 index 00000000000..6a43403e94b --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/Layout/types.hh @@ -0,0 +1,66 @@ +/* + * Copyright © 2007,2008,2009 Red Hat, Inc. + * Copyright © 2010,2012 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod, Garret Rieger + */ + +#ifndef OT_LAYOUT_TYPES_HH +#define OT_LAYOUT_TYPES_HH + +namespace OT { +namespace Layout { + +struct SmallTypes { + static constexpr unsigned size = 2; + using large_int = uint32_t; + using HBUINT = HBUINT16; + using HBGlyphID = HBGlyphID16; + using Offset = Offset16; + template + using OffsetTo = OT::Offset16To; + template + using ArrayOf = OT::Array16Of; + template + using SortedArrayOf = OT::SortedArray16Of; +}; + +struct MediumTypes { + static constexpr unsigned size = 3; + using large_int = uint64_t; + using HBUINT = HBUINT24; + using HBGlyphID = HBGlyphID24; + using Offset = Offset24; + template + using OffsetTo = OT::Offset24To; + template + using ArrayOf = OT::Array24Of; + template + using SortedArrayOf = OT::SortedArray24Of; +}; + +} +} + +#endif /* OT_LAYOUT_TYPES_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/CompositeGlyph.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/CompositeGlyph.hh index c145beaa49a..abe4c8330c0 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/CompositeGlyph.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/CompositeGlyph.hh @@ -25,13 +25,16 @@ struct CompositeGlyphRecord USE_MY_METRICS = 0x0200, OVERLAP_COMPOUND = 0x0400, SCALED_COMPONENT_OFFSET = 0x0800, - UNSCALED_COMPONENT_OFFSET = 0x1000 + UNSCALED_COMPONENT_OFFSET = 0x1000, + GID_IS_24BIT = 0x2000 }; public: unsigned int get_size () const { unsigned int size = min_size; + /* glyphIndex is 24bit instead of 16bit */ + if (flags & GID_IS_24BIT) size += HBGlyphID24::static_size - HBGlyphID16::static_size; /* arg1 and 2 are int16 */ if (flags & ARG_1_AND_2_ARE_WORDS) size += 4; /* arg1 and 2 are int8 */ @@ -60,7 +63,11 @@ struct CompositeGlyphRecord bool is_anchored () const { return !(flags & ARGS_ARE_XY_VALUES); } void get_anchor_points (unsigned int &point1, unsigned int &point2) const { - const HBUINT8 *p = &StructAfter (glyphIndex); + const auto *p = &StructAfter (flags); + if (flags & GID_IS_24BIT) + p += HBGlyphID24::static_size; + else + p += HBGlyphID16::static_size; if (flags & ARG_1_AND_2_ARE_WORDS) { point1 = ((const HBUINT16 *) p)[0]; @@ -101,8 +108,12 @@ struct CompositeGlyphRecord matrix[0] = matrix[3] = 1.f; matrix[1] = matrix[2] = 0.f; + const auto *p = &StructAfter (flags); + if (flags & GID_IS_24BIT) + p += HBGlyphID24::static_size; + else + p += HBGlyphID16::static_size; int tx, ty; - const HBINT8 *p = &StructAfter (glyphIndex); if (flags & ARG_1_AND_2_ARE_WORDS) { tx = *(const HBINT16 *) p; @@ -145,8 +156,25 @@ struct CompositeGlyphRecord } public: + hb_codepoint_t get_gid () const + { + if (flags & GID_IS_24BIT) + return StructAfter (flags); + else + return StructAfter (flags); + } + void set_gid (hb_codepoint_t gid) + { + if (flags & GID_IS_24BIT) + StructAfter (flags) = gid; + else + /* TODO assert? */ + StructAfter (flags) = gid; + } + + protected: HBUINT16 flags; - HBGlyphID16 glyphIndex; + HBUINT24 pad; public: DEFINE_SIZE_MIN (4); }; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/Glyph.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/Glyph.hh index 2199d2c48b8..3efe538f370 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/Glyph.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/Glyph.hh @@ -105,19 +105,21 @@ struct Glyph if (unlikely (!points.resize (points.length + PHANTOM_COUNT))) return false; hb_array_t phantoms = points.sub_array (points.length - PHANTOM_COUNT, PHANTOM_COUNT); { - int h_delta = (int) header->xMin - - glyf_accelerator.hmtx->get_side_bearing (gid); + int lsb = 0; + int h_delta = glyf_accelerator.hmtx->get_leading_bearing_without_var_unscaled (gid, &lsb) ? + (int) header->xMin - lsb : 0; + int tsb = 0; int v_orig = (int) header->yMax + #ifndef HB_NO_VERTICAL - glyf_accelerator.vmtx->get_side_bearing (gid) + ((void) glyf_accelerator.vmtx->get_leading_bearing_without_var_unscaled (gid, &tsb), tsb) #else 0 #endif ; - unsigned h_adv = glyf_accelerator.hmtx->get_advance (gid); + unsigned h_adv = glyf_accelerator.hmtx->get_advance_without_var_unscaled (gid); unsigned v_adv = #ifndef HB_NO_VERTICAL - glyf_accelerator.vmtx->get_advance (gid) + glyf_accelerator.vmtx->get_advance_without_var_unscaled (gid) #else - font->face->get_upem () #endif @@ -144,7 +146,7 @@ struct Glyph for (auto &item : get_composite_iterator ()) { comp_points.reset (); - if (unlikely (!glyf_accelerator.glyph_for_gid (item.glyphIndex) + if (unlikely (!glyf_accelerator.glyph_for_gid (item.get_gid ()) .get_points (font, glyf_accelerator, comp_points, phantom_only, depth + 1))) return false; @@ -198,11 +200,11 @@ struct Glyph return !all_points.in_error (); } - bool get_extents (hb_font_t *font, const glyf_accelerator_t &glyf_accelerator, - hb_glyph_extents_t *extents) const + bool get_extents_without_var_scaled (hb_font_t *font, const glyf_accelerator_t &glyf_accelerator, + hb_glyph_extents_t *extents) const { if (type == EMPTY) return true; /* Empty glyph; zero extents. */ - return header->get_extents (font, glyf_accelerator, gid, extents); + return header->get_extents_without_var_scaled (font, glyf_accelerator, gid, extents); } hb_bytes_t get_bytes () const { return bytes; } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/GlyphHeader.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/GlyphHeader.hh index 792bd5478f5..e4a9168b79f 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/GlyphHeader.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/GlyphHeader.hh @@ -14,12 +14,14 @@ struct GlyphHeader bool has_data () const { return numberOfContours; } template - bool get_extents (hb_font_t *font, const accelerator_t &glyf_accelerator, - hb_codepoint_t gid, hb_glyph_extents_t *extents) const + bool get_extents_without_var_scaled (hb_font_t *font, const accelerator_t &glyf_accelerator, + hb_codepoint_t gid, hb_glyph_extents_t *extents) const { /* Undocumented rasterizer behavior: shift glyph to the left by (lsb - xMin), i.e., xMin = lsb */ /* extents->x_bearing = hb_min (glyph_header.xMin, glyph_header.xMax); */ - extents->x_bearing = font->em_scale_x (glyf_accelerator.hmtx->get_side_bearing (gid)); + int lsb = hb_min (xMin, xMax); + (void) glyf_accelerator.hmtx->get_leading_bearing_without_var_unscaled (gid, &lsb); + extents->x_bearing = font->em_scale_x (lsb); extents->y_bearing = font->em_scale_y (hb_max (yMin, yMax)); extents->width = font->em_scale_x (hb_max (xMin, xMax) - hb_min (xMin, xMax)); extents->height = font->em_scale_y (hb_min (yMin, yMax) - hb_max (yMin, yMax)); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/SubsetGlyph.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/SubsetGlyph.hh index ebe43720475..7ae8fe30780 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/SubsetGlyph.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/SubsetGlyph.hh @@ -42,8 +42,8 @@ struct SubsetGlyph for (auto &_ : Glyph (dest_glyph).get_composite_iterator ()) { hb_codepoint_t new_gid; - if (plan->new_gid_for_old_gid (_.glyphIndex, &new_gid)) - const_cast (_).glyphIndex = new_gid; + if (plan->new_gid_for_old_gid (_.get_gid(), &new_gid)) + const_cast (_).set_gid (new_gid); } if (plan->flags & HB_SUBSET_FLAGS_NO_HINTING) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/glyf.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/glyf.hh index f74513cb968..bcaf44fc1e7 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/glyf.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/OT/glyf/glyf.hh @@ -194,6 +194,7 @@ struct glyf_accelerator_t hb_font_t *font; hb_glyph_extents_t *extents; contour_point_t *phantoms; + bool scaled; struct contour_bounds_t { @@ -209,7 +210,7 @@ struct glyf_accelerator_t bool empty () const { return (min_x >= max_x) || (min_y >= max_y); } - void get_extents (hb_font_t *font, hb_glyph_extents_t *extents) + void get_extents (hb_font_t *font, hb_glyph_extents_t *extents, bool scaled) { if (unlikely (empty ())) { @@ -219,26 +220,37 @@ struct glyf_accelerator_t extents->y_bearing = 0; return; } - extents->x_bearing = font->em_scalef_x (min_x); - extents->width = font->em_scalef_x (max_x) - extents->x_bearing; - extents->y_bearing = font->em_scalef_y (max_y); - extents->height = font->em_scalef_y (min_y) - extents->y_bearing; + if (scaled) + { + extents->x_bearing = font->em_scalef_x (min_x); + extents->width = font->em_scalef_x (max_x) - extents->x_bearing; + extents->y_bearing = font->em_scalef_y (max_y); + extents->height = font->em_scalef_y (min_y) - extents->y_bearing; + } + else + { + extents->x_bearing = roundf (min_x); + extents->width = roundf (max_x - extents->x_bearing); + extents->y_bearing = roundf (max_y); + extents->height = roundf (min_y - extents->y_bearing); + } } protected: float min_x, min_y, max_x, max_y; } bounds; - points_aggregator_t (hb_font_t *font_, hb_glyph_extents_t *extents_, contour_point_t *phantoms_) + points_aggregator_t (hb_font_t *font_, hb_glyph_extents_t *extents_, contour_point_t *phantoms_, bool scaled_) { font = font_; extents = extents_; phantoms = phantoms_; + scaled = scaled_; if (extents) bounds = contour_bounds_t (); } void consume_point (const contour_point_t &point) { bounds.add (point); } - void points_end () { bounds.get_extents (font, extents); } + void points_end () { bounds.get_extents (font, extents, scaled); } bool is_consuming_contour_points () { return extents; } contour_point_t *get_phantoms_sink () { return phantoms; } @@ -246,22 +258,22 @@ struct glyf_accelerator_t public: unsigned - get_advance_var (hb_font_t *font, hb_codepoint_t gid, bool is_vertical) const + get_advance_with_var_unscaled (hb_font_t *font, hb_codepoint_t gid, bool is_vertical) const { if (unlikely (gid >= num_glyphs)) return 0; bool success = false; contour_point_t phantoms[glyf_impl::PHANTOM_COUNT]; - if (likely (font->num_coords == gvar->get_axis_count ())) - success = get_points (font, gid, points_aggregator_t (font, nullptr, phantoms)); + if (font->num_coords) + success = get_points (font, gid, points_aggregator_t (font, nullptr, phantoms, false)); if (unlikely (!success)) return #ifndef HB_NO_VERTICAL - is_vertical ? vmtx->get_advance (gid) : + is_vertical ? vmtx->get_advance_without_var_unscaled (gid) : #endif - hmtx->get_advance (gid); + hmtx->get_advance_without_var_unscaled (gid); float result = is_vertical ? phantoms[glyf_impl::PHANTOM_TOP].y - phantoms[glyf_impl::PHANTOM_BOTTOM].y @@ -269,23 +281,20 @@ struct glyf_accelerator_t return hb_clamp (roundf (result), 0.f, (float) UINT_MAX / 2); } - int get_side_bearing_var (hb_font_t *font, hb_codepoint_t gid, bool is_vertical) const + bool get_leading_bearing_with_var_unscaled (hb_font_t *font, hb_codepoint_t gid, bool is_vertical, int *lsb) const { - if (unlikely (gid >= num_glyphs)) return 0; + if (unlikely (gid >= num_glyphs)) return false; hb_glyph_extents_t extents; contour_point_t phantoms[glyf_impl::PHANTOM_COUNT]; - if (unlikely (!get_points (font, gid, points_aggregator_t (font, &extents, phantoms)))) - return -#ifndef HB_NO_VERTICAL - is_vertical ? vmtx->get_side_bearing (gid) : -#endif - hmtx->get_side_bearing (gid); + if (unlikely (!get_points (font, gid, points_aggregator_t (font, &extents, phantoms, false)))) + return false; - return is_vertical - ? ceilf (phantoms[glyf_impl::PHANTOM_TOP].y) - extents.y_bearing - : floorf (phantoms[glyf_impl::PHANTOM_LEFT].x); + *lsb = is_vertical + ? roundf (phantoms[glyf_impl::PHANTOM_TOP].y) - extents.y_bearing + : roundf (phantoms[glyf_impl::PHANTOM_LEFT].x); + return true; } #endif @@ -296,9 +305,9 @@ struct glyf_accelerator_t #ifndef HB_NO_VAR if (font->num_coords) - return get_points (font, gid, points_aggregator_t (font, extents, nullptr)); + return get_points (font, gid, points_aggregator_t (font, extents, nullptr, true)); #endif - return glyph_for_gid (gid).get_extents (font, *this, extents); + return glyph_for_gid (gid).get_extents_without_var_scaled (font, *this, extents); } const glyf_impl::Glyph diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py index 205ed7ebdb4..47b7b479df4 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py @@ -19,7 +19,9 @@ symbols = sorted (re.findall (r"^hb_\w+(?= \()", "\n".join (headers_content), re if '--experimental-api' not in sys.argv: # Move these to harfbuzz-sections.txt when got stable experimental_symbols = \ -"""hb_subset_repack_or_fail""".splitlines () +"""hb_subset_repack_or_fail +hb_subset_input_pin_axis_location +hb_subset_input_pin_axis_to_default""".splitlines () symbols = [x for x in symbols if x not in experimental_symbols] symbols = "\n".join (symbols) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-harfbuzzcc.py b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-harfbuzzcc.py index 6801281a68c..1a492d47a69 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-harfbuzzcc.py +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-harfbuzzcc.py @@ -9,7 +9,9 @@ if len (sys.argv) < 3: OUTPUT = sys.argv[1] CURRENT_SOURCE_DIR = sys.argv[2] -sources = sys.argv[3:] + +# make sure input files are unique +sources = sorted(set(sys.argv[3:])) with open (OUTPUT, "wb") as f: f.write ("".join ('#include "{}"\n'.format (os.path.basename (x)) for x in sources if x.endswith (".cc")).encode ()) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py index 5daab7063ab..5e6a3b02f32 100755 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py @@ -478,64 +478,15 @@ for k,v in sorted(use_positions.items()): print ("#define %s USE(%s)" % (tag, tag)) print ('#pragma GCC diagnostic pop') print ("") -print ("static const uint8_t use_table[] = {") -for u in uu: - if u <= last: - continue - if use_data[u][0] == 'O': - continue - block = use_data[u][1] - - start = u//8*8 - end = start+1 - while end in uu and block == use_data[end][1]: - end += 1 - end = (end-1)//8*8 + 7 - - if start != last + 1: - if start - last <= 1+16*3: - print_block (None, last+1, start-1, use_data) - else: - if last >= 0: - ends.append (last + 1) - offset += ends[-1] - starts[-1] - print () - print () - print ("#define use_offset_0x%04xu %d" % (start, offset)) - starts.append (start) - print_block (block, start, end, use_data) - last = end -ends.append (last + 1) -offset += ends[-1] - starts[-1] -print () -print () -occupancy = used * 100. / total -page_bits = 12 -print ("}; /* Table items: %d; occupancy: %d%% */" % (offset, occupancy)) -print () -print ("static inline uint8_t") -print ("hb_use_get_category (hb_glyph_info_t info)") -print ("{") -print (" hb_codepoint_t u = info.codepoint;") -print (" switch (u >> %d)" % page_bits) -print (" {") -pages = set([u>>page_bits for u in starts+ends]) -for p in sorted(pages): - print (" case 0x%0Xu:" % p) - for (start,end) in zip (starts, ends): - if p not in [start>>page_bits, end>>page_bits]: continue - offset = "use_offset_0x%04xu" % start - print (" if (hb_in_range (u, 0x%04Xu, 0x%04Xu)) return use_table[u - 0x%04Xu + %s];" % (start, end-1, start, offset)) - print (" break;") - print ("") -print (" default:") -print (" break;") -print (" }") -print (" if (_hb_glyph_info_get_general_category (&info) == HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED)") -print (" return WJ;") -print (" return O;") -print ("}") + +import packTab +data = {u:v[0] for u,v in use_data.items()} +code = packTab.Code('hb_use') +sol = packTab.pack_table(data, compression=5, default='O') +sol.genCode(code, f'get_category') +code.print_c(linkage='static inline') + print () for k in sorted(use_mapping.keys()): if k in use_positions and use_positions[k]: continue @@ -549,7 +500,3 @@ print () print () print ("#endif /* HB_OT_SHAPER_USE_TABLE_HH */") print ("/* == End of generated table == */") - -# Maintain at least 50% occupancy in the table */ -if occupancy < 50: - raise Exception ("Table too sparse, please investigate: ", occupancy) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/graph/graph.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/graph/graph.hh index 52ca9dd142e..49638f34a72 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/graph/graph.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/graph/graph.hh @@ -265,28 +265,64 @@ struct graph_t } /* - * Assign unique space numbers to each connected subgraph of 32 bit offset(s). + * Finds the set of nodes (placed into roots) that should be assigned unique spaces. + * More specifically this looks for the top most 24 bit or 32 bit links in the graph. + * Some special casing is done that is specific to the layout of GSUB/GPOS tables. */ - bool assign_32bit_spaces () + void find_space_roots (hb_set_t& visited, hb_set_t& roots) { - unsigned root_index = root_idx (); - hb_set_t visited; - hb_set_t roots; - for (unsigned i = 0; i <= root_index; i++) + int root_index = (int) root_idx (); + for (int i = root_index; i >= 0; i--) { + if (visited.has (i)) continue; + // Only real links can form 32 bit spaces for (auto& l : vertices_[i].obj.real_links) { - if (l.width == 4 && !l.is_signed) + if (l.is_signed || l.width < 3) + continue; + + if (i == root_index && l.width == 3) + // Ignore 24bit links from the root node, this skips past the single 24bit + // pointer to the lookup list. + continue; + + if (l.width == 3) { - roots.add (l.objidx); - find_subgraph (l.objidx, visited); + // A 24bit offset forms a root, unless there is 32bit offsets somewhere + // in it's subgraph, then those become the roots instead. This is to make sure + // that extension subtables beneath a 24bit lookup become the spaces instead + // of the offset to the lookup. + hb_set_t sub_roots; + find_32bit_roots (l.objidx, sub_roots); + if (sub_roots) { + for (unsigned sub_root_idx : sub_roots) { + roots.add (sub_root_idx); + find_subgraph (sub_root_idx, visited); + } + continue; + } } + + roots.add (l.objidx); + find_subgraph (l.objidx, visited); } } + } - // Mark everything not in the subgraphs of 32 bit roots as visited. - // This prevents 32 bit subgraphs from being connected via nodes not in the 32 bit subgraphs. + /* + * Assign unique space numbers to each connected subgraph of 24 bit and/or 32 bit offset(s). + * Currently, this is implemented specifically tailored to the structure of a GPOS/GSUB + * (including with 24bit offsets) table. + */ + bool assign_spaces () + { + hb_set_t visited; + hb_set_t roots; + find_space_roots (visited, roots); + + // Mark everything not in the subgraphs of the roots as visited. This prevents + // subgraphs from being connected via nodes not in those subgraphs. visited.invert (); if (!roots) return false; @@ -422,6 +458,22 @@ struct graph_t find_subgraph (link.objidx, subgraph); } + /* + * Finds the topmost children of 32bit offsets in the subgraph starting + * at node_idx. Found indices are placed into 'found'. + */ + void find_32bit_roots (unsigned node_idx, hb_set_t& found) + { + for (const auto& link : vertices_[node_idx].obj.all_links ()) + { + if (!link.is_signed && link.width == 4) { + found.add (link.objidx); + continue; + } + find_32bit_roots (link.objidx, found); + } + } + /* * duplicates all nodes in the subgraph reachable from node_idx. Does not re-assign * links. index_map is updated with mappings from old id to new id. If a duplication has already @@ -622,7 +674,7 @@ struct graph_t private: /* - * Returns the numbers of incoming edges that are 32bits wide. + * Returns the numbers of incoming edges that are 24 or 32 bits wide. */ unsigned wide_parents (unsigned node_idx, hb_set_t& parents) const { @@ -636,7 +688,9 @@ struct graph_t // Only real links can be wide for (const auto& l : vertices_[p].obj.real_links) { - if (l.objidx == node_idx && l.width == 4 && !l.is_signed) + if (l.objidx == node_idx + && (l.width == 3 || l.width == 4) + && !l.is_signed) { count++; parents.add (p); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz-subset.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz-subset.cc new file mode 100644 index 00000000000..39e7f14fafc --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz-subset.cc @@ -0,0 +1,56 @@ +#include "hb-aat-layout.cc" +#include "hb-aat-map.cc" +#include "hb-blob.cc" +#include "hb-buffer-serialize.cc" +#include "hb-buffer-verify.cc" +#include "hb-buffer.cc" +#include "hb-common.cc" +#include "hb-draw.cc" +#include "hb-face.cc" +#include "hb-fallback-shape.cc" +#include "hb-font.cc" +#include "hb-map.cc" +#include "hb-number.cc" +#include "hb-ot-cff1-table.cc" +#include "hb-ot-cff2-table.cc" +#include "hb-ot-color.cc" +#include "hb-ot-face.cc" +#include "hb-ot-font.cc" +#include "hb-ot-layout.cc" +#include "hb-ot-map.cc" +#include "hb-ot-math.cc" +#include "hb-ot-meta.cc" +#include "hb-ot-metrics.cc" +#include "hb-ot-name.cc" +#include "hb-ot-shape-fallback.cc" +#include "hb-ot-shape-normalize.cc" +#include "hb-ot-shape.cc" +#include "hb-ot-shaper-arabic.cc" +#include "hb-ot-shaper-default.cc" +#include "hb-ot-shaper-hangul.cc" +#include "hb-ot-shaper-hebrew.cc" +#include "hb-ot-shaper-indic-table.cc" +#include "hb-ot-shaper-indic.cc" +#include "hb-ot-shaper-khmer.cc" +#include "hb-ot-shaper-myanmar.cc" +#include "hb-ot-shaper-syllabic.cc" +#include "hb-ot-shaper-thai.cc" +#include "hb-ot-shaper-use.cc" +#include "hb-ot-shaper-vowel-constraints.cc" +#include "hb-ot-tag.cc" +#include "hb-ot-var.cc" +#include "hb-set.cc" +#include "hb-shape-plan.cc" +#include "hb-shape.cc" +#include "hb-shaper.cc" +#include "hb-static.cc" +#include "hb-style.cc" +#include "hb-subset-cff-common.cc" +#include "hb-subset-cff1.cc" +#include "hb-subset-cff2.cc" +#include "hb-subset-input.cc" +#include "hb-subset-plan.cc" +#include "hb-subset-repacker.cc" +#include "hb-subset.cc" +#include "hb-ucd.cc" +#include "hb-unicode.cc" diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz.cc index 05a864ae11f..fe4e21db07f 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz.cc @@ -5,10 +5,16 @@ #include "hb-buffer-verify.cc" #include "hb-buffer.cc" #include "hb-common.cc" +#include "hb-coretext.cc" +#include "hb-directwrite.cc" #include "hb-draw.cc" #include "hb-face.cc" #include "hb-fallback-shape.cc" #include "hb-font.cc" +#include "hb-ft.cc" +#include "hb-gdi.cc" +#include "hb-glib.cc" +#include "hb-graphite2.cc" #include "hb-map.cc" #include "hb-number.cc" #include "hb-ot-cff1-table.cc" @@ -22,6 +28,9 @@ #include "hb-ot-meta.cc" #include "hb-ot-metrics.cc" #include "hb-ot-name.cc" +#include "hb-ot-shape-fallback.cc" +#include "hb-ot-shape-normalize.cc" +#include "hb-ot-shape.cc" #include "hb-ot-shaper-arabic.cc" #include "hb-ot-shaper-default.cc" #include "hb-ot-shaper-hangul.cc" @@ -34,9 +43,6 @@ #include "hb-ot-shaper-thai.cc" #include "hb-ot-shaper-use.cc" #include "hb-ot-shaper-vowel-constraints.cc" -#include "hb-ot-shape-fallback.cc" -#include "hb-ot-shape-normalize.cc" -#include "hb-ot-shape.cc" #include "hb-ot-tag.cc" #include "hb-ot-var.cc" #include "hb-set.cc" @@ -47,10 +53,4 @@ #include "hb-style.cc" #include "hb-ucd.cc" #include "hb-unicode.cc" -#include "hb-glib.cc" -#include "hb-ft.cc" -#include "hb-graphite2.cc" #include "hb-uniscribe.cc" -#include "hb-gdi.cc" -#include "hb-directwrite.cc" -#include "hb-coretext.cc" diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-bsln-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-bsln-table.hh index b52844e75d6..bf12d2e699f 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-bsln-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-bsln-table.hh @@ -42,7 +42,7 @@ struct BaselineTableFormat0Part bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this))); + return_trace (c->check_struct (this)); } protected: @@ -78,7 +78,7 @@ struct BaselineTableFormat2Part bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this))); + return_trace (c->check_struct (this)); } protected: diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common.hh index 1db0f1df928..6cbed826921 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common.hh @@ -415,18 +415,7 @@ struct Lookup public: DEFINE_SIZE_UNION (2, format); }; -/* Lookup 0 has unbounded size (dependant on num_glyphs). So we need to defined - * special NULL objects for Lookup<> objects, but since it's template our macros - * don't work. So we have to hand-code them here. UGLY. */ -} /* Close namespace. */ -/* Ugly hand-coded null objects for template Lookup<> :(. */ -extern HB_INTERNAL const unsigned char _hb_Null_AAT_Lookup[2]; -template -struct Null> { - static AAT::Lookup const & get_null () - { return *reinterpret_cast *> (_hb_Null_AAT_Lookup); } -}; -namespace AAT { +DECLARE_NULL_NAMESPACE_BYTES_TEMPLATE1 (AAT, Lookup, 2); enum { DELETED_GLYPH = 0xFFFF }; @@ -681,6 +670,13 @@ struct ObsoleteTypes const void *base, const T *array) { + /* https://github.com/harfbuzz/harfbuzz/issues/3483 */ + /* If offset is less than base, return an offset that would + * result in an address half a 32bit address-space away, + * to make sure sanitize fails even on 32bit builds. */ + if (unlikely (offset < unsigned ((const char *) array - (const char *) base))) + return INT_MAX / T::static_size; + /* https://github.com/harfbuzz/harfbuzz/issues/2816 */ return (offset - unsigned ((const char *) array - (const char *) base)) / T::static_size; } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-feat-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-feat-table.hh index 573f0cf9f6b..815a1fd2aa9 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-feat-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-feat-table.hh @@ -62,7 +62,7 @@ struct SettingName bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this))); + return_trace (c->check_struct (this)); } protected: diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-just-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-just-table.hh index 0bf9bd29126..57c105967de 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-just-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-just-table.hh @@ -48,7 +48,7 @@ struct ActionSubrecordHeader bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this))); + return_trace (c->check_struct (this)); } HBUINT16 actionClass; /* The JustClass value associated with this @@ -65,7 +65,7 @@ struct DecompositionAction bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this))); + return_trace (c->check_struct (this)); } ActionSubrecordHeader @@ -112,7 +112,7 @@ struct ConditionalAddGlyphAction bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this))); + return_trace (c->check_struct (this)); } protected: @@ -137,7 +137,7 @@ struct DuctileGlyphAction bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this))); + return_trace (c->check_struct (this)); } protected: @@ -163,7 +163,7 @@ struct RepeatedAddGlyphAction bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this))); + return_trace (c->check_struct (this)); } protected: @@ -294,7 +294,7 @@ struct WidthDeltaPair bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this))); + return_trace (c->check_struct (this)); } protected: diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-kerx-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-kerx-table.hh index 6a24c90c312..995492cd5a7 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-kerx-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-kerx-table.hh @@ -751,7 +751,7 @@ struct KerxSubTableHeader bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this))); + return_trace (c->check_struct (this)); } public: diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh index 3d053cb13e5..aa4ad4cf3c1 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh @@ -980,6 +980,15 @@ struct Chain setting = HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_SMALL_CAPS; goto retry; } +#ifndef HB_NO_AAT + else if (type == HB_AAT_LAYOUT_FEATURE_TYPE_LANGUAGE_TAG_TYPE && setting && + /* TODO: Rudimentary language matching. */ + hb_language_matches (map->face->table.ltag->get_language (setting - 1), map->props.language)) + { + flags &= feature.disableFlags; + flags |= feature.enableFlags; + } +#endif } } return flags; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-opbd-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-opbd-table.hh index b1a1512821d..51b650fc33c 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-opbd-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-opbd-table.hh @@ -42,7 +42,7 @@ struct OpticalBounds bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this))); + return_trace (c->check_struct (this)); } FWORD leftSide; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc index caff204d67d..e06d286ff09 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc @@ -229,7 +229,7 @@ hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper, * * Note: does not examine the `GSUB` table. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * * Since: 2.3.0 */ @@ -300,7 +300,7 @@ hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer) * * Note: does not examine the `GPOS` table. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * * Since: 2.3.0 */ @@ -333,7 +333,7 @@ hb_aat_layout_position (const hb_ot_shape_plan_t *plan, * Tests whether the specified face includes any tracking information * in the `trak` table. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * * Since: 2.3.0 */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.hh index 5a0fa705445..c914f58d707 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.hh @@ -52,8 +52,9 @@ struct hb_aat_map_builder_t public: HB_INTERNAL hb_aat_map_builder_t (hb_face_t *face_, - const hb_segment_properties_t *props_ HB_UNUSED) : - face (face_) {} + const hb_segment_properties_t props_) : + face (face_), + props (props_) {} HB_INTERNAL void add_feature (hb_tag_t tag, unsigned int value=1); @@ -87,6 +88,7 @@ struct hb_aat_map_builder_t public: hb_face_t *face; + hb_segment_properties_t props; public: hb_sorted_vector_t features; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-algs.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-algs.hh index f1633d886a7..cc37c073da1 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-algs.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-algs.hh @@ -109,15 +109,16 @@ struct BEInt struct __attribute__((packed)) packed_uint16_t { uint16_t v; }; constexpr operator Type () const { -#if ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)) && \ +#if defined(__OPTIMIZE__) && !defined(HB_NO_PACKED) && \ + ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)) && \ defined(__BYTE_ORDER) && \ (__BYTE_ORDER == __LITTLE_ENDIAN || __BYTE_ORDER == __BIG_ENDIAN) /* Spoon-feed the compiler a big-endian integer with alignment 1. * https://github.com/harfbuzz/harfbuzz/pull/1398 */ #if __BYTE_ORDER == __LITTLE_ENDIAN - return __builtin_bswap16 (((packed_uint16_t *) this)->v); + return __builtin_bswap16 (((packed_uint16_t *) v)->v); #else /* __BYTE_ORDER == __BIG_ENDIAN */ - return ((packed_uint16_t *) this)->v; + return ((packed_uint16_t *) v)->v; #endif #else return (v[0] << 8) @@ -153,15 +154,16 @@ struct BEInt struct __attribute__((packed)) packed_uint32_t { uint32_t v; }; constexpr operator Type () const { -#if ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)) && \ +#if defined(__OPTIMIZE__) && !defined(HB_NO_PACKED) && \ + ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)) && \ defined(__BYTE_ORDER) && \ (__BYTE_ORDER == __LITTLE_ENDIAN || __BYTE_ORDER == __BIG_ENDIAN) /* Spoon-feed the compiler a big-endian integer with alignment 1. * https://github.com/harfbuzz/harfbuzz/pull/1398 */ #if __BYTE_ORDER == __LITTLE_ENDIAN - return __builtin_bswap32 (((packed_uint32_t *) this)->v); + return __builtin_bswap32 (((packed_uint32_t *) v)->v); #else /* __BYTE_ORDER == __BIG_ENDIAN */ - return ((packed_uint32_t *) this)->v; + return ((packed_uint32_t *) v)->v; #endif #else return (v[0] << 24) @@ -525,7 +527,6 @@ struct hb_pair_t T1 first; T2 second; }; -#define hb_pair_t(T1,T2) hb_pair_t template static inline hb_pair_t hb_pair (T1&& a, T2&& b) { return hb_pair_t (a, b); } @@ -551,14 +552,14 @@ struct { template constexpr auto operator () (T&& a, T2&& b) const HB_AUTO_RETURN - (a <= b ? std::forward (a) : std::forward (b)) + (a <= b ? a : b) } HB_FUNCOBJ (hb_min); struct { template constexpr auto operator () (T&& a, T2&& b) const HB_AUTO_RETURN - (a >= b ? std::forward (a) : std::forward (b)) + (a >= b ? a : b) } HB_FUNCOBJ (hb_max); struct @@ -972,7 +973,7 @@ void hb_qsort(void *base, size_t nel, size_t width, [void *arg]); */ -#define SORT_R_SWAP(a,b,tmp) ((tmp) = (a), (a) = (b), (b) = (tmp)) +#define SORT_R_SWAP(a,b,tmp) ((void) ((tmp) = (a)), (void) ((a) = (b)), (b) = (tmp)) /* swap a and b */ /* a and b must not be equal! */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-array.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-array.hh index 5baeb6f7fef..826a9018196 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-array.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-array.hh @@ -100,10 +100,9 @@ struct hb_array_t : hb_iter_with_fallback_t, Type&> /* Ouch. The operator== compares the contents of the array. For range-based for loops, * it's best if we can just compare arrayZ, though comparing contents is still fast, * but also would require that Type has operator==. As such, we optimize this operator - * for range-based for loop and just compare arrayZ. No need to compare length, as we - * assume we're only compared to .end(). */ + * for range-based for loop and just compare arrayZ and length. */ bool operator != (const hb_array_t& o) const - { return arrayZ != o.arrayZ; } + { return this->arrayZ != o.arrayZ || this->length != o.length; } /* Extra operators. */ @@ -220,11 +219,8 @@ struct hb_array_t : hb_iter_with_fallback_t, Type&> if (end < start + 2) return; - for (unsigned lhs = start, rhs = end - 1; lhs < rhs; lhs++, rhs--) { - Type temp = arrayZ[rhs]; - arrayZ[rhs] = arrayZ[lhs]; - arrayZ[lhs] = temp; - } + for (unsigned lhs = start, rhs = end - 1; lhs < rhs; lhs++, rhs--) + hb_swap (arrayZ[rhs], arrayZ[lhs]); } hb_array_t sub_array (unsigned int start_offset = 0, unsigned int *seg_count = nullptr /* IN/OUT */) const @@ -328,6 +324,8 @@ struct hb_sorted_array_t : { hb_array_t (*this) = o; return *this; } /* Iterator implementation. */ + + /* See comment in hb_array_of::operator != */ bool operator != (const hb_sorted_array_t& o) const { return this->arrayZ != o.arrayZ || this->length != o.length; } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh index e640d1b5868..d6dfb0f57a1 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh @@ -111,6 +111,19 @@ _hb_atomic_ptr_impl_cmplexch (const void **P, const void *O_, const void *N) #endif +#ifndef _hb_compiler_memory_r_barrier +/* This we always use std::atomic for; and should never be disabled... + * except that MSVC gives me an internal compiler error on it. */ +#if !defined(_MSC_VER) +#include +#define _hb_compiler_memory_r_barrier() std::atomic_signal_fence (std::memory_order_acquire) +#else +#define _hb_compiler_memory_r_barrier() do {} while (0) +#endif +#endif + + + #ifndef _hb_memory_r_barrier #define _hb_memory_r_barrier() _hb_memory_barrier () #endif diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-bit-page.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-bit-page.hh index cbe918ee401..95ae1b7bf98 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-bit-page.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-bit-page.hh @@ -55,7 +55,7 @@ struct hb_bit_page_t void add (hb_codepoint_t g) { elt (g) |= mask (g); } void del (hb_codepoint_t g) { elt (g) &= ~mask (g); } - void set (hb_codepoint_t g, bool v) { if (v) add (g); else del (g); } + void set (hb_codepoint_t g, bool value) { if (value) add (g); else del (g); } bool get (hb_codepoint_t g) const { return elt (g) & mask (g); } void add_range (hb_codepoint_t a, hb_codepoint_t b) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-bit-set.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-bit-set.hh index 438fb66a2cd..4765af67ce9 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-bit-set.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-bit-set.hh @@ -465,12 +465,10 @@ struct hb_bit_set_t } public: - template - void process (const Op& op, const hb_bit_set_t &other) + void process_ (hb_bit_page_t::vector_t (*op) (const hb_bit_page_t::vector_t &, const hb_bit_page_t::vector_t &), + bool passthru_left, bool passthru_right, + const hb_bit_set_t &other) { - const bool passthru_left = op (1, 0); - const bool passthru_right = op (0, 1); - if (unlikely (!successful)) return; dirty (); @@ -590,6 +588,15 @@ struct hb_bit_set_t assert (!count); resize (newCount); } + template + static hb_bit_page_t::vector_t + op_ (const hb_bit_page_t::vector_t &a, const hb_bit_page_t::vector_t &b) + { return Op{} (a, b); } + template + void process (const Op& op, const hb_bit_set_t &other) + { + process_ (op_, op (1, 0), op (0, 1), other); + } void union_ (const hb_bit_set_t &other) { process (hb_bitwise_or, other); } void intersect (const hb_bit_set_t &other) { process (hb_bitwise_and, other); } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc index b561a9374e3..47062eab9a7 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc @@ -99,7 +99,7 @@ hb_blob_create (const char *data, * is zero. This is in contrast to hb_blob_create(), which returns the singleton * empty blob (as returned by hb_blob_get_empty()) if @length is zero. * - * Return value: New blob, or %NULL if failed. Destroy with hb_blob_destroy(). + * Return value: New blob, or `NULL` if failed. Destroy with hb_blob_destroy(). * * Since: 2.8.2 **/ @@ -263,8 +263,6 @@ hb_blob_destroy (hb_blob_t *blob) { if (!hb_object_destroy (blob)) return; - blob->fini_shallow (); - hb_free (blob); } @@ -278,7 +276,7 @@ hb_blob_destroy (hb_blob_t *blob) * * Attaches a user-data key/data pair to the specified blob. * - * Return value: %true if success, %false otherwise + * Return value: `true` if success, `false` otherwise * * Since: 0.9.2 **/ @@ -335,7 +333,7 @@ hb_blob_make_immutable (hb_blob_t *blob) * * Tests whether a blob is immutable. * - * Return value: %true if @blob is immutable, %false otherwise + * Return value: `true` if @blob is immutable, `false` otherwise * * Since: 0.9.2 **/ @@ -394,7 +392,7 @@ hb_blob_get_data (hb_blob_t *blob, unsigned int *length) * fails. * * Returns: (transfer none) (array length=length): Writable blob data, - * or %NULL if failed. + * or `NULL` if failed. * * Since: 0.9.2 **/ @@ -620,7 +618,7 @@ hb_blob_create_from_file (const char *file_name) * specified binary font file. * * Returns: An #hb_blob_t pointer with the content of the file, - * or %NULL if failed. + * or `NULL` if failed. * * Since: 2.8.2 **/ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.hh index a3683a681e7..b1b3b94d3dd 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.hh @@ -38,7 +38,7 @@ struct hb_blob_t { - void fini_shallow () { destroy_user_data (); } + ~hb_blob_t () { destroy_user_data (); } void destroy_user_data () { @@ -61,12 +61,12 @@ struct hb_blob_t public: hb_object_header_t header; - const char *data; - unsigned int length; - hb_memory_mode_t mode; + const char *data = nullptr; + unsigned int length = 0; + hb_memory_mode_t mode = (hb_memory_mode_t) 0; - void *user_data; - hb_destroy_func_t destroy; + void *user_data = nullptr; + hb_destroy_func_t destroy = nullptr; }; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.hh index e80cfea6e7a..44c802a00c2 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.hh @@ -32,15 +32,16 @@ #include "hb.hh" -#line 36 "hb-buffer-deserialize-json.hh" +#line 33 "hb-buffer-deserialize-json.hh" static const unsigned char _deserialize_json_trans_keys[] = { 0u, 0u, 9u, 123u, 9u, 34u, 97u, 117u, 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 108u, 108u, 34u, 34u, 9u, 58u, 9u, 57u, 9u, 125u, 9u, 125u, 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, - 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, - 34u, 92u, 9u, 125u, 34u, 92u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, - 9u, 125u, 9u, 93u, 9u, 123u, 0u, 0u, 0 + 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 108u, 108u, 34u, 34u, 9u, 58u, + 9u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 34u, 92u, 9u, 125u, + 34u, 92u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 9u, 125u, 9u, 93u, + 9u, 123u, 0u, 0u, 0 }; static const char _deserialize_json_key_spans[] = { @@ -48,9 +49,10 @@ static const char _deserialize_json_key_spans[] = { 10, 117, 117, 117, 1, 50, 49, 10, 117, 117, 1, 1, 50, 49, 117, 117, 2, 1, 50, 49, 10, 117, 117, 1, - 50, 49, 10, 117, 117, 1, 50, 49, - 59, 117, 59, 117, 117, 1, 50, 49, - 117, 85, 115, 0 + 50, 49, 10, 117, 117, 1, 1, 50, + 49, 117, 117, 1, 50, 49, 59, 117, + 59, 117, 117, 1, 50, 49, 117, 85, + 115, 0 }; static const short _deserialize_json_index_offsets[] = { @@ -58,9 +60,10 @@ static const short _deserialize_json_index_offsets[] = { 271, 282, 400, 518, 636, 638, 689, 739, 750, 868, 986, 988, 990, 1041, 1091, 1209, 1327, 1330, 1332, 1383, 1433, 1444, 1562, 1680, - 1682, 1733, 1783, 1794, 1912, 2030, 2032, 2083, - 2133, 2193, 2311, 2371, 2489, 2607, 2609, 2660, - 2710, 2828, 2914, 3030 + 1682, 1733, 1783, 1794, 1912, 2030, 2032, 2034, + 2085, 2135, 2253, 2371, 2373, 2424, 2474, 2534, + 2652, 2712, 2830, 2948, 2950, 3001, 3051, 3169, + 3255, 3371 }; static const char _deserialize_json_indicies[] = { @@ -82,28 +85,28 @@ static const char _deserialize_json_indicies[] = { 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 4, 1, - 5, 1, 6, 7, 1, 1, 8, 1, + 5, 1, 6, 7, 1, 8, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 9, 1, 10, 11, - 1, 12, 1, 12, 12, 12, 12, 12, + 1, 1, 1, 1, 10, 1, 11, 12, + 1, 13, 1, 13, 13, 13, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 12, 1, 1, 1, 1, 1, + 1, 1, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 13, 1, 13, 13, - 13, 13, 13, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 14, 1, 14, 14, + 14, 14, 14, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 13, 1, 1, + 1, 1, 1, 1, 1, 14, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 14, 1, 1, 15, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 1, - 17, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 1, 19, 19, 19, 19, 19, + 1, 1, 15, 1, 1, 16, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 1, + 18, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 1, 20, 20, 20, 20, 20, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 19, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 20, 1, + 1, 1, 20, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 21, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -113,11 +116,11 @@ static const char _deserialize_json_indicies[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 21, - 1, 22, 22, 22, 22, 22, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 22, + 1, 23, 23, 23, 23, 23, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 22, 1, 1, 1, 1, 1, 1, 1, + 23, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -128,41 +131,58 @@ static const char _deserialize_json_indicies[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 23, 1, 19, - 19, 19, 19, 19, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 24, 1, 20, + 20, 20, 20, 20, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 20, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 21, 1, 1, 1, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 22, 1, 25, 1, 25, + 25, 25, 25, 25, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 25, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 19, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 20, 1, 1, 1, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, + 26, 1, 26, 26, 26, 26, 26, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 26, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 27, 1, + 1, 28, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 1, 30, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 1, 32, + 32, 32, 32, 32, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 32, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 33, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 21, 1, 24, 1, 24, - 24, 24, 24, 24, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 24, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 25, 1, 25, 25, 25, 25, 25, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 34, 1, 32, 32, 32, + 32, 32, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 25, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 26, 1, - 1, 27, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 1, 29, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 1, 31, - 31, 31, 31, 31, 1, 1, 1, 1, + 1, 1, 1, 1, 32, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 31, 1, + 33, 1, 1, 1, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 32, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -170,41 +190,41 @@ static const char _deserialize_json_indicies[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 34, 1, 35, 1, 36, 1, 36, + 36, 36, 36, 36, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 36, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 33, 1, 31, 31, 31, - 31, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 32, 1, 1, 1, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 1, 1, + 37, 1, 37, 37, 37, 37, 37, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 37, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 38, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 1, 40, 40, 40, 40, + 40, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 40, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 33, 1, 34, 1, 35, 1, 35, - 35, 35, 35, 35, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 35, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 36, 1, 36, 36, 36, 36, 36, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 36, 1, 1, 1, 1, 1, 1, + 42, 1, 40, 40, 40, 40, 40, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 37, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 1, 39, 39, 39, 39, - 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 39, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 40, + 1, 40, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 41, 1, 1, + 1, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -212,137 +232,130 @@ static const char _deserialize_json_indicies[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 42, 1, + 44, 45, 1, 46, 1, 46, 46, 46, + 46, 46, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 46, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 41, 1, 39, 39, 39, 39, 39, 1, + 1, 1, 1, 1, 1, 1, 47, 1, + 47, 47, 47, 47, 47, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 47, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 39, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 40, 1, 1, - 1, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 48, 1, 1, 49, + 50, 50, 50, 50, 50, 50, 50, 50, + 50, 1, 51, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 1, 53, 53, 53, + 53, 53, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 53, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 54, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 41, 1, - 43, 44, 1, 45, 1, 45, 45, 45, - 45, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 46, 1, - 46, 46, 46, 46, 46, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 46, + 1, 55, 1, 53, 53, 53, 53, 53, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 47, 1, 1, 48, - 49, 49, 49, 49, 49, 49, 49, 49, - 49, 1, 50, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 1, 52, 52, 52, - 52, 52, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 52, 1, 1, 1, + 1, 1, 53, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 54, 1, + 1, 1, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 53, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 55, + 1, 56, 1, 56, 56, 56, 56, 56, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 56, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 54, 1, 52, 52, 52, 52, 52, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 57, 1, 57, 57, + 57, 57, 57, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 52, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 53, 1, - 1, 1, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 57, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 58, 1, 1, 59, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 1, + 61, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 1, 63, 63, 63, 63, 63, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 63, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 64, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 54, - 1, 55, 1, 55, 55, 55, 55, 55, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 55, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 56, 1, 56, 56, - 56, 56, 56, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 56, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 65, + 1, 63, 63, 63, 63, 63, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 57, 1, 1, 58, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 1, - 60, 61, 61, 61, 61, 61, 61, 61, - 61, 61, 1, 62, 62, 62, 62, 62, 1, 1, 1, 1, 1, 1, 1, 1, + 63, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 64, 1, 1, 1, + 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 62, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 63, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 65, 1, 66, + 1, 67, 1, 67, 67, 67, 67, 67, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 67, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 64, - 1, 62, 62, 62, 62, 62, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 68, 1, 68, 68, + 68, 68, 68, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 62, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 63, 1, 1, 1, - 61, 61, 61, 61, 61, 61, 61, 61, - 61, 61, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 68, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 69, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 1, + 71, 71, 71, 71, 71, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 71, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 72, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 64, 1, 65, - 1, 65, 65, 65, 65, 65, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 65, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 66, 1, 66, 66, 66, 66, - 66, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 66, 1, 67, 1, 1, + 1, 1, 1, 1, 73, 1, 71, 71, + 71, 71, 71, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 68, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 1, 71, 70, - 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, - 72, 70, 73, 73, 73, 73, 73, 1, + 1, 1, 1, 1, 1, 71, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 72, 1, 1, 1, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 73, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 74, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -350,21 +363,33 @@ static const char _deserialize_json_indicies[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 73, 1, 75, 1, 75, 75, + 75, 75, 75, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 75, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 75, 1, - 70, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 76, + 1, 76, 76, 76, 76, 76, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 76, 1, 77, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 78, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 1, 81, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 82, 80, 83, + 83, 83, 83, 83, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 83, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 70, 1, 76, 76, 76, 76, - 76, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 84, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 76, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 77, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -373,67 +398,85 @@ static const char _deserialize_json_indicies[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 85, 1, 80, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 78, 1, 76, 76, 76, 76, 76, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 76, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 77, 1, 1, - 1, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 80, + 1, 86, 86, 86, 86, 86, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 86, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 87, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 78, 1, - 80, 1, 80, 80, 80, 80, 80, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 80, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 88, 1, 86, + 86, 86, 86, 86, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 81, 1, 81, 81, 81, - 81, 81, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 86, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 81, 1, 1, 1, + 1, 1, 87, 1, 1, 1, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 82, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 1, 76, - 76, 76, 76, 76, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 76, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 77, 1, 1, 1, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 88, 1, 90, 1, 90, + 90, 90, 90, 90, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 90, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 78, 1, 85, 85, 85, - 85, 85, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 85, 1, 1, 1, + 91, 1, 91, 91, 91, 91, 91, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 91, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 92, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 1, 86, 86, 86, 86, 86, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 86, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 87, + 1, 1, 1, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 88, 1, 95, 95, 95, 95, 95, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 95, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 96, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 87, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 97, 1, + 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -442,46 +485,52 @@ static const char _deserialize_json_indicies[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 1, 1, - 0 + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 1, 1, 0 }; static const char _deserialize_json_trans_targs[] = { 1, 0, 2, 2, 3, 4, 18, 24, - 37, 45, 5, 12, 6, 7, 8, 9, - 11, 9, 11, 10, 2, 49, 10, 49, - 13, 14, 15, 16, 17, 16, 17, 10, - 2, 49, 19, 20, 21, 22, 23, 10, - 2, 49, 23, 25, 31, 26, 27, 28, - 29, 30, 29, 30, 10, 2, 49, 32, - 33, 34, 35, 36, 35, 36, 10, 2, - 49, 38, 39, 40, 43, 44, 40, 41, - 42, 10, 2, 49, 10, 2, 49, 44, - 46, 47, 43, 48, 48, 49, 50, 51 + 37, 43, 51, 5, 12, 6, 7, 8, + 9, 11, 9, 11, 10, 2, 55, 10, + 55, 13, 14, 15, 16, 17, 16, 17, + 10, 2, 55, 19, 20, 21, 22, 23, + 10, 2, 55, 23, 25, 31, 26, 27, + 28, 29, 30, 29, 30, 10, 2, 55, + 32, 33, 34, 35, 36, 35, 36, 10, + 2, 55, 38, 39, 40, 41, 42, 10, + 2, 55, 42, 44, 45, 46, 49, 50, + 46, 47, 48, 10, 2, 55, 10, 2, + 55, 50, 52, 53, 49, 54, 54, 55, + 56, 57 }; static const char _deserialize_json_trans_actions[] = { 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 2, - 2, 0, 0, 3, 3, 4, 0, 5, - 0, 0, 2, 2, 2, 0, 0, 6, - 6, 7, 0, 0, 0, 2, 2, 8, - 8, 9, 0, 0, 0, 0, 0, 2, - 2, 2, 0, 0, 10, 10, 11, 0, - 0, 2, 2, 2, 0, 0, 12, 12, - 13, 0, 0, 2, 14, 14, 0, 15, - 0, 16, 16, 17, 18, 18, 19, 15, - 0, 0, 20, 20, 21, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 2, + 2, 2, 0, 0, 3, 3, 4, 0, + 5, 0, 0, 2, 2, 2, 0, 0, + 6, 6, 7, 0, 0, 0, 2, 2, + 8, 8, 9, 0, 0, 0, 0, 0, + 2, 2, 2, 0, 0, 10, 10, 11, + 0, 0, 2, 2, 2, 0, 0, 12, + 12, 13, 0, 0, 0, 2, 2, 14, + 14, 15, 0, 0, 0, 2, 16, 16, + 0, 17, 0, 18, 18, 19, 20, 20, + 21, 17, 0, 0, 22, 22, 23, 0, + 0, 0 }; static const int deserialize_json_start = 1; -static const int deserialize_json_first_final = 49; +static const int deserialize_json_first_final = 55; static const int deserialize_json_error = 0; static const int deserialize_json_en_main = 1; -#line 108 "hb-buffer-deserialize-json.rl" +#line 111 "hb-buffer-deserialize-json.rl" static hb_bool_t @@ -508,12 +557,12 @@ _hb_buffer_deserialize_json (hb_buffer_t *buffer, hb_glyph_info_t info = {0}; hb_glyph_position_t pos = {0}; -#line 512 "hb-buffer-deserialize-json.hh" +#line 554 "hb-buffer-deserialize-json.hh" { cs = deserialize_json_start; } -#line 517 "hb-buffer-deserialize-json.hh" +#line 557 "hb-buffer-deserialize-json.hh" { int _slen; int _trans; @@ -561,25 +610,25 @@ _resume: tok = p; } break; - case 15: + case 17: #line 55 "hb-buffer-deserialize-json.rl" { if (unlikely (!buffer->ensure_glyphs ())) return false; } break; - case 21: + case 23: #line 56 "hb-buffer-deserialize-json.rl" { if (unlikely (!buffer->ensure_unicode ())) return false; } break; - case 16: + case 18: #line 58 "hb-buffer-deserialize-json.rl" { /* TODO Unescape \" and \\ if found. */ if (!hb_font_glyph_from_string (font, - tok, p - tok, + tok+1, p - tok - 2, /* Skip "" */ &info.codepoint)) return false; } break; - case 18: + case 20: #line 66 "hb-buffer-deserialize-json.rl" { if (!parse_uint (tok, p, &info.codepoint)) return false; } break; @@ -604,6 +653,10 @@ _resume: { if (!parse_int (tok, p, &pos.y_advance)) return false; } break; case 14: +#line 72 "hb-buffer-deserialize-json.rl" + { if (!parse_uint (tok, p, &info.mask )) return false; } + break; + case 16: #line 51 "hb-buffer-deserialize-json.rl" { tok = p; @@ -611,7 +664,7 @@ _resume: #line 55 "hb-buffer-deserialize-json.rl" { if (unlikely (!buffer->ensure_glyphs ())) return false; } break; - case 20: + case 22: #line 51 "hb-buffer-deserialize-json.rl" { tok = p; @@ -619,12 +672,12 @@ _resume: #line 56 "hb-buffer-deserialize-json.rl" { if (unlikely (!buffer->ensure_unicode ())) return false; } break; - case 17: + case 19: #line 58 "hb-buffer-deserialize-json.rl" { /* TODO Unescape \" and \\ if found. */ if (!hb_font_glyph_from_string (font, - tok, p - tok, + tok+1, p - tok - 2, /* Skip "" */ &info.codepoint)) return false; } @@ -637,7 +690,7 @@ _resume: *end_ptr = p; } break; - case 19: + case 21: #line 66 "hb-buffer-deserialize-json.rl" { if (!parse_uint (tok, p, &info.codepoint)) return false; } #line 43 "hb-buffer-deserialize-json.rl" @@ -709,7 +762,19 @@ _resume: *end_ptr = p; } break; -#line 713 "hb-buffer-deserialize-json.hh" + case 15: +#line 72 "hb-buffer-deserialize-json.rl" + { if (!parse_uint (tok, p, &info.mask )) return false; } +#line 43 "hb-buffer-deserialize-json.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; +} + break; +#line 735 "hb-buffer-deserialize-json.hh" } _again: @@ -721,7 +786,7 @@ _again: _out: {} } -#line 136 "hb-buffer-deserialize-json.rl" +#line 139 "hb-buffer-deserialize-json.rl" *end_ptr = p; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.rl b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.rl index 382423f6c7d..d5e3c138db1 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.rl +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.rl @@ -58,17 +58,18 @@ action ensure_unicode { if (unlikely (!buffer->ensure_unicode ())) return false; action parse_glyph_name { /* TODO Unescape \" and \\ if found. */ if (!hb_font_glyph_from_string (font, - tok, p - tok, + tok+1, p - tok - 2, /* Skip "" */ &info.codepoint)) return false; } -action parse_codepoint { if (!parse_uint (tok, p, &info.codepoint)) return false; } -action parse_cluster { if (!parse_uint (tok, p, &info.cluster )) return false; } -action parse_x_offset { if (!parse_int (tok, p, &pos.x_offset )) return false; } -action parse_y_offset { if (!parse_int (tok, p, &pos.y_offset )) return false; } -action parse_x_advance { if (!parse_int (tok, p, &pos.x_advance)) return false; } -action parse_y_advance { if (!parse_int (tok, p, &pos.y_advance)) return false; } +action parse_codepoint { if (!parse_uint (tok, p, &info.codepoint)) return false; } +action parse_cluster { if (!parse_uint (tok, p, &info.cluster )) return false; } +action parse_x_offset { if (!parse_int (tok, p, &pos.x_offset )) return false; } +action parse_y_offset { if (!parse_int (tok, p, &pos.y_offset )) return false; } +action parse_x_advance { if (!parse_int (tok, p, &pos.x_advance)) return false; } +action parse_y_advance { if (!parse_int (tok, p, &pos.y_advance)) return false; } +action parse_glyph_flags{ if (!parse_uint (tok, p, &info.mask )) return false; } unum = '0' | [1-9] digit*; num = '-'? unum; @@ -82,13 +83,14 @@ glyph_name = '"' ([^\\"] | '\\' [\\"])* '"'; parse_glyph_name = (glyph_name >tok %parse_glyph_name); parse_codepoint = (codepoint >tok %parse_codepoint); -glyph = "\"g\"" colon (parse_glyph_name | parse_codepoint); -unicode = "\"u\"" colon parse_codepoint; -cluster = "\"cl\"" colon (unum >tok %parse_cluster); -xoffset = "\"dx\"" colon (num >tok %parse_x_offset); -yoffset = "\"dy\"" colon (num >tok %parse_y_offset); -xadvance= "\"ax\"" colon (num >tok %parse_x_advance); -yadvance= "\"ay\"" colon (num >tok %parse_y_advance); +glyph = "\"g\"" colon (parse_glyph_name | parse_codepoint); +unicode = "\"u\"" colon parse_codepoint; +cluster = "\"cl\"" colon (unum >tok %parse_cluster); +xoffset = "\"dx\"" colon (num >tok %parse_x_offset); +yoffset = "\"dy\"" colon (num >tok %parse_y_offset); +xadvance= "\"ax\"" colon (num >tok %parse_x_advance); +yadvance= "\"ay\"" colon (num >tok %parse_y_advance); +glyphflags="\"fl\"" colon (unum >tok %parse_glyph_flags); element = glyph @ensure_glyphs | unicode @ensure_unicode @@ -96,7 +98,8 @@ element = glyph @ensure_glyphs | xoffset | yoffset | xadvance - | yadvance; + | yadvance + | glyphflags; item = ( '{' space* element (comma element)* space* '}') >clear_item diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.hh index 06a605e225e..8fbcdcc18cb 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.hh @@ -32,29 +32,32 @@ #include "hb.hh" -#line 36 "hb-buffer-deserialize-text.hh" +#line 33 "hb-buffer-deserialize-text.hh" static const unsigned char _deserialize_text_trans_keys[] = { 0u, 0u, 9u, 91u, 85u, 85u, 43u, 43u, 48u, 102u, 9u, 85u, 48u, 57u, 45u, 57u, - 48u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, 44u, 57u, - 43u, 124u, 45u, 57u, 48u, 57u, 9u, 124u, 9u, 124u, 0u, 0u, 9u, 85u, 9u, 124u, + 48u, 57u, 48u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, + 44u, 57u, 43u, 124u, 45u, 57u, 48u, 57u, 9u, 124u, 9u, 124u, 0u, 0u, 9u, 85u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, - 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 0 + 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, + 9u, 124u, 9u, 124u, 9u, 124u, 0 }; static const char _deserialize_text_key_spans[] = { 0, 83, 1, 1, 55, 77, 10, 13, - 10, 10, 13, 10, 1, 13, 10, 14, - 82, 13, 10, 116, 116, 0, 77, 116, + 10, 10, 10, 13, 10, 1, 13, 10, + 14, 82, 13, 10, 116, 116, 0, 77, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116 + 116, 116, 116 }; static const short _deserialize_text_index_offsets[] = { 0, 0, 84, 86, 88, 144, 222, 233, - 247, 258, 269, 283, 294, 296, 310, 321, - 336, 419, 433, 444, 561, 678, 679, 757, - 874, 991, 1108, 1225, 1342, 1459, 1576, 1693, - 1810, 1927, 2044, 2161, 2278 + 247, 258, 269, 280, 294, 305, 307, 321, + 332, 347, 430, 444, 455, 572, 689, 690, + 768, 885, 1002, 1119, 1236, 1353, 1470, 1587, + 1704, 1821, 1938, 2055, 2172, 2289, 2406, 2523, + 2640, 2757, 2874 }; static const char _deserialize_text_indicies[] = { @@ -91,50 +94,52 @@ static const char _deserialize_text_indicies[] = { 12, 12, 12, 12, 12, 12, 12, 1, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 1, 15, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 1, 17, 1, - 1, 18, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 1, 20, 21, 21, 21, + 16, 16, 16, 16, 16, 1, 17, 18, + 18, 18, 18, 18, 18, 18, 18, 18, + 1, 19, 1, 1, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 1, 22, - 1, 23, 1, 1, 24, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 1, 26, + 23, 23, 23, 23, 23, 23, 23, 23, + 23, 1, 24, 1, 25, 1, 1, 26, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 1, 22, 1, 1, 1, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, - 1, 28, 28, 1, 1, 1, 1, 1, + 27, 1, 28, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 1, 24, 1, 1, + 1, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 1, 30, 30, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 28, 1, 1, 28, 1, + 1, 1, 1, 1, 1, 1, 30, 1, + 1, 30, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 30, 30, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 28, 28, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 30, 1, 31, + 1, 1, 32, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 1, 34, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 1, + 36, 36, 36, 36, 36, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 28, 1, 29, 1, 1, 30, - 31, 31, 31, 31, 31, 31, 31, 31, - 31, 1, 32, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 1, 34, 34, 34, - 34, 34, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 36, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 34, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 1, 1, 1, 38, 39, 1, 1, + 37, 37, 37, 37, 37, 37, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 1, 1, - 1, 36, 37, 1, 1, 35, 35, 35, - 35, 35, 35, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 35, 35, 35, - 35, 35, 35, 1, 1, 1, 1, 1, + 37, 37, 37, 37, 37, 37, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 38, 1, 39, 39, 39, 39, 39, 1, + 1, 1, 1, 40, 1, 41, 41, 41, + 41, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 40, + 1, 1, 42, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -142,24 +147,23 @@ static const char _deserialize_text_indicies[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 41, 1, 1, - 7, 7, 7, 7, 7, 1, 1, 1, + 43, 1, 1, 7, 7, 7, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 4, 1, 42, 42, - 42, 42, 42, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 4, + 1, 44, 44, 44, 44, 44, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 42, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 44, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 43, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -167,68 +171,83 @@ static const char _deserialize_text_indicies[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 44, 1, 42, 42, 42, 42, 42, + 1, 1, 1, 1, 46, 1, 44, 44, + 44, 44, 44, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 44, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 42, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 1, + 1, 1, 1, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 1, 1, 1, 1, - 43, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 44, 1, - 47, 47, 47, 47, 47, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 47, - 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 48, 1, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 49, 46, 46, 50, - 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 51, 52, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 53, 46, 54, 54, 54, - 54, 54, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 54, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 55, - 1, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 28, 56, 28, 28, 57, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 58, 59, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 60, 28, 61, 61, 61, 61, 61, 1, + 1, 46, 1, 49, 49, 49, 49, 49, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 49, 48, 48, 50, 48, 48, + 48, 48, 48, 48, 48, 51, 1, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 52, + 48, 48, 53, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 54, 55, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 56, 48, + 57, 57, 57, 57, 57, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 57, + 30, 30, 58, 30, 30, 30, 30, 30, + 30, 30, 59, 1, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 60, 30, 30, 61, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 62, 63, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 64, 30, 57, 57, 57, + 57, 57, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 57, 30, 30, 58, + 30, 30, 30, 30, 30, 30, 30, 59, + 1, 30, 30, 30, 65, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 30, 30, + 30, 60, 30, 30, 61, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 62, 63, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 64, 30, 67, 67, 67, 67, 67, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 61, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 62, 1, 1, + 1, 67, 1, 1, 68, 1, 1, 1, + 1, 1, 1, 1, 1, 69, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 63, 1, + 1, 1, 1, 1, 1, 1, 70, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 64, 1, 65, - 65, 65, 65, 65, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 71, 1, 72, + 72, 72, 72, 72, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 65, 1, + 1, 1, 1, 1, 1, 1, 72, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -236,172 +255,238 @@ static const char _deserialize_text_indicies[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 40, 1, 1, 1, 1, + 1, 1, 1, 42, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 66, 1, 67, 67, 67, 67, - 67, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 67, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 48, 1, - 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, - 49, 46, 46, 50, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 51, - 52, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 53, - 46, 68, 68, 68, 68, 68, 1, 1, + 1, 1, 73, 1, 74, 74, 74, 74, + 74, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 74, 48, 48, 50, 48, + 48, 48, 48, 48, 48, 48, 51, 1, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 52, 48, 48, 53, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 54, + 55, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 56, + 48, 75, 75, 75, 75, 75, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 68, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 69, 1, 1, 1, 1, + 75, 1, 1, 76, 1, 1, 1, 1, + 1, 1, 1, 77, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 70, 1, 1, 1, 1, 1, 1, 1, + 78, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 43, 1, 1, + 1, 1, 1, 1, 1, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 71, 1, 72, 72, - 72, 72, 72, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 79, 1, 80, 80, + 80, 80, 80, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 72, 1, 1, + 1, 1, 1, 1, 1, 80, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 73, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 74, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 81, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 75, 1, 72, 72, 72, 72, 72, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 82, 1, 80, 80, 80, 80, 80, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 72, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 73, 1, 1, - 1, 1, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 80, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 74, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 81, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 75, 1, - 68, 68, 68, 68, 68, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 68, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 69, 1, 1, 1, 1, 76, - 76, 76, 76, 76, 76, 76, 76, 76, - 76, 1, 1, 1, 1, 1, 1, 70, + 1, 1, 1, 1, 1, 1, 82, 1, + 84, 84, 84, 84, 84, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 84, + 1, 1, 85, 1, 1, 1, 1, 1, + 1, 1, 86, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 43, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 71, 1, 77, 77, 77, - 77, 77, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 87, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 88, 1, 84, 84, 84, + 84, 84, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 84, 1, 1, 85, + 1, 1, 1, 1, 1, 1, 1, 86, + 1, 1, 1, 1, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 77, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 87, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 88, 1, 75, 75, 75, 75, 75, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 75, 1, 1, 76, 1, 1, 1, + 1, 1, 1, 1, 77, 1, 1, 1, + 1, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 1, 1, 1, 1, 1, 1, 78, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 79, 1, 77, 77, 77, 77, 77, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 77, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 79, 1, 90, + 90, 90, 90, 90, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 90, 1, + 1, 91, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 78, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 79, 1, 61, - 61, 61, 61, 61, 1, 1, 1, 1, + 1, 1, 1, 92, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 61, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 62, 1, 1, 1, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 93, 1, 90, 90, 90, 90, + 90, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 90, 1, 1, 91, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 63, 1, 1, 1, 1, + 92, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 93, + 1, 67, 67, 67, 67, 67, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 64, 1, 0 + 1, 1, 1, 1, 1, 1, 1, 1, + 67, 1, 1, 68, 1, 1, 1, 1, + 1, 1, 1, 1, 69, 1, 1, 1, + 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 70, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 71, 1, 94, 94, + 94, 94, 94, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 94, 30, 30, + 58, 30, 30, 30, 30, 30, 30, 30, + 59, 1, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 60, 30, 30, 61, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 62, 95, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 96, 30, 94, 94, 94, 94, 94, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 94, 30, 30, 58, 30, 30, + 30, 30, 30, 30, 30, 59, 1, 30, + 30, 30, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 30, 30, 30, 60, + 30, 30, 61, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 62, 95, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 96, 30, + 0 }; static const char _deserialize_text_trans_targs[] = { - 1, 0, 2, 25, 3, 4, 19, 5, - 23, 24, 8, 27, 36, 27, 36, 30, - 33, 11, 12, 15, 12, 15, 13, 14, - 31, 32, 31, 32, 26, 18, 34, 35, - 34, 35, 20, 19, 6, 21, 22, 20, - 21, 22, 20, 21, 22, 24, 26, 26, - 7, 9, 10, 16, 21, 29, 26, 7, - 9, 10, 16, 21, 29, 28, 17, 21, - 29, 28, 29, 29, 28, 7, 10, 29, - 28, 7, 21, 29, 33, 28, 21, 29 + 1, 0, 2, 26, 3, 4, 20, 5, + 24, 25, 8, 29, 40, 29, 40, 32, + 37, 33, 34, 12, 13, 16, 13, 16, + 14, 15, 35, 36, 35, 36, 27, 19, + 38, 39, 38, 39, 21, 20, 6, 22, + 23, 21, 22, 23, 21, 22, 23, 25, + 27, 27, 28, 7, 9, 11, 17, 22, + 31, 27, 28, 7, 9, 11, 17, 22, + 31, 41, 42, 30, 10, 18, 22, 31, + 30, 31, 31, 30, 10, 7, 11, 31, + 30, 22, 31, 34, 30, 10, 7, 22, + 31, 37, 30, 10, 22, 31, 27, 22, + 31, 42 }; static const char _deserialize_text_trans_actions[] = { 0, 0, 0, 0, 1, 0, 2, 0, 2, 2, 3, 4, 4, 5, 5, 4, - 4, 3, 3, 3, 0, 0, 6, 3, - 4, 4, 5, 5, 5, 3, 4, 4, - 5, 5, 7, 8, 9, 7, 7, 0, - 0, 0, 10, 10, 10, 8, 12, 13, - 14, 14, 14, 15, 11, 11, 17, 18, - 18, 18, 0, 16, 16, 19, 20, 19, - 19, 0, 0, 13, 10, 21, 21, 10, - 22, 23, 22, 22, 5, 24, 24, 24 + 4, 4, 4, 3, 3, 3, 0, 0, + 6, 3, 4, 4, 5, 5, 5, 3, + 4, 4, 5, 5, 7, 8, 9, 7, + 7, 0, 0, 0, 10, 10, 10, 8, + 12, 13, 14, 15, 15, 15, 16, 11, + 11, 18, 19, 20, 20, 20, 0, 17, + 17, 4, 4, 21, 22, 22, 21, 21, + 0, 0, 13, 10, 23, 23, 23, 10, + 24, 24, 24, 5, 25, 26, 26, 25, + 25, 5, 27, 28, 27, 27, 30, 29, + 29, 5 }; static const char _deserialize_text_eof_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, 0, 10, - 10, 11, 16, 19, 0, 11, 10, 22, - 22, 10, 24, 24, 19 + 0, 0, 0, 0, 7, 0, 0, 0, + 10, 10, 11, 17, 17, 21, 0, 11, + 10, 24, 24, 25, 25, 10, 27, 27, + 21, 29, 29 }; static const int deserialize_text_start = 1; -static const int deserialize_text_first_final = 19; +static const int deserialize_text_first_final = 20; static const int deserialize_text_error = 0; static const int deserialize_text_en_main = 1; -#line 114 "hb-buffer-deserialize-text.rl" +#line 117 "hb-buffer-deserialize-text.rl" static hb_bool_t @@ -424,12 +509,12 @@ _hb_buffer_deserialize_text (hb_buffer_t *buffer, hb_glyph_info_t info = {0}; hb_glyph_position_t pos = {0}; -#line 428 "hb-buffer-deserialize-text.hh" +#line 506 "hb-buffer-deserialize-text.hh" { cs = deserialize_text_start; } -#line 433 "hb-buffer-deserialize-text.hh" +#line 509 "hb-buffer-deserialize-text.hh" { int _slen; int _trans; @@ -475,7 +560,7 @@ _resume: #line 56 "hb-buffer-deserialize-text.rl" { if (unlikely (!buffer->ensure_unicode ())) return false; } break; - case 18: + case 20: #line 58 "hb-buffer-deserialize-text.rl" { /* TODO Unescape delimiters. */ @@ -489,7 +574,7 @@ _resume: #line 66 "hb-buffer-deserialize-text.rl" {if (!parse_hex (tok, p, &info.codepoint )) return false; } break; - case 21: + case 23: #line 68 "hb-buffer-deserialize-text.rl" { if (!parse_uint (tok, p, &info.cluster )) return false; } break; @@ -497,15 +582,19 @@ _resume: #line 69 "hb-buffer-deserialize-text.rl" { if (!parse_int (tok, p, &pos.x_offset )) return false; } break; - case 23: + case 26: #line 70 "hb-buffer-deserialize-text.rl" { if (!parse_int (tok, p, &pos.y_offset )) return false; } break; - case 20: + case 22: #line 71 "hb-buffer-deserialize-text.rl" { if (!parse_int (tok, p, &pos.x_advance)) return false; } break; - case 15: + case 28: +#line 72 "hb-buffer-deserialize-text.rl" + { if (!parse_int (tok, p, &pos.y_advance)) return false; } + break; + case 16: #line 38 "hb-buffer-deserialize-text.rl" { memset (&info, 0, sizeof (info)); @@ -532,7 +621,7 @@ _resume: #line 56 "hb-buffer-deserialize-text.rl" { if (unlikely (!buffer->ensure_unicode ())) return false; } break; - case 16: + case 17: #line 58 "hb-buffer-deserialize-text.rl" { /* TODO Unescape delimiters. */ @@ -549,6 +638,18 @@ _resume: buffer->pos[buffer->len - 1] = pos; *end_ptr = p; } + break; + case 19: +#line 58 "hb-buffer-deserialize-text.rl" + { + /* TODO Unescape delimiters. */ + if (!hb_font_glyph_from_string (font, + tok, p - tok, + &info.codepoint)) + return false; +} +#line 55 "hb-buffer-deserialize-text.rl" + { if (unlikely (!buffer->ensure_glyphs ())) return false; } break; case 7: #line 66 "hb-buffer-deserialize-text.rl" @@ -574,7 +675,7 @@ _resume: *end_ptr = p; } break; - case 22: + case 25: #line 70 "hb-buffer-deserialize-text.rl" { if (!parse_int (tok, p, &pos.y_offset )) return false; } #line 43 "hb-buffer-deserialize-text.rl" @@ -586,7 +687,7 @@ _resume: *end_ptr = p; } break; - case 19: + case 21: #line 71 "hb-buffer-deserialize-text.rl" { if (!parse_int (tok, p, &pos.x_advance)) return false; } #line 43 "hb-buffer-deserialize-text.rl" @@ -598,7 +699,7 @@ _resume: *end_ptr = p; } break; - case 24: + case 27: #line 72 "hb-buffer-deserialize-text.rl" { if (!parse_int (tok, p, &pos.y_advance)) return false; } #line 43 "hb-buffer-deserialize-text.rl" @@ -608,6 +709,18 @@ _resume: return false; buffer->pos[buffer->len - 1] = pos; *end_ptr = p; +} + break; + case 24: +#line 73 "hb-buffer-deserialize-text.rl" + { if (!parse_uint (tok, p, &info.mask )) return false; } +#line 43 "hb-buffer-deserialize-text.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; } break; case 12: @@ -623,7 +736,7 @@ _resume: #line 55 "hb-buffer-deserialize-text.rl" { if (unlikely (!buffer->ensure_glyphs ())) return false; } break; - case 14: + case 15: #line 38 "hb-buffer-deserialize-text.rl" { memset (&info, 0, sizeof (info)); @@ -642,7 +755,7 @@ _resume: return false; } break; - case 17: + case 18: #line 58 "hb-buffer-deserialize-text.rl" { /* TODO Unescape delimiters. */ @@ -660,6 +773,26 @@ _resume: return false; buffer->pos[buffer->len - 1] = pos; *end_ptr = p; +} + break; + case 29: +#line 58 "hb-buffer-deserialize-text.rl" + { + /* TODO Unescape delimiters. */ + if (!hb_font_glyph_from_string (font, + tok, p - tok, + &info.codepoint)) + return false; +} +#line 73 "hb-buffer-deserialize-text.rl" + { if (!parse_uint (tok, p, &info.mask )) return false; } +#line 43 "hb-buffer-deserialize-text.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; } break; case 11: @@ -680,6 +813,49 @@ _resume: &info.codepoint)) return false; } +#line 43 "hb-buffer-deserialize-text.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; +} + break; + case 14: +#line 38 "hb-buffer-deserialize-text.rl" + { + memset (&info, 0, sizeof (info)); + memset (&pos , 0, sizeof (pos )); +} +#line 51 "hb-buffer-deserialize-text.rl" + { + tok = p; +} +#line 58 "hb-buffer-deserialize-text.rl" + { + /* TODO Unescape delimiters. */ + if (!hb_font_glyph_from_string (font, + tok, p - tok, + &info.codepoint)) + return false; +} +#line 55 "hb-buffer-deserialize-text.rl" + { if (unlikely (!buffer->ensure_glyphs ())) return false; } + break; + case 30: +#line 58 "hb-buffer-deserialize-text.rl" + { + /* TODO Unescape delimiters. */ + if (!hb_font_glyph_from_string (font, + tok, p - tok, + &info.codepoint)) + return false; +} +#line 73 "hb-buffer-deserialize-text.rl" + { if (!parse_uint (tok, p, &info.mask )) return false; } +#line 55 "hb-buffer-deserialize-text.rl" + { if (unlikely (!buffer->ensure_glyphs ())) return false; } #line 43 "hb-buffer-deserialize-text.rl" { buffer->add_info (info); @@ -718,7 +894,7 @@ _resume: *end_ptr = p; } break; -#line 722 "hb-buffer-deserialize-text.hh" +#line 826 "hb-buffer-deserialize-text.hh" } _again: @@ -730,7 +906,7 @@ _again: if ( p == eof ) { switch ( _deserialize_text_eof_actions[cs] ) { - case 16: + case 17: #line 58 "hb-buffer-deserialize-text.rl" { /* TODO Unescape delimiters. */ @@ -772,7 +948,7 @@ _again: *end_ptr = p; } break; - case 22: + case 25: #line 70 "hb-buffer-deserialize-text.rl" { if (!parse_int (tok, p, &pos.y_offset )) return false; } #line 43 "hb-buffer-deserialize-text.rl" @@ -784,7 +960,7 @@ _again: *end_ptr = p; } break; - case 19: + case 21: #line 71 "hb-buffer-deserialize-text.rl" { if (!parse_int (tok, p, &pos.x_advance)) return false; } #line 43 "hb-buffer-deserialize-text.rl" @@ -796,7 +972,7 @@ _again: *end_ptr = p; } break; - case 24: + case 27: #line 72 "hb-buffer-deserialize-text.rl" { if (!parse_int (tok, p, &pos.y_advance)) return false; } #line 43 "hb-buffer-deserialize-text.rl" @@ -806,6 +982,38 @@ _again: return false; buffer->pos[buffer->len - 1] = pos; *end_ptr = p; +} + break; + case 24: +#line 73 "hb-buffer-deserialize-text.rl" + { if (!parse_uint (tok, p, &info.mask )) return false; } +#line 43 "hb-buffer-deserialize-text.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; +} + break; + case 29: +#line 58 "hb-buffer-deserialize-text.rl" + { + /* TODO Unescape delimiters. */ + if (!hb_font_glyph_from_string (font, + tok, p - tok, + &info.codepoint)) + return false; +} +#line 73 "hb-buffer-deserialize-text.rl" + { if (!parse_uint (tok, p, &info.mask )) return false; } +#line 43 "hb-buffer-deserialize-text.rl" + { + buffer->add_info (info); + if (unlikely (!buffer->successful)) + return false; + buffer->pos[buffer->len - 1] = pos; + *end_ptr = p; } break; case 11: @@ -835,14 +1043,14 @@ _again: *end_ptr = p; } break; -#line 839 "hb-buffer-deserialize-text.hh" +#line 953 "hb-buffer-deserialize-text.hh" } } _out: {} } -#line 138 "hb-buffer-deserialize-text.rl" +#line 141 "hb-buffer-deserialize-text.rl" *end_ptr = p; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.rl b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.rl index 73b007b98e7..0f33eb89d44 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.rl +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.rl @@ -65,11 +65,12 @@ action parse_glyph { action parse_hexdigits {if (!parse_hex (tok, p, &info.codepoint )) return false; } -action parse_cluster { if (!parse_uint (tok, p, &info.cluster )) return false; } -action parse_x_offset { if (!parse_int (tok, p, &pos.x_offset )) return false; } -action parse_y_offset { if (!parse_int (tok, p, &pos.y_offset )) return false; } -action parse_x_advance { if (!parse_int (tok, p, &pos.x_advance)) return false; } -action parse_y_advance { if (!parse_int (tok, p, &pos.y_advance)) return false; } +action parse_cluster { if (!parse_uint (tok, p, &info.cluster )) return false; } +action parse_x_offset { if (!parse_int (tok, p, &pos.x_offset )) return false; } +action parse_y_offset { if (!parse_int (tok, p, &pos.y_offset )) return false; } +action parse_x_advance { if (!parse_int (tok, p, &pos.x_advance)) return false; } +action parse_y_advance { if (!parse_int (tok, p, &pos.y_advance)) return false; } +action parse_glyph_flags{ if (!parse_uint (tok, p, &info.mask )) return false; } unum = '0' | [1-9] digit*; num = '-'? unum; @@ -81,6 +82,7 @@ glyph = (glyph_id | glyph_name) >tok %parse_glyph; cluster = '=' (unum >tok %parse_cluster); offsets = '@' (num >tok %parse_x_offset) ',' (num >tok %parse_y_offset ); advances= '+' (num >tok %parse_x_advance) (',' (num >tok %parse_y_advance))?; +glyphflags= '#' (unum >tok %parse_glyph_flags); glyph_item = ( @@ -88,6 +90,7 @@ glyph_item = cluster? offsets? advances? + glyphflags? ) >clear_item @ensure_glyphs diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-serialize.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-serialize.cc index 3f619a113e8..d1e17754303 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-serialize.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-serialize.cc @@ -56,7 +56,7 @@ hb_buffer_serialize_list_formats () /** * hb_buffer_serialize_format_from_string: * @str: (array length=len) (element-type uint8_t): a string to parse - * @len: length of @str, or -1 if string is %NULL terminated + * @len: length of @str, or -1 if string is `NULL` terminated * * Parses a string into an #hb_buffer_serialize_format_t. Does not check if * @str is a valid buffer serialization format, use @@ -78,11 +78,11 @@ hb_buffer_serialize_format_from_string (const char *str, int len) * hb_buffer_serialize_format_to_string: * @format: an #hb_buffer_serialize_format_t to convert. * - * Converts @format to the string corresponding it, or %NULL if it is not a valid + * Converts @format to the string corresponding it, or `NULL` if it is not a valid * #hb_buffer_serialize_format_t. * * Return value: (transfer none): - * A %NULL terminated string corresponding to @format. Should not be freed. + * A `NULL` terminated string corresponding to @format. Should not be freed. * * Since: 0.9.7 **/ @@ -400,9 +400,9 @@ _hb_buffer_serialize_unicode_text (hb_buffer_t *buffer, * @buf: (out) (array length=buf_size) (element-type uint8_t): output string to * write serialized buffer into. * @buf_size: the size of @buf. - * @buf_consumed: (out) (optional): if not %NULL, will be set to the number of bytes written into @buf. + * @buf_consumed: (out) (optional): if not `NULL`, will be set to the number of bytes written into @buf. * @font: (nullable): the #hb_font_t used to shape this buffer, needed to - * read glyph names and extents. If %NULL, an empty font will be used. + * read glyph names and extents. If `NULL`, an empty font will be used. * @format: the #hb_buffer_serialize_format_t to use for formatting the output. * @flags: the #hb_buffer_serialize_flags_t that control what glyph properties * to serialize. @@ -514,7 +514,7 @@ hb_buffer_serialize_glyphs (hb_buffer_t *buffer, * @buf: (out) (array length=buf_size) (element-type uint8_t): output string to * write serialized buffer into. * @buf_size: the size of @buf. - * @buf_consumed: (out) (optional): if not %NULL, will be set to the number of bytes written into @buf. + * @buf_consumed: (out) (optional): if not `NULL`, will be set to the number of bytes written into @buf. * @format: the #hb_buffer_serialize_format_t to use for formatting the output. * @flags: the #hb_buffer_serialize_flags_t that control what glyph properties * to serialize. @@ -637,9 +637,9 @@ _hb_buffer_serialize_invalid (hb_buffer_t *buffer, * @buf: (out) (array length=buf_size) (element-type uint8_t): output string to * write serialized buffer into. * @buf_size: the size of @buf. - * @buf_consumed: (out) (optional): if not %NULL, will be set to the number of bytes written into @buf. + * @buf_consumed: (out) (optional): if not `NULL`, will be set to the number of bytes written into @buf. * @font: (nullable): the #hb_font_t used to shape this buffer, needed to - * read glyph names and extents. If %NULL, an empty font will be used. + * read glyph names and extents. If `NULL`, an empty font will be used. * @format: the #hb_buffer_serialize_format_t to use for formatting the output. * @flags: the #hb_buffer_serialize_flags_t that control what glyph properties * to serialize. @@ -727,7 +727,7 @@ parse_hex (const char *pp, const char *end, uint32_t *pv) * hb_buffer_deserialize_glyphs: * @buffer: an #hb_buffer_t buffer. * @buf: (array length=buf_len): string to deserialize - * @buf_len: the size of @buf, or -1 if it is %NULL-terminated + * @buf_len: the size of @buf, or -1 if it is `NULL`-terminated * @end_ptr: (out) (optional): output pointer to the character after last * consumed one. * @font: (nullable): font for getting glyph IDs @@ -736,7 +736,7 @@ parse_hex (const char *pp, const char *end, uint32_t *pv) * Deserializes glyphs @buffer from textual representation in the format * produced by hb_buffer_serialize_glyphs(). * - * Return value: %true if @buf is not fully consumed, %false otherwise. + * Return value: `true` if @buf is not fully consumed, `false` otherwise. * * Since: 0.9.7 **/ @@ -800,7 +800,7 @@ hb_buffer_deserialize_glyphs (hb_buffer_t *buffer, * hb_buffer_deserialize_unicode: * @buffer: an #hb_buffer_t buffer. * @buf: (array length=buf_len): string to deserialize - * @buf_len: the size of @buf, or -1 if it is %NULL-terminated + * @buf_len: the size of @buf, or -1 if it is `NULL`-terminated * @end_ptr: (out) (optional): output pointer to the character after last * consumed one. * @format: the #hb_buffer_serialize_format_t of the input @buf @@ -808,7 +808,7 @@ hb_buffer_deserialize_glyphs (hb_buffer_t *buffer, * Deserializes Unicode @buffer from textual representation in the format * produced by hb_buffer_serialize_unicode(). * - * Return value: %true if @buf is not fully consumed, %false otherwise. + * Return value: `true` if @buf is not fully consumed, `false` otherwise. * * Since: 2.7.3 **/ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.cc index 2272ecf09b5..fddda233044 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.cc @@ -51,7 +51,7 @@ * Checks the equality of two #hb_segment_properties_t's. * * Return value: - * %true if all properties of @a equal those of @b, %false otherwise. + * `true` if all properties of @a equal those of @b, `false` otherwise. * * Since: 0.9.7 **/ @@ -643,9 +643,9 @@ DEFINE_NULL_INSTANCE (hb_buffer_t) = * Return value: (transfer full): * A newly allocated #hb_buffer_t with a reference count of 1. The initial * reference count should be released with hb_buffer_destroy() when you are done - * using the #hb_buffer_t. This function never returns %NULL. If memory cannot + * using the #hb_buffer_t. This function never returns `NULL`. If memory cannot * be allocated, a special #hb_buffer_t object will be returned on which - * hb_buffer_allocation_successful() returns %false. + * hb_buffer_allocation_successful() returns `false`. * * Since: 0.9.2 **/ @@ -775,7 +775,7 @@ hb_buffer_destroy (hb_buffer_t *buffer) * * Attaches a user-data key/data pair to the specified buffer. * - * Return value: %true if success, %false otherwise + * Return value: `true` if success, `false` otherwise * * Since: 0.9.2 **/ @@ -1278,7 +1278,7 @@ hb_buffer_clear_contents (hb_buffer_t *buffer) * Pre allocates memory for @buffer to fit at least @size number of items. * * Return value: - * %true if @buffer memory allocation succeeded, %false otherwise + * `true` if @buffer memory allocation succeeded, `false` otherwise * * Since: 0.9.2 **/ @@ -1295,7 +1295,7 @@ hb_buffer_pre_allocate (hb_buffer_t *buffer, unsigned int size) * Check if allocating memory for the buffer succeeded. * * Return value: - * %true if @buffer memory allocation succeeded, %false otherwise. + * `true` if @buffer memory allocation succeeded, `false` otherwise. * * Since: 0.9.2 **/ @@ -1340,7 +1340,7 @@ hb_buffer_add (hb_buffer_t *buffer, * end. * * Return value: - * %true if @buffer memory allocation succeeded, %false otherwise. + * `true` if @buffer memory allocation succeeded, `false` otherwise. * * Since: 0.9.2 **/ @@ -1426,7 +1426,7 @@ hb_buffer_get_glyph_infos (hb_buffer_t *buffer, * If buffer did not have positions before, the positions will be * initialized to zeros, unless this function is called from * within a buffer message callback (see hb_buffer_set_message_func()), - * in which case %NULL is returned. + * in which case `NULL` is returned. * * Return value: (transfer none) (array length=length): * The @buffer glyph position array. @@ -1461,7 +1461,7 @@ hb_buffer_get_glyph_positions (hb_buffer_t *buffer, * and cleared of position data when hb_buffer_clear_contents() is called. * * Return value: - * %true if the @buffer has position array, %false otherwise. + * `true` if the @buffer has position array, `false` otherwise. * * Since: 2.7.3 **/ @@ -1645,10 +1645,10 @@ hb_buffer_add_utf (hb_buffer_t *buffer, * @buffer: An #hb_buffer_t * @text: (array length=text_length) (element-type uint8_t): An array of UTF-8 * characters to append. - * @text_length: The length of the @text, or -1 if it is %NULL terminated. + * @text_length: The length of the @text, or -1 if it is `NULL` terminated. * @item_offset: The offset of the first character to add to the @buffer. * @item_length: The number of characters to add to the @buffer, or -1 for the - * end of @text (assuming it is %NULL terminated). + * end of @text (assuming it is `NULL` terminated). * * See hb_buffer_add_codepoints(). * @@ -1671,10 +1671,10 @@ hb_buffer_add_utf8 (hb_buffer_t *buffer, * hb_buffer_add_utf16: * @buffer: An #hb_buffer_t * @text: (array length=text_length): An array of UTF-16 characters to append - * @text_length: The length of the @text, or -1 if it is %NULL terminated + * @text_length: The length of the @text, or -1 if it is `NULL` terminated * @item_offset: The offset of the first character to add to the @buffer * @item_length: The number of characters to add to the @buffer, or -1 for the - * end of @text (assuming it is %NULL terminated) + * end of @text (assuming it is `NULL` terminated) * * See hb_buffer_add_codepoints(). * @@ -1697,10 +1697,10 @@ hb_buffer_add_utf16 (hb_buffer_t *buffer, * hb_buffer_add_utf32: * @buffer: An #hb_buffer_t * @text: (array length=text_length): An array of UTF-32 characters to append - * @text_length: The length of the @text, or -1 if it is %NULL terminated + * @text_length: The length of the @text, or -1 if it is `NULL` terminated * @item_offset: The offset of the first character to add to the @buffer * @item_length: The number of characters to add to the @buffer, or -1 for the - * end of @text (assuming it is %NULL terminated) + * end of @text (assuming it is `NULL` terminated) * * See hb_buffer_add_codepoints(). * @@ -1724,10 +1724,10 @@ hb_buffer_add_utf32 (hb_buffer_t *buffer, * @buffer: An #hb_buffer_t * @text: (array length=text_length) (element-type uint8_t): an array of UTF-8 * characters to append - * @text_length: the length of the @text, or -1 if it is %NULL terminated + * @text_length: the length of the @text, or -1 if it is `NULL` terminated * @item_offset: the offset of the first character to add to the @buffer * @item_length: the number of characters to add to the @buffer, or -1 for the - * end of @text (assuming it is %NULL terminated) + * end of @text (assuming it is `NULL` terminated) * * Similar to hb_buffer_add_codepoints(), but allows only access to first 256 * Unicode code points that can fit in 8-bit strings. @@ -1750,10 +1750,10 @@ hb_buffer_add_latin1 (hb_buffer_t *buffer, * hb_buffer_add_codepoints: * @buffer: a #hb_buffer_t to append characters to. * @text: (array length=text_length): an array of Unicode code points to append. - * @text_length: the length of the @text, or -1 if it is %NULL terminated. + * @text_length: the length of the @text, or -1 if it is `NULL` terminated. * @item_offset: the offset of the first code point to add to the @buffer. * @item_length: the number of code points to add to the @buffer, or -1 for the - * end of @text (assuming it is %NULL terminated). + * end of @text (assuming it is `NULL` terminated). * * Appends characters from @text array to @buffer. The @item_offset is the * position of the first character from @text that will be appended, and diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h index 22fb3496f2e..e095c5344ce 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h @@ -755,16 +755,16 @@ hb_buffer_diff (hb_buffer_t *buffer, * hb_buffer_message_func_t: * @buffer: An #hb_buffer_t to work upon * @font: The #hb_font_t the @buffer is shaped with - * @message: %NULL-terminated message passed to the function + * @message: `NULL`-terminated message passed to the function * @user_data: User data pointer passed by the caller * * A callback method for #hb_buffer_t. The method gets called with the * #hb_buffer_t it was set on, the #hb_font_t the buffer is shaped with and a * message describing what step of the shaping process will be performed. - * Returning %false from this method will skip this shaping step and move to + * Returning `false` from this method will skip this shaping step and move to * the next one. * - * Return value: %true to perform the shaping step, %false to skip it. + * Return value: `true` to perform the shaping step, `false` to skip it. * * Since: 1.1.3 */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cff-interp-cs-common.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cff-interp-cs-common.hh index 2983ae54a1e..f93c83ab459 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cff-interp-cs-common.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cff-interp-cs-common.hh @@ -57,6 +57,7 @@ struct call_context_t /* call stack */ const unsigned int kMaxCallLimit = 10; +const unsigned int kMaxOps = 10000; struct call_stack_t : cff_stack_t {}; template @@ -881,7 +882,13 @@ struct cs_interpreter_t : interpreter_t { SUPER::env.set_endchar (false); + unsigned max_ops = kMaxOps; for (;;) { + if (unlikely (!--max_ops)) + { + SUPER::env.set_error (); + break; + } OPSET::process_op (SUPER::env.fetch_op (), SUPER::env, param); if (unlikely (SUPER::env.in_error ())) return false; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc index 7266d9b01f4..e6512872e87 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc @@ -108,7 +108,7 @@ _hb_options_init () /** * hb_tag_from_string: * @str: (array length=len) (element-type uint8_t): String to convert - * @len: Length of @str, or -1 if it is %NULL-terminated + * @len: Length of @str, or -1 if it is `NULL`-terminated * * Converts a string into an #hb_tag_t. Valid tags * are four characters. Shorter input strings will be @@ -170,7 +170,7 @@ static const char direction_strings[][4] = { /** * hb_direction_from_string: * @str: (array length=len) (element-type uint8_t): String to convert - * @len: Length of @str, or -1 if it is %NULL-terminated + * @len: Length of @str, or -1 if it is `NULL`-terminated * * Converts a string to an #hb_direction_t. * @@ -357,7 +357,7 @@ retry: * hb_language_from_string: * @str: (array length=len) (element-type uint8_t): a string representing * a BCP 47 language tag - * @len: length of the @str, or -1 if it is %NULL-terminated. + * @len: length of the @str, or -1 if it is `NULL`-terminated. * * Converts @str representing a BCP 47 language tag to the corresponding * #hb_language_t. @@ -396,7 +396,7 @@ hb_language_from_string (const char *str, int len) * Converts an #hb_language_t to a string. * * Return value: (transfer none): - * A %NULL-terminated string representing the @language. Must not be freed by + * A `NULL`-terminated string representing the @language. Must not be freed by * the caller. * * Since: 0.9.2 @@ -441,6 +441,38 @@ hb_language_get_default () return language; } +/** + * hb_language_matches: + * @language: The #hb_language_t to work on + * @specific: Another #hb_language_t + * + * Check whether a second language tag is the same or a more + * specific version of the provided language tag. For example, + * "fa_IR.utf8" is a more specific tag for "fa" or for "fa_IR". + * + * Return value: `true` if languages match, `false` otherwise. + * + * Since: 5.0.0 + **/ +hb_bool_t +hb_language_matches (hb_language_t language, + hb_language_t specific) +{ + if (language == specific) return true; + if (!language || !specific) return false; + + const char *l = language->s; + const char *s = specific->s; + unsigned ll = strlen (l); + unsigned sl = strlen (s); + + if (ll > sl) + return false; + + return strncmp (l, s, ll) == 0 && + (s[ll] == '\0' || s[ll] == '-'); +} + /* hb_script_t */ @@ -498,7 +530,7 @@ hb_script_from_iso15924_tag (hb_tag_t tag) * hb_script_from_string: * @str: (array length=len) (element-type uint8_t): a string representing an * ISO 15924 tag. - * @len: length of the @str, or -1 if it is %NULL-terminated. + * @len: length of the @str, or -1 if it is `NULL`-terminated. * * Converts a string @str representing an ISO 15924 script tag to a * corresponding #hb_script_t. Shorthand for hb_tag_from_string() then @@ -693,8 +725,8 @@ hb_version_string () * Tests the library version against a minimum value, * as three integer components. * - * Return value: %true if the library is equal to or greater than - * the test value, %false otherwise + * Return value: `true` if the library is equal to or greater than + * the test value, `false` otherwise * * Since: 0.9.30 **/ @@ -881,7 +913,7 @@ parse_one_feature (const char **pp, const char *end, hb_feature_t *feature) /** * hb_feature_from_string: * @str: (array length=len) (element-type uint8_t): a string to parse - * @len: length of @str, or -1 if string is %NULL terminated + * @len: length of @str, or -1 if string is `NULL` terminated * @feature: (out): the #hb_feature_t to initialize with the parsed values * * Parses a string into a #hb_feature_t. @@ -923,7 +955,7 @@ parse_one_feature (const char **pp, const char *end, hb_feature_t *feature) * * * Return value: - * %true if @str is successfully parsed, %false otherwise + * `true` if @str is successfully parsed, `false` otherwise * * Since: 0.9.5 **/ @@ -954,7 +986,7 @@ hb_feature_from_string (const char *str, int len, * @buf: (array length=size) (out): output string * @size: the allocated size of @buf * - * Converts a #hb_feature_t into a %NULL-terminated string in the format + * Converts a #hb_feature_t into a `NULL`-terminated string in the format * understood by hb_feature_from_string(). The client in responsible for * allocating big enough size for @buf, 128 bytes is more than enough. * @@ -1022,7 +1054,7 @@ parse_one_variation (const char **pp, const char *end, hb_variation_t *variation /** * hb_variation_from_string: * @str: (array length=len) (element-type uint8_t): a string to parse - * @len: length of @str, or -1 if string is %NULL terminated + * @len: length of @str, or -1 if string is `NULL` terminated * @variation: (out): the #hb_variation_t to initialize with the parsed values * * Parses a string into a #hb_variation_t. @@ -1035,7 +1067,7 @@ parse_one_variation (const char **pp, const char *end, hb_variation_t *variation * number. For example `wght=500`, or `slnt=-7.5`. * * Return value: - * %true if @str is successfully parsed, %false otherwise + * `true` if @str is successfully parsed, `false` otherwise * * Since: 1.4.2 */ @@ -1107,7 +1139,7 @@ get_C_locale () * @buf: (array length=size) (out): output string * @size: the allocated size of @buf * - * Converts an #hb_variation_t into a %NULL-terminated string in the format + * Converts an #hb_variation_t into a `NULL`-terminated string in the format * understood by hb_variation_from_string(). The client in responsible for * allocating big enough size for @buf, 128 bytes is more than enough. * diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h index 7b897a6c511..7c7ad87c7ca 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h @@ -326,6 +326,9 @@ hb_language_to_string (hb_language_t language); HB_EXTERN hb_language_t hb_language_get_default (void); +HB_EXTERN hb_bool_t +hb_language_matches (hb_language_t language, + hb_language_t specific); /** * hb_script_t: diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-config.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-config.hh index 2578231d238..db8ec0e908c 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-config.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-config.hh @@ -98,6 +98,11 @@ /* Closure of options. */ +#ifdef HB_NO_BORING_EXPANSION +#define HB_NO_BEYOND_64K +#define HB_NO_VARIATIONS2 +#endif + #ifdef HB_DISABLE_DEPRECATED #define HB_IF_NOT_DEPRECATED(x) #else diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cplusplus.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cplusplus.hh index c79d1550649..f06a32d912f 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cplusplus.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cplusplus.hh @@ -166,14 +166,18 @@ HB_DEFINE_VTABLE (unicode_funcs); } // namespace hb +/* Workaround for GCC < 7, see: + * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56480 + * https://stackoverflow.com/a/25594741 */ namespace std { + template struct hash> { - size_t operator()(const hb::shared_ptr& v) const noexcept + std::size_t operator()(const hb::shared_ptr& v) const noexcept { - size_t h = hash{}(v.get ()); + std::size_t h = std::hash{}(v.get ()); return h; } }; @@ -181,13 +185,14 @@ struct hash> template struct hash> { - size_t operator()(const hb::unique_ptr& v) const noexcept + std::size_t operator()(const hb::unique_ptr& v) const noexcept { - size_t h = hash{}(v.get ()); + std::size_t h = std::hash{}(v.get ()); return h; } }; + } // namespace std #endif /* __cplusplus */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-deprecated.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-deprecated.h index a130d77f770..333dc3cd4c3 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-deprecated.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-deprecated.h @@ -93,7 +93,7 @@ HB_BEGIN_DECLS * This method should retrieve the glyph ID for a specified Unicode code point * font, with an optional variation selector. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * Deprecated: 1.2.3 * **/ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.cc index ce04f5bab18..de05b7d871a 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.cc @@ -43,6 +43,14 @@ * Functions for using HarfBuzz with DirectWrite fonts. **/ +/* Declare object creator for dynamic support of DWRITE */ +typedef HRESULT (WINAPI *t_DWriteCreateFactory)( + DWRITE_FACTORY_TYPE factoryType, + REFIID iid, + IUnknown **factory +); + + /* * DirectWrite font stream helpers */ @@ -137,6 +145,7 @@ public: struct hb_directwrite_face_data_t { + HMODULE dwrite_dll; IDWriteFactory *dwriteFactory; IDWriteFontFile *fontFile; DWriteFontFileStream *fontFileStream; @@ -158,12 +167,33 @@ _hb_directwrite_shaper_face_data_create (hb_face_t *face) return nullptr; \ } HB_STMT_END + data->dwrite_dll = LoadLibrary (TEXT ("DWRITE")); + if (unlikely (!data->dwrite_dll)) + FAIL ("Cannot find DWrite.DLL"); + + t_DWriteCreateFactory p_DWriteCreateFactory; + +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-function-type" +#endif + + p_DWriteCreateFactory = (t_DWriteCreateFactory) + GetProcAddress (data->dwrite_dll, "DWriteCreateFactory"); + +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + + if (unlikely (!p_DWriteCreateFactory)) + FAIL ("Cannot find DWriteCreateFactory()."); + HRESULT hr; // TODO: factory and fontFileLoader should be cached separately IDWriteFactory* dwriteFactory; - hr = DWriteCreateFactory (DWRITE_FACTORY_TYPE_SHARED, __uuidof (IDWriteFactory), - (IUnknown**) &dwriteFactory); + hr = p_DWriteCreateFactory (DWRITE_FACTORY_TYPE_SHARED, __uuidof (IDWriteFactory), + (IUnknown**) &dwriteFactory); if (unlikely (hr != S_OK)) FAIL ("Failed to run DWriteCreateFactory()."); @@ -227,6 +257,8 @@ _hb_directwrite_shaper_face_data_destroy (hb_directwrite_face_data_t *data) delete data->fontFileStream; if (data->faceBlob) hb_blob_destroy (data->faceBlob); + if (data->dwrite_dll) + FreeLibrary (data->dwrite_dll); if (data) delete data; } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-draw.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-draw.cc index fdc71102d64..46797e64e62 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-draw.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-draw.cc @@ -120,6 +120,7 @@ hb_draw_funcs_set_##name##_func (hb_draw_funcs_t *dfuncs, \ if (dfuncs->destroy) \ dfuncs->destroy->name = nullptr; \ } \ + return; \ \ fail: \ if (destroy) \ @@ -137,7 +138,7 @@ HB_DRAW_FUNCS_IMPLEMENT_CALLBACKS * Return value: (transfer full): * A newly allocated #hb_draw_funcs_t with a reference count of 1. The initial * reference count should be released with hb_draw_funcs_destroy when you are - * done using the #hb_draw_funcs_t. This function never returns %NULL. If + * done using the #hb_draw_funcs_t. This function never returns `NULL`. If * memory cannot be allocated, a special singleton #hb_draw_funcs_t object will * be returned. * @@ -208,6 +209,9 @@ hb_draw_funcs_destroy (hb_draw_funcs_t *dfuncs) #undef HB_DRAW_FUNC_IMPLEMENT } + hb_free (dfuncs->destroy); + hb_free (dfuncs->user_data); + hb_free (dfuncs); } @@ -234,7 +238,7 @@ hb_draw_funcs_make_immutable (hb_draw_funcs_t *dfuncs) * * Checks whether @dfuncs is immutable. * - * Return value: %true if @dfuncs is immutable, %false otherwise + * Return value: `true` if @dfuncs is immutable, `false` otherwise * * Since: 4.0.0 **/ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc index 7cdd6cb49fb..8f8b1a6d148 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc @@ -315,7 +315,7 @@ hb_face_destroy (hb_face_t *face) * * Attaches a user-data key/data pair to the given face object. * - * Return value: %true if success, %false otherwise + * Return value: `true` if success, `false` otherwise * * Since: 0.9.2 **/ @@ -371,7 +371,7 @@ hb_face_make_immutable (hb_face_t *face) * * Tests whether the given face object is immutable. * - * Return value: %true is @face is immutable, %false otherwise + * Return value: `true` is @face is immutable, `false` otherwise * * Since: 0.9.2 **/ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc index 8c4fe863b65..fd9073c33e7 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc @@ -754,7 +754,7 @@ hb_font_funcs_destroy (hb_font_funcs_t *ffuncs) * * Attaches a user-data key/data pair to the specified font-functions structure. * - * Return value: %true if success, %false otherwise + * Return value: `true` if success, `false` otherwise * * Since: 0.9.2 **/ @@ -811,7 +811,7 @@ hb_font_funcs_make_immutable (hb_font_funcs_t *ffuncs) * * Tests whether a font-functions structure is immutable. * - * Return value: %true if @ffuncs is immutable, %false otherwise + * Return value: `true` if @ffuncs is immutable, `false` otherwise * * Since: 0.9.2 **/ @@ -903,7 +903,7 @@ hb_font_t::has_func (unsigned int i) * Fetches the extents for a specified font, for horizontal * text segments. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * * Since: 1.1.3 **/ @@ -922,7 +922,7 @@ hb_font_get_h_extents (hb_font_t *font, * Fetches the extents for a specified font, for vertical * text segments. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * * Since: 1.1.3 **/ @@ -946,7 +946,7 @@ hb_font_get_v_extents (hb_font_t *font, * If @variation_selector is 0, calls hb_font_get_nominal_glyph(); * otherwise calls hb_font_get_variation_glyph(). * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * * Since: 0.9.2 **/ @@ -974,7 +974,7 @@ hb_font_get_glyph (hb_font_t *font, * for code points modified by variation selectors. For variation-selector * support, user hb_font_get_variation_glyph() or use hb_font_get_glyph(). * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * * Since: 1.2.3 **/ @@ -1026,7 +1026,7 @@ hb_font_get_nominal_glyphs (hb_font_t *font, * by the specified variation-selector code point, in the specified * font. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * * Since: 1.2.3 **/ @@ -1136,7 +1136,7 @@ hb_font_get_glyph_v_advances (hb_font_t* font, * Fetches the (X,Y) coordinates of the origin for a glyph ID * in the specified font, for horizontal text segments. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * * Since: 0.9.2 **/ @@ -1159,7 +1159,7 @@ hb_font_get_glyph_h_origin (hb_font_t *font, * Fetches the (X,Y) coordinates of the origin for a glyph ID * in the specified font, for vertical text segments. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * * Since: 0.9.2 **/ @@ -1232,7 +1232,7 @@ hb_font_get_glyph_v_kerning (hb_font_t *font, * Fetches the #hb_glyph_extents_t data for a glyph ID * in the specified font. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * * Since: 0.9.2 **/ @@ -1255,7 +1255,7 @@ hb_font_get_glyph_extents (hb_font_t *font, * Fetches the (x,y) coordinates of a specified contour-point index * in the specified glyph, within the specified font. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * * Since: 0.9.2 **/ @@ -1278,7 +1278,7 @@ hb_font_get_glyph_contour_point (hb_font_t *font, * * Fetches the glyph-name string for a glyph ID in the specified @font. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * * Since: 0.9.2 **/ @@ -1302,7 +1302,7 @@ hb_font_get_glyph_name (hb_font_t *font, * * Note: @len == -1 means the name string is null-terminated. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * * Since: 0.9.2 **/ @@ -1537,7 +1537,7 @@ hb_font_get_glyph_kerning_for_direction (hb_font_t *font, * Calls the appropriate direction-specific variant (horizontal * or vertical) depending on the value of @direction. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * * Since: 0.9.2 **/ @@ -1566,7 +1566,7 @@ hb_font_get_glyph_extents_for_origin (hb_font_t *font, * Calls the appropriate direction-specific variant (horizontal * or vertical) depending on the value of @direction. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * * Since: 0.9.2 **/ @@ -1617,7 +1617,7 @@ hb_font_glyph_to_string (hb_font_t *font, * * Note: @len == -1 means the string is null-terminated. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * * Since: 0.9.2 **/ @@ -1675,6 +1675,7 @@ _hb_font_create (hb_face_t *face) if (unlikely (!face)) face = hb_face_get_empty (); + if (!(font = hb_object_create ())) return hb_font_get_empty (); @@ -1866,7 +1867,7 @@ hb_font_destroy (hb_font_t *font) * * Attaches a user-data key/data pair to the specified font object. * - * Return value: %true if success, %false otherwise + * Return value: `true` if success, `false` otherwise * * Since: 0.9.2 **/ @@ -1928,7 +1929,7 @@ hb_font_make_immutable (hb_font_t *font) * * Tests whether a font object is immutable. * - * Return value: %true if @font is immutable, %false otherwise + * Return value: `true` if @font is immutable, `false` otherwise * * Since: 0.9.2 **/ @@ -1948,7 +1949,7 @@ hb_font_is_immutable (hb_font_t *font) * * Return value: serial number * - * Since: 4.4.0. + * Since: 4.4.0 **/ unsigned int hb_font_get_serial (hb_font_t *font) @@ -1964,7 +1965,7 @@ hb_font_get_serial (hb_font_t *font) * This has the effect of increasing the serial as returned * by hb_font_get_serial(), which invalidates internal caches. * - * Since: 4.4.0. + * Since: 4.4.0 **/ void hb_font_changed (hb_font_t *font) @@ -2386,6 +2387,10 @@ hb_font_set_variations (hb_font_t *font, return; } + /* Initialize design coords to default from fvar. */ + for (unsigned int i = 0; i < coords_length; i++) + design_coords[i] = axes[i].get_default (); + for (unsigned int i = 0; i < variations_length; i++) { const auto tag = variations[i].tag; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h index ca6ecf79634..3f27bca2881 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h @@ -198,7 +198,7 @@ typedef hb_font_get_font_extents_func_t hb_font_get_font_v_extents_func_t; * This method should retrieve the nominal glyph ID for a specified Unicode code * point. Glyph IDs must be returned in a #hb_codepoint_t output parameter. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * **/ typedef hb_bool_t (*hb_font_get_nominal_glyph_func_t) (hb_font_t *font, void *font_data, @@ -221,7 +221,7 @@ typedef hb_bool_t (*hb_font_get_nominal_glyph_func_t) (hb_font_t *font, void *fo * followed by a specified Variation Selector code point. Glyph IDs must be * returned in a #hb_codepoint_t output parameter. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * **/ typedef hb_bool_t (*hb_font_get_variation_glyph_func_t) (hb_font_t *font, void *font_data, @@ -362,7 +362,7 @@ typedef hb_font_get_glyph_advances_func_t hb_font_get_glyph_v_advances_func_t; * origin for a glyph. Each coordinate must be returned in an #hb_position_t * output parameter. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * **/ typedef hb_bool_t (*hb_font_get_glyph_origin_func_t) (hb_font_t *font, void *font_data, @@ -434,7 +434,7 @@ typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_h_kerning_func_t; * This method should retrieve the extents for a specified glyph. Extents must be * returned in an #hb_glyph_extents output parameter. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * **/ typedef hb_bool_t (*hb_font_get_glyph_extents_func_t) (hb_font_t *font, void *font_data, @@ -458,7 +458,7 @@ typedef hb_bool_t (*hb_font_get_glyph_extents_func_t) (hb_font_t *font, void *fo * specified contour point in a glyph. Each coordinate must be returned as * an #hb_position_t output parameter. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * **/ typedef hb_bool_t (*hb_font_get_glyph_contour_point_func_t) (hb_font_t *font, void *font_data, @@ -481,7 +481,7 @@ typedef hb_bool_t (*hb_font_get_glyph_contour_point_func_t) (hb_font_t *font, vo * This method should retrieve the glyph name that corresponds to a * glyph ID. The name should be returned in a string output parameter. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * **/ typedef hb_bool_t (*hb_font_get_glyph_name_func_t) (hb_font_t *font, void *font_data, @@ -503,7 +503,7 @@ typedef hb_bool_t (*hb_font_get_glyph_name_func_t) (hb_font_t *font, void *font_ * This method should retrieve the glyph ID that corresponds to a glyph-name * string. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * **/ typedef hb_bool_t (*hb_font_get_glyph_from_name_func_t) (hb_font_t *font, void *font_data, diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc index b526a828657..5c88a7f3bd3 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc @@ -136,32 +136,56 @@ _hb_ft_font_destroy (void *data) /* hb_font changed, update FT_Face. */ static void _hb_ft_hb_font_changed (hb_font_t *font, FT_Face ft_face) { + float x_mult = 1.f, y_mult = 1.f; - FT_Set_Char_Size (ft_face, - abs (font->x_scale), abs (font->y_scale), - 0, 0); + if (font->x_scale < 0) x_mult = -x_mult; + if (font->y_scale < 0) y_mult = -y_mult; + + if (FT_Set_Char_Size (ft_face, + abs (font->x_scale), abs (font->y_scale), + 0, 0 #if 0 font->x_ppem * 72 * 64 / font->x_scale, - font->y_ppem * 72 * 64 / font->y_scale); + font->y_ppem * 72 * 64 / font->y_scale +#endif + ) && ft_face->num_fixed_sizes) + { +#ifdef HAVE_FT_GET_TRANSFORM + /* Bitmap font, eg. bitmap color emoji. */ + /* TODO Pick largest size? */ + int x_scale = ft_face->available_sizes[0].x_ppem; + int y_scale = ft_face->available_sizes[0].y_ppem; + FT_Set_Char_Size (ft_face, + x_scale, y_scale, + 0, 0); + + /* This contains the sign that was previously in x_mult/y_mult. */ + x_mult = (float) font->x_scale / x_scale; + y_mult = (float) font->y_scale / y_scale; #endif - if (font->x_scale < 0 || font->y_scale < 0) + } + else + { /* Shrug */ } + + + if (x_mult != 1.f || y_mult != 1.f) { - FT_Matrix matrix = { font->x_scale < 0 ? -1 : +1, 0, - 0, font->y_scale < 0 ? -1 : +1}; + FT_Matrix matrix = { (int) roundf (x_mult * (1<<16)), 0, + 0, (int) roundf (y_mult * (1<<16))}; FT_Set_Transform (ft_face, &matrix, nullptr); } #if defined(HAVE_FT_GET_VAR_BLEND_COORDINATES) && !defined(HB_NO_VAR) unsigned int num_coords; - const int *coords = hb_font_get_var_coords_normalized (font, &num_coords); + const float *coords = hb_font_get_var_coords_design (font, &num_coords); if (num_coords) { FT_Fixed *ft_coords = (FT_Fixed *) hb_calloc (num_coords, sizeof (FT_Fixed)); if (ft_coords) { for (unsigned int i = 0; i < num_coords; i++) - ft_coords[i] = coords[i] * 4; - FT_Set_Var_Blend_Coordinates (ft_face, num_coords, ft_coords); + ft_coords[i] = coords[i] * 65536.f; + FT_Set_Var_Design_Coordinates (ft_face, num_coords, ft_coords); hb_free (ft_coords); } } @@ -241,7 +265,7 @@ hb_ft_font_get_load_flags (hb_font_t *font) * Fetches the FT_Face associated with the specified #hb_font_t * font object. * - * Return value: (nullable): the FT_Face found or %NULL + * Return value: (nullable): the FT_Face found or `NULL` * * Since: 0.9.2 **/ @@ -263,7 +287,7 @@ hb_ft_font_get_face (hb_font_t *font) * Gets the FT_Face associated with @font, This face will be kept around until * you call hb_ft_font_unlock_face(). * - * Return value: (nullable): the FT_Face associated with @font or %NULL + * Return value: (nullable) (transfer none): the FT_Face associated with @font or `NULL` * Since: 2.6.5 **/ FT_Face @@ -280,7 +304,7 @@ hb_ft_font_lock_face (hb_font_t *font) } /** - * hb_ft_font_unlock_face: + * hb_ft_font_unlock_face: (skip) * @font: #hb_font_t to work upon * * Releases an FT_Face previously obtained with hb_ft_font_lock_face(). @@ -404,7 +428,13 @@ hb_ft_get_glyph_h_advances (hb_font_t* font, void* font_data, hb_lock_t lock (ft_font->lock); FT_Face ft_face = ft_font->ft_face; int load_flags = ft_font->load_flags; - int mult = font->x_scale < 0 ? -1 : +1; +#ifdef HAVE_FT_GET_TRANSFORM + FT_Matrix matrix; + FT_Get_Transform (ft_face, &matrix, nullptr); + float mult = matrix.xx / 65536.f; +#else + float mult = font->x_scale < 0 ? -1 : +1; +#endif for (unsigned int i = 0; i < count; i++) { @@ -420,7 +450,7 @@ hb_ft_get_glyph_h_advances (hb_font_t* font, void* font_data, ft_font->advance_cache.set (glyph, v); } - *first_advance = (v * mult + (1<<9)) >> 10; + *first_advance = (int) (v * mult + (1<<9)) >> 10; first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride); first_advance = &StructAtOffsetUnaligned (first_advance, advance_stride); } @@ -436,12 +466,18 @@ hb_ft_get_glyph_v_advance (hb_font_t *font, const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; hb_lock_t lock (ft_font->lock); FT_Fixed v; +#ifdef HAVE_FT_GET_TRANSFORM + FT_Matrix matrix; + FT_Get_Transform (ft_font->ft_face, &matrix, nullptr); + float y_mult = matrix.yy / 65536.f; +#else + float y_mult = font->y_scale < 0 ? -1 : +1; +#endif if (unlikely (FT_Get_Advance (ft_font->ft_face, glyph, ft_font->load_flags | FT_LOAD_VERTICAL_LAYOUT, &v))) return 0; - if (font->y_scale < 0) - v = -v; + v = (int) (y_mult * v); /* Note: FreeType's vertical metrics grows downward while other FreeType coordinates * have a Y growing upward. Hence the extra negation. */ @@ -462,6 +498,15 @@ hb_ft_get_glyph_v_origin (hb_font_t *font, const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; hb_lock_t lock (ft_font->lock); FT_Face ft_face = ft_font->ft_face; +#ifdef HAVE_FT_GET_TRANSFORM + FT_Matrix matrix; + FT_Get_Transform (ft_face, &matrix, nullptr); + float x_mult = matrix.xx / 65536.f; + float y_mult = matrix.yy / 65536.f; +#else + float x_mult = font->x_scale < 0 ? -1 : +1; + float y_mult = font->y_scale < 0 ? -1 : +1; +#endif if (unlikely (FT_Load_Glyph (ft_face, glyph, ft_font->load_flags))) return false; @@ -471,10 +516,8 @@ hb_ft_get_glyph_v_origin (hb_font_t *font, *x = ft_face->glyph->metrics.horiBearingX - ft_face->glyph->metrics.vertBearingX; *y = ft_face->glyph->metrics.horiBearingY - (-ft_face->glyph->metrics.vertBearingY); - if (font->x_scale < 0) - *x = -*x; - if (font->y_scale < 0) - *y = -*y; + *x = (hb_position_t) (x_mult * *x); + *y = (hb_position_t) (y_mult * *y); return true; } @@ -510,24 +553,24 @@ hb_ft_get_glyph_extents (hb_font_t *font, const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; hb_lock_t lock (ft_font->lock); FT_Face ft_face = ft_font->ft_face; +#ifdef HAVE_FT_GET_TRANSFORM + FT_Matrix matrix; + FT_Get_Transform (ft_face, &matrix, nullptr); + float x_mult = matrix.xx / 65536.f; + float y_mult = matrix.yy / 65536.f; +#else + float x_mult = font->x_scale < 0 ? -1 : +1; + float y_mult = font->y_scale < 0 ? -1 : +1; +#endif if (unlikely (FT_Load_Glyph (ft_face, glyph, ft_font->load_flags))) return false; - extents->x_bearing = ft_face->glyph->metrics.horiBearingX; - extents->y_bearing = ft_face->glyph->metrics.horiBearingY; - extents->width = ft_face->glyph->metrics.width; - extents->height = -ft_face->glyph->metrics.height; - if (font->x_scale < 0) - { - extents->x_bearing = -extents->x_bearing; - extents->width = -extents->width; - } - if (font->y_scale < 0) - { - extents->y_bearing = -extents->y_bearing; - extents->height = -extents->height; - } + extents->x_bearing = (hb_position_t) (x_mult * ft_face->glyph->metrics.horiBearingX); + extents->y_bearing = (hb_position_t) (y_mult * ft_face->glyph->metrics.horiBearingY); + extents->width = (hb_position_t) (x_mult * ft_face->glyph->metrics.width); + extents->height = (hb_position_t) (y_mult * -ft_face->glyph->metrics.height); + return true; } @@ -620,16 +663,32 @@ hb_ft_get_font_h_extents (hb_font_t *font HB_UNUSED, const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; hb_lock_t lock (ft_font->lock); FT_Face ft_face = ft_font->ft_face; +#ifdef HAVE_FT_GET_TRANSFORM + FT_Matrix matrix; + FT_Get_Transform (ft_face, &matrix, nullptr); + float y_mult = matrix.yy / 65536.f; +#else + float y_mult = font->y_scale < 0 ? -1 : +1; +#endif - metrics->ascender = FT_MulFix(ft_face->ascender, ft_face->size->metrics.y_scale); - metrics->descender = FT_MulFix(ft_face->descender, ft_face->size->metrics.y_scale); - metrics->line_gap = FT_MulFix( ft_face->height, ft_face->size->metrics.y_scale ) - (metrics->ascender - metrics->descender); - if (font->y_scale < 0) + if (ft_face->units_per_EM != 0) + { + metrics->ascender = FT_MulFix(ft_face->ascender, ft_face->size->metrics.y_scale); + metrics->descender = FT_MulFix(ft_face->descender, ft_face->size->metrics.y_scale); + metrics->line_gap = FT_MulFix( ft_face->height, ft_face->size->metrics.y_scale ) - (metrics->ascender - metrics->descender); + } + else { - metrics->ascender = -metrics->ascender; - metrics->descender = -metrics->descender; - metrics->line_gap = -metrics->line_gap; + /* Bitmap-only font, eg. color bitmap font. */ + metrics->ascender = ft_face->size->metrics.ascender; + metrics->descender = ft_face->size->metrics.descender; + metrics->line_gap = ft_face->size->metrics.height - (metrics->ascender - metrics->descender); } + + metrics->ascender = (hb_position_t) (y_mult * metrics->ascender); + metrics->descender = (hb_position_t) (y_mult * metrics->descender); + metrics->line_gap = (hb_position_t) (y_mult * metrics->line_gap); + return true; } @@ -684,8 +743,6 @@ hb_ft_get_glyph_shape (hb_font_t *font HB_UNUSED, hb_lock_t lock (ft_font->lock); FT_Face ft_face = ft_font->ft_face; - _hb_ft_hb_font_check_changed (font, ft_font); - if (unlikely (FT_Load_Glyph (ft_face, glyph, FT_LOAD_NO_BITMAP | ft_font->load_flags))) return; @@ -1028,6 +1085,8 @@ hb_ft_font_changed (hb_font_t *font) #endif } #endif + + _hb_ft_hb_font_check_changed (font, ft_font); } /** diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc index 63dc18b466d..4d0e687c755 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc @@ -158,7 +158,7 @@ _hb_graphite2_shaper_face_data_destroy (hb_graphite2_face_data_t *data) } /** - * hb_graphite2_face_get_gr_face: + * hb_graphite2_face_get_gr_face: (skip) * @face: @hb_face_t to query * * Fetches the Graphite2 gr_face corresponding to the specified @@ -195,10 +195,10 @@ _hb_graphite2_shaper_font_data_destroy (hb_graphite2_font_data_t *data HB_UNUSED #ifndef HB_DISABLE_DEPRECATED /** - * hb_graphite2_font_get_gr_font: + * hb_graphite2_font_get_gr_font: (skip) * @font: An #hb_font_t * - * Always returns %NULL. Use hb_graphite2_face_get_gr_face() instead. + * Always returns `NULL`. Use hb_graphite2_face_get_gr_face() instead. * * Return value: (nullable): Graphite2 font associated with @font. * @@ -223,7 +223,7 @@ struct hb_graphite2_cluster_t { unsigned int base_glyph; unsigned int num_glyphs; unsigned int cluster; - unsigned int advance; + int advance; }; hb_bool_t diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-iter.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-iter.hh index d4461f166cc..1a3ab43de03 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-iter.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-iter.hh @@ -253,6 +253,8 @@ struct hb_is_iterator_of }; #define hb_is_iterator_of(Iter, Item) hb_is_iterator_of::value #define hb_is_iterator(Iter) hb_is_iterator_of (Iter, typename Iter::item_t) +#define hb_is_sorted_iterator_of(Iter, Item) (hb_is_iterator_of::value && Iter::is_sorted_iterator) +#define hb_is_sorted_iterator(Iter) hb_is_sorted_iterator_of (Iter, typename Iter::item_t) /* hb_is_iterable() */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.cc index 089615c72a0..a29fa1a3136 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.cc @@ -56,8 +56,6 @@ hb_map_create () if (!(map = hb_object_create ())) return hb_map_get_empty (); - map->init_shallow (); - return map; } @@ -107,8 +105,6 @@ hb_map_destroy (hb_map_t *map) { if (!hb_object_destroy (map)) return; - map->fini_shallow (); - hb_free (map); } @@ -122,7 +118,7 @@ hb_map_destroy (hb_map_t *map) * * Attaches a user-data key/data pair to the specified map. * - * Return value: %true if success, %false otherwise + * Return value: `true` if success, `false` otherwise * * Since: 1.7.7 **/ @@ -162,7 +158,7 @@ hb_map_get_user_data (hb_map_t *map, * * Tests whether memory allocation for a set was successful. * - * Return value: %true if allocation succeeded, %false otherwise + * Return value: `true` if allocation succeeded, `false` otherwise * * Since: 1.7.7 **/ @@ -251,7 +247,7 @@ hb_map_del (hb_map_t *map, * * Tests whether @key is an element of @map. * - * Return value: %true if @key is found in @map, %false otherwise + * Return value: `true` if @key is found in @map, `false` otherwise * * Since: 1.7.7 **/ @@ -283,7 +279,7 @@ hb_map_clear (hb_map_t *map) * * Tests whether @map is empty (contains no elements). * - * Return value: %true if @map is empty + * Return value: `true` if @map is empty * * Since: 1.7.7 **/ @@ -317,7 +313,7 @@ hb_map_get_population (const hb_map_t *map) * Tests whether @map and @other are equal (contain the same * elements). * - * Return value: %true if the two maps are equal, %false otherwise. + * Return value: `true` if the two maps are equal, `false` otherwise. * * Since: 4.3.0 **/ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.hh index 5efad8d20cd..8302e3f8c7a 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.hh @@ -124,21 +124,20 @@ struct hb_hashmap_t hb_swap (a.prime, b.prime); hb_swap (a.items, b.items); } - void init_shallow () + void init () { + hb_object_init (this); + successful = true; population = occupancy = 0; mask = 0; prime = 0; items = nullptr; } - void init () - { - hb_object_init (this); - init_shallow (); - } - void fini_shallow () + void fini () { + hb_object_fini (this); + if (likely (items)) { unsigned size = mask + 1; for (unsigned i = 0; i < size; i++) @@ -148,11 +147,6 @@ struct hb_hashmap_t } population = occupancy = 0; } - void fini () - { - hb_object_fini (this); - fini_shallow (); - } void reset () { @@ -219,13 +213,11 @@ struct hb_hashmap_t /* Has interface. */ typedef const V& value_t; value_t operator [] (K k) const { return get (k); } - bool has (K key, const V **vp = nullptr) const + template + bool has (K key, VV **vp = nullptr) const { if (unlikely (!items)) - { - if (vp) *vp = &item_t::default_value (); return false; - } unsigned int i = bucket_for (key); if (items[i].is_real () && items[i] == key) { @@ -233,10 +225,7 @@ struct hb_hashmap_t return true; } else - { - if (vp) *vp = &item_t::default_value (); return false; - } } /* Projection. */ V operator () (K k) const { return get (k); } @@ -301,6 +290,12 @@ struct hb_hashmap_t | hb_map (&item_t::key) | hb_map (hb_ridentity) ) + auto keys_ref () const HB_AUTO_RETURN + ( + + hb_array (items, mask ? mask + 1 : 0) + | hb_filter (&item_t::is_real) + | hb_map (&item_t::key) + ) auto values () const HB_AUTO_RETURN ( + hb_array (items, mask ? mask + 1 : 0) @@ -308,6 +303,12 @@ struct hb_hashmap_t | hb_map (&item_t::value) | hb_map (hb_ridentity) ) + auto values_ref () const HB_AUTO_RETURN + ( + + hb_array (items, mask ? mask + 1 : 0) + | hb_filter (&item_t::is_real) + | hb_map (&item_t::value) + ) /* Sink interface. */ hb_hashmap_t& operator << (const hb_pair_t& v) @@ -443,4 +444,37 @@ struct hb_map_t : hb_hashmap_t +static inline +hb_hashmap_t* hb_hashmap_create () +{ + using hashmap = hb_hashmap_t; + hashmap* map; + if (!(map = hb_object_create ())) + return nullptr; + + return map; +} + +template +static inline +void hb_hashmap_destroy (hb_hashmap_t* map) +{ + if (!hb_object_destroy (map)) + return; + + hb_free (map); +} + +namespace hb { + +template +struct vtable> +{ + static constexpr auto destroy = hb_hashmap_destroy; +}; + +} + + #endif /* HB_MAP_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-meta.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-meta.hh index e97d790fc36..1921ccbb6d1 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-meta.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-meta.hh @@ -188,7 +188,7 @@ template <> struct hb_int_max : hb_integral_constant struct hb_int_max : hb_integral_constant {}; #define hb_int_max(T) hb_int_max::value -#if defined(__GNUC__) && __GNUC__ < 5 +#if defined(__GNUC__) && __GNUC__ < 5 && !defined(__clang__) #define hb_is_trivially_copyable(T) __has_trivial_copy(T) #define hb_is_trivially_copy_assignable(T) __has_trivial_assign(T) #define hb_is_trivially_constructible(T) __has_trivial_constructor(T) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-null.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-null.hh index 78eb6474d57..0d7f4da79e7 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-null.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-null.hh @@ -39,6 +39,24 @@ #define HB_NULL_POOL_SIZE 448 +template +struct _hb_has_min_size : hb_false_type {}; +template +struct _hb_has_min_size> + : hb_true_type {}; +template +using hb_has_min_size = _hb_has_min_size; +#define hb_has_min_size(T) hb_has_min_size::value + +template +struct _hb_has_null_size : hb_false_type {}; +template +struct _hb_has_null_size> + : hb_true_type {}; +template +using hb_has_null_size = _hb_has_null_size; +#define hb_has_null_size(T) hb_has_null_size::value + /* Use SFINAE to sniff whether T has min_size; in which case return the larger * of sizeof(T) and T::null_size, otherwise return sizeof(T). * @@ -117,8 +135,19 @@ struct NullHelper }; \ namespace Namespace { \ static_assert (true, "") /* Require semicolon after. */ +#define DECLARE_NULL_NAMESPACE_BYTES_TEMPLATE1(Namespace, Type, Size) \ + } /* Close namespace. */ \ + extern HB_INTERNAL const unsigned char _hb_Null_##Namespace##_##Type[Size]; \ + template \ + struct Null> { \ + static Namespace::Type const & get_null () { \ + return *reinterpret_cast *> (_hb_Null_##Namespace##_##Type); \ + } \ + }; \ + namespace Namespace { \ + static_assert (true, "") /* Require semicolon after. */ #define DEFINE_NULL_NAMESPACE_BYTES(Namespace, Type) \ - const unsigned char _hb_Null_##Namespace##_##Type[hb_null_size (Namespace::Type)] + const unsigned char _hb_Null_##Namespace##_##Type[sizeof (_hb_Null_##Namespace##_##Type)] /* Specializations for arbitrary-content Null objects expressed as struct initializer. */ #define DECLARE_NULL_INSTANCE(Type) \ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-number-parser.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-number-parser.hh index 1a9dbba6dd3..ec68c3a7281 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-number-parser.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-number-parser.hh @@ -31,7 +31,7 @@ #include "hb.hh" -#line 35 "hb-number-parser.hh" +#line 32 "hb-number-parser.hh" static const unsigned char _double_parser_trans_keys[] = { 0u, 0u, 43u, 57u, 46u, 57u, 48u, 57u, 43u, 57u, 48u, 57u, 48u, 101u, 48u, 57u, 46u, 101u, 0 @@ -135,12 +135,12 @@ strtod_rl (const char *p, const char **end_ptr /* IN/OUT */) int cs; -#line 139 "hb-number-parser.hh" +#line 132 "hb-number-parser.hh" { cs = double_parser_start; } -#line 144 "hb-number-parser.hh" +#line 135 "hb-number-parser.hh" { int _slen; int _trans; @@ -198,7 +198,7 @@ _resume: exp_overflow = true; } break; -#line 202 "hb-number-parser.hh" +#line 187 "hb-number-parser.hh" } _again: diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-object.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-object.hh index 4b5bc32ade7..f6c7a569914 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-object.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-object.hh @@ -222,8 +222,11 @@ static inline Type *hb_object_create () if (unlikely (!obj)) return obj; + new (obj) Type; + hb_object_init (obj); hb_object_trace (obj, HB_FUNC); + return obj; } template @@ -269,6 +272,9 @@ static inline bool hb_object_destroy (Type *obj) return false; hb_object_fini (obj); + + obj->~Type (); + return true; } template @@ -280,7 +286,7 @@ static inline void hb_object_fini (Type *obj) { user_data->fini (); hb_free (user_data); - user_data = nullptr; + obj->header.user_data.set_relaxed (nullptr); } } template diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type.hh index aee7064be3e..d0d01a68c52 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type.hh @@ -105,7 +105,7 @@ struct IntType bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this))); + return_trace (c->check_struct (this)); } protected: BEInt v; @@ -170,7 +170,7 @@ struct LONGDATETIME bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this))); + return_trace (c->check_struct (this)); } protected: HBINT32 major; @@ -196,6 +196,10 @@ struct HBGlyphID16 : HBUINT16 { HBGlyphID16& operator = (uint16_t i) { HBUINT16::operator= (i); return *this; } }; +struct HBGlyphID24 : HBUINT24 +{ + HBGlyphID24& operator = (uint32_t i) { HBUINT24::operator= (i); return *this; } +}; /* Script/language-system/feature index */ struct Index : HBUINT16 { @@ -300,6 +304,10 @@ struct _hb_has_null template struct OffsetTo : Offset { + // Make sure Type is not unbounded; works only for types that are fully defined at OffsetTo time. + static_assert (has_null == false || + (hb_has_null_size (Type) || !hb_has_min_size (Type)), ""); + HB_DELETE_COPY_ASSIGN (OffsetTo); OffsetTo () = default; @@ -450,14 +458,16 @@ struct UnsizedArrayOf { unsigned int i = (unsigned int) i_; const Type *p = &arrayZ[i]; - if (unlikely (p < arrayZ)) return Null (Type); /* Overflowed. */ + if (unlikely ((const void *) p < (const void *) arrayZ)) return Null (Type); /* Overflowed. */ + _hb_compiler_memory_r_barrier (); return *p; } Type& operator [] (int i_) { unsigned int i = (unsigned int) i_; Type *p = &arrayZ[i]; - if (unlikely (p < arrayZ)) return Crap (Type); /* Overflowed. */ + if (unlikely ((const void *) p < (const void *) arrayZ)) return Crap (Type); /* Overflowed. */ + _hb_compiler_memory_r_barrier (); return *p; } @@ -550,14 +560,16 @@ struct UnsizedListOfOffset16To : UnsizedArray16OfOffsetTo *p = &this->arrayZ[i]; - if (unlikely (p < this->arrayZ)) return Null (Type); /* Overflowed. */ + if (unlikely ((const void *) p < (const void *) this->arrayZ)) return Null (Type); /* Overflowed. */ + _hb_compiler_memory_r_barrier (); return this+*p; } Type& operator [] (int i_) { unsigned int i = (unsigned int) i_; const OffsetTo *p = &this->arrayZ[i]; - if (unlikely (p < this->arrayZ)) return Crap (Type); /* Overflowed. */ + if (unlikely ((const void *) p < (const void *) this->arrayZ)) return Crap (Type); /* Overflowed. */ + _hb_compiler_memory_r_barrier (); return this+*p; } @@ -608,12 +620,14 @@ struct ArrayOf { unsigned int i = (unsigned int) i_; if (unlikely (i >= len)) return Null (Type); + _hb_compiler_memory_r_barrier (); return arrayZ[i]; } Type& operator [] (int i_) { unsigned int i = (unsigned int) i_; if (unlikely (i >= len)) return Crap (Type); + _hb_compiler_memory_r_barrier (); return arrayZ[i]; } @@ -729,6 +743,7 @@ struct ArrayOf DEFINE_SIZE_ARRAY (sizeof (LenType), arrayZ); }; template using Array16Of = ArrayOf; +template using Array24Of = ArrayOf; template using Array32Of = ArrayOf; using PString = ArrayOf; @@ -738,26 +753,28 @@ template using Array16OfOffset32To = ArrayOf using Array32OfOffset32To = ArrayOf, HBUINT32>; /* Array of offsets relative to the beginning of the array itself. */ -template -struct List16OfOffset16To : Array16OfOffset16To +template +struct List16OfOffsetTo : ArrayOf, HBUINT16> { const Type& operator [] (int i_) const { unsigned int i = (unsigned int) i_; if (unlikely (i >= this->len)) return Null (Type); + _hb_compiler_memory_r_barrier (); return this+this->arrayZ[i]; } const Type& operator [] (int i_) { unsigned int i = (unsigned int) i_; if (unlikely (i >= this->len)) return Crap (Type); + _hb_compiler_memory_r_barrier (); return this+this->arrayZ[i]; } bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - struct List16OfOffset16To *out = c->serializer->embed (*this); + struct List16OfOffsetTo *out = c->serializer->embed (*this); if (unlikely (!out)) return_trace (false); unsigned int count = this->len; for (unsigned int i = 0; i < count; i++) @@ -769,10 +786,13 @@ struct List16OfOffset16To : Array16OfOffset16To bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const { TRACE_SANITIZE (this); - return_trace (Array16OfOffset16To::sanitize (c, this, std::forward (ds)...)); + return_trace ((Array16Of>::sanitize (c, this, std::forward (ds)...))); } }; +template +using List16OfOffset16To = List16OfOffsetTo; + /* An array starting at second element. */ template struct HeadlessArrayOf @@ -785,12 +805,14 @@ struct HeadlessArrayOf { unsigned int i = (unsigned int) i_; if (unlikely (i >= lenP1 || !i)) return Null (Type); + _hb_compiler_memory_r_barrier (); return arrayZ[i-1]; } Type& operator [] (int i_) { unsigned int i = (unsigned int) i_; if (unlikely (i >= lenP1 || !i)) return Crap (Type); + _hb_compiler_memory_r_barrier (); return arrayZ[i-1]; } unsigned int get_size () const @@ -869,12 +891,14 @@ struct ArrayOfM1 { unsigned int i = (unsigned int) i_; if (unlikely (i > lenM1)) return Null (Type); + _hb_compiler_memory_r_barrier (); return arrayZ[i]; } Type& operator [] (int i_) { unsigned int i = (unsigned int) i_; if (unlikely (i > lenM1)) return Crap (Type); + _hb_compiler_memory_r_barrier (); return arrayZ[i]; } unsigned int get_size () const @@ -961,6 +985,7 @@ struct SortedArrayOf : ArrayOf }; template using SortedArray16Of = SortedArrayOf; +template using SortedArray24Of = SortedArrayOf; template using SortedArray32Of = SortedArrayOf; /* @@ -1053,12 +1078,14 @@ struct VarSizedBinSearchArrayOf { unsigned int i = (unsigned int) i_; if (unlikely (i >= get_length ())) return Null (Type); + _hb_compiler_memory_r_barrier (); return StructAtOffset (&bytesZ, i * header.unitSize); } Type& operator [] (int i_) { unsigned int i = (unsigned int) i_; if (unlikely (i >= get_length ())) return Crap (Type); + _hb_compiler_memory_r_barrier (); return StructAtOffset (&bytesZ, i * header.unitSize); } unsigned int get_length () const diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-colr-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-colr-table.hh index dac755c02ca..f01d383bdcd 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-colr-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-colr-table.hh @@ -145,7 +145,7 @@ struct BaseGlyphRecord bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this))); + return_trace (c->check_struct (this)); } public: @@ -524,6 +524,7 @@ struct PaintSweepGradient }; struct Paint; + // Paint a non-COLR glyph, filled as indicated by paint. struct PaintGlyph { @@ -1152,6 +1153,8 @@ struct Paint Variable paintformat31; PaintComposite paintformat32; } u; + public: + DEFINE_SIZE_MIN (2); }; struct BaseGlyphPaintRecord diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.cc index 16077765bdd..a9ae0136824 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.cc @@ -61,7 +61,7 @@ * * Tests whether a face includes a `CPAL` color-palette table. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * * Since: 2.1.0 */ @@ -192,7 +192,7 @@ hb_ot_color_palette_get_colors (hb_face_t *face, * * Tests whether a face includes any `COLR` color layers. * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * * Since: 2.1.0 */ @@ -239,7 +239,7 @@ hb_ot_color_glyph_get_layers (hb_face_t *face, * * Tests whether a face includes any `SVG` glyph images. * - * Return value: %true if data found, %false otherwise. + * Return value: `true` if data found, `false` otherwise. * * Since: 2.1.0 */ @@ -279,7 +279,7 @@ hb_ot_color_glyph_reference_svg (hb_face_t *face, hb_codepoint_t glyph) * * Tests whether a face has PNG glyph images (either in `CBDT` or `sbix` tables). * - * Return value: %true if data found, %false otherwise + * Return value: `true` if data found, `false` otherwise * * Since: 2.1.0 */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.h index c23ce4de44f..d11e07e2309 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.h @@ -102,6 +102,10 @@ hb_ot_color_has_layers (hb_face_t *face); * * Pairs of glyph and color index. * + * A color index of 0xFFFF does not refer to a palette + * color, but indicates that the foreground color should + * be used. + * * Since: 2.1.0 **/ typedef struct hb_ot_color_layer_t { diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.cc index af1bc86d488..3f13b9994a6 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.cc @@ -151,7 +151,7 @@ hb_ot_get_glyph_h_advances (hb_font_t* font, void* font_data, const OT::hmtx_accelerator_t &hmtx = *ot_face->hmtx; #ifndef HB_NO_VAR - const OT::HVARVVAR &HVAR = *hmtx.var_table; + const OT::HVAR &HVAR = *hmtx.var_table; const OT::VariationStore &varStore = &HVAR + HVAR.varStore; OT::VariationStore::cache_t *varStore_cache = font->num_coords * count >= 128 ? varStore.create_cache () : nullptr; @@ -190,7 +190,7 @@ hb_ot_get_glyph_h_advances (hb_font_t* font, void* font_data, { for (unsigned int i = 0; i < count; i++) { - *first_advance = font->em_scale_x (hmtx.get_advance (*first_glyph, font, varStore_cache)); + *first_advance = font->em_scale_x (hmtx.get_advance_with_var_unscaled (*first_glyph, font, varStore_cache)); first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride); first_advance = &StructAtOffsetUnaligned (first_advance, advance_stride); } @@ -211,7 +211,7 @@ hb_ot_get_glyph_h_advances (hb_font_t* font, void* font_data, v = cv; else { - v = hmtx.get_advance (*first_glyph, font, varStore_cache); + v = hmtx.get_advance_with_var_unscaled (*first_glyph, font, varStore_cache); ot_font->advance_cache->set (*first_glyph, v); } *first_advance = font->em_scale_x (v); @@ -242,7 +242,7 @@ hb_ot_get_glyph_v_advances (hb_font_t* font, void* font_data, if (vmtx.has_data ()) { #ifndef HB_NO_VAR - const OT::HVARVVAR &VVAR = *vmtx.var_table; + const OT::VVAR &VVAR = *vmtx.var_table; const OT::VariationStore &varStore = &VVAR + VVAR.varStore; OT::VariationStore::cache_t *varStore_cache = font->num_coords ? varStore.create_cache () : nullptr; #else @@ -251,7 +251,7 @@ hb_ot_get_glyph_v_advances (hb_font_t* font, void* font_data, for (unsigned int i = 0; i < count; i++) { - *first_advance = font->em_scale_y (-(int) vmtx.get_advance (*first_glyph, font, varStore_cache)); + *first_advance = font->em_scale_y (-(int) vmtx.get_advance_with_var_unscaled (*first_glyph, font, varStore_cache)); first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride); first_advance = &StructAtOffsetUnaligned (first_advance, advance_stride); } @@ -293,17 +293,28 @@ hb_ot_get_glyph_v_origin (hb_font_t *font, const OT::VORG &VORG = *ot_face->VORG; if (VORG.has_data ()) { - *y = font->em_scale_y (VORG.get_y_origin (glyph)); + float delta = 0; + +#ifndef HB_NO_VAR + const OT::vmtx_accelerator_t &vmtx = *ot_face->vmtx; + const OT::VVAR &VVAR = *vmtx.var_table; + if (font->num_coords) + VVAR.get_vorg_delta_unscaled (glyph, + font->coords, font->num_coords, + &delta); +#endif + + *y = font->em_scalef_y (VORG.get_y_origin (glyph) + delta); return true; } hb_glyph_extents_t extents = {0}; if (ot_face->glyf->get_extents (font, glyph, &extents)) { - if (ot_face->vmtx->has_data ()) + const OT::vmtx_accelerator_t &vmtx = *ot_face->vmtx; + int tsb = 0; + if (vmtx.get_leading_bearing_with_var_unscaled (font, glyph, &tsb)) { - const OT::vmtx_accelerator_t &vmtx = *ot_face->vmtx; - hb_position_t tsb = vmtx.get_side_bearing (font, glyph); *y = extents.y_bearing + font->em_scale_y (tsb); return true; } @@ -503,16 +514,17 @@ hb_ot_font_set_funcs (hb_font_t *font) } #ifndef HB_NO_VAR -int -_glyf_get_side_bearing_var (hb_font_t *font, hb_codepoint_t glyph, bool is_vertical) +bool +_glyf_get_leading_bearing_with_var_unscaled (hb_font_t *font, hb_codepoint_t glyph, bool is_vertical, + int *lsb) { - return font->face->table.glyf->get_side_bearing_var (font, glyph, is_vertical); + return font->face->table.glyf->get_leading_bearing_with_var_unscaled (font, glyph, is_vertical, lsb); } unsigned -_glyf_get_advance_var (hb_font_t *font, hb_codepoint_t glyph, bool is_vertical) +_glyf_get_advance_with_var_unscaled (hb_font_t *font, hb_codepoint_t glyph, bool is_vertical) { - return font->face->table.glyf->get_advance_var (font, glyph, is_vertical); + return font->face->table.glyf->get_advance_with_var_unscaled (font, glyph, is_vertical); } #endif diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hmtx-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hmtx-table.hh index d0e46e0b0fc..50e4b54fded 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hmtx-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hmtx-table.hh @@ -43,11 +43,11 @@ #define HB_OT_TAG_vmtx HB_TAG('v','m','t','x') -HB_INTERNAL int -_glyf_get_side_bearing_var (hb_font_t *font, hb_codepoint_t glyph, bool is_vertical); +HB_INTERNAL bool +_glyf_get_leading_bearing_with_var_unscaled (hb_font_t *font, hb_codepoint_t glyph, bool is_vertical, int *lsb); HB_INTERNAL unsigned -_glyf_get_advance_var (hb_font_t *font, hb_codepoint_t glyph, bool is_vertical); +_glyf_get_advance_with_var_unscaled (hb_font_t *font, hb_codepoint_t glyph, bool is_vertical); namespace OT { @@ -62,7 +62,7 @@ struct LongMetric }; -template +template struct hmtxvmtx { bool sanitize (hb_sanitize_context_t *c HB_UNUSED) const @@ -135,9 +135,9 @@ struct hmtxvmtx auto& plan = c->plan; num_long_metrics = plan->num_output_glyphs (); hb_codepoint_t old_gid = 0; - unsigned int last_advance = plan->old_gid_for_new_gid (num_long_metrics - 1, &old_gid) ? _mtx.get_advance (old_gid) : 0; + unsigned int last_advance = plan->old_gid_for_new_gid (num_long_metrics - 1, &old_gid) ? _mtx.get_advance_without_var_unscaled (old_gid) : 0; while (num_long_metrics > 1 && - last_advance == (plan->old_gid_for_new_gid (num_long_metrics - 2, &old_gid) ? _mtx.get_advance (old_gid) : 0)) + last_advance == (plan->old_gid_for_new_gid (num_long_metrics - 2, &old_gid) ? _mtx.get_advance_without_var_unscaled (old_gid) : 0)) { num_long_metrics--; } @@ -150,7 +150,9 @@ struct hmtxvmtx hb_codepoint_t old_gid; if (!c->plan->old_gid_for_new_gid (_, &old_gid)) return hb_pair (0u, 0); - return hb_pair (_mtx.get_advance (old_gid), _mtx.get_side_bearing (old_gid)); + int lsb = 0; + (void) _mtx.get_leading_bearing_without_var_unscaled (old_gid, &lsb); + return hb_pair (_mtx.get_advance_without_var_unscaled (old_gid), +lsb); }) ; @@ -173,7 +175,7 @@ struct hmtxvmtx accelerator_t (hb_face_t *face) { table = hb_sanitize_context_t ().reference_table (face, T::tableTag); - var_table = hb_sanitize_context_t ().reference_table (face, T::variationsTag); + var_table = hb_sanitize_context_t ().reference_table (face, T::variationsTag); default_advance = T::is_horizontal ? hb_face_get_upem (face) / 2 : hb_face_get_upem (face); @@ -221,36 +223,46 @@ struct hmtxvmtx bool has_data () const { return (bool) num_bearings; } - int get_side_bearing (hb_codepoint_t glyph) const + bool get_leading_bearing_without_var_unscaled (hb_codepoint_t glyph, + int *lsb) const { if (glyph < num_long_metrics) - return table->longMetricZ[glyph].sb; + { + *lsb = table->longMetricZ[glyph].sb; + return true; + } if (unlikely (glyph >= num_bearings)) - return 0; + return false; const FWORD *bearings = (const FWORD *) &table->longMetricZ[num_long_metrics]; - return bearings[glyph - num_long_metrics]; + *lsb = bearings[glyph - num_long_metrics]; + return true; } - int get_side_bearing (hb_font_t *font, hb_codepoint_t glyph) const + bool get_leading_bearing_with_var_unscaled (hb_font_t *font, + hb_codepoint_t glyph, + int *lsb) const { - int side_bearing = get_side_bearing (glyph); + if (!font->num_coords) + return get_leading_bearing_without_var_unscaled (glyph, lsb); #ifndef HB_NO_VAR - if (unlikely (glyph >= num_bearings) || !font->num_coords) - return side_bearing; - - if (var_table.get_length ()) - return side_bearing + var_table->get_side_bearing_var (glyph, font->coords, font->num_coords); + float delta; + if (var_table->get_lsb_delta_unscaled (glyph, font->coords, font->num_coords, &delta) && + get_leading_bearing_without_var_unscaled (glyph, lsb)) + { + *lsb += roundf (delta); + return true; + } - return _glyf_get_side_bearing_var (font, glyph, T::tableTag == HB_OT_TAG_vmtx); + return _glyf_get_leading_bearing_with_var_unscaled (font, glyph, T::tableTag == HB_OT_TAG_vmtx, lsb); #else - return side_bearing; + return false; #endif } - unsigned int get_advance (hb_codepoint_t glyph) const + unsigned int get_advance_without_var_unscaled (hb_codepoint_t glyph) const { /* OpenType case. */ if (glyph < num_bearings) @@ -262,7 +274,7 @@ struct hmtxvmtx if (unlikely (!num_advances)) return default_advance; -#ifdef HB_NO_BORING_EXPANSION +#ifdef HB_NO_BEYOND_64K return 0; #endif @@ -275,7 +287,7 @@ struct hmtxvmtx /* TODO Optimize */ if (num_bearings == num_advances) - return get_advance (num_bearings - 1); + return get_advance_without_var_unscaled (num_bearings - 1); const FWORD *bearings = (const FWORD *) &table->longMetricZ[num_long_metrics]; const UFWORD *advances = (const UFWORD *) &bearings[num_bearings - num_long_metrics]; @@ -283,20 +295,22 @@ struct hmtxvmtx return advances[hb_min (glyph - num_bearings, num_advances - num_bearings - 1)]; } - unsigned int get_advance (hb_codepoint_t glyph, - hb_font_t *font, - VariationStore::cache_t *store_cache = nullptr) const + unsigned get_advance_with_var_unscaled (hb_codepoint_t glyph, + hb_font_t *font, + VariationStore::cache_t *store_cache = nullptr) const { - unsigned int advance = get_advance (glyph); + unsigned int advance = get_advance_without_var_unscaled (glyph); #ifndef HB_NO_VAR if (unlikely (glyph >= num_bearings) || !font->num_coords) return advance; if (var_table.get_length ()) - return advance + roundf (var_table->get_advance_var (glyph, font, store_cache)); // TODO Optimize?! + return advance + roundf (var_table->get_advance_delta_unscaled (glyph, + font->coords, font->num_coords, + store_cache)); // TODO Optimize?! - return _glyf_get_advance_var (font, glyph, T::tableTag == HB_OT_TAG_vmtx); + return _glyf_get_advance_with_var_unscaled (font, glyph, T::tableTag == HB_OT_TAG_vmtx); #else return advance; #endif @@ -313,7 +327,7 @@ struct hmtxvmtx public: hb_blob_ptr_t table; - hb_blob_ptr_t var_table; + hb_blob_ptr_t var_table; }; protected: @@ -346,12 +360,12 @@ struct hmtxvmtx DEFINE_SIZE_ARRAY (0, longMetricZ); }; -struct hmtx : hmtxvmtx { +struct hmtx : hmtxvmtx { static constexpr hb_tag_t tableTag = HB_OT_TAG_hmtx; static constexpr hb_tag_t variationsTag = HB_OT_TAG_HVAR; static constexpr bool is_horizontal = true; }; -struct vmtx : hmtxvmtx { +struct vmtx : hmtxvmtx { static constexpr hb_tag_t tableTag = HB_OT_TAG_vmtx; static constexpr hb_tag_t variationsTag = HB_OT_TAG_VVAR; static constexpr bool is_horizontal = false; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-base-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-base-table.hh index 1b9dfcd3f54..8179e5acd52 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-base-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-base-table.hh @@ -49,7 +49,7 @@ struct BaseCoordFormat1 bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this))); + return_trace (c->check_struct (this)); } protected: diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common.hh index d3438053468..9a4157b21ff 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common.hh @@ -35,6 +35,14 @@ #include "hb-set.hh" #include "hb-bimap.hh" +#include "OT/Layout/Common/Coverage.hh" +#include "OT/Layout/types.hh" + +// TODO(garretrieger): cleanup these after migration. +using OT::Layout::Common::Coverage; +using OT::Layout::Common::RangeRecord; +using OT::Layout::SmallTypes; +using OT::Layout::MediumTypes; #ifndef HB_MAX_NESTING_LEVEL #define HB_MAX_NESTING_LEVEL 64 @@ -46,10 +54,10 @@ /* * The maximum number of times a lookup can be applied during shaping. * Used to limit the number of iterations of the closure algorithm. - * This must be larger than the number of times add_pause() is + * This must be larger than the number of times add_gsub_pause() is * called in a collect_features call of any shaper. */ -#define HB_CLOSURE_MAX_STAGES 32 +#define HB_CLOSURE_MAX_STAGES 12 #endif #ifndef HB_MAX_SCRIPTS @@ -79,14 +87,6 @@ namespace OT { - -#define NOT_COVERED ((unsigned int) -1) - - -template -static inline void Coverage_serialize (hb_serialize_context_t *c, - Iterator it); - template static inline void ClassDef_serialize (hb_serialize_context_t *c, Iterator it); @@ -377,6 +377,51 @@ HB_FUNCOBJ (serialize_math_record_array); * Script, ScriptList, LangSys, Feature, FeatureList, Lookup, LookupList */ +struct IndexArray : Array16Of +{ + bool intersects (const hb_map_t *indexes) const + { return hb_any (*this, indexes); } + + template + void serialize (hb_serialize_context_t *c, + hb_subset_layout_context_t *l, + Iterator it) + { + if (!it) return; + if (unlikely (!c->extend_min ((*this)))) return; + + for (const auto _ : it) + { + if (!l->visitLookupIndex()) break; + + Index i; + i = _; + c->copy (i); + this->len++; + } + } + + unsigned int get_indexes (unsigned int start_offset, + unsigned int *_count /* IN/OUT */, + unsigned int *_indexes /* OUT */) const + { + if (_count) + { + + this->sub_array (start_offset, _count) + | hb_sink (hb_array (_indexes, *_count)) + ; + } + return this->len; + } + + void add_indexes_to (hb_set_t* output /* OUT */) const + { + output->add_array (as_array ()); + } +}; + + struct Record_sanitize_closure_t { hb_tag_t tag; const void *list_base; @@ -465,122 +510,405 @@ struct RecordListOf : RecordArrayOf } }; -struct Feature; - -struct RecordListOfFeature : RecordListOf +/* https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#size */ +struct FeatureParamsSize { - bool subset (hb_subset_context_t *c, - hb_subset_layout_context_t *l) const + bool sanitize (hb_sanitize_context_t *c) const { - TRACE_SUBSET (this); - auto *out = c->serializer->start_embed (*this); - if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false); + TRACE_SANITIZE (this); + if (unlikely (!c->check_struct (this))) return_trace (false); - unsigned count = this->len; - + hb_zip (*this, hb_range (count)) - | hb_filter (l->feature_index_map, hb_second) - | hb_map (hb_first) - | hb_apply (subset_record_array (l, out, this)) - ; - return_trace (true); + /* This subtable has some "history", if you will. Some earlier versions of + * Adobe tools calculated the offset of the FeatureParams subtable from the + * beginning of the FeatureList table! Now, that is dealt with in the + * Feature implementation. But we still need to be able to tell junk from + * real data. Note: We don't check that the nameID actually exists. + * + * Read Roberts wrote on 9/15/06 on opentype-list@indx.co.uk : + * + * Yes, it is correct that a new version of the AFDKO (version 2.0) will be + * coming out soon, and that the makeotf program will build a font with a + * 'size' feature that is correct by the specification. + * + * The specification for this feature tag is in the "OpenType Layout Tag + * Registry". You can see a copy of this at: + * https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#tag-size + * + * Here is one set of rules to determine if the 'size' feature is built + * correctly, or as by the older versions of MakeOTF. You may be able to do + * better. + * + * Assume that the offset to the size feature is according to specification, + * and make the following value checks. If it fails, assume the size + * feature is calculated as versions of MakeOTF before the AFDKO 2.0 built it. + * If this fails, reject the 'size' feature. The older makeOTF's calculated the + * offset from the beginning of the FeatureList table, rather than from the + * beginning of the 'size' Feature table. + * + * If "design size" == 0: + * fails check + * + * Else if ("subfamily identifier" == 0 and + * "range start" == 0 and + * "range end" == 0 and + * "range start" == 0 and + * "menu name ID" == 0) + * passes check: this is the format used when there is a design size + * specified, but there is no recommended size range. + * + * Else if ("design size" < "range start" or + * "design size" > "range end" or + * "range end" <= "range start" or + * "menu name ID" < 256 or + * "menu name ID" > 32767 or + * menu name ID is not a name ID which is actually in the name table) + * fails test + * Else + * passes test. + */ + + if (!designSize) + return_trace (false); + else if (subfamilyID == 0 && + subfamilyNameID == 0 && + rangeStart == 0 && + rangeEnd == 0) + return_trace (true); + else if (designSize < rangeStart || + designSize > rangeEnd || + subfamilyNameID < 256 || + subfamilyNameID > 32767) + return_trace (false); + else + return_trace (true); } -}; -struct Script; -struct RecordListOfScript : RecordListOf