aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Shi <dshi@google.com>2023-02-23 01:30:41 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-02-23 01:30:41 +0000
commitf18dc7d3727240583b267e2bca6b7b3240bfe690 (patch)
tree01e90a8dccbfd48b182bd476da2c263fb8e446ad
parent9cccf7cea67d449b85853958fb473a7fbbb83899 (diff)
parentd6e05cb224409c8e883722772d71ebba16f2bb03 (diff)
downloadharfbuzz_ng-f18dc7d3727240583b267e2bca6b7b3240bfe690.tar.gz
Merge "Revert "Revert "Revert "Update HarfBuzz to 6.0.0"""" am: 4c332bdc42 am: 7fb947f73c am: 6b987b381a am: d6e05cb224
Original change: https://android-review.googlesource.com/c/platform/external/harfbuzz_ng/+/2451365 Change-Id: I5aa4bc127e7bdb6689ea301dd8faaea4121a959f Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rwxr-xr-x.ci/build-win32.sh3
-rw-r--r--.ci/build-win64.sh3
-rw-r--r--.circleci/config.yml4
-rw-r--r--.github/workflows/arm-ci.yml25
-rw-r--r--.github/workflows/configs-build.yml2
-rw-r--r--.github/workflows/linux-ci.yml2
-rw-r--r--.github/workflows/macos-ci.yml12
-rw-r--r--.github/workflows/msvc-ci.yml3
-rw-r--r--.github/workflows/msys2-ci.yml6
-rw-r--r--LICENSE30
-rw-r--r--NEWS62
-rw-r--r--configure.ac2
-rw-r--r--docs/harfbuzz-docs.xml1
-rw-r--r--docs/harfbuzz-sections.txt422
-rw-r--r--docs/subset-preprocessing.md228
-rw-r--r--generate_notice.py6
-rw-r--r--meson.build84
-rw-r--r--perf/benchmark-shape.cc8
-rw-r--r--perf/benchmark-subset.cc82
-rwxr-xr-xperf/run.sh25
-rw-r--r--perf/texts/fa-words.txt10000
-rw-r--r--perf/texts/hi-words.txt10000
-rw-r--r--src/Makefile.am49
-rw-r--r--src/Makefile.sources4
-rw-r--r--src/OT/Layout/Common/Coverage.hh42
-rw-r--r--src/OT/Layout/Common/CoverageFormat1.hh9
-rw-r--r--src/OT/Layout/Common/CoverageFormat2.hh35
-rw-r--r--src/OT/Layout/GPOS/MarkBasePos.hh4
-rw-r--r--src/OT/Layout/GPOS/MarkLigPos.hh4
-rw-r--r--src/OT/Layout/GPOS/MarkMarkPos.hh4
-rw-r--r--src/OT/Layout/GPOS/PairPos.hh4
-rw-r--r--src/OT/Layout/GPOS/PairPosFormat1.hh26
-rw-r--r--src/OT/Layout/GPOS/PairPosFormat2.hh27
-rw-r--r--src/OT/Layout/GPOS/PairSet.hh20
-rw-r--r--src/OT/Layout/GSUB/AlternateSet.hh2
-rw-r--r--src/OT/Layout/GSUB/AlternateSubst.hh4
-rw-r--r--src/OT/Layout/GSUB/Ligature.hh2
-rw-r--r--src/OT/Layout/GSUB/LigatureSubst.hh4
-rw-r--r--src/OT/Layout/GSUB/MultipleSubst.hh4
-rw-r--r--src/OT/Layout/GSUB/Sequence.hh2
-rw-r--r--src/OT/Layout/GSUB/SingleSubst.hh8
-rw-r--r--src/OT/Layout/GSUB/SingleSubstFormat1.hh2
-rw-r--r--src/OT/Layout/GSUB/SingleSubstFormat2.hh20
-rw-r--r--src/OT/glyf/CompositeGlyph.hh67
-rw-r--r--src/OT/glyf/Glyph.hh139
-rw-r--r--src/OT/glyf/SimpleGlyph.hh49
-rw-r--r--src/OT/glyf/SubsetGlyph.hh10
-rw-r--r--src/OT/glyf/VarCompositeGlyph.hh353
-rw-r--r--src/OT/glyf/composite-iter.hh68
-rw-r--r--src/OT/glyf/coord-setter.hh34
-rw-r--r--src/OT/glyf/glyf.hh66
-rwxr-xr-xsrc/check-symbols.py2
-rwxr-xr-xsrc/gen-def.py4
-rwxr-xr-xsrc/gen-indic-table.py17
-rwxr-xr-xsrc/gen-ucd-table.py57
-rwxr-xr-xsrc/gen-use-table.py30
-rw-r--r--src/graph/classdef-graph.hh2
-rw-r--r--src/graph/coverage-graph.hh2
-rw-r--r--src/graph/graph.hh149
-rw-r--r--src/graph/gsubgpos-graph.hh6
-rw-r--r--src/graph/markbasepos-graph.hh10
-rw-r--r--src/graph/pairpos-graph.hh6
-rw-r--r--src/graph/serialize.hh23
-rw-r--r--src/harfbuzz-config.cmake.in44
-rw-r--r--src/hb-aat-layout-morx-table.hh8
-rw-r--r--src/hb-aat-layout.cc2
-rw-r--r--src/hb-aat-map.hh2
-rw-r--r--src/hb-algs.hh137
-rw-r--r--src/hb-array.hh94
-rw-r--r--src/hb-bit-page.hh90
-rw-r--r--src/hb-bit-set-invertible.hh6
-rw-r--r--src/hb-bit-set.hh72
-rw-r--r--src/hb-blob.cc2
-rw-r--r--src/hb-buffer-deserialize-json.hh12
-rw-r--r--src/hb-buffer-deserialize-json.rl4
-rw-r--r--src/hb-buffer-deserialize-text.hh490
-rw-r--r--src/hb-buffer-deserialize-text.rl6
-rw-r--r--src/hb-buffer-serialize.cc8
-rw-r--r--src/hb-buffer-verify.cc5
-rw-r--r--src/hb-buffer.cc99
-rw-r--r--src/hb-buffer.hh11
-rw-r--r--src/hb-cache.hh2
-rw-r--r--src/hb-cff-interp-common.hh95
-rw-r--r--src/hb-cff2-interp-cs.hh16
-rw-r--r--src/hb-common.cc14
-rw-r--r--src/hb-config.hh14
-rw-r--r--src/hb-coretext.cc13
-rw-r--r--src/hb-draw.cc91
-rw-r--r--src/hb-face.cc17
-rw-r--r--src/hb-face.hh2
-rw-r--r--src/hb-fallback-shape.cc10
-rw-r--r--src/hb-features.h.in96
-rw-r--r--src/hb-font.cc154
-rw-r--r--src/hb-font.hh6
-rw-r--r--src/hb-ft.cc32
-rw-r--r--src/hb-glib.cc77
-rw-r--r--src/hb-graphite2.cc2
-rw-r--r--src/hb-iter.hh16
-rw-r--r--src/hb-machinery.hh14
-rw-r--r--src/hb-map.hh219
-rw-r--r--src/hb-meta.hh3
-rw-r--r--src/hb-ms-feature-ranges.hh2
-rw-r--r--src/hb-multimap.hh92
-rw-r--r--src/hb-mutex.hh7
-rw-r--r--src/hb-number-parser.hh8
-rw-r--r--src/hb-object.hh4
-rw-r--r--src/hb-open-file.hh4
-rw-r--r--src/hb-open-type.hh67
-rw-r--r--src/hb-ot-cff-common.hh156
-rw-r--r--src/hb-ot-cff1-table.hh10
-rw-r--r--src/hb-ot-cff2-table.hh11
-rw-r--r--src/hb-ot-cmap-table.hh224
-rw-r--r--src/hb-ot-color-cbdt-table.hh8
-rw-r--r--src/hb-ot-color-colr-table.hh113
-rw-r--r--src/hb-ot-face-table-list.hh28
-rw-r--r--src/hb-ot-font.cc5
-rw-r--r--src/hb-ot-layout-common.hh350
-rw-r--r--src/hb-ot-layout-gdef-table.hh4
-rw-r--r--src/hb-ot-layout-gsubgpos.hh258
-rw-r--r--src/hb-ot-layout.cc112
-rw-r--r--src/hb-ot-layout.hh7
-rw-r--r--src/hb-ot-map.cc79
-rw-r--r--src/hb-ot-map.hh16
-rw-r--r--src/hb-ot-math-table.hh8
-rw-r--r--src/hb-ot-meta-table.hh2
-rw-r--r--src/hb-ot-name-table.hh211
-rw-r--r--src/hb-ot-name.cc51
-rw-r--r--src/hb-ot-os2-table.hh23
-rw-r--r--src/hb-ot-post-table-v2subset.hh4
-rw-r--r--src/hb-ot-post-table.hh2
-rw-r--r--src/hb-ot-shape-normalize.cc2
-rw-r--r--src/hb-ot-shape.cc4
-rw-r--r--src/hb-ot-shape.hh2
-rw-r--r--src/hb-ot-shaper-arabic.cc19
-rw-r--r--src/hb-ot-shaper-default.cc2
-rw-r--r--src/hb-ot-shaper-indic-machine.hh610
-rw-r--r--src/hb-ot-shaper-indic-machine.rl5
-rw-r--r--src/hb-ot-shaper-indic-table.cc21
-rw-r--r--src/hb-ot-shaper-indic.cc73
-rw-r--r--src/hb-ot-shaper-khmer-machine.hh16
-rw-r--r--src/hb-ot-shaper-khmer-machine.rl2
-rw-r--r--src/hb-ot-shaper-khmer.cc21
-rw-r--r--src/hb-ot-shaper-myanmar-machine.hh16
-rw-r--r--src/hb-ot-shaper-myanmar-machine.rl2
-rw-r--r--src/hb-ot-shaper-myanmar.cc48
-rw-r--r--src/hb-ot-shaper-syllabic.cc12
-rw-r--r--src/hb-ot-shaper-syllabic.hh4
-rw-r--r--src/hb-ot-shaper-thai.cc6
-rw-r--r--src/hb-ot-shaper-use-machine.hh16
-rw-r--r--src/hb-ot-shaper-use-machine.rl2
-rw-r--r--src/hb-ot-shaper-use-table.hh270
-rw-r--r--src/hb-ot-shaper-use.cc33
-rw-r--r--src/hb-ot-shaper.hh2
-rw-r--r--src/hb-ot-stat-table.hh2
-rw-r--r--src/hb-ot-tag.cc2
-rw-r--r--src/hb-ot-var-avar-table.hh6
-rw-r--r--src/hb-ot-var-common.hh21
-rw-r--r--src/hb-ot-var-fvar-table.hh12
-rw-r--r--src/hb-ot-var-gvar-table.hh229
-rw-r--r--src/hb-pool.hh12
-rw-r--r--src/hb-priority-queue.hh14
-rw-r--r--src/hb-repacker.hh27
-rw-r--r--src/hb-sanitize.hh15
-rw-r--r--src/hb-serialize.hh64
-rw-r--r--src/hb-set-digest.hh35
-rw-r--r--src/hb-set.hh6
-rw-r--r--src/hb-shape-plan.cc7
-rw-r--r--src/hb-shape.cc5
-rw-r--r--src/hb-shaper.cc2
-rw-r--r--src/hb-static.cc2
-rw-r--r--src/hb-subset-accelerator.hh61
-rw-r--r--src/hb-subset-cff-common.cc11
-rw-r--r--src/hb-subset-cff-common.hh491
-rw-r--r--src/hb-subset-cff1.cc38
-rw-r--r--src/hb-subset-cff2.cc23
-rw-r--r--src/hb-subset-input.cc141
-rw-r--r--src/hb-subset-input.hh55
-rw-r--r--src/hb-subset-plan.cc108
-rw-r--r--src/hb-subset-plan.hh39
-rw-r--r--src/hb-subset.cc95
-rw-r--r--src/hb-subset.h17
-rw-r--r--src/hb-ucd-table.hh2564
-rw-r--r--src/hb-ucd.cc16
-rw-r--r--src/hb-unicode.cc26
-rw-r--r--src/hb-uniscribe.cc6
-rw-r--r--src/hb-vector.hh100
-rw-r--r--src/hb-version.h8
-rw-r--r--src/hb.hh1
-rw-r--r--src/main.cc9
-rw-r--r--src/meson.build24
-rwxr-xr-xsrc/sample.py2
-rw-r--r--src/test-array.cc3
-rw-r--r--src/test-buffer-serialize.cc8
-rw-r--r--src/test-iter.cc25
-rw-r--r--src/test-map.cc74
-rw-r--r--src/test-multimap.cc59
-rw-r--r--src/test-repacker.cc3
-rw-r--r--src/test-set.cc9
-rw-r--r--src/test-vector.cc21
-rw-r--r--subprojects/freetype2.wrap10
-rw-r--r--subprojects/glib.wrap17
-rw-r--r--subprojects/google-benchmark.wrap15
-rw-r--r--subprojects/zlib.wrap12
-rw-r--r--test/api/fonts/nameID.override.expected.ttfbin168012 -> 0 bytes
-rw-r--r--test/api/test-subset-nameids.c41
-rw-r--r--test/api/test-unicode.c4
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-6635625931735040bin175945 -> 0 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5845846876356608bin427854 -> 0 bytes
-rw-r--r--test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6164014466203648bin191 -> 0 bytes
-rw-r--r--test/fuzzing/graphs/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-5390364397928448bin423 -> 0 bytes
-rw-r--r--test/fuzzing/graphs/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-6014493291577344bin921 -> 0 bytes
-rw-r--r--test/fuzzing/graphs/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-6714085985353728bin358596 -> 0 bytes
-rw-r--r--test/fuzzing/graphs/crash-3bf72494aa4c9f8cbbcbf887fdc2a2858c87feb4bin358596 -> 0 bytes
-rw-r--r--test/fuzzing/graphs/crash-442bfac994a3d9929cf06262ae9fb00f6ee1f774bin358596 -> 0 bytes
-rw-r--r--test/fuzzing/graphs/leak-a77f29b25edb873729f3ab120148fdb213cfa527bin358596 -> 0 bytes
-rw-r--r--test/fuzzing/graphs/noto_nastaliq_urdubin358596 -> 0 bytes
-rw-r--r--test/fuzzing/hb-repacker-fuzzer.cc145
-rw-r--r--test/fuzzing/meson.build22
-rw-r--r--test/fuzzing/run-repacker-fuzzer-tests.py68
-rw-r--r--test/shape/data/in-house/fonts/5f73fff1ffc07b5a99a90c0909609f2b09fef274.ttfbin1028 -> 0 bytes
-rw-r--r--test/shape/data/in-house/fonts/9d8c53cb64b8747abdd2b70755cce2ee0eb42ef7.ttfbin3000 -> 0 bytes
-rw-r--r--test/shape/data/in-house/fonts/a232bb734d4c6c898a44506547d19768f0eba6a6.ttfbin2512 -> 0 bytes
-rw-r--r--test/shape/data/in-house/tests/indic-special-cases.tests4
-rw-r--r--test/shape/data/in-house/tests/myanmar-misc.tests1
-rw-r--r--test/subset/data/Makefile.am5
-rw-r--r--test/subset/data/Makefile.sources5
-rw-r--r--test/subset/data/expected/full_instance/Roboto-Variable.no-prune-unicode-ranges.retain-all-codepoint.wght=150,wdth=80.ttfbin114200 -> 0 bytes
-rw-r--r--test/subset/data/expected/full_instance/Roboto-Variable.no-prune-unicode-ranges.retain-all-codepoint.wght=300,wdth=90.ttfbin114300 -> 0 bytes
-rw-r--r--test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otfbin2148 -> 2152 bytes
-rw-r--r--test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41,42.otfbin2024 -> 2028 bytes
-rw-r--r--test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otfbin4008 -> 4012 bytes
-rw-r--r--test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41,42,43.otfbin1436 -> 1440 bytes
-rw-r--r--test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41,42.otfbin1316 -> 1320 bytes
-rw-r--r--test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.retain-all-codepoint.otfbin4008 -> 4012 bytes
-rw-r--r--test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.retain-all-codepoint.ttfbin49244 -> 49248 bytes
-rw-r--r--test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.retain-all-codepoint.ttfbin29464 -> 29468 bytes
-rw-r--r--test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.retain-all-codepoint.ttfbin49244 -> 49248 bytes
-rw-r--r--test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41,42,43.otfbin2252 -> 2256 bytes
-rw-r--r--test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41,42.otfbin2220 -> 2224 bytes
-rw-r--r--test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.retain-all-codepoint.otfbin4004 -> 4008 bytes
-rw-r--r--test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41,42,43.otfbin1456 -> 1460 bytes
-rw-r--r--test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41,42.otfbin1412 -> 1416 bytes
-rw-r--r--test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.retain-all-codepoint.otfbin4004 -> 4008 bytes
-rw-r--r--test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.627,644,62D,628.ttfbin24532 -> 24564 bytes
-rw-r--r--test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.633,6D2.ttfbin14292 -> 14296 bytes
-rw-r--r--test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.63A,64A,631.ttfbin26124 -> 26152 bytes
-rw-r--r--test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.retain-all-codepoint.ttfbin542328 -> 542388 bytes
-rw-r--r--test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.627,644,62D,628.ttfbin30432 -> 30464 bytes
-rw-r--r--test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.633,6D2.ttfbin20132 -> 20140 bytes
-rw-r--r--test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.63A,64A,631.ttfbin31984 -> 32012 bytes
-rw-r--r--test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.retain-all-codepoint.ttfbin542360 -> 542424 bytes
-rw-r--r--test/subset/data/tests/full_instance.tests1
-rwxr-xr-xtest/subset/generate-expected-outputs.py1
-rw-r--r--test/subset/meson.build14
-rwxr-xr-xtest/subset/run-tests.py11
-rw-r--r--util/hb-subset.cc16
-rw-r--r--util/helper-cairo.hh28
-rw-r--r--util/meson.build3
-rw-r--r--util/shape-consumer.hh4
259 files changed, 4501 insertions, 27843 deletions
diff --git a/.ci/build-win32.sh b/.ci/build-win32.sh
index 067e2224c..a1ca53d27 100755
--- a/.ci/build-win32.sh
+++ b/.ci/build-win32.sh
@@ -6,9 +6,8 @@ meson --cross-file=.ci/win32-cross-file.txt \
-Dtests=disabled \
-Dcairo=enabled \
-Dcairo:fontconfig=disabled \
- -Dcairo:freetype=disabled \
-Dglib=enabled \
- -Dfreetype=disabled \
+ -Dfreetype=enabled \
-Dgdi=enabled \
-Ddirectwrite=enabled \
-Dcairo=enabled \
diff --git a/.ci/build-win64.sh b/.ci/build-win64.sh
index 946d245a6..385d55974 100644
--- a/.ci/build-win64.sh
+++ b/.ci/build-win64.sh
@@ -6,9 +6,8 @@ meson --cross-file=.ci/win64-cross-file.txt \
-Dtests=disabled \
-Dcairo=enabled \
-Dcairo:fontconfig=disabled \
- -Dcairo:freetype=disabled \
-Dglib=enabled \
- -Dfreetype=disabled \
+ -Dfreetype=enabled \
-Dgdi=enabled \
-Ddirectwrite=enabled \
-Dcairo=enabled \
diff --git a/.circleci/config.yml b/.circleci/config.yml
index b013b5576..9525c4aec 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -136,7 +136,7 @@ jobs:
steps:
- checkout
- run: sudo apt update && DEBIAN_FRONTEND=noninteractive sudo apt install -y ninja-build gtk-doc-tools python3 python3-pip git g++-mingw-w64-i686 zip
- - run: pip3 install meson==0.60.0
+ - run: pip3 install meson==0.56.0 --upgrade
- run: .ci/build-win32.sh
- store_artifacts:
path: harfbuzz-win32.zip
@@ -159,7 +159,7 @@ jobs:
steps:
- checkout
- run: sudo apt update && DEBIAN_FRONTEND=noninteractive sudo apt install -y ninja-build gtk-doc-tools python3 python3-pip git g++-mingw-w64-x86-64 zip
- - run: pip3 install meson==0.60.0
+ - run: pip3 install meson==0.56.0 --upgrade
- run: bash .ci/build-win64.sh
- store_artifacts:
path: harfbuzz-win64.zip
diff --git a/.github/workflows/arm-ci.yml b/.github/workflows/arm-ci.yml
deleted file mode 100644
index 3df13163f..000000000
--- a/.github/workflows/arm-ci.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-name: arm
-
-on:
- push:
- branches: [ main ]
- pull_request:
- branches: [ main ]
-
-permissions:
- contents: read
-
-jobs:
- arm-none-eabi:
- runs-on: ubuntu-22.04
- container:
- image: devkitpro/devkitarm:latest
- steps:
- - uses: actions/checkout@v3
- - name: Configure CMake
- run: |
- cmake -S . -B build \
- -DCMAKE_TOOLCHAIN_FILE=${DEVKITPRO}/cmake/3DS.cmake
- - name: Build
- run: make CXX_FLAGS="-w -DHB_NO_MT"
- working-directory: build
diff --git a/.github/workflows/configs-build.yml b/.github/workflows/configs-build.yml
index b81ce92b0..9f4fd78e6 100644
--- a/.github/workflows/configs-build.yml
+++ b/.github/workflows/configs-build.yml
@@ -11,7 +11,7 @@ permissions:
jobs:
build:
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v3
diff --git a/.github/workflows/linux-ci.yml b/.github/workflows/linux-ci.yml
index 3a95e9b64..f67f5d3fe 100644
--- a/.github/workflows/linux-ci.yml
+++ b/.github/workflows/linux-ci.yml
@@ -12,7 +12,7 @@ permissions:
jobs:
build:
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v3
diff --git a/.github/workflows/macos-ci.yml b/.github/workflows/macos-ci.yml
index 6a0b793f6..a6b6d3dbf 100644
--- a/.github/workflows/macos-ci.yml
+++ b/.github/workflows/macos-ci.yml
@@ -16,9 +16,15 @@ jobs:
steps:
- uses: actions/checkout@v3
- name: install dependencies
- run: HOMEBREW_NO_AUTO_UPDATE=1 brew install meson pkg-config freetype glib glib-utils cairo icu4c graphite2 gobject-introspection gtk-doc ninja
- - run: pip3 install fonttools
+ run: HOMEBREW_NO_AUTO_UPDATE=1 brew install pkg-config freetype glib glib-utils cairo icu4c graphite2 gobject-introspection gtk-doc ninja
+ - run: pip3 install fonttools meson==0.56.0 gcovr==5.0
- name: run
- run: PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig:/usr/local/opt/libffi/lib/pkgconfig" meson build -Dcoretext=enabled -Dgraphite=enabled -Dauto_features=enabled -Dchafa=disabled -Doptimization=2
+ run: PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig:/usr/local/opt/libffi/lib/pkgconfig" meson build -Db_coverage=true -Dcoretext=enabled -Dgraphite=enabled -Dauto_features=enabled -Dchafa=disabled -Doptimization=2
- name: ci
run: meson test --print-errorlogs -Cbuild
+
+ - name: cov
+ run: ninja -Cbuild coverage-xml
+ - uses: codecov/codecov-action@v3
+ with:
+ file: build/meson-logs/coverage.xml
diff --git a/.github/workflows/msvc-ci.yml b/.github/workflows/msvc-ci.yml
index 79be9f63b..57aef04cb 100644
--- a/.github/workflows/msvc-ci.yml
+++ b/.github/workflows/msvc-ci.yml
@@ -14,7 +14,6 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
- fail-fast: false
matrix:
os: [windows-2019, windows-latest]
include:
@@ -46,7 +45,7 @@ jobs:
$env:path = ($env:path.Split(';') | Where-Object { $_ -ne 'C:\Strawberry\perl\bin' }) -join ';'
meson setup build `
- --wrap-mode=forcefallback `
+ --wrap-mode=default `
--buildtype=release `
-Dglib=enabled `
-Dfreetype=enabled `
diff --git a/.github/workflows/msys2-ci.yml b/.github/workflows/msys2-ci.yml
index d5bddb435..0704f4caf 100644
--- a/.github/workflows/msys2-ci.yml
+++ b/.github/workflows/msys2-ci.yml
@@ -14,7 +14,6 @@ jobs:
runs-on: windows-latest
strategy:
- fail-fast: false
matrix:
include:
- MSYSTEM: MINGW32
@@ -23,11 +22,6 @@ jobs:
MSYS2_ARCH: x86_64
name: ${{ matrix.MSYSTEM }}
- env:
- # XXX: For some reason enabling jit debugging "fixes" random python crashes
- # see https://github.com/msys2/MINGW-packages/issues/11864
- MSYS: "winjitdebug"
-
defaults:
run:
shell: msys2 {0}
diff --git a/LICENSE b/LICENSE
index 7e75ed05e..2c60343b6 100644
--- a/LICENSE
+++ b/LICENSE
@@ -935,12 +935,6 @@ Copyright 2011 Google Inc. All Rights Reserved.
Licensed under the Apache License, Version 2.0
--------------------------------------------------------------------
-
-Copyright 2011 Google Inc. All Rights Reserved.
-
-Licensed under the Apache License, Version 2.0
-
http://www.apache.org/licenses/LICENSE-2.0
-------------------------------------------------------------------
@@ -4451,30 +4445,6 @@ PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
-------------------------------------------------------------------
-Copyright © 2022 Red Hat, 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.
-
--------------------------------------------------------------------
-
Copyright ©1993–2016 by The Font Bureau, Inc. with Reserved Font Name “Zycon”
https://opensource.org/licenses/OFL-1.1
diff --git a/NEWS b/NEWS
index 73dcef083..8d4389fc6 100644
--- a/NEWS
+++ b/NEWS
@@ -1,65 +1,3 @@
-Overview of changes leading to 6.0.0
-Friday, December 16, 2022
-====================================
-- A new API have been added to pre-process the face and speed up future
- subsetting operations on that face. Provides up to a 95% reduction in
- subsetting times when the same face is subset more than once.
-
- For more details and benchmarks, see:
- https://github.com/harfbuzz/harfbuzz/blob/main/docs/subset-preprocessing.md
-
- (Garret Rieger, Behdad Esfahbod)
-
-- Shaping have been speedup by skipping entire lookups when the buffer contents
- don't intersect with the lookup. Shows up to a 10% speedup in shaping some
- fonts. (Behdad Esfahbod)
-
-- A new experimental feature, “Variable Composites” (enabled by passing
- -Dexperimental_api=true to meson), is also featured in this release.
- This technology enables drastic compression of fonts in the Chinese,
- Japanese, Korean, and other writing systems, by reusing the OpenType Font
- Variations technology for encoding “smart components” into the font.
-
- The specification for these extensions to the font format can be found in:
- https://github.com/harfbuzz/boring-expansion-spec/blob/glyf1/glyf1.md
-
- A test variable-font with ~7160 Hangul syllables derived from the
- NotoSerifKR-VF font has been built, with existing OpenType technology, as
- well as with the new Variable Composites (VarComposites) technology. The
- VarComposites font is over 90% smaller than the OpenType version of the font!
- Both fonts can be obtained from the “smarties” repository:
- https://github.com/behdad/smarties/tree/3.0/fonts/hangul/serif
-
- When building HarfBuzz with experimental features enabled, you can test
- the “smarties” font with a sample character like this:
-
- $ hb-view butchered-hangul-serif-smarties-variable.ttf -u AE01 --variations=wght=700
-
- (Behdad Esfahbod)
-
-- The HarfBuzz subsetter can now drop axes by pinning them to specific values
- (also referred to as instancing). There are a couple of restrictions
- currently:
-
- - Only works with TrueType (“glyf”) based fonts. “CFF2” fonts are not yet
- supported.
- - Only supports the case where all axes in a font are pinned.
-
- (Garret Rieger, Qunxin Liu)
-
-- Miscellaneous fixes and improvements.
-
- (Behdad Esfahbod, Christoph Reiter, David Corbett, Eli Schwartz, Garret
- Rieger, Joel Auterson, Jordan Petridis, Khaled Hosny, Lorenz Wildberg,
- Marco Rebhan, Martin Storsjö, Matthias Clasen, Qunxin Liu, Satadru Pramanik)
-
-
-- New API
-+hb_subset_input_pin_axis_location()
-+hb_subset_input_pin_axis_to_default()
-+hb_subset_preprocess()
-
-
Overview of changes leading to 5.3.1
Wednesday, October 19, 2022
====================================
diff --git a/configure.ac b/configure.ac
index abe86ede5..f2480c349 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,6 +1,6 @@
AC_PREREQ([2.64])
AC_INIT([HarfBuzz],
- [6.0.0],
+ [5.3.1],
[https://github.com/harfbuzz/harfbuzz/issues/new],
[harfbuzz],
[http://harfbuzz.org/])
diff --git a/docs/harfbuzz-docs.xml b/docs/harfbuzz-docs.xml
index 2d2827a66..652a5e470 100644
--- a/docs/harfbuzz-docs.xml
+++ b/docs/harfbuzz-docs.xml
@@ -117,7 +117,6 @@
<index id="api-index-full"><title>API Index</title><xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include></index>
<index id="deprecated-api-index" role="deprecated"><title>Index of deprecated API</title><xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include></index>
- <index id="api-index-6-0-0" role="6.0.0"><title>Index of new symbols in 6.0.0</title><xi:include href="xml/api-index-6.0.0.xml"><xi:fallback /></xi:include></index>
<index id="api-index-5-3-0" role="5.3.0"><title>Index of new symbols in 5.3.0</title><xi:include href="xml/api-index-5.3.0.xml"><xi:fallback /></xi:include></index>
<index id="api-index-5-0-0" role="5.0.0"><title>Index of new symbols in 5.0.0</title><xi:include href="xml/api-index-5.0.0.xml"><xi:fallback /></xi:include></index>
<index id="api-index-4-4-0" role="4.4.0"><title>Index of new symbols in 4.4.0</title><xi:include href="xml/api-index-4.4.0.xml"><xi:fallback /></xi:include></index>
diff --git a/docs/harfbuzz-sections.txt b/docs/harfbuzz-sections.txt
index a35d3aa39..3a7aa358c 100644
--- a/docs/harfbuzz-sections.txt
+++ b/docs/harfbuzz-sections.txt
@@ -26,33 +26,33 @@ hb_blob_create_from_file
hb_blob_create_from_file_or_fail
hb_blob_create_sub_blob
hb_blob_copy_writable_or_fail
-hb_blob_get_empty
-hb_blob_reference
hb_blob_destroy
-hb_blob_set_user_data
-hb_blob_get_user_data
-hb_blob_make_immutable
-hb_blob_is_immutable
hb_blob_get_data
hb_blob_get_data_writable
+hb_blob_get_empty
hb_blob_get_length
+hb_blob_get_user_data
+hb_blob_is_immutable
+hb_blob_make_immutable
+hb_blob_reference
+hb_blob_set_user_data
hb_blob_t
hb_memory_mode_t
</SECTION>
<SECTION>
<FILE>hb-buffer</FILE>
+HB_SEGMENT_PROPERTIES_DEFAULT
+HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT
hb_buffer_create
-hb_buffer_allocation_successful
hb_buffer_create_similar
-hb_buffer_get_empty
hb_buffer_reference
+hb_buffer_get_empty
hb_buffer_destroy
-hb_buffer_set_user_data
-hb_buffer_get_user_data
hb_buffer_reset
hb_buffer_clear_contents
hb_buffer_pre_allocate
+hb_buffer_allocation_successful
hb_buffer_add
hb_buffer_add_codepoints
hb_buffer_add_utf32
@@ -79,14 +79,15 @@ hb_buffer_get_segment_properties
hb_buffer_guess_segment_properties
hb_buffer_set_unicode_funcs
hb_buffer_get_unicode_funcs
+hb_buffer_set_user_data
+hb_buffer_get_user_data
hb_buffer_get_glyph_infos
-hb_glyph_info_get_glyph_flags
hb_buffer_get_glyph_positions
hb_buffer_has_positions
-hb_buffer_set_invisible_glyph
hb_buffer_get_invisible_glyph
-hb_buffer_set_not_found_glyph
+hb_buffer_set_invisible_glyph
hb_buffer_get_not_found_glyph
+hb_buffer_set_not_found_glyph
hb_buffer_set_replacement_codepoint
hb_buffer_get_replacement_codepoint
hb_buffer_normalize_glyphs
@@ -105,11 +106,9 @@ hb_segment_properties_equal
hb_segment_properties_hash
hb_segment_properties_overlay
hb_buffer_diff
-hb_buffer_message_func_t
hb_buffer_set_message_func
-HB_SEGMENT_PROPERTIES_DEFAULT
-HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT
hb_buffer_t
+hb_glyph_info_get_glyph_flags
hb_glyph_info_t
hb_glyph_flags_t
hb_glyph_position_t
@@ -120,25 +119,18 @@ hb_segment_properties_t
hb_buffer_serialize_format_t
hb_buffer_serialize_flags_t
hb_buffer_diff_flags_t
+hb_buffer_message_func_t
</SECTION>
<SECTION>
<FILE>hb-common</FILE>
-HB_TAG
-HB_UNTAG
hb_tag_from_string
hb_tag_to_string
hb_direction_from_string
hb_direction_to_string
-HB_DIRECTION_REVERSE
-HB_DIRECTION_IS_BACKWARD
-HB_DIRECTION_IS_FORWARD
-HB_DIRECTION_IS_HORIZONTAL
-HB_DIRECTION_IS_VALID
-HB_DIRECTION_IS_VERTICAL
hb_script_from_iso15924_tag
-hb_script_to_iso15924_tag
hb_script_from_string
+hb_script_to_iso15924_tag
hb_script_get_horizontal_direction
hb_language_from_string
hb_language_to_string
@@ -160,16 +152,20 @@ hb_position_t
hb_tag_t
hb_script_t
hb_user_data_key_t
+HB_TAG
HB_TAG_NONE
HB_TAG_MAX
HB_TAG_MAX_SIGNED
+HB_UNTAG
+HB_DIRECTION_REVERSE
+HB_DIRECTION_IS_BACKWARD
+HB_DIRECTION_IS_FORWARD
+HB_DIRECTION_IS_HORIZONTAL
+HB_DIRECTION_IS_VALID
+HB_DIRECTION_IS_VERTICAL
HB_LANGUAGE_INVALID
HB_FEATURE_GLOBAL_END
HB_FEATURE_GLOBAL_START
-HB_HAS_CORETEXT
-HB_HAS_FREETYPE
-HB_HAS_GLIB
-HB_HAS_GRAPHITE
<SUBSECTION Private>
HB_BEGIN_DECLS
HB_END_DECLS
@@ -183,6 +179,7 @@ uint16_t
uint32_t
uint64_t
uint8_t
+<SUBSECTION Private>
HB_EXTERN
HB_DEPRECATED
HB_DEPRECATED_FOR
@@ -190,11 +187,12 @@ HB_DEPRECATED_FOR
<SECTION>
<FILE>hb-draw</FILE>
+hb_draw_funcs_t
hb_draw_funcs_create
-hb_draw_funcs_reference
hb_draw_funcs_destroy
-hb_draw_funcs_make_immutable
+hb_draw_funcs_reference
hb_draw_funcs_is_immutable
+hb_draw_funcs_make_immutable
hb_draw_move_to_func_t
hb_draw_funcs_set_move_to_func
hb_draw_line_to_func_t
@@ -205,14 +203,13 @@ hb_draw_cubic_to_func_t
hb_draw_funcs_set_cubic_to_func
hb_draw_close_path_func_t
hb_draw_funcs_set_close_path_func
+hb_draw_state_t
+HB_DRAW_STATE_DEFAULT
hb_draw_move_to
hb_draw_line_to
hb_draw_quadratic_to
hb_draw_cubic_to
hb_draw_close_path
-HB_DRAW_STATE_DEFAULT
-hb_draw_funcs_t
-hb_draw_state_t
</SECTION>
<SECTION>
@@ -267,22 +264,22 @@ hb_face_count
hb_face_t
hb_face_create
hb_face_create_for_tables
-hb_face_get_empty
-hb_face_reference
hb_face_destroy
-hb_face_set_user_data
-hb_face_get_user_data
-hb_face_make_immutable
-hb_face_is_immutable
+hb_face_get_empty
hb_face_get_table_tags
-hb_face_set_glyph_count
hb_face_get_glyph_count
-hb_face_set_index
hb_face_get_index
-hb_face_set_upem
hb_face_get_upem
+hb_face_get_user_data
+hb_face_is_immutable
+hb_face_make_immutable
+hb_face_reference
hb_face_reference_blob
hb_face_reference_table
+hb_face_set_glyph_count
+hb_face_set_index
+hb_face_set_upem
+hb_face_set_user_data
hb_face_collect_unicodes
hb_face_collect_variation_selectors
hb_face_collect_variation_unicodes
@@ -296,113 +293,113 @@ hb_face_builder_sort_tables
hb_font_add_glyph_origin_for_direction
hb_font_create
hb_font_create_sub_font
-hb_font_get_empty
-hb_font_reference
hb_font_destroy
-hb_font_set_user_data
-hb_font_get_user_data
-hb_font_make_immutable
-hb_font_is_immutable
-hb_font_set_face
+hb_font_funcs_create
+hb_font_funcs_destroy
+hb_font_funcs_get_empty
+hb_font_funcs_get_user_data
+hb_font_funcs_is_immutable
+hb_font_funcs_make_immutable
+hb_font_funcs_reference
+hb_font_funcs_set_glyph_contour_point_func
+hb_font_funcs_set_glyph_extents_func
+hb_font_funcs_set_glyph_from_name_func
+hb_font_funcs_set_glyph_h_advance_func
+hb_font_funcs_set_glyph_h_advances_func
+hb_font_funcs_set_glyph_h_kerning_func
+hb_font_funcs_set_glyph_h_origin_func
+hb_font_funcs_set_glyph_name_func
+hb_font_funcs_set_glyph_shape_func
+hb_font_funcs_set_glyph_v_advance_func
+hb_font_funcs_set_glyph_v_advances_func
+hb_font_funcs_set_glyph_v_origin_func
+hb_font_funcs_set_nominal_glyph_func
+hb_font_funcs_set_nominal_glyphs_func
+hb_font_funcs_set_user_data
+hb_font_funcs_set_variation_glyph_func
+hb_font_funcs_t
+hb_font_get_empty
hb_font_get_face
hb_font_get_glyph
hb_font_get_glyph_advance_for_direction
+hb_font_get_glyph_advance_func_t
hb_font_get_glyph_advances_for_direction
+hb_font_get_glyph_advances_func_t
hb_font_get_glyph_contour_point
hb_font_get_glyph_contour_point_for_origin
+hb_font_get_glyph_contour_point_func_t
hb_font_get_glyph_extents
hb_font_get_glyph_extents_for_origin
+hb_font_get_glyph_extents_func_t
hb_font_get_glyph_from_name
+hb_font_get_glyph_from_name_func_t
hb_font_get_glyph_h_advance
-hb_font_get_glyph_v_advance
+hb_font_get_glyph_h_advance_func_t
hb_font_get_glyph_h_advances
-hb_font_get_glyph_v_advances
+hb_font_get_glyph_h_advances_func_t
hb_font_get_glyph_h_kerning
-hb_font_get_glyph_kerning_for_direction
+hb_font_get_glyph_h_kerning_func_t
hb_font_get_glyph_h_origin
-hb_font_get_glyph_v_origin
-hb_font_get_glyph_origin_for_direction
+hb_font_get_glyph_h_origin_func_t
+hb_font_get_glyph_kerning_for_direction
+hb_font_get_glyph_kerning_func_t
hb_font_get_glyph_name
+hb_font_get_glyph_name_func_t
+hb_font_get_glyph_origin_for_direction
+hb_font_get_glyph_origin_func_t
hb_font_get_glyph_shape
+hb_font_get_glyph_shape_func_t
+hb_font_get_glyph_v_advance
+hb_font_get_glyph_v_advance_func_t
+hb_font_get_glyph_v_advances
+hb_font_get_glyph_v_advances_func_t
+hb_font_get_glyph_v_origin
+hb_font_get_glyph_v_origin_func_t
hb_font_get_nominal_glyph
+hb_font_get_nominal_glyph_func_t
hb_font_get_nominal_glyphs
-hb_font_get_variation_glyph
-hb_font_set_parent
+hb_font_get_nominal_glyphs_func_t
hb_font_get_parent
-hb_font_set_ppem
hb_font_get_ppem
-hb_font_set_ptem
hb_font_get_ptem
-hb_font_set_scale
hb_font_get_scale
-hb_font_set_synthetic_slant
hb_font_get_synthetic_slant
-hb_font_set_variations
-hb_font_set_var_named_instance
-hb_font_set_var_coords_design
+hb_font_get_user_data
+hb_font_get_variation_glyph
+hb_font_get_variation_glyph_func_t
hb_font_get_var_coords_design
-hb_font_set_var_coords_normalized
hb_font_get_var_coords_normalized
hb_font_glyph_from_string
hb_font_glyph_to_string
+hb_font_is_immutable
+hb_font_make_immutable
hb_font_get_serial
hb_font_changed
+hb_font_reference
+hb_font_set_face
hb_font_set_funcs
hb_font_set_funcs_data
+hb_font_set_parent
+hb_font_set_ppem
+hb_font_set_ptem
+hb_font_set_scale
+hb_font_set_synthetic_slant
+hb_font_set_user_data
+hb_font_set_variations
+hb_font_set_var_coords_design
+hb_font_set_var_coords_normalized
+hb_font_set_var_named_instance
hb_font_subtract_glyph_origin_for_direction
-hb_font_funcs_create
-hb_font_funcs_get_empty
-hb_font_funcs_reference
-hb_font_funcs_destroy
-hb_font_funcs_set_user_data
-hb_font_funcs_get_user_data
-hb_font_funcs_make_immutable
-hb_font_funcs_is_immutable
-hb_font_get_glyph_contour_point_func_t
-hb_font_funcs_set_glyph_contour_point_func
-hb_font_get_glyph_extents_func_t
-hb_font_funcs_set_glyph_extents_func
-hb_font_get_glyph_from_name_func_t
-hb_font_funcs_set_glyph_from_name_func
-hb_font_get_glyph_advance_func_t
-hb_font_get_glyph_h_advance_func_t
-hb_font_funcs_set_glyph_h_advance_func
-hb_font_get_glyph_v_advance_func_t
-hb_font_funcs_set_glyph_v_advance_func
-hb_font_get_glyph_advances_func_t
-hb_font_get_glyph_h_advances_func_t
-hb_font_funcs_set_glyph_h_advances_func
-hb_font_get_glyph_v_advances_func_t
-hb_font_funcs_set_glyph_v_advances_func
-hb_font_get_glyph_kerning_func_t
-hb_font_get_glyph_h_kerning_func_t
-hb_font_funcs_set_glyph_h_kerning_func
-hb_font_get_glyph_origin_func_t
-hb_font_get_glyph_h_origin_func_t
-hb_font_funcs_set_glyph_h_origin_func
-hb_font_get_glyph_v_origin_func_t
-hb_font_funcs_set_glyph_v_origin_func
-hb_font_get_glyph_name_func_t
-hb_font_funcs_set_glyph_name_func
-hb_font_get_glyph_shape_func_t
-hb_font_funcs_set_glyph_shape_func
-hb_font_get_nominal_glyph_func_t
-hb_font_funcs_set_nominal_glyph_func
-hb_font_get_nominal_glyphs_func_t
-hb_font_funcs_set_nominal_glyphs_func
-hb_font_get_variation_glyph_func_t
-hb_font_funcs_set_variation_glyph_func
-hb_font_funcs_t
hb_font_t
hb_reference_table_func_t
+hb_font_funcs_set_font_h_extents_func
+hb_font_funcs_set_font_v_extents_func
+hb_font_get_extents_for_direction
hb_font_get_font_extents_func_t
hb_font_get_font_h_extents_func_t
-hb_font_funcs_set_font_h_extents_func
hb_font_get_font_v_extents_func_t
-hb_font_funcs_set_font_v_extents_func
hb_font_get_h_extents
hb_font_get_v_extents
-hb_font_get_extents_for_direction
hb_font_extents_t
hb_glyph_extents_t
</SECTION>
@@ -453,29 +450,30 @@ hb_icu_script_to_script
<SECTION>
<FILE>hb-map</FILE>
-hb_map_create
+HB_MAP_VALUE_INVALID
hb_map_allocation_successful
-hb_map_copy
hb_map_clear
-hb_map_get_empty
-hb_map_reference
+hb_map_copy
+hb_map_create
+hb_map_del
hb_map_destroy
-hb_map_set_user_data
-hb_map_get_user_data
-hb_map_set
hb_map_get
-hb_map_del
-hb_map_has
+hb_map_get_empty
hb_map_get_population
-hb_map_is_empty
hb_map_is_equal
+hb_map_get_user_data
+hb_map_has
hb_map_hash
-HB_MAP_VALUE_INVALID
+hb_map_is_empty
+hb_map_reference
+hb_map_set
+hb_map_set_user_data
hb_map_t
</SECTION>
<SECTION>
<FILE>hb-ot-color</FILE>
+hb_color_t
HB_COLOR
hb_color_get_alpha
hb_color_get_blue
@@ -488,14 +486,13 @@ hb_ot_color_has_layers
hb_ot_color_has_palettes
hb_ot_color_has_png
hb_ot_color_has_svg
+hb_ot_color_layer_t
hb_ot_color_palette_color_get_name_id
+hb_ot_color_palette_flags_t
hb_ot_color_palette_get_colors
hb_ot_color_palette_get_count
hb_ot_color_palette_get_flags
hb_ot_color_palette_get_name_id
-hb_color_t
-hb_ot_color_layer_t
-hb_ot_color_palette_flags_t
</SECTION>
<SECTION>
@@ -505,21 +502,35 @@ hb_ot_font_set_funcs
<SECTION>
<FILE>hb-ot-name</FILE>
+hb_ot_name_id_t
+HB_OT_NAME_ID_INVALID
+hb_ot_name_entry_t
hb_ot_name_list_names
hb_ot_name_get_utf16
hb_ot_name_get_utf32
hb_ot_name_get_utf8
-HB_OT_NAME_ID_INVALID
-hb_ot_name_id_t
-hb_ot_name_entry_t
</SECTION>
<SECTION>
<FILE>hb-ot-layout</FILE>
+HB_OT_MAX_TAGS_PER_LANGUAGE
+HB_OT_MAX_TAGS_PER_SCRIPT
+HB_OT_TAG_DEFAULT_LANGUAGE
+HB_OT_TAG_DEFAULT_SCRIPT
hb_ot_tag_to_language
hb_ot_tag_to_script
hb_ot_tags_from_script_and_language
hb_ot_tags_to_script_and_language
+HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX
+HB_OT_LAYOUT_NO_FEATURE_INDEX
+HB_OT_LAYOUT_NO_SCRIPT_INDEX
+HB_OT_LAYOUT_NO_VARIATIONS_INDEX
+HB_OT_TAG_BASE
+HB_OT_TAG_GDEF
+HB_OT_TAG_GPOS
+HB_OT_TAG_GSUB
+HB_OT_TAG_JSTF
+hb_ot_layout_baseline_tag_t
hb_ot_layout_collect_lookups
hb_ot_layout_collect_features
hb_ot_layout_feature_get_characters
@@ -534,6 +545,7 @@ hb_ot_layout_get_glyph_class
hb_ot_layout_get_glyphs_in_class
hb_ot_layout_get_ligature_carets
hb_ot_layout_get_size_params
+hb_ot_layout_glyph_class_t
hb_ot_layout_has_glyph_classes
hb_ot_layout_has_positioning
hb_ot_layout_has_substitution
@@ -557,25 +569,18 @@ hb_ot_layout_table_get_lookup_count
hb_ot_layout_table_select_script
hb_ot_shape_plan_collect_lookups
hb_ot_layout_language_get_required_feature_index
-HB_OT_MAX_TAGS_PER_LANGUAGE
-HB_OT_MAX_TAGS_PER_SCRIPT
-HB_OT_TAG_DEFAULT_LANGUAGE
-HB_OT_TAG_DEFAULT_SCRIPT
-HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX
-HB_OT_LAYOUT_NO_FEATURE_INDEX
-HB_OT_LAYOUT_NO_SCRIPT_INDEX
-HB_OT_LAYOUT_NO_VARIATIONS_INDEX
-HB_OT_TAG_BASE
-HB_OT_TAG_GDEF
-HB_OT_TAG_GPOS
-HB_OT_TAG_GSUB
-HB_OT_TAG_JSTF
-hb_ot_layout_baseline_tag_t
-hb_ot_layout_glyph_class_t
</SECTION>
<SECTION>
<FILE>hb-ot-math</FILE>
+HB_OT_TAG_MATH
+HB_OT_TAG_MATH_SCRIPT
+hb_ot_math_constant_t
+hb_ot_math_kern_t
+hb_ot_math_kern_entry_t
+hb_ot_math_glyph_variant_t
+hb_ot_math_glyph_part_flags_t
+hb_ot_math_glyph_part_t
hb_ot_math_has_data
hb_ot_math_get_constant
hb_ot_math_get_glyph_italics_correction
@@ -586,31 +591,23 @@ hb_ot_math_is_glyph_extended_shape
hb_ot_math_get_glyph_variants
hb_ot_math_get_min_connector_overlap
hb_ot_math_get_glyph_assembly
-HB_OT_TAG_MATH
-HB_OT_TAG_MATH_SCRIPT
-hb_ot_math_constant_t
-hb_ot_math_kern_t
-hb_ot_math_kern_entry_t
-hb_ot_math_glyph_variant_t
-hb_ot_math_glyph_part_flags_t
-hb_ot_math_glyph_part_t
</SECTION>
<SECTION>
<FILE>hb-ot-meta</FILE>
+hb_ot_meta_tag_t
hb_ot_meta_get_entry_tags
hb_ot_meta_reference_entry
-hb_ot_meta_tag_t
</SECTION>
<SECTION>
<FILE>hb-ot-metrics</FILE>
+hb_ot_metrics_tag_t
hb_ot_metrics_get_position
hb_ot_metrics_get_position_with_fallback
hb_ot_metrics_get_variation
hb_ot_metrics_get_x_variation
hb_ot_metrics_get_y_variation
-hb_ot_metrics_tag_t
</SECTION>
<SECTION>
@@ -620,7 +617,14 @@ hb_ot_shape_glyphs_closure
<SECTION>
<FILE>hb-ot-var</FILE>
+HB_OT_TAG_VAR_AXIS_ITALIC
+HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE
+HB_OT_TAG_VAR_AXIS_SLANT
+HB_OT_TAG_VAR_AXIS_WEIGHT
+HB_OT_TAG_VAR_AXIS_WIDTH
hb_ot_var_has_data
+hb_ot_var_axis_flags_t
+hb_ot_var_axis_info_t
hb_ot_var_find_axis_info
hb_ot_var_get_axis_count
hb_ot_var_get_axis_infos
@@ -630,43 +634,31 @@ hb_ot_var_named_instance_get_postscript_name_id
hb_ot_var_named_instance_get_design_coords
hb_ot_var_normalize_variations
hb_ot_var_normalize_coords
-HB_OT_TAG_VAR_AXIS_ITALIC
-HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE
-HB_OT_TAG_VAR_AXIS_SLANT
-HB_OT_TAG_VAR_AXIS_WEIGHT
-HB_OT_TAG_VAR_AXIS_WIDTH
-hb_ot_var_axis_flags_t
-hb_ot_var_axis_info_t
</SECTION>
<SECTION>
<FILE>hb-set</FILE>
-hb_set_create
-hb_set_allocation_successful
-hb_set_copy
-hb_set_get_empty
-hb_set_reference
-hb_set_destroy
-hb_set_set_user_data
-hb_set_get_user_data
-hb_set_clear
-hb_set_set
-hb_set_has
+HB_SET_VALUE_INVALID
hb_set_add
hb_set_add_range
hb_set_add_sorted_array
+hb_set_allocation_successful
+hb_set_copy
+hb_set_clear
+hb_set_create
hb_set_del
hb_set_del_range
+hb_set_destroy
+hb_set_get_empty
hb_set_get_max
hb_set_get_min
hb_set_get_population
-hb_set_is_empty
+hb_set_get_user_data
+hb_set_has
hb_set_hash
-hb_set_subtract
hb_set_intersect
-hb_set_union
-hb_set_symmetric_difference
hb_set_invert
+hb_set_is_empty
hb_set_is_equal
hb_set_is_subset
hb_set_next
@@ -674,8 +666,13 @@ hb_set_next_range
hb_set_next_many
hb_set_previous
hb_set_previous_range
-HB_SET_VALUE_INVALID
+hb_set_reference
+hb_set_set
+hb_set_set_user_data
+hb_set_subtract
+hb_set_symmetric_difference
hb_set_t
+hb_set_union
</SECTION>
<SECTION>
@@ -691,50 +688,50 @@ hb_shape_plan_create
hb_shape_plan_create_cached
hb_shape_plan_create2
hb_shape_plan_create_cached2
-hb_shape_plan_get_empty
-hb_shape_plan_reference
hb_shape_plan_destroy
-hb_shape_plan_set_user_data
-hb_shape_plan_get_user_data
hb_shape_plan_execute
+hb_shape_plan_get_empty
hb_shape_plan_get_shaper
+hb_shape_plan_get_user_data
+hb_shape_plan_reference
+hb_shape_plan_set_user_data
hb_shape_plan_t
</SECTION>
<SECTION>
<FILE>hb-unicode</FILE>
-hb_unicode_general_category
+HB_UNICODE_MAX
hb_unicode_combining_class
-hb_unicode_mirroring
-hb_unicode_script
+hb_unicode_combining_class_func_t
+hb_unicode_combining_class_t
hb_unicode_compose
+hb_unicode_compose_func_t
hb_unicode_decompose
+hb_unicode_decompose_func_t
hb_unicode_funcs_create
-hb_unicode_funcs_get_empty
-hb_unicode_funcs_reference
hb_unicode_funcs_destroy
-hb_unicode_funcs_set_user_data
-hb_unicode_funcs_get_user_data
-hb_unicode_funcs_make_immutable
-hb_unicode_funcs_is_immutable
hb_unicode_funcs_get_default
+hb_unicode_funcs_get_empty
hb_unicode_funcs_get_parent
-hb_unicode_general_category_func_t
-hb_unicode_funcs_set_general_category_func
-hb_unicode_combining_class_func_t
+hb_unicode_funcs_get_user_data
+hb_unicode_funcs_is_immutable
+hb_unicode_funcs_make_immutable
+hb_unicode_funcs_reference
hb_unicode_funcs_set_combining_class_func
-hb_unicode_mirroring_func_t
-hb_unicode_funcs_set_mirroring_func
-hb_unicode_script_func_t
-hb_unicode_funcs_set_script_func
-hb_unicode_compose_func_t
hb_unicode_funcs_set_compose_func
-hb_unicode_decompose_func_t
hb_unicode_funcs_set_decompose_func
-HB_UNICODE_MAX
-hb_unicode_combining_class_t
-hb_unicode_general_category_t
+hb_unicode_funcs_set_general_category_func
+hb_unicode_funcs_set_mirroring_func
+hb_unicode_funcs_set_script_func
+hb_unicode_funcs_set_user_data
hb_unicode_funcs_t
+hb_unicode_general_category
+hb_unicode_general_category_func_t
+hb_unicode_general_category_t
+hb_unicode_mirroring
+hb_unicode_mirroring_func_t
+hb_unicode_script
+hb_unicode_script_func_t
</SECTION>
<SECTION>
@@ -746,13 +743,13 @@ hb_uniscribe_font_get_logfontw
<SECTION>
<FILE>hb-version</FILE>
HB_VERSION_ATLEAST
-hb_version
-hb_version_atleast
-hb_version_string
HB_VERSION_MAJOR
HB_VERSION_MICRO
HB_VERSION_MINOR
HB_VERSION_STRING
+hb_version
+hb_version_atleast
+hb_version_string
</SECTION>
<SECTION>
@@ -763,18 +760,20 @@ hb_style_get_value
<SECTION>
<FILE>hb-subset</FILE>
+hb_subset_flags_t
+hb_subset_input_t
+hb_subset_sets_t
+hb_subset_plan_t
hb_subset_input_create_or_fail
hb_subset_input_reference
hb_subset_input_destroy
hb_subset_input_set_user_data
hb_subset_input_get_user_data
-hb_subset_input_set_flags
hb_subset_input_get_flags
+hb_subset_input_set_flags
hb_subset_input_unicode_set
hb_subset_input_glyph_set
hb_subset_input_set
-hb_subset_input_pin_axis_location
-hb_subset_input_pin_axis_to_default
hb_subset_or_fail
hb_subset_plan_create_or_fail
hb_subset_plan_reference
@@ -785,14 +784,11 @@ hb_subset_plan_execute_or_fail
hb_subset_plan_unicode_to_old_glyph_mapping
hb_subset_plan_new_to_old_glyph_mapping
hb_subset_plan_old_to_new_glyph_mapping
-hb_subset_preprocess
-hb_subset_flags_t
-hb_subset_input_t
-hb_subset_sets_t
-hb_subset_plan_t
<SUBSECTION Private>
hb_link_t
hb_object_t
hb_subset_repack_or_fail
-hb_subset_input_override_name_table
+hb_subset_preprocess
+hb_subset_input_pin_axis_location
+hb_subset_input_pin_axis_to_default
</SECTION>
diff --git a/docs/subset-preprocessing.md b/docs/subset-preprocessing.md
deleted file mode 100644
index 637da2865..000000000
--- a/docs/subset-preprocessing.md
+++ /dev/null
@@ -1,228 +0,0 @@
-# Introduction
-
-Subset preprocessing is a mechanism which can significantly speed up font subsetting operations.
-It works by prepopulating datastructures from the source font which can be used in later subsetting
-operations to more quickly produce the subset. Preprocessing is useful in cases where multiple subsets
-will be cut from the same source font.
-
-# Usage
-
-```c++
-hb_face_t* preprocessed = hb_subset_preprocess (source_face);
-
-...
-
-hb_face_t* subset = hb_subset_or_fail (preprocessed, subset_input);
-```
-
-# Additional Details
-
-* A subset produced from a preprocessed face should be identical to a subset produced from only the
- original face. The preprocessor does not change the functionality of the subsetter, just speeds
- things up.
-
-* The preprocessing operation may take longer than the time it takes to produce a subset from the
- source font. Thus the main performance gains are made when a preprocessed face is reused for
- multiple subsetting operations.
-
-* Currently the largest performance gains are seen when using a preprocessed face for CFF subsetting.
-
-* The preprocessed face may contain references to the memory backing the source face. If this memory
- is fully owned by a harfbuzz hb_blob_t* then it will automatically be kept alive for the lifetime
- of the preprocessed face. However, if this memory is not fully owned by a harfbuzz hb_blob_t* then
- it is necessary to ensure that the memory is kept alive for the lifetime of the preprocessed face.
-
-
-# Performance Improvements
-
-Here is the performance difference of producing a subset with a preprocessed face vs producing
-a subset with the source face:
-
-Benchmark | Delta Time (%)
-----------|-----------------
-BM_subset/subset_glyphs/Roboto-Regular.ttf/10_median|-56%
-BM_subset/subset_glyphs/Roboto-Regular.ttf/64_median|-33%
-BM_subset/subset_glyphs/Roboto-Regular.ttf/512_median|-28%
-BM_subset/subset_glyphs/Roboto-Regular.ttf/1000_median|-11%
-BM_subset/subset_glyphs/Roboto-Regular.ttf/nohinting/10_median|-56%
-BM_subset/subset_glyphs/Roboto-Regular.ttf/nohinting/64_median|-33%
-BM_subset/subset_glyphs/Roboto-Regular.ttf/nohinting/512_median|-21%
-BM_subset/subset_glyphs/Roboto-Regular.ttf/nohinting/1000_median|-9%
-BM_subset/subset_glyphs/Amiri-Regular.ttf/10_median|-67%
-BM_subset/subset_glyphs/Amiri-Regular.ttf/64_median|-48%
-BM_subset/subset_glyphs/Amiri-Regular.ttf/512_median|-21%
-BM_subset/subset_glyphs/Amiri-Regular.ttf/4096_median|-9%
-BM_subset/subset_glyphs/Amiri-Regular.ttf/nohinting/10_median|-66%
-BM_subset/subset_glyphs/Amiri-Regular.ttf/nohinting/64_median|-50%
-BM_subset/subset_glyphs/Amiri-Regular.ttf/nohinting/512_median|-8%
-BM_subset/subset_glyphs/Amiri-Regular.ttf/nohinting/4096_median|-9%
-BM_subset/subset_glyphs/NotoNastaliqUrdu-Regular.ttf/10_median|-85%
-BM_subset/subset_glyphs/NotoNastaliqUrdu-Regular.ttf/64_median|-71%
-BM_subset/subset_glyphs/NotoNastaliqUrdu-Regular.ttf/512_median|-3%
-BM_subset/subset_glyphs/NotoNastaliqUrdu-Regular.ttf/1400_median|4%
-BM_subset/subset_glyphs/NotoNastaliqUrdu-Regular.ttf/nohinting/10_median|-84%
-BM_subset/subset_glyphs/NotoNastaliqUrdu-Regular.ttf/nohinting/64_median|-72%
-BM_subset/subset_glyphs/NotoNastaliqUrdu-Regular.ttf/nohinting/512_median|0%
-BM_subset/subset_glyphs/NotoNastaliqUrdu-Regular.ttf/nohinting/1400_median|0%
-BM_subset/subset_glyphs/NotoSansDevanagari-Regular.ttf/10_median|-30%
-BM_subset/subset_glyphs/NotoSansDevanagari-Regular.ttf/64_median|-24%
-BM_subset/subset_glyphs/NotoSansDevanagari-Regular.ttf/512_median|-3%
-BM_subset/subset_glyphs/NotoSansDevanagari-Regular.ttf/1000_median|-3%
-BM_subset/subset_glyphs/NotoSansDevanagari-Regular.ttf/nohinting/10_median|-30%
-BM_subset/subset_glyphs/NotoSansDevanagari-Regular.ttf/nohinting/64_median|-24%
-BM_subset/subset_glyphs/NotoSansDevanagari-Regular.ttf/nohinting/512_median|-3%
-BM_subset/subset_glyphs/NotoSansDevanagari-Regular.ttf/nohinting/1000_median|-5%
-BM_subset/subset_glyphs/Mplus1p-Regular.ttf/10_median|-96%
-BM_subset/subset_glyphs/Mplus1p-Regular.ttf/64_median|-90%
-BM_subset/subset_glyphs/Mplus1p-Regular.ttf/512_median|-74%
-BM_subset/subset_glyphs/Mplus1p-Regular.ttf/4096_median|-25%
-BM_subset/subset_glyphs/Mplus1p-Regular.ttf/10000_median|-23%
-BM_subset/subset_glyphs/Mplus1p-Regular.ttf/nohinting/10_median|-95%
-BM_subset/subset_glyphs/Mplus1p-Regular.ttf/nohinting/64_median|-90%
-BM_subset/subset_glyphs/Mplus1p-Regular.ttf/nohinting/512_median|-73%
-BM_subset/subset_glyphs/Mplus1p-Regular.ttf/nohinting/4096_median|-24%
-BM_subset/subset_glyphs/Mplus1p-Regular.ttf/nohinting/10000_median|-11%
-BM_subset/subset_glyphs/SourceHanSans-Regular_subset.otf/10_median|-84%
-BM_subset/subset_glyphs/SourceHanSans-Regular_subset.otf/64_median|-77%
-BM_subset/subset_glyphs/SourceHanSans-Regular_subset.otf/512_median|-70%
-BM_subset/subset_glyphs/SourceHanSans-Regular_subset.otf/4096_median|-80%
-BM_subset/subset_glyphs/SourceHanSans-Regular_subset.otf/10000_median|-86%
-BM_subset/subset_glyphs/SourceHanSans-Regular_subset.otf/nohinting/10_median|-84%
-BM_subset/subset_glyphs/SourceHanSans-Regular_subset.otf/nohinting/64_median|-78%
-BM_subset/subset_glyphs/SourceHanSans-Regular_subset.otf/nohinting/512_median|-71%
-BM_subset/subset_glyphs/SourceHanSans-Regular_subset.otf/nohinting/4096_median|-86%
-BM_subset/subset_glyphs/SourceHanSans-Regular_subset.otf/nohinting/10000_median|-88%
-BM_subset/subset_glyphs/SourceSansPro-Regular.otf/10_median|-59%
-BM_subset/subset_glyphs/SourceSansPro-Regular.otf/64_median|-55%
-BM_subset/subset_glyphs/SourceSansPro-Regular.otf/512_median|-67%
-BM_subset/subset_glyphs/SourceSansPro-Regular.otf/2000_median|-68%
-BM_subset/subset_glyphs/SourceSansPro-Regular.otf/nohinting/10_median|-60%
-BM_subset/subset_glyphs/SourceSansPro-Regular.otf/nohinting/64_median|-58%
-BM_subset/subset_glyphs/SourceSansPro-Regular.otf/nohinting/512_median|-72%
-BM_subset/subset_glyphs/SourceSansPro-Regular.otf/nohinting/2000_median|-71%
-BM_subset/subset_glyphs/AdobeVFPrototype.otf/10_median|-70%
-BM_subset/subset_glyphs/AdobeVFPrototype.otf/64_median|-64%
-BM_subset/subset_glyphs/AdobeVFPrototype.otf/300_median|-73%
-BM_subset/subset_glyphs/AdobeVFPrototype.otf/nohinting/10_median|-71%
-BM_subset/subset_glyphs/AdobeVFPrototype.otf/nohinting/64_median|-68%
-BM_subset/subset_glyphs/AdobeVFPrototype.otf/nohinting/300_median|-72%
-BM_subset/subset_glyphs/MPLUS1-Variable.ttf/10_median|-90%
-BM_subset/subset_glyphs/MPLUS1-Variable.ttf/64_median|-82%
-BM_subset/subset_glyphs/MPLUS1-Variable.ttf/512_median|-31%
-BM_subset/subset_glyphs/MPLUS1-Variable.ttf/4096_median|-9%
-BM_subset/subset_glyphs/MPLUS1-Variable.ttf/6000_median|-22%
-BM_subset/subset_glyphs/MPLUS1-Variable.ttf/nohinting/10_median|-88%
-BM_subset/subset_glyphs/MPLUS1-Variable.ttf/nohinting/64_median|-83%
-BM_subset/subset_glyphs/MPLUS1-Variable.ttf/nohinting/512_median|-31%
-BM_subset/subset_glyphs/MPLUS1-Variable.ttf/nohinting/4096_median|-16%
-BM_subset/subset_glyphs/MPLUS1-Variable.ttf/nohinting/6000_median|-18%
-BM_subset/subset_glyphs/RobotoFlex-Variable.ttf/10_median|-44%
-BM_subset/subset_glyphs/RobotoFlex-Variable.ttf/64_median|-18%
-BM_subset/subset_glyphs/RobotoFlex-Variable.ttf/512_median|-2%
-BM_subset/subset_glyphs/RobotoFlex-Variable.ttf/900_median|-6%
-BM_subset/subset_glyphs/RobotoFlex-Variable.ttf/nohinting/10_median|-45%
-BM_subset/subset_glyphs/RobotoFlex-Variable.ttf/nohinting/64_median|-17%
-BM_subset/subset_glyphs/RobotoFlex-Variable.ttf/nohinting/512_median|-15%
-BM_subset/subset_glyphs/RobotoFlex-Variable.ttf/nohinting/900_median|-3%
-BM_subset/subset_codepoints/Roboto-Regular.ttf/10_median|-20%
-BM_subset/subset_codepoints/Roboto-Regular.ttf/64_median|-16%
-BM_subset/subset_codepoints/Roboto-Regular.ttf/512_median|-12%
-BM_subset/subset_codepoints/Roboto-Regular.ttf/1000_median|-10%
-BM_subset/subset_codepoints/Roboto-Regular.ttf/nohinting/10_median|-24%
-BM_subset/subset_codepoints/Roboto-Regular.ttf/nohinting/64_median|-14%
-BM_subset/subset_codepoints/Roboto-Regular.ttf/nohinting/512_median|-15%
-BM_subset/subset_codepoints/Roboto-Regular.ttf/nohinting/1000_median|-9%
-BM_subset/subset_codepoints/Amiri-Regular.ttf/10_median|-51%
-BM_subset/subset_codepoints/Amiri-Regular.ttf/64_median|-37%
-BM_subset/subset_codepoints/Amiri-Regular.ttf/512_median|-12%
-BM_subset/subset_codepoints/Amiri-Regular.ttf/4096_median|-1%
-BM_subset/subset_codepoints/Amiri-Regular.ttf/nohinting/10_median|-49%
-BM_subset/subset_codepoints/Amiri-Regular.ttf/nohinting/64_median|-35%
-BM_subset/subset_codepoints/Amiri-Regular.ttf/nohinting/512_median|-6%
-BM_subset/subset_codepoints/Amiri-Regular.ttf/nohinting/4096_median|-1%
-BM_subset/subset_codepoints/NotoNastaliqUrdu-Regular.ttf/10_median|-82%
-BM_subset/subset_codepoints/NotoNastaliqUrdu-Regular.ttf/64_median|-9%
-BM_subset/subset_codepoints/NotoNastaliqUrdu-Regular.ttf/512_median|0%
-BM_subset/subset_codepoints/NotoNastaliqUrdu-Regular.ttf/1400_median|0%
-BM_subset/subset_codepoints/NotoNastaliqUrdu-Regular.ttf/nohinting/10_median|-82%
-BM_subset/subset_codepoints/NotoNastaliqUrdu-Regular.ttf/nohinting/64_median|-13%
-BM_subset/subset_codepoints/NotoNastaliqUrdu-Regular.ttf/nohinting/512_median|-3%
-BM_subset/subset_codepoints/NotoNastaliqUrdu-Regular.ttf/nohinting/1400_median|2%
-BM_subset/subset_codepoints/NotoSansDevanagari-Regular.ttf/10_median|-40%
-BM_subset/subset_codepoints/NotoSansDevanagari-Regular.ttf/64_median|-26%
-BM_subset/subset_codepoints/NotoSansDevanagari-Regular.ttf/512_median|-5%
-BM_subset/subset_codepoints/NotoSansDevanagari-Regular.ttf/1000_median|3%
-BM_subset/subset_codepoints/NotoSansDevanagari-Regular.ttf/nohinting/10_median|-43%
-BM_subset/subset_codepoints/NotoSansDevanagari-Regular.ttf/nohinting/64_median|-24%
-BM_subset/subset_codepoints/NotoSansDevanagari-Regular.ttf/nohinting/512_median|-2%
-BM_subset/subset_codepoints/NotoSansDevanagari-Regular.ttf/nohinting/1000_median|2%
-BM_subset/subset_codepoints/Mplus1p-Regular.ttf/10_median|-83%
-BM_subset/subset_codepoints/Mplus1p-Regular.ttf/64_median|-67%
-BM_subset/subset_codepoints/Mplus1p-Regular.ttf/512_median|-39%
-BM_subset/subset_codepoints/Mplus1p-Regular.ttf/4096_median|-20%
-BM_subset/subset_codepoints/Mplus1p-Regular.ttf/10000_median|-25%
-BM_subset/subset_codepoints/Mplus1p-Regular.ttf/nohinting/10_median|-83%
-BM_subset/subset_codepoints/Mplus1p-Regular.ttf/nohinting/64_median|-65%
-BM_subset/subset_codepoints/Mplus1p-Regular.ttf/nohinting/512_median|-42%
-BM_subset/subset_codepoints/Mplus1p-Regular.ttf/nohinting/4096_median|-34%
-BM_subset/subset_codepoints/Mplus1p-Regular.ttf/nohinting/10000_median|-21%
-BM_subset/subset_codepoints/SourceHanSans-Regular_subset.otf/10_median|-69%
-BM_subset/subset_codepoints/SourceHanSans-Regular_subset.otf/64_median|-69%
-BM_subset/subset_codepoints/SourceHanSans-Regular_subset.otf/512_median|-70%
-BM_subset/subset_codepoints/SourceHanSans-Regular_subset.otf/4096_median|-84%
-BM_subset/subset_codepoints/SourceHanSans-Regular_subset.otf/10000_median|-83%
-BM_subset/subset_codepoints/SourceHanSans-Regular_subset.otf/nohinting/10_median|-71%
-BM_subset/subset_codepoints/SourceHanSans-Regular_subset.otf/nohinting/64_median|-68%
-BM_subset/subset_codepoints/SourceHanSans-Regular_subset.otf/nohinting/512_median|-70%
-BM_subset/subset_codepoints/SourceHanSans-Regular_subset.otf/nohinting/4096_median|-86%
-BM_subset/subset_codepoints/SourceHanSans-Regular_subset.otf/nohinting/10000_median|-88%
-BM_subset/subset_codepoints/SourceSansPro-Regular.otf/10_median|-45%
-BM_subset/subset_codepoints/SourceSansPro-Regular.otf/64_median|-48%
-BM_subset/subset_codepoints/SourceSansPro-Regular.otf/512_median|-57%
-BM_subset/subset_codepoints/SourceSansPro-Regular.otf/2000_median|-66%
-BM_subset/subset_codepoints/SourceSansPro-Regular.otf/nohinting/10_median|-43%
-BM_subset/subset_codepoints/SourceSansPro-Regular.otf/nohinting/64_median|-50%
-BM_subset/subset_codepoints/SourceSansPro-Regular.otf/nohinting/512_median|-63%
-BM_subset/subset_codepoints/SourceSansPro-Regular.otf/nohinting/2000_median|-72%
-BM_subset/subset_codepoints/AdobeVFPrototype.otf/10_median|-69%
-BM_subset/subset_codepoints/AdobeVFPrototype.otf/64_median|-66%
-BM_subset/subset_codepoints/AdobeVFPrototype.otf/300_median|-74%
-BM_subset/subset_codepoints/AdobeVFPrototype.otf/nohinting/10_median|-70%
-BM_subset/subset_codepoints/AdobeVFPrototype.otf/nohinting/64_median|-71%
-BM_subset/subset_codepoints/AdobeVFPrototype.otf/nohinting/300_median|-75%
-BM_subset/subset_codepoints/MPLUS1-Variable.ttf/10_median|-66%
-BM_subset/subset_codepoints/MPLUS1-Variable.ttf/64_median|-46%
-BM_subset/subset_codepoints/MPLUS1-Variable.ttf/512_median|-15%
-BM_subset/subset_codepoints/MPLUS1-Variable.ttf/4096_median|-5%
-BM_subset/subset_codepoints/MPLUS1-Variable.ttf/6000_median|-16%
-BM_subset/subset_codepoints/MPLUS1-Variable.ttf/nohinting/10_median|-66%
-BM_subset/subset_codepoints/MPLUS1-Variable.ttf/nohinting/64_median|-45%
-BM_subset/subset_codepoints/MPLUS1-Variable.ttf/nohinting/512_median|-14%
-BM_subset/subset_codepoints/MPLUS1-Variable.ttf/nohinting/4096_median|-11%
-BM_subset/subset_codepoints/MPLUS1-Variable.ttf/nohinting/6000_median|-27%
-BM_subset/subset_codepoints/RobotoFlex-Variable.ttf/10_median|-38%
-BM_subset/subset_codepoints/RobotoFlex-Variable.ttf/64_median|-9%
-BM_subset/subset_codepoints/RobotoFlex-Variable.ttf/512_median|-3%
-BM_subset/subset_codepoints/RobotoFlex-Variable.ttf/900_median|-16%
-BM_subset/subset_codepoints/RobotoFlex-Variable.ttf/nohinting/10_median|-39%
-BM_subset/subset_codepoints/RobotoFlex-Variable.ttf/nohinting/64_median|-12%
-BM_subset/subset_codepoints/RobotoFlex-Variable.ttf/nohinting/512_median|-4%
-BM_subset/subset_codepoints/RobotoFlex-Variable.ttf/nohinting/900_median|-2%
-BM_subset/instance/MPLUS1-Variable.ttf/10_median|-68%
-BM_subset/instance/MPLUS1-Variable.ttf/64_median|-45%
-BM_subset/instance/MPLUS1-Variable.ttf/512_median|-18%
-BM_subset/instance/MPLUS1-Variable.ttf/4096_median|-2%
-BM_subset/instance/MPLUS1-Variable.ttf/6000_median|4%
-BM_subset/instance/MPLUS1-Variable.ttf/nohinting/10_median|-69%
-BM_subset/instance/MPLUS1-Variable.ttf/nohinting/64_median|-46%
-BM_subset/instance/MPLUS1-Variable.ttf/nohinting/512_median|-11%
-BM_subset/instance/MPLUS1-Variable.ttf/nohinting/4096_median|4%
-BM_subset/instance/MPLUS1-Variable.ttf/nohinting/6000_median|-5%
-BM_subset/instance/RobotoFlex-Variable.ttf/10_median|-34%
-BM_subset/instance/RobotoFlex-Variable.ttf/64_median|-12%
-BM_subset/instance/RobotoFlex-Variable.ttf/512_median|6%
-BM_subset/instance/RobotoFlex-Variable.ttf/900_median|-6%
-BM_subset/instance/RobotoFlex-Variable.ttf/nohinting/10_median|-33%
-BM_subset/instance/RobotoFlex-Variable.ttf/nohinting/64_median|-11%
-BM_subset/instance/RobotoFlex-Variable.ttf/nohinting/512_median|3%
-BM_subset/instance/RobotoFlex-Variable.ttf/nohinting/900_median|0%
diff --git a/generate_notice.py b/generate_notice.py
index fab61cbb1..354dc3d8a 100644
--- a/generate_notice.py
+++ b/generate_notice.py
@@ -58,7 +58,6 @@ NO_COPYRIGHT_FILES = [
".codecov.yml",
".editorconfig",
".github/dependabot.yml",
- ".github/workflows/arm-ci.yml",
".github/workflows/cifuzz.yml",
".github/workflows/configs-build.yml",
".github/workflows/coverity-scan.yml",
@@ -95,7 +94,6 @@ NO_COPYRIGHT_FILES = [
"docs/meson.build",
"docs/repacker.md",
"docs/serializer.md",
- "docs/subset-preprocessing.md",
"docs/usermanual-buffers-language-script-and-direction.xml",
"docs/usermanual-clusters.xml",
"docs/usermanual-fonts-and-faces.xml",
@@ -177,9 +175,6 @@ NO_COPYRIGHT_FILES = [
"src/OT/glyf/GlyphHeader.hh",
"src/OT/glyf/SimpleGlyph.hh",
"src/OT/glyf/SubsetGlyph.hh",
- "src/OT/glyf/VarCompositeGlyph.hh",
- "src/OT/glyf/composite-iter.hh",
- "src/OT/glyf/coord-setter.hh",
"src/OT/glyf/glyf-helpers.hh",
"src/OT/glyf/glyf.hh",
"src/OT/glyf/loca.hh",
@@ -236,7 +231,6 @@ NO_COPYRIGHT_FILES = [
"subprojects/google-benchmark.wrap",
"subprojects/packagefiles/ragel/meson.build",
"subprojects/ragel.wrap",
- "subprojects/zlib.wrap",
"util/Makefile.am",
"util/Makefile.sources",
"util/meson.build",
diff --git a/meson.build b/meson.build
index cc802f2f5..b80679d3a 100644
--- a/meson.build
+++ b/meson.build
@@ -1,6 +1,6 @@
project('harfbuzz', 'c', 'cpp',
meson_version: '>= 0.55.0',
- version: '6.0.0',
+ version: '5.3.1',
default_options: [
'cpp_rtti=false', # Just to support msvc, we are passing -fno-exceptions also anyway
'cpp_std=c++11',
@@ -83,35 +83,20 @@ check_funcs = [
m_dep = cpp.find_library('m', required: false)
-if meson.version().version_compare('>=0.60.0')
- # pkg-config: freetype2, cmake: Freetype
- freetype_dep = dependency('freetype2', 'Freetype',
+
+# Try pkgconfig name
+freetype_dep = dependency('freetype2', required: false)
+if not freetype_dep.found()
+ # Try cmake name
+ freetype_dep = dependency('freetype', required: false)
+endif
+if not freetype_dep.found()
+ # Subproject fallback, `allow_fallback: true` means the fallback will be
+ # tried even if the freetype option is set to `auto`.
+ freetype_dep = dependency('freetype2',
required: get_option('freetype'),
default_options: ['harfbuzz=disabled'],
allow_fallback: true)
-else
- # painful hack to handle multiple dependencies but also respect options
- freetype_opt = get_option('freetype')
- # we want to handle enabled manually after fallbacks, but also handle disabled normally
- if freetype_opt.enabled()
- freetype_opt = false
- endif
- # try pkg-config name
- freetype_dep = dependency('freetype2', method: 'pkg-config', required: freetype_opt)
- # when disabled, leave it not-found
- if not freetype_dep.found() and not get_option('freetype').disabled()
- # Try cmake name
- freetype_dep = dependency('Freetype', method: 'cmake', required: false)
- # Subproject fallback, `allow_fallback: true` means the fallback will be
- # tried even if the freetype option is set to `auto`.
- if not freetype_dep.found()
- freetype_dep = dependency('freetype2',
- method: 'pkg-config',
- required: get_option('freetype'),
- default_options: ['harfbuzz=disabled'],
- allow_fallback: true)
- endif
- endif
endif
glib_dep = dependency('glib-2.0', required: get_option('glib'))
@@ -119,36 +104,18 @@ gobject_dep = dependency('gobject-2.0', required: get_option('gobject'))
graphite2_dep = dependency('graphite2', required: get_option('graphite2'))
graphite_dep = dependency('graphite2', required: get_option('graphite'))
-if meson.version().version_compare('>=0.60.0')
- # pkg-config: icu-uc, cmake: ICU but with components
- icu_dep = dependency('icu-uc', 'ICU',
- components: 'uc',
- required: get_option('icu'),
- default_options: ['harfbuzz=disabled'],
- allow_fallback: true)
-else
- # painful hack to handle multiple dependencies but also respect options
- icu_opt = get_option('icu')
- # we want to handle enabled manually after fallbacks, but also handle disabled normally
- if icu_opt.enabled()
- icu_opt = false
- endif
- # try pkg-config name
- icu_dep = dependency('icu-uc', method: 'pkg-config', required: icu_opt)
- # when disabled, leave it not-found
- if not icu_dep.found() and not get_option('icu').disabled()
- # Try cmake name
- icu_dep = dependency('ICU', method: 'cmake', components: 'uc', required: false)
- # Try again with subproject fallback. `allow_fallback: true` means the
- # fallback will be tried even if the icu option is set to `auto`, but
- # we cannot pass this option until Meson 0.59.0, because no wrap file
- # is checked into git.
- if not icu_dep.found()
- icu_dep = dependency('icu-uc',
- method: 'pkg-config',
- required: get_option('icu'))
- endif
- endif
+# Try pkgconfig name
+icu_dep = dependency('icu-uc', required: false)
+if not icu_dep.found()
+ # Try cmake name
+ icu_dep = dependency('ICU',
+ required: false,
+ components: 'uc',
+ method: 'cmake')
+endif
+if not icu_dep.found()
+ # Subproject fallback if icu option is enabled
+ icu_dep = dependency('icu-uc', required: get_option('icu'))
endif
if icu_dep.found() and icu_dep.type_name() == 'pkgconfig'
@@ -181,8 +148,7 @@ if not get_option('cairo').disabled()
# harfbuzz support disabled, so when cairo will lookup freetype2 dependency
# it will be forced to use that one.
cairo_dep = dependency('cairo', required: get_option('cairo'))
- cairo_ft_required = get_option('cairo').enabled() and get_option('freetype').enabled()
- cairo_ft_dep = dependency('cairo-ft', required: cairo_ft_required)
+ cairo_ft_dep = dependency('cairo-ft', required: get_option('cairo'))
endif
endif
diff --git a/perf/benchmark-shape.cc b/perf/benchmark-shape.cc
index f44b3e58f..626a59777 100644
--- a/perf/benchmark-shape.cc
+++ b/perf/benchmark-shape.cc
@@ -27,18 +27,10 @@ struct test_input_t
"perf/texts/fa-thelittleprince.txt",
false},
- {"perf/fonts/NotoNastaliqUrdu-Regular.ttf",
- "perf/texts/fa-words.txt",
- false},
-
{"perf/fonts/Amiri-Regular.ttf",
"perf/texts/fa-thelittleprince.txt",
false},
- {SUBSET_FONT_BASE_PATH "NotoSansDevanagari-Regular.ttf",
- "perf/texts/hi-words.txt",
- false},
-
{"perf/fonts/Roboto-Regular.ttf",
"perf/texts/en-thelittleprince.txt",
false},
diff --git a/perf/benchmark-subset.cc b/perf/benchmark-subset.cc
index 9b51b794c..0451c11d8 100644
--- a/perf/benchmark-subset.cc
+++ b/perf/benchmark-subset.cc
@@ -54,19 +54,18 @@ static inline unsigned int ARRAY_LEN (const Type (&)[n]) { return n; }
struct test_input_t
{
const char *font_path;
- unsigned max_subset_size;
+ const unsigned max_subset_size;
const axis_location_t *instance_opts;
- unsigned num_instance_opts;
-} default_tests[] =
+ const unsigned num_instance_opts;
+} tests[] =
{
- {SUBSET_FONT_BASE_PATH "Roboto-Regular.ttf", 1000, nullptr, 0},
- {SUBSET_FONT_BASE_PATH "Amiri-Regular.ttf", 4096, nullptr, 0},
- {SUBSET_FONT_BASE_PATH "NotoNastaliqUrdu-Regular.ttf", 1400, nullptr, 0},
+ {SUBSET_FONT_BASE_PATH "Roboto-Regular.ttf", 4000, nullptr, 0},
+ {SUBSET_FONT_BASE_PATH "Amiri-Regular.ttf", 4000, nullptr, 0},
+ {SUBSET_FONT_BASE_PATH "NotoNastaliqUrdu-Regular.ttf", 1000, nullptr, 0},
{SUBSET_FONT_BASE_PATH "NotoSansDevanagari-Regular.ttf", 1000, nullptr, 0},
{SUBSET_FONT_BASE_PATH "Mplus1p-Regular.ttf", 10000, nullptr, 0},
{SUBSET_FONT_BASE_PATH "SourceHanSans-Regular_subset.otf", 10000, nullptr, 0},
{SUBSET_FONT_BASE_PATH "SourceSansPro-Regular.otf", 2000, nullptr, 0},
- {SUBSET_FONT_BASE_PATH "AdobeVFPrototype.otf", 300, nullptr, 0},
{SUBSET_FONT_BASE_PATH "MPLUS1-Variable.ttf", 6000, _mplus_instance_opts, ARRAY_LEN (_mplus_instance_opts)},
{SUBSET_FONT_BASE_PATH "RobotoFlex-Variable.ttf", 900, _roboto_flex_instance_opts, ARRAY_LEN (_roboto_flex_instance_opts)},
#if 0
@@ -74,10 +73,6 @@ struct test_input_t
#endif
};
-static test_input_t *tests = default_tests;
-static unsigned num_tests = sizeof (default_tests) / sizeof (default_tests[0]);
-
-
void AddCodepoints(const hb_set_t* codepoints_in_font,
unsigned subset_size,
hb_subset_input_t* input)
@@ -106,25 +101,23 @@ void AddGlyphs(unsigned num_glyphs_in_font,
// the subsetting operations.
static hb_face_t* preprocess_face(hb_face_t* face)
{
+ #ifdef HB_EXPERIMENTAL_API
hb_face_t* new_face = hb_subset_preprocess(face);
hb_face_destroy(face);
return new_face;
+ #else
+ return face;
+ #endif
}
/* benchmark for subsetting a font */
static void BM_subset (benchmark::State &state,
operation_t operation,
- const test_input_t &test_input,
- bool hinting)
+ const test_input_t &test_input)
{
unsigned subset_size = state.range(0);
- hb_face_t *face = nullptr;
-
- static hb_face_t *cached_face;
- static const char *cached_font_path;
-
- if (!cached_font_path || strcmp (cached_font_path, test_input.font_path))
+ hb_face_t *face;
{
hb_blob_t *blob = hb_blob_create_from_file_or_fail (test_input.font_path);
assert (blob);
@@ -132,22 +125,11 @@ static void BM_subset (benchmark::State &state,
hb_blob_destroy (blob);
face = preprocess_face (face);
-
- if (cached_face)
- hb_face_destroy (cached_face);
-
- cached_face = hb_face_reference (face);
- cached_font_path = test_input.font_path;
}
- else
- face = hb_face_reference (cached_face);
hb_subset_input_t* input = hb_subset_input_create_or_fail ();
assert (input);
- if (!hinting)
- hb_subset_input_set_flags (input, HB_SUBSET_FLAGS_NO_HINTING);
-
switch (operation)
{
case subset_codepoints:
@@ -167,6 +149,7 @@ static void BM_subset (benchmark::State &state,
break;
case instance:
+#ifdef HB_EXPERIMENTAL_API
{
hb_set_t* all_codepoints = hb_set_create ();
hb_face_collect_unicodes (face, all_codepoints);
@@ -178,6 +161,7 @@ static void BM_subset (benchmark::State &state,
test_input.instance_opts[i].axis_tag,
test_input.instance_opts[i].axis_value);
}
+#endif
break;
}
@@ -194,7 +178,6 @@ static void BM_subset (benchmark::State &state,
static void test_subset (operation_t op,
const char *op_name,
- bool hinting,
benchmark::TimeUnit time_unit,
const test_input_t &test_input)
{
@@ -203,57 +186,36 @@ static void test_subset (operation_t op,
char name[1024] = "BM_subset/";
strcat (name, op_name);
- strcat (name, "/");
- const char *p = strrchr (test_input.font_path, '/');
- strcat (name, p ? p + 1 : test_input.font_path);
- if (!hinting)
- strcat (name, "/nohinting");
+ strcat (name, strrchr (test_input.font_path, '/'));
- benchmark::RegisterBenchmark (name, BM_subset, op, test_input, hinting)
+ benchmark::RegisterBenchmark (name, BM_subset, op, test_input)
->Range(10, test_input.max_subset_size)
->Unit(time_unit);
}
static void test_operation (operation_t op,
const char *op_name,
- const test_input_t *tests,
- unsigned num_tests,
benchmark::TimeUnit time_unit)
{
- for (unsigned i = 0; i < num_tests; i++)
+ for (auto& test_input : tests)
{
- auto& test_input = tests[i];
- test_subset (op, op_name, true, time_unit, test_input);
- test_subset (op, op_name, false, time_unit, test_input);
+ test_subset (op, op_name, time_unit, test_input);
}
}
int main(int argc, char** argv)
{
- benchmark::Initialize(&argc, argv);
-
- if (argc > 1)
- {
- num_tests = (argc - 1) / 2;
- tests = (test_input_t *) calloc (num_tests, sizeof (test_input_t));
- for (unsigned i = 0; i < num_tests; i++)
- {
- tests[i].font_path = argv[1 + i * 2];
- tests[i].max_subset_size = atoi (argv[2 + i * 2]);
- }
- }
-
-#define TEST_OPERATION(op, time_unit) test_operation (op, #op, tests, num_tests, time_unit)
+#define TEST_OPERATION(op, time_unit) test_operation (op, #op, time_unit)
TEST_OPERATION (subset_glyphs, benchmark::kMillisecond);
TEST_OPERATION (subset_codepoints, benchmark::kMillisecond);
+#ifdef HB_EXPERIMENTAL_API
TEST_OPERATION (instance, benchmark::kMillisecond);
+#endif
#undef TEST_OPERATION
+ benchmark::Initialize(&argc, argv);
benchmark::RunSpecifiedBenchmarks();
benchmark::Shutdown();
-
- if (tests != default_tests)
- free (tests);
}
diff --git a/perf/run.sh b/perf/run.sh
new file mode 100755
index 000000000..c7dc6e0c2
--- /dev/null
+++ b/perf/run.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+CXX=clang++
+FONT=fonts/NotoNastaliqUrdu-Regular.ttf
+TEXT=texts/fa-monologue.txt
+
+$CXX ../util/hb-shape.cc ../util/options.cc ../src/harfbuzz.cc \
+ -lm -fno-rtti -fno-exceptions -fno-omit-frame-pointer -DHB_NO_MT \
+ -I../src $FLAGS $SOURCES \
+ -DPACKAGE_NAME='""' -DPACKAGE_VERSION='""' \
+ -DHAVE_GLIB $(pkg-config --cflags --libs glib-2.0) \
+ -o hb-shape -g -O2 # -O3 \
+ #-march=native -mtune=native \
+ #-Rpass=loop-vectorize -Rpass-missed=loop-vectorize \
+ #-Rpass-analysis=loop-vectorize -fsave-optimization-record
+
+# -march=native: enable all vector instructions current CPU can offer
+# -Rpass*: https://llvm.org/docs/Vectorizers.html#diagnostics
+
+#sudo rm capture.syscap > /dev/null
+#sysprof-cli -c "./a.out $@"
+#sysprof capture.syscap
+
+perf stat ./hb-shape -o /dev/null $FONT --text-file $TEXT --num-iterations=100 --font-funcs=ot
+#perf record -g ./hb-shape -O '' -o /dev/null $FONT --text-file $TEXT --num-iterations=100 --font-funcs=ot
+#perf report -g
diff --git a/perf/texts/fa-words.txt b/perf/texts/fa-words.txt
deleted file mode 100644
index 4937544d8..000000000
--- a/perf/texts/fa-words.txt
+++ /dev/null
@@ -1,10000 +0,0 @@
-در
-به
-از
-ویکی‌پدیا
-که
-را
-این
-با
-است
-رده
-برای
-کاربر
-بحث
-تصویر
-میلادی
-ایران
-تاریخ
-نام
-پرونده
-آن
-یک
-ساعت
-صفحهٔ
-کنید
-پیوند
-مقاله
-صفحه
-شما
-اصلی
-عنوان
-یا
-تا
-سال
-هم
-من
-استفاده
-بر
-خود
-شده
-شد
-تغییرمسیر
-شهرستان
-کار
-راهنمای
-اگر
-تکثیر
-چه
-ویرایش
-حق
-مقاله‌های
-می
-فارسی
-نیست
-دیگر
-نوشتن
-پنج
-بود
-زبان
-سیارک
-امضا
-کمک
-شیوه‌نامه
-منابع
-ملی
-ثبت
-آثار
-پانویس
-۱۱
-میز
-خودآموز
-بخش
-دارد
-خرد
-انگلیسی
-او
-لطفاً
-نیز
-۱۵
-شماره
-پهنا
-بنیاد
-استان
-هر
-اثر
-می‌شود
-مورد
-کرد
-یادکرد
-امیدوارم
-راهنما
-کنیم
-خوش
-ویکی
-چیزی
-پس
-شهر
-پیش
-فهرست
-مرجع
-خط
-آمدید
-اطلاعات
-اینجا
-تاریخی
-زیر
-منبع
-جعبه
-جدید
-دوره
-بیشتر
-اینکه
-بهتر
-یکی
-شود
-دو
-سپتامبر
-راهنمایی
-پیوندهای
-حذف
-۲۰۰۰
-خوب
-نظر
-آزاد
-قرار
-خواهد
-تمرین
-باشد
-بله
-پیرامون
-سلام
-آموزش
-اصل
-۱۰
-نه
-صفحات
-۱۹
-۱۲
-۲۰۱۱،
-های
-پاس
-ولی
-توسط
-چگونه
-برگزیده
-بداریم
-فقط
-ویکی‌پروژه
-۲۰۰۱
-روی
-سریع
-اکتبر
-صورت
-دست
-قهوه‌خانه
-۱۴
-دانشگاه
-بنیادی
-اما
-بیاید
-ناشر
-داشتید،
-باید
-بروید
-الگو
-چهار
-اول
-مارس
-کتاب
-ایجاد
-بازدید
-توجه
-آنها
-پایه
-۲۰
-کشور
-ساختار
-سخ
-خوش‌آمدید
-مقالهٔ
-شده‌است
-سازمان
-فارسی‌نویسی
-بودن
-مرکزی
-باز
-آمریکا
-وب
-۱۶
-نویسنده
-کادر
-دسامبر
-صورتی
-۲۰۰۷
-۱۸
-۲۰۱۰،
-کند
-فنی
-تصمیم
-۱۳
-تهران
-وجود
-۱۷
-نشانی
-چطور
-چند
-کشف
-اوت
-دانشنامه‌ای
-فوتبال
-علمی
-۲۰۰۸،
-درج
-۲۰۰۲
-هستند
-بگیرید
-۲۱
-۲۰۱۱
-نوامبر
-مطالب
-آزمایش
-وی
-کاربران
-فیلم
-ها
-ماندن
-مقالات
-بپرسید
-حروف
-لذت
-جمعیت
-بحثم
-ببرید
-خوشتان
-مدک
-وابسته
-ویکی‌پدیانویس
-ویکی‌پدیانویسان
-۲۰۰۹،
-اسلام
-۲۲
-مسایل
-آوریل
-بنویسیم
-۱۹۹۹
-کاربری
-علامت
-واقع
-شوید
-اهمیت
-۲۳
-کلاس
-کردن
-ای
-آشنا
-باشید
-نگاهی
-کوچک
-نکنید
-وب‌گاه
-پروژه‌های
-کرده
-۲۸
-می‌توانید
-انتخاب
-مکنید
-بعد
-روز
-است،
-جستارهای
-شدن
-نوع
-نمونه‌های
-۲۴
-نفر
-دارید،
-بیندازید
-خودکار
-۲۰۰۶
-نوشته
-مطالعهٔ
-انبار
-عجله
-غفلت
-فهرست‌شده
-مشارکت
-اهل
-۲۵
-سوال
-محمد
-بوده
-۳۰
-بسیار
-بزرگ
-میراث
-میان
-زمان
-منابعی
-اثبات‌پذیری
-جلالی
-سیارک‌های
-دهستان
-مرکز
-انجام
-فوریه
-می‌کند
-۲۶
-نام‌های
-ما
-یعنی
-ایرانی
-ژوئن
-غیر
-پایان
-یونسکو
-حال
-پرحجم
-چپ
-می‌گویم
-داشته
-جمله
-پیام
-عمومی
-گردشگری
-قبل
-همین
-همچنین
-همان
-مالک
-سپاسگزارم
-سال‌های
-همه
-اندازه
-مربوط
-ویکی‌انبار
-قدر
-چون
-بیرون
-ویکی‌نویسی
-داده
-کسب
-دوم
-ویژه
-هیچ
-فرهنگ
-کسی
-بروید،
-تنها
-۲۰۰۳
-دارای
-ساخت
-افراد
-رتب
-تازه‌واردان،
-مه
-محلی
-بصب
-بین
-پتوپ
-مقاله‌ها
-نیازمند
-اسلامی
-۲۷
-بی
-مرگ
-علی
-۲۰۰۵
-متون
-مطلق
-سه
-می‌باشد
-نیاز
-شرکت
-۲۹
-۲۰۰۹
-باشگاه
-دلیل
-زندگی
-چاپ
-موجود
-۲۰۰۸
-نقل
-گروه
-۲۰۰۴
-انتهای
-دارند
-محتویات
-شاد
-موضوعات
-جستجوی
-۱۹۹۸
-مردم
-نشان
-موسیقی
-ویکی‌مدیا
-همراه
-ویکی‌گفتاورد
-تپه
-شورای
-دانشنامه
-ویکی‌واژه
-بدون
-مانند
-راه
-شهرهای
-فرهنگی
-سیاره
-ویکی‌نبشته
-ترجمه
-فراویکی
-حجم
-کنونی
-طبق
-ژانویهٔ
-بار
-اجرام
-روستای
-ویکی‌نَسک
-تغییر
-خوشامد
-سرعت
-۲۰۱۲،
-جنگ
-برابر
-محل
-سر
-سپس
-سیارک‌ها
-عربی
-بازیابی
-داشت
-بازی
-ماه
-می‌تواند
-رو
-کنید،
-ژانویه
-معرفی
-بنا
-مشترک
-چندین
-دوران
-ندارد
-جهان
-حقوق
-کنم
-بالا
-ضمن
-داد
-وبگاه
-البته
-آب
-قدیمی
-امکان
-جمهوری
-قسمت
-۰۹
-مفیدند
-پیدا
-وپ
-پروژه
-بن
-همکاری
-۰۸
-تغییرات
-كه
-منطقه
-معماری
-چم‌وخم
-معرفی‌شده
-کنند
-هزار
-عرض‌جغرافیایی
-طول‌جغرافیایی
-۰۷
-روی‌نقشه
-برخی
-آی‌پی
-آمار
-ویکی‌پدیای
-۲۰۱۰
-جای
-موضوع
-تمام
-گرفته
-شرقی
-فوریهٔ
-اخیر
-قمری
-متوسط
-دیگری
-غربی
-درگاه
-ربات
-راستی
-اولین
-۳۱
-باستانی
-امنیت
-چنین
-آلمان
-کم
-رسمی
-جهانی
-مطالعه
-بررسی
-ژوئیه
-فعالیت
-آغاز
-آذربایجان
-فکر
-اين
-الگوی
-تیم
-لطفا
-ژوئیهٔ
-صنایع
-درود
-نامه
-تلفن
-اقدام
-روستا
-ایشان
-می‌کنند
-فارس
-حتی
-تعداد
-دربارهٔ
-فعلی
-درست
-مدیران
-گفتگو
-حجت
-دستی
-ستاره
-بسیاری
-اند
-نقش
-کلیک
-بودند
-۰۶
-تولد
-کردم
-زادگان
-شاه
-متحده
-توضیح
-طول
-دوست
-ذکر
-رسیده
-مقاله‌ای
-قابل
-اضافه
-مسائل
-ایالات
-همهٔ
-اینترنتی
-نام‌گذاری
-سیاسی
-طور
-خیلی
-رضا
-روستاهای
-چپ‌چین
-تولید
-صفحه‌های
-برچسب
-خانه
-شکل
-دولت
-می‌توان
-شامل
-می‌نویسید
-یادتان
-موسسه
-جنوب
-نرود
-نشریه
-باشند
-۰۰
-آمد
-وارد
-فرانسه
-جوایز
-مجموعه
-قانون
-به‌عنوان
-متن
-۰۵
-جایزه
-خبری
-سید
-ویکی‌خبر
-گفته
-اساس
-سیاست‌های
-جنوبی
-سایت
-آری
-ممکن
-نمی
-بنویسید
-روسیه
-فیلم‌های
-مهٔ
-سوم
-تشکر
-جام
-۱۳۸۵
-حدود
-کامل
-عرض
-شمارهٔ
-قاجار
-ماني
-عکس
-اجازه
-تصحیح
-آرش
-علوم
-نظری
-جای‌های
-اشاره
-دانشنامهٔ
-گرفت
-کردند
-جان
-فرهنگی،
-مختلف
-بانی
-توضیحات
-ارتفاع
-موارد
-میلاد
-مثل
-مرمت
-ژورنال
-شعر
-محتوای
-بیش
-چرا
-شمال
-خواهر
-می‌کنم
-خم
-فصل
-شروع
-تشکیل
-چم
-سرشماری
-دهه
-مشکل
-ساخته
-زبان‌ها
-گونه‌های
-مدت
-مجموعه‌ای
-زیادی
-بهترین
-درباره
-موافق
-دیرینگی
-نتیجه
-هست
-آلبوم
-ادامه
-جهت
-خراسان
-شرح
-ایران‌شهر
-زیستی
-پیشرفته
-می‌دهد
-راهنماهای
-صفحه‌ی
-افغانستان
-هماهنگی
-قلعه
-اصفهان
-بالای
-جغرافیایی
-شخصی
-نسبت
-می‌شوند
-تصنيف
-مطرح
-عناوین
-بوده‌است
-۰۱
-۱۳۸۶
-زمین
-سازی
-حزب
-سی
-آن‌ها
-سرشناسی
-انقلاب
-مي
-واژه‌ها
-مهم
-سایر
-می‌آید،
-دکتر
-مساحت
-قطعنامه
-۰۴
-شدند
-مرد
-درگذشتگان
-پرونده‌های
-باعث
-نکاتی
-اعلام
-نامگذاری
-پروژه‌ای
-زبانه
-سیستم
-انتفاعی
-یادداشتی
-کتابچه
-پرسیدن
-۰۳
-چندرسانه‌ای
-قول‌ها
-هرکسی،
-ویکی‌گونه
-خوانندگانش
-کیلومتر
-سطح
-زمینه
-اهالی
-سؤال،
-حسین
-اصطلاح‌نامه
-موقت
-سندباد
-بود،
-تبدیل
-سبک
-بنویسیم؟
-روش
-میثم
-زمانی
-۱۳۸۷
-دسترسی
-کد
-انگلستان
-برنامه
-رنگ
-تحت
-هاروارد
-مدیر
-امیروبات
-جرم
-جلد
-وقتی
-گودال
-نگاره
-شمالی
-۰۲
-پاسخ
-آیا
-تر
-منتشر
-شوند
-انتشارات
-مخالف
-مسجد
-بایگانی
-هماهنگ‌کننده
-کپی
-متر
-مجلس
-۴۰
-دهید
-شاید
-آنجا
-گل
-کاربرهای
-ناسا
-دوستان
-جناب
-پیشنهاد
-ان
-دی
-یافت
-آسمانی
-۱۳۸۸
-هنوز
-نخستین
-مذهب
-نویسندگان
-زنده
-ایالت
-ماسه‌بازی
-احمد
-آنهاست
-کنار
-شبکه
-بازی‌های
-مشخص
-ژاپن
-نمود
-وقت
-کشورهای
-خواندن
-معروف
-اروپا
-اشتباه
-کرمان
-سن
-معرف
-پهلوی
-درجه
-سوی
-ام
-محیط
-بحثتان
-روزنامه
-گونه
-۱۹۹۷
-طرف
-کل
-داستان
-علت
-الگوهای
-آمریکایی
-تو
-آمده
-بین‌المللی
-داتک
-امیر
-انتشار
-قوانین
-شماره‌دار
-دادگان
-موفق
-رشته
-خاطر
-دارم
-خورشیدی
-حسن
-معنی
-زنان
-انتقال
-پی
-حکومت
-لازم
-به‌آفرید
-تپه‌های
-نام‌صفحه
-شابک
-زن
-قرن
-دهد
-عمل
-بازیگر
-تصاویر
-رئیس
-ممنون
-عزیز
-یاد
-گفت
-هفته
-دین
-رای
-وضعیت
-فرار
-درخواست
-سیاست
-سمت
-حالت
-پسر
-کوه
-پرچم
-طی
-ادبیات
-الله
-کلی
-کشف‌شده
-بازیابی‌شده
-غرب
-فرودگاه
-۱۳۹۰
-سپاس
-واژه
-توابع
-ابعاد
-کمربند
-دور
-مدرک
-مبدا
-مازندران
-کننده
-مدیریت
-دوستدار
-وجه
-مهدی
-نمایش
-هجری
-هنر
-ابتدا
-ده
-رسید
-اعضای
-انسان
-امام
-مثال
-دادن
-آخرین
-اسرائیل
-قول
-نمایید
-حضور
-رود
-خودتان
-زیاد
-جا
-توصیه
-مناطق
-عراق
-مطلب
-پرسش
-خان
-عضو
-حسام
-حداقل
-باستان
-ارائه
-۵۰
-مواد
-کمی
-خارج
-دما
-چین
-وزارت
-اوج
-خروج
-طبیعی
-پزشکی
-ستاره‌شناسی
-فراموش
-پایین
-کاری
-اکنون
-بعضی
-میانگین
-نشده
-هزاره
-نشر
-مهندسی
-شد،
-آباد
-خودم
-اسپانیا
-خاص
-دوران‌های
-۱۳۸۹
-جریان
-منظور
-طریق
-ترتیب
-بناهای
-بیان
-دارید
-روستایی
-سطحی
-شیخ
-نسخه
-حرکت
-بنده
-سده
-اجتماعی
-طراحی
-حرف
-خودروهای
-ویکی‌گزارش
-نو
-هند
-استاد
-به‌شما
-دوباره
-توان
-نظامی
-بلکه
-سری
-همسر
-هنری
-شیراز
-مفیدی
-جمع
-علم
-خانواده
-انتخابات
-آلمانی
-فاصله
-نیروی
-مرتبط
-نمونه
-پدیا
-فرمایید؛
-شناخته
-چگالی
-دیده
-معتبر
-مناسب
-قرآن
-میلیون
-واحد
-۴۵
-مهر
-تبریز
-هنگام
-گسترش
-طبقه‌بندی
-۱۹۹۶
-فلسفه
-کرمانشاه
-گردید
-گذشته
-دنیا
-زیرا
-قدرت
-مثلا
-ببینید
-لیگ
-دریافت
-انحراف
-نام‌رسمی
-می‌آید
-حمله
-گرانش
-توسعه
-افزایش
-چشم
-مکان
-عدد
-ابهام‌زدایی
-دانش
-موضوعی
-نزدیک
-شخص
-آنان
-دیگران
-بازیکنان
-آقای
-کاشف
-تلویزیونی
-زاده
-بسته
-جایی
-خدا
-حاضر
-شرق
-می‌شد
-حساب
-پدر
-داشتید
-نقض
-پیش‌شماره
-ایتالیا
-کاربرد
-سعی
-رفت
-برد
-‌بودن
-کاربردها
-تناوب
-۳۵
-معمولاً
-زبان‌های
-بهمن
-۳۲
-عباس
-حضیض
-پدیدآور
-انجمن
-فیزیک
-نگاه
-فعال
-نور
-نسخه‌ها
-ریاست
-هستم
-فلکی
-فرد
-مسیر
-اجازه‌نامه
-جامعه
-آلبدو
-مصر
-آنومالی
-کلمه
-نیم‌محور
-بریتانیا
-۱۹۹۵
-پر
-پاک
-۱۹۹۳
-بازیگران
-بخشی
-فرانسوی
-داخلی
-خبر
-سئوال
-محمود
-باشد،
-امروز
-کرده‌است
-ارتباط
-درصد
-تاریخچه
-ملل
-اصلاح
-معیارهای
-همچون
-طرح
-شده‌اند
-هدف
-عالی
-وقایع
-میدان
-محسوب
-حل
-باغ
-استان‌های
-خودش
-قطع
-ایران،
-۳۳
-۳۴
-اش
-دنبال
-شهری
-تعریف
-دانشکده
-انواع
-دار
-ورزشگاه
-نقشه
-کوتاه
-شمار
-مدرسه
-کمتر
-آرامگاه
-عصر
-عبارت
-بیست
-تن
-خرابکاری
-المپیک
-تیر
-می‌رود
-خیابان
-بازار
-نامزد
-میرزا
-داخل
-اندازه‌تصویر
-پایگاه
-رضوی
-سؤال
-۱۹۹۰
-الان
-گرامی
-نبود
-خوبی
-۳۷
-خارجی
-گیری
-آورد
-برچسب‌تصویر
-۴۸
-سیستان
-۱۹۹۴
-آزادی
-رشد
-نباید
-پرسشی
-۱۳۸۴
-حد
-۳۶
-ملیت
-رشدجمعیت
-تازه
-میانگین‌دما
-عدم
-نیروهای
-تراکم‌جمعیت
-سؤالی
-نام‌های‌قدیمی
-بنابراین
-ارتش
-شب
-داشتن
-علاوه
-ابن
-شمارروزهای‌یخبندان
-میانگین‌بارش‌سالانه
-پل
-تصویب
-میانه
-خرداد
-گیلان
-سنگ
-کنترل
-بهزاد
-کیفیت
-می‌‌نویسید
-۴۱
-درگذشت
-علیه
-گزارش
-شیعه
-خور
-۳۸
-جزیره
-ره‌آورد
-دسترس
-دستگاه
-نام‌محلی
-تگزاس
-جز
-همیشه
-۴۲
-اجرا
-کوشش
-پخش
-رد
-۴۶
-متحد
-اسفند
-وزیر
-خواننده
-بهبود
-اثبات
-سفید
-نظرخواهی
-شرایط
-جمله‌خوشامد
-ترکیه
-۴۴
-همدان
-قم
-۳۹
-می‌گیرد
-۴۳
-بلوچستان
-چیز
-دسته
-خوزستان
-گنو
-ترانه
-کدام
-خودرو
-۵۵
-۴۷
-باقی
-بندی
-۵۱
-بخوانید
-۱۹۹۲
-خواهند
-صد
-ناحیه
-۵۳
-کاهش
-۱۹۹۱
-میشود
-مذهبی
-۴۹
-ساختمان
-اولیه
-مقابل
-۵۲
-سبز
-وحید
-۵۷
-مشهور
-متوجه
-تهیه
-کافی
-آنچه
-ترک
-افزودن
-می‌شود،
-جدا
-۱۳۸۲
-چهارم
-تقسیم
-نژاد
-معنای
-کشاورزی
-صفوی
-براساس
-سیاه
-هایی
-آسیا
-تمامی
-تحقیق
-۱۹۶۰
-ساسانیان
-نوشتار
-رادیو
-۵۶
-۵۴
-اسم
-ارزش
-دهانه
-اقتصادی
-ابراهیم
-نخست
-فرزندان
-۵۹
-هاي
-شهرها
-دقیقه
-حالا
-دستور
-امور
-رابطه
-پارک
-جنبش
-دختر
-قالب
-بیماری
-نام‌های‌دیگر
-محوطه
-بازیکن
-کشته
-دارد،
-مشهد
-منتقل
-شهریور
-مرداد
-کیلومتری
-پرداخت
-۵۸
-تخصصی
-۲۰۱۲
-مرده
-دهیار
-صنعتی
-خدمت
-پشت
-فشار
-می‌کرد
-تلاش
-مدیاویکی
-تلویزیون
-میزان
-سال‌بنیاد
-قبلی
-انرژی
-بدست
-نظام
-حوزه
-پا
-بودم
-یزد
-هفت
-ازدواج
-است؟
-فضای
-نظریه
-اختلاف
-حمایت
-خواهم
-مجله
-رفته
-اجرای
-می‌گردد
-برتر
-متولد
-کره
-خاک
-برگزار
-سرزمین
-بدن
-کرده‌اید
-مسابقات
-اقتصاد
-ندارم
-بعدی
-قبول
-خلیج
-آخر
-کمیته
-فروردین
-مادر
-کارگردان
-می‌کنید
-سال‌ها
-کسانی
-مصرف
-جدول
-جشنواره
-آنرا
-دید
-فرزند
-عرب
-کاملا
-آمل
-پادشاه
-دیدگاه
-آذر
-اشکانیان
-سفر
-متفاوت
-وزن
-نیویورک
-داشتند
-بیشتری
-موزه
-یه
-می‌رسد
-خاصی
-دل
-دهستان‌های
-آنکه
-استقلال
-پنهان
-مجوز
-نوعی
-کردید
-لرستان
-جغرافیا
-ترکی
-محسن
-هوایی
-۱۹۸۱
-فروش
-مقام
-مقدار
-۱۶۱۵
-قزوین
-حالی
-عمر
-لزوم
-میل
-آبی
-دقت
-اصلا
-اطلاع
-رخ
-شکست
-اعمال
-اینترنت
-موتور
-دومین
-شهید
-تحقیقات
-تاسیس
-برخورد
-روم
-ماده
-محله
-لینک
-راست
-امروزه
-کرده‌اند
-بازگشت
-جواب
-پارس
-یونان
-رتبه
-شده،
-۱۳۸۱
-اساسی
-نقطه
-گردد
-موجب
-سخن
-تقویم
-نکته
-می‌دهند
-مستقل
-جامع
-اردیبهشت
-هستید
-سینما
-مدل
-کانادا
-گاه
-آورده
-حفظ
-ثابت
-احترام
-بوشهر
-مربع
-۱۹۸۸
-روابط
-سیمرغ
-درون
-زیرنویس
-کن
-نظرم
-ترکیب
-بهار
-بد
-پادشاهی
-دلار
-شیمی
-تعیین
-بابل
-نفت
-دولتی
-مدتی
-نظرات
-درستش
-کاتالوگ
-گاهشماری
-لحاظ
-ساده
-بخش‌های
-شوروی
-باب
-بی‌بی‌سی
-گرفتن
-دادم
-مثلاً
-گروه‌های
-ندارند
-کردستان
-حاصل
-شود،
-انسانی
-گرم
-روشن
-مسکن
-خون
-۱۳۸۰
-رسیدگی
-مفهوم
-خمینی
-گیاهان
-ساز
-آهنگ
-ترین
-هرمزگان
-۱۹۸۹
-صاحب
-کارهای
-اغلب
-عبدالله
-مشغول
-۱۰۰
-شناسی
-محمديان
-گفتم
-مختصات
-دهند
-یونانی
-رایانه‌ای
-یکم
-ستارگان
-کتاب‌های
-ایرانیان
-آوردن
-صنعت
-کند،
-صحبت
-فناوری
-نمی‌شود
-آینده
-واگردانی
-کتابخانه
-برجسته
-امر
-نقد
-مخصوص
-بزرگی
-آبان
-نتایج
-براي
-یافته
-لقب
-متاسفانه
-مالکیت
-مشاهده
-عرضه
-کارت
-گاهی
-شش
-دفاع
-مایکل
-اداره
-خبرگزاری
-دره
-مسئله
-صحیح
-ولایت
-گروهی
-رودخانه
-مقدس
-مراسم
-کشورها
-باد
-تاکنون
-خلاف
-علاقه
-ارومیه
-مرحله
-ورود
-۲۰۰۷،
-تکمیل
-موقعیت
-رویدادها
-تفاوت
-ایستگاه
-شیمیایی
-مگر
-ضد
-ژاپنی
-استاندارد
-دریای
-۱۹۸۰
-معاصر
-زندان
-غیرقابل
-عملیات
-دریایی
-خصوص
-برخوردار
-لندن
-شیوه
-آقا
-مشابه
-سخت
-خلاصه
-دفتر
-برنده
-سنت
-پاپ
-جلوگیری
-قدیم
-ورودی
-اسکار
-بطور
-چر
-بندر
-مرا
-راک
-نیشابور
-نیستند
-۱۵۱
-مشکلی
-آتش
-کشوری
-تابستانی
-امپراتوری
-بررسی‌های
-آن،
-اس
-میکنم
-پارسی
-تشخیص
-شاعر
-خدمات
-عهده
-نیمه
-مشکلات
-نیست،
-آشنایی
-بصورت
-تأسیس
-درمان
-ابزار
-آموزشی
-نوروز
-بروجرد
-تواند
-قتل
-تحصیل
-دیدم
-مدرس
-دانشگاه‌های
-جمهور
-محدود
-برج
-آبشار
-دانشجویان
-احتمال
-رفتار
-اعتماد
-اطراف
-هشدار
-همواره
-قطعنامه‌های
-محمدرضا
-پاریس
-ساله
-کالیفرنیا
-وسیله
-اصول
-درخت
-سالگی
-۱۹۷۷
-پیشه
-داریم
-شخصیت
-قصد
-نداشته
-می‌گوید
-جشن
-ویرایش‌های
-ادبی
-بهره
-سنتی
-فوق
-کنید؛
-تام
-بانک
-دهم
-استرالیا
-دقیق
-نامیده
-نفوس
-فراهم
-می‌توانند
-بدین
-اختیار
-چشمه
-دادند
-يا
-اردبیل
-پست
-خانوار
-قهرمانی
-منصور
-سرخ
-روسی
-۱۳۸۳
-شبیه
-بشر
-قرمز
-قطر
-سبب
-کشتی
-برده
-صدا
-یکسان
-شمسی
-مجدد
-اکثر
-جالب
-تک
-گلستان
-پنجم
-فراوان
-يك
-نرم‌افزار
-توهین
-اتحادیه
-عشق
-ظهیری
-گورستان
-بلژیک
-بکار
-رستم
-سرشناس
-‌ها
-هیئت
-علیا
-مقالاتی
-رباتیکی
-هنگامی
-لطف
-بختیاری
-روح
-ارجاع
-تقریبا
-۱۹۷۳
-سپاه
-‌های
-یکدیگر
-نموده
-رمان
-کرد،
-جنسی
-بزرگترین
-پیشرفت
-دعوت
-بقیه
-کلمات
-شهرت
-مرکزی،
-رایانه
-یمن
-تخت
-معادل
-صادق
-وسط
-خوانندگان
-تلفظ
-اتفاق
-امامزاده
-تحصیلات
-خانوادگی
-حقیقت
-خورشید
-نوری
-نقاط
-پایتخت
-بند
-گوگل
-مانده
-نزدیکی
-سعید
-امید
-نشود
-نر
-مسعود
-سلطان
-ادغام
-سفلی
-دریا
-لاتین
-اجماع
-خوانده
-سابق
-ریاضی
-درستی
-فضایی
-دلایل
-برندگان
-بعدها
-متعلق
-پیشین
-شدم
-هنرمند
-درس
-ذخیره
-کارگردانی
-نباشد
-دانقولا
-اون
-تابع
-مالی
-صدای
-بلند
-بارگذاری
-بخش‌ها
-اینگونه
-اواخر
-ریشه
-نشد
-کاخ
-ریز
-فرض
-قانونی
-برق
-جلوی
-کودکان
-نزد
-قاسم
-آهن
-زنجان
-نگارش
-شدت
-می‌گویند
-جایگزین
-جاده
-می‌کردند
-مفید
-زرشک
-لیست
-محور
-ویکیپدیا
-رایج
-مناسبت‌ها
-خلق
-مراکز
-ساری
-عامل
-نقاشی
-رسیدن
-کارشناسی
-۱۹۸۴
-زده
-رعایت
-انگلیس
-اطلاعاتی
-ورزشی
-مقایسه
-منبعی
-بازبینی
-حافظه
-حتما
-عربستان
-مستقیم
-گیرد
-الدین
-۱۹۸۲
-علیرضا
-تعدادی
-ورزش
-برادر
-گذاشته
-تهران،
-محصولات
-زندگینامه
-هوا
-۱۹۸۶
-۶۰
-کس
-پوشش
-حکم
-قهرمان
-خانه‌های
-حاج
-خواهش
-گردآفرید
-نوبل
-نرم
-رهبری
-خیر
-تجاری
-نوشت
-۱۹۸۵
-جوان
-واقعی
-نظیر
-سند
-سرانجام
-منجر
-اعداد
-فی
-واقعا
-نبرد
-مردان
-جغرافیای
-شدید
-روند
-ویرایشی
-دشت
-رده‌بندی
-پرحجم،
-گذاری
-افشار
-۱۹۷۸
-زدن
-سوئد
-خویش
-ماهی
-خالی
-درآمد
-آمریکای
-مسلمانان
-کجا
-می‌باشند
-طوری
-اید
-دکمهٔ
-احمدی
-درد
-۱۹۸۷
-شاعران
-گویا
-نداشت
-هـ
-سالهای
-ششم
-شیر
-دچار
-تاثیر
-زیست
-دینی
-سریال
-نماد
-راجع
-مطالعات
-مراجعه
-لحن
-خطر
-پرسپولیس
-حضرت
-مکتب
-دامنه
-بروید؛
-زیبا
-بافت
-مسلمان
-کامیار
-محافظت
-ناوبری
-نهایت
-کلیسای
-هشت
-تکرار
-پرورش
-توزیع
-معمولا
-وبلاگ
-طولانی
-تجربه
-ظاهر
-گسترده
-ممنوع
-پیروزی
-چهل
-گاز
-عکاسی
-کاملاً
-احساس
-همچنان
-تفسیر
-چک
-مترجم
-مشخصات
-اینها
-تایید
-۱۹۷۹
-توکیو
-ال
-سمنان
-۲۰۰
-رهبر
-بیت
-سومین
-خورده‌است
-پاکستان
-۹۰
-همانند
-فردی
-ملحق
-کامپیوتر
-سوریه
-پدرش
-اوایل
-پول
-سوره
-تقویم‌های
-آفریقا
-کتاب‌ها
-دنیای
-همانطور
-دودمان
-هدایت
-باره
-سلسله
-موسوی
-قضیه
-غیره
-صرف
-آید
-ايران
-پک
-طبقه
-حاکم
-داریوش
-گوناگون
-زهرا
-اسماعیل
-زمین‌لرزه
-اعتبار
-بعنوان
-مُروا
-توانست
-۱۳۷۹
-تدوین
-اهواز
-سبزوار
-جکسون
-نمایندگان
-مقاومت
-آی
-برداشت
-گشت
-قلم
-تنظیم
-نگاری
-هلند
-باور
-نهاد
-سینمای
-تمدن
-فرهنگستان
-کردی
-ویندوز
-سوئیس
-کانی
-نویسی
-ممتنع
-مانی
-پشتیبانی
-جو
-رده‌ها
-ساکن
-شهرک
-روزی
-صحنه
-اصطلاح
-تئاتر
-جستجو
-جلو
-فردا
-جیمز
-کی
-هرگز
-چیست؟
-حمل
-توصیف
-گیتار
-ری
-والدین
-۱۹۷۶
-حفاظت
-رشت
-سابقه
-کودک
-کنون
-فعالیت‌های
-عوض
-اعتراض
-نسل
-دریاچه
-مرز
-باشگاه‌های
-کهگیلویه
-میکند
-دادگاه
-تصویری
-خانم
-مخالفت
-نصب
-آل
-افرادی
-چاه
-نماینده
-نگه
-عملکرد
-جدیدی
-۱۹۷۰
-مهمترین
-آمده‌است
-محمدعلی
-بدهید
-اتحاد
-شرکت‌های
-موج
-رم
-کشیده
-تحلیل
-نظارت
-تابلوی
-شهرداری
-محصول
-متعدد
-نماید
-قوم
-مصطفی
-جزایر
-گرمی
-عقب
-صلح
-شعار
-ارسال
-جی
-نوشته‌های
-غلط
-۱۹۷۱
-سازنده
-نکرده
-مواردی
-جوانان
-حمام
-دورهٔ
-تبریک
-بگذارید
-دانشگاهی
-مس
-ماند
-خداوند
-مهاجرت
-ضبط
-ست
-احتمالا
-لبنان
-دوربین
-خودشان
-عبور
-ارشد
-بنام
-فرمان
-عبارتند
-مطابق
-خرم‌آباد
-بالاتر
-سد
-تقریباً
-اکبر
-دیدن
-موفقیت
-مدرن
-نگهداری
-۷۰
-عوامل
-پای
-جایگاه
-۸۰
-زادروز
-پرواز
-خلیفه
-هفتم
-ماشین
-هرچند
-هسته‌ای
-عناصر
-اسناد
-گنبد
-لا
-نهایی
-تدریس
-طلایی
-زابل
-چندان
-اروپایی
-ظاهری
-صفر
-اول،
-اشعار
-دبیرستان
-معلوم
-برنامه‌های
-نخواهد
-زد
-بیفزایید
-خصوصی
-وظیفه
-ادعا
-عزیزی
-عمده
-انتظار
-آن‌لاین
-قبلا
-مبارزه
-هستند،
-خسته
-فرصت
-رفتن
-مشارکت‌ها
-گرامی،
-سراسر
-۱۹۸۳
-پیروز
-گویش
-رفع
-جزو
-گفتاورد
-متال
-مکزیک
-۱۳۵۷
-امپراتور
-اطلس
-اسپانیایی
-پنجاه
-شاپا
-بیمارستان
-پیامبر
-بستک
-می‌کنیم
-اشکال
-تقسیمات
-الکتریکی
-درک
-سلطنت
-لباس
-دهنده
-نشست
-اعدام
-اقوام
-شاخه
-سلام،
-الگوریتم
-چپچین
-شان
-خواست
-مدال
-امارات
-جبهه
-باشم
-مطبوعات
-مستعار
-نیازی
-عادی
-چینی
-افتخار
-کهن
-نا
-مثبت
-شخصیت‌های
-خطوط
-ویلیام
-سلطنتی
-منطقی
-اطمینان
-جعفر
-سقوط
-روزهای
-گرفته‌است
-طبیعت
-باشیم
-رده‌های
-ترتیب‌پیش‌فرض
-شبه
-موافقم
-یهودیان
-تربیت
-دیوید
-معاون
-پرندگان
-ملت
-دیوان
-تی
-پلیس
-ملک
-نيز
-هنرمندان
-عین
-تماس
-حرفه‌ای
-آستانه
-بماند
-واکنش
-زحمت
-عمان
-حافظ
-نیم
-منفی
-آسیای
-تابستان
-جدی
-قابلیت
-ساختن
-آسیایی
-رجوع
-شهرستان‌های
-معین
-نیستم
-ناشی
-تهیه‌کننده
-داشته‌است
-دانشمندان
-صبح
-اعتقاد
-مبارک
-سورنا
-اساطیر
-اصلاً
-تذکر
-خطی
-کاربردی
-داشتم
-آدم
-کتابی
-مختلفی
-کاربرانی
-سرباز
-جذب
-متغیر
-وضع
-روزبه
-مجازی
-گذاشت
-بابت
-اعلانات
-مهمی
-فلان
-آماده
-مصاحبه
-باتجربه‌تر
-رقص
-کلاسیک
-گیاه
-سامانه
-مجبور
-نحوه
-نبوده
-نفوذ
-متری
-کانال
-حیات
-گفتمان
-جلسه
-ارادتمند
-درفش
-حومه
-تصور
-خاندان
-بهرام
-لحظه
-برزیل
-یهودی
-دهخدا
-ایتالیایی
-رسانه
-۱۹۷۵
-مسابقه
-خواستم
-کابل
-نی
-اوکراین
-موسی
-شما،
-بگیرد
-زرد
-هوای
-فلسطین
-اهداف
-است؛
-ولسوالی
-غار
-بنای
-نوشتارهای
-مربوطه
-اخبار
-بودند،
-مهم‌ترین
-سینمایی
-پیمان
-۸۸
-همزمان
-ها،
-احتمالاً
-آسمان
-شهرک‌های
-ابتدای
-ندهید
-بوجود
-آیدا
-جانوران
-سده‌های
-بازداشت
-هسته
-یادداشت
-ایلام
-نامی
-مجموع
-هنرهای
-می‌دانند
-ادعای
-سرویس
-بگویم
-ظهور
-هزینه
-کاویانی
-الگوها
-ضروری
-آرام
-حذفی
-اقیانوس
-یی
-امتیاز
-زمینی
-آدرس
-باشه
-امکانات
-بیشترین
-طراح
-نواحی
-مطالبی
-مقالات،
-بخاطر
-لی
-آفتاب
-بفرمایید
-دقیقا
-هشتم
-توانایی
-آیت‌الله
-مسیحیت
-تبلیغات
-محوطه‌های
-بارها
-ته
-سنچولی
-يک
-الف
-متصل
-ساسانی
-بویراحمد
-سروش
-نظرتان
-ربطی
-روایت
-بروز
-دیگه
-پژوهشی
-زبانی
-۱۳۷۸
-ثانیه
-برگزاری
-تبلیغ
-شاهنامه
-نزاکت
-قوی
-خواجه
-پوست
-پژوهش
-شروین
-سنی
-میباشد
-سرد
-بگویید
-شکایت
-بنی
-صدر
-مطلبی
-اسید
-کلید
-خسرو
-گذشت
-طلا
-شیرازی
-اي
-شناسایی
-تأثیر
-شیرین
-می‌کند،
-رأی
-فردوسی
-اگرچه
-چهارمین
-نمی‌کند
-زاپاس
-خشک
-جنگی
-برداری
-قادر
-بومی
-بنابر
-ديگر
-تقدیم
-حاشیه
-نگاره‌های
-۱۹۷۲
-اختصاص
-یونایتد
-بردن
-اندیشه
-حتماً
-بودجه
-داشت،
-افزوده
-۱۹۷۴
-بیرجند
-عضویت
-مستند
-بحثی
-الکترونیک
-امروزی
-بیرونی
-فتح
-معمول
-واژگان
-ادب
-نمی‌توان
-مرتضی
-اتصال
-مخالفان
-گویند
-ناقص
-سفارت
-۱۳۷۷
-المللی
-قسمتی
-چنان
-مدفن
-فضا
-گرچه
-ويکيپديا
-آمدن
-زیبایی
-نوشتم
-عهد
-رای‌گیری
-سرمایه
-نامعلوم
-ردیف
-تجارت
-نیک
-ایل
-یافتن
-اظهار
-گرد
-مایل
-اعراب
-قیمت
-چی
-مقدمه
-خرید
-عمق
-گمان
-هری
-معتقد
-داده‌است
-یوسف
-مردتنها
-بزرگ‌ترین
-فراوانی
-مرور
-جزء
-ناصر
-موشک
-رومانی
-دانست
-نادرست
-خود،
-فایل
-تلقی
-مشاهیر
-بوده‌اند
-آواز
-ضمنا
-بشود
-عثمانی
-مبنای
-قلب
-گوش
-جمعه
-آیت
-ویرایشات
-هاشمی
-دارند،
-استادان
-فرق
-همگی
-پرتغال
-ذهن
-پیر
-زیست‌شناسی
-پرنده
-بتواند
-ارمنستان
-اتریش
-اندکی
-آیین
-اتاق
-قطعه
-شناخت
-تغییری
-۱۹۶۸
-عبری
-معیار
-هفتاد
-روش‌های
-نکردن
-فاقد
-آیه
-دم
-عید
-مکانیک
-تک‌آهنگ
-نوبت
-دیوار
-گشتن
-درمانی
-مطمئن
-نصف‌النهار
-جنس
-تیره
-منظومه
-بایستی
-ریاضیات
-مهندس
-رییس
-بارگذار
-هواپیما
-میشه
-آرژانتین
-کلا
-کریم
-شاهد
-گر
-سنگی
-مسئول
-نشانه
-فیلمبرداری
-نوکیا
-جمشید
-تغییراتی
-کتب
-کرج
-استناد
-شریف
-ایرلند
-اف
-نسخهٔ
-چهره
-نوید
-کنگره
-منچستر
-رابرت
-نباشید
-پرویز
-مى
-نماز
-کمال
-گونه‌ای
-ژان
-دلیلی
-داری
-عالم
-اسب
-حمید
-قرارداد
-پیشینه
-قره
-خروجی
-کمونیست
-قاسمیان
-می‌گیرند
-شصت
-زمستان
-کلمبیا
-راهی
-محدوده
-نام‌ها
-میر
-لینوکس
-میلادی،
-بهداشت
-اگه
-سدهٔ
-۵۰۰
-بجای
-مغز
-پوستر
-حاوی
-لغت
-رسانی
-لوگو
-مسیح
-فرزاد
-فرمول
-مؤسسه
-مفصل
-پدید
-درام
-اردشیر
-آفریقای
-خرابکار
-تامین
-داره
-اتمی
-بزرگان
-محکوم
-نجات
-یادبودهای
-ریچارد
-رومی
-مدار
-تخریب
-بدانید
-درگیری
-بیستم
-افتاد
-محترم
-خودروها
-نوین
-مطابقت
-تاجیکستان
-نقش‌های
-افزار
-مراجع
-اتومبیل‌های
-عزیز،
-ضعیف
-امضاء
-بیگانه
-فرا
-اکثریت
-هرات
-می‌یابد
-پنجمین
-میکنند
-کنندگان
-فعلا
-۸۵
-نکات
-ارتباطات
-خواهید
-مجمع
-کنی
-یابد
-منطق
-دیدار
-دویست
-دوستانه
-آوری
-آلبوم‌های
-اتهام
-بینی
-مسیحی
-گری
-آنلاین
-ویژگی
-ادوارد
-امنیتی
-برایتان
-كرد
-دیگر،
-عام
-اصرار
-بودید
-تبلیغاتی
-حاجی
-هرچه
-۱۹۶۴
-انتقاد
-برسد
-شک
-توانید
-ویژگی‌های
-خوی
-۶۴
-زادگاه
-مساله
-فیزیکی
-هخامنشی
-غذایی
-نمی‌دانم
-سامسونگ
-گرفتند
-تاج
-موقع
-۱۹۶۹
-فاطمه
-سخنرانی
-سختی
-استدلال
-۱۳۷۶
-شهردار
-ار
-سلیمان
-متهم
-مذکور
-عملی
-چندی
-پدیای
-صادر
-منتظر
-ضرب
-تیم‌های
-تل
-حسینی
-گیر
-سراب
-تیرداد
-ویکی‌سازی
-تان
-مشروطه
-کوچکی
-مردمان
-ویکی‌پدیا،
-مجاز
-محاسبه
-بزنید
-جنگل
-مجموعه‌های
-واقعیت
-سان
-قومی
-صفحه‌ها
-قطب
-تالار
-خواب
-تاکید
-گاه‌شماری
-امین
-لذا
-آسیب
-هیات
-قد
-میلیارد
-کوچولو
-برقرار
-بالایی
-شیعیان
-قاضی
-برگرفته
-عنصر
-معانی
-ارتباطی
-شبکه‌های
-درود،
-۳۰۰
-مراحل
-لهستان
-معمولی
-نوار
-محس
-۸۹
-قبیل
-سیر
-دهیم
-شاخص
-عیسی
-ترور
-دمای
-تکامل
-کبیر
-درگیر
-سونی
-یاری
-۱۹۵۰
-آگاهی
-نیوز
-پیوست
-رچ
-خدای
-کودکی
-مرتب
-رژیم
-روبات
-ابتدایی
-میتوان
-هشتاد
-زادهٔ
-کشت
-بازسازی
-وسایل
-بتوان
-مجارستان
-پیاده
-میان‌ویکی
-فرمانده
-۸۷
-تهدید
-ویک
-محرم
-نهم
-احمدی‌نژاد
-۶۵
-خورد
-رسول
-تمیزکاری
-بندانگشتی
-گیاهی
-سیاست‌ها
-این‌که
-کلیه
-بهشت
-هندی
-مشکوک
-فکری
-عقیده
-اشغال
-نویس
-ستون
-خارجه
-۱۳۸۶،
-۸۶
-نمی‌گیرد
-کارخانه
-دانشجو
-پیوسته
-خاطرات
-پادشاهان
-۱۹۶۷
-غذا
-زرتشت
-سود
-خوشحال
-رساند
-آر
-فیلمی
-می‌پردازد
-تری
-لایه
-سپهرنوش
-ظاهرا
-مصدق
-کویت
-مال
-احداث
-کانون
-مد
-فرماندهی
-مرحوم
-مواجه
-۱۳۹۰،
-بايد
-افتاده
-دوم،
-گردیده
-کارل
-وگرنه
-ندارد،
-ترجمهٔ
-ساحل
-جم
-طرفی
-نگهدار
-شرط
-روان
-آبتین
-جوانبخت
-سازهای
-الکترونیکی
-پور
-نود
-جمعی
-راحتی
-حیوانات
-داروهای
-دستگیر
-بابک
-حداکثر
-دانش‌آموختگان
-حلقه
-راستای
-اراک
-نادر
-اثری
-زبانهای
-برندارید
-رشته‌های
-بستن
-برگردان
-آبشارها
-ریزی
-مراغه
-دروازه
-پذیرش
-نمایی
-مدیریتی
-منصفانه
-واژهٔ
-جانب
-متعددی
-رسد
-گوید
-شغل
-زاهدان
-نمای
-رواج
-واضح
-عده‌ای
-می‌مانند
-ایوان
-چوب
-نکند
-فلسفی
-معنا
-نمی‌تواند
-خورده
-سو
-باند
-ماهواره
-مرغ
-دشمن
-کوه‌های
-سرطان
-دبی
-پرداخته
-ایکس
-آشکار
-کاشان
-بغداد
-ببخشید
-ششمین
-منظورم
-جلب
-دیر
-مـهـران
-زند
-مناسبی
-خانگی
-تجزیه
-بالغ
-می‌داند
-علامه
-جولای
-برگ
-سیستم‌های
-سیستم‌عامل
-کاوه
-۷۵
-دراپر
-مدارس
-ظاهراً
-رنگی
-دهه‌ها
-چیست
-تظاهرات
-مربی
-سازمان‌های
-برپایه
-متشکرم
-دوازده
-ایراد
-گیتاشناسی
-می‌برد
-اسامی
-او،
-دارد؟
-بورکینافاسو
-تجهیزات
-شاهزاده
-دربار
-دانم
-زاویه
-قاره
-رهبران
-سرود
-ابهام
-۱۳۷۵
-ایمیل
-پیغام
-فرآیند
-دالبا
-پستی
-ظرفیت
-بشه
-سیتی
-هستیم
-پرتاب
-کمدی
-توی
-فجر
-این‌جا
-گرگان
-می‌دانم
-جواد
-شاتل
-خطاب
-الهی
-گرایش
-ملا
-دانشمند
-فیلتر
-نسبی
-شوم
-داستان‌های
-نمایشگاه
-تربت
-ممنونم
-آگوست
-پایدار
-مشارکت‌هایتان
-منطقه‌ای
-تنگ
-مقیاس
-شریک
-جزئی
-هویت
-بدهد
-نوشتهٔ
-بابا
-ادیان
-۱۹۶۵
-جورج
-هفتمین
-تصرف
-آهنگساز
-پاورقی
-دلیلتان
-حس
-کوچه
-رقابت
-نمایند
-رها
-مقامات
-منطقهٔ
-قلعه‌های
-فن
-مادرش
-متخصص
-تکنولوژی
-سالی
-کیفیتی
-زمین‌شناسی
-می‌دهم
-مک
-کشتار
-سنگین
-می‌نویسد
-نکردم
-ید
-پرو
-بدان
-باران
-دخالت
-درختان
-جوانی
-آنگاه
-حسب
-حرفه
-سندی
-چگونگی
-تبار
-توافق
-کتابهای
-اطلاق
-نامناسب
-مایکروسافت
-۱۹۶۶
-ارشاد
-فردوس
-صوتی
-روزگار
-نمودند
-سگ
-دارو
-خاورمیانه
-معلم
-گره
-ون
-سوخت
-مترو
-آموخت
-نشده‌است
-شماست
-هتل
-حدیث
-نداریم
-پیدایش
-۱۳۷۰
-میانی
-کنند،
-عقاید
-پیچیده
-قهوه
-فرشته
-نحوهٔ
-عجیب
-جداگانه
-هشتمین
-جزئیات
-همشهری
-مبنی
-کاتولیک
-اصفهانی
-حملات
-جاری
-پویان
-انگلیسی،
-برخلاف
-نيست
-اشخاص
-مجید
-سیمای
-کانی‌های
-تغذیه
-مربیگری
-برنامه‌نویسی
-‌پدیا
-فدراسیون
-اجرایی
-سیصد
-احمدآباد
-می‌خواهید
-جنگ‌های
-پیگیری
-حوادث
-اخیراً
-دیجیتال
-تکیه
-مریم
-الی
-۱۹۴۸
-كند
-عده
-اقدامات
-شعاع
-تخیلی
-ماه‌های
-۶۶
-آزمایشی
-شده‌است،
-واژه‌های
-دشتی
-موافقت
-قهرمانان
-جلال
-اچ‌دی
-الفبای
-نفس
-پایانی
-پانصد
-برایش
-ترجیح
-خواند
-سلول
-عصبی
-کوخرد
-آب‌انبار
-۶۲
-مفاهیم
-شنبه
-بالاخره
-دانسته
-هواپیمای
-نهمین
-ایالتی
-مو
-فارغ
-پلی
-دروغ
-اداری
-استقبال
-مسئولیت
-داده‌اند
-فدرال
-ترانه‌های
-نوازندگان
-چای
-دههٔ
-تراکم
-فهرست‌های
-مردی
-زمرہ
-گورستان‌های
-سوالات
-عباسی
-سردار
-محک
-ترکیبی
-رقم
-سعودی
-نرم‌افزارهای
-بازرگانی
-برلین
-نروژ
-مارتین
-فوت
-دیدنی
-کنفرانس
-فارسی،
-اهر
-نجف
-پذیرفته
-اینست
-ملکه
-سرخط
-كرده
-زنی
-قلمرو
-بخصوص
-امی
-بهائی
-نقاش
-کازرون
-تار
-گرفته،
-نظم
-۷۲
-خودداری
-شمس
-صفحه‌ای
-بیمار
-واقعه
-هادی
-۸۴
-خاتمی
-بارسلونا
-سرچشمه
-زنز
-برچسب‌های
-منتخب
-بحرین
-واشنگتن
-پاتر
-کرده‌ام
-شاهین
-زرین
-مارک
-توپ
-وقوع
-حدی
-آذری
-شاگردان
-معبد
-آرمان
-۱۹۶۲
-بیماری‌های
-بچه
-فعالان
-کوروش
-دارویی
-اوقات
-اوست
-می‌کنند،
-قضاوت
-ین
-دست‌اول
-فریدون
-تئوری
-نمی‌توانید
-دوستی
-حقیقی
-زندانی
-مقطع
-راستش
-۱۹۶۳
-شاپور
-۱۹۵۶
-آکادمی
-بازنویسی
-ارمنی
-۱۹۶۱
-مهران
-مردمی
-ندارید
-گذاشتن
-کوتاهی
-فقه
-تنکابن
-درجه‌بندی
-ژنرال
-مایع
-طرفداران
-مدارک
-بدلیل
-پیشنهادی
-باشند،
-ذرات
-دانشجویی
-نگارخانه
-نیت
-کیلوگرم
-سردشت
-ایده
-تسلیم
-برادران
-هزاران
-حادثه
-مرتضا
-خواستار
-نهضت
-نرسی
-آمیز
-استودیو
-قدمت
-مجموعهٔ
-مغناطیسی
-قطعات
-عمران
-توجهی
-فیلم‌ها
-كار
-۶۳
-رسم
-درب
-مبتنی
-امواج
-تمایل
-احزاب
-روحانی
-اردن
-۶۱
-عمارت
-می‌دانید
-گفتار
-دزفول
-داوری
-کا
-حقوقی
-زمستانی
-فولاد
-امریکا
-مزرعه
-بوده،
-رساله
-رامین
-جراحی
-محقق
-ابزارهای
-ویکی‌
-پزشک
-قبلاً
-ضلع
-سرور
-مجاهدین
-اخلاق
-گراف
-مانع
-مشارکت‌کنندگان
-قشلاق
-نوازنده
-پرده
-۱۹۵۳
-شیروان
-کاظم
-اریکسون
-طیف
-مسکو
-۱۹۳۰
-۶۸
-مقابله
-لوله
-علی‌آباد
-واقعاً
-معدنی
-طباطبایی
-شاهان
-تاريخ
-ودر
-ماهان
-یوشیمیتسو
-۱۹۴۵
-نمونه‌هایی
-البرز
-چهارمحال
-مالزی
-۱۹۵۸
-خودرویی
-بیاورید
-آبادی
-مخابرات
-می‌دهید
-رودبار
-جور
-یحیی
-كتاب
-وین
-می‌داد
-غلامرضا
-طایفه
-سطر
-خواهیم
-جانشین
-اقامت
-توده
-مشارکت‌های
-برود
-جویا
-می‌روند
-نتیجهٔ
-اختیاری
-اساتید
-آگاه
-ساوه
-قدس
-ناخالص
-چرخ
-پردازش
-خرم
-به‌
-کاربردهای
-فیلسوفان
-طب
-زمانه
-وحدت
-افغان
-منوچهر
-طرز
-بوسیله
-مدیری
-اخذ
-اصلاحات
-فرهاد
-۱۳۷۳
-بایرن
-تور
-۸۲
-بست
-راحت
-تقلید
-لهجه
-قرون
-افسانه
-۶۷
-منزل
-۰۰۰
-رکوردز
-تأثیرات
-افتتاح
-بزرگتر
-هندوستان
-نقره
-بهشتی
-پذیر
-عظیم
-سیم
-خواص
-اعتراضات
-سخنان
-رزیدنت
-مسجدهای
-هرگونه
-می‌آورد
-این‌ها
-دقیقاً
-بسکتبال
-صوت
-بوئین
-۱۲۰
-۱۵۰
-شور
-زودی
-توانند
-سربازان
-رویداد
-خب
-بنیان
-چلسی
-زیبای
-شورش
-خامنه‌ای
-برایم
-درخواستی
-روان‌شناسی
-جسم
-ممنوعیت
-اهورا
-چقدر
-ابوالحسن
-سالن
-صحت
-می‌خواهد
-۹۶۴
-نرخ
-اختلال
-رویدادهای
-خراب
-تونی
-دایره
-دبیر
-۸۱
-۱۳۶۸
-دانشگاه‌ها
-تقویت
-زلزله
-دهانه‌های
-کوهستانی
-محض
-۱۹۵۴
-نبودن
-بين
-کارکنان
-جملات
-خاکستری
-دادید
-فرایند
-دارا
-وفيات
-چهارصد
-خصوصیات
-چارلز
-گفتند
-ستاد
-۱۰۰۰
-پیتر
-انگلیسی‌زبان
-مجتمع
-وسعت
-می‌شدند
-۱۳۷۴
-نیروگاه
-گذار
-قوچان
-تحصیلی
-دهی
-میلان
-نمی‌کنم
-فرم
-پستانداران
-گردن
-۱۳۷۲
-۱۹۴۰
-جناح
-شوشتر
-پذیری
-لیبی
-اسلامی،
-بحث‌های
-سوء
-همسرش
-قفل
-اسکندر
-تحلیلی
-تحمل
-فعلاً
-۱۳۵۴
-میوه
-مصنوعی
-ارزیابی
-روزانه
-مدعی
-دانمارک
-فرستاده
-شناسه
-صبر
-شطرنج
-گفتید
-وسیع
-گام
-گوشت
-کرده،
-رصد
-کوهدشت
-اینطور
-نوجوانی
-ملت‌های
-محمدی
-۶۹
-لشکر
-بزرگراه
-۱۹۵۲
-پاینده
-۴۰۰
-جانبی
-ایول
-تجدید
-نیست؟
-حامد
-نشریات
-توماس
-مجازات
-قیام
-گپ
-سینا
-۷۸
-بس
-وظایف
-کوهستان
-اینجاست
-میدهد
-کارها
-سالها
-یادبود
-آبادان
-طبس
-خوردن
-روزه
-مسکونی
-اعظم
-دموکرات
-خشونت
-۸۳
-هوشنگ
-تخصص
-سیما
-منظر
-علمیه
-سالم
-پیکسل
-کمکی
-خواسته
-ایرج
-مدنی
-گفتن
-آذربایجانی
-ره
-اتمام
-آلاباما
-۱۹۲۰
-ابی
-بام
-فقیه
-کیلومترمربع
-عوارض
-۱۳۵۰
-ترس
-بازگردانی
-سعدی
-موثر
-کلیبر
-انقلابی
-وبسایت
-روانی
-موردی
-دختران
-روس
-بم
-پاک‌کن
-داشته‌اند
-یوتی‌سی
-صدها
-پانویس‌ها
-نفتی
-ورزقان
-کمبود
-نابود
-فرانک
-دان
-۷۶
-جرج
-جدایی
-کیهان
-نامش
-تبریزی
-کتیبه
-حکومتی
-قسمت‌های
-صرفا
-۷۱
-اندازی
-قدم
-منحصر
-عموم
-پهنای
-پدیده
-روغن
-رسانه‌های
-اطلاعات،
-سایت‌ها
-اکران
-سلامت
-بالاترین
-پیروی
-۱۹۵۱
-مصداق
-۷۳
-شکار
-مباحث
-پوویا
-فاصلهٔ
-فاز
-۷۷
-حالیکه
-شهریار
-۱۹۵۷
-درخشان
-آن‌جا
-تنهایی
-نکرد
-عدالت
-می‌نماید
-مقبره
-سانسور
-داده‌ها
-شاهرود
-تخمین
-نشست‌های
-۱۹۳۶
-جین
-روبرو
-پس‌زمینه
-نیرو
-اخلاقی
-داستانی
-سینه
-شاهنشاهی
-مولانا
-گاو
-استخوان
-گرگ
-دکتری
-اند،
-کشف‌های
-سنندج
-۷۴
-ساحلی
-برهان
-پیش‌نمایش
-کردم،
-دوره‌های
-۱۳۵۶
-آغازین
-سالانه
-بستگی
-تخم
-۹۹
-سیگنال
-ویکی‌پروژهٔ
-ناقض
-خودمان
-کرد؟
-ویرایشگران
-داوران
-برداشته
-۱۳۷۱
-یکمین
-ریزشگاه
-سوار
-سلاح
-شایسته
-سفیدپر
-غزه
-ترکیبات
-لاله
-اولی
-گذر
-جک
-ذیل
-دراز
-۹۵
-پان
-درصورت
-ایرانشهر
-عرصه
-پیروان
-پردازنده
-زایش
-مدینه
-انفجار
-کمپانی
-فرشتهٔ
-واحدهای
-حرارت
-بعداً
-۱۹۴۹
-همینطور
-استخراج
-ملاقات
-فرو
-پارامتر
-منتقدان
-آزمایشگاه
-نوشته‌شده
-اصطلاحات
-بتوانند
-مشتری
-متوقف
-اجباری
-مسلح
-سلجوقیان
-کندی
-اسکاتلند
-فیلسوف
-می‌سازد
-زود
-۷۹
-رجبی
-هفتصد
-تقی
-معدن
-مار
-فراز
-ایالت‌های
-ایمان
-ابراز
-ممسنی
-رادیویی
-سرکوب
-پیوندها
-۱۹۵۹
-توزیع‌کننده
-کشید
-بال
-۱۳۵۸
-۱۹۵۵
-شفاف
-کلام
-یکبار
-رصدخانه
-موسوم
-صلاح
-اخیرتان
-کالج
-واز
-شیکاگو
-جنبه
-۱۳۶۹
-عاشق
-کک
-خنثی
-امیرکبیر
-آنقدر
-زبان‌شناسی
-مشاور
-نمایشگر
-دا
-مِنْ
-آرزوی
-آئین
-می‌آیند
-شکلی
-۱۳۶۰
-سقف
-فرامرز
-بحث‌ها
-همت
-خیام
-تصادفی
-میتواند
-تجاوز
-روح‌الله
-روستاها
-هواپیمایی
-گلدن
-منظورتان
-کرمانی
-قله
-ضربه
-ساکنان
-اورشلیم
-مجدد،
-ویکی‌پ
-معتقدند
-۱۹۳۸
-محیطی
-جعفری
-خطا
-ویروس
-نگار
-سال‌ف
-ابراهیمی
-هشتصد
-نکنم
-ذوب
-رایت
-هاست
-متنی
-نان
-اضافی
-باله
-اصغر
-تایلند
-را،
-پیانو
-سکونت
-تالیف
-اختصاصی
-بهتری
-ترابری
-چو
-دیو
-زندگی‌نامه
-شیشه
-قلبی
-تحریک
-کیش
-ستاره‌ای
-اختراع
-برآورد
-سزار
-دهستانی
-مجسمه
-برطرف
-سپرده
-پارلمان
-رمز
-درسی
-سپاهان
-منصوب
-۱۹۴۱
-پروانه
-جمع‌بندی
-فعل
-کربن
-دژ
-تفکیک
-قفقاز
-همراهی
-عبدالحسین
-بسيار
-مواليد
-۲۵۰
-پیرو
-معاونت
-پیرانشهر
-۹۱
-معنوی
-کاروانسرای
-دفن
-سیزدهم
-ند
-اینقدر
-هخامنشیان
-دستگیری
-گل‌های
-می‌خواهم
-گیرند
-متفاوتی
-شیلی
-مراکش
-کنسرت
-بدهم
-تومان
-کهکشان
-اوضاع
-اندونزی
-چنانچه
-جایزهٔ
-بدهند
-کروبی
-سکه
-گرفته‌اند
-می‌شوم
-تضاد
-ملایر
-شیطان
-سهم
-اخطار
-حرم
-موافق،
-هیتلر
-واسطه
-ناظر
-نمودار
-بگوید
-تیمور
-قصر
-مکانی
-فرودگاه‌های
-۱۹۴۶
-جهاد
-مقداری
-داد،
-اندک
-دکترای
-فیلیپ
-۱۹۳۳
-کارگران
-آماری
-۹۸
-تست
-هستی
-میزبان
-تقاضای
-اوبلاست
-شیوه‌نامهٔ
-من،
-محتوا
-مربیان
-دیسک
-معتبری
-زدایی
-صعود
-حکمت
-مخفی
-زمینهٔ
-دهان
-گو
-رمضان
-ششصد
-هم‌اکنون
-شکسته
-‌است
-حرفی
-۹۶
-هواداران
-تبعید
-نشین
-توجیه
-مکه
-جاذبه‌های
-منافع
-بیفزایید،
-عرفان
-کشی
-آمریکایی‌های
-عقل
-وفات
-سیب
-پربارتر
-کنه
-تألیف
-بنیانگذار
-دموکراسی
-نهصد
-یادم
-سراسری
-تفکر
-لارستان
-برگزیدگی
-رباط
-لس
-حساس
-حبیب
-ویکی‌پدی
-فرود
-همکاران
-تشویق
-تحویل
-باقری
-داده‌های
-معرض
-گلوب
-کلیسا
-ویکی‌پد
-کف
-۱۳۶۷
-امضای
-بخواهیم
-خالد
-فلزی
-نظرخواهی‌ها
-آیات
-درگذشته
-شباهت
-هم‌چنین
-تعلق
-بگیرند
-گوناگونی
-نایب
-حساسیت
-کارگردانان
-مغول
-سازمانی
-دیا
-داغ
-خواهی
-فشرده
-ماجرای
-زندانیان
-تصاویری
-بیماران
-کهنه
-مکمل
-بخواهید
-رایگان
-رویه
-ماری
-فرمایید
-بلورین
-فورد
-درخواست‌های
-سازد
-پروتکل
-راس
-فرقه
-وفق
-نازی
-احتمالی
-طلب
-اقماری
-محدودیت
-همایون
-۱۱۰
-هیأت
-احسان
-ابرخس
-بخواهد
-له
-مهرداد
-می‌شوند،
-سکوت
-مهاجر
-صدور
-بازیگری
-آسان
-سراغ
-اولا
-محلول
-وان
-کوی
-الکساندر
-لیسانس
-خزر
-۹۲
-شکنجه
-امیررضا
-گرجستان
-بازرسی
-عکاس
-۱۳۶۲
-آسیاب
-گویی
-شود؟
-حیاط
-موجهی
-ارکستر
-ارباب
-نویسندهٔ
-یخ
-السلام
-نسب
-بوی
-۱۹۴۷
-نمي
-اعضا
-خانوادهٔ
-ویکیپدیای
-سحابی
-شاهی
-شیوهٔ
-زیارت
-تحقیقاتی
-فعالیتهای
-کاغذ
-تهرانی
-پروفسور
-بریتانیایی
-اخیرا
-ایرنا
-مادرید
-۱۳۵۵
-زمینه‌های
-ببینم
-۱۹۳۴
-می‌بینید،
-فیفا
-صالح
-متداول
-ربط
-سطوح
-ی‌پدیا
-خواهدشد
-بحران
-۱۹۳۹
-افکار
-پیراهن
-۱۹۳۲
-انتظامی
-بلافاصله
-ارایه
-کمیسیون
-راز
-محمدحسین
-آبیلا
-محبوب
-سایه
-جوامع
-داور
-۱۹۰۰
-زودتر
-ولز
-سوخته
-تأیید
-ابوالقاسم
-برادرش
-بمب
-امتحان
-آرتور
-فرستاد
-صص
-دانشجوی
-کارگر
-هوش
-اتفاقا
-غلامحسین
-قربانی
-می‌خورد
-احکام
-سرزمین‌های
-ضمناً
-فینال
-قبرستان
-ضعف
-نامهای
-گندم
-قواعد
-تند
-تایپ
-ماموریت
-موسیقی‌دانان
-گوشه
-دری
-مناسبت
-ارقام
-چاراویماق
-مبانی
-گذاشته‌اید
-ابر
-مدخل
-یو
-شناس
-اندازهٔ
-غالب
-قنات
-مبتلا
-ویکی‌فا
-نوزدهم
-مونیخ
-کابینه
-میرحسین
-باقر
-۱۹۳۵
-سامان
-هلندی
-موجودات
-فنلاند
-برعهده
-مدافع
-قطار
-تغییرات،
-فرمانروایی
-واگذار
-حکیم
-آهنگسازان
-شوند،
-تحول
-مرکب
-مقادیر
-اختیارات
-نوشتاری
-چندانی
-جان،
-هکتار
-رازی
-محله‌های
-آوردند
-صف
-مقاله،
-تدریج
-نیستید
-تسلط
-اسلام‌آباد
-آزمون
-ویرایشاتشان
-اصولا
-صفت
-۱۹۳۷
-می‌شد،
-سفیر
-تمرکز
-شهروند
-نمودن
-ویتنام
-نمایندگی
-گردش
-سران
-فر
-ایمنی
-خو
-مشارکت،
-پسرش
-می‌ماند
-متروی
-ختم
-علمای
-۱۳۶۴
-ران
-کودتای
-قهوه‌ای
-دایرة‌المعارف
-لنگه
-درونی
-سرا
-خاموش
-منصب
-ماد
-دومی
-کشور،
-سوادکوه
-خدایان
-بی‌طرف
-ماجرا
-دماوند
-بردسکن
-ویکی‌نویس
-ماهنامه
-یادگیری
-قابل‌
-هاشم
-همگان
-روانشناسی
-محمدآباد
-نگهبان
-آفرید
-گیرنده
-۱۳۵۲
-۱۳۸۹،
-ترکان
-هوی
-دندان
-خوش‌آمد
-گرفتم
-پایهٔ
-دانلود
-جفت
-فهم
-گوشزد
-متشکل
-رسمیت
-مقدماتی
-جویباری
-پيش
-کنیم،
-استانداردهای
-سرجعبه
-آنجایی
-خیریه
-بیش‌تر
-في
-دکمه
-ماندگار
-فیروزآباد
-بخار
-فیلیپین
-جلگه
-آرامش
-۹۳
-رونق
-پاسداران
-میتوانید
-کاووس
-۱۳۵۳
-۶۰۰
-مرو
-نیافتید،
-نداره
-نجفی
-الهام
-میکنید
-ناصرالدین
-قصه
-آمدند
-پراکنده
-خواهان
-روي
-مرودشت
-مسیحیان
-عبدالهی
-حسابی
-پاییز
-جانبدارانه
-کی‌پدیا
-حین
-پلی‌استیشن
-اعصاب
-می‌توانیم
-فرح
-نمک
-به‌طور
-۹۷
-۱۳۵۹
-گرافیک
-زمین‌لرزه‌های
-منتهی
-مستقر
-تقدیر
-۱۹۳۱
-می‌رفت
-افسانه‌ای
-برخط‌اند
-آبشارهای
-برخوردی
-عکسی
-خاور
-مورخ
-جمال
-باتجربه‌ترند
-به‌کار
-مطالبتان
-راه‌آهن
-نفع
-پاجعبه
-نسخه‌های
-بدی
-آکادمیک
-امتداد
-یوشیچی
-رضاشاه
-تأمین
-خواهشمندیم
-لو
-رئال
-خراسانی
-سردر
-آشپزی
-ایرانیکا
-شاگرد
-سرای
-یزدی
-نامزدهای
-وکیل
-نقشهٔ
-اکسیژن
-شفافیت
-یکی‌پدیا
-مقیم
-ویل
-یادآوری
-بلوری
-شعاعی
-قائم
-آلن
-استانبول
-بکنید
-عمیق
-تایمز
-سلماس
-بی‌طرفی
-بیل
-بویژه
-تک‌آهنگ‌های
-می‌باشد،
-جماهیر
-وحشی
-نمایشنامه
-روایات
-غنی
-کسروی
-بازتاب
-شاملو
-اروپای
-برنج
-بيشتر
-اخراج
-جمعیتی
-اخترسنجی
-شوش
-خوشنویسی
-تقاضا
-مکان‌های
-کریمی
-۱۹۲۹
-دفاعی
-برگشت
-کنید؟
-معمار
-خوش‌حال
-قوه
-۱۳۶۵
-اکسید
-لاهیجان
-آئیله
-عقاب
-پائین
-سوالی
-کنم،
-مان
-خواف
-انجیل
-محاکمه
-ور
-كنيد
-میخی
-مرزهای
-روشی
-بل
-آداب
-زرتشتی
-باشی
-جهرم
-آور
-شهادت
-رسیده‌است
-سادات
-زحمات
-بنویسم
-شریعتی
-بان
-مرتبه
-آثاری
-شه
-کابلی
-تویوهارا
-بیجار
-می‌زند
-نگران
-کر
-سیرجان
-اماکن
-ایلخانی
-ماست
-گزینه
-دوشنبه
-شواهد
-قاعده
-موازی
-شتاب
-۱۳۶۶
-حال،
-ویا
-می‌برند
-۱۹۲۴
-نت
-نجومی
-تعارض
-سادگی
-۱۳۰
-خلافت
-تأثیرپذیرفته
-طبری
-تعقیب
-کاشانی
-منع
-توضیحی
-دورود
-حبس
-بهایی
-محاسبات
-بگوییم
-تنوع
-معادله
-۱۳۵۱
-کوچکتر
-جوی
-دورنما
-شرایطی
-فرماندار
-هریوا
-پی‌گیری
-۱۹۲۸
-می‌نامند
-فومن
-الجزایر
-سیاست‌مداران
-۹۴
-مقدم
-طرفین
-چمن
-صفویه
-یر
-نابودی
-رفسنجانی
-معادن
-۱۳۴۷
-نیل
-سانتی
-دام
-نامه‌ای
-ات
-یافته‌است
-می‌دارد
-بقعه
-۸۰۰
-پرتو
-قید
-ظرف
-لری
-قدیمی‌ترین
-انسان‌ها
-برنامه‌ریزی
-وسطی
-مسلم
-چالوس
-پیشتر
-پوشیده
-فرزان
-میشوند
-منظم
-تلفن‌های
-خوشحالم
-تجمع
-رنج
-آباد،
-مختصر
-هماهنگ
-روشهای
-لفظ
-چوبی
-همين
-شادی
-وسیعی
-گور
-کردیم
-تندیس
-مواقع
-الیگودرز
-نسبتاً
-هٔ
-مخصوصا
-شی
-مشهورترین
-می‌خواستم
-انها
-نهنگ
-حرکات
-دنباله
-قانع
-۱۹۴۲
-داوود
-می‌کردم
-جاوا
-تعادل
-پزشکان
-نحوی
-مادی
-ردهٔ
-گذاشتم
-۱۳۶۳
-کمان
-بعدا
-شرمنده
-ویراستار
-ایام
-اسلواکی
-ناراحت
-متحرک
-تجربی
-خاصیت
-گیلانغرب
-کشتن
-مرزی
-پرچم‌ها
-ذهنی
-لر
-مساوی
-رستمی
-کرم
-ازبکستان
-رضایی
-احیا
-هنگ
-توانم
-شکر
-مند
-کمتری
-بردارید
-قبر
-فرعی
-ایم
-معارف
-پیوندی
-اطلاع‌رسانی
-بسازید
-کردند،
-کلیدی
-سيستم
-لغو
-بسیج
-سرنوشت
-شاخه‌های
-طرفدار
-سیاوش
-کشیدن
-پناه
-هشترود
-ورزشگاه‌های
-صفحه،
-عارف
-ابرکوه
-،خرد
-دراین
-بایر
-قلی
-دشوار
-بیزانس
-بهانه
-جالبی
-قبیله
-بیژن
-چنانکه
-می‌
-بیانیه
-آلفا
-کارگاه
-استوار
-کش
-پویا
-چیزهایی
-نمی‌کنند
-رهنمود
-وصل
-کریس
-پسوند
-مهاجم
-جامعه‌شناسی
-مجددا
-ایر
-احتیاج
-متأسفانه
-خودکشی
-۱۳۴۸
-مراتب
-یازدهم
-خام
-نوجوانان
-بدانم
-طنز
-چهره‌های
-شبانه
-دامغان
-مقصد
-وزیران
-لوح
-شهرام
-بده
-جلا
-دشتستان
-روزنامهٔ
-چهارشنبه
-دالاهو
-ضریب
-تکنیک
-سرخس
-ولي
-دکترا
-آنجلس
-خرس
-مجتبی
-نهاوند
-مسیه
-حسینیه
-كنند
-ملاک
-۳۶۰
-هندسه
-ابو
-کامپیوتری
-۱۳۴۵
-۱۰۱
-صندوق
-بلی
-آقایی
-قالی
-۱۹۲۵
-اشتغال
-اوستا
-خاش
-باتری
-قربان
-رمان‌های
-زير
-خالص
-زدم
-باشد؟
-توقف
-دوستانی
-اجتماع
-کوهی
-کلاه
-قائل
-فلز
-مطلوب
-گربه
-نگرانی
-زوج
-یار
-سرپل
-نوروزی
-۱۹۲۶
-الآن
-اختلالات
-بریتانیکا
-ايجاد
-آزار
-سا
-پروتئین
-بادی
-مجزا
-سانتیمتر
-اله
-پسران
-۱۳۴۶
-دروس
-کور
-مطلع
-نستعلیق
-خطرناک
-لوگوی
-دنده
-ویژه‌ای
-بهینه
-الکترون
-سقز
-عددی
-کاش
-جیرفت
-راسته
-بتوانم
-نسبتا
-یازده
-کمیل
-مانفی
-انتخابی
-نداشتن
-حرکتی
-کمترین
-مرورگر
-مقاله‌ی
-برنز
-انشای
-فراتر
-وسیلهٔ
-انزلی
-سوم،
-آشور
-اجزای
-روزنامه‌های
-نداشتند
-برتری
-توقیف
-گنجایش
-نویسندگی
-واشینگتن
-وَ
-عبد
-ماهیت
-ترکمن
-تابش
-برف
-اثرات
-نمایشی
-است‌
-حدس
-بین‌الملل
-۱۹۲۳
-راوی
-بامداد
-تنگه
-گذراند
-اتفاقی
-هالیوود
-گشته
-اسمیت
-باش
-آلی
-ترکمنستان
-سوسیالیستی
-مجلات
-۱۹۱۸
-بدنه
-قاهره
-خانهٔ
-بید
-ایرانی،
-۱۳۴۰
-پری
-اشتباهی
-نهاده
-وب‌سایت
-شهروندان
-همایش
-خوان
-نژادی
-عملیاتی
-افزود
-مخلوط
-رودسر
-الیزابت
-نمونه‌ای
-مغزی
-قضایی
-یان
-گالری
-بگو
-ملقب
-ایفا
-انیمیشن
-بخش‌هایی
-شکستگی
-سوپر
-کانی‌شناسی
-ویتامین
-می‌دادند
-پرجمعیت
-درسال
-۱۰۵
-ستاره‌های
-مدیا
-بندپی
-تردید
-كشور
-ماهیان
-پوزش
-انگار
-اسلام،
-ايشان
-سرپرستی
-تاکستان
-۱۹۲۷
-۱،
-پذیرفت
-نما
-مشتق
-باستان‌شناسی
-امامی
-اتم
-ندیدم
-نوشهر
-گزیدن
-۱۹۱۹
-حیوان
-بنظر
-کورش
-اواسط
-رفتند
-تبادل
-میلی
-استون
-دانستن
-آمریکا،
-حصار
-آینه
-گرایی
-قبایل
-کبیسه
-۱۹۴۳
-۱۹۱۲
-۱۹۱۷
-برقراری
-فيلم
-نداشتم
-سرده
-فعالیت‌ها
-بوستان
-خیال
-کارش
-کربلا
-کنم؟
-سیاست‌مدار
-معنایی
-آلودگی
-شماری
-کودتا
-پانزده
-المعارف
-کالبدشناسی
-عظیمی
-علائم
-کنسول
-نحو
-سوئدی
-گرفت،
-مازندرانی
-مثال،
-منسوب
-نشدم
-ویران
-درخشندگی
-بندرعباس
-ارگ
-سامانه‌های
-بیمه
-انجامید
-اردکان
-متمرکز
-سلولی
-مرسوم
-صادقی
-هيچ
-امثال
-ولتاژ
-مقررات
-رکورد
-بلخ
-نامزدی
-پردیس
-راه‌های
-‌ای
-مانده‌است
-هدیه
-خاکی
-کلاً
-كنم
-جویبار
-گرجی
-سنجش
-بو
-مثلث
-جمهوری‌های
-خاتمه
-رشتهٔ
-بوش
-حسین‌آباد
-۱۳۴۹
-جنگلی
-عزل
-مزار
-اختلافات
-زاکسن
-عشایر
-دشمنان
-کنگ
-یهودیت
-الگویی
-فرکانس
-تحریف
-پژوهش‌های
-شام
-لار
-می‌بینید
-مریخ
-علی‌اکبر
-عامه
-روزها
-زخمی
-عبارت‌اند
-ویکی‌های
-بری
-کارائیب
-رده‌فرد
-رحیم
-نگاشته
-القاب
-قاتل
-مکرر
-محمد،
-ابداع
-ویدئو
-اسطوره
-جامد
-ژنتیک
-مجاور
-سیاسی،
-رفسنجان
-بعید
-مرند
-روحانیون
-اریک
-قریب
-نثر
-تحریم
-موزیک
-برداشتن
-ارتفاعات
-اشکالی
-غذاهای
-شهاب
-بورس
-سال،
-نقشه‌های
-عروس
-نخل
-محلات
-آلبرت
-فا
-دشمنی
-۱۹۴۴
-يكي
-جایگزینی
-تفاصیل
-خدابنده
-اقلیت
-مشخصی
-محاصره
-زین
-افتخارات
-این،
-بي
-سواحل
-اندام
-فرماندهان
-دانند
-دوازدهم
-بجز
-آرا
-بهائیت
-۱۹۲۱
-کالا
-استقرار
-تلخ
-تکه
-جلوه
-امان
-نگونبانگونی
-فیلمنامه
-مترجمان
-کتاب،
-بستر
-تولیدی
-باغ‌های
-نباشند
-انصاری
-محمدتقی
-ان‌جی‌سی
-سلمان
-پهن
-گستره
-سودان
-پرهیز
-همون
-موسسات
-جاهای
-اشرف
-سواد
-مصوب
-دانه
-اينكه
-شعبه
-تشیع
-اپرا
-مجری
-موضع
-۱۴۰
-گلوله
-دارایی
-آوردم
-۱۸۰
-بلد
-سیروس
-گرمسار
-مهارت
-پیشاپیش
-ساختمانی
-باختر
-نامید
-ایفای
-باریک
-تعجب
-عقد
-فرمودید
-وطن
-گوی
-قبرس
-محبوبیت
-کوچ
-جدید،
-اخترشناسی
-کلمهٔ
-ایذه
-احوال
-پراکندگی
-ویرایش‌ها
-سانتا
-نپال
-چرخش
-فخرالدین
-دستگاه‌های
-پاراگراف
-می‌توانم
-پیکر
-بعد،
-جای‌ها
-یاران
-بیگ
-پنجره
-رامسر
-خواه
-انکار
-می‌کشد
-۱۹۲۲
-برعکس
-پاره
-اکشن
-لغات
-گردآوری
-سهراب
-نیز،
-عراقی
-پاسارگاد
-نوجوان
-مخفف
-هیچگاه
-کاندید
-بهروز
-بناب
-تهمت
-آفریقایی
-جسد
-پژوهشگران
-موسس
-بلاگ
-آبخواره
-مایه
-مجدداً
-لقب‌ها
-تلسکوپ
-استانی
-منتقد
-داراب
-دلخواه
-فرش
-بارگذاری‌شده
-صحرای
-نوک
-فارسي
-رسانه‌ها
-ماکو
-۱۳۶۱
-استفادهٔ
-دستیابی
-سرو
-بردار
-آلبوم‌ها
-مکعب
-تب
-می‌گرفت
-وی،
-قطعی
-اقبال
-پلاک
-برابری
-جوش
-التحصیل
-بردند
-شارل
-خشم
-سارا
-گناه
-حوصله
-بیافزایید
-اصیل
-خودمختار
-نمی‌دهد
-داند
-سراوان
-صور
-یعقوب
-شنیدن
-اشتراک
-دفع
-اد
-ه‍
-وستفالن
-بهائیان
-پناهگاه
-مسیرهای
-هست،
-مذاهب
-گران
-تابعیت
-یابی
-ولسوالی‌های
-اسرائیلی
-تاریکی
-تعطیل
-همکار
-زور
-خلیل
-شوخی
-سلول‌های
-تنش
-کرسی
-نصف
-می‌افتد
-بیات
-فضل
-نامشخص
-تعبیر
-۷۰۰
-شو
-سوسیالیسم
-اب
-پرچمک
-دموکراتیک
-تحولات
-بگیریم
-گسترده‌ای
-آریایی
-کیلو
-والی
-براون
-ناچار
-گنج
-بلندترین
-انگشت
-محتواهای
-۱۳۸۵،
-نه؟
-یهود
-وضوح
-بلوک
-بلور
-باکیفیت
-غير
-بدل
-نادیده
-لاریجان
-دلفین
-جاز
-حاکمان
-دوری
-آرای
-خاوری
-شناختی
-ماریا
-شیب
-نیوزیلند
-مشکین
-منتظری
-خریداری
-۱۱۵
-جانی
-به‌شمار
-تعلیم
-تأکید
-اندازه‌گیری
-یافتند
-مادری
-فون
-بادن
-کدهای
-بدنی
-لوئیس
-ادامهٔ
-مبلغ
-صلیب
-می‌بایست
-آریا
-۱۲۵
-بفرمائید
-قراردادی
-شر
-گفت‌وگو
-گرینویچ
-مولکولی
-نیو
-سايت
-۱۹۱۴
-جزیره‌های
-رسیدند
-فرمت
-قائم‌شهر
-تفرش
-نظریهٔ
-خواستید
-هافبک
-دائمی
-تنیس
-می‌دهد،
-ماتریس
-باخت
-سیا
-مغرب
-سل
-اسلحه
-ذهاب
-دهد،
-فرقی
-صرفاً
-وبلاگ‌ها
-نمیشود
-راضی
-آتن
-چراغ
-حالتی
-شلیک
-الیور
-اینکار
-برپا
-آهنگرکلا
-لویی
-نیما
-بجنورد
-نهادهای
-محروم
-نکا
-لب
-وحش
-اعتراضی
-ژن
-ويكي
-عثمان
-نیشابوری
-بلک
-کنندهٔ
-موتورهای
-رئیس‌جمهور
-حکایت
-حاکمیت
-نفره
-هرسین
-مالیات
-انجام‌دادنی‌ها
-خودت
-مناقشه
-کارهایی
-غذای
-نوردراین
-علل
-دیپلم
-دادگستری
-پیچ
-لیورپول
-سرپرست
-گلی
-تفت
-جنسیت
-امری
-صبا
-اسفراین
-ریخته
-برا
-ناپلئون
-دبستان
-ویدئویی
-خمیر
-انتخاباتی
-گفته‌است
-ورزشکاران
-عادت
-آرایه
-اعتراف
-استخدام
-آرامگاه‌های
-دوتایی
-ارنست
-عمدتا
-مجهز
-زدند
-۱۳۳۰
-۱۳۸
-۱۳۳۲
-آلبانی
-نشانه‌های
-باغین
-شعبان
-فارسی‌زبان
-نیمی
-سازگار
-زبانان
-پیست
-کارایی
-گرافیکی
-کوره
-اتیوپی
-ساوجبلاغ
-مشرق
-فِي
-سیزده
-۱۰۳
-مردم‌شناسی
-بلندی
-محمودآباد
-بتا
-۱۰۲
-مراد
-افتخاری
-سهام
-امیدان
-دلایلی
-غول
-۲،
-مازیار
-عمدتاً
-مملکت
-۱۳۴۲
-انگیزه
-فرنگی
-مینودشت
-بقایای
-ابوالفضل
-فاکس
-میگوید
-همچنين
-شعری
-لس‌آنجلس
-تائید
-تاریک
-تونس
-بستان‌آباد
-کارمندان
-اسحاق
-۱۶۰
-کارگری
-پتانسیل
-سحر
-۱۰۹
-نیازهای
-آرسنال
-افزون
-نظریات
-کوبا
-فهرستی
-آزادگان
-کارشناسان
-تزریق
-کاپیتان
-حدودی
-فیل
-والیبال
-ازای
-این‌گونه
-همانگونه
-نداده
-سردبیر
-تالش
-سام
-می‌گذرد
-آنتی
-مجلهٔ
-بازی‌ها
-رجال
-هم‌درازا
-دختری
-رفته‌است
-ابریشم
-فلوریدا
-بلغارستان
-مصری
-بلوار
-دليل
-راه‌اندازی
-۱۰۴
-شمشیر
-ندا
-صادرات
-دانیل
-هریس
-کله
-حوزهٔ
-نشسته
-بیاندازید
-۱۲۸
-وبه
-تازگی
-شورا
-سروده
-درمورد
-شدند،
-قطعا
-اراضی
-می‌گویید
-حامی
-خوراکی
-جایزه‌ها
-کویر
-مفهومی
-رودهای
-زمان،
-کمیاب
-مخاطب
-سوابق
-سلامتی
-علوی
-خواندم
-نهایتا
-هوشمند
-همیشگی
-همدیگر
-سازه
-ترویج
-مقر
-قشم
-تغيير
-دیروز
-مخالفم
-نجوم
-آرزو
-عموماً
-افقی
-گوشی‌های
-رباتیک
-کلاته
-لورنس
-وزیری
-پرداختند
-رجب
-جوزف
-سپری
-تایوان
-مقاله‌هایی
-بود؟
-بزند
-مرسی
-باختری
-صلاحیت
-نمی‌آید
-بهشهر
-جماعت
-خونی
-نوشته‌است
-ازنا
-مکانیکی
-فضاهای
-فرمانروایان
-رزمی
-همسایه
-همدانی
-۱۹۰۸
-۱۹۰۵
-هردو
-۱۱۴
-هرم
-شهرکرد
-۱۰۷
-آب‌های
-متقاعد
-شویم
-نبود،
-نویسان
-هم‌زمان
-شهر،
-صخره‌ای
-ارزشمند
-۱۳۲۰
-حذفش
-سامی
-ثانویه
-دن
-احساسات
-بوئینگ
-نام،
-شبکهٔ
-شمرده
-طوایف
-باری
-جبر
-اجازهٔ
-بزرگ،
-بهم
-۱۱۱
-جهان،
-مولوی
-تفریحی
-ماساچوست
-آنها،
-اجتماعی،
-طاق
-خوشامدید
-نیامده
-اچ
-ملاحظه
-کمبریج
-زی
-برش
-می‌گذارد
-شدگان
-بدو
-درحال
-چارچوب
-شده‌اند،
-قطبی
-لئون
-هیدروژن
-کاردانی
-درمیان
-نقاشان
-شنیده
-چنين
-آتشکده
-کوههای
-قروه
-هجوم
-سرهنگ
-عکس‌های
-تاجگذاری
-خرج
-۱۳۴۴
-جعلی
-آمیزش
-راهپیمایی
-سرشار
-فیروز
-دوک
-بهداشتی
-شکی
-ماهواره‌ای
-طاهره
-زیرصفحه
-تسخیر
-مخزن
-حیدر
-اتفاقات
-غزل
-زهج
-بولیوی
-کردها
-۱۹۰۱
-قند
-نخست‌وزیر
-بازهم
-عصب
-مهاباد
-پرس
-گازی
-ابزاری
-مبدل
-۱۳۵
-میشل
-مستقیما
-صدام
-محکم
-فلزات
-طنابداران
-پروژهٔ
-امّا
-صحرا
-۱۰۸
-جملهٔ
-شوهر
-هواپیماهای
-سعادت
-جعل
-صفحه‌کلید
-اوباما
-۱۹۰۶
-انب
-اپل
-مرخصی
-معیارها
-دانید
-دعا
-تلفات
-تضمین
-آرامی
-دائم
-شد؛
-چرخه
-شجره‌نامه
-آفرینش
-معادلات
-رسما
-مزبور
-بارش
-برکه
-نبی
-مصالح
-والتر
-سدیم
-بحثش
-پیشگیری
-پروین
-نشود،
-می‌گردند
-مسافر
-راین
-بتن
-خوشه
-طوسی
-جونز
-وابستگی
-اسیر
-خیابانی
-بت
-اینجانب
-ببینیم
-لیکن
-بگذاریم
-شراب
-انگیز
-برروی
-حاجی‌آباد
-پارسک
-اعزام
-اعطا
-فقر
-علي
-کارنامه
-حجاب
-اینک
-جمع‌آوری
-درهم
-خواهشمندم
-اینه
-گانه
-پارچه
-گردیده‌است
-مداوم
-آلوده
-حقایق
-جعبه‌دندهٔ
-بشری
-چهارده
-۱۳۰۰
-لیلا
-بدیهی
-مابین
-مثنوی
-ویدیویی
-محققان
-رابط
-تلمبه
-پرفروش‌ترین
-استیو
-ساختمان‌های
-وانتشار
-معترضان
-وحی
-برنامهٔ
-بگم
-عسل
-پرتغالی
-فصلنامه
-عجب
-رفتارهای
-وورتمبرگ
-امپراطوری
-برون
-شانزدهم
-مدل‌های
-آکسفورد
-فساد
-چیزها
-خبرنگار
-ذره
-کان
-کنیم؟
-دامداری
-هی
-عبدالکریم
-کوهرنگ
-آنتونیو
-ایرادی
-۱۱۶
-دریافتی
-هرمز
-آب،
-گـپ
-ویکی‌پدیایی‌ها
-۱۰۶
-غریب
-دلفان
-راسل
-۱۹۰۷
-گویم
-قزاقستان
-وحشت
-منشور
-انتقام
-مشروطیت
-کیفی
-بپردازد
-براى
-شركت
-تعصب
-ویلهلم
-خطای
-متقابل
-۲۰۱
-اشکانی
-می‌کرد،
-بروجردی
-طبقات
-طالبان
-سفارش
-فیلمهای
-آهنگ‌های
-کنستانتین
-پیوستن
-دیدگاه‌های
-چالش
-ستایش
-نقشی
-کهریز
-منطقه‌های
-خلبان
-تنگستان
-فروند
-حج
-خاتم
-۱۳۴۱
-گردند
-پایتون
-گفته‌اند
-دانسته‌اند
-دانشکدهٔ
-تکلیف
-بازرگان
-نتوانست
-بیوگرافی
-۱۵۰۰
-بنت
-مری
-نقص
-فانتزی
-پژوهشگر
-دویچه
-کنت
-قاجاریه
-دوام
-حیدریه
-جیمی
-پویانمایی
-قوای
-می‌آورند
-کامران
-متنوع
-استراتژی
-شمارش
-۱۹۰۴
-اعم
-داراي
-بهبهان
-الدوله
-تخلف
-فراری
-ایزد
-رأس
-انداخت
-چرداول
-پیش‌فرض
-رهنمودهای
-بافتا
-شناسان
-اردو
-آبیاری
-ترانه‌سرا
-روحی
-ادیب
-فلات
-ایست
-سلیقه
-ماجراهای
-باکو
-همارس
-تراکتورسازی
-گم
-رابطهٔ
-داشتند،
-رپ
-گز
-بگذارد
-۱۱۲
-مستندات
-زمین‌های
-سایت‌های
-مبحث
-مشکلاتی
-بوکان
-ابزارها
-جبران
-تقریبی
-زیان
-گلپایگان
-خوشنویسان
-۱۲۲
-بارز
-مَا
-بوک
-اشتباهات
-تانک
-می‌شده
-دهه‌های
-واژه‌نامه
-خشکی
-ایی
-اللَّهِ
-عفونت
-۱۲۳
-باده
-نام‌تصویر
-بیس
-كردن
-گچ
-زدهٔ
-طلای
-معکوس
-نبودند
-رضایت
-ثروت
-انار
-کشاورز
-کوانتومی
-اژدها
-سوراخ
-بیلبورد
-شاهین‌دژ
-بره
-اهدا
-زیرزمینی
-تکراری
-صربستان
-مراقبت
-تروریستی
-۱۹۱۱
-متمایز
-آملی
-برساند
-عن
-ابهر
-معتدل
-گفتگوی
-املش
-می‌بینم
-می‌آمد
-۱۹۱۳
-ناشناس
-وله
-جایش
-جنبش‌های
-توليد
-موزه‌های
-نمائید
-دهمین
-برند
-تاریخچهٔ
-می‌شده‌است
-پاسخی
-پشتی
-تشریح
-نمی‌شوند
-خویشاوندان
-انگشتدان
-دكتر
-ژانر
-فریاد
-اخلال
-تمشک
-سعد
-پارسا
-۹۰۰
-نامدار
-نظامیان
-قدری
-حمام‌های
-مستوفی
-گرما
-گرا
-یادگار
-عاشورا
-دفعه
-بیانی
-شنا
-استعفا
-رسانه‌ای
-انحلال
-بزرگداشت
-فایرفاکس
-بتوانید
-مؤلف
-حامیان
-ناحیهٔ
-مور
-۱۹۱۰
-حیاتی
-هرگاه
-آنا
-جاسوسی
-منتج
-جابجایی
-تولیدات
-هاى
-قدردانی
-۱۷۰
-راست۱
-لیلی
-عملاً
-میشد
-کشورهایی
-درجهٔ
-حامل
-ابوبکر
-خصوصا
-اختصار
-مجاورت
-پدیدآورنده
-آراء
-چپ۱
-گله
-یکپارچه
-عبارات
-جمینای
-جزیرهٔ
-اسرار
-خانواده‌های
-بلوز
-مونته‌نگرو
-بیابان
-به‌صورت
-دارید؟
-نقطهٔ
-ضرورت
-وي
-کارکرد
-هوانوردی
-محبت
-پارک‌های
-واژه‌ای
-امامزاده‌های
-هریک
-کوچکترین
-طاهر
-حوالی
-مطهری
-کنگاور
-شدهٔ
-شبکه‌ها
-شیوه‌های
-تیراندازی
-۱۱۸
-جست
-آژانس
-سایز
-بدن۱
-تکذیب
-نقدی
-متناسب
-دال
-بابی
-شانزده
-هرکدام
-ادعاهای
-العاده
-عنایت
-مزدیسنا
-انقراض
-مقدونیه
-۱۲۷
-ندیده
-رأی‌گیری
-دلو
-هندسی
-موبایل
-تورم
-رفتاری
-پیامدهای
-زید
-زادروزها
-حیدری
-بتوانیم
-فوری
-علایم
-نویسه
-غم
-خلال
-اریل
-کاشمر
-بز
-بردسیر
-۱۹۱۵
-حتا
-برخط
-خرمشهر
-همچین
-نفری
-سالگرد
-متخصصان
-شاهرخ
-صحن
-جنین
-جشن‌های
-یکشنبه
-تمیز
-ارامنه
-چپ۲
-جلسات
-مهمان
-کجای
-روال
-۱۳۴۳
-پینک
-سبک‌های
-هان
-بدن۲
-عمودی
-افسران
-شجریان
-نوسنگی
-الاسلام
-مساجد
-صاف
-مروارید
-جانور
-آنهایی
-راست۲
-اسکی
-ناشناخته
-اعتقادات
-یم
-انگور
-ويرايش
-گروههای
-ترانهٔ
-شد؟
-دقیقی
-استادیوم
-مختلف،
-عتیق
-توطئه
-بالا،
-مین
-همگانی
-تلفنی
-می‌دانست
-ود
-ميان
-تشکیلات
-روده
-مدیره
-ونزوئلا
-مخصوصاً
-مشتمل
-انتقادی
-تفنگ
-برایشان
-طالقان
-فرانسیس
-بازارهای
-پایین‌تر
-کاروان
-به‌جای
-الیاف
-خامنه
-خصوصاً
-ظهر
-سکس
-چهاردهم
-ایزو
-مسجدسلیمان
-الکل
-فلاندری
-محمدیان
-شکوه
-کرده‌اید،
-اسلامي
-سم
-کناره
-لوازم
-نمیدانم
-پیامی
-فارغ‌التحصیل
-باس
-کام
-بنویسد
-بازنشسته
-نصر
-کاشی
-شکارچی
-پست‌های
-ویلیامز
-دهکده
-اندر
-۱۵۴
-جهانگیر
-ملکان
-می‌توانست
-عبارتی
-مسئولان
-هلال
-مهندسان
-غارهای
-بیلی
-۱۹۱۶
-بنگلادش
-حملهٔ
-توانستند
-پارینه‌سنگی
-پولی
-خوشبختانه
-نموده‌است
-امینی
-نه،
-هما
-مشورت
-نامحدود
-آندره
-پلنگ
-مخدر
-مضمون
-برمی
-هم،
-لاس
-دهید،
-ویکتوریا
-موثق
-داود
-عذرخواهی
-یاهو
-رنگ‌های
-۱۱۷
-تناوبی
-نوشتید
-لااقل
-شتر
-مرکزیت
-امن
-ترسیم
-سیستم‌ها
-اتومبیل
-آفی
-جون
-خالق
-حرارتی
-رسوم
-موریس
-مارشال
-یورو
-بانو
-اولين
-منشورات
-غیبت
-نوشته‌اند
-قدرتمند
-شکم
-هایش
-انداز
-رویکرد
-علاقه‌مند
-خانواده‌ای
-دمشق
-دربند
-برو
-آرشیو
-۱۹۰۹
-رویش
-استخر
-آنالیز
-گچساران
-بکنم
-مولا
-متفرقه
-رحمت
-شاخ
-۱۳۱۰
-اتفاقاً
-اسمش
-سهامی
-دبلیو
-بخشهای
-سرتاسر
-ویکی‌ها
-خیالی
-نکنند
-تناسلی
-م‍انفی
-جديد
-۱۳۲۴
-کار،
-برندهٔ
-پیچیدگی
-گواهی
-زرتشتیان
-ناصری
-همانجا
-رغم
-گفتهٔ
-۱۱۳
-گرمسیری
-طلوع
-برترین
-درآورد
-به‌دست
-برقی
-سپاهیان
-ویژگی‌ها
-مر
-۱۲۴
-چهاردانگه
-جامعهٔ
-تحقق
-مجاری
-می‌گفتند
-فروپاشی
-چشمه‌های
-ساختاری
-مسافرت
-پیکان
-نرم‌افزاری
-جد
-روشنی
-معرفت
-تله
-می‌کنم،
-محرک
-مشتریان
-بیانگر
-سازمانهای
-چیزهای
-رقیب
-فرعون
-بیروت
-منعکس
-تابناک
-مشرف
-آورده‌است
-نمی‌توانم
-۱۱۹
-مولکول
-نعمت
-می‌رساند
-فرمانداری
-دستکاری
-۱۳۳۹
-مت
-اردبیلی
-مسدود
-بله،
-رانندگی
-۱۲۱
-سایپا
-استعداد
-پیامبران
-داماد
-واجب
-نسخ
-فاضل
-عرفانی
-بزرگ‌تر
-حق‌تکثیر
-شخصاً
-دگرگونی
-عكس
-انبوه
-آپولو
-فنون
-افلاطون
-حمزه
-میانجی‌گری
-نظرسنجی
-آنتونی
-اکوادور
-آن‌چه
-قذافی
-اسکن
-خاتون
-ناگهان
-گونه‌ها
-تونل
-به‌ویژه
-ناگهانی
-بدهیم
-دوشیزه
-آباده
-نمی‌توانند
-شلوغ
-ی،
-۱۳۳۵
-خلع
-فلوید
-ابومسلم
-بایت
-اعطای
-جاسک
-پوند
-پایداری
-تیتر
-واپسین
-استالین
-تعطیلات
-آستین
-مختلط
-تابلو
-خنده
-نویسه‌های
-ثمر
-۲۰۰۰،
-بازاریابی
-حسابداری
-تکلم
-رنگرزی
-نهبندان
-۱۳۳۶
-نیلوفر
-شرقی،
-بداند
-فسا
-آلیکانته
-دیلمی
-اجتناب
-نیر
-سطح‌بالای
-اينجا
-می‌زنند
-کیم
-لغتنامه
-عاشقانه
-فتحعلی
-اشیاء
-تعمیر
-فلانی
-استیون
-سازماندهی
-ویرجینیا
-راجر
-بگویند
-روزنامه‌نگاران
-هندو
-دیوانسالار
-ایستاده
-۱۳۳۷
-کرانه
-کلسیم
-هایدلبرگ
-کرواسی
-سرانه
-الملک
-سنگ‌های
-ژنتیکی
-نیکی
-هجرت
-مامور
-خنک
-نمایان
-بهرامی
-شبستر
-واسط
-آرایش
-مبهم
-بسی
-بریتانیای
-محدودهٔ
-بحث‍
-گاما
-ده‌ها
-نواختن
-فروشگاه
-خمین
-صنعاء،
-کنفدراسیون
-اموال
-هنرپیشه
-پارسیان
-متوسطه
-دامن
-۱۲۶
-لک
-شیشه‌ای
-ابراهیم،
-آمادگی
-هو
-زنجیره‌ای
-۱۳۲۸
-بازیهای
-سنقر
-بدر
-آورند
-مرجعیت
-آلت
-اسدآباد
-کارلوس
-سودمند
-نشانگر
-رسید،
-حوزه‌های
-دیار
-کنگو
-میهن
-کلانی
-۱۲۹
-افسر
-باکتری
-معماران
-۱۳۲
-سیدنی
-کفش
-ارادت
-می‌خواهند
-خر
-۳۵۰
-بدترین
-تاریخ،
-فلسطینی
-زاگرس
-بیاورد
-یانگ
-شخصا
-تشدید
-آدمی
-ماهی‌ها
-هیچکدام
-میناب
-بوسنی
-ایندیانا
-دنباله‌دار
-ملوان
-روزنامه‌نگار
-مؤثر
-دستورات
-رطوبت
-تعامل
-کلان
-عباس‌آباد
-کاملی
-احادیث
-مدرکی
-پاکسازی
-۱۳۷
-تفاوتی
-ورزشکار
-جنبه‌های
-غالباً
-بود؛
-چنگ
-مهاجران
-پله
-تراز
-آمد،
-وا
-کوثر
-وادی
-اتوبوس
-کاظمی
-خبرگان
-موس
-تکمیلی
-لهستانی
-درویش
-منم
-جعفرآباد
-نیا
-جاذبه
-گیلانی
-طلاق
-تروریسم
-به‌خاطر
-آيا
-گرفتار
-اشعه
-می‌پردازند
-شخصیتی
-آقایان
-رفتم
-جریمه
-مهره
-خاستگاه
-میان‌ویکی‌ها
-بالینی
-یزدگرد
-ببرد
-دوش
-چغازنبیل
-۳۰۰۰
-فوقانی
-۱۳۳۱
-گیلکی
-خط‌به‌خط
-کاترین
-بختیار
-کردید،
-گردان
-ادی
-طاها
-مدیترانه
-ارس
-حسن‌آباد
-پوشاک
-بابلسر
-رساندن
-کند؟
-بهش
-وست
-خوشامدگویی
-مهار
-میبد
-فلسفهٔ
-وند
-آش
-سیمین
-خوراک
-خوزه
-ساختند
-نياز
-عروسی
-میگردد
-جلفا
-بودیم
-بکند
-۱۳۸۸،
-روحانیان
-حماسه
-پایتخت‌های
-مبارزات
-احمد،
-ارث
-محمّد
-۱۳۳۳
-کوشک
-سنگ‌ها
-زشت
-دنا
-دستیار
-گرمایی
-ایشون
-نامهٔ
-تحمیل
-گوشی
-دوره‌ای
-ققنوس
-بدانند
-شن
-انداختن
-هفدهم
-غالبا
-اسدالله
-۱۳۴
-شدیدی
-ناپذیر
-۱۴۴
-گینه
-سرمربی
-نطنز
-کیبورد
-محفوظ
-آیند
-انفرادی
-آن‌که
-گمانم
-توانسته
-سال‌شهرشدن
-علم‌جو
-خرده
-درگز
-ایستگاه‌های
-بکشید
-پیش‌بینی
-حالات
-هرکس
-بزودی
-کایروس
-اوستایی
-صفات
-مارکسیست
-خشت
-جنب
-عذر
-ونیز
-آسانی
-کریستین
-صفویان
-اسدی
-۱۹۰۳
-تاخیر
-خیانت
-قوس
-قطره
-آثارش
-سیل
-اسکات
-مشاغل
-شم
-بخارا
-چاپی
-مکتوب
-دیدید
-انتها
-موزیکال
-كاربر
-منشأ
-سمی
-لَا
-پهلوان
-پوسته
-درختی
-مشابهی
-کنیا
-عاملی
-۱۳۹
-گویید
-۱۳۳
-تلاش‌های
-اهمیتی
-عازم
-اسمی
-پکن
-تصوف
-تکاب
-حاکی
-برت
-کنيد
-نوروزتان
-ببیند
-کبوتر
-سفرنامه
-۱۳۳۴
-تخلیه
-آق
-زنجیره
-انتقادات
-کوک
-همان‌طور
-غربی،
-جنجال
-فیزیولوژی
-سانتی‌متر
-بسط
-زخم
-۱۴۱
-ویکتور
-آران
-یك
-التهاب
-دسته‌بندی
-جنگنده
-ایفتا
-ژاک
-طاهری
-فیض
-بهتره
-ادعایی
-اسد
-بودنش
-پیک
-مسأله
-بانوان
-بنفش
-گشود
-باغی
-هیدوچ
-جسمی
-انگشتی
-یوهان
-لنز
-چراکه
-رهایی
-نگرفته
-مقصود
-جوراب۱
-آنهم
-قمی
-سکته
-کو
-سره
-زبانها
-برج‌های
-مکان‌ها
-نشدن
-چابهار
-پاراگوئه
-کتابها
-طولانی‌ترین
-اولویت
-مبارز
-استراحت
-مشت
-حرام
-فرمود
-نقلیه
-کمر
-پستان
-سرچ
-فعاليت
-ارتقاء
-شانس
-خودی
-فاتح
-مطالب،
-گوسفند
-میگویند
-غلام
-وصف
-دلم
-اظهارات
-انتگرال
-سوسیالیست
-گذارد
-ماموران
-بادام
-چال
-ساگه
-ایسنا
-معده
-ریشتر
-اعلان
-تک‌نفره
-بلو
-مناطقی
-شافعی
-می‌گفت
-می‌خواند
-ثانی
-هست؟
-منو
-لوث‌شدن
-جنایت
-برخاست
-بوده‌است،
-نمی‌باشد
-اشراف
-نداد
-مهربان
-الهیات
-همه‌ی
-زمين
-کینگ
-رول
-والتوزیع،
-مدرسهٔ
-ترافیک
-اتهامات
-وای
-بهنام
-شجاع
-سیار
-ترسناک
-ذات
-مختار
-عموما
-اینتر
-فرزندش
-داروشناسی
-ریسک
-۱۹۹
-نیجریه
-مظفر
-حشرات
-میدانید
-جبل
-آریزونا
-نارنجی
-کتابخانه‌های
-میدانم
-آرم
-بشمار
-اعتباری
-کره‌ای
-عکس‌ها
-پیکچرز
-تخته
-متمایل
-رفاه
-شهبازی
-میخائیل
-تطبیق
-نظریه‌های
-بلوغ
-عزیزم
-۱۳۹۱
-محاسباتی
-سنجی
-مکانیسم
-سریعتر
-آبشاری
-کالاهای
-اشک
-خانی
-سازگاری
-مارچ
-گرین
-قرص
-خوانندهٔ
-صفی
-نازک
-داروها
-۳،
-۱۳۶
-هماهنگ‌کنندهٔ
-لینکلن
-بانوی
-خودروی
-پل‌های
-۱۳۳۸
-دیوارهای
-ورامین
-۱۴۵
-اتخاذ
-کمیت
-دارم،
-مذاکرات
-حول
-برگزید
-کارشناس
-نامعتبر
-سفرهای
-رومیان
-ربات‌ها
-غیراینصورت
-انیمه
-به‌وسیله
-استعمال
-صریح
-سازه‌ها
-رامهرمز
-اندیس
-رازقنــدی
-تثبیت
-۱۰،
-تصوير
-گویش‌های
-کتک
-طالب
-حماس
-۱۳۲۹
-علیرغم
-۱۴۸
-حزبی
-استونی
-اوین
-غروب
-حریف
-استراتژیک
-شگفت
-مرگش
-جانسون
-پانزدهم
-موشک‌های
-گن‌آباد
-ارتقا
-باطل
-خورشیدی،
-آلفرد
-ساموئل
-بحرانی
-قندهار
-كردم
-ماکس
-گی
-میخواستم
-بچه‌های
-۱۳۲۵
-شرطی
-گشایش
-زندگي
-دایی
-یون
-فرانس
-تورات
-گزارشی
-۲۲۰
-فیلم،
-دهلی
-مسافران
-سنگر
-نخواهم
-موش
-ریشهٔ
-سخنگوی
-زنگ
-نینتندو
-دیوانه
-بمباران
-مسئولین
-استودیویی
-شدیدا
-تیلور
-۱۲۰۰
-قزوینی
-لاست
-مسلما
-ورق
-شهرزاد
-لطفی
-کلات
-بارداری
-دیواره
-باشگاهی
-شکستن
-تریلر
-ممتاز
-پرانتز
-یوتیوب
-بیهوده
-ابدی
-نباشد،
-کیوان
-طرح‌های
-بدم
-کاریکاتور
-بدتر
-داش
-می‌رسید
-میانجی
-بيش
-اختریان
-سربیشه
-روشنایی
-تبیان
-بکشد
-اراده
-چربی
-خرما
-سلطانی
-شيخ
-مقا
-مستخدم
-وب‌گاه‌ها،
-نشینی
-نرگس
-۱۷۵
-تویسرکان
-خاطره
-برکنار
-غیرقانونی
-ساواک
-نگاره‌ای
-سین
-شناسنامه
-بناها
-‌ها،
-غرق
-شعرهای
-مسلط
-سرش
-اه
-برکت
-جنگل‌های
-سلطه
-اقیانوسیه
-علما
-بنفشه
-یال
-هولوکاست
-دادستان
-حلی
-اجسام
-غواصی
-احاطه
-والا
-بیماریهای
-صدوق
-ریو
-دیویس
-ناهید
-دهها
-نتوانستم
-ایکس‌باکس
-ول
-منبع‌ها
-تاریخی،
-کثیر
-لیتوانی
-شده‌
-بپرسم
-قربانیان
-جانشینی
-سیریلیک
-بوستون
-یونانیان
-دوبار
-فرضیه
-امروز،
-دیده‌ام
-عزيز
-۱۴۲
-میگیرد
-شلوارک۱
-مِنَ
-ارسطو
-ومبلی
-بخواند
-۱۹۰
-صوفی
-صدق
-کارب
-گذاشتند
-هزینه‌های
-فردریک
-نوشته‌اید
-آو
-عمده‌ای
-م‍
-هیچگونه
-حسی
-اللَّهُ
-معدود
-مارکس
-سنگاپور
-رایانش
-عادل
-ریگان
-میرسد
-الگوریتم‌های
-ائتلاف
-فریدون‌کنار
-بازگا
-نگرش
-هرحال
-بدانیم
-کفایت
-فین
-۱۳۲۷
-باورهای
-بازگیر
-لردگان
-چرا؟
-تعویض
-سلجوقی
-جستار
-نخواهند
-می‌نمایند
-دهستان‌ها
-فرمانروای
-خودتون
-منتقدین
-کلاردشت
-اره
-لزومی
-مرتفع
-ویر
-سندرم
-نیاید
-آجر
-دانشکده‌های
-نمین
-مق
-تن‍
-اینچ
-فوتسال
-ساکنین
-‍ه‍
-فرانسه،
-صفحاتی
-۱۹۰۲
-طالقانی
-جعبهٔ
-غارت
-بزرگسالان
-لین
-۱۶۵
-قیاس
-افغانی
-نگذاشته‌اید
-ساید
-نادری
-امامان
-سنا
-سرگذشت
-رایش
-توجیهتان
-بروند
-سمفونی
-آهنگ‌ها
-توس
-تم
-پنسیلوانیا
-خرچنگ
-مغان
-سجاد
-پایینی
-تحریر
-لوث
-شانه
-طوفان
-اصولاً
-کبودرآهنگ
-تسمیه
-عامیانه
-بیشینه
-فضاپیمای
-بودایی
-۱۸۹۰
-اقلیم
-مثالی
-جشنواره‌های
-برایان
-میرود
-پین
-آم
-سرگرمی
-مزایای
-ریال
-رسماً
-ناحیه‌های
-تازه‌ای
-می‌دهیم
-هارد
-مقال
-فراهان
-دلیلش
-میلیمتر
-۱۸۰۰
-ماهنشان
-سالار
-جت
-مردگان
-فقیر
-۱۵۵
-راستا
-میکنیم
-جوری
-شلوارک۲
-پژوهشگاه
-نیستند،
-۱۴۶
-اینشتین
-یخچال
-روزمره
-ارم
-سنین
-تحسین
-سکه‌های
-۱۳۱
-فحاشی
-پاپ‌های
-عینی
-رسانده
-رز
-بودم،
-ارزشی
-ستان
-باراک
-اصلي
-الکتریک
-نامه‌های
-عطار
-علمي
-بخشید
-السلطنه
-يعني
-غلبه
-مستقیماً
-منش
-رستاق
-افراطی
-بگیرم
-سيد
-۱۴۷
-ندارند،
-الَّذِينَ
-نمونهٔ
-کریستال
-قایق
-نوادگان
-سالیانه
-می‌پذیرد
-احترامات
-شیری
-سیاهکل
-سرب
-نصرالله
-مانه
-گیم
-ببر
-آستان
-زیستگاه
-ای،
-داده‌ام
-لوئی
-شریعت
-آموز
-رتبهٔ
-کمک‌های
-نقدها
-حلقه‌ها
-ارتقای
-هال
-انسانها
-پشتو
-امیرحسین
-سین‌آباد
-رشید
-۱۴۳
-شیرینی
-مذاکره
-تعدیل
-کارمند
-اعضاء
-روانه
-بنر
-معروفترین
-خیابان‌های
-مشاوره
-اکثرا
-افت
-کنگان
-بگذارند
-دامنه‌های
-رحم
-بیدار
-تیپ
-تنفس
-افغانستان،
-میشیگان
-استعمار
-فرخ
-گذرگاه
-توالی
-تایم
-جمله‌ای
-ولادیمیر
-دستوری
-تساوی
-ساختارهای
-جانوری
-قسم
-۱۳۱۶
-هفده
-یقین
-صوفیان
-می‌نویسند
-رومرکز
-بک
-انگشته
-مولف
-نگفتم
-یورش
-ثبات
-بیایند
-بپرهیزید
-وبا
-اس‌جی‌اچ
-جن
-ورزش‌های
-لامرد
-سپیدان
-کبک
-عزت
-افشین
-کامرون
-فیلم‌شناسی
-پاول
-نکنیم
-درگیری‌های
-رخداد
-کیا
-عرف
-شازند
-یکصد
-استهبان
-می‌گیرد،
-نرسیده
-ویژهٔ
-ابتلا
-اینطوری
-گارد
-بزن
-مدتها
-وعده
-شرف
-پيدا
-نیدرزاکسن
-زواری‌جان
-اسدخانی
-هندواروپایی
-تصویرگر
-مختص
-استادی
-هیپ
-امشب
-احیای
-بنو
-امامت
-خونریزی
-سیگار
-کاسه
-غرض
-معتقدم
-ساختم
-صفح
-روایتی
-نمادهای
-متوالی
-خدایی
-نمود،
-عجم
-آبهای
-آمده‌اند
-نموده‌اید
-لاریجانی
-شیوع
-زمينه
-الا
-بیا
-آزمایشگاهی
-آنتن
-قرآنی
-بیستون
-فاجعه
-۱۵۸
-ریه
-انعکاس
-تقلب
-هجدهم
-طبرستان
-تناقض
-مدت‌ها
-علمی،
-تصنیف
-فروغ
-دایرةالمعارف
-آلمریا
-تاسیسات
-گونهٔ
-هیچکس
-ایدز
-آوا
-۱۴۹
-مديريت
-بیاد
-پایگاه‌های
-زیرصفحه‌های
-مقاوم
-گمشده
-نشدید
-نوزاد
-سیف
-دیفرانسیل
-موافقان
-بانه
-فونت
-صفا
-واتیکان
-اصالت
-کتابخانهٔ
-یگانه
-کیت
-ترجیحات
-کنوانسیون
-نانو
-۱۵۳
-آنزیم
-كردند
-تیمی
-۱۸۵
-هستید،
-حوض
-نویسنده،
-ورد
-حسنی
-پديا
-بویین
-مادها
-ناوگان
-بنگاه
-اردلان
-صومعه
-تورنتو
-کارولینای
-۵۰۰۰
-اشکالات
-مسائلی
-انداخته
-نماند
-دستمزد
-بخواهم
-سرقت
-میدانی
-ریتم
-خوبیدگی
-پوستی
-اندی
-الماس
-بزنم
-مقدونی
-هسن
-گروه‌ها
-بروجن
-تگ
-منشی
-ملکی
-تبعیض
-ببین
-افق
-خشن
-کورین
-دوی
-قوام
-ایلینوی
-بچه‌ها
-تکاملی
-دخترش
-برانگیز
-اصطلاحی
-مل
-یکان
-داراست
-عرب‌ها
-ناموفق
-کبد
-کوفی
-رودها
-پشته
-رسالت
-مرتکب
-معروف‌ترین
-نشوند
-نبودم
-بنیانگذاری
-لیبرال
-فرید
-حوضه
-ربع
-نوح
-سیاهه
-تای
-خستگی
-پدری
-برنامه‌ها
-فرستادن
-بیطرفی
-نواب
-نزول
-استیشن
-رادار
-پخش‌کننده
-سازند
-عضلات
-سعیدی
-کوین
-بنویسند
-برم
-بیایید
-حجازی
-شده؟
-تالیفات
-حسینعلی
-نیست؛
-مزاحم
-فروشی
-آموزان
-میکرد
-۲۴۰
-بحث،
-وارنر
-کوری
-واکنش‌های
-فستیوال
-قارچ
-لغت‌نامه
-تاجیک
-شرکتهای
-هروی
-ویژگیهای
-عکسهای
-چارلی
-باشيد
-داشتیم
-بومیان
-باقیمانده
-یافت،
-اشاره‌ای
-فصلی
-عبدی
-بزرگوار
-بیتی
-مُعجَم
-نازل
-امپراتوران
-مهمتر
-کانی‌ها
-۱۸۹۶
-محمدباقر
-شایع
-ادریس
-که‌
-دهندگان
-اعلامیه
-به‌نظر
-داروی
-لیک
-اتوماتیک
-مي‌شود
-فروغی
-برآورده
-بلا
-آدولف
-قشقایی
-تنفسی
-اردوگاه
-زنجانی
-تنه
-گزیده
-مریوان
-پورنو
-کامبوج
-تل‌های
-رمزنگاری
-دامپزشکی
-شاهنشاه
-قرقیزستان
-ارابه‌ران
-نمودم
-ضرر
-بازنگری
-دگرگون
-بررسي
-شده‌بود
-ناپدید
-متاسفم
-نسخه‌ای
-اشنویه
-پیاپی
-عبدالعزیز
-۱۶۸
-اسباب
-نسبیت
-کعبه
-مردم،
-ذوب‌آهن
-آنچنان
-ادرار
-رنسانس
-سوسیال
-دهخدا،
-تختی
-فاطمی
-ماشین‌های
-پاسکال
-مینا
-تابعی
-سایتی
-توانیم
-ترين
-توران
-ادارهٔ
-فهرست‌ها
-خوشی
-معینی
-یادآور
-مخالفین
-دود
-مدام
-انی
-تقاطع
-پتاسیم
-نساجی
-ارد
-اندیمشک
-داده،
-مخالفتی
-دونفره
-اندیشه‌های
-علیزاده
-آجری
-برسیم
-اقدامی
-فقهی
-اشکان
-همبستگی
-فرادیرینه‌سنگی
-گناوه
-کوفه
-۱۸۹۹
-اینصورت
-عبدالرحمن
-لبه
-بی‌پایان
-میدهند
-منشا
-مرحلهٔ
-بیطرف
-کردید؟
-مسخره
-مشخصه
-عضلانی
-اسارت
-عنوانی
-۱۵۲
-ندارم،
-برچسب‌ها
-اچ‌آی‌پی
-منصوری
-۲۱۰
-بینم
-مجنون
-تعاریف
-تعهد
-اقتباس
-جلیل
-می‌کنید؟
-رزن
-مسئلهٔ
-فرستنده
-گان
-قاب
-کمونیسم
-تناسب
-ندای
-توحید
-هواشناسی
-کرده‌اند،
-منتها
-روز،
-شوال
-لیزر
-پس‌از
-دزدان
-دارد؛
-جنگ‌افزار
-جایزه‌های
-واحدی
-تیموریان
-ذكر
-کنده
-ترش
-می‌خوانند
-ریش
-تمایز
-پیشبرد
-زندگانی
-دلتا
-پیش‌از
-نقده
-ایرلندی
-هنرستان
-قبال
-فرصتی
-دودویی
-عليه
-زیباترین
-شاعری
-سرما
-ایلی‌نوی
-شهبانو
-پنالتی
-بهاری
-افتد
-فیروزکوه
-فایده
-۱۶۳
-بروس
-نیسان
-نکردند
-نمیتوان
-۱۶۲
-روباه
-سقراط
-کشته‌شدگان
-اورانیوم
-عملا
-طراحان
-ماهیچه
-سرم
-اوهایو
-علاقمند
-نویسد
-الجزیره
-گذشته،
-مزارع
-گزینش
-جنگهای
-اطلاعی
-نوشته‌ها
-پارلمانی
-۱۱،
-جنابعالی
-اسفندیار
-امیدوار
-ک‌گ
-گازهای
-کبود
-زمین،
-تلگراف
-لئونیداس
-گرمای
-کتابخانه‌ها
-آشوری
-طعم
-راد
-زنانه
-عربی،
-جادو
-حمیدرضا
-جنگ،
-جابجا
-ماکیان
-بیابید
-شکاف
-گلزار
-متفقین
-متاخر
-سایتهای
-بایگانی‌ها
-بهره‌برداری
-جنایی
-کارون
-شهدای
-میامی
-پدیده‌های
-هستم،
-برکلی
-نایین
-ببینند
-استانداری
-۱۶۱
-پسری
-شوالیه
-کت
-شاخه‌ای
-مقاطع
-آنوقت
-اسکو
-۱۸۹۲
-نده
-رسانید
-۲۳۰
-تاسف
-هايي
-پلدختر
-تاجیکی
-جاجرم
-وضع‌کننده
-استر
-همنشین
-زحمتی
-کانادایی
-تبلیغات،
-زهک
-دولت‌های
-ترمودینامیک
-سوری
-خلفای
-درآن
-فراگیری
-ختنه
-امیرآباد
-تروث
-بوم
-زاد
-خنج
-بروم
-سومالی
-جیم
-دیجیتالی
-عفو
-سوشی
-اصفهان،
-بلاندی
-کوچک‌تر
-گمنام
-سکوی
-نزاع
-احتیاط
-گردید،
-بزنند
-علنی
-ویلا
-۱۳۲۶
-الهه
-هدر
-ظلم
-ناو
-می‌کردند،
-الحکمة،
-یاقوت
-حتي
-شرکت‌ها
-تعلیق
-خواستند
-کاروان‌سرا
-نکتهٔ
-رشته‌ای
-باهم
-بپردازند
-درجات
-وجودی
-بودا
-نیوتن
-منطبق
-نصرت
-ال‌جی
-سومی
-فلش
-۱۳۸۵جمعیت
-فریم
-دوما
-ساقه
-اسماعیلی
-دینامیک
-المقحفی،
-المُدُن
-فیلم‌هایی
-فیزیکدان
-محضر
-آخوند
-فراهانی
-صید
-بسا
-الیَمَنِیَة
-بنایی
-۱۷۳
-می‌گوییم
-درآمده
-مورخان
-یونیکس
-جاها
-وام
-کوتوله
-۱۷۶
-ژرفای
-موجودی
-مرادی
-بدنیا
-پمپ
-پرستاری
-می‌شوید
-مناره
-انقلاب،
-برجستهٔ
-جذاب
-نوشتارها
-نمیشه
-مایک
-امیری
-چناران
-ــ
-گردو
-تفویض
-دخیل
-۱۵۹
-بنیادین
-بدیع
-سالیان
-مواضع
-وَالقَبائِل
-۱۶۹
-می‌بیند
-درگذشتهٔ
-داشته،
-قنطورس
-۱۸۹۸
-تصمیم‌گیری
-مشمول
-رودان
-فراگیر
-آمده،
-نفهمیدم
-۱۸۸۹
-شده‌اید
-نفی
-افسردگی
-می‌دانستند
-آلات
-قوت
-دانه‌های
-محمدحسن
-عزيزی
-جامی
-نجم
-طرحی
-گاندی
-جنوبی،
-بصره
-اروگوئه
-شرکت‌ها،
-پورت
-خجسته
-زمانیکه
-ریشه‌های
-فمینیسم
-گاردین
-بایست
-وار
-دیوان‌سالار
-فوتبالیست
-۱۶۷
-آلمان،
-شعله
-آناتولی
-على
-شمالی،
-سیمون
-ظروف
-رستوران
-دایر
-می‌گذارند
-تفاهم
-آناتومی
-گذراندن
-شكل
-مرگ‌ها
-آهنگسازی
-لیتر
-دزدی
-فرموده
-معصوم
-اطاعت
-تارنمای
-فارس،
-پلان
-هانس
-فریدریش
-ملی،
-روحانیت
-اوّل
-نتيجه
-وادار
-صورت،
-۱۳۰۴
-ترتیبی
-مبارکه
-بنیان‌گذار
-۱۷۹
-ژوزف
-اردستان
-افزودم
-مطبوعاتی
-ارز
-جنجالی
-نوازندگی
-سوزان
-دارن
-افتادن
-هایشان
-تحقیقی
-سهند
-سپاسگذارم
-فیزیوتراپی
-محافظ
-ماشینی
-ربر
-یدالله
-میمون
-سیاستهای
-نگارهٔ
-چه؟
-صراحت
-رسته
-تجویز
-توفیق
-مغولستان
-کین
-وال
-ساکورا
-پیشروی
-متوفی
-تازی
-دیلم
-پل‌دختر
-می‌خواست
-صدیق
-نمی‌بینم
-ایلات
-درحالی
-غلات
-نوه
-هاله
-سیستمهای
-کتیبه‌های
-سیال
-منبر
-بیک
-۱۳۱۴
-۱۳۱۸
-حسين
-۱۷۱
-درشت
-سوق
-برنامه‌ای
-گهواره
-دست‌آوردهای
-تعبیه
-رادیوی
-ساسان
-درامز
-۱۲۹۹
-تجسمی
-سیمان
-گنجی
-کشش
-اسلوونی
-ویلسون
-داماش
-إِنَّ
-کارتوگرافی
-کاشت
-دستان
-لید
-نوازندهٔ
-نمی‌شد
-قران
-ایدئولوژی
-کامپکت
-ناغان
-قرائت
-کاراکتر
-خانه‌ها
-شفاهی
-فله‌ای
-شهرسازی
-اعتصاب
-۱۸۱
-ویدیو
-شايد
-ویرایشگر
-پردازد
-داده‌اید
-حاد
-اجتهاد
-مرطوب
-کلماتی
-مهریز
-حلال
-بیافزایید،
-۱۵۷
-همجنس‌گرایان
-لینکی
-تطابق
-باورند
-دالاس
-إِلَّا
-اصولی
-کپی‌رایت
-الفبا
-کیهانی
-تاب
-شرعی
-محتوی
-هانری
-می‌دهند،
-یوگسلاوی
-بگذارم
-تداوم
-گریز
-نشده‌اند
-شناخته‌شده
-انعطاف
-اندک،
-دعوا
-کری
-تبیین
-احساسی
-ساعات
-معاصر،
-پیشوند
-طبع
-میاندوآب
-اخترفیزیک
-مطمئنا
-پرسید
-انگل
-برکناری
-رولینگ
-حفاری
-زیارتگاه
-منتسب
-پیام‌های
-گسسته
-طريق
-باخ
-۱۳۲۳
-کلیساهای
-معصومه
-شهروز
-متناوب
-۱۸۹۵
-پن
-ابراهيم
-۱۳۱۳
-بطوریکه
-رابین
-آموخته
-میدان‌های
-تاریخ‌نگاران
-بکر
-میش
-پخته
-قلمداد
-رویا
-باشید،
-سیستانی
-قومیت
-جرمی
-لوس
-آفرین
-تلف
-خوارزمی
-محتوایی
-سول
-دبط
-جُستارهای
-می‌نمود
-روزنامه‌ها
-یت
-دگر
-بانکی
-سدان
-متغیرهای
-یابند
-بکارگیری
-انتاریو
-کوسه
-۱۶۴
-بلخی
-بیم
-خلخال
-حائری
-۱۸۹۳
-آورده‌اند
-نقطه‌ای
-علمجو
-استیل
-سلولهای
-گوگرد
-میتوانند
-گوارش
-سبزی
-۱۶۰۰
-جوراب۲
-زیرین
-ميشود
-پنبه
-آورد،
-حرفهای
-لنگرود
-فریمان
-سلاح‌های
-میانگین‌جریان
-غبار
-مردانه
-مؤسسهٔ
-اسراییل
-تک‌نواز
-۱۶۶
-لکی
-خبرنگاران
-پالایشگاه
-مصلحت
-۱۷۷
-مجروح
-پرستش
-دوگانه
-مدفون
-ولیعهد
-سرزمینی
-آق‌قلا
-اساسا
-بهر
-ملي
-كنار
-روستاي
-کلاس‌های
-سفره
-نرمال
-وری
-کیف
-۱۸۸۰
-۱۹۸
-زدید
-زراعت
-رهنمودها
-توضيح
-۱۷۲
-۱۹۲
-پدیدار
-وایت
-بمانند
-لرد
-دستم
-ایسلند
-لیقوان
-نیافتم
-باتشکر
-تئودور
-عبادت
-تبديل
-نکردید
-مسلحانه
-دیزنی
-رانش
-فرهنگ‌های
-مخاطبان
-دول
-کتابت
-سلیم
-ایرانی‌تبار
-غلظت
-شونده
-۱۲،
-اوراق
-سامانی
-اقتصادی،
-۲۵۰۰
-شخصیت‌ها
-فحش
-سربازی
-هشداردهنده
-ندرت
-۳۲۰
-می‌شه
-۱۸۹۷
-فروهر
-صلی
-سیوند
-انجمن‌های
-بعلاوه
-ترشح
-فرج
-جاي
-بخیر
-محراب
-کارتان
-هجده
-قریه
-ربیع‌الاول
-ضخامت
-بارندگی
-بح
-نسیم
-زهره
-جادویی
-تالاب
-جنون
-بروی
-۱۳،
-فیلد
-کریسمس
-میزبانی
-می‌کنید،
-آپلود
-برگزیدگان
-یش
-خانواده‌اش
-کریستوفر
-بیننده
-توکلی
-می‌سازند
-لنگ
-تداخل
-مقدمات
-۱۸۹۴
-الوند
-مع
-گناباد
-مزدا
-رکن
-عیلام
-ترقی
-منکر
-معامله
-اینچنین
-کول
-سازمان‌ها
-مأموریت
-موعود
-دولت‌آباد
-بلبل
-طولی
-می‌رسند
-اجاق‌کندی
-ديگري
-ندارد؟
-براین
-مصور
-اعتقادی
-فرخزاد
-درباره‌ی
-خداآفرین
-گفتاری
-خوانی
-پارامترهای
-تهاجم
-آیوی
-توضیحاتی
-بشرویه
-۹۷۸
-کیست
-نداشت،
-شهروندی
-برخي
-۱۵۶
-سمرقند
-نوا
-كمك
-لامپ
-عماد
-رام
-اينکه
-ضمیمه
-بنابراین،
-تصویربرداری
-سیبری
-یوفا
-کلر
-گوجه
-حیف
-سواری
-۱۳۱۲
-طارم
-۲۶۰
-اباد
-عنوان‌های
-مركز
-مقوله
-گوستاو
-مرعشی
-بحر
-تون
-انصار
-جداسازی
-تصفیه
-سازندگان
-ببنید
-محافل
-نقره‌ای
-تیرماه
-پیاز
-سرسبز
-انه
-چشمان
-تایباد
-اشیا
-طرد
-گوهر
-نکن
-هرزگوین
-اقلید
-خاص،
-ثالث
-علی‌رضا
-آنگونه
-مستمر
-عضوی
-هامبورگ
-پورتال
-تویوتا
-رامیان
-هخامنش
-اردل
-قاطع
-گنجینه
-روشنفکران
-تصادف
-۱۹۷
-جزیی
-مؤسس
-روبروی
-آلاسکا
-خوشه‌مهر
-آرد
-صالحی
-سونامی
-کشیش
-پروس
-انحصاری
-کاسته
-دوستانش
-گاوران
-دلالت
-۱۸۴
-اصحاب
-جزیره‌ها
-مهدوی
-آبیک
-افزايش
-مزیت
-جوابی
-صغیر
-منحنی
-رمین
-سانتیگراد
-دبیرکل
-غریب‌دوست
-بنزین
-اپیزود
-استانهای
-بهاءالله
-سپید
-کمونیستی
-سوگند
-شهباز
-اکتشاف
-استحکام
-مفاد
-بسازد
-اسکناس
-۱۴۰۰
-مبدأ
-بخورد
-مناظر
-زا
-پرستی
-تمبکا
-محرمانه
-سکنه
-زیتون
-رومانیایی
-جسارت
-عمومی،
-دات
-آهنی
-بینید
-مخابراتی
-نظرش
-مولداوی
-العظمی
-ولف
-ممکنه
-راننده
-اولاً
-وَمَا
-وسیله‌ای
-موی
-بادلو
-چرب
-مسافت
-مکس
-۱۷۸
-پودر
-عوام
-که،
-پنجم،
-گرگوری
-میسر
-مفصلی
-استبداد
-حیدرآباد
-آلیس
-فیروزه
-ریخت
-اینان
-کروی
-وقف
-شعارهای
-۱۹۶
-سملقان
-فروخته
-۱۷۴
-نبوده‌است
-دیکتاتوری
-میدهم
-ظریف
-معتبرترین
-سیاسر
-ایرادات
-اجماعی
-۱۹۳
-منحل
-زاید
-میخواهم
-صاحبان
-مهلت
-می‌پرداخت
-ماهه
-جری
-بازرس
-وَلَا
-گلشن
-برهنه
-نوشته‌ام
-می‌شود؟
-صخره
-عمو
-ابد
-بیداری
-۱۸۸۸
-۲۷۰
-بعلت
-پنیر
-حاتمی
-خانقاه
-رس
-شکسپیر
-معذرت
-پايان
-ساختگی
-آموختن
-فقدان
-پاسخگویی
-زانو
-كوه
-لزوما
-قمر
-شهریاری
-بيان
-واین
-صورتیکه
-بدنبال
-پاره‌ای
-ارمغان
-می‌شود؛
-شغلی
-دیگ
-عنبرآباد
-امریکایی
-پیشرو
-تجربیات
-علوم،
-پیری‌کندی
-ازجمله
-به‌نام
-صومای
-۳۳۰
-۲۶،
-اسطوره‌های
-منفجره
-دستتان
-رشته‌کوه
-۱۹۵
-برن
-بلده
-شیعی
-رحیمی
-رجایی
-کجور
-۱۵،
-تاون
-آموزگار
-آستارا
-هیل
-ترانه‌ها
-یوری
-کلاله
-محو
-خوانندگی
-زار
-عیب
-افسانه‌های
-پخت
-نامبرده
-پنجشنبه
-سور
-نروژی
-تکنیک‌های
-دریاچه‌های
-مالدیو
-سوسن
-کیسه
-کاوش
-دابودشت
-کردن،
-زندگان
-مقدمه‌ای
-موزهٔ
-۱۸۸
-برپایی
-داگلاس
-فضل‌الله
-زینب
-اللَّهَ
-صحرایی
-کرت
-اذیت
-نمی‌رسد
-آتشفشان
-۱۳۲۱
-بلاروس
-انگ
-ارگان
-بسامد
-نشوید
-بزرگای
-کلارک
-۲۱،
-بشدت
-نقوش
-خوشنویس
-الفبایی
-نخ
-رفیق
-ناراحتی
-رسی
-بخواهند
-طرفداری
-دردسر
-۴۵۰
-۱۸۳
-ایرباس
-پرت
-فرآیندهای
-گردشگران
-مخرب
-میگم
-کارتون
-نوژن
-سفری
-صندلی
-می‌کرده
-نزنید
-ج۱
-میخواهید
-گنگ
-می‌ریزد
-پشتکوه
-ویکی‌پدیاست
-دلاری
-ویکیفا
-خيلي
-بازگشایی
-چشمگیری
-نیتروژن
-بافی
-لانه
-بدید
-آشتیانی
-باشد؛
-محققین
-۲۴،
-یوتا
-طرفه
-توسعهٔ
-کشتی‌های
-۲۰۶
-جاستین
-شوشتری
-اسمیت‌سونیان
-طوطی
-عباسیان
-رده‌ای
-زرند
-می‌رود،
-ابتکار
-دهلران
-بستان
-برجای
-۳۸۰
-رمانتیک
-ترجمه‌های
-کاربرها
-بندری
-پرداختن
-منهتن
-پاتریک
-طناب
-چهارم،
-نتواند
-بور
-دانسته‌های
-روحیه
-میلاد،
-برزنجیر
-مرجان
-دهند،
-شهرستان‌ها
-سپرد
-داران
-استوارت
-دوچرخه
-طراحي
-۱۱۰۰
-خانه‌ای
-نوآوری
-نامنظم
-کامپیوترهای
-دیوانسالاری
-وفادار
-هرودوت
-امسال
-استثنا
-فرانکفورت
-مجالس
-خدمتتان
-کتابداری
-لاین
-پوران
-آنالوگ
-برادوست
-۲۰۸
-شادباش
-می‌شناسند
-بولکیمده
-می‌نویسم
-چالدران
-کهنوج
-تطبیقی
-۱۶،
-دیدگاهی
-منحرف
-شنوایی
-تیز
-تیغ
-موشکی
-پرشیانا
-امیل
-ایزدان
-سه‌گانه
-پنجه
-۱۸۹۱
-۱۳۲۲
-دين
-قبله
-جهنم
-خدماتی
-ببرند
-مأمور
-نیستیم
-کلمه‌ای
-اعتیاد
-فرانکلین
-معجزه
-ذهنم
-بازماندگان
-مصوبه
-کلینتون
-برسند
-معاهده
-نمیکنم
-چندگانه
-شهرستانی
-لاک
-موضوعاتی
-خوسف
-اسک
-خروس
-لتونی
-وات
-کرد؛
-رودکی
-خدمتم
-تاری
-مجلسی
-فهمید
-هفتگی
-کروز
-برگرداننده
-قیصر
-معروفی
-فكر
-نو،
-فضانورد
-فتح‌آباد
-هورمون
-الفاظ
-آمازون
-بیاوریم
-دستهٔ
-می‌کردید
-بینایی
-پافشاری
-بردم
-دیپلماتیک
-سنگینی
-نمره
-غیرآزاد
-فریب
-پذیرد
-حیطه
-اصلی،
-تربیتی
-محال
-ارجمند
-می‌یابند
-فلج
-اربر
-اینجا،
-آوای
-دودانگه
-چاه‌بهار
-همزه
-۲۳۸
-تمبر
-انوشیروان
-متن‌های
-پشتوانه
-عجب‌شیر
-قسمت‌ها
-آشوب
-بدرود
-نظرشان
-ه‌های
-روزتان
-استفان
-گیتاریست
-نشده،
-دینار
-چاره
-تیموری
-زهی
-مغولی
-۲۵۶
-هیوستون
-الموت
-۱۸۷۹
-راگبی
-لوکزامبورگ
-حیث
-عاج
-سخت‌افزار
-رمانی
-نگهبانی
-پتروشیمی
-چادر
-صلیبی
-کنکور
-کانسار
-بلوچ
-زاهدی
-هستید؟
-دوبله
-طیفی
-نشریه‌های
-زنبور
-حزب‌الله
-اخوان
-اجزاء
-ژنو
-دعای
-مزمن
-سخنی
-نهایتاً
-اندرو
-میشوم
-۱۸،
-دارمشترانگ
-می‌دارند
-سه‌شنبه
-حفره
-زرندیه
-ذخایر
-۱۳۱۹
-زنجیر
-سبکی
-قیمتی
-جنیفر
-۲۰،
-تعمید
-آبگرم
-حکمرانی
-پلاستیک
-بی‌نزاکتی
-تماشاگر
-لایحه
-بازه
-تحکیم
-موضعی
-جویی
-محافظة
-شاه،
-ما،
-۳۰،
-آمبرلا
-کلرادو
-هیجانی
-مجتهد
-گیاه‌شناسی
-اضطراب
-جنگ‌افزارهای
-۱۹،
-ادوار
-مسیری
-چمران
-پایه‌های
-گیتاشناسی،
-نمی‌کنید
-گیل
-متین
-آدلر
-۱۷،
-بعدش
-باکس
-یاس
-حکمیت
-کیلوبایت
-بریده
-هموار
-معقول
-کروم
-۱۸۸۶
-غزنوی
-نوش
-بازنشستگی
-گوینده
-یک‌نمونه
-هنر،
-میاد
-عظمت
-جهش
-جانبداری
-شبكه
-آسا
-استاندار
-۲۰۹
-فرانسیسکو
-بریتنی
-محدودیت‌های
-بشکه
-بنگرید
-تاثیرات
-آسفالت
-گیج
-کاروان‌سراهای
-فراموشی
-گلدار
-ترتیب،
-يافت
-همینجا
-بدخشان
-۲۵،
-تمدید
-زيادي
-هستش
-رضا۱۶۱۵
-بودی
-مهرماه
-اسکندریه
-لزوماً
-سیستمی
-هارون
-نگفته
-می‌دانیم
-سایوز
-آن‌را
-نوزده
-بمبئی
-فان
-میدانند
-۱۸۷
-دانستند
-اجاره
-فورت
-مراقب
-نفرت
-نوی
-۲۰۴
-تدریجی
-تهی
-نورآباد
-گزاره
-کلامی
-نتیجه‌ای
-پانک
-هاكل
-عفونی
-بسر
-پیشگامان
-بلاغ
-زئوس
-بريفين
-گزارش‌های
-نمایندهٔ
-سیالات
-۱۸۲
-فارسان
-جلدی
-فلک
-تحقیر
-فهمیدم
-ناتو
-سایرین
-شناور
-انستیتو
-نیکو
-مارکسیسم
-تبعیت
-تفریح
-زبان،
-گلوگاه
-بقیهٔ
-کمپین
-احراز
-بودن،
-محکومیت
-کماکان
-بستری
-تروریست
-سرواژهٔ
-دانمارکی
-آمستردام
-همی
-داوید
-کافیست
-دنی
-رون
-۶۰۰۰
-لابد
-کانتری
-سس
-کسری
-می‌فرمایید
-سیاستمدار
-حریم
-معنویت
-عسکری
-بخشیدن
-محصور
-مدافعان
-گرایش‌های
-واگن
-حجر
-سرداران
-مشهود
-یافتم
-تنسی
-نهر
-دارالفنون
-نمايش
-بسياري
-سابقهٔ
-یتیم
-توپولوژی
-۱۴،
-نگارشی
-جمعيت
-تنبیه
-کیو
-سقط
-شریفی
-کما
-میکروبیولوژی
-دیابت
-تاتنهام
-منقرض
-تاتی
-محمددین
-انگليسي
-فارسی‌سازی
-زمینهای
-شهدا
-۰۸،
-متکی
-کوه‌ها
-دزد
-کنایه
-مشایخ
-ارزان
-ماسه
-هرمان
-تنظیمات
-اونجا
-خار
-هیلاری
-چنار
-خزانه
-شکاری
-عجایب
-رنو
-قراردادن
-جابر
-سروستان
-مستطیل
-مجموعه‌ها
-بهمیی
-یکسال
-سرخرگ
-نادرشاه
-لیاقت
-دوستار
-وارده
-کاستیا
-لرزه
-اى
-بجا
-نم
-مغولان
-امارت
-کشاورزان
-طبی
-کجاست؟
-نبح
-نمایم
-للطباعة
-بکنند
-داستان‌ها
-آمیخته
-تاريخي
-اندازه‌ای
-پیکار
-مستعمره
-کوهپایه
-تصدیق
-۱۳۱۵
-فیلترینگ
-۰۹،
-آدینه
-توبه
-بصری
-بکنیم
-هوتک
-فیلم‌نامه
-پشتون
-زمره
-حبیبی
-اسکندری
-نیایش
-هائی
-رقابت‌های
-داوطلب
-ازش
-بنظرم
-دلیجان
-رضی
-مصاحب
-پرون
-بازگو
-آگهی
-قولی
-سیسیل
-انگلیسی‌ها
-مکاتب
-حبیب‌الله
-سانسکریت
-توکل‌آباد
-نموده‌اند
-حیوانی
-پروژه‌ها
-گیتی
-فالتز
-سنگسار
-بخت
-میلانی
-مارکوس
-نید
-شدیم
-۲۲۴
-مش
-فصول
-کتابش
-می‌خواهیم
-مشی
-آنی
-مادهٔ
-میکردند
-یکا
-طلبان
-عهدنامه
-الملل
-ارکان
-کاربریتان
-جلال‌الدین
-ایرونی
-یونس
-آبراهام
-فرشتگان
-فارسی‌زبانان
-۲۰۳
-۳۵،
-ناتمام
-موظف
-ایت
-می‌زنم
-ییلاق
-منی
-كم
-گریه
-بسازیم
-سیبک
-انجا
-موفق‌ترین
-۱۳۰۷
-ثروتمند
-گریخت
-زمان‌دار
-تروا
-ژرمنی
-برنارد
-تشكر
-ژنریک
-راهبردی
-گره‌های
-پارسی‌گوی
-بندهای
-مبادله
-اسفندیاری
-سرتیپ
-خوارزم
-کلاغ
-ياد
-ايراني
-نجف‌آباد
-سولفات
-كامل
-ناظری
-شهرستانهای
-أَنْ
-میگ
-پادگان
-مرتضوی
-زياد
-کلود
-مقاصد
-بهارستان
-دیکتاتور
-باستان،
-۳۱،
-اسکای
-الکلی
-میباشند
-پارتی
-بیاورند
-لایه‌های
-پرتقال
-آمیزی
-۴۰،
-۱۸۶
-رستاخیز
-خرگوش
-فیبر
-لیبرالیسم
-مخترع
-تعمیم
-برمی‌گردد
-تل‌آویو
-خورش
-مولد
-ستم
-باغات
-نژادهای
-ضربات
-آنست
-ارواح
-جوار
-اپرای
-تحتانی
-آنتوان
-زحمتش
-۱۸۸۲
-بازگشتی
-رفت،
-۱۸۹
-هوگو
-گیلاس
-۲۰۵
-دستاوردهای
-قضائیه
-۴۰۰۰
-مستقلی
-رعنا
-بخوان
-۵۶،
-سوزی
-تلاشی
-هرکسی
-میلی‌متر
-هفته‌نامه
-برومند
-کباب
-سرمایه‌گذاری
-پلاتین
-دنیس
-وگاس
-قرآن،
-نصرت‌آباد
-۲۲۵
-۱۹۱
-بافق
-ژاله
-آبریز
-صدد
-املاک
-مقاله‌
-بوانات
-پژو
-زمان‌ها
-کامیاران
-پگاه
-۲۰۲
-حرف‌های
-ترغیب
-حک
-مسطح
-دی‌وی‌دی
-جانبه
-سفیران
-غدد
-هستند؟
-مدرسه‌های
-۵۲،
-منبع‌دار
-چاله
-نائین
-مدير
-عکاسان
-آب‌خورده
-فیات
-خبرنامه
-مشهدی
-استرالیایی
-سیامک
-بگیر
-شایان
-درسته
-نامند
-ویرایشهای
-گل‌ها
-مایا
-گروه،
-آتشفشانی
-کرده‌است،
-نیمهٔ
-آزادشهر
-رانده
-علاقه‌ای
-ثریا
-متشکر
-ولت
-فرزانه
-صورت‌های
-دانشگاههای
-وز
-ویدئوی
-جنازه
-برتون
-جلوه‌های
-تغییرمسیرهای
-بیانیه‌ای
-دون
-نبوی
-یک‌بار
-رک
-حزب‌های
-مدارهای
-میگویم
-كنيم
-معلق
-تماشاگران
-نش
-نصیر
-۱۹۴
-رضاخان
-گردد،
-کنسول‌های
-قسمتهای
-شورشیان
-دقیق‌تر
-مداخله
-علاءالدین
-استنباط
-مصرفی
-باردار
-اهورامزدا
-ادبيات
-باهنر
-مقرر
-عزاداری
-كلمه
-خونین
-محدودی
-نمی‌دارد
-ذوق
-پرسش‌های
-بریم
-قشر
-۳۸،
-صالح‌آباد
-محسنی
-تخلص
-شکل‌های
-شوی
-رنگ‌ها
-توربین
-مگابایت
-فسفات
-واجد
-اهانت
-محفل
-برحسب
-گیگا
-گيرد
-۱۸۷۰
-صنفی
-تن‌تن
-برگردانده
-دایناسور
-لای
-می‌بینیم
-۰۴،
-فرمائید
-سیارات
-۵۱،
-تص
-سرودهای
-معترض
-ممكن
-متا
-می‌شویم
-ثلاث
-گفته‌های
-بی‌طرفانه
-هاپ
-نهان
-ادارات
-عجیبی
-جنایات
-دستورالعمل
-پارا
-نهادند
-ام،
-فتنه
-فواصل
-۱۸۵۰
-توریستی
-مرمر
-دیتابیس
-۴۲،
-کلیات
-۱۸۸۳
-لنین
-بلكه
-کاتوزیان
-میسیسیپی
-معاویه
-یوونتوس
-کشاورزی،
-هوافضا
-كوخرد
-فاریاب
-محيط
-نکنید،
-میترا
-رنگین
-آلپ
-آلومینیوم
-ملودی
-سیاستمداران
-گمر
-اسکان
-مختصری
-قشون
-جوادی
-رباتی
-۲۱۱
-جایز
-۲۷،
-محمودی
-كاربران
-یافته‌اند
-بگذریم
-محوری
-زمان‌های
-۲۲،
-انصراف
-میلا
-ساير
-۲۱۴
-تصریح
-۳۶،
-۲۸،
-آلباسته
-وظیفهٔ
-آذرشهر
-خدمه
-بارانی
-فیزیک‌دانان
-۱۸۸۴
-تماشای
-۱۳۱۱
-نويسنده
-علامرودشت
-افزاری
-گلشیری
-عملیات‌های
-داس
-ناخواسته
-هوتن
-واسه
-ثانیا
-لینه
-سنج
-اروپا،
-ایلیا
-بازمانده
-بشریت
-شناسی،
-۱۷۰۰
-کالیفرنیا،
-نکرده‌ام
-سیلیکات
-آزاده
-کامنت
-یونیکد
-آمدم
-احضار
-توده‌ای
-فرایندهای
-بیماری‌ها
-آخه
-تبلور
-۰۷،
-۲۰۷
-مونوبوک
-تصمیمات
-اختراعات
-جشنوارهٔ
-مشاهدات
-ریزشگاه‌ها
-۲۹،
-فیلادلفیا
-یزید
-سکولار
-خشایارشا
-سنتور
-محافظه
-کاپ
-نادرستی
-علی،
-محیط‌های
-منفرد
-اهتمام
-القاعده
-علاقهٔ
-لرزش
-عصبانی
-پسند
-لیل
-۲۲۶
-جدای
-جواهر
-ژولیوسی
-کوچک،
-شمیرانات
-بخوانند
-ربیع‌الثانی
-۵۰،
-۲۳۵
-توپخانه
-نیکلاس
-ویستا
-فردیناند
-۲۸۰
-تشییع
-نمیکند
-موسیقی،
-نیرومند
-۱۸۷۸
-غفاری
-بفتا
-هویدا
-صدیقی
-سلیمانی
-سياسي
-شهرضا
-جوانرود
-انتشاراتی
-شخصه
-۵۵،
-آسیاب‌های
-خوب،
-راههای
-والنشر
-حماسی
-عکسها
-۲۱۲
-۱۸۸۵
-تعریفی
-قاسمی
-مصادف
-مفرغ
-گشتاور
-۱۸۷۵
-شکل‌گیری
-طهماسب
-موجودیت
-ستاره‌ها
-آوردید
-سازه‌های
-۲۱۷
-ببریم
-ارسنجان
-بیدگل
-مگه
-عبادی
-فایل‌های
-۱۸۷۶
-تبریز،
-رهنما
-سپر
-قاره‌ای
-وو
-جعبه‌ای
-دانش‌نامه
-اجتماعي
-هیجان
-کارتر
-نرسید
-۳۳،
-کارم
-نمی‌شود،
-نسل‌کشی
-نمونه،
-صمد
-دریک
-میله
-پلاسما
-زاغ‌ده
-داروین
-۴۴،
-ویس
-قاچاق
-املای
-نامیدن
-گنجانده
-شادگان
-نی‌بید
-۲۲۲
-تسهیل
-هلن
-ناپدیدشدن
-خط‌ها
-ابلاغ
-شمع
-بازی،
-فندقاع
-جوهر
-پترزبورگ
-هخ
-سکو
-۴۱،
-یاسر
-۵۷،
-مستلزم
-آلبومی
-کلک
-ضخیم
-پاشا
-۲۳،
-۱۸۸۱
-دی‌ان‌ای
-حساب‌های
-غلامعلی
-خواندند
-معلمان
-همیلتون
-مداری
-مست
-تصویرها
-اندیشهٔ
-شدیداً
-دیواندره
-کنن
-بشوند
-نیامد
-مانگا
-۱۳۱۷
-چسب
-شجاعت
-مشتاق
-ایرا
-دانا
-بریتیش
-ویکی‌پدیاها
-مهم‌تر
-روبرت
-کافه
-ئی
-ارضی
-دست‌کم
-دندان‌پزشکی
-مهرآباد
-كننده
-رضوانشهر
-پراگ
-پال
-فرسایش
-درگاه‌ها
-راور
-میکروسکوپ
-فشارهای
-آرزومندم
-مصاحبه‌ای
-ویولن
-دریافت‌کنندگان
-نجیب
-سئول
diff --git a/perf/texts/hi-words.txt b/perf/texts/hi-words.txt
deleted file mode 100644
index 1dc18dcc1..000000000
--- a/perf/texts/hi-words.txt
+++ /dev/null
@@ -1,10000 +0,0 @@
-के
-में
-की
-है
-का
-और
-से
-को
-है।
-एक
-पर
-श्रेणी
-वार्ता
-भारत
-हैं
-भी
-यह
-शीर्षक
-पूर्व
-लिए
-गाँव
-ईसा
-उत्तराखण्ड
-किया
-ने
-इस
-संवत
-कि
-हिन्दी
-जो
-।
-जाता
-गया
-या
-जिले
-वर्ष
-जिला
-नहीं
-कर
-साँचा
-ही
-हैं।
-करने
-हो
-रूप
-था
-साथ
-द्वारा
-जन्म
-तहसील
-फ़िल्म
-होता
-तथा
-बाद
-विकिपीडिया
-आधार
-अन्य
-प्राचीन
-कुछ
-सदस्य
-अपने
-इसके
-प्रदेश
-तो
-एवं
-तक
-चित्र
-बाहरी
-राज्य
-जा
-प्रकार
-सरकार
-नाम
-दिया
-होती
-स्वागत
-कई
-वह
-बिहार
-करते
-सप्तर्षि
-जैसे
-थे
-समय
-अनुसार
-आदि
-वे
-सकते
-अधिक
-वाले
-किसी
-आधिकारिक
-सकता
-कड़ियाँ
-भारतीय
-उत्तर
-मण्डल
-हुए
-न
-जाती
-प्रखण्ड
-हुआ
-क्षेत्र
-लेख
-द
-बनी
-होने
-उसके
-करता
-इन
-अंग्रेज़ी
-संदर्भ
-थी
-था।
-शक
-कारण
-भाषा
-बहुत
-स्थित
-पहले
-उनके
-प्रसिद्ध
-सहायता
-जब
-दो
-अपनी
-कोई
-सबसे
-अलावा
-स्थान
-होते
-कम
-विश्व
-लिये
-ये
-जाने
-बारे
-लेकिन
-प्रयोग
-उन्होंने
-राष्ट्रीय
-वर्षों
-कहा
-पृष्ठ
-गए
-रहा
-आप
-देखें
-व
-एक्स्प्रेस
-तरह
-मे
-करना
-शामिल
-सभी
-प्रमुख
-आंध्र
-इसी
-अमेरिका
-प्राप्त
-करें
-अन्तर्गत
-इसे
-माना
-सितंबर
-उस
-५७
-इसका
-जानकारी
-नगर
-मुख्य
-हुई
-शिक्षा
-उन्हें
-संस्कृत
-कलियुग
-बीच
-गई
-विक्रमी
-रहे
-उपयोग
-मार्च
-पोर्टल
-काम
-वेबसाइट
-जनवरी
-कुमाऊँ
-उसे
-शहर
-जाते
-उनकी
-लोग
-जिसमें
-देश
-दी
-संघ
-थे।
-भाग
-लोगों
-जीवन
-१
-कार्य
-जी
-फिल्म
-विशेष
-बार
-ओर
-२
-इतिहास
-कभी
-दोनों
-अब
-निर्माण
-२००९
-पुरस्कार
-वाली
-शब्द
-पताका
-अधिकांश
-चिह्न
-विकास
-धर्म
-केवल
-लिया
-ए
-दक्षिण
-पुराने
-जुलाई
-यहाँ
-नया
-स्टेशन
-फिर
-लगभग
-संयुक्त
-अलग
-आन्ध्रप्रदेश
-गढ़वाल
-स्थल
-दिल्ली
-ई
-आरम्भ
-अपना
-जून
-विस्तृत
-यदि
-प्रान्त
-इसकी
-सूत्र
-शुरु
-मंदिर
-जालपृष्ठ
-जिसे
-घटनाएँ
-कृषि
-दौरान
-करती
-निधन
-दिन
-संगीत
-यहां
-तीन
-क्योंकि
-इसमें
-साहित्य
-ऑफ़
-मूल
-भूगोल
-॥
-पास
-पटना
-नए
-हालांकि
-सिंह
-प्रदर्शित
-प्रतिरूप
-अप्रैल
-बात
-विषय
-टेनिस
-२०१०
-प्रतियोगिता
-प्रचलित
-कहते
-विज्ञान
-विभिन्न
-अगस्त
-ऑफ
-पद्धति
-छत्तीसगढ़
-सन्
-जाना
-शुरू
-बना
-समूह
-अनेक
-थी।
-ता
-प्रामाणिक
-मध्य
-रही
-सूची
-संख्या
-व्यक्ति
-ऐसा
-गणना
-प्रति
-आज
-तब
-उनका
-क
-इलाहाबाद
-ऐसे
-मैं
-काल
-हम
-युद्ध
-गया।
-वाला
-श्री
-आदर्श
-स्थिति
-सी
-सकती
-दिसंबर
-प्रदान
-विक्रम
-विश्वविद्यालय
-रेलवे
-बड़े
-सामूहिक
-किया।
-किए
-राज्यक्षेत्र
-यातायात
-उन
-चार
-उपरोक्त
-दर्शाता
-बन
-अर्थ
-अलीगढ़
-दूसरे
-तौर
-गयी
-५८
-अन्तर
-उत्तरा
-राजा
-प्रभा
-क्या
-घटित
-मानकर
-विभाग
-कैलेंडर
-देने
-बनाने
-खेल
-प्रथम
-हिंदी
-इन्हें
-एकल
-उसकी
-एंड
-मसीह
-अथवा
-अमेरिकी
-जहां
-उदाहरण
-कलाकार
-निकाले
-आवश्यक
-७८
-महत्वपूर्ण
-पुरुष
-मई
-नदी
-जिसके
-प्रभाव
-आम
-जूलियन
-योगदान
-किये
-अधारित
-ले
-अधार
-इस्तेमाल
-सेवा
-३०७६
-जिसका
-३१०२
-पंचाग
-६६७६
-चर्चा
-भोजपुरी
-कैसे
-उर्दु
-कलेण्डर
-करके
-चाहिए
-स
-कला
-उपलब्ध
-जनसांख्यिकी
-साल
-काफी
-फर्रुखाबाद
-आगरा
-कंपनी
-३
-उच्च
-अक्तूबर
-आ
-मेरा
-स्तर
-नवंबर
-नीचे
-देता
-अध्ययन
-जारी
-कोड
-पहली
-प्रणाली
-अगर
-ओपन
-ध्यान
-उसका
-नामक
-बड़ी
-जल
-नैनीताल
-अक्सर
-अंग्रेजी
-सरकारी
-वर्तमान
-रंग
-जिससे
-मेल
-पुलिस
-रखा
-प्रत्येक
-हर
-बनाया
-ट्रेन
-सामान्य
-दुनिया
-भूमिका
-लिंक
-दे
-जबकि
-सन्देश
-शरीर
-पता
-भागलपुर
-विचार
-जहाँ
-लगा
-लेकर
-बड़ा
-वर्ग
-आगे
-छोटे
-तथ्य
-समाज
-पानी
-इससे
-उसने
-देशों
-महिला
-इसलिए
-देना
-पर्यटन
-एस
-परिणाम
-अल्मोड़ा
-सब
-स्थापना
-बाह्य
-स्थापित
-पौड़ी
-दल
-माध्यम
-आधारित
-पश्चिम
-प्रदर्शन
-सर्वश्रेष्ठ
-चीन
-शक्ति
-बाहर
-बी
-ऊपर
-बेगूसराय
-उत्पन्न
-हेतु
-डी
-आशीष
-अतिरिक्त
-समान
-वीं
-हिन्दू
-गये
-परिवर्तन
-आधुनिक
-लिखा
-कुमार
-देखा
-अंत
-मार्ग
-मानव
-रेल
-अक्टूबर
-आपको
-घर
-प्रश्न
-दूर
-कन्नौज
-भटनागर
-सामाजिक
-प्रकाशित
-अभिनेता
-देते
-कुल
-अभी
-जिस
-होना
-आई
-४
-पूरी
-संबंधित
-रहता
-ज्ञान
-ब्रिटिश
-कृपया
-हस्ताक्षर
-व्यक्तिगत
-बिना
-नई
-रोग
-१०
-दशक
-अधिकार
-परिवार
-शैली
-लेखक
-संस्करण
-जिनमें
-सेना
-संबंधी
-औरंगाबाद
-प्रक्रिया
-यात्रा
-२००८
-नये
-आवश्यकता
-ऐसी
-स्वयं
-होगा
-संबंध
-चिकित्सा
-मात्रा
-परियोजना
-प्रबंधक
-१५
-विकसित
-संदेशों
-होकर
-प्रकाश
-पहाड़ी
-पहला
-आकार
-सुधार
-जगह
-पन्ना
-सही
-मैथिली
-तैयार
-नवम्बर
-पिता
-मुक्त
-क्षेत्रों
-रचना
-१२
-२००७
-पूरा
-पी
-संस्थान
-५
-लोक
-१३
-चरित्र
-तुलना
-हुआ।
-लाल
-उत्पादन
-जनसंख्या
-रहते
-उसी
-इनके
-ा
-१४
-संदेश
-ज्यादा
-शताब्दी
-मृत्यु
-साधारण
-पाकिस्तान
-मास्टर्स
-दूसरी
-पुस्तक
-भगवान
-इनमें
-पूर्ण
-लाभ
-टीम
-बैंक
-अवधि
-भिन्न
-खिलाड़ी
-ली
-सदस्यों
-आने
-प्रयोक्ता
-कार्यक्रम
-सीमा
-समर्थन
-संस्कृति
-े
-अंतिम
-स्कूल
-बने
-विकि
-टी
-अ
-पाया
-नही
-र
-सदी
-फरवरी
-मुझे
-सन
-परिचय
-लेने
-मेरे
-पार्टी
-उत्तरी
-लिखने
-१८
-दिसम्बर
-राम
-भर
-विशिष्ट
-मी
-क्षमता
-प्रयास
-सहित
-पश्चिमी
-सिद्धांत
-दर्शन
-सभा
-किंतु
-वर्णन
-विधि
-श्रृंखला
-बजे
-संगठन
-गीत
-एम
-बेबल
-राजधानी
-प्रभावित
-पौडी
-ठीक
-सुझाव
-गति
-प्रबंधन
-व्यापार
-सामग्री
-ना
-एन
-दृष्टि
-दिया।
-पद
-ब्रजभाषा
-म
-सूचना
-शोध
-नामांकन
-अवधी
-लोकप्रिय
-आन्ध्र
-हाथ
-रहने
-विस्तार
-ऑस्ट्रेलिया
-वृद्धि
-फ़रवरी
-११
-जैसा
-आर
-कहानी
-व्यवस्था
-क्रिकेट
-बागेश्वर
-पृथ्वी
-चमोली
-गांव
-युग
-यौगिक
-कहीं
-पूर्वी
-२०
-सुरक्षा
-मुखपृष्ठ
-स्पष्ट
-१६
-मिलता
-देवी
-यही
-बुंदेली
-सामने
-प्रवेश
-यूरोप
-रखने
-दिए
-जॉन
-जिन्हें
-दूसरा
-पूरे
-स्थानीय
-आते
-नियंत्रण
-चीनी
-दिखाई
-प्रकाशन
-ऊर्जा
-प्राकृतिक
-की।
-जैन
-लगता
-बनाए
-अमरीकी
-कवि
-व्यापक
-दर
-वजह
-वहाँ
-परीक्षण
-लंदन
-प
-ी
-बदल
-जाए
-अदिलाबादु
-शासक
-खोज
-द्वितीय
-बस्तर
-मदद
-योजना
-ब्रिटेन
-प्रस्तुत
-जे
-धार्मिक
-आर्थिक
-सहायक
-लेखन
-शुरुआत
-मिल
-डॉ
-प्रौद्योगिकी
-शासन
-स्रोत
-रायगढ़
-वैज्ञानिक
-कमी
-आपके
-मिनट
-पत्र
-निर्वाचन
-रक्त
-ऑफिस
-गूगल
-संग्रह
-उद्योग
-राष्ट्र
-एशिया
-सांस्कृतिक
-पदार्थ
-इनका
-आपका
-मुंबई
-हिस्सा
-दृष्टिकोण
-उद्देश्य
-वी
-ह
-दूरी
-आता
-अनुवाद
-वो
-पीछे
-भूषण
-क्रिया
-स्वास्थ्य
-पैदा
-केंद्र
-२०११
-अच्छे
-पद्म
-शब्दों
-ऐतिहासिक
-गैर
-पिथोरागढ
-छोटी
-६
-सार्वजनिक
-कपूर
-प्रेम
-मुंगेर
-रहती
-चैनल
-समस्या
-कनाडा
-अंतर्गत
-देवनागरी
-राष्ट्रपति
-जिसने
-बैंड
-साम्राज्य
-कॉलेज
-मगही
-प्रयुक्त
-पुत्र
-अनुसंधान
-पहचान
-निर्मित
-किमी
-बंद
-प्रतिशत
-लगे
-अंतर्राष्ट्रीय
-ताकि
-भूमि
-मानक
-इंग्लैंड
-सके
-प्रारंभिक
-सन्दर्भ
-थीं
-अंगिका
-दिशा
-जर्मनी
-१९
-संकेत
-बच्चों
-द्वीप
-समाचार
-अफ्रीका
-घोषणा
-रह
-बंगाल
-भाषाओं
-घंटे
-हाल
-राजस्थान
-वहां
-आया
-उपन्यास
-कानून
-दिनों
-अभिनेत्री
-खिलाफ
-सदर
-अनुमति
-हवाई
-टीवी
-समाप्त
-मीडिया
-उपचार
-हमारे
-जनता
-नियम
-संक्षेप
-मन
-मिलियन
-चौपाल
-उपकरण
-राज
-भीतर
-चेन्नई
-२८
-कृष्ण
-क्लिक
-३०
-कविता
-कथा
-सूर्य
-प्रेस
-वीडियो
-स्वतंत्रता
-वन
-राजनीतिक
-आमतौर
-देती
-दृश्य
-न्यू
-योग्य
-लागू
-मिला
-बताया
-मैच
-जिसकी
-सा
-मीटर
-नेटवर्क
-रोचक
-भोजन
-हूँ
-मौजूद
-धीरे
-१७
-संभव
-माता
-नृत्य
-७
-महत्व
-परन्तु
-आशा
-डॉलर
-शायद
-आयोजित
-सम्मान
-युगल
-कांग्रेस
-सफल
-उर्दू
-उनमें
-वापस
-चाहिए।
-दें
-मनुष्य
-लाख
-महान
-निजी
-उल्लेख
-जैसी
-इनकी
-व्यवहार
-पन्ने
-नीति
-जाति
-एल
-पोस्टर
-विशाल
-बल्कि
-संचालित
-देखने
-विवाह
-अच्छा
-ख़ान
-२६
-इ
-कृष्णा
-वंश
-जापान
-केन्द्र
-मेरी
-तमिल
-देख
-विजेता
-वेब
-शिव
-सिर्फ
-न्यूयॉर्क
-भाई
-यूरोपीय
-राजीव
-प्रयोगस्थल
-उत्पाद
-मंच
-पांच
-०५
-पंजाब
-०४
-राजमार्ग
-मॉडल
-कंप्यूटर
-स्वीकार
-अंतर
-कार्बनिक
-सक्रिय
-परंतु
-लखीसराय
-किलोमीटर
-यमकेश्वर
-चला
-आलेख
-पड़ता
-उसमें
-ज्ञानसन्दूक
-आपने
-हमें
-मान
-इंजन
-तहत
-पत्रिका
-अवस्था
-९
-चम्पावत
-ं
-सहयोग
-मौलिक
-मामले
-अच्छी
-तिथि
-आरंभ
-स्वतंत्र
-बल
-बाजार
-८
-प्रारंभ
-मूल्य
-सरल
-वास्तव
-यू
-उससे
-तुम
-मैंने
-पुनः
-सागर
-पक्ष
-०६
-छोड़
-खाना
-अनुभव
-टू
-तरफ
-बस
-विजय
-महाराष्ट्र
-समुद्र
-उचित
-रेडियो
-चल
-हटाने
-खुद
-समीक्षाएँ
-जीव
-तेल
-दिल
-उम्र
-जर्मन
-ग्रंथ
-रूस
-संपर्क
-बौक्स
-रखें
-गंगा
-एल्बम
-राय
-पाठ
-हासिल
-निश्चित
-सीमित
-सात
-प्रांत
-गई।
-नेपाल
-दक्षिणी
-काव्य
-निर्णय
-छोटा
-२५
-डिजाइन
-रात
-हों
-लगाया
-वास्तविक
-पूछे
-ज्ञात
-प्रकृति
-कार
-गए।
-निर्वाचित
-तरीके
-त
-ज
-चुनाव
-किन्तु
-बढ़
-२१
-हो।
-जीत
-विपरीत
-दस
-वर्मन
-औसत
-इंडिया
-सम्मानित
-२२
-नाटक
-अधिनियम
-वस्तु
-संरचना
-मत
-सर्वाधिक
-लेखों
-विश्वास
-मास
-संकिपा
-वायु
-शीघ्र
-घटना
-निम्न
-विरोध
-सप्ताह
-स्वरूप
-प्रवेशद्वार
-सितम्बर
-गुरु
-सॉफ्टवेयर
-निर्धारित
-विद्युत
-रक्षा
-पूर्णिमा
-पड़ा
-बावजूद
-बेहतर
-वर्ल्ड
-चुका
-भारी
-मगध
-समुदाय
-क्यों
-ऑस्ट्रेलियाई
-जनगणना
-लीग
-अंक
-मिलती
-भागों
-बाल
-भेज
-कप
-कोरिया
-कर्नाटक
-मात्र
-हुई।
-अत्यंत
-तत्व
-महाभारत
-ओ
-अरब
-पूजा
-निर्माता
-रोमन
-विदेशी
-अल
-पर्वत
-पिछले
-इनसे
-पार्क
-स्थानों
-जिन
-धारा
-चुके
-मिली
-जाकर
-बदलने
-स्वामी
-सम्मेलन
-२३
-बनाये
-अल्मोडा
-शो
-जंक्शन
-मन्दिर
-गलत
-सफलता
-लिपि
-पाए
-योग
-निर्भर
-सिस्टम
-प्रसाद
-गांधी
-प्रचार
-फ्रांस
-वर्मा
-जिन्होंने
-रहें
-बौद्ध
-बच्चे
-आंदोलन
-एच
-तंत्र
-मोबाइल
-कोशिश
-अध्यक्ष
-गैस
-प्यार
-सारे
-ल
-लक्ष्य
-अवश्य
-लेते
-आसपास
-चरण
-पर्याप्त
-आयु
-शर्मा
-कार्बन
-सुरक्षित
-कोलकाता
-शीर्ष
-२७
-मै
-समिति
-धन
-विवरण
-सुविधा
-खान
-आती
-जिनके
-यद्यपि
-मामलों
-प्रशिक्षण
-सिटी
-कैंसर
-पात्र
-इतना
-रिपोर्ट
-नेतृत्व
-महिलाओं
-फल
-महीने
-सड़क
-देव
-मान्यता
-क्लब
-अनंतपुर
-क्रम
-य
-बजाय
-साँचे
-उप
-२४
-विश्लेषण
-आनन्द
-यूनानी
-चाहते
-राज्यों
-फाइनल
-अवार्ड
-जुड़े
-अत्यधिक
-तकनीक
-अज्ञात
-निकट
-सेंट
-चलता
-रेखा
-निर्देशक
-इंडियन
-मानते
-देवता
-जांच
-हे
-पत्नी
-इंटरनेट
-केरल
-जोखिम
-रिकॉर्ड
-बदलाव
-डिग्री
-प्रतीक
-जाएगा
-अतः
-पालन
-खंड
-विष्णु
-भौतिक
-जिनका
-अकादमी
-होगा।
-गुण
-वित्तीय
-क्षेत्रफल
-कर्नूलु
-करें।
-भाव
-तापमान
-०७
-अनुमान
-डे
-अमरीका
-रासायनिक
-च
-ग
-अभिनय
-पत्थर
-खाता
-किस
-गणराज्य
-टेस्ट
-चोर
-इत्यादि
-शुद्ध
-होगी
-भिकियासैण
-संघर्ष
-अंतरराष्ट्रीय
-लगातार
-माँ
-उल्लेखनीय
-रखते
-लक्षण
-जेम्स
-ग्रह
-प्राय
-वही
-औद्योगिक
-संक्षिप्त
-२००६
-विमान
-टिप्पणी
-नागरिक
-ध्वनि
-याद
-संचार
-बराबर
-प्रधान
-अमेरिकन
-पारंपरिक
-युक्त
-अत
-पुरी
-प्रतिक्रिया
-शाह
-चक्र
-अवसर
-हमेशा
-शारीरिक
-हंडिया
-आबादी
-तट
-लाइन
-विकल्प
-अंग
-लोकसभा
-खाद्य
-पर्यावरण
-संसार
-विवाद
-बनने
-करीब
-व्यक्तियों
-०
-वैदिक
-बिक्री
-ब
-निम्नलिखित
-कोशिका
-पार
-परमाणु
-भवन
-समझ
-नष्ट
-स्वर
-दुर्ग
-जितना
-प्रकट
-फॉर
-विमानक्षेत्र
-रख
-रुप
-शहरों
-तकनीकी
-लखनऊ
-मुद्रा
-हिस्से
-झील
-आयोजन
-इकाई
-मील
-समस्त
-संरक्षण
-अंदर
-संस्था
-परंपरा
-सतह
-कार्यों
-विद्यालय
-संसद
-अभियान
-सिद्ध
-मुख्यालय
-प्रस्ताव
-सीधे
-सर्वोच्च
-डालकर
-वाहन
-गुजरात
-उपयुक्त
-राशि
-बोली
-सक्षम
-अधिकतर
-नेशनल
-प्राथमिक
-मौत
-इसने
-गणित
-अली
-व्यवसाय
-हवा
-मिट्टी
-अगले
-फिल्मों
-चले
-डेविड
-मिलते
-बनाई
-महल
-आक्रमण
-रे
-राजनीति
-मंत्री
-गंभीर
-शाखा
-अम्ल
-हटा
-तटस्थ
-भविष्य
-ईश्वर
-आए
-वि
-दावा
-प्रसारण
-जीवित
-कड़ी
-रखें।
-लिमिटेड
-अन्दर
-क्रांति
-लिखे
-मैदान
-धातु
-एफ
-सम्बन्ध
-विलियम
-हृदय
-संभावना
-वातावरण
-न्यायालय
-लगाने
-सैन्य
-परिवहन
-परिषद
-चारों
-पवित्र
-योगदानकर्ताओ
-गुणवत्ता
-खगड़िया
-शेष
-करे
-ला
-युवा
-नियमित
-ऑन
-सर
-पसंद
-दबाव
-ईरान
-लागत
-०९
-०८
-२९
-अधिकारी
-उनसे
-कहना
-बोर्ड
-ग्रहण
-अशोक
-स्टार
-जान
-दिखाया
-ग्राम
-स्पेन
-नीतियाँ
-सभ्य
-०००
-समारोह
-संविधान
-इटली
-आठ
-संग्रहालय
-तर्क
-दूतावास
-पाने
-लिया।
-पाँच
-थलीसैंण
-लगी
-जन
-ताप
-परिणामस्वरूप
-लॉग
-लिखी
-रॉक
-कार्ड
-प्रेरित
-आगंतुकों
-फूल
-तेलगू
-लेता
-मिले
-रोगी
-आक्षेप
-जरूरत
-गठन
-व्यक्त
-भुगतान
-मौसम
-मीडियाविकि
-अन्तर्राष्ट्रीय
-पदार्थों
-पूर्वाग्रह
-रहे।
-शादी
-पुरा
-विषयों
-बिलियन
-ढंग
-आदेश
-लंबे
-काउंटी
-धन्यवाद
-मुस्लिम
-विरोधी
-वेल्स
-लिखें।
-पुरानी
-कांडा
-रानी
-विभाजित
-मिलकर
-तारा
-वैसे
-ईसाई
-पू
-शिकार
-ज्ञानसंदूक
-नेता
-शास्त्र
-कौन
-राजवंश
-ब्लैक
-अस्तित्व
-धारी
-प्र
-०३
-तेजी
-रायपुर
-संवाद
-किनारे
-टाइम्स
-भार
-सिर
-उत्तरप्रदेश
-छह
-आलोचना
-दिये
-गुप्त
-गेम
-नियंत्रित
-पुराण
-उद्यान
-डालें।
-हिंदू
-डीवीडी
-परीक्षा
-वालों
-घरेलू
-वस्तुओं
-व्याख्या
-पौराणिक
-अर्थात
-फूलपुर
-करोड़
-दिवस
-लघु
-जिसमे
-पिथौरागढ
-विज्ञापन
-पेश
-चर्च
-घोषित
-कंपनियों
-पशु
-पाएँ
-दर्द
-चलते
-समाधान
-माइकल
-सामना
-पूछें
-लड़ाई
-जोड़ें।
-संपादित
-जनरल
-विविध
-मिश्र
-आग
-भावना
-टिल्ड
-कैलंडर
-हत्या
-ग्रेगोरी
-प्रशासन
-रिलीज़
-खास
-मध्यम
-ज्यादातर
-अरबी
-रानीखेत
-देखते
-पाई
-आसानी
-अंश
-कश्मीर
-नवागंतुकों
-प्रभावी
-लिख
-किताब
-जीन
-इंडियाना
-चूंकि
-सत्य
-गंगोलीहाट
-नामांकित
-कोशिकाओं
-कार्यालय
-छात्र
-मस्तिष्क
-डेटा
-अनुनाद
-मंडल
-चुकी
-नारायण
-कर्म
-संपूर्ण
-प्रतिनिधित्व
-पहुंचती
-तेज
-अपेक्षा
-जाएगा।
-व्यंजन
-आत्मा
-वैश्विक
-मांग
-सेट
-इन्होंने
-सम्पूर्ण
-बदलें
-लग
-एशियाई
-रोड
-ऑनलाइन
-इस्लाम
-दास
-संत
-पक्षी
-बीबीसी
-व्यावसायिक
-सीज़न
-फुट
-जानते
-संक्रमण
-विचारों
-चाहता
-मतलब
-विरुद्ध
-रसायन
-निवेश
-वर्षा
-प्रमंडल
-संस्कार
-केन्द्रीय
-अंतरिक्ष
-ध्वज
-विशेषता
-बाकी
-थीं।
-यूनिवर्सिटी
-शंकर
-दैनिक
-आचार्य
-सं
-अनुरोध
-गायक
-मानसिक
-जमा
-हाउस
-मंत्रालय
-पहुंच
-जॉर्ज
-उपस्थित
-मार
-प्रधानमंत्री
-अंततः
-घनत्व
-थराली
-दूध
-सेवाओं
-वर्णित
-नियमों
-यूनाइटेड
-साथी
-विभाजन
-आपकी
-चौबटाखाल
-सम्मिलित
-प्रवाह
-गोल
-हुए।
-बिलासपुर
-कह
-जलवायु
-ब्राह्मण
-समर्पित
-निवास
-फोन
-प्रमाण
-पैमाने
-बिजली
-रोहित
-शांति
-अति
-उत्पत्ति
-तीसरे
-आनंद
-हमारी
-एकमात्र
-नुकसान
-मिलने
-पे
-सौ
-घटनाओं
-मां
-प्रायः
-भौतिकी
-कठिन
-माने
-घाटी
-अधीन
-स्थिर
-लेना
-उपयोगी
-रखना
-छूटती
-द्वार
-वेद
-चैम्पियनशिप
-बिंदु
-जुड़ा
-कल्पना
-आये
-संपादन
-तारे
-दें।
-परिभाषित
-उ
-सिद्धार्थ
-जापानी
-ऊंचाई
-भौगोलिक
-समुद्री
-आदमी
-उपकरणों
-स्त्री
-वाक्य
-निर्देश
-मशीन
-०२
-सत्र
-फुटबॉल
-घाट
-उपग्रह
-पंथ
-बहुधा
-हाइड्रोजन
-लंबी
-श
-सुंदर
-दौर
-रखता
-फ़ाइल
-मोहन
-देकर
-काला
-नंबर
-उपस्थिति
-दवा
-जीवनी
-आंतरिक
-परिवर्तित
-ज्ञानकोष
-वहीं
-आय
-समझा
-निगम
-वृक्ष
-पॉल
-बुद्ध
-बाज़ार
-मराठी
-रूसी
-जय
-ग्रैंड
-संचालन
-तत्वों
-व्यक्तित्व
-कीया
-३१
-कारणों
-बनाना
-अपराध
-फिल्में
-चक
-व्यास
-चाहे
-छोड़कर
-नमस्कार
-टेलीविजन
-डा
-वितरण
-एक्स
-पुराना
-रामायण
-बेरीनाग
-ग्रामीण
-सेंटर
-लाइसेंस
-मित्र
-छात्रों
-अध्याय
-शेयर
-अभाव
-मानना
-विद्वानों
-जनजातियां
-वैकल्पिक
-तुर्की
-जैव
-पश्चात
-नहीं।
-डिजिटल
-तारीख़
-समीक्षा
-हजार
-प्रिय
-इतनी
-अर्जुन
-शराब
-स्मृति
-जीता
-उच्चारण
-श्रीलंका
-बीजापुर
-निकल
-स्वीडन
-सत्ता
-संपत्ति
-गर्म
-बीमारी
-अर्थात्
-५०
-सम्राट
-व्रत
-मिश्रण
-वार्षिक
-प्रत्यक्ष
-अंकित
-रॉबर्ट
-समूहों
-आपूर्ति
-इंजीनियरिंग
-कैलिफोर्निया
-उनको
-गेंद
-इच्छा
-रन
-ऋषि
-समस्याओं
-आन्दोलन
-अपेक्षाकृत
-रोम
-चाहिये
-चलने
-गतिविधियों
-गाने
-विम्बलडन
-हैरी
-एण्ड
-इंच
-सेवाएं
-वेस्ट
-वें
-जाये
-पहुँच
-हूं
-श्रेष्ठ
-रहा।
-हार
-अस्पताल
-निरंतर
-नियुक्त
-तारों
-ख
-केंद्रीय
-वर्तनी
-धारण
-दान
-वाराणसी
-स्टूडियो
-रोगियों
-कुकर्म
-साधन
-जटिल
-अक्षर
-देंगे
-स्कोर
-उत्पादों
-प्रोटीन
-अनिवार्य
-२००१
-कायमगंज
-सौर
-सरगुजा
-साबित
-ऊँचाई
-लीला
-सैनिक
-स्टेडियम
-रायगढ
-पर्व
-जयपुर
-व्याकरण
-रावत
-इसलिये
-करेगा
-तीव्र
-प्रकाशक
-कृतियाँ
-प्रसार
-नोबेल
-सभ्यता
-परिसर
-अफ़्रीका
-राजनैतिक
-इलाज
-साहित्यिक
-सतपुली
-लिखित
-फ्रेंच
-देखे
-ऋण
-अकबर
-सोवियत
-हमला
-प्रोग्राम
-मिस्र
-डाला
-छत्तीसगढ
-आयोग
-पुरुषों
-रस
-सुनिश्चित
-पेरिस
-साहित्यकार
-परिभाषा
-डाटा
-अर्थव्यवस्था
-महाराज
-ओम
-सह
-पेज
-जिनकी
-वर्ण
-दर्ज
-भारती
-तभी
-तय
-एसोसिएशन
-अनुपात
-झारखंड
-जोड़ा
-पुन
-छत्तीसगढ़ी
-यानि
-लकड़ी
-त्वचा
-अधिकतम
-कोरबा
-देखकर
-डाल
-पुरालेख
-कोइल
-बढ़ती
-सफेद
-प्रतीत
-कानूनी
-चयन
-बनता
-हाथों
-जल्दी
-चार्ल्स
-ग्रन्थ
-रोक
-कारक
-खाने
-अभ्यास
-कैरियर
-वर्गीकरण
-सर्वेक्षण
-नारायणपुर
-मिश्रित
-ें
-तमिलनाडु
-प्राप्ति
-आकर्षित
-भेजा
-बनाकर
-संग्राम
-किले
-अड्डा
-कहलाता
-महसूस
-मार्क
-माल
-वजन
-फ़्रेंच
-ठोस
-उपयोगकर्ता
-चम्पा
-सलाह
-भेद
-काफ़ी
-लोगो
-खाते
-निर्देशन
-स्वर्ण
-बनाते
-नोकिया
-मूर्ति
-हद
-रोकने
-समाप्ति
-अकाउंट
-कार्यक्रमों
-ग्रीक
-संधि
-लंबाई
-निवासी
-दौरे
-चाहें
-क्षेत्रीय
-स्थायी
-किंग
-न्याय
-मोटर
-संभवतः
-बनाता
-पेड़
-तल
-पति
-वां
-कराया
-शुरूआत
-प्रारूप
-काले
-कांकेर
-रखे
-पौधों
-खेलों
-००
-काशी
-मस्जिद
-हरा
-आकर्षण
-नयी
-रखी
-मजबूत
-कडप
-आजकल
-टंकण
-साक्षात्कार
-तीसरी
-खेती
-महासागर
-लाया
-जोड़
-सामान्यतः
-सम्बंधित
-सुन्दर
-रचित
-जांजगीर
-पृष्ठों
-दीवार
-उन्होने
-विद्या
-लाने
-पड़ती
-संयोजन
-तीसरा
-पड़
-रोगों
-संसाधन
-भाषाएँ
-मानचित्र
-जमीन
-देहरादून
-मुगल
-कोर्ट
-कवर्धा
-धमतरी
-जशपुर
-पौधे
-कदम
-आकर
-बढ़ा
-अधिकारियों
-आरोप
-मिलाकर
-बढ़ाने
-प्रशासनिक
-हमले
-टाइम
-प्रेरणा
-उड़ान
-शक्तिशाली
-पीपी
-महासमुन्द
-विधानसभा
-फीट
-प्रगति
-स्नातक
-सूक्ष्म
-जवाब
-कम्प्यूटर
-अप
-छवि
-फ़िल्मों
-भ
-शुल्क
-विभूतियाँ
-कलाकारों
-संकट
-संभावित
-दिशानिर्देश
-जोर
-विधान
-आहार
-गोठ
-उपाधि
-राजनांदगांव
-जम्मू
-सतनाम
-कर्णप्रयाग
-थोड़ा
-बाबा
-साइट
-तथापि
-दन्तेवाड़ा
-यानी
-अमर
-मार्टिन
-तुरंत
-जिले।
-लाइव
-पुनःप्राप्त
-निर्धारण
-तत्कालीन
-कक्षा
-सारी
-प्रजातियों
-गये।
-करो
-मूल्यांकन
-द्वाराहाट
-राजशाही
-घई
-होगी।
-गैरसैण
-हॉल
-बिल
-ऐ
-रूपों
-मंगल
-जानी
-चित्रण
-नीतियां
-शिक्षण
-अवधारणा
-चेक
-किला
-तीनों
-मारे
-इमारत
-आवासीय
-किंगडम
-राजीवमास
-चुना
-आँकड़े
-फलस्वरूप
-करेंगे
-ज्योतिष
-यंत्र
-ग्राहक
-चित्रों
-नौ
-सल्ट
-उम्मीदवार
-कोश्याँकुटोली
-बीज
-उत्कृष्ट
-०१
-कम्पनी
-महात्मा
-खर्च
-केंद्रित
-सिन्हा
-हाई
-प्रबंधकों
-मुश्किल
-नर
-गाँधी
-बनाएं
-करनी
-हूँ।
-स्टेट
-प्
-दार्शनिक
-निकाल
-मनोरंजन
-पुस्तकालय
-सोचते
-जेल
-हिमालय
-पा
-जहाज
-तरल
-यूनिकोड
-सैन
-हास्य
-पैर
-दि
-दी।
-खराब
-ख़ुदा
-कृति
-पुष्टि
-हल्द्वानी
-असम
-अर्थशास्त्र
-सेवन
-ग्रंथों
-कड़ियां
-बदले
-पुस्तकों
-हेनरी
-रिचर्ड
-परम
-सके।
-पृ
-रहना
-हल
-सर्वप्रथम
-सामान
-काली
-चेतावनी
-मनोविज्ञान
-बॉक्स
-छोड़ने
-संगठनों
-तारामंडल
-हैदराबाद
-छिबरामऊ
-मुख्यतः
-टैग
-४०
-यहूदी
-विद्रोह
-दर्शकों
-ग्रुप
-जोशी
-डीडीहाट
-सेन
-गरुङ
-कीमत
-पीटर
-कृत्रिम
-विपणन
-प्राण
-आस
-बुनियादी
-वीर
-जल्द
-ऊपरी
-टिप्पणियाँ
-नज़र
-पहुंचा
-लेखकों
-ईंधन
-गुणों
-२००४
-स्ट्रीट
-बचपन
-लैटिन
-मलयालम
-हिमाचल
-सरस्वती
-स्वामित्व
-जंगल
-भनोली
-भक्ति
-श्रीकृष्ण
-नवीन
-मैन
-पीढ़ी
-शहरी
-लव
-अररिया
-अनुबंध
-विश्वभर
-स्मारक
-पुर्णीमा
-देवताओं
-पढ़ें
-प्रसारित
-परिस्थितियों
-रास्ते
-टाटा
-वा
-तरीका
-विषाणु
-अनुप्रयोग
-ईरानी
-यात्री
-संशोधन
-क्रमांक
-पंडित
-ते
-माह
-मुक्ति
-गहराई
-सुबह
-यहीं
-नाथ
-संबद्ध
-उत्तम
-प्रजाति
-मापन
-गद्य
-टीका
-वित्त
-विख्यात
-अवतार
-उपनिषद
-दीया
-मुहम्मद
-राजाओं
-फैसला
-परंपरागत
-जर्नल
-व्यापारिक
-होंगे
-एयर
-चौखुटिया
-मथुरा
-लगते
-उसको
-तनाव
-सिंगापुर
-उत्सव
-पुणे
-अभिव्यक्ति
-बढ़ावा
-इसको
-बच्चन
-द्रव
-अनुरूप
-एट
-मेट्रो
-उत्सर्जन
-एलबम
-हरियाणा
-चलती
-वाणिज्यिक
-डॉक्टर
-चली
-मानी
-लगा।
-लॉस
-सैनिकों
-सवाल
-२००५
-आरंभिक
-निदान
-अतरौली
-कराने
-मालिक
-देर
-तीर्थ
-विदेश
-यथा
-प्रबंध
-संपादक
-जैविक
-दोस्त
-मि
-अनुकूल
-संस्थापक
-इंटरनेशनल
-स्लैम
-सकारात्मक
-टाइप
-पुस्तकें
-रा
-मियामी
-लगे।
-ड
-घटक
-निदेशक
-इतने
-प्रतिनिधि
-मितुल
-अंग्रेजों
-दोनो
-बांग्लादेश
-वनस्पति
-बढ़ने
-बंदरगाह
-आसान
-सटीक
-मनाया
-भू
-समकालीन
-पाठक
-दोष
-औपचारिक
-डिस्क
-बेटी
-संदर्भित
-निभाई
-राव
-सूरज
-मगर
-चलचित्र
-मछली
-देखी
-जगत
-ज़्यादा
-सर्वर
-लम्बाई
-ग्रेट
-कर्मचारियों
-पंजाबी
-अगला
-शाही
-दर्जा
-चिकित्सक
-विकार
-फैला
-शुक्ल
-प्रजनन
-हां
-सदा
-अग्रणी
-नायक
-गृह
-धन्यवाद।
-जालस्थल
-आवाज
-बनाम
-कपकोट
-संघीय
-बिग
-गलती
-विविधता
-नो
-लगती
-पेट
-रिलीज
-विद्वान
-अन्तिम
-कॉपीराइट
-नमक
-अधिकारों
-प्रणालियों
-युकेश
-आर्ट
-रॉयल
-बालक
-पश्चात्
-हटाया
-पर्यटक
-आर्य
-प्रीमियर
-शब्दावली
-परत
-सिद्धांतों
-हमारा
-अकार्बनिक
-चोट
-कौशल
-प्रारम्भ
-विकेट
-गुना
-ब्रह्म
-आयरलैंड
-पेशेवर
-इस्पात
-ठाकुर
-अग्नि
-कोश
-रुचि
-उपनाम
-दत्त
-उम्मीद
-पशुओं
-श्रेय
-मुम्बई
-निकाला
-सिख
-पदक
-कवियों
-इसीलिए
-मार्शल
-बॉलीवुड
-खन्ना
-प्रवृत्ति
-यौन
-रचनाओं
-उड़ीसा
-तेलुगू
-आश्रम
-अस्पष्ट
-माइक्रोसॉफ्ट
-महत्त्वपूर्ण
-चयनित
-शास्त्रीय
-कर्मचारी
-जैक
-खो
-विशेषकर
-शब्दकोष
-स्क्रीन
-प्रतिमा
-बर्फ
-फारसी
-महाराजा
-ब्लू
-शून्य
-जरूरी
-आनेवालों
-दौरा
-प्रतिभा
-सच
-मौजूदा
-क्षति
-स्थलों
-खून
-फ़िल्में
-प्रशंसा
-होटल
-सेल
-सालों
-थ
-दुर्गा
-हाँ
-स्मिथ
-बुक
-नोट
-रचयिता
-शिखर
-नेहरू
-ब्रांड
-सुख
-समझने
-मुंह
-महाविद्यालय
-ईस्ट
-शृंखला
-बचाने
-आध्यात्मिक
-पुल
-त्याग
-आविष्कार
-हजारों
-कहता
-जाय
-प्रक्रियाओं
-विलय
-दूसरों
-जाए।
-२०००
-वापसी
-आकाश
-थॉमस
-इलेक्ट्रॉनिक
-कडियाँ
-संगीतकार
-परस्पर
-मुख्यमंत्री
-उपभोक्ता
-प्राणी
-होनी
-आउट
-स्व
-उपनिषदों
-वक्त
-कक्ष
-यांत्रिक
-आंशिक
-बांग्ला
-संकोच
-शनि
-ट
-हिन्द
-पट्टी
-लंबा
-कन्या
-जीवों
-नैतिक
-किशोर
-फ्रांसीसी
-वस्त्र
-शिकागो
-नदियों
-संस्थाओं
-ो
-गतिविधि
-कठोर
-सोने
-कंपनियां
-बेटे
-प्रतिरोध
-दवाओं
-न्यूनतम
-खैर
-गरीब
-मेला
-निकटतम
-स्थानांतरित
-लौट
-विटामिन
-जोड़ने
-ब्रायन
-यादव
-सहारा
-अफ्रीकी
-सिनेमा
-रचनात्मक
-नामों
-यज्ञ
-स्थितियों
-तृतीय
-हुये
-रिंग
-पोषण
-कहने
-उपाय
-विशेषज्ञ
-चार्ट
-क्लासिक
-मानवीय
-कार्रवाई
-एक्सप्रेस
-निर्देशित
-सम्बन्धित
-ग्राहकों
-चलाने
-अड्डे
-चेतना
-देखभाल
-रंगों
-विकी
-कल
-संबंधों
-सम्पर्क
-निष्कर्ष
-तंत्रिका
-वैज्ञानिकों
-टॉम
-प्रयत्न
-२००३
-पाठ्यक्रम
-चिंता
-३५
-श्रम
-बहन
-काल्पनिक
-डब्ल्यू
-कपड़े
-डबल्यू
-जातियों
-खाड़ी
-गीता
-हाथी
-डिज़ाइन
-एकीकृत
-कन्नड़
-खतरा
-प्रस्तावित
-खरीद
-अन्त
-कार्यरत
-ग्रीन
-विकिरण
-असफल
-हानि
-लोहाघाट
-कानपुर
-खिलाड़ियों
-छ
-सूचित
-अयोध्या
-स्टॉक
-चन्द्र
-गवर्नर
-लिंक्स
-फ़ारसी
-खनिज
-मंदिरों
-गिरावट
-पोखरी
-सारा
-आवाज़
-वायरस
-विलियम्स
-राधा
-सेंट्रल
-सहमत
-बातें
-रामनगर
-लिंग
-श्वेत
-लक्षणों
-दर्शनीय
-बाराकोट
-ऐंड
-सन्‌
-रास्ता
-वसा
-शती
-बदला
-उन्नत
-हिन्दुस्तान
-३६
-पृष्ठभूमि
-हार्ट
-सहज
-गिटार
-इतालवी
-पर्यटकों
-हरे
-खुले
-वर
-व्युत्पन्न
-जाँच
-धारणा
-मुख
-होली
-खड़े
-प्रतिष्ठित
-पड़ा।
-बचने
-निवासियों
-बरो
-लेती
-पीठ
-पाकिस्तानी
-रामचरितमानस
-आपस
-समझौते
-महीनों
-कर्ण
-हिस्ट्री
-सो
-पोस्ट
-पंक्ति
-बहु
-संशोधित
-कोलंबिया
-बचाव
-रिकॉर्डिंग
-थोड़ी
-चुने
-चौधरी
-अंकों
-शाम
-बातचीत
-ओलम्पिक
-गर्मी
-फ्लोरिडा
-गोली
-लाइफ
-लम्बी
-बम
-चावल
-बातों
-वर्गों
-आवास
-मिशन
-सफ़ेद
-४५
-दशा
-अपलोड
-मेडिकल
-जानने
-कार्यकारी
-सकतें
-समीप
-संयंत्र
-नि
-आवेदन
-मांस
-गहरा
-तरीकों
-छः
-कल्याण
-लगने
-हुसैन
-औ
-संजय
-जंगली
-केन
-सुपर
-सबूत
-साफ
-क्रमश
-लॉर्ड
-समझौता
-नाडु
-अदालत
-आगमन
-प्रथा
-डालने
-औषधि
-करवाया
-जिम्मेदार
-यान
-पन्नों
-महावीर
-सकें
-परम्परा
-मेक्सिको
-गोल्डन
-गईं
-टन
-एकदिवसीय
-आदि।
-ऑल
-१००
-प्रदूषण
-अणु
-चोपड़ा
-भा
-संरक्षित
-प्रभावशाली
-पुचः
-जुड़ी
-प्रोत्साहित
-तल्ला
-साधना
-न्यूटन
-लोकप्रियता
-भरा
-प्रार्थना
-बंगाली
-द्रव्यमान
-व्यावहारिक
-ट्रैक
-सावधान
-बैठक
-तुम्हारे
-पॉटर
-रथ
-प्रोग्रामिंग
-कही
-कमल
-मशहूर
-नजर
-धरती
-स्वाभाविक
-चेहरे
-सकता।
-शिशु
-कोण
-पॉप
-मन्त्र
-५१
-निवेदन
-अकेले
-आवृत्ति
-३२
-उठा
-कवर
-गरम
-शैक्षिक
-वास्तुकला
-पाते
-खूबसूरत
-एसिड
-होता।
-जायेगा
-पड़े
-सीजन
-नीला
-योग्यता
-वैध
-ग्लोबल
-पथ
-बीमा
-हिस्सों
-माप
-मैने
-बारह
-उल्लंघन
-जानवरों
-प्रवासी
-साहब
-एजेंसी
-हिट
-सुविधाओं
-सोच
-रवि
-गीतों
-पेन
-गुजराती
-अगली
-दर्शाया
-पतन
-चित्रित
-आकृति
-मैसूर
-बुद्धि
-मंत्र
-मनुष्यों
-पत्रकार
-पेय
-विद्यमान
-मादा
-बोलने
-मना
-बेस
-सहयोगी
-हराया
-समीकरण
-लिखते
-फसल
-संहिता
-लें
-तिलक
-प्रोफेसर
-सीधा
-आकर्षक
-संज्ञा
-मोटे
-वार
-खगोलीय
-क्रमशः
-समर्थक
-स्नान
-नकारात्मक
-नक्षत्र
-पहुंचने
-चित्रकार
-दुर्लभ
-सिद्धान्त
-भाँति
-छाया
-पूंजी
-आलोचक
-अपनाया
-बेहद
-खड़ा
-सका
-उदय
-भूल
-यमुना
-क्रेडिट
-साउथ
-नैदानिक
-हिल
-में।
-फ
-नील
-प्रयोगशाला
-५२
-शासकों
-मा
-हिसाब
-इन्हीं
-रॉय
-गाय
-घायल
-ऋतु
-तार
-लम्बे
-३८
-संपन्न
-क्रिस
-कृत
-उतना
-नामकरण
-स्वाद
-मनोवैज्ञानिक
-भय
-नौसेना
-हावड़ा
-४८
-श्याम
-कार्यवाही
-हस्तक्षेप
-दंड
-दुबई
-किस्म
-अभियांत्रिकी
-फ़िल्मफ़ेयर
-मोहम्मद
-उर्जा
-पारित
-गोरखपुर
-अस्थायी
-स्तंभ
-मुसलमानों
-असामान्य
-कैथोलिक
-वर्गीकृत
-पाप
-मनीष
-श्रेणियों
-भरे
-४६
-पढ़ने
-बिल्कुल
-खुला
-उद्यम
-मूलतः
-जोड़ी
-युनाइटेड
-दरबार
-मद्रास
-निकालने
-विरासत
-संगम
-निहित
-गिर
-कथन
-दाब
-आवश्यकताओं
-कहानियों
-ऑक्सफोर्ड
-आफ
-उन्हीं
-आधा
-मर
-सोसाइटी
-ब्लॉग
-मल्ला
-कालाढूगी
-आकलन
-अत्यन्त
-पकड़
-चाहिये।
-भरी
-भाषण
-आधे
-रत्न
-टूर
-नाना
-संस्थानों
-कालेज
-शल्य
-।।
-नौकरी
-जुड़ने
-गा
-मास्टर
-किरदार
-कुशल
-पक्षियों
-अधिग्रहण
-मजबूर
-खड़ी
-बताते
-अनिल
-महाद्वीप
-हथियार
-कलकत्ता
-प्लास्टिक
-पायलट
-स्वस्थ
-जिनसे
-रचनाएँ
-शिवाजी
-परिक्रमा
-२००२
-भोपाल
-पटकथा
-खत्म
-ड्राइव
-रूपांतरण
-भक्त
-४२
-अन्यथा
-उच्चतम
-बढ़ता
-असर
-रेड
-घरों
-व्हाइट
-आना
-खाली
-जॉनी
-राहुल
-कमजोर
-ब्राज़ील
-श्रीमती
-चाय
-रखकर
-ॐ
-एपिसोड
-मुसलमान
-जाया
-एडवर्ड
-पारी
-बांध
-विस्फोट
-उर्फ
-गुरू
-डच
-प्रमाणित
-समग्र
-मतदान
-कण
-पाटी
-प्रोटोकॉल
-विकिपीडीया
-हिंसा
-आजादी
-तस्वीर
-४७
-चुनौती
-क्रांतिकारी
-शेर
-न्यूजीलैंड
-ऑक्सीजन
-बनते
-निगरानी
-व्यवस्थित
-सर्विस
-आखिरी
-चिन्ह
-समृद्ध
-प्रयासों
-रेस
-पाता
-खतरे
-उन्हे
-पटेल
-बादशाह
-गर्भ
-हमने
-चरम
-मुखर्जी
-चलकर
-पाउंड
-जातक
-टिप्पणीसूची
-न्यायाधीश
-५५
-अनुच्छेद
-शास्त्री
-हि
-५३
-पेशकश
-बिट
-गणेश
-जीवाणु
-संकलन
-पीड़ित
-ख़ास
-बेस्ट
-निकलने
-लोहे
-ऑव
-स्वर्ग
-सोसायटी
-बेल
-भट्ट
-बढ़ते
-दुर्घटना
-त्यौहार
-संगणक
-विनोद
-हालाँकि
-न्यूज़
-गहरी
-पब्लिक
-४३
-तीव्रता
-पेटेंट
-तिब्बत
-पीने
-इस्लामी
-भीड़
-बहादुर
-ड्रामा
-सुल्तान
-हटाए
-अन्तरविकि
-साक्षरता
-विक्टोरिया
-सिनसिनाटी
-मठ
-प्रतिदिन
-सम्बन्धी
-निबंध
-बनाती
-नव
-विषय।
-तेलुगु
-वीकीपीडीया
-ऊतक
-असली
-संसाधनों
-जानवर
-डाक
-बाग
-डर
-स्रोतों
-प्रतिबंध
-सोमेश्वर
-कब्जा
-रहित
-अवशेष
-वरिष्ठ
-बेल्जियम
-देशी
-जीतने
-रणनीति
-हें
-ताल
-द्रव्य
-खेला
-राजस्व
-रीति
-गयी।
-सजा
-उपयोगकर्ताओं
-बोस
-आलोक
-आत्म
-फ़्रांस
-किसान
-गणितीय
-ज्वालामुखी
-अंगों
-ों
-बनती
-४९
-कायम
-खिताब
-तुलसी
-लक्ष्मी
-समानता
-वयस्क
-शिष्य
-संतुलन
-अचानक
-नदियाँ
-नीतियों
-नागरिकों
-जाल
-नामित
-नेताओं
-पात्रों
-सिविल
-कप्तान
-दुश्मन
-चमक
-अर्जित
-मौखिक
-स्वभाव
-आनुवंशिक
-कितने
-भागीदारी
-चोरी
-रोशन
-आलोचकों
-बोल
-गहरे
-गेट
-स्तरीय
-बता
-बहस
-जावा
-खासकर
-पड़ने
-दौड़
-३७
-निर्माताओं
-विशेषताओं
-माई
-काट
-५६
-सृष्टि
-फाउंडेशन
-संप्रदाय
-उपर
-प्रखंड
-एटा
-प्रकरण
-अक्षय
-स्कॉटलैंड
-राजकुमार
-इंग्लिश
-आइपी
-ध्रुव
-मैक
-अनुमानित
-मधुमेह
-गौतम
-चरणों
-कहे
-ि
-महादेवी
-निम्नांकित
-कथित
-परिणामों
-लिखना
-गाड़ी
-कॉम
-लड़की
-उद्धृत
-ब्लॉक
-३९
-टेलीविज़न
-एकता
-खेलने
-कारों
-सांसद
-चौथे
-सहमति
-बचा
-गाइड
-भले
-हा
-कां
-रिसर्च
-ज़मीन
-आयुर्वेद
-बॉब
-मुद्दों
-सोडियम
-तरंग
-चालक
-बाघ
-साइंस
-ग्लोब
-सकल
-मिलान
-बताता
-जिलों
-जिम
-पत्रिकाओं
-लगाना
-वाशिंगटन
-बैंकिंग
-प्राणियों
-ै
-ईमेल
-३३
-निर्दिष्ट
-पोर्ट
-पुर्तगाली
-चीज़
-बाबू
-अखिल
-उदयपुर
-चोटी
-शक्तियों
-मापदंड
-ण
-घातक
-माध्यमिक
-मारा
-जरिए
-इकाइयों
-५४
-लेजर
-विधियों
-खण्ड
-देखना
-कान
-प्रस्तुति
-३४
-अक्षांश
-कइ
-मानकों
-गुफा
-रखती
-सुरक्षीत
-होम
-करियर
-कारकों
-पत्रकारिता
-पृष्ठ।
-प्रचलन
-अनुक्रम
-इगलास
-जूनियर
-विनिमय
-अनुवादक
-विद्यार्थी
-निर्यात
-शब्दार्थ
-केन्द्रित
-सम्पादन
-बोध
-ब्रह्मा
-फ़ोन
-चाल
-ध
-अंडे
-हनुमान
-ज़
-बास्केटबॉल
-समापन
-राग
-छोर
-साहिब
-शांत
-यॉर्क
-अद्भुत
-राष्ट्रों
-सदन
-प्रसंग
-मोशन
-तकनीकों
-परामर्श
-पैसे
-एवम
-पं
-पृथक
-सरदार
-माया
-मारने
-लेबल
-टु
-निचले
-अतिथि
-महादेव
-परियोजनाओं
-दर्शक
-विकिपीडियन
-जगदीश
-विकिपरियोजना
-मुख्यत
-सीमाओं
-मुकाबले
-प्रताप
-यौगिकों
-बजट
-५९
-अहमद
-चलाया
-अहमदाबाद
-अनुपम
-पूर्ति
-पिक्चर
-स्कूलों
-अंग्रेज
-स्वीकृति
-बसा
-धरोहर
-आंकड़े
-बैटरी
-फूलों
-बेटा
-गर्मियों
-प्रबन्धक
-जोड़े
-महाकाव्य
-जन्मे
-गानों
-वनों
-लेन
-बाह
-एकत्रित
-नेपाली
-अमीर
-नीदरलैंड
-कहानियाँ
-मेयर
-ऑपरेशन
-एक्शन
-श्रेणियाँ
-४१
-चुंबकीय
-मृत
-मुद्दे
-हित
-तोड़
-करे।
-बर्मा
-कहलगाँव
-कहाँ
-बैंकों
-मेले
-ग्रहों
-परे
-ब्रज
-ऑस्टिन
-सूचीबद्ध
-जरिये
-दूरभाष
-कितना
-प्रभावों
-वध
-वर्णमाला
-कितनी
-सचिव
-पवन
-मैक्स
-पिछला
-सौंदर्य
-लो
-खबर
-वाह्य
-प्रचालन
-री
-प्रभाकर
-पहल
-प्रभाग
-अनुसरण
-पहलू
-धूम्रपान
-रिकार्ड
-प्रशांत
-अक्षरों
-कथानक
-पारिवारिक
-लाहौर
-भाषाओँ
-यात्रियों
-घास
-जनपद
-विचारधारा
-बिलकुल
-सीता
-प्रतिष्ठा
-निशान
-टॉप
-अवैध
-दूरसंचार
-लौह
-अतीत
-छत
-इंक
-पूर्णिया
-कोर
-एलन
-उद्योगों
-निष्क्रिय
-क्यूबा
-वेग
-स्टील
-टाउन
-यूनान
-साफ़
-अलंकार
-विफल
-कुत्ते
-सम
-करना।
-मलेशिया
-तैयारी
-भव्य
-ार
-पुत्री
-इमामगंज
-वकील
-४४
-संकेतों
-मूल्यों
-बाई
-भ्रम
-पाल
-ब्याज
-गहन
-अंतराल
-चौथी
-प्रतिस्पर्धा
-निश्चय
-कारोबार
-बच
-कोटि
-साझा
-खुल
-लन्दन
-सार
-राज्यपाल
-पराजित
-स्नातकोत्तर
-रात्रि
-शानदार
-हॉलीवुड
-नाटकों
-पीला
-ब्राजील
-ऊंची
-पाये
-जोशीमठ
-सदस्यता
-पैरों
-हॉट
-आँख
-शिक्षक
-घिरा
-फ़ाइलों
-कथाओं
-बिगाड़
-रुपये
-तू
-संदेह
-लेखा
-क्रिसमस
-भूकंप
-बुरी
-हवेली
-बीकानेर
-जोधपुर
-कहलाते
-करनेवाले
-दशकों
-प्रदेशों
-कमरे
-वुल्फ़
-जितनी
-खतरनाक
-गुगल
-मामला
-रक्तचाप
-डा०
-रविवार
-लीये
-स्थापत्य
-वाहनों
-छूट
-हों।
-प्रो
-जातीय
-फंड
-चौक
-सिक्किम
-मिस्टर
-टूर्नामेंट
-रहमान
-जड़
-बनवाया
-इलाके
-गठबंधन
-किरण
-गोपाल
-कागज
-शुभ
-मिस
-एयरलाइंस
-लाखों
-तत्काल
-अवार्ड्स
-मौका
-गोल्ड
-व्यापारी
-हरी
-सलाहकार
-मनु
-फ़र्रूख़ाबाद
-अपवाद
-मूवी
-जोन्स
-फ्रॉम
-शिकारी
-ऑडियो
-महेश
-गौरव
-ऊँचा
-कब
-सतत
-पहाड़
-अनिरुद्ध
-अध्ययनों
-इंदिरा
-उपर्युक्त
-एकत्र
-महर्षि
-भर्ती
-सोचा
-गुरुआ
-शुरुआती
-अभियान्त्रिकी
-जनवादी
-पड़ी
-आंख
-फ़्राँस
-गोवा
-जैंती
-ट्रस्ट
-सर्जरी
-संयोग
-गिरफ्तार
-रामपुर
-समाजवादी
-सृजन
-बपतिस्मा
-कोष
-आराम
-मैचों
-बसे
-पैदल
-तलाश
-थियेटर
-शुष्क
-विश्वयुद्ध
-प्रतिद्वंदी
-परिवर्तनों
-एकदम
-भ्रूण
-मासिक
-द्वीपसमूह
-माला
-फैल
-नरेन्द्र
-स्टोन
-उठाया
-सारणी
-प्रारम्भिक
-बेतालघाट
-बीस
-त्रुटि
-संगठित
-क्लास
-एड
-आयरिश
-हू
-ललिता
-आग्रह
-संतान
-प्रबल
-नहर
-डॉन
-प्रवाहित
-स्पेनिश
-बनावट
-भाषाएं
-करा
-प्रोत्साहन
-भ्रष्टाचार
-उष्णकटिबंधीय
-गाना
-उपरांत
-पोलैंड
-बनायी
-आएगा।
-पादरी
-फैशन
-बजाए
-टूट
-सोनी
-गले
-मलेरिया
-बंगलौर
-पढ़ाई
-क्रिस्टल
-चौड़ाई
-जोकि
-व्यय
-मिला।
-विवेक
-अब्दुल
-परिवारों
-बाधा
-भूत
-रंगीन
-राजेश
-नींव
-हाइड्रोकार्बन
-पीले
-राकेश
-बुलाया
-इंस्पेक्टर
-परिचित
-वेतन
-इलेक्ट्रिक
-तरी
-खोला
-पदों
-मेन
-स्तरों
-रोजगार
-डोमेन
-मानता
-सेकंड
-६०
-ईसवी
-सिरे
-नाइट
-गभाना
-यथार्थ
-लि
-कीट
-भावनाओं
-नरेश
-करार
-जानता
-कार्यकाल
-सिडनी
-रमेश
-परिमाण
-भरत
-कार्ल
-खोल
-म्यूज़िक
-पठार
-शाखाओं
-गुप्ता
-कार्लो
-तिरवा
-वर्षीय
-चक्रवर्ती
-दिव्य
-चंद्र
-पावर
-विथ
-पूरक
-मुफ्त
-ग्रस्त
-रोज़
-समुदायों
-शैक्षणिक
-नीले
-भिन्नता
-फ़
-देन
-जाएँ
-अनेकों
-काउंसिल
-प्रतिद्वंद्वी
-माइक
-चालू
-सम्भव
-क्रियाओं
-शहीद
-विश्वविद्यालयों
-चौथा
-सदैव
-सुधीर
-नागपुर
-दु
-नवाब
-स्पर्श
-कोट
-दलों
-लगाए
-इतिहासकार
-ओवर
-फ़तेहाबाद
-ऑस्ट्रिया
-हार्ड
-मुकदमा
-स्टीव
-चीज
-पायी
-बादल
-आकाशगंगा
-आवरण
-भेजने
-सुनील
-कुश्ती
-ईसापूर्व
-२००
-मुनि
-स्
-बृहस्पति
-प्रयोगों
-बयान
-खाँ
-शब्दकोश
-स्वचालित
-सिम्बल
-पसंदीदा
-उत्तराधिकारी
-संसदीय
-गायन
-क्षमा
-आतंकवाद
-पत्रों
-हरिद्वार
-लगाकर
-अतएव
-गार्डन
-बैठे
-मदन
-चौहान
-चन्द्रमा
-उठाने
-जायें
-अर्ध
-तारीख
-डाउनलोड
-अनु
-ओलंपिक
-श्रंखला
-दिखाने
-अमिताभ
-मौर्य
-मुताबिक
-प्रपात
-फोटो
-लक्ष्मण
-मालूम
-देगा
-अपील
-लेंस
-स्पेस
-बिन्दु
-द्वीपों
-स्विट्ज़रलैंड
-अर्जेंटीना
-पूछा
-वोट
-अकाल
-शत्रु
-कबीर
-आचरण
-सफलतापूर्वक
-एक्सचेंज
-उत्तराखंड
-शिकायत
-शंकराचार्य
-धारावाहिक
-दृश्यों
-१९९०
-तूफान
-सड़कों
-अपेक्षित
-बाढ़
-प्रोजेक्ट
-पहुँचने
-हूं।
-ग्रांड
-उन्नति
-कच्चे
-स्वीकृत
-बहती
-व्यायाम
-प्रयोजन
-एरिक
-ऑटो
-इंटरसिटी
-सरलता
-उपनगरीय
-अनाज
-धातुओं
-संकल्प
-तेरे
-धूप
-वंशज
-परिपथ
-घोड़े
-मोक्ष
-तालाब
-असमर्थ
-श्रद्धा
-विनाश
-सापेक्ष
-अद्वितीय
-सराय
-सुरेश
-जनजाति
-ट्यूब
-रहकर
-कैम्ब्रिज
-श्वसन
-सुविधाएं
-सूत्रों
-बंध
-जंगलों
-नेत्र
-डीएनए
-बिलबोर्ड
-आदिवासी
-दिखने
-गाया
-आर्थर
-नैशनल
-सिक्के
-वायुयान
-समक्ष
-समतल
-पिछली
-छोड़े।
-विधा
-सीखने
-कालीन
-बौद्धिक
-विधेयक
-सक्सेना
-खा
-यूनियन
-परमात्मा
-संस्करणों
-योद्धा
-पैटर्न
-स्त्रियों
-कर्तव्य
-जातियाँ
-वंशावली
-कमाई
-पैसा
-वसंत
-कहलाती
-एंजिल्स
-अपोलो
-सिंहासन
-इनपुट
-बस्ती
-दीवारों
-प्राधिकरण
-संभवत
-भालू
-केबल
-पुष्प
-सिंचाई
-मानने
-कॉल
-क्रॉस
-अभिगम
-उपलब्धि
-राजनीतिज्ञ
-नोट्स
-बे
-मेजर
-ग्वालियर
-प्रजातियां
-लॉ
-प्रसन्न
-यूएस
-रहेगा
-बुरा
-रोल
-नली
-उक्त
-राजकीय
-हल्के
-हंगरी
-पैलेस
-बनकर
-फेर
-पुरे
-घड़ी
-कविताओं
-स्वरुप
-सेनानी
-अवयव
-अनुप्रयोगों
-कृतियों
-ध्रुवीय
-विल
-इंडोनेशिया
-बहुमत
-टिकट
-कठिनाई
-शासनकाल
-कार्यान्वयन
-दायित्व
-जर्सी
-वितरित
-मूर
-टर्मिनस
-सुन
-जाएगी
-फोर्ड
-दीपक
-चित्रकला
-गरीबी
-सेमी
-तात्पर्य
-संलग्न
-आश्चर्य
-मेहरा
-१९९८
-भंडार
-परिषद्
-लाइब्रेरी
-बंधन
-इण्डिया
-कोयला
-महमूद
-सुना
-नंदीग्राम
-संतोष
-यूके
-जागरण
-बदलकर
-नींद
-बचे
-किसानों
-खुशी
-स्पोर्ट्स
-बलों
-भंग
-कहानियां
-सफाई
-रहस्य
-कणों
-किशन
-वृत्त
-अरुण
-मानस
-प्रेमी
-हमलों
-जीते
-नमूने
-त्वरित
-नम्बर
-शरण
-आतंकवादी
-रंगमंच
-टुकड़े
-निकलता
-ठंडा
-खेत
-गेम्स
-राजेन्द्र
-तालिका
-तटीय
-दिनेश
-भंडारण
-निकला
-मध्यकालीन
-५००
-पान
-चक्कर
-ब्राउन
-वाणी
-असाधारण
-यकृत
-बोलते
-रोटी
-झूठ
-पौधा
-वेदों
-संक्रमित
-जितने
-खूब
-नाभिकीय
-ज्यामिति
-रेटिंग
-जिम्मेदारी
-प्रेमचंद
-एजेंट
-निरीक्षण
-लुईस
-नित्य
-मेमोरी
-उतनी
-उसपर
-पड़ोसी
-तुम्हें
-वचन
-लोकतंत्र
-पार्श्व
-संवेदनशील
-उत्पादित
-सीरीज
-कॉर्पोरेट
-सूचकांक
-चैनलों
-अनंत
-नीतिया
-रिकॉर्ड्स
-ज़रूरत
-भावी
-होल
-विवादास्पद
-पिनकोड
-सरकारों
-पहलुओं
-जादू
-तपस्या
-विहार
-मोटी
-रुपए
-अपितु
-व्यंग्य
-सीधी
-सिर्फ़
-गुवाहाटी
-बेच
-नाटकीय
-शोर
-पुराणों
-मरीज
-वाजपेयी
-तिवारी
-रही।
-ब्रेक
-फैले
-विन्यास
-भाप
-थोड़े
-सर्वोत्तम
-शशि
-पार्वती
-रचनाकाल
-अदा
-गयीं
-पुर्णिया
-बॉन्ड
-बिन
-मोंटे
-नाक
-दीक्षित
-जिनमे
-अवलोकन
-नस्ल
-डेनमार्क
-वरुण
-विभक्त
-सैकड़ों
-अनुभूति
-पंजीकृत
-मतभेद
-कॉमेडी
-कलात्मक
-निकाय
-तरफ़
-आणि
-साथियों
-गुलाब
-झिल्ली
-सोना
-संश्लेषण
-इलाकों
-पण्डित
-आया।
-रेसिंग
-खपत
-टेलीफोन
-पड़ते
-दिलीप
-ई०
-एकादशी
-प्रतिबंधित
-फलों
-साइड
-उपासना
-खोटे
-प्रिक्स
-एचआईवी
-आमंत्रित
-फार्म
-इसपर
-रेंज
-१९९९
-प्रयाग
-मंगोल
-शासित
-रद्द
-अजय
-भाजपा
-आईएसबीएन
-सुमित
-एवम्
-रजिस्टर
-विकीस्रोत
-इंदौर
-बोइंग
-अमृतसर
-मकान
-पारिस्थितिकी
-मैड्रिड
-समन्वय
-अन्ना
-लोहा
-कम्युनिस्ट
-गण
-अवसरों
-ब्यूरो
-चूँकि
-खुली
-तन्त्र
-राजपूत
-समझते
-बिहारी
-वैष्णव
-चैंपियनशिप
-प्रतिकूल
-सिंड्रोम
-बंबई
-अमृतपुर
-ख्याति
-पुर्तगाल
-क्यूँ
-घ
-नारी
-अनुभाग
-मैरी
-गर्भाशय
-सर्व
-पूर्ववर्ती
-चतुर्थ
-इमारतों
-रेजिस्ट्रेशन
-प्रभु
-अस्वीकार
-साक्ष्य
-वॉ
-बढ़कर
-इनकार
-सांस
-प्रतिवर्ष
-भाषी
-बढा
-मूत्र
-अरारिया
-निकलती
-क्रिटिक्स
-धारक
-उपयोगिता
-त्योहार
-समेत
-प्रतिरक्षा
-बटन
-समर्थ
-दा
-नगरी
-तेज़
-भूतपूर्व
-देखता
-दमन
-अनुचित
-श्रीवास्तव
-हट
-प्रशंसकों
-भंडा
-तथ्यों
-दस्तावेज
-ऑपरेटिंग
-कोशिकाएं
-वाणिज्य
-पोषक
-धीमी
-वियतनाम
-स्कॉट
-रहीं
-घाव
-प्रावधान
-१९९२
-बैक
-श्रीराम
-मुकाबला
-स्टेट्स
-पादप
-गणतंत्र
-योजनाओं
-रोजर
-हार्मोन
-उत्पादक
-टेक्सास
-बेहतरीन
-फ़्रांसिसी
-राजस्थानी
-लगाते
-बीटा
-मान्य
-उद्धरण
-एज
-उद्घाटन
-पूर्वोत्तर
-हार्डी
-यहा
-शैलियों
-ऋग्वेद
-तमाम
-बेन
-सुभाष
-प्रशिक्षित
-दुबारा
-भीतरी
-प्रिंस
-हड्डी
-मल्ली
-बेचने
-महत्त्व
-आक्रामक
-कार्यकर्ता
-कटौती
-सोमवार
-गिर्द
-शुरूआती
-तिहाई
-खरीदने
-इट
-बिजनेस
-असंभव
-डिज़्नी
-जानकी
-ली।
-तें
-बने।
-खेले
-दादा
-पृथ्वीराज
-सांख्यिकी
-हुईं
-केविन
-बनारस
-रोशनी
-आरती
-पीछा
-स्थानांतरण
-रिश्ते
-बर्तन
-परिस्थिति
-बोले
-राष्ट्रीयता
-बलि
-इंजीनियर
-प्रमेय
-बुक्स
-उनपर
-छंद
-गुंजन
-टॉवर
-शाब्दिक
-स्वप्न
-सुधारने
-यूरो
-अवध
-तत्त्व
-निधि
-ललित
-भांति
-विमानों
-जलप्रपात
-चाहती
-आंकड़ों
-तेज़ी
-मैनेजमेंट
-मैट्रिक्स
-राजभाषा
-आयाम
-गुड
-पाली
-सनहौला
-पारस्परिक
-जंग
-पिक्चर्स
-इनको
-आस्था
-गुलाबी
-आजाद
-टेक
-ऊंचा
-एतमादपुर
-ब्लोक
-प्रतिनिधियों
-स्टेशनों
-हालत
-१९९१
-अटलांटिक
-ऊँचे
-वेबसाईट
-पत्ते
-आलू
-इन्द्र
-परिकल्पना
-सुनने
-गुलशन
-हज़ार
-कम्प्यूटिंग
-नियुक्ति
-पहुँचा
-विशेषताएं
-आयात
-खुदरा
-लैंड
-मग
-महा
-फ़िर
-अनुयायी
-काफलीगैर
-डाउन
-ओबामा
-कैद
-सूजन
-उपदेश
-विवेचन
-मोटा
-नारंगी
-धर्मों
-कुमारी
-बंदी
-ख़त्म
-अल्प
-कोटा
-चीजों
-पहाड़ियों
-८०
-सर्किट
-स्रोतहीन
-दुकान
-हंस
-सैद्धांतिक
-किरन
-देखें।
-तलवार
-सबके
-ब्रदर्स
-दोषी
-टेलर
-बॉल
-कटाई
-वाद
-पक्षों
-फ्रैंक
-नगरों
-वाहक
-विश्वसनीय
-समस्याएं
-पत्थरों
-कार्टून
-जि
-बीसवीं
-तिब्बती
-गो
-भेंट
-जगहों
-निष्पादन
-विक्रेता
-खगोल
-रोज
-कसम
-स्मरण
-क्रोध
-कॉमिक्स
-सूर्यवंशी
-पोप
-भेजे
-्य
-किरौली
-सख्त
-ग्रीष्मकालीन
-विल्सन
-सुदूर
-ढांचे
-जगन्नाथ
-ड्राइवर
-गांवों
-कश्मीरी
-स्वीडिश
-वशिष्ठ
-पीड़ा
-कहकर
-नैतिकता
-वस्तुत
-औषधीय
-मैट
-ज्योति
-नगला
-महापौर
-गठित
-प्रदाता
-श्
-आर्ट्स
-हटाना
-ऊष्मा
-सकने
-मरने
-ग्रीस
-मिश्रा
-हमसे
-आपसे
-क्वीन
-गिनती
-शिल्प
-मनोनीत
-एकड़
-रोकथाम
-हितों
-आशू
-अधिकृत
-इर्द
-सांता
-खुदाई
-स्टीफन
-विश्वकोश
-लायक
-विश्वनाथ
-गीतकार
-मुमताज़
-रूचि
-इराक
-लम्बा
-ग़ैर
-वॉशिंगटन
-आपसी
-भूमिगत
-भरपूर
-रावण
-वन्य
-सौरभ
-जुड़
-विद्युत्
-अद्यतन
-जीएसएम
-मैकमोहन
-सेतु
-दूरदर्शन
-संवैधानिक
-जीवाश्म
-डबल
-हानिकारक
-दर्पण
-पूजन
-विलयन
-िया
-लता
-उपहार
-क़ानून
-थिएटर
-परिचालन
-एकीकरण
-प्लेट
-हार्डवेयर
-समावेश
-संचिका
-अपशिष्ट
-मनमोहन
-फाइबर
-भारतीयों
-दुसरे
-आंखों
-संस्कृतियों
-यंग
-सदियों
-मत्स्य
-युक्ति
-फ्रांसिस्को
-बर्लिन
-लौटने
-मेहता
-क्षण
-पाश्चात्य
-गामा
-कैमरा
-ताजमहल
-सर्च
-बना।
-तल्ली
-साधनों
-पहचाना
-राजा।
-मेरठ
-जिसको
-मधु
-रिश्ता
-धूल
-गायब
-मोर
-सीरीज़
-इति
-सें
-सामुदायिक
-अनुदान
-ड्रम
-बडा
-कालिदास
-ब्रूस
-क्षय
-मातृवंश
-ट्रिपल
-प्रगतिशील
-गोस्वामी
-शनिवार
-हल्का
-हिन्दुओं
-फैली
-विष
-गर्भावस्था
-विस्तारित
-मिमी
-बा
-डेल्टा
-आँखों
-दीर्घ
-गंतव्य
-गणितज्ञ
-बिली
-बल्लेबाज
-क्लोराइड
-बालों
-मैनचेस्टर
-यु
-निर्णायक
-इंगित
-मयुर
-साप्ताहिक
-वैशाली
-पूर्णतया
-बच्चा
-अक्ष
-भविष्यवाणी
-भ्रमण
-हांगकांग
-ब्लेक
-रेस्तरां
-कृपा
-परेशान
-विकासशील
-मांसपेशियों
-गोविन्द
-प्राकृत
-कथाएँ
-गुलाम
-व्यस्त
-मार्गदर्शन
-कोंच
-कट
-प्रतिस्थापित
-वैभव
-पहने
-पाठकों
-बातकरें
-डॉग
-विकिमीडिया
-बेदी
-पोशाक
-चंद्रमा
-छिद्र
-इमारतें
-माउंट
-सिफारिश
-होगन
-उज्जैन
-समर्थित
-ब्रह्माण्ड
-रसूल
-श्लोक
-राहत
-आखिर
-एम्
-दाल
-पकड़ने
-मुँह
-उत्साह
-गर्दन
-तुलनात्मक
-काटने
-पाक
-महारानी
-ग्रंथि
-जरुर
-यूरोपियन
-आत्महत्या
-शर्त
-चुम्बकीय
-सम्प्रदाय
-नवीनतम
-हीरो
-मशीनों
-जयंती
-मिथुन
-उद्देश्यों
-सामयिक
-अकेला
-परिवेश
-मोड
-लवण
-चिली
-रखरखाव
-बोलचाल
-अभिलेख
-चाँद
-लें।
-सेनाओं
-अखबार
-दिखा
-रूपरेखा
-भास्कर
-समाधि
-विंडोज
-बनाया।
-भयंकर
-अमृत
-अरुणा
-ऊंचे
-खेर
-दोबारा
-बाध्य
-लगी।
-नागर
-उपन्यासों
-हीन्दी
-नाट्य
-जनक
-नमूना
-टीमों
-आउटपुट
-जोस
-कोरियाई
-मरम्मत
-डाक्टर
-सूरा
-कष्ट
-परीक्षणों
-बाएं
-भरने
-वेन
-केस
-महिलाएं
-लुप्त
-फ्रेम
-द्विवेदी
-असरानी
-शोषण
-नियमितता
-इंसान
-पद्य
-वायुमंडल
-पोल
-विलुप्त
-अपूर्ण
-बेचा
-लिनक्स
-कडी
-सतीश
-बहरहाल
-आयी
-हिन्दु
-मल
-बताने
-श्रीनगर
-लड़ने
-टोक्यो
-ऊँची
-पर्ल
-पितृवंश
-नी
-दीर्घा
-धार
-मंदी
-फ्री
-घंटा
-दोपहर
-इंस्टिट्यूट
-गुर्दे
-एचटीएमएल
-रजत
-अवकाश
-सीबीएस
-पाना
-होती।
-फेसबुक
-भगवानपुर
-पतली
-सीट
-मोड़
-मक्का
-स्पेक्ट्रम
-संरचनाओं
-इसमे
-बुध
-ब्लूज़
-अवसाद
-अफगानिस्तान
-पंजीकरण
-जरुरत
-अवरोध
-ब्राउज़र
-टाइगर
-विनिर्माण
-जालघर
-विज्ञापनों
-बॉट
-ग्यारह
-मुजफ्फरपुर
-गिनी
-परी
-मिलेगा
-कस्बे
-भाषाई
-बारी
-माँग
-गैलरी
-मिलन
-शुक्र
-आर्मेनिया
-इंस्टीट्यूट
-आत्मकथा
-सदस्योंको
-प्रतिपादन
-टर्मिनल
-रहेगा।
-पेड़ों
-मिली।
-कमीशन
-योनि
-फसलों
-गतिशील
-भी।
-संचरण
-प्रभुत्व
-उपक्रम
-समुचित
-दक्षता
-द्रविड़
-बन्द
-दिखता
-मध्यप्रदेश
-सारांश
-भीम
-अस्तित्वहीन
-हथियारों
-खुराक
-प्रकारों
-तेरा
-ताकत
-भगवान्
-लेक
-समकक्ष
-देशांतर
-ै।
-जोसेफ
-आज़ाद
-सामान्यत
-उपभोग
-भीष्म
-ऊतकों
-खिलाफ़
-लोकमान्य
-अन
-राजू
-अस्थि
-दरवाजे
-राजनेता
-आघात
-उपमहाद्वीप
-प्रख्यात
-टोनी
-टुल्सका
-विफलता
-स्टोरी
-बैठ
-बनना
-स्वतः
-भाषाविज्ञान
-दृढ़
-अर्थात्‌
-शी
-पचास
-प्रसिद्धि
-अपराधी
-डाली
-हरि
-डकोटा
-कोहली
-प्लेयर
-आश्रय
-नाग
-बिस्मिल
-छात्रवृति
-मिनेसोटा
-लाए
-सकें।
-चुनावों
-ब्रिज
-चिंतन
-बिगाड
-विमर्श
-पहुंचे
-होंगे।
-वैसा
-भूख
-दिखें
-नॉर्थ
-अवस्थित
-घेरे
-स्ट्रोक
-सर्बिया
-असल
-हिन्दुस्तानी
-घन
-वीज़ा
-महोत्सव
-घटकों
-बढ़ी
-करवा
-सुनकर
-रावल
-घट
-प्रायद्वीप
-स्वाधीनता
-विशेषज्ञों
-प्रबंधकोने
-कैलिन्डर
-धनरूआ
-डेली
-किलो
-जाट
-अधिकारिक
-माहौल
-सीटें
-पुरातत्व
-पीपल
-लीटर
-अनुकूलन
-गेंदबाज़ी
-शीह
-वायुसेना
-सूर्यगढा
-उन्होनें
-सिंध
-इधर
-टैंक
-पंच
-भूमध्य
-अफ़्रीकी
-डांस
-बलिया
-एड्स
-जनन
-जंतु
-समझना
-ग्रन्थों
-सैम
-गुरुत्वाकर्षण
-कोमल
-जायेंगे
-थाईलैंड
-टेलिविज़न
-दायर
-ज़िले
-त्रिपाठी
-प्राचीनतम
-विदेशों
-करी
-पढ़ा
-पर्वतीय
-नाइट्रोजन
-परशुराम
-स्वतन्त्रता
-चार्ज
-मेहनत
-फिलिप
-पेट्रोलियम
-नदियां
-पिंड
-उत्तरार्ध
-लेनदेन
-दीर्घकालिक
-आयतन
-मूलभूत
-टनकपुर
-डाटाबेस
-औरत
-नकल
-डि
-चैंपियन
-मोती
-होनेवाले
-दिमाग
-टेक्स्ट
-जीवनचरित
-मणिपुर
-फील्ड
-प्रक्षेपण
-निकले
-खड़गपुर
-करन
-९१
-प्रदर्शनी
-अनुष्ठान
-वक्र
-संबोधित
-शिविर
-वास्तविकता
-गोआ
-मेटल
-भगत
-सवार
-मजदूर
-शतक
-मानवता
-वॉन
-बढ़ाया
-दानव
-सदृश
-१९८९
-विभागों
-कमाल
-बचत
-मिर्च
-कॉफी
-बडे
-कीं
-फर्स्ट
-स्तन
-कोने
-संसारके
-१९७२
-डुमरिया
-क्
-आवागमन
-१९८०
-होम्स
-संकलित
-पत्तियों
-सूखे
-मुलाकात
-लास
-सनातन
-सामग्रियों
-कुत्तों
-रोबोट
-खैरागढ़
-कर्नल
-राखी
-आधारभूत
-पालीगंज
-स्पेशल
-संजीव
-अग्रवाल
-आस्ट्रेलिया
-आधी
-सूरत
-संक्रामक
-मुझसे
-मुग़ल
-वोल्टेज
-अणुओं
-ज़रा
-सील
-खनन
-समानांतर
-बोला
-ग्रे
-ष
-भागवत
-रंजीत
-मीनार
-पूर्णागिरी
-बीरबल
-गायत्री
-जबलपुर
-उजागर
-सशस्त्र
-कोच
-प्रश्नों
-बुंदेलखंड
-बडी
-बदलते
-पुर
-जीवविज्ञान
-राह
-प्रशंसक
-पर्यावरणीय
-लड़कियों
-स्टोर
-संगत
-प्रोफ़ेसर
-एलिस
-हिंद
-पूल
-भि
-९०
-भावनात्मक
-प्राथमिकता
-वाष्प
-ओल्ड
-आज्ञा
-औजार
-गैसों
-व्हिस्की
-रोका
-कहती
-जहाजों
-सशक्त
-दिवसीय
-उतार
-शान्ति
-वृक्षों
-प्रचुर
-प्रसव
-७०
-संरचनात्मक
-फीचर
-फॉक्स
-देरी
-पुरूष
-कीबोर्ड
-लाइट
-शिलालेख
-सपना
-व्युत्पत्ति
-कद
-सजीव
-लोकतांत्रिक
-स्राव
-विन्डोज़
-शॉट
-चिह्नित
-उधार
-जेट
-चे
-युधिष्ठिर
-माधव
-आसन
-संख्याओं
-शेख
-घूमने
-आक्सीजन
-राइट
-नियत
-इतिहासकारों
-एनरॉन
-रु
-पारम्परिक
-व्
-सर्वथा
-वाद्य
-आपदा
-दरभंगा
-जात
-१९७१
-लाभदायक
-म्यूजिक
-दावे
-वोल्डेमॉर्ट
-भारतवर्ष
-जोकर
-राणा
-कादर
-गढ़
-कनालीछीना
-मुकेश
-जाएं
-क्लार्क
-बॉबी
-सम्पन्न
-भूरे
-शोधकर्ताओं
-पूर्ववत
-अहिंसा
-बीमार
-जूते
-फाइल
-नारियल
-अमरीश
-अवतरण
-छेद
-शर्करा
-सेनापति
-एक्सेस
-वस्तुएं
-वादक
-दांत
-योगी
-चोल
-परिष्कृत
-श्रमिक
-नामांकरण
-सबको
-जिसपर
-इलेक्ट्रॉन
-महिमा
-क्षैतिज
-उत्तरदायी
-शूटिंग
-कारखाने
-आरक्षण
-आरेख
-किए।
-रो
-यों
-घटनाएं
-बाइबिल
-दम
-वार्ड
-ज़रूरी
-औचित्य
-एव
-१९७०
-तीस
-यूनिट
-खेलते
-डेटाबेस
-मामूली
-सफर
-अध्यक्षता
-आदर
-कॉर्पोरेशन
-चैतन्य
-िक
-निरपेक्ष
-निकोलस
-आसमान
-विश्राम
-वर्जीनिया
-अभिनीत
-आन
-संरक्षक
-दाता
-तेरी
-जॉनसन
-अल्कोहल
-दिस
-दर्शाते
-अन्वेषण
-लगाई
-जीने
-टीबी
-३००
-उदाहरणार्थ
-करण
-चंडीगढ़
-शरद
-कास्त्रो
-सहकारी
-छुट्टी
-स्थिरता
-जोड़ता
-कैल्शियम
-वुड्स
-ित
-सपने
-इत्यादि।
-प्रजा
-सेक्स
-शुक्रवार
-सर्दियों
-चीजें
-नाव
-फर्म
-हॉकी
-कहां
-विमानक्षेत्रों
-१९४७
-चढ़ाई
-परवर्ती
-क्षत्रिय
-ब्राह्मणों
-कराता
-नौबतपुर
-आयन
-आइ
-प्रवर्तन
-लिटिल
-स्वत
-नासा
-तंग
-रक्षक
-ग्रोवर
-शिवपुरी
-सीडी
-गौर
-बतौर
-कल्प
-साधु
-इकाइयाँ
-पढ़
-दीक्षा
-घंटों
-करेगी
-उदहारण
-लीवर
-सती
-बियर
-हार्वर्ड
-सहारे
-दक्ष
-१९९६
-अभिषेक
-तुम्हारी
-रेगिस्तान
-अभयारण्य
-चाचा
-प्रशासकीय
-टावर
-अनुकरण
-जें
-ऊन
-फायर
-जैसलमेर
-कविताएँ
-विक्रमादित्य
-लड़के
-न्यायिक
-आपराधिक
-निंदा
-सेठ
-गत
-दुर्योधन
-गगनचुम्बी
-हीरा
-१९९५
-वैन
-मिशेल
-मालुम
-जिमी
-रिपब्लिकन
-चटर्जी
-पेपर
-बोस्टन
-व्यापारियों
-शान
-सुप्रसिद्ध
-सचिन
-हु
-राजकुमारी
-निवारण
-विकृत
-त्रिपुरा
-लेबनान
-परेशानी
-१९९७
-देवलथल
-प्रत्यय
-मरीजों
-स्‍थान
-फतेहपुर
-ह्रदय
-अध्यापन
-लीड्स
-औरंगजेब
-वस्तुएँ
-निवेशकों
-सरोवर
-एंडी
-दिनांक
-कंट्री
-लीप
-गंध
-श्रेणियां
-आरक्षित
-मारुति
-प्रशासक
-ज़िन्दगी
-जन्मस्थान
-वॉल
-भाइयों
-सहकुंड
-शेयरों
-कवरेज
-धाम
-कर्ता
-वाल्मीकि
-संग
-सेल्सियस
-सलीम
-सूक्ष्मदर्शी
-यांत्रिकी
-इलाका
-रियल
-पंकज
-विशेषताएँ
-मकबरा
-प्रहार
-अजमेर
-अभिगमन
-केशव
-मयूर
-धनी
-ऑक्साइड
-अरुणाचल
-उपलब्धता
-नजदीकी
-इंजीनियरी
-डीन
-उपनिषद्
-जरूर
-प्रखण्ड।
-ब्रह्मांड
-शीत
-पहाड़ों
-एक्ट
-विण्डोज़
-छठी
-कश्यप
-वार्नर
-उ०व०
-बुश
-१९६०
-सन्त
-पारसी
-खोजने
-कुंजी
-रोमानिया
-इकट्ठा
-लय
-शस्त्र
-फलन
-तुलसीदास
-आदित्य
-जगदीशपुर
-नीम
-इयर
-सामान्यतया
-चार्ली
-जानेवाले
-एजेंसियों
-पाटिल
-सिगरेट
-बरकरार
-पाठ्य
-साहनी
-जोड़कर
-शैल
-पाचन
-लेट
-से।
-अनावश्यक
-गतिविधियाँ
-विषयक
-शर्तों
-असंख्य
-याहू
-विक्रय
-राष्ट्रमंडल
-ऑस्ट्रेलियन
-बलिदान
-उपेक्षा
-पाती
-गौरी
-संचित
-मार्केट
-सिकंदर
-सीरिया
-अभिक्रिया
-टक्कर
-दहन
-हैमिल्टन
-घोष
-समाजशास्त्र
-भाग्य
-चट्टानों
-साझेदारी
-पठन
-उत्तेजित
-अवशोषण
-चिकित्सकीय
-अपमान
-ओजोन
-स्तूप
-वयस्कों
-ट्यूमर
-रॉ
-इंटरफेस
-टेबल
-संज्ञानात्मक
-सच्चे
-कपड़ा
-वक़्त
-ऐल्बम
-मित्रों
-बीहता
-उदाहरणों
-ऑस्कर
-पृथक्
-घी
-अं
-सुई
-झलक
-विराम
-फोर्ट
-पुरस्कारों
-इज़
-एनबीसी
-रखा।
-सत्येन्द्र
-वर्णक्रम
-चांदी
-वेगास
-नें
-वषीश्ठ
-श्र
-बगैर
-पुनर्निर्माण
-आदान
-हिटलर
-क्षतिग्रस्त
-ज्यों
-प्रसंस्करण
-सुरंग
-शाकाहारी
-धनुष
-वैचारिक
-मधुर
-गायिका
-प्रोफाइल
-प्रतिरोधी
-उपज
-संवर्धन
-चेहरा
-बाँध
-कोर्स
-स्पेनी
-परिप्रेक्ष्य
-प्रतापगढ़
-महानगर
-सुनाई
-गद्दी
-वास्तु
-निर्देशांक
-आँखें
-व्यतीत
-उन्नीसवीं
-गिरने
-भावों
-सांख्यिकीय
-आशय
-भगवती
-साधारणतया
-भोज
-मुराद
-रवी
-प्लेस
-परंपराओं
-हिप
-डार्क
-चुन
-साजन
-परिदृश्य
-रज़ा
-ताइवान
-सवारी
-देखिये
-त्रिकोण
-कपड़ों
-पद्धतियों
-अपनाने
-स्त्रोत
-खिज़िरसराय
-समर
-जड़ी
-वेदव्यास
-१९६५
-चलन
-जिव्
-सौंप
-औपनिवेशिक
-चिकित्सीय
-ट्रेड
-स्वच्छ
-बुरे
-डैनियल
-मंगलवार
-पूर्वज
-उष्मा
-चिकित्सकों
-रूपांतरित
-जंतुओं
-नारद
-पैकेज
-नागरी
-पल
-बहुविकल्पी
-तथाकथित
-कार्यक्षेत्र
-पंख
-अवॉर्ड
-मसौढी
-तम्बाकू
-लहर
-बीमारियों
-निरूपण
-साइकिल
-थीम
-क्रान्तिकारी
-इंग्लैण्ड
-सर्वत्र
-जॉर्जिया
-शेट्टी
-छाप
-मलिक
-हैमबर्ग
-स्वदेशी
-सूचक
-१९६२
-धारचुला
-चर्चिल
-रिलायंस
-ईस
-ती
-संकर
-विजुअल
-उदार
-उद्गम
-पंचमी
-मंजूरी
-अनन्त
-प्रायोजित
-नेट
-मालवा
-लाई
-बगल
-धर्मेन्द्र
-नाश
-फीफा
-नगरपालिका
-टेप
-खुर्द
-मार्गों
-धमकी
-शिवलिंग
-प्रासंगिक
-धरहरा
-मारिया
-विवादित
-मेक्सिकन
-१९८६
-उपायों
-दरअसल
-सम्पादक
-वृत्तचित्र
-सिंगल
-लुई
-विद्यार्थियों
-मुद्दा
-फैसले
-आए।
-अलगाव
-मिशिगन
-धान
-भयानक
-पिट
-दिखाए
-ान
-चाप
-पहनने
-विशेषज्ञता
-पैट्रिक
-इनमे
-चर
-कुत्ता
-निर्वाण
-दण्ड
-नागरिकता
-दुकानों
-वर्चुअल
-लंका
-शॉन
-ब्लड
-जैक्सन
-जलीय
-अमास
-कड़ियों
-अनुसूचित
-रेत
-गारंटी
-दिशाओं
-स्टैनफोर्ड
-मूलत
-डेनियल
-परि
-सेवक
-अमृता
-शताब्दियों
-जायेगी
-दिलचस्पी
-नाईट
-मॉडलों
-हान
-स्वायत्त
-ज्वर
-जवाहरलाल
-आगामी
-कूद
-बुधवार
-राक्षस
-आयेगा।
-इंटर
-वांछित
-धमनी
-सुलभ
-बाण
-वाई
-पुरातात्विक
-गौड़
-सामवेद
-नाभिक
-अध्यापक
-समाजवाद
-उद्भव
-डैनी
-चक्रवात
-फैलाव
-एंटीबायोटिक
-चर्चित
-जितेन्द्र
-उपनिवेश
-लास्ट
-१९७५
-डाई
-गुणा
-सूट
-इलेक्ट्रॉनिक्स
-स्क्वायर
-डाले
-दुःख
-कुंड
-सांचे
-चंपारण
-प्रवास
-दुख
-अधिवेशन
-भरोसा
-तप
-महामारी
-सेब
-जेरी
-हसन
-ऑर्डर
-घोड़ा
-पासवर्ड
-खारिज
-ख़ुद
-इन्होने
-डेविस
-सरन
-प्लाज्मा
-खुलासा
-स्कॉटिश
-टोरंटो
-बेकर
-प्रतीक्षा
-कराते
-क्षमताओं
-पांडे
-हॉप
-कांच
-मणि
-ऐतरेय
-णी
-न्यूज
-संतुलित
-सीला
-विरूद्ध
-द्वितीयक
-ट्रक
-भेदभाव
-निराला
-नजदीक
-भाष्य
-आयेगा
-सहन
-उस्ताद
-नॉर्वे
-बैठा
-संस्कारों
-घने
-गोपनीयता
-स्तम्भ
-वैमानिक
-पंत
-भक्तों
-सम्भावना
-श्वास
-ओवेन
-जगत्
-फायदा
-तस्वीरें
-रुक
-निषेध
-नेटवर्किंग
-आयरन
-मॉडलिंग
-१९८४
-चंद
-शिमला
-कोल
-मनोज
-बैल
-झा
-केन्द्रों
-केप
-एकाधिक
-कुरुक्षेत्र
-डिएगो
-कराना
-फिल्मी
-ठहराया
-जिल्ला
-अमीरात
-ज़िला
-प्रतिस्थापन
-मूर्तियों
-कूट
-साहस
-बेबी
-हाइब्रिड
-पेशी
-तिरुपति
-सोलह
-इयान
-डिक्शनरी
-ताज
-बहुमूल्य
-सुगंधित
-पैनल
-वाटर
-नकली
-टैक्सी
-अस्त्र
-बुखार
-जानना
-उत्परिवर्तन
-निमित्त
-द्वारका
-फिलिप्स
-कांगो
-आइलैंड
-दाढ़ीकेश
-आक्साइड
-मिल्वौकी
-पर्वतों
-१९८५
-ढाल
-ईस्टर
-वर्षो
-उधर
-बिल्डिंग
-ज़ोर
-निर्भरता
-सिन्धु
-अनौपचारिक
-यम
-योर
-नवजात
-नियंत्रक
-अनुभवों
-विज्ञानी
-लगाये
-वर्णों
-स्वतन्त्र
-अलौकिक
-हीं
-बदलता
-डालते
-चौड़ी
-आशीर्वाद
-गोद
-उपाध्याय
-जिनको
-स्टर्लिंग
-क्यू
-सिपाही
-मासने
-अनुभवी
-अपभ्रंश
-सलमान
-दर्जे
-आईसीसी
-मेँ
-किलोग्राम
-इंजनों
-खुश
-किंग्स
-व्यर्थ
-प्राप्तकर्ता
-सल्तनत
-उत
-सीख
-१०००
-अवयवों
-जिक्र
-दीप
-ज्ञानपीठ
-कोयले
-्र
-संदिग्ध
-नम
-परमाणुओं
-मछलियों
-मार्टिना
-स्कैन
-मादक
-अधिवर्ष
-महान्
-लेखांकन
-आजीवन
-बेला
-बाली
-दाहिने
-उठ
-भूरा
-कोस्ट
-यंत्रों
-दलित
-पर्याय
-प्रस्थान
-रेखाओं
-ईस्वी
-पालतू
-गिरा
-बरौनी
-१९९४
-प्लग
-दोहरी
-एडम्स
-अजीत
-सावधानी
-थ्री
-आशंका
-सिल्वर
-न्यूयार्क
-रोमांस
-डॉट
-कॉपी
-बाप
-ईंट
-गर्भवती
-लाला
-घूर्णन
-जया
-यशवंतपुर
-पागल
-जागरूकता
-कंठ
-आईटी
-पत्तों
-समर्थकों
-टूल
-राउंड
-अन्‍य
-ग्रिड
-दंत
-हिंसक
-तार्किक
-विशुद्ध
-बैठने
-मुद्रण
-सकती।
-पहुंचाने
-कंधे
-परिश्रम
-खोलने
-वृत्तांत
-सिस्टम्स
-धरातल
-सांचा
-संवेदनशीलता
-जिंदगी
-पूर्णतः
-पुरस्कृत
-सराहना
-अन्न
-मीठा
-संतों
-डीसी
-एंड्रयू
-़
-बृहदारण्यक
-टुकड़ों
-रिजर्व
-खंडन
-उपभोक्ताओं
-टिम
-नागार्जुन
-श्रवण
-प्रविष्टियों
-कीटों
-रेसलिंग
-मैदानों
-अभिनव
-एनिमेटेड
-दीन
-बारिश
-मॉल
-डेथ
-क्रान्ति
-छोड़ा
-पुण्य
-प्रतियोगिताओं
-देह
-माइक्रोफोन
-मनाने
-किम
-हेल्थ
-अभिव्यक्त
-दस्तावेजों
-बेरी
-अपहरण
-टोपी
-बाजारों
-संग्रहित
-देखो
-बहने
-भली
-चतुर्वेदी
-विघटन
-रियासत
-भवनों
-जायेगा।
-छठे
-अपर्याप्त
-वस्तुतः
-कार्बोहाइड्रेट
-इंजेक्शन
-नायर
-विद्रोही
-बैटमैन
-गोल्फ
-प्रतिज्ञा
-जरा
-पीस
-बदलती
-खरीदा
-इंटरनैशनल
-झुकाव
-लाना
-उत्थान
-सुसज्जित
-अर्चना
-ओं
-लोड
-कमांडर
-१९८२
-विद्यालयों
-व्याप्त
-आतंक
-अनियमित
-विंग
-चंद्रशेखर
-जाहिर
-त्र
-काटकर
-गिल
-इवान
-एंटी
-जाता।
-प्रदीप
-वकालत
-परजीवी
-प्रणालियां
-अहम
-केले
-चन्द्रगुप्त
-इक्विटी
-दोस्तों
-विद्यापीठ
-समर्पण
-जिल
-तोड़ने
-फिलाडेल्फिया
-पंचायत
-चिड़ियाघर
-नर्मदा
-विनियमन
-परम्परागत
-लॉजिक
-बधाई
-टेक्नोलॉजी
-थाई
-मापने
-सोशल
-७५
-फॉण्ट
-चित्रकूट
-प्राइवेट
-मराठा
-तुम्हारा
-जमशेदपुर
-१९६१
-सावली
-भूमिकाओं
-चयापचय
-अभिन्न
-किन
-खंडों
-एलिजाबेथ
-ग्रहणाधिकार
-ताजा
-निक
-उदा
-प्रयोजनों
-पश्चात्‌
-लेखो
-गन
-नमस्ते
-जोनाथन
-गोविंद
-ऑटोमोबाइल
-गोलाकार
-गंभीरता
-फिनलैंड
-प्रबन्धन
-पूर्णविराम
-एलेक्स
-मनोहर
-सौदा
-स्टाइल
-२०१२
-पीट
-सामरिक
-रेड्डी
-दया
-प्रा
-वॉल्ट
-वादा
-दरों
-उपन्यासकार
-तरंगों
-स्पैनिश
-बरेली
-दोस्ती
-विकारों
-पंक्तियों
-दिखायी
-ड्रैगन
-चाँदी
-यश
-विकृति
-बेसिक
-कामयाब
-हल्की
-अंडा
-वास
-आर्मी
-कार्तिक
-श्रे
-ब्रह्मचारी
-अर्द्ध
-ग्रेड
-फिल्मांकन
-पूर्वानुमान
-साइटों
-मैत्री
-इज
-कलाओं
-मुद्रित
-मिलर
-सुंदरता
-युवाओं
-विंबलडन
-मीले
-पाणिनि
-सहारनपुर
-पिशाच
-केंडीबार
-मृ
-डिवीजन
-निकलकर
-निभाया
-मनी
-वक्ता
-सिग्नल
-कैलाश
-वाक्यांश
-तुर्क
-विशेषण
-निशाना
-अग्रसर
-रैंक
-१९५०
-खाद
-ङ
-सीटों
-कनेक्शन
-पेट्रोल
-तु
-ग्राफ
-रण
-कंट्रोल
-रत
-जुड़वां
-पूर्वक
-बर्बरता
-पेरू
-एहसास
-व्याख्यान
-गिल्ड
-न्यूज़ीलैंड
-कमान
-पुत्रों
-फ्रांसिस
-पुजारी
-भरतपुर
-कुवैत
-मापा
-खाई
-थकान
-रिक्त
-अनुमोदन
-लेडी
-बाएँ
-शोथ
-अभिप्राय
-युवक
-स्टेम
-नीलम
-पीरपैंती
-प्रतियां
-बहाव
-बहार
-उत्
-अरविन्द
-आराधना
-मंगोलिया
-ध्वन्यात्मक
-फ़ेडरर
-एयरपोर्ट
-बाबर
-टेरियर
-क्रमिक
-विषम
-१९९३
-चालित
-स्थाई
-शीतल
-सज़ा
-अनुपस्थिति
-बफ़ेलो
-होस्ट
-क्लान
-जाएंगे
-ऊर्ध्वाधर
-द्रौपदी
-सूप
-रुपया
-१९४८
-मीना
-शेक्सपियर
-बेकार
-टैगोर
-किताबें
-प्रविष्ट
-सौंपा
-चा
-हिंदुओं
-ऑब्जेक्ट
-अवशोषित
-सातवीं
-पिन
-अयस्क
-हाइकु
-संस्थाएं
-निकासी
-भीषण
-सल्फेट
-बीघा
-निपटने
-नाते
-बाला
-रिक
-समलैंगिक
-आपातकालीन
-उष्ण
-ईस्टवुड
-रचनाएं
-बरसात
-अमित
-यजुर्वेद
-प्रशा
-संपदा
-व्यंजनों
-रॉकेट
-चट्टान
-जार्ज
-यहूदियों
-विजयनगर
-अल्फा
-उत्तेजना
-प्रायोगिक
-अर्थों
-गेज
-दस्तावेज़
-मानकीकरण
-१९७७
-पैक
-टेरी
-उल्लिखित
-काच
-परास्त
-स्वीकार्य
-रचनाकार
-अलंकृत
-शपथ
-अंगूर
-अग्रिम
-वंचित
-कपास
-पाण्डवों
-दानापुर
-घोर
-कामना
-बह
-धोखा
-नं
-प्रतियोगी
-१९६७
-ज़्यादातर
-जला
-अनुशासन
-मसाला
-अंडरटेकर
-दूरस्थ
-सेठी
-उसमे
-दिलाने
-मुक्केबाजी
-संस्कृतनिष्ठ
-ग्रा
-कोकेन
-जेरिको
-ठंडे
-प्रोडक्शन
-गर्ल
-विराट
-गेंदबाजी
-पैन
-जज
-कराची
-महानगरीय
-स्टाफ
-मजदूरों
-एनीमेशन
-शाखाएँ
-वाइन
-१९५६
-एंव
-वीर्य
-सकते।
-तलाई
-परिपक्व
-डेल
-अवस्थाओं
-सर्प
-उन्मुख
-भूभाग
-युद्धों
-रूढ़िवादी
-नाथनगर
-नामके
-लॉस्ट
-कॉट
-नियामक
-वहन
-कलम
-सम्राट्
-परिपूर्ण
-इश्क
-ड्रीम
-कब्र
-मोम
-अल्बर्ट
-दूरबीन
-उदर
-कानूनों
-जवान
-इन्हे
-सौदे
-गान
-दामोदर
-बेलारूस
-श्रेण
-दिख
-दही
-विजयी
-घोल
-चालीस
-मध्ययुगीन
-पेंगुइन
-समायोजित
-मिनी
-पीसी
-फ़्रांसीसी
-सीईओ
-भजन
-आदत
-लिखकर
-१९६८
-परमेश्वर
-एरिया
-कमर
-रेशम
-मिसाइल
-जेन
-मोटर्स
-उग्र
-शैव
-डालता
-यूनिवर्सल
-पिनांग
-फ्लैश
-विजेताओं
-१९८८
-स्वरों
-बैंगनी
-स्विच
-फेफड़ों
-सच्चाई
-चरित
-निकटवर्ती
-इंद्र
-निवेशक
-सिकंदराबाद
-पूंछ
-समाहित
-चित्त
-फिट
-खुसरो
-सार्वभौमिक
-खाया
-स्थानिक
-चिट्ठा
-लग्गा
-समझे
-उपसर्ग
-भोग
-साइन
-क्रीम
-पाकर
-बोलियों
-सका।
-१९७३
-सिद्धि
-गुलज़ार
-आलोचनात्मक
-मिलाया
-शोभा
-ऐनी
-दायरे
-गईं।
-जाएगी।
-वाल्व
-वैली
-रामचंद्र
-संध्या
-क्रय
-सम्बद्ध
-जमाने
-सहस्रनामन
-ध्वस्त
-किरणों
-कै
-आएगा
-एस्टन
-सोचना
-अनुयायियों
-जवाहर
-मॅट
-निभाने
-का।
-क्रोएशिया
-कीर्ति
-कल्चर
-चालु
-ईथेन
-इरादा
-न्यास
-वृंदावन
-हिम
-गेट्स
-ज़ी
-वृद्धी
-परीचय
-डेबिट
-कार्निवल
-सकी
-नालंदा
-यो
-परेश
-कालांतर
-मुखिया
-डेड
-डब्लू
-सांख्य
-फ्रैंकफर्ट
-अजीब
-वृत्ति
-एफ़
-अबतक
-रूट
-हिस्सेदारी
-आवेश
-रू
-अंतरण
-वॉकर
-भवानी
-पत्ती
-धवन
-लाभकारी
-मैगज़ीन
-ओपेरा
-निकलते
-परिधि
-विलक्षण
-बताती
-शिक्षित
-१९५४
-विद
-लेफ्टिनेंट
-उल्लेखनीयता
-जोली
-रतन
-डालर
-उड़िया
-अनुपालन
-क्रिस्टोफर
-केदारनाथ
-डायोड
-तराई
-गुरारू
-प्रतिपादित
-धुरी
-प्रतिबिंबित
-अंग्रेज़
-स्टेज
-खलनायक
-सुप्रीम
-राष्ट्रवादी
-स्विस
-कैथरीन
-अपोल्लोन
-हिल्स
-प्रवर्तक
-रबर
-जोड़ों
-बॉम्बे
-विवादों
-वेस्टर्न
-मध्यवर्ती
-मालिश
-दीवाना
-गुरुवार
-दर्शाती
-गतिविधियां
-मुख्यधारा
-ऋषियों
-खिलाडी
-औसतन
-फ्रेडरिक
-पंचम
-सूखी
-चौड़ा
-विधियाँ
-१९८७
-बेंजामिन
-गली
-हफ्ते
-डीप
-नलिका
-पिंक
-आईपी
-साउंडट्रैक
-दिनकर
-एमटीवी
-अंकन
-क्रूज़
-कैफीन
-बल्लेबाजी
-देसाई
-ऑप्टिकल
-विद्वान्
-हेड
-लेंगे।
-शिवा
-बॉण्ड
-कुशलता
-क्वांटम
-अनिश्चित
-कन्नड
-विचित्र
-रग्बी
-रिव्यू
-प्रपत्र
-निष्पक्षता
-आर्कटिक
-समस्याएँ
-प्रयोगात्मक
-जुडना
-वाल
-ज़िम्बाब्वे
-तलाक
-व्योम
-बिक्रम
-अमीनो
-प्रतिस्पर्धी
-श्रीश
-विश्वव्यापी
-ग्राउंड
-पॉवर
-्ड
-बहुतायत
-मौसमी
-उतर
-तैनात
-चित्रकारी
-इंटरफ़ेस
-खगोलशास्त्र
-गुहा
-अपराधों
-पाउडर
-नॉन
-टिप्पणियां
-डू
-राजन
-मेघालय
-समृद्धि
-सीमेंट
-कथाकार
-गौराडीह
-कतिपय
-डगलस
-असमिया
-आदिम
-हज़ारों
-मीर
-हड़ताल
-ज्ञानसे
-पोर्टलैंड
-्रेणी
-संकाय
-दर्शाने
-अल्लाह
-बिल्ली
-श्रमिकों
-अल्पसंख्यक
-मेजबानी
-चाइना
-ह्रास
-फ़ाइलें
-गल्फ
-राख
-औषधियों
-१८५७
-आश्चर्यजनक
-हाउ
-खेतों
-विनंत्ती
-बढ़े
-ग्रीवा
-ऋषिकेश
-पुनपुन
-जटिलता
-राज्‍य
-लक्ष्यों
-डमी
-किताबों
-जोश
-लड़कों
-कॉमिक
-कैमरून
-पूर
-हमे
-१९८१
-स्पर्धा
-दिखाता
-कार्यकर्ताओं
-वरदान
-कराई
-अनुकूलित
-आचार
-गार्ड
-सुर
-मोर्चा
-१९७४
-प्रदत्त
-प्रेत
-डेवलपमेंट
-कार्यात्मक
-बालू
-पहचानने
-आश्रित
-रॉबिन
-आकस्मिक
-कस्बा
-मालिकों
-उपाध्यक्ष
-सिलिकॉन
-करेगा।
-दूत
-संग्रहण
-ड्रग
-गिरजाघर
-मोहब्बत
-घूम
-चैन
-आर्यों
-महासचिव
-फिलहाल
-मेजबान
-बसने
-१९८३
-पोत
-एप्पल
-रेणी
-मल्होत्रा
-चैप्लिन
-जीवाणुओं
-१९७६
-छाती
-ट्विटर
-सिकन्दर
-बोझ
-बैठकर
-ऐसें
-विस्फोटक
-अद्वैत
-जीवनकाल
-विचलन
-कैपिटल
-नाटककार
-उपवास
-बसें
-बांटा
-मदर
-डेस्कटॉप
-उन्मूलन
-देनी
-इच्छुक
-नेटस्केप
-बैरी
-ढाका
-ति
-तह
-एचटीएम
-खुफिया
-कामों
-आतंरिक
-सोनिया
-स्वम्
-ईमान
-सार्थक
-मेडिसिन
-काण्ड
-कॉमन्स
-अफ़ग़ानिस्तान
-शिशुओं
-शतरंज
-१२४
-गाजियाबाद
-सर्दी
-स्क्रिप्ट
-बैकअप
-छद्म
-केली
-मकर
-साधक
-मूर्तियां
-शिया
-सूरी
-छाल
-अब्राहम
-फूड
-ञ
-पालि
-मीमांसा
-मीरा
-मान्यताओं
-कैसा
-विनय
-जाय।
-लेम्बोर्गिनी
-इज़रायल
-जीनोम
-मैक्सिको
-एलिज़ाबेथ
-नॉट
-कंक्रीट
-बाधित
-यूनिक्स
-पाण्डव
-स्तनधारी
-सिवाय
-शारदा
-सत्याग्रह
-पूर्णत
-कठ
-बताई
-लीड
-उत्सर्जित
-सुधारों
-एंडरसन
-उत्कर्षराज
-कमला
-मैनेजर
-डीजल
-डेक
-शेखर
-साईट
-संयम
-बढ़ाकर
-तैत्तिरीय
-चमत्कार
-कवच
-तिल
-सप्रू
-४००
-सिंधु
-सब्जी
-पाइप
-मैथ्यू
-लेग
-वादी
-काय
-नेचर
-कागज़
-मंजिल
-बेल्ट
-प्रोफ़ाइल
-गाथा
-सीमांत
-कीमतों
-अंतर्निहित
-मुद्राओं
-जग
-ममता
-स्टीवन
-शास्त्रों
-फोरम
-लिए।
-विचारक
-प्रबंधकोंने
-हिंदुस्तान
-सिखों
-महत्ता
-गोदावरी
-खुदाबंदपुर
-दुबे
-सबका
-फिक्शन
-व्यवसायिक
-मरे
-चमड़े
-कालोनी
-सितारों
-दुरउपयोग
-आयुक्त
-नसीरुद्दीन
-दाँत
-सुलतानगंज
-राष्ट्रिय
-फतुहा
-संग्रामपुर
-सोर्स
-करेंगे।
-सहयोगियों
-क्लैप्टन
-बीजगणित
-प्रांतों
-आभासी
-दीवान
-मानो
-गौण
-लगाता
-डेनिस
-सुदृढ़
-एडम
-आभास
-सदस्योंके
-उठता
-ल्योन
-बंगला
-टुन
-लिट्टे
-नक्काशी
-बिंदुओं
-हेपेटाइटिस
-वामन
-जिलाधिकारी
-्व
-आठवीं
-फी
-जिन्ना
-क्वार्टर
-अनवर
-विंडोज़
-देखरेख
-ऑयल
-समजकर
-साहित्यकारों
-बालकाण्ड
-कौटिल्य
-जामनगर
-अंचल
-बिकने
-ज्ञानकोषकी
-अंगूठी
-खींच
-एफबीआई
-पेस्ट
-विडियो
-मिलना
-लाइनों
-भूटान
-ट्रेडमार्क
-तने
-बापकी
-अत्याचार
-मॉरिसन
-मलय
-उतने
-एंटीबॉडी
-मिठाई
-१९७९
-कोलेस्ट्रॉल
-ेणी
-संतुष्ट
-बेगम
-समझता
-पोलिश
-फ़ुटबॉल
-मीटाकर
-तारापुर
-धनबाद
-एयरलाइन
-लाकर
-अप्रत्यक्ष
-इंकार
-लौटे
-मानसून
-रॉबर्ट्स
-फोर्स
-चलाते
-प्रिंट
-ठ
-यूनेस्को
-धुन
-स्टॉप
-हर्ष
-ऊ
-सावित्री
-सलाम
-फेडरल
-जनित
-कु
-अन्तरिक्ष
-विक्टर
-इथियोपिया
-दुरुपयोग
-भारद्वाज
-नमः
-दांते
-शव
-सचमुच
-मुनिता
-चौथाई
-सालाना
-कब्जे
-ओड़िशा
-अंतत
-संगमरमर
-पारिस्थितिक
-आरम्भिक
-राघव
-मैसाचुसेट्स
-वीकीपीडीयांके
-पुनर्जागरण
-मिलक्त
-बमबारी
-अस्थिर
-प्रतीकों
-उच्चतर
-पतले
-अधिकांशतः
-चरित्रों
-सौन्दर्य
-पुरातन
-डिज्नी
-ड्यूक
-कार्यालयों
-कमज़ोर
-मेट
-शेफ़ील्ड
-आरएनए
-उत्प्रेरक
-सेक्शन
-संभोग
-बास
-वापिस
-राष्ट्रभाषा
-सस्ते
-मैदानी
-लग्न
-भोजपुर
-कुण्ड
-सघन
-फ़ॉर
-१९६४
-संस्मरण
-फॉर्म
-वैद्युत
-पाम
-परदे
-अचल
-ग़लती
-मंद
-बरियारपुर
-शुद्धता
-परवेज़
-बॉय
-जीभ
-रोलिंग
-बदलना
-स्टब
-भुवनेश्वर
-कोइ
-हस्तांतरण
-मुकदमे
-फैलने
-पैरिस
-प्रत्यारोपण
-अफ़्ग़ानिस्तान
-दयाल
-कवक
-मेमोरियल
-एयरबस
-इंटेल
-फिल्मफेयर
-बरोबर
-पहुँचे
-सावरकर
-कुरान
-माली
-दिखाते
-किनारों
-निचली
-कराती
-किस्मों
-रहेंगे
-रीढ़
-खजुराहो
-शियर्र
-घात
-स्वयंसेवक
-मेगावाट
-झरने
-बाढ
-ग्रीष्म
-हराकर
-ठंडी
-गेहूं
-ओबेरॉय
-फ्रेंकलिन
-केंद्रों
-शुक्राणु
-रूपये
-इकाइयां
-हटाकर
-प्रचारक
-रैंकिंग
-नीली
-क्लाउड
-निजामुद्दीन
-फर्क
-ग्लास
-उपजाऊ
-गैरी
-घुटने
-सत्यजित
-न्यून
-कमजोरी
-जोएल
-हरीश
-जन्मदिन
-क्योकि
-शिवराज
-ख़़ुदा
-सिक्कों
-पंचांग
-मिथिला
-१९३०
-पेशे
-राष्‍ट्रीय
-पहना
-कॅरियर
-प्रतिष्ठान
-मालदीव
-कलाम
-गेहूँ
-हुयी
-दुष्ट
-रांची
-टुकड़ा
-डाकू
-प्रक्रियाएं
-सहाय
-फ्रंट
-निकास
-लहसुन
-हेलन
-डाइऑक्साइड
-श्रद्धांजलि
-चिप
-रोमांटिक
-बॉडी
-शोक
-सितारा
-लेनी
-आयुर्विज्ञान
-फेम
-हरित
-हीमोग्लोबिन
-ब्रायंट
-गोला
-मानद
-कब्ज़ा
-व्यू
-प्रदर्शनों
-डेमोक्रेटिक
-फेंक
-आंत
-समुच्चय
-मातृभाषा
-महाराणा
-रिटर्न
-१९५७
-छपाई
-उपग्रहों
-गोले
-जीवंत
-रियो
-ैं
-दृढ़ता
-धीमा
-गज
-यादृच्छिक
-विपक्ष
-विमानन
-कथाएं
-चेष्टा
-गतिशीलता
-लालकुआँ
-१५०
-दिलचस्प
-बैक्टीरिया
-पवार
-ढांचा
-पंप
-नूतन
-आमन्त्रित
-पुस्तिका
-चौदह
-फोर
-सऊदी
-सरसों
-कैलिफ़ोर्निया
-नेल्सन
-रकम
-६५
-कहा।
-नायिका
-आभार
-अनजाने
-एस्टर
-एलेन
-प्रेरक
-जरुरी
-वाइल्ड
-विशेषाधिकार
-नरसिंह
-ब्रदर
-अधिकता
-बर्मी
-धाराओं
-सिंघल
-समीक्षकों
-राजदूत
-समारोहों
-ढेर
-सूखा
-अर्जेन्टीना
-प्लेटो
-१९६३
-१९६६
-स्थलाकृति
-इरादे
-कर्मों
-जानेवाली
-क्षीण
-मरुस्थल
-प्रांतीय
-स्काई
-ऍ
-विशिष्टता
-एमी
-अरबों
-इंसुलिन
-युवावस्था
-कैमरे
-नमूनों
-जावेद
-नक्शे
-सु
-१९६९
-संकुचन
-किय
-समीक्षाएं
-स्पिन
-हवाला
-कारावास
-शिक्षकों
-नाहीं
-सर्जन
-दाने
-उठाते
-वरन्
-६००
-उठाना
-भट्टाचार्य
-्ता
-डोनाल्ड
-संतृप्त
-हड्डियों
-मिलाने
-करनेवाला
-निकोबार
-दे।
-सॉसेज
-चेतन
-त्रिवेंद्रम
-ऐन
-करीबी
-मासको
-पहेली
-देशभर
-इमेज
-मोटाई
-सिगार
-ऑक्सीकरण
-मैनुअल
-सूअर
-चलना
-पड़े।
-पर।
-पराजय
-मंगेशकर
-नर्तकी
-यज्ञोपवीत
-देखिए
-द्योतक
-आतां
-मीठे
-भागने
-रूपी
-परिणत
-श्रृंगार
-शक्तिपीठ
-कुरु
-बीजिंग
-मुगलों
-घटा
-सच्चा
-वान
-पैकेट
-चौथान
-मॉर्गन
-सिवा
-इन्टरनेट
-वैधानिक
-मास्को
-भेड़
-रोहिणी
-मैरीलैंड
-भेजी
-मिर्ज़ा
-परिशिष्ट
-निर्माणाधीन
-असे
-रॉन
-डायरी
-द्
-संदूक
-नक्शा
-विराजमान
-विकल्पों
-प्रधानता
-लिपियों
-काउण्टी
-याचिका
-वरीयता
-विजू
-त्रुटियों
-निर्देशिका
-चूर्ण
-समूचे
-प्लस
-टाइपिंग
-लिखें
-दोहरे
-प्रथाओं
-निर्मल
-रस्सी
-बेखम
-ण्ड
-बजाया
-मुलायम
-हमीरपुर
-बंधक
-प्रतिरक्षी
-आपरेशन
-निसान
-नरम
-वॉल्यूम
-ख्याल
-क्रैमलिन
-इट्स
-थ्योरी
-शेयरधारकों
-सुमीत
-अंदरूनी
-लवी
-माधुरी
-खातों
-गाड़ियों
-सजावट
-निपटान
-खोलकर
-जन्मा
-पीएच
-अभिनेताओं
-चावला
-प्रेमिका
-स्विट्जरलैंड
-ब्राउजर
-मोदी
-शेरशाह
-नमी
-चालुक्य
-सूफी
-उचाई
-कोलम्बिया
-सू
-उठाकर
-ग़ज़ल
-क्षरण
-ग़लत
-खरीदारी
-दुल्हन
-शम्मी
-निष्ठा
-प्रविष्टि
-साम्यवादी
-रहेगी
-अनोखा
-स्तुति
-उपलब्धियों
-परियोजनाएं
-गद्यकार
-स्विफ्ट
-इंडीज
-लौकिक
-कोशों
-प्रिया
-शिष्यों
-निकली
-बाँटने
-टकराव
-मौजूदगी
-निरन्तर
-आकाशवाणी
-उल
-चीफ
-सुविधाजनक
-यादगार
-समाचारपत्र
-म्युज़िक
-सूचनाओं
-जमालपुर
-रोकता
-लक्षित
-दौलत
-स्पेंसर
-लालू
-पिच
-आसवन
-ज्वार
-पाषाण
-संयोजित
-अरे
-ईथरनेट
-मय
-आखिरकार
-एथेंस
-लड़का
-धूम
-निर्देशों
-आहे
-प्रयोगकर्ता
-झीलों
-ज्वाला
-नागालैंड
-आपत्ति
-कांस्य
-ख़राब
-करनेवाली
-विगत
-ार्ता
-फेडरेशन
-वैसी
-युनुस
-वस्त्रों
-श्रद्धालु
-अदृश्य
-सामर्थ्य
-६३
-हार्दिक
-मानदंड
-बौना
-सुनवाई
-शॉपिंग
-बराबरी
-सि
-पलायन
-लाइसेंसिंग
-अञ्चल
-जगदीप
-गोत्र
-देहांत
-कार्टर
-प्रतिबन्ध
-शैतान
-फांसी
-रीड
-बोतल
-गोविन्दा
-सामंजस्य
-फर्श
-फिल
-यूएसए
-गाते
-उपक्षेत्र
-एंग्लो
-तुमने
-बुगु
-निर्वाह
-बताए
-दूरदर्शी
-धोखाधड़ी
-संचालक
-तकरीबन
-आमिर
-स्टारबक्स
-जड़ें
-रूम
-टेल
-घोड़ों
-नरसंहार
-प्रीति
-अश्लील
-कलश
-कैलगरी
-८५
-घूमते
-प्रवक्ता
-वूल्वरिन
-अप्रत्याशित
-आंकड़ा
-ग्रीनहाउस
-फेस्टिवल
-अनूदित
-सर्वे
-चेन
-छवियों
-अधिकाधिक
-मिटा
-पिरामिड
-अग्र
-चाणक्य
-प्रक्षेपास्त्र
-१९७८
-विक
-टंडन
-मैनहटन
-कैच
-मौन
-टमाटर
-सांद्रता
-इस्तीफा
-करवाने
-समीक्षक
-फारस
-वज़न
-प्रवृत्तियों
-लुइस
-उत्तीर्ण
-राँची
-वनस्पतियों
-अल्फ़ा
-रीडर
-गेंदबाज
-नकद
-क्रिश्चियन
-राजेंद्र
-ऐल्कोहॉल
-कच्चा
-असोसिएशन
-लैंग्वेज
-मसाले
-ज़रूर
-मंडी
-सुमन
-सनी
-कर्मियों
-साइबेरिया
-कंपन
-आवर्त
-रुधिर
-गढ़ी
-चिकन
-स्नेह
-दत्ता
-धर्मग्रन्थ
-जौनपुर
-मुरादाबाद
-पर्वतमाला
-लौटा
-लाये
-गोपी
-दाएं
-पुनर्जीवित
-आगम
-प्रतिक्रियाओं
-हीरे
-तीर
-भ्रष्ट
-गर्भाधान
-परेड
-टेलीग्राफ
-ऐक्शन
-वीरता
-आर्क
-इफ़्तेख़ार
-टार्ज़न
-प्रतिलिपि
-डेढ़
-सम्पत्ति
-गर्व
-मदुगु
-माघ
-मूर्तियाँ
-छन्द
-कठिनाइयों
-अभियानों
-तया
-चांद
-कौषीतकि
-वास्तुकार
-पडता
-मज़बूत
-कार्यान्वित
-क्लाइंट
-पूरब
-साइमन
-क्षतिपूर्ति
-माध्यमों
-स्केल
-उत्तरदायित्व
-पतला
-पीटर्सबर्ग
-नौका
-पटल
-समझाने
-मिसौरी
-आण्विक
-एस्पिरिन
-म०ब०
-जोन
-कुक
-बाईं
-ध्येय
-ब्लेड
-कृत्य
-गार्सिया
-तीर्थंकर
-सम्मुख
-चाहीये
-मार्केटिंग
-रोमांचक
-सहानुभूति
-वायरलेस
-घृणा
-महाद्वीपीय
-उर्मिला
-बसंत
-दवाएं
-पकाने
-नन्दा
-अलवर
-निराशा
-छिपा
-तपेदिक
-आदिवासियों
-अनुवादित
-सातवें
-सिक्का
-संवत्
-सावन
-कार्पोरेशन
-उर्वरक
-राही
-ओलिवर
-पांचवें
-झीलें
-डेविल
-खां
-अन्तरराष्ट्रीय
-ब्राह्मी
-कांड
-जू
-गाँवों
-भैरव
-वीकली
-टुडे
-बेसिन
-बाघों
-निरूपित
-शाप
-मन्त्री
-कुंडली
-अथ
-राष्ट्रगान
-आणविक
-दांतों
-वैश्वीकरण
-कहें
-शैवाल
-सिलसिला
-कैरी
-१९५५
-काबुल
-मोटरसाइकिल
-विवश
-फ़ूड
-अरोड़ा
-गिरोह
-पते
-झरना
-अनुमोदित
-मांडूक्य
-कडियां
-मजाक
-जरी
-विकीपीडिया
-होत
-जमैका
-स्पष्टीकरण
-पाद
-जरूरतों
-एम्पायर
-हस्त
-संहिताओं
-लड्डू
-मध्यकाल
-वीकी
-देवगन
-चित्रआकार
-विदिशा
-कॉफ़ी
-सेंचुरी
-होते।
-मित्रता
-कठोरता
-वज़ीर
-रूपक
-अश्वेत
-राज्यसभा
-आभूषण
-चैम्पियन
-उपरान्त
-लार्ड
-नोबल
-प्रविष्टियां
-बस्तियों
-िए
-नानक
-बर्ड
-पड़ेगा
-लिंकन
-बहाल
-९६
-बंदूक
-रेट
-अयोध्याकाण्ड
-महाप्रभु
-ग्राहम
-नल
-डार्विन
-ग्रेटर
-कारखानों
-वाट
-सोचने
-हिम्मत
-बढाने
-लेबर
-गिना
-पूर्वजों
-बेचे
-हरिवंश
-श्वेताश्वतर
-माइक्रो
-सीनेट
-पु
-दिए।
-नकदी
-ब्रॉडबैंड
-फ्रेमवर्क
-दाग
-ँ
-ग्लूकोज
-आश्वासन
-दरगाह
-बीवी
-किस्में
-अभिकल्पना
-इन्दिरा
-रामकृष्ण
-शेन
-वार्
-पॉइंट
-झांसी
-चेल्सी
-वाइस
-महानतम
-विश्वसनीयता
-चूना
-डिस्प्ले
-प्रकोप
-सदाबहार
-लोहिया
-मीनाक्षी
-र्ता
-हावर्ड
-इस्लामिक
-कौशिक
-भुजा
-पहलवान
-जादुई
-अर्थशास्त्री
-मनमौजी
-शायर
-डिजाइनर
-समयावधि
-सपनों
-मर्यादा
-रेकी
-दरवाजा
-उत्त
-बारूद
-हे।
-कुर्सी
-जन्मजात
-लूट
-नियोजित
-नियोजन
-तेरह
-हिंगू
-मैडोना
-्म
-सोमनाथ
-पीपुल्स
-मुद्रास्फीति
-बजाने
-काँच
-तैराकी
-साबुन
-अभ्यारण्य
-बढ़ाते
-तन
-उ०प०
-महासभा
-अहंकार
-मांसपेशी
-निर्वात
-खतरों
-जाओ
-हैपलोग्रुप
-हैवीवेट
-आरोपों
-सितारे
-विनियमित
-सब्जियों
-शीतकालीन
-पार्टियों
-शिला
-रसवात्सल्य
-पश्च
-चॅक
-लड़ाकू
-तुझे
-रॉस
-क्लोरीन
-विषाक्तता
-मानों
-वाक्यों
-प्रतियों
-उल्टी
-हैरिस
-निकालना
-अक्षम
-सिंधी
-विशेषत
-आस्ट्रिया
-अवगत
-साधारणत
-मार्क्स
-चीता
-व्यवसायों
-डालना
-क्षितिज
-पालिका
-उल्टा
-कारखाना
-सैयद
-कमेटी
-भला
-फेयर
-फ्लू
-रामभद्राचार्य
-स्प्रिंगस्टीन
-पिस्टन
-संदर्भों
-जनसँख्या
-आनुवांशिक
-उषा
-ज़रिए
-सीमाएं
-घर्षण
-प्रौद्योगिकियों
-दिखती
-मतों
-लत
-बैले
-एक्यूपंक्चर
-फोटोग्राफर
-क्रिकेटर
-अनीता
-इण्डिक
-आधिपत्य
-सतही
-गुफाओं
-प्रतीकात्मक
-नशीली
-शुक्ला
-शेंगेन
-फास्ट
-बुल्गारिया
-महंगे
-सनम
-नज़रिया
-हेलो
-माथुर
-सेवाएँ
-रिपब्लिक
-सेंसर
-सर्कल
-बिज़नेस
-सेकेंड
-असत्यापित
-कैनेडी
-दुर्भाग्य
-विनायक
-कारगर
-प्रस्तावना
-अरस्तू
-बताये
-गृहयुद्ध
-तर
-शीट
-गिरफ्तारी
-वार्मिंग
-इसीलिये
-महासागरीय
-खनिजों
-पेरी
-जटिलताओं
-जीती
-लॉरेंस
-पूर्
-साठ
-सूडान
-एबीसी
-संस्थाएँ
-सिएटल
-आख्यान
-बोल्ट
-खानों
-यीशु
-परिलक्षित
-अभिमन्यु
-दैत्य
-पॉलिन
-निकाली
-राष्ट्रवाद
-खोजा
-साक्षी
-पारदर्शी
-७२
-जाएँगे।
-फुलवारीशरीफ़
-वैवाहिक
-जुलती
-सेंटीमीटर
-ईश
-नाभि
-रेशे
-संकीर्ण
-नेताजी
-टीके
-एड्रेस
-विश्‍व
-चार्टर
-बीना
-मधुबनी
-पियानो
-हेक्टेयर
-मंगलौर
-फलत
-सीने
-संभाल
-अलास्का
-स्पाइवेयर
-सुलोचना
-नीलगिरी
-तैसें
-उभरा
-राजकोट
-मिलीग्राम
-फाइलें
-हिब्रू
-बैग
-आटा
-होतीं
-शंख
-मजबूती
-सीना
-उनमे
-आज़मी
-अभिलेखों
-रोचेस्टर
-पुष्ट
-दाहिनी
-क़रीब
-कार्लोस
-जादूगर
-मैनें
-अवरुद्ध
-झ
-सस्ता
-लैंस
-टैक्स
-बैड
-इशारा
-पढ़ना
-विलायक
-ज्यामितीय
-एनी
-पत्तियाँ
-बहामास
-पढ़े
-कारें
-प्ले
-चश्मे
-प्रतिकृति
-झंडा
-उभरते
-स्टेनली
-डेव
-बेनोइट
-वीवरण
-निकालकर
-तदनुसार
-बुल
-अवशेषों
-कच्छ
-बताना
-एंटरटेनमेंट
-राज्यमंत्री
-मायने
-परख
-बराक
-मिले।
-ढाई
-प्रतिफल
-क्रियाएँ
-स्थूल
-बसु
-आकलनकर्ता
-गुट
-अथर्ववेद
-संस
-केट
-टीमें
-सैंडविच
-लेखिका
-कैबिनेट
-जुर्माना
-मारी
-मिटाने
-परवरदिगार
-अंदाज़
-मूल्यवान
-लिखता
-संचय
-साउंड
-युवराज
-विकिक्वेट
-स्कूली
-नशे
-प्रयोक्ताओं
-पापों
-पित्त
-बहल
-विकलांग
-डूब
-किंगफिशर
-कार्यक्षमता
-टेड
-वगैरह
-डाउनटाउन
-अपूर्व
-कलन
-थाली
-साढ़े
-पीली
-कृष्णन
-९९
-प्रोसेसर
-एमआईटी
-तंतु
-राजेन्द्रनाथ
-छीन
-स्टैंड
-मुरलीधरन
-कंप्यूटिंग
-सॉफ़्टवेयर
-चुप
-एसी
-प्रोटोटाइप
-चुनने
-राजी
-अंडर
-सुविधाएँ
-शरत
-हरेक
-मु
-विमानसेवा
-पड़ी।
-मूर्तिकला
-जुडी
-संविदा
-बाय
-बढ़ाता
-रुख
-लोकगीत
-समायोजन
-अमेरिकियों
-कैन
-जीप
-नक़ल
-तेथ
-श्रृंखलाओं
-ज़माने
-मशीनी
-एक्सरे
-आह्वान
-अलाउद्दीन
-प्रत्याशी
-बिन्दू
-रहस्यमय
-रेखाएँ
-पिया
-पत्रकारों
-प्रतिभूति
-उमर
-स्वच्छता
-घनश्याम
-विषाक्त
-दबाने
-अध
-जोड़ते
-वायुमंडलीय
-ठंड
-बर्फ़
-फीसदी
-लेआउट
-दरिया
-क्लबों
-छत्रपति
-असुरक्षित
-नागरकोविल
-कार्यो
-सौभाग्य
-परवाह
-महंगा
-युगांडा
-नवाचार
-रामचन्द्र
-जुलता
-निष्कासन
-गर्भगृह
-वेदांत
-निराश
-शोधकर्ता
-पड़ोस
-मौके
-असफलता
-गय
-जयसिंह
-हैदर
-संगीतकारों
-दीपावली
-मूसा
-समाजों
-मानवाधिकार
-जोड़ना
-ट्रम्प
-एंजाइम
-गांधीजी
-चुनी
-१९३१
-डिवाइस
-समझाया
-हजरत
-प्रमोद
-कुशीनगर
-बर्मन
-गोलार्ध
-मोह
-पढ़ते
-गवाह
-मर्सिडीज
-आमन्त्रण
-कतर
-एकाधिकार
-टायसन
-ऑपरेटर
-बलराम
-होंगी
-आये।
-नानी
-अलीगंज
-जहा
-विद्युतीय
-जड़ों
-अपराधियों
-द्वि
-जौ
-बंदर
-बढ़िया
-रेसलमेनिया
-इलेक्ट्रान
-फिलीपींस
-प्राप्‍त
-क्यूंकि
-विकलांगता
-जिल्हा
-सींग
-बछवारा
-हावी
-गाए
-एकेडमी
-वाइरस
-सवालों
-फोटोग्राफी
-हाइड्रोकार्बनों
-कोबेन
-स्वर्गीय
-यार
-कोशिकीय
-बखरी
-उतरने
-गैलापागोस
-विलास
-हंगल
-आज़ादी
-अंशों
-सिलेंडर
-केन्या
-अप्रयुक्त
-धर्मनिरपेक्ष
-प्रबंधको
-ताजिकिस्तान
-पुनर्गठन
-स्टडी
-समा
-ीर्षक
-दोषों
-आईएसओ
-कोला
-रेलमार्ग
-जहाज़
-बहाने
-थोक
-जानबूझकर
-बेकेट
-कमाने
-खाल
-छावनी
-डबल्स
-पहनते
-आल
-मनोरंजक
-फ्रैंकलिन
-भ्रमित
-सुज़ुकी
-वॉर्स
-वर्जित
-अनशन
-वुड
-अपवाह
-श्राफ
-एवेन्यू
-नाप
-पर्पल
-हुक्म
-भूगोलवेत्ता
-दबा
-उभर
-शंघाई
-पैकेजिंग
-नॉटिंघम
-वर्
-भूमिकाएं
-जनमत
-सीखा
-हलसी
-ग्रैमी
-सकेगा
-वार्त
-१९४०
-डैन
-कलंकीत
-कारन
-नहरें
-पडा
-२५०
-दर्रा
-ओड़िया
-कांफ्रेंस
-तिमाही
-फिल्टर
-ग्राफिक्स
-लाइक
-रोज़ेज़
-केक
-आंदोलनों
-ऑ
-७६
-गाँठ
-सेन्ट्रल
-करों
-पोजीशन
-ट्रांस
-अस्पतालों
-प्रचारित
-सपोर्ट
-समितियों
-एस्टेट
-संकुचित
-दिखते
-जलन
-उत्तराधिकार
-प्राध्यापक
-सूक्ष्मजैविकी
-मिर्जापुर
-रैखिक
-नैनोट्यूब
-वीजा
-गुजरती
-मालाबार
-निगमों
-पोरबंदर
-ट्वेंटी
-नवरातिलोवा
-्त
-७७
-जासूस
-अभूतपूर्व
-नवागन्तुकों
-वर्मनने
-मिसाल
-गरीबों
-फूट
-फ्रेंड्स
-फोकस
-शत
-तैसा
-गे
-एनिमेशन
-मेवाड़
-स्ट्रीम
-१९५८
-प्रमुखता
-पेशियों
-ऋ
-जलाशय
-चलाता
-क्ष
-हेमामालिनी
-बैंगलोर
-सुनते
-लैंगिक
-सुदर्शन
-रमन
-नाइट्राइट
-टिहरी
-कैदी
-कस्टम
-खरा
-चिप्स
-अनगिनत
-महाकवि
-आवश्यकताएं
-कमिश्नर
-रचा
-श्रेणीबद्ध
-रवाना
-बूटी
-वाँ
-खिलौना
-गर्ल्स
-कमांड
-चलाना
-संसद्
-तस्वीरों
-प्रतियोगिताएं
-शाखाएं
-निरूपा
-पावन
-रसायनों
-औषध
-वीणा
-साजिश
-बुजुर्ग
-एनालॉग
-मकबरे
-परीक्षित
-धोनी
-नबम्बर
-प्रबंधित
-सैल्मन
-आकारों
-सवाई
-माईस्पेस
-किण्वन
-आईबीएम
-प्लांट
-गुजर
-शर्ट
-ल०व०
-विकिसम्मेलन
-पंद्रहवीं
-मातृ
-ीय
-भिक्षु
-फ़ोटो
-अपडेट
-दोहरा
-क्रेन
-बाइबल
-पहुँचाने
-दाएँ
-निःशुल्क
-नाइट्रेट
-एरनाकुलम
-पहुंची
-सक्रियता
-लियोन
-मंडली
-लोकपाल
-निकायों
-आधुनिकता
-वसूली
-नारा
-राना
-गॉर्डन
-दांव
-चन्द्रशेखर
-हार्बर
-सलाद
-मंत्रिमंडल
-रसेल
-तब्दील
-आशिक
-विधायक
-बची
-१९४९
-जैकी
-पनीर
-वेशभूषा
-वेल्श
-पसन्द
-चुपके
-चि
-अतरी
-परतों
-मधुबाला
-सांप
-पहुंचता
-रोकना
-पकड़े
-१९२०
-पीतल
-नास्तिक
-नासिर
-किस्मत
-लाइनें
-प्रतिबिंब
-माफी
-मार्क्सवादी
-एथिलीन
-कोशीश
-जगद्गुरु
-जीना
-वाह
-प्रेसीडेंसी
-सीनियर
-पूर्णता
-फिजी
-अत्र
-होनेवाली
-बिड़ला
-रिवाज
-उपनगर
-ईथर
-बद्रीनाथ
-शीर
-ु
-रेखाचित्र
-महेन्द्र
-त्तराखण्ड
-सूत
-सीढ़ी
-भट्ठी
-भण्डार
-व्यवसायी
-सेवानिवृत्त
-गुणांक
-जामा
-शेखावत
-८००
-क्रूर
-घिरे
-फलक
-अम्बेडकर
-लगन
-बिन्दुओं
-मुकुट
-वेस्टमिंस्टर
-इमाम
-बर्नार्ड
-मृदा
-बायें
-शासकीय
-ख़िताब
-षड्यंत्र
-रेखीय
-स्पीयर्स
-जीमेल
-डिस्ट्रिक्ट
-अल्बानिया
-राशियों
-लीन
-गवाही
-जस्टिस
-स्पेलिंग
-बाँटा
-कुश
-मकसद
-अटल
-मेटा
-सर्पिल
-रास
-पंखों
-संवेदना
-हलचल
-संकल्पना
-३०००
-मक्खन
-जॉर्डन
-मिथ्या
-समीकरणों
-फेफड़े
-पैतृक
-प्लैटिनम
-एंथोनी
-वीनस
-बदली
-७००
-पीढ़ियों
-सूरीनाम
-स्ट्रॉस
-क्रियाशील
-विक्रेताओं
-मोल
-लड़ते
-रहो
-वक्तव्य
-उत्पादकता
-मॉनिटर
-पुरोहित
-मालवीय
-समझी
-रूपांतर
-पनामा
-प्रतिरोधक
-समस्तीपुर
-वेधशाला
-पीड़ितों
-देवदास
-अवधारणाओं
-फर्ग्यूसन
-ग्लेन
-चौड़े
-फाँसी
-आंत्र
-त्रि
-फेरारी
-पदार्थो
-शंकु
-दादी
-पुनरावर्तन
-विवरणों
-हलके
-दरार
-मीन
-गिरीश
-चुनें
-निभाता
-१९४५
-स्पीड
-यथार्थवादी
-तोप
-किट
-चिन
-पुकार
-मॉडर्न
-कड़े
-कावेरी
-आई।
-तूफ़ान
-द्योल
-पिकनिक
-बायर
-गिटारवादक
-एकांकी
-लगाव
-सस्ती
-खुदा
-बढ़ाना
-संयंत्रों
-निष्पक्ष
-अरविंद
-पकड़ा
-गिने
-शहद
-मिथक
-मून
-दीया।
-डेविडसन
-ग्राफिक
-प्रियस
-अनिष्पक्ष
-कराटे
-सुनहरा
-सचिवालय
-फ़ॉर्मैटिंग
-वाल्टर
-स्तंभों
-आटे
-स्मार्ट
-मेक
-घाटियों
-मेसन
-अनोखी
-सदाशिव
-प्रतिजन
-रुझान
-प्रवीण
-कपिल
-विधवा
-रुकावट
-टर्नर
-त्रिभुज
-मंत्रियों
-तत्पश्चात
-चूहे
-म्हणे
-कॉलेजों
-उत्कीर्ण
-र्षक
-घेर
-नेपोलियन
-सुलझाने
-विभिन्‍न
-आइस
-भित्ति
-गला
-वैधता
-लुकास
-उड़
-स्टैंडर्ड
-खिलौने
-युगों
-लिवरपूल
-लिप्यन्तरण
-खड़ीबोली
-पर्दे
-शत्रुघन
-अग्निहोत्री
-वर्चस्व
-बहिष्कार
-एडवेंचर
-यूटोपिया
-ऐसीटिलीन
-विचरण
-कल्पित
-मुख्‍य
-अपनाई
-गंधक
-ेश
-किशोरावस्था
-लेज़र
-कैम्प
-टाई
-तुरन्त
-अर्धचालक
-मॉरीशस
-साँस
-संगठनात्मक
-बहुवचन
-तले
-कभार
-पुकारा
-चाँदनी
-१९५९
-जिनपर
-नागराज
-मोनिका
-्तराखण्ड
-६४
-सुखद
-आवारा
-पानदारक
-एशियन
-चैत्र
-कैश
-हथेली
-नैनो
-झूठा
-विस्थापन
-प्रमाणीकरण
-इसराइल
-आठवें
-सागरीय
-प्रजापति
-किसने
-सभ्यताओं
-अर्ल
-स्वराज
-१९३६
-चन्द
-बसाया
-महानदी
-वर्ड
-रिसाव
-चम्मच
-प्रशिक्षक
-रघुनाथ
-एमिनेम
-सुधा
-पंद्रह
-काटा
-चादर
-जैम
-निकटता
-उमा
-भयभीत
-फ़ॉर्मूला
-शाहजहाँ
-इंजीनियरों
-वर्दी
-ूर्व
-आनुवंशिकी
-घेरा
-हाथियों
-रैली
-संलयन
-आवर्ती
-क्रियान्वित
-दशहरा
-वृद्ध
-विरोधियों
-बोवी
-भूविज्ञान
-पो
-होय
-ऋणात्मक
-लाते
-अण्डा
-सम्बंध
-बोट
-इटावा
-साहसिक
-आपातकाल
-टायर
-साइप्रस
-चूहों
-विधियां
-षक
-जोड़ती
-त्रिज्या
-मनाते
-बांड
-प्रतिबद्धता
-आइसलैंड
-उत्तेजक
-पैमाना
-बांद्रा
-गर्भपात
-पब्लिशिंग
-अन्यत्र
-बम्बई
-महीन
-पूंजीवाद
-क्रियान्वयन
-संगीतमय
-दैट
-दाखिला
-आवश्यकतानुसार
-मेनन
-स्प्रिंग
-ख़िलाफ़
-शक्तियां
-अंतरजाल
-यूक्रेन
-अस
-वर्जिन
-मानती
-सद्भावना
-आंद्रे
-वल्लभ
-इजरायल
-अध्यायों
-मजदूरी
-उत्तरोत्तर
-प्रभात
-श्रोताओं
-हलन्त
-हीरोज़
-कुँवर
-अलेक्जेंडर
-कराया।
-वोल्टता
-एवार्ड
-गोल्डेन
-पनडुब्बी
-स्टेरॉयड
-सचदेव
-ट्रू
-सिरों
-मारकर
-माउंटबेटन
-बार्नस्टार
-कोका
-मन्दिरों
-फ़िल्मी
-धाराएं
-सांप्रदायिक
-आत्मसमर्पण
-समांतर
-प्रीमियम
-विनोबा
-बहुराष्ट्रीय
-डैविल
-धागे
-दसवीं
-बार्कलेज
-बिरला
-प्रतिमान
-कक्षाओं
-हैना
-अमूर्त
-मंज़िल
-निरंतरता
-निपुण
-ढोल
-१९४२
-मनोरोग
-डेप
-यूनीवर्स
-डाला।
-क्षार
-शूट
-बेसबॉल
-बीएमडब्लू
-शौकिया
-प्रागैतिहासिक
-ारत
-मुझ
-गुफाएं
-वर्क
-अनन्य
-सुरुचि
-छा
-बग
-कर्क
-उठे
-हक
-प्रशस्ति
-कलाई
-जयप्रकाश
-महीना
-चिंतित
-दूषित
-नियोक्ता
-स्वदेश
-यत्र
-पूछताछ
-विस्थापित
-खोजों
-लाभान्वित
-कांट
-पहचाने
-बॉर्न
-प्रवृति
-रेजिमेंट
-थिंक
-ऐश
-स्थगित
-सीटी
-विशेषतः
-बुराई
-रुद्रप्रयाग
-सुषमा
-८४
-बनी।
-जनजातियों
-रेख
-अन्याय
-संवाददाता
-कच्ची
-बोलियाँ
-एडी
-पेंटिंग
-जिन्हे
-रति
-स्टार्च
-अबू
-पहुंचते
-अम्लीय
-सैर
-बीबी
-इंटरटेनमेंट
-वानस्पतिक
-बेशक
-श्लोकों
-आपात
-नन्द
-मेज
-तृतीयक
-टॉड
-प्रसिद्द
-रांगेय
-कैप्टन
-बीन
-चाह
-बनीं
-पोटेंशिअल
-असित
-सीरम
-कैदियों
-चुनरी
-ज्येष्ठ
-अगासी
-जस्ता
-थेरेपी
-मैथुन
-लोकल
-सूर
-यात्राओं
-गेंदों
-चढ़
-गाजीपुर
-भागीदार
-राहु
-सजाया
-उत्पीड़न
-ओमान
-बायीं
-तुर्कमेनिस्तान
-फेस
-धड़
-वन्यजीव
-चीज़ों
-अनमोल
-निभाते
-जैसें
-मुंशी
-सुपरमैन
-बहारी
-विकिस्रोत
-दुग्ध
-लगीं
-गुड्डी
-माउस
-आग़ा
-गोरखा
-कसौटी
-अल्फ्रेड
-पूज्य
-वोक्सवैगन
-ख़
-तना
-ट्रैफिक
-खंडित
-मो
-्षक
-नायडू
-शबाना
-आतंकवादियों
-जाली
-लिविंग
-पुनरावृत्ति
-एक्सप्लोरर
-फ़ोर्स
-श्रोता
-राजनयिक
-तुल्य
-डेज़
-फ्रेड
-परोसा
-ची
-फोर्ब्स
-कण्ठ
-बर
-कीन
-प्रतिभागियों
-सुरेन्द्र
-फाइलों
-निद्रा
-बंगलोर
-संभावनाओं
-बॉस्टन
-हार्ले
-प्रोसेसिंग
-नासिक
-वाइड
-एनर्जी
-पकवान
-दारा
-कम्पनियों
-थोडा
-नवादा
-सप्त
-शाहरुख़
-तांबे
-नग्न
-अंजाम
-तुग़लक़
-बचाया
-बैनर्जी
-बादलों
-संप्रेषण
-लैरी
-९८
-डायमंड
-शुभारंभ
-अपार
-देगा।
-खिड़की
-जश्न
-मैनपुरी
-विधाओं
-६६
-भ्रामक
-तंत्रों
-सीरिज़
-लहरों
-पुस्तकालयों
-विनाशकारी
-जैज़
-खतना
-बस्तियां
-उत्कर्ष
-कोशिकाएँ
-नेहरु
-मेड
-लिखा।
-धनात्मक
-चॉकलेट
-मनोरमा
-१९५२
-बार्सिलोना
-लावा
-फैजाबाद
-वाटर्स
-प्रात
-बढ
-विद्युत्‌
-मसलन
-मसूरी
-अचार
-सटीकता
-कीर्तिमान
-ब्रिगेड
-प्रकाशीय
-कं
-उत्साहित
-नौकर
-वारिस
-नामदेव
-हेमंत
-ईंटों
-इंटेलिजेंस
-सपाट
-गोबर
-पर्सनल
-कार्यप्रणाली
-असीम
-कॉलम
-झाँसी
-प्रबन्ध
-करिश्मा
-मिसिसिपी
-ब्रेकिंग
-निभा
-खाती
-दावों
-वोल्ट
-आप्रवासी
-धड़कन
-बिताया
-प्रशस्त
-बीटल
-महलों
-निलंबित
-एबरडीन
-लूथर
-बारबरा
-खण्डों
-यूज़र
-बर्बाद
-उन्नयन
-वेल्लोर
-राजबब्बर
-समन्वित
-लोप
-हल्दी
-बुद्धिमान
-किराए
-८८
-अनुसन्धान
-जेड
-बादाम
-पासपोर्ट
-खुलता
-माकपा
-प्रमाणन
-वृन्दावन
-सड़कें
-बम्बोर
-पोषित
-सिन्दूर
-अमोनिया
-श्रुति
-उठाए
-तकनीकें
-पदवी
-ऑर
-गड़बड़ी
-आमाशय
-नरक
-मुहैया
-गुजरने
-संग्रहीत
-जेसन
-सीक्रेट
-असिमोव
-कन्याकुमारी
-र्व
-झारखण्ड
-उत्तराख
-परिपक्वता
-८१
-कौरव
-ज्ञानकोश
-रंगोली
-गान्धी
-ध्वनियों
-कनाडाई
-छिपे
-म्हणोनि
-प्रणालियाँ
-विखंडन
-गुम्बद
-किक
-बख़्तियारपुर
-वश
-नैस्टर
-शा
-बर्गर
-फ़ल
-हुवा
-बिक
-अटलांटा
-रोधी
-बचना
-घा
-लुटेरे
-मेगाडेथ
-बीजों
-वियना
-चिन्तन
-अय्यर
-सोम
-चिन्हित
-रेफरी
-सहिष्णुता
-छोड़ना
-मसले
-उद्यमी
-जुलते
-स्लोवाकिया
-साख
-गोकुल
-दरबारी
-बढ़ाई
-देखा।
-खूबसूरती
-पैसेंजर
-फ्लाइट
-हवाओं
-पीढी
-नौगांव
-आगंतुक
-लिली
-उत्तरकाशी
-गुरुत्व
-सिखाया
-पियरे
-शीर्
-सिक्स
-डब्ल्यूडब्ल्यूएफ
-प्री
-दशमलव
-तेतिहा
-क़ानूनी
-धृतराष्ट्र
-हाजीपुर
-आर्यभट्ट
-प्रायोजक
-सन्दूक
-सांसारिक
-फलित
-नामका
-भट्टी
-पांव
-त्
-सम्पादित
-शोधन
-विश्‍वविद्यालय
-कंस
-पम्प
-चलाई
-करतीं
-ईपू
-मिज़ोरम
-हीन्दीवीकीपीडीयाके
-दायें
-अयोग्य
-मृग
-आनेवाले
-लीबिया
-लेसनर
-तुमको
-मेहमान
-मेलबोर्न
-स्‍थापना
-थर्ड
-इमेजिंग
-सम्मेलनों
-अमज़द
-लगेगा
-बेड़े
-इब्राहिम
-पक्का
-पलट
-मानदंडों
-त्रिनिदाद
-साम्राज्यवाद
-परीक्षक
-पड़ाव
-पहाडी
-जुड़ना
-विलोपन
-सिलसिले
-खींचने
-चलाए
-जानकर
-बेली
-विचारकों
-पितामह
-नॉर्मन
-डिपार्टमेंट
-स्वादिष्ट
-सुगंध
-पेस
-समता
-गोंडा
-लेस
-फैलाने
-सैनी
-पिज़्ज़ा
-रामधारी
-तांत्रिक
-साध्य
-जन्मभूमि
-संभालने
-आकृतियों
-अख्तर
-हेल
-तवी
-पांडवों
-मीलकर
-उत्खनन
-स्वैच्छिक
-दिल्‍ली
-श्रीलंकाई
-दोहराया
-मुखर
-टोयोटा
-रिपोर्टिंग
-निषिद्ध
-गंगोत्री
-डिक
-परमार
-बार्न
-फ़ैल
-इण्डोनेशिया
-अकादमिक
-ड्राफ्ट
-भूकम्प
-दिखलाई
-धर्मशास्त्र
-किये।
-क्राई
-बकरी
-पाया।
-न्यूर्क
-जौहर
-कामयाबी
-फौज
-सुव्यवस्थित
-डॉक्टरों
-बढ़त
-क्योटो
-दर्जन
-जुटाने
-कलर
-हिन
-ग्
-प्रेरण
-एथलेटिक्स
-कपाल
-जस्टिन
-पश्तो
-कुंभ
-थाइलैंड
-बांस
-ँव
-कनेक्टिकट
-जोरदार
-बेरोजगारी
-सुल्तानपुर
-बिस्तर
-खींचा
-प्रौढ़
-एल्बमों
-कड़ा
-मानकीकृत
-सामंत
-वृहत
-परबत्ता
-दुल्हिनबाजार
-सोल
-चना
-भोसले
-सप्ताहांत
-विशालकाय
-धोने
-भस्म
-रहनेवाले
-टेघरा
-अमीन
-फ़्रान्सीसी
-शल्यक्रिया
-ग्रांट
-१९२१
-सांकेतिक
-फार
-मदिरा
-पोर्शे
-परिधान
-यूरेनियम
-जिन्होने
-बलात्कार
-परीक्षाओं
-उत्तराखण
-ट्रेक
-जन्में
-पि
-पवित्रता
-इंतजार
-लाता
-वादन
-महत्‍वपूर्ण
-ब्
-अल्जीरिया
-सीखना
-नगण्य
-खत्री
-चतुर्भुज
-बाक़ी
-१९००
-टेन
-करोड़ों
-स्क्रीनिंग
-टूटने
-प्रजातियाँ
-आन्तरिक
-कहो
-अपघटन
-देशो
-ब्रेट
-पहुँचे।
-परिस्थितियां
-म्
-पुनर्निर्देशित
-नतीजा
-साइबर
-पैदावार
-स्याही
-नंदा
-सैटेलाइट
-न्यूट्रॉन
-रोनाल्ड
-देवेन
-चमकदार
-जिगर
-योजनाएं
-प्लेग
-अध्यात्म
-विदेशियों
-सच्ची
-चट्टोपाध्याय
-दार्शनिकों
-परिसंपत्ति
-ओक
-जाये।
-इलाक़े
-तुमसे
-बिखरे
-व्यवहारिक
-तराखण्ड
-मऊ
-प्लूटो
-दुखी
-ताम्र
-इल्म
-फैलता
-समतुल्य
-किरणें
-पेव्ड
-हुमायूँ
-सईद
-भाभी
-अंडमान
-चूक
-रणधीर
-इब्न
-बो
-बॉस
-उपराष्ट्रपति
-वू
-स्पीकर
-च्वाइस
-स्टुअर्ट
-प्रदाताओं
-कार्गो
-डेन्जोंगपा
-महज
-सीतापुर
-लगान
-पेंटल
-अनुसूची
-हस्तियों
-बहू
-कुलीन
-किनारा
-कुलकर्णी
-धनराशि
-छुटकारा
-बगीचे
-शिरा
-देखती
-हीन
-मद
-बीट
-वर्धित
-संभाला
-नीच
-बेंज
-जम
-जप
-गियर
-एफएम
-आरोपित
-सोन
-ठाकरे
-स्टीवर्ट
-पाण्डेय
-आयकर
-स्वार्थ
-जन्मतिथि
-विज्ञप्ति
-न्
-रीज़न
-म्हणौनि
-वत
-रणनीतिक
-शु
-अत्याधिक
-खालसा
-प्रान्तों
-कैलोरी
-१२०
-विनिर्देश
-अमावस्या
-गोलियों
-जिन्दगी
-अशुद्ध
-स्मिता
-वार्तालाप
-दाखिल
-काउबॉय
-एक्टर्स
-टेनेसी
-पराबैंगनी
-घूमती
-खुलने
-हिरण
-संचारित
-लैला
-लाभप्रद
-प्वाइंट
-नर्तक
-जासूसी
-मानवों
-शाहपुर
-गुड़िया
-अनुग्रह
-९५
-विश्लेषक
-जहांगीर
-ही।
-त्रिशूल
-मनीश
-स्पैरो
-कोंकणी
-सेक्टर
-रिवर
-यथासंभव
-साम्यवाद
-हडसन
-सेव
-चैंपियंस
-बसों
-किपलिंग
-लड़
-विकिपिडिया
-घनिष्ठ
-दीवारें
-टॉक
-क्रमपरिवर्तन
-म्यूजियम
-प्लान
-केसरी
-फैमिली
-लातिन
-आर्द्रता
-घाना
-अस्मिता
-बट
-छड़ी
-कात्यायन
-पुनर्जन्म
-ग्लूकोज़
-अज्ञेय
-फिटनेस
-प्रतिभाशाली
-कलाकृतियों
-हीलियम
-दोहा
-अंधेरे
-तापीय
-मल्टी
-टीकू
-आर्किटेक्चर
-किन्हीं
-सत्यापन
-बलूचिस्तान
-लारा
-फिशर
-रिहा
-देवा
-गॉड
-सुनाया
-वेश
-सबौर
-प्रशान्त
-चिंताओं
-तंजानिया
-जाएँ।
-संयोजी
-साँचों
-पूछ
-श्राद्ध
-मात
-टैंगो
-अमरनाथ
-जानकार
-कृषक
-पेले
-गुणसूत्र
-पहियों
-जिज्ञासा
-टिप्पणियों
-कहलाने
-मोनोक्रोम
-हीरालाल
-बारीक
-देंगे।
-चित
-छोड़ते
-क़ुरान
-यमन
-आदर्शों
-अपन
-संघटन
-विषयवस्तु
-आमदनी
-स्क्वैश
-दर्शनों
-सूरदास
-मातृभूमि
-फेंकने
-१९५३
-दोस्ताना
-लैण्ड
-योजन
-लॉर्ड्स
-अभि
-यूएफओ
-विध्वंस
-भूपति
-नदाल
-प्रतिभूतियों
-ट्री
-टॉमी
-संप्रदायों
-६२
-वैयक्तिक
-भेजता
-मल्टीमीडिया
-आयामी
-गुड़
-ट्रॉफी
-आविष्कारक
-हुईं।
-लॉयड
-चिह्नों
-बिशप
-साँप
-हेवी
-पर्यवेक्षण
-ाद
-चिन्ता
-आलम
-चौबीस
-तलसानिया
-ताड़
-दायित्वों
-गलतियाँ
-रिएक्टर
-चंद्रगुप्त
-सप्तम
-नाइजीरिया
-स्थ
-गुदा
-त्यों
-मिटटी
-कर्ज़
-बॉन
-६७
-तात्कालिक
-गार्डनर
-अनूठा
-ओड़िआ
-रीटा
-विश्लेषणात्मक
-देवरिया
-नेवर
-्दी
-चिकनी
-डेटिंग
-पोर्टेबल
-उगाया
-बालकों
-स्पोर्ट
-१९५१
-द्रोण
-आवंटित
-गांगुली
-नार्वे
-यन्त्र
-देशपांडे
-८२
-प्याज
-एसएमएस
-तूं
-संहार
-अलौली
-शकीरा
-छू
-देवकी
-गोल्डबर्ग
-मशीनें
-कर्ज
-चढ़ने
-हिमानी
-बतलाया
-बंगलुरु
-पढाई
-नेम
-फ़ैसला
-प्रीतम
-हिरासत
-मुबारक
-खा०प०
-डिप्लोमा
-कॉनकॉर्ड
-समझकर
-संदर्म
-एलर्जी
-नितांत
-उठने
-मेरिल
-गोपनीय
-सुगम
-क़ी
-ाखण्ड
-युग्म
-बढ़ना
-अबाउट
-वहा
-चला।
-वतन
-बाधाओं
-हुबली
-हीट
-फुल
-अनुपस्थित
-येल
-भावुक
-पित्ताशय
-टिन
-लड़ा
-रॉकी
-नोल्स
-वमन
-मारना
-ब्लाक
-बहोत
-कूपर
-करो।
-प्रमाणपत्र
-यूट्यूब
-सम्मलेन
-रनवे
-पूँजी
-मंडप
-पोटेशियम
-उत्तरांचल
-ठेठ
-ओडिशा
-पल्लव
-इन्दौर
-तर्ज़
-ः
-अनूप
-आओ
-कुख्यात
-बांसुरी
-अनुपयुक्त
-मगरमच्छ
-स्पा
-सेबी
-चाहा
-धमनियों
-बारें
-अश्व
-हस्तिनापुर
-ईसाइयों
-आइपॉड
-१०१
-इराकी
-रयान
-ाल
-हिमनद
-अमरावती
-गिरी
-पूछने
-प्रेषित
-घटाने
-डिस्कवरी
-पथरी
-रायबरेली
-नायनमार
-बढती
-मिलेगी
-किशोरों
-साड़ी
-शिवजी
-पुनर्वास
-सहरसा
-कैरोलिना
-आरण्यक
-असुर
-लौंग
-समाविष्ट
-ज़ोन
-फकीर
-बियोवुल्फ़
-राइस
-थेफ्ट
-लू
-ल०
-अज़ाब
-वेबदुनिया
-ल्यूकेमिया
-मार्गरेट
-संन्यास
-रनों
-सुनहरे
-सबने
-विरल
-पॉलिसी
-रश
-कैमरों
-एंजेल्स
-प्राणायाम
-सेलिब्रिटी
-कण्डारस्यूं
-शाश्वत
-जुलूस
-विश
-जेफ
-मतानुसार
-उत्पात
-मामा
-७३
-रहीं।
-क्लिंटन
-विकिया
-आइवी
-लिस्ट
-आबू
-गोमती
-पुरुषोत्तम
-उत्तराखण्
-हेराल्ड
-दांता
-पद्मश्री
-शर्तें
-कटिहार
-स्विंग
-उत्तरार्द्ध
-सिंगल्स
-केदार
-रघु
-वासना
-पहुँचकर
-न्यूकैसल
-मांगी
-अमल
-सल्फर
-छोड
-अंजना
-कंप्यूटरों
-ढ
-विलिस
-सीकर
-जुड़ता
-प्रसन्नता
-प्लेटफॉर्म
-गिरि
-उछाल
-करीना
-जहर
-मासके
-सम्पदा
-चौदहवीं
-ढाईज्यूली
-साओ
-कोचीन
-श्रावण
-अर्पित
-मासूम
-टीन
-स्पार्क
-कट्टर
-चढ़ा
-ट्रिब्यून
-होंडा
-कीये
-एंटोनियो
-लैस
-किससे
-एकजुट
-पतंग
-१९२७
-टीकाकरण
-मूक
-असरगंज
-सतहों
-नाल
-आयताकार
-चढ़ाव
-कार्यशील
-दक्षिणपूर्व
-माथे
-मर्फी
-गुजरता
-सफ़र
-स्लोवेनिया
-रिले
-कॉमन
-जमाव
-कुलभूषण
-्स
-क्रोम
-उजाला
-मूत्राशय
-इस्राइल
-नाड़ी
-ंवत
-परगना
-लैंडिंग
-रेलगाड़ी
-कलाँ
-उद्धार
-ज़रिये
-शॉर्ट
-टिक
-डिज़नी
-फिल्माया
-मरते
-निष्कर्षों
-उलट
-भीमसेन
-चक्रों
-मात्राओं
-प्रणाम
-सिम्बियन
-संस्थागत
-बिताने
-आंग्ल
-बिजनौर
-फायदे
-खेड़ा
-कार्यभार
diff --git a/src/Makefile.am b/src/Makefile.am
index 31399a6aa..225444e32 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -47,9 +47,6 @@ HBLIBS += $(GLIB_LIBS)
HBDEPS += $(GLIB_DEPS)
HBSOURCES += $(HB_GLIB_sources)
HBHEADERS += $(HB_GLIB_headers)
-HB_HAS_GLIB_DEF = define HB_HAS_GLIB 1
-else
-HB_HAS_GLIB_DEF = undef HB_HAS_GLIB
endif
if HAVE_FREETYPE
@@ -58,9 +55,6 @@ HBLIBS += $(FREETYPE_LIBS)
HBDEPS += $(FREETYPE_DEPS)
HBSOURCES += $(HB_FT_sources)
HBHEADERS += $(HB_FT_headers)
-HB_HAS_FREETYPE_DEF = define HB_HAS_FREETYPE 1
-else
-HB_HAS_FREETYPE_DEF = undef HB_HAS_FREETYPE
endif
if HAVE_GRAPHITE2
@@ -69,9 +63,6 @@ HBLIBS += $(GRAPHITE2_LIBS)
HBDEPS += $(GRAPHITE2_DEPS)
HBSOURCES += $(HB_GRAPHITE2_sources)
HBHEADERS += $(HB_GRAPHITE2_headers)
-HB_HAS_GRAPHITE_DEF = define HB_HAS_GRAPHITE 1
-else
-HB_HAS_GRAPHITE_DEF = undef HB_HAS_GRAPHITE
endif
if HAVE_UNISCRIBE
@@ -79,9 +70,6 @@ HBCFLAGS += $(UNISCRIBE_CFLAGS)
HBNONPCLIBS += $(UNISCRIBE_LIBS)
HBSOURCES += $(HB_UNISCRIBE_sources)
HBHEADERS += $(HB_UNISCRIBE_headers)
-HB_HAS_UNISCRIBE_DEF = define HB_HAS_UNISCRIBE 1
-else
-HB_HAS_UNISCRIBE_DEF = undef HB_HAS_UNISCRIBE
endif
if HAVE_DIRECTWRITE
@@ -89,9 +77,6 @@ HBCFLAGS += $(DIRECTWRITE_CXXFLAGS)
HBNONPCLIBS += $(DIRECTWRITE_LIBS)
HBSOURCES += $(HB_DIRECTWRITE_sources)
HBHEADERS += $(HB_DIRECTWRITE_headers)
-HB_HAS_DIRECTWRITE_DEF = define HB_HAS_DIRECTWRITE 1
-else
-HB_HAS_DIRECTWRITE_DEF = undef HB_HAS_DIRECTWRITE
endif
if HAVE_GDI
@@ -99,9 +84,6 @@ HBCFLAGS += $(GDI_CXXFLAGS)
HBNONPCLIBS += $(GDI_LIBS)
HBSOURCES += $(HB_GDI_sources)
HBHEADERS += $(HB_GDI_headers)
-HB_HAS_GDI_DEF = define HB_HAS_GDI 1
-else
-HB_HAS_GDI_DEF = undef HB_HAS_GDI
endif
if HAVE_CORETEXT
@@ -109,9 +91,6 @@ HBCFLAGS += $(CORETEXT_CFLAGS)
HBNONPCLIBS += $(CORETEXT_LIBS)
HBSOURCES += $(HB_CORETEXT_sources)
HBHEADERS += $(HB_CORETEXT_headers)
-HB_HAS_CORETEXT_DEF = define HB_HAS_CORETEXT 1
-else
-HB_HAS_CORETEXT_DEF = undef HB_HAS_CORETEXT
endif
@@ -168,7 +147,7 @@ pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = harfbuzz.pc
cmakedir = $(libdir)/cmake/harfbuzz
cmake_DATA = harfbuzz-config.cmake
-EXTRA_DIST += hb-version.h.in hb-features.h.in harfbuzz.pc.in harfbuzz-config.cmake.in
+EXTRA_DIST += hb-version.h.in harfbuzz.pc.in harfbuzz-config.cmake.in
lib_LTLIBRARIES += libharfbuzz-subset.la
libharfbuzz_subset_la_LINK = $(chosen_linker) $(libharfbuzz_subset_la_LDFLAGS)
@@ -199,7 +178,6 @@ HBCFLAGS += $(ICU_CFLAGS)
HBLIBS += $(ICU_LIBS)
HBSOURCES += $(HB_ICU_sources)
HBHEADERS += $(HB_ICU_headers)
-HB_HAS_ICU_DEF = define HB_HAS_ICU 1
else
lib_LTLIBRARIES += libharfbuzz-icu.la
libharfbuzz_icu_la_SOURCES = $(HB_ICU_sources)
@@ -209,7 +187,6 @@ libharfbuzz_icu_la_LIBADD = $(ICU_LIBS) libharfbuzz.la
EXTRA_libharfbuzz_icu_la_DEPENDENCIES = $(harfbuzz_icu_def_dependency)
pkginclude_HEADERS += $(HB_ICU_headers)
pkgconfig_DATA += harfbuzz-icu.pc
-HB_HAS_ICU_DEF = undef HB_HAS_ICU
endif
endif
EXTRA_DIST += harfbuzz-icu.pc.in
@@ -249,25 +226,6 @@ EXTRA_DIST += \
$(NULL)
-BUILT_SOURCES += \
- hb-features.h
-DISTCLEANFILES += \
- hb-features.h
-
-hb-features.h: hb-features.h.in $(top_builddir)/config.status
- $(AM_V_GEN) $(SED) \
- -e 's/mesondefine HB_HAS_FREETYPE/$(HB_HAS_FREETYPE_DEF)/' \
- -e 's/mesondefine HB_HAS_GDI/$(HB_HAS_GDI_DEF)/' \
- -e 's/mesondefine HB_HAS_GDI/$(HB_HAS_GDI_DEF)/' \
- -e 's/mesondefine HB_HAS_GRAPHITE/$(HB_HAS_GRAPHITE_DEF)/' \
- -e 's/mesondefine HB_HAS_GLIB/$(HB_HAS_GLIB_DEF)/' \
- -e 's/mesondefine HB_HAS_UNISCRIBE/$(HB_HAS_UNISCRIBE_DEF)/' \
- -e 's/mesondefine HB_HAS_DIRECTWRITE/$(HB_HAS_DIRECTWRITE_DEF)/' \
- -e 's/mesondefine HB_HAS_CORETEXT/$(HB_HAS_CORETEXT_DEF)/' \
- -e 's/mesondefine HB_HAS_ICU/$(HB_HAS_ICU_DEF)/' \
- "$<" > "$@" || ($(RM) "$@"; false)
-
-
%.pc: %.pc.in $(top_builddir)/config.status
$(AM_V_GEN) \
$(SED) -e 's@%prefix%@$(prefix)@g' \
@@ -410,7 +368,6 @@ COMPILED_TESTS = \
test-iter \
test-machinery \
test-map \
- test-multimap \
test-number \
test-ot-tag \
test-priority-queue \
@@ -450,10 +407,6 @@ test_map_SOURCES = test-map.cc hb-static.cc
test_map_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
test_map_LDADD = $(COMPILED_TESTS_LDADD)
-test_multimap_SOURCES = test-multimap.cc hb-static.cc
-test_multimap_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
-test_multimap_LDADD = $(COMPILED_TESTS_LDADD)
-
test_number_SOURCES = test-number.cc hb-number.cc
test_number_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS)
test_number_LDADD = $(COMPILED_TESTS_LDADD)
diff --git a/src/Makefile.sources b/src/Makefile.sources
index 6c4fc5de7..6c891eac5 100644
--- a/src/Makefile.sources
+++ b/src/Makefile.sources
@@ -52,7 +52,6 @@ HB_BASE_sources = \
hb-map.hh \
hb-meta.hh \
hb-ms-feature-ranges.hh \
- hb-multimap.hh \
hb-mutex.hh \
hb-null.hh \
hb-number.cc \
@@ -96,10 +95,7 @@ HB_BASE_sources = \
OT/glyf/Glyph.hh \
OT/glyf/GlyphHeader.hh \
OT/glyf/SimpleGlyph.hh \
- OT/glyf/coord-setter.hh \
- OT/glyf/composite-iter.hh \
OT/glyf/CompositeGlyph.hh \
- OT/glyf/VarCompositeGlyph.hh \
OT/glyf/SubsetGlyph.hh \
OT/Layout/types.hh \
OT/Layout/Common/Coverage.hh \
diff --git a/src/OT/Layout/Common/Coverage.hh b/src/OT/Layout/Common/Coverage.hh
index fbd7c642a..eef89a287 100644
--- a/src/OT/Layout/Common/Coverage.hh
+++ b/src/OT/Layout/Common/Coverage.hh
@@ -49,7 +49,7 @@ struct Coverage
HBUINT16 format; /* Format identifier */
CoverageFormat1_3<SmallTypes> format1;
CoverageFormat2_4<SmallTypes> format2;
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
CoverageFormat1_3<MediumTypes>format3;
CoverageFormat2_4<MediumTypes>format4;
#endif
@@ -65,7 +65,7 @@ struct Coverage
{
case 1: return_trace (u.format1.sanitize (c));
case 2: return_trace (u.format2.sanitize (c));
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 3: return_trace (u.format3.sanitize (c));
case 4: return_trace (u.format4.sanitize (c));
#endif
@@ -74,8 +74,10 @@ struct Coverage
}
/* Has interface. */
- unsigned operator [] (hb_codepoint_t k) const { return get (k); }
- bool has (hb_codepoint_t k) const { return (*this)[k] != NOT_COVERED; }
+ 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); }
@@ -85,7 +87,7 @@ struct Coverage
switch (u.format) {
case 1: return u.format1.get_coverage (glyph_id);
case 2: return u.format2.get_coverage (glyph_id);
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 3: return u.format3.get_coverage (glyph_id);
case 4: return u.format4.get_coverage (glyph_id);
#endif
@@ -98,7 +100,7 @@ struct Coverage
switch (u.format) {
case 1: return u.format1.get_population ();
case 2: return u.format2.get_population ();
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 3: return u.format3.get_population ();
case 4: return u.format4.get_population ();
#endif
@@ -125,7 +127,7 @@ struct Coverage
}
u.format = count <= num_ranges * 3 ? 1 : 2;
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
if (count && last > 0xFFFFu)
u.format += 2;
#endif
@@ -134,7 +136,7 @@ struct Coverage
{
case 1: return_trace (u.format1.serialize (c, glyphs));
case 2: return_trace (u.format2.serialize (c, glyphs));
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 3: return_trace (u.format3.serialize (c, glyphs));
case 4: return_trace (u.format4.serialize (c, glyphs));
#endif
@@ -164,7 +166,7 @@ struct Coverage
{
case 1: return u.format1.intersects (glyphs);
case 2: return u.format2.intersects (glyphs);
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 3: return u.format3.intersects (glyphs);
case 4: return u.format4.intersects (glyphs);
#endif
@@ -177,7 +179,7 @@ struct Coverage
{
case 1: return u.format1.intersects_coverage (glyphs, index);
case 2: return u.format2.intersects_coverage (glyphs, index);
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 3: return u.format3.intersects_coverage (glyphs, index);
case 4: return u.format4.intersects_coverage (glyphs, index);
#endif
@@ -194,7 +196,7 @@ struct Coverage
{
case 1: return u.format1.collect_coverage (glyphs);
case 2: return u.format2.collect_coverage (glyphs);
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 3: return u.format3.collect_coverage (glyphs);
case 4: return u.format4.collect_coverage (glyphs);
#endif
@@ -210,7 +212,7 @@ struct Coverage
{
case 1: return u.format1.intersect_set (glyphs, intersect_glyphs);
case 2: return u.format2.intersect_set (glyphs, intersect_glyphs);
-#ifndef HB_NO_BEYOND_64K
+#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
@@ -223,13 +225,13 @@ struct Coverage
static constexpr bool is_sorted_iterator = true;
iter_t (const Coverage &c_ = Null (Coverage))
{
- hb_memset (this, 0, sizeof (*this));
+ 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_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 3: u.format3.init (c_.u.format3); return;
case 4: u.format4.init (c_.u.format4); return;
#endif
@@ -242,7 +244,7 @@ struct Coverage
{
case 1: return u.format1.__more__ ();
case 2: return u.format2.__more__ ();
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 3: return u.format3.__more__ ();
case 4: return u.format4.__more__ ();
#endif
@@ -255,7 +257,7 @@ struct Coverage
{
case 1: u.format1.__next__ (); break;
case 2: u.format2.__next__ (); break;
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 3: u.format3.__next__ (); break;
case 4: u.format4.__next__ (); break;
#endif
@@ -271,7 +273,7 @@ struct Coverage
{
case 1: return u.format1.get_glyph ();
case 2: return u.format2.get_glyph ();
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 3: return u.format3.get_glyph ();
case 4: return u.format4.get_glyph ();
#endif
@@ -285,7 +287,7 @@ struct Coverage
{
case 1: return u.format1 != o.u.format1;
case 2: return u.format2 != o.u.format2;
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 3: return u.format3 != o.u.format3;
case 4: return u.format4 != o.u.format4;
#endif
@@ -300,7 +302,7 @@ struct Coverage
{
case 1: it.u.format1 = u.format1.__end__ (); break;
case 2: it.u.format2 = u.format2.__end__ (); break;
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 3: it.u.format3 = u.format3.__end__ (); break;
case 4: it.u.format4 = u.format4.__end__ (); break;
#endif
@@ -312,7 +314,7 @@ struct Coverage
private:
unsigned int format;
union {
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
CoverageFormat2_4<MediumTypes>::iter_t format4; /* Put this one first since it's larger; helps shut up compiler. */
CoverageFormat1_3<MediumTypes>::iter_t format3;
#endif
diff --git a/src/OT/Layout/Common/CoverageFormat1.hh b/src/OT/Layout/Common/CoverageFormat1.hh
index 5d68e3d15..82fd48dc5 100644
--- a/src/OT/Layout/Common/CoverageFormat1.hh
+++ b/src/OT/Layout/Common/CoverageFormat1.hh
@@ -77,14 +77,7 @@ struct CoverageFormat1_3
bool intersects (const hb_set_t *glyphs) const
{
- if (glyphArray.len > glyphs->get_population () * hb_bit_storage ((unsigned) glyphArray.len) / 2)
- {
- for (hb_codepoint_t g = HB_SET_VALUE_INVALID; glyphs->next (&g);)
- if (get_coverage (g) != NOT_COVERED)
- return true;
- return false;
- }
-
+ /* TODO Speed up, using hb_set_next() and bsearch()? */
for (const auto& g : glyphArray.as_array ())
if (glyphs->has (g))
return true;
diff --git a/src/OT/Layout/Common/CoverageFormat2.hh b/src/OT/Layout/Common/CoverageFormat2.hh
index d7fcc3520..974d09463 100644
--- a/src/OT/Layout/Common/CoverageFormat2.hh
+++ b/src/OT/Layout/Common/CoverageFormat2.hh
@@ -80,6 +80,8 @@ struct CoverageFormat2_4
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)
@@ -113,22 +115,26 @@ struct CoverageFormat2_4
bool intersects (const hb_set_t *glyphs) const
{
- if (rangeRecord.len > glyphs->get_population () * hb_bit_storage ((unsigned) rangeRecord.len) / 2)
- {
- for (hb_codepoint_t g = HB_SET_VALUE_INVALID; glyphs->next (&g);)
- if (get_coverage (g) != NOT_COVERED)
- return true;
- return false;
- }
-
return hb_any (+ hb_iter (rangeRecord)
| hb_map ([glyphs] (const RangeRecord<Types> &range) { return range.intersects (*glyphs); }));
}
bool intersects_coverage (const hb_set_t *glyphs, unsigned int index) const
{
- auto *range = rangeRecord.as_array ().bsearch (index);
- if (range)
- return range->intersects (*glyphs);
+ auto cmp = [] (const void *pk, const void *pr) -> int
+ {
+ unsigned index = * (const unsigned *) pk;
+ const RangeRecord<Types> &range = * (const RangeRecord<Types> *) 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;
}
@@ -136,14 +142,9 @@ struct CoverageFormat2_4
hb_requires (hb_is_sink_of (IterableOut, hb_codepoint_t))>
void intersect_set (const hb_set_t &glyphs, IterableOut&& intersect_glyphs) const
{
- /* Break out of loop for overlapping, broken, tables,
- * to avoid fuzzer timouts. */
- hb_codepoint_t last = 0;
for (const auto& range : rangeRecord)
{
- if (unlikely (range.first < last))
- break;
- last = range.last;
+ hb_codepoint_t last = range.last;
for (hb_codepoint_t g = range.first - 1;
glyphs.next (&g) && g <= last;)
intersect_glyphs << g;
diff --git a/src/OT/Layout/GPOS/MarkBasePos.hh b/src/OT/Layout/GPOS/MarkBasePos.hh
index edf7099c0..c99b6b2e4 100644
--- a/src/OT/Layout/GPOS/MarkBasePos.hh
+++ b/src/OT/Layout/GPOS/MarkBasePos.hh
@@ -13,7 +13,7 @@ struct MarkBasePos
union {
HBUINT16 format; /* Format identifier */
MarkBasePosFormat1_2<SmallTypes> format1;
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
MarkBasePosFormat1_2<MediumTypes> format2;
#endif
} u;
@@ -26,7 +26,7 @@ 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<Ts> (ds)...));
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
#endif
default:return_trace (c->default_return_value ());
diff --git a/src/OT/Layout/GPOS/MarkLigPos.hh b/src/OT/Layout/GPOS/MarkLigPos.hh
index 09152fd87..8a4de9ffa 100644
--- a/src/OT/Layout/GPOS/MarkLigPos.hh
+++ b/src/OT/Layout/GPOS/MarkLigPos.hh
@@ -13,7 +13,7 @@ struct MarkLigPos
union {
HBUINT16 format; /* Format identifier */
MarkLigPosFormat1_2<SmallTypes> format1;
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
MarkLigPosFormat1_2<MediumTypes> format2;
#endif
} u;
@@ -26,7 +26,7 @@ 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<Ts> (ds)...));
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
#endif
default:return_trace (c->default_return_value ());
diff --git a/src/OT/Layout/GPOS/MarkMarkPos.hh b/src/OT/Layout/GPOS/MarkMarkPos.hh
index 4118fc304..74b5105c4 100644
--- a/src/OT/Layout/GPOS/MarkMarkPos.hh
+++ b/src/OT/Layout/GPOS/MarkMarkPos.hh
@@ -13,7 +13,7 @@ struct MarkMarkPos
union {
HBUINT16 format; /* Format identifier */
MarkMarkPosFormat1_2<SmallTypes> format1;
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
MarkMarkPosFormat1_2<MediumTypes> format2;
#endif
} u;
@@ -26,7 +26,7 @@ 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<Ts> (ds)...));
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
#endif
default:return_trace (c->default_return_value ());
diff --git a/src/OT/Layout/GPOS/PairPos.hh b/src/OT/Layout/GPOS/PairPos.hh
index 9823768cb..72bfc43dc 100644
--- a/src/OT/Layout/GPOS/PairPos.hh
+++ b/src/OT/Layout/GPOS/PairPos.hh
@@ -15,7 +15,7 @@ struct PairPos
HBUINT16 format; /* Format identifier */
PairPosFormat1_3<SmallTypes> format1;
PairPosFormat2_4<SmallTypes> format2;
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
PairPosFormat1_3<MediumTypes> format3;
PairPosFormat2_4<MediumTypes> format4;
#endif
@@ -30,7 +30,7 @@ struct PairPos
switch (u.format) {
case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 3: return_trace (c->dispatch (u.format3, std::forward<Ts> (ds)...));
case 4: return_trace (c->dispatch (u.format4, std::forward<Ts> (ds)...));
#endif
diff --git a/src/OT/Layout/GPOS/PairPosFormat1.hh b/src/OT/Layout/GPOS/PairPosFormat1.hh
index 9c9b26888..ddf7313f9 100644
--- a/src/OT/Layout/GPOS/PairPosFormat1.hh
+++ b/src/OT/Layout/GPOS/PairPosFormat1.hh
@@ -51,21 +51,8 @@ struct PairPosFormat1_3
bool intersects (const hb_set_t *glyphs) const
{
- auto &cov = this+coverage;
-
- if (pairSet.len > glyphs->get_population () * hb_bit_storage ((unsigned) pairSet.len) / 4)
- {
- for (hb_codepoint_t g = HB_SET_VALUE_INVALID; glyphs->next (&g);)
- {
- unsigned i = cov.get_coverage (g);
- if ((this+pairSet[i]).intersects (glyphs, valueFormat))
- return true;
- }
- return false;
- }
-
return
- + hb_zip (cov, pairSet)
+ + hb_zip (this+coverage, pairSet)
| hb_filter (*glyphs, hb_first)
| hb_map (hb_second)
| hb_map ([glyphs, this] (const typename Types::template OffsetTo<PairSet> &_)
@@ -184,16 +171,12 @@ struct PairPosFormat1_3
unsigned format1 = 0;
unsigned format2 = 0;
for (const auto & _ :
- + hb_zip (this+coverage, pairSet)
- | hb_filter (glyphset, hb_first)
- | hb_map (hb_second)
- )
+ + hb_zip (this+coverage, pairSet) | hb_filter (glyphset, hb_first) | hb_map (hb_second))
{
const PairSet& set = (this + _);
const PairValueRecord *record = &set.firstPairValueRecord;
- unsigned count = set.len;
- for (unsigned i = 0; i < count; i++)
+ for (unsigned i = 0; i < set.len; i++)
{
if (record->intersects (glyphset))
{
@@ -202,9 +185,6 @@ struct PairPosFormat1_3
}
record = &StructAtOffset<const PairValueRecord> (record, record_size);
}
-
- if (format1 == valueFormat[0] && format2 == valueFormat[1])
- break;
}
return hb_pair (format1, format2);
diff --git a/src/OT/Layout/GPOS/PairPosFormat2.hh b/src/OT/Layout/GPOS/PairPosFormat2.hh
index 9c87ac2b0..83b093b98 100644
--- a/src/OT/Layout/GPOS/PairPosFormat2.hh
+++ b/src/OT/Layout/GPOS/PairPosFormat2.hh
@@ -220,25 +220,17 @@ struct PairPosFormat2_4
if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ())
{
c->buffer->message (c->font,
- "try kerning glyphs at %d,%d",
+ "kerning glyphs at %d,%d",
c->buffer->idx, skippy_iter.idx);
}
applied_first = valueFormat1.apply_value (c, this, v, buffer->cur_pos());
applied_second = valueFormat2.apply_value (c, this, v + len1, buffer->pos[skippy_iter.idx]);
- if (applied_first || applied_second)
- if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ())
- {
- c->buffer->message (c->font,
- "kerned glyphs at %d,%d",
- c->buffer->idx, skippy_iter.idx);
- }
-
if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ())
{
c->buffer->message (c->font,
- "tried kerning glyphs at %d,%d",
+ "kerned glyphs at %d,%d",
c->buffer->idx, skippy_iter.idx);
}
@@ -249,15 +241,10 @@ struct PairPosFormat2_4
boring:
buffer->unsafe_to_concat (buffer->idx, skippy_iter.idx + 1);
- if (len2)
- {
- skippy_iter.idx++;
- // https://github.com/harfbuzz/harfbuzz/issues/3824
- // https://github.com/harfbuzz/harfbuzz/issues/3888#issuecomment-1326781116
- buffer->unsafe_to_break (buffer->idx, skippy_iter.idx + 1);
- }
buffer->idx = skippy_iter.idx;
+ if (len2)
+ buffer->idx++;
return_trace (true);
}
@@ -322,7 +309,6 @@ struct PairPosFormat2_4
{
unsigned len1 = valueFormat1.get_len ();
unsigned len2 = valueFormat2.get_len ();
- unsigned record_size = len1 + len2;
unsigned format1 = 0;
unsigned format2 = 0;
@@ -331,13 +317,10 @@ struct PairPosFormat2_4
{
for (unsigned class2_idx : + hb_range ((unsigned) class2Count) | hb_filter (klass2_map))
{
- unsigned idx = (class1_idx * (unsigned) class2Count + class2_idx) * record_size;
+ unsigned idx = (class1_idx * (unsigned) class2Count + class2_idx) * (len1 + len2);
format1 = format1 | valueFormat1.get_effective_format (&values[idx]);
format2 = format2 | valueFormat2.get_effective_format (&values[idx + len1]);
}
-
- if (format1 == valueFormat1 && format2 == valueFormat2)
- break;
}
return hb_pair (format1, format2);
diff --git a/src/OT/Layout/GPOS/PairSet.hh b/src/OT/Layout/GPOS/PairSet.hh
index a318f3991..aa48d933c 100644
--- a/src/OT/Layout/GPOS/PairSet.hh
+++ b/src/OT/Layout/GPOS/PairSet.hh
@@ -112,38 +112,24 @@ struct PairSet
if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ())
{
c->buffer->message (c->font,
- "try kerning glyphs at %d,%d",
+ "kerning glyphs at %d,%d",
c->buffer->idx, pos);
}
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)
- if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ())
- {
- c->buffer->message (c->font,
- "kerned glyphs at %d,%d",
- c->buffer->idx, pos);
- }
-
if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ())
{
c->buffer->message (c->font,
- "tried kerning glyphs at %d,%d",
+ "kerned glyphs at %d,%d",
c->buffer->idx, pos);
}
if (applied_first || applied_second)
buffer->unsafe_to_break (buffer->idx, pos + 1);
-
if (len2)
- {
- pos++;
- // https://github.com/harfbuzz/harfbuzz/issues/3824
- // https://github.com/harfbuzz/harfbuzz/issues/3888#issuecomment-1326781116
- buffer->unsafe_to_break (buffer->idx, pos + 1);
- }
+ pos++;
buffer->idx = pos;
return_trace (true);
diff --git a/src/OT/Layout/GSUB/AlternateSet.hh b/src/OT/Layout/GSUB/AlternateSet.hh
index 6c50c9717..4a9e9672e 100644
--- a/src/OT/Layout/GSUB/AlternateSet.hh
+++ b/src/OT/Layout/GSUB/AlternateSet.hh
@@ -84,7 +84,7 @@ struct AlternateSet
{
if (alternates.len && alternate_count)
{
- + alternates.as_array ().sub_array (start_offset, alternate_count)
+ + alternates.sub_array (start_offset, alternate_count)
| hb_sink (hb_array (alternate_glyphs, *alternate_count))
;
}
diff --git a/src/OT/Layout/GSUB/AlternateSubst.hh b/src/OT/Layout/GSUB/AlternateSubst.hh
index 9d7cd6fdd..37406179a 100644
--- a/src/OT/Layout/GSUB/AlternateSubst.hh
+++ b/src/OT/Layout/GSUB/AlternateSubst.hh
@@ -14,7 +14,7 @@ struct AlternateSubst
union {
HBUINT16 format; /* Format identifier */
AlternateSubstFormat1_2<SmallTypes> format1;
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
AlternateSubstFormat1_2<MediumTypes> format2;
#endif
} u;
@@ -27,7 +27,7 @@ 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<Ts> (ds)...));
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
#endif
default:return_trace (c->default_return_value ());
diff --git a/src/OT/Layout/GSUB/Ligature.hh b/src/OT/Layout/GSUB/Ligature.hh
index cdb35f525..6caa80e05 100644
--- a/src/OT/Layout/GSUB/Ligature.hh
+++ b/src/OT/Layout/GSUB/Ligature.hh
@@ -118,7 +118,7 @@ struct Ligature
match_positions[i] += delta;
if (i)
*p++ = ',';
- snprintf (p, sizeof(buf) - (p - buf), "%u", match_positions[i]);
+ snprintf (p, sizeof(buf), "%u", match_positions[i]);
p += strlen(p);
}
diff --git a/src/OT/Layout/GSUB/LigatureSubst.hh b/src/OT/Layout/GSUB/LigatureSubst.hh
index 7ba19e844..63707972a 100644
--- a/src/OT/Layout/GSUB/LigatureSubst.hh
+++ b/src/OT/Layout/GSUB/LigatureSubst.hh
@@ -14,7 +14,7 @@ struct LigatureSubst
union {
HBUINT16 format; /* Format identifier */
LigatureSubstFormat1_2<SmallTypes> format1;
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
LigatureSubstFormat1_2<MediumTypes> format2;
#endif
} u;
@@ -27,7 +27,7 @@ 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<Ts> (ds)...));
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
#endif
default:return_trace (c->default_return_value ());
diff --git a/src/OT/Layout/GSUB/MultipleSubst.hh b/src/OT/Layout/GSUB/MultipleSubst.hh
index 95710ed2b..852ca3eac 100644
--- a/src/OT/Layout/GSUB/MultipleSubst.hh
+++ b/src/OT/Layout/GSUB/MultipleSubst.hh
@@ -14,7 +14,7 @@ struct MultipleSubst
union {
HBUINT16 format; /* Format identifier */
MultipleSubstFormat1_2<SmallTypes> format1;
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
MultipleSubstFormat1_2<MediumTypes> format2;
#endif
} u;
@@ -28,7 +28,7 @@ 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<Ts> (ds)...));
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
#endif
default:return_trace (c->default_return_value ());
diff --git a/src/OT/Layout/GSUB/Sequence.hh b/src/OT/Layout/GSUB/Sequence.hh
index e2190078b..abf1c643f 100644
--- a/src/OT/Layout/GSUB/Sequence.hh
+++ b/src/OT/Layout/GSUB/Sequence.hh
@@ -117,7 +117,7 @@ struct Sequence
{
if (buf < p)
*p++ = ',';
- snprintf (p, sizeof(buf) - (p - buf), "%u", i);
+ snprintf (p, sizeof(buf), "%u", i);
p += strlen(p);
}
diff --git a/src/OT/Layout/GSUB/SingleSubst.hh b/src/OT/Layout/GSUB/SingleSubst.hh
index 7da810316..6942e6997 100644
--- a/src/OT/Layout/GSUB/SingleSubst.hh
+++ b/src/OT/Layout/GSUB/SingleSubst.hh
@@ -16,7 +16,7 @@ struct SingleSubst
HBUINT16 format; /* Format identifier */
SingleSubstFormat1_3<SmallTypes> format1;
SingleSubstFormat2_4<SmallTypes> format2;
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
SingleSubstFormat1_3<MediumTypes> format3;
SingleSubstFormat2_4<MediumTypes> format4;
#endif
@@ -32,7 +32,7 @@ struct SingleSubst
switch (u.format) {
case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 3: return_trace (c->dispatch (u.format3, std::forward<Ts> (ds)...));
case 4: return_trace (c->dispatch (u.format4, std::forward<Ts> (ds)...));
#endif
@@ -55,7 +55,7 @@ struct SingleSubst
format = 1;
hb_codepoint_t mask = 0xFFFFu;
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
if (+ glyphs
| hb_map_retains_sorting (hb_first)
| hb_filter ([] (hb_codepoint_t gid) { return gid > 0xFFFFu; }))
@@ -78,7 +78,7 @@ struct SingleSubst
| hb_map_retains_sorting (hb_first),
delta));
case 2: return_trace (u.format2.serialize (c, glyphs));
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 3: return_trace (u.format3.serialize (c,
+ glyphs
| hb_map_retains_sorting (hb_first),
diff --git a/src/OT/Layout/GSUB/SingleSubstFormat1.hh b/src/OT/Layout/GSUB/SingleSubstFormat1.hh
index 1be21b98b..13665d7ba 100644
--- a/src/OT/Layout/GSUB/SingleSubstFormat1.hh
+++ b/src/OT/Layout/GSUB/SingleSubstFormat1.hh
@@ -57,7 +57,7 @@ struct SingleSubstFormat1_3
hb_codepoint_t max_before = intersection.get_max ();
hb_codepoint_t min_after = (min_before + d) & mask;
hb_codepoint_t max_after = (max_before + d) & mask;
- if (intersection.get_population () == max_before - min_before + 1 &&
+ if (pop >= max_before - min_before &&
((min_before <= min_after && min_after <= max_before) ||
(min_before <= max_after && max_after <= max_before)))
return;
diff --git a/src/OT/Layout/GSUB/SingleSubstFormat2.hh b/src/OT/Layout/GSUB/SingleSubstFormat2.hh
index 01df71452..541629975 100644
--- a/src/OT/Layout/GSUB/SingleSubstFormat2.hh
+++ b/src/OT/Layout/GSUB/SingleSubstFormat2.hh
@@ -36,24 +36,8 @@ struct SingleSubstFormat2_4
void closure (hb_closure_context_t *c) const
{
- auto &cov = this+coverage;
- auto &glyph_set = c->parent_active_glyphs ();
-
- if (substitute.len > glyph_set.get_population () * 4)
- {
- for (auto g : glyph_set)
- {
- unsigned i = cov.get_coverage (g);
- if (i == NOT_COVERED || i >= substitute.len)
- continue;
- c->output->add (substitute.arrayZ[i]);
- }
-
- return;
- }
-
- + hb_zip (cov, substitute)
- | hb_filter (glyph_set, hb_first)
+ + hb_zip (this+coverage, substitute)
+ | hb_filter (c->parent_active_glyphs (), hb_first)
| hb_map (hb_second)
| hb_sink (c->output)
;
diff --git a/src/OT/glyf/CompositeGlyph.hh b/src/OT/glyf/CompositeGlyph.hh
index edf8cd879..fc8e309bc 100644
--- a/src/OT/glyf/CompositeGlyph.hh
+++ b/src/OT/glyf/CompositeGlyph.hh
@@ -3,7 +3,6 @@
#include "../../hb-open-type.hh"
-#include "composite-iter.hh"
namespace OT {
@@ -122,7 +121,7 @@ struct CompositeGlyphRecord
if (flags & ARG_1_AND_2_ARE_WORDS)
{
// no overflow, copy and update value with deltas
- hb_memcpy (out, this, len);
+ memcpy (out, this, len);
const HBINT16 *px = reinterpret_cast<const HBINT16 *> (p);
HBINT16 *o = reinterpret_cast<HBINT16 *> (out + len_before_val);
@@ -136,7 +135,7 @@ struct CompositeGlyphRecord
if (new_x <= 127 && new_x >= -128 &&
new_y <= 127 && new_y >= -128)
{
- hb_memcpy (out, this, len);
+ memcpy (out, this, len);
HBINT8 *o = reinterpret_cast<HBINT8 *> (out + len_before_val);
o[0] = new_x;
o[1] = new_y;
@@ -144,7 +143,7 @@ struct CompositeGlyphRecord
else
{
// int8 overflows after deltas applied
- hb_memcpy (out, this, len_before_val);
+ memcpy (out, this, len_before_val);
//update flags
CompositeGlyphRecord *o = reinterpret_cast<CompositeGlyphRecord *> (out);
@@ -153,14 +152,14 @@ struct CompositeGlyphRecord
HBINT16 new_value;
new_value = new_x;
- hb_memcpy (out, &new_value, HBINT16::static_size);
+ memcpy (out, &new_value, HBINT16::static_size);
out += HBINT16::static_size;
new_value = new_y;
- hb_memcpy (out, &new_value, HBINT16::static_size);
+ memcpy (out, &new_value, HBINT16::static_size);
out += HBINT16::static_size;
- hb_memcpy (out, p+2, len - len_before_val - 2);
+ memcpy (out, p+2, len - len_before_val - 2);
len += 2;
}
}
@@ -253,7 +252,55 @@ struct CompositeGlyphRecord
DEFINE_SIZE_MIN (4);
};
-using composite_iter_t = composite_iter_tmpl<CompositeGlyphRecord>;
+struct composite_iter_t : hb_iter_with_fallback_t<composite_iter_t, const CompositeGlyphRecord &>
+{
+ typedef const CompositeGlyphRecord *__item_t__;
+ composite_iter_t (hb_bytes_t glyph_, __item_t__ current_) :
+ glyph (glyph_), current (nullptr), current_size (0)
+ {
+ set_current (current_);
+ }
+
+ composite_iter_t () : glyph (hb_bytes_t ()), current (nullptr), current_size (0) {}
+
+ item_t __item__ () const { return *current; }
+ bool __more__ () const { return current; }
+ void __next__ ()
+ {
+ if (!current->has_more ()) { current = nullptr; return; }
+
+ set_current (&StructAtOffset<CompositeGlyphRecord> (current, current_size));
+ }
+ composite_iter_t __end__ () const { return composite_iter_t (); }
+ bool operator != (const composite_iter_t& o) const
+ { return current != o.current; }
+
+
+ void set_current (__item_t__ current_)
+ {
+ if (!glyph.check_range (current_, CompositeGlyphRecord::min_size))
+ {
+ current = nullptr;
+ current_size = 0;
+ return;
+ }
+ unsigned size = current_->get_size ();
+ if (!glyph.check_range (current_, size))
+ {
+ current = nullptr;
+ current_size = 0;
+ return;
+ }
+
+ current = current_;
+ current_size = size;
+ }
+
+ private:
+ hb_bytes_t glyph;
+ __item_t__ current;
+ unsigned current_size;
+};
struct CompositeGlyph
{
@@ -335,7 +382,7 @@ struct CompositeGlyph
unsigned comp_len = component.get_size ();
if (component.is_anchored ())
{
- hb_memcpy (p, &component, comp_len);
+ memcpy (p, &component, comp_len);
p += comp_len;
}
else
@@ -351,7 +398,7 @@ struct CompositeGlyph
if (source_len > source_comp_len)
{
unsigned instr_len = source_len - source_comp_len;
- hb_memcpy (p, (const char *)c + source_comp_len, instr_len);
+ memcpy (p, (const char *)c + source_comp_len, instr_len);
p += instr_len;
}
diff --git a/src/OT/glyf/Glyph.hh b/src/OT/glyf/Glyph.hh
index b7215b017..0b25659ac 100644
--- a/src/OT/glyf/Glyph.hh
+++ b/src/OT/glyf/Glyph.hh
@@ -7,8 +7,6 @@
#include "GlyphHeader.hh"
#include "SimpleGlyph.hh"
#include "CompositeGlyph.hh"
-#include "VarCompositeGlyph.hh"
-#include "coord-setter.hh"
namespace OT {
@@ -18,11 +16,6 @@ struct glyf_accelerator_t;
namespace glyf_impl {
-#ifndef HB_GLYF_MAX_POINTS
-#define HB_GLYF_MAX_POINTS 10000
-#endif
-
-
enum phantom_point_index_t
{
PHANTOM_LEFT = 0,
@@ -34,7 +27,7 @@ enum phantom_point_index_t
struct Glyph
{
- enum glyph_type_t { EMPTY, SIMPLE, COMPOSITE, VAR_COMPOSITE };
+ enum glyph_type_t { EMPTY, SIMPLE, COMPOSITE };
public:
composite_iter_t get_composite_iterator () const
@@ -42,11 +35,6 @@ struct Glyph
if (type != COMPOSITE) return composite_iter_t ();
return CompositeGlyph (*header, bytes).iter ();
}
- var_composite_iter_t get_var_composite_iterator () const
- {
- if (type != VAR_COMPOSITE) return var_composite_iter_t ();
- return VarCompositeGlyph (*header, bytes).iter ();
- }
const hb_bytes_t trim_padding () const
{
@@ -120,25 +108,25 @@ struct Glyph
if (unlikely (!glyph_header)) return false;
}
- float xMin = 0, xMax = 0;
- float yMin = 0, yMax = 0;
+ int xMin = 0, xMax = 0;
+ int yMin = 0, yMax = 0;
if (all_points.length > 4)
{
- xMin = xMax = all_points[0].x;
- yMin = yMax = all_points[0].y;
+ xMin = xMax = roundf (all_points[0].x);
+ yMin = yMax = roundf (all_points[0].y);
}
for (unsigned i = 1; i < all_points.length - 4; i++)
{
- float x = all_points[i].x;
- float y = all_points[i].y;
- xMin = hb_min (xMin, x);
- xMax = hb_max (xMax, x);
- yMin = hb_min (yMin, y);
- yMax = hb_max (yMax, y);
+ float rounded_x = roundf (all_points[i].x);
+ float rounded_y = roundf (all_points[i].y);
+ xMin = hb_min (xMin, rounded_x);
+ xMax = hb_max (xMax, rounded_x);
+ yMin = hb_min (yMin, rounded_y);
+ yMax = hb_max (yMax, rounded_y);
}
- update_mtx (plan, roundf (xMin), roundf (yMax), all_points);
+ update_mtx (plan, xMin, yMax, all_points);
/*for empty glyphs: all_points only include phantom points.
*just update metrics and then return */
@@ -146,10 +134,10 @@ struct Glyph
return true;
glyph_header->numberOfContours = header->numberOfContours;
- glyph_header->xMin = roundf (xMin);
- glyph_header->yMin = roundf (yMin);
- glyph_header->xMax = roundf (xMax);
- glyph_header->yMax = roundf (yMax);
+ glyph_header->xMin = xMin;
+ glyph_header->yMin = yMin;
+ glyph_header->xMax = xMax;
+ glyph_header->yMax = yMax;
dest_bytes = hb_bytes_t ((const char *)glyph_header, GlyphHeader::static_size);
return true;
@@ -211,24 +199,15 @@ struct Glyph
bool shift_points_hori = true,
bool use_my_metrics = true,
bool phantom_only = false,
- hb_array_t<int> coords = hb_array_t<int> (),
unsigned int depth = 0) const
{
if (unlikely (depth > HB_MAX_NESTING_LEVEL)) return false;
-
- if (!coords)
- coords = hb_array (font->coords, font->num_coords);
-
contour_point_vector_t stack_points;
bool inplace = type == SIMPLE && all_points.length == 0;
/* Load into all_points if it's empty, as an optimization. */
contour_point_vector_t &points = inplace ? all_points : stack_points;
switch (type) {
- case SIMPLE:
- if (unlikely (!SimpleGlyph (*header, bytes).get_contour_points (points, phantom_only)))
- return false;
- break;
case COMPOSITE:
{
/* pseudo component points for each component in composite glyph */
@@ -236,25 +215,20 @@ struct Glyph
if (unlikely (!points.resize (num_points))) return false;
break;
}
-#ifndef HB_NO_VAR_COMPOSITES
- case VAR_COMPOSITE:
- {
- for (auto &item : get_var_composite_iterator ())
- if (unlikely (!item.get_points (points))) return false;
- }
-#endif
- default:
+ case SIMPLE:
+ if (unlikely (!SimpleGlyph (*header, bytes).get_contour_points (points, phantom_only)))
+ return false;
break;
}
/* Init phantom points */
if (unlikely (!points.resize (points.length + PHANTOM_COUNT))) return false;
- hb_array_t<contour_point_t> phantoms = points.as_array ().sub_array (points.length - PHANTOM_COUNT, PHANTOM_COUNT);
+ hb_array_t<contour_point_t> phantoms = points.sub_array (points.length - PHANTOM_COUNT, PHANTOM_COUNT);
{
int lsb = 0;
int h_delta = glyf_accelerator.hmtx->get_leading_bearing_without_var_unscaled (gid, &lsb) ?
(int) header->xMin - lsb : 0;
- HB_UNUSED int tsb = 0;
+ int tsb = 0;
int v_orig = (int) header->yMax +
#ifndef HB_NO_VERTICAL
((void) glyf_accelerator.vmtx->get_leading_bearing_without_var_unscaled (gid, &tsb), tsb)
@@ -283,9 +257,7 @@ struct Glyph
}
#ifndef HB_NO_VAR
- glyf_accelerator.gvar->apply_deltas_to_points (gid,
- coords,
- points.as_array ());
+ glyf_accelerator.gvar->apply_deltas_to_points (gid, font, points.as_array ());
#endif
// mainly used by CompositeGlyph calculating new X/Y offset value so no need to extend it
@@ -311,24 +283,11 @@ struct Glyph
for (auto &item : get_composite_iterator ())
{
comp_points.reset ();
-
if (unlikely (!glyf_accelerator.glyph_for_gid (item.get_gid ())
- .get_points (font,
- glyf_accelerator,
- comp_points,
- deltas,
- shift_points_hori,
- use_my_metrics,
- phantom_only,
- coords,
- depth + 1)))
+ .get_points (font, glyf_accelerator, comp_points,
+ deltas, shift_points_hori, use_my_metrics, phantom_only, depth + 1)))
return false;
- /* Copy phantom points from component if USE_MY_METRICS flag set */
- if (use_my_metrics && item.is_use_my_metrics ())
- for (unsigned int i = 0; i < PHANTOM_COUNT; i++)
- phantoms[i] = comp_points[comp_points.length - PHANTOM_COUNT + i];
-
/* Apply component transformation & translation */
item.transform_points (comp_points);
@@ -349,63 +308,20 @@ struct Glyph
}
}
- all_points.extend (comp_points.as_array ().sub_array (0, comp_points.length - PHANTOM_COUNT));
-
- if (all_points.length > HB_GLYF_MAX_POINTS)
- return false;
-
- comp_index++;
- }
-
- all_points.extend (phantoms);
- } break;
-#ifndef HB_NO_VAR_COMPOSITES
- case VAR_COMPOSITE:
- {
- contour_point_vector_t comp_points;
- hb_array_t<contour_point_t> points_left = points.as_array ();
- for (auto &item : get_var_composite_iterator ())
- {
- hb_array_t<contour_point_t> record_points = points_left.sub_array (0, item.get_num_points ());
-
- comp_points.reset ();
-
- coord_setter_t coord_setter (coords);
- item.set_variations (coord_setter, record_points);
-
- if (unlikely (!glyf_accelerator.glyph_for_gid (item.get_gid ())
- .get_points (font,
- glyf_accelerator,
- comp_points,
- deltas,
- shift_points_hori,
- use_my_metrics,
- phantom_only,
- coord_setter.get_coords (),
- depth + 1)))
- return false;
-
- /* Apply component transformation */
- item.transform_points (record_points, comp_points);
-
/* Copy phantom points from component if USE_MY_METRICS flag set */
if (use_my_metrics && item.is_use_my_metrics ())
for (unsigned int i = 0; i < PHANTOM_COUNT; i++)
phantoms[i] = comp_points[comp_points.length - PHANTOM_COUNT + i];
- all_points.extend (comp_points.as_array ().sub_array (0, comp_points.length - PHANTOM_COUNT));
+ all_points.extend (comp_points.sub_array (0, comp_points.length - PHANTOM_COUNT));
- if (all_points.length > HB_GLYF_MAX_POINTS)
- return false;
-
- points_left += item.get_num_points ();
+ comp_index++;
}
+
all_points.extend (phantoms);
} break;
-#endif
default:
all_points.extend (phantoms);
- break;
}
if (depth == 0 && shift_points_hori) /* Apply at top level */
@@ -444,7 +360,6 @@ struct Glyph
int num_contours = header->numberOfContours;
if (unlikely (num_contours == 0)) type = EMPTY;
else if (num_contours > 0) type = SIMPLE;
- else if (num_contours == -2) type = VAR_COMPOSITE;
else type = COMPOSITE; /* negative numbers */
}
diff --git a/src/OT/glyf/SimpleGlyph.hh b/src/OT/glyf/SimpleGlyph.hh
index 2b4aa99d2..d45f4eb35 100644
--- a/src/OT/glyf/SimpleGlyph.hh
+++ b/src/OT/glyf/SimpleGlyph.hh
@@ -132,8 +132,8 @@ struct SimpleGlyph
if (unlikely (p + 1 > end)) return false;
unsigned int repeat_count = *p++;
unsigned stop = hb_min (i + repeat_count, count);
- for (; i < stop; i++)
- points_.arrayZ[i].flag = flag;
+ for (; i < stop;)
+ points_.arrayZ[i++].flag = flag;
}
}
return true;
@@ -223,34 +223,33 @@ struct SimpleGlyph
if (value > 0) flag |= same_flag;
else value = -value;
- coords.arrayZ[coords.length++] = (uint8_t) value;
+ coords.push ((uint8_t)value);
}
else
{
int16_t val = value;
- coords.arrayZ[coords.length++] = val >> 8;
- coords.arrayZ[coords.length++] = val & 0xff;
+ coords.push (val >> 8);
+ coords.push (val & 0xff);
}
}
static void encode_flag (uint8_t &flag,
uint8_t &repeat,
- uint8_t lastflag,
+ uint8_t &lastflag,
hb_vector_t<uint8_t> &flags /* OUT */)
{
if (flag == lastflag && repeat != 255)
{
- repeat++;
+ repeat = repeat + 1;
if (repeat == 1)
{
- /* We know there's room. */
- flags.arrayZ[flags.length++] = flag;
+ flags.push(flag);
}
else
{
unsigned len = flags.length;
- flags.arrayZ[len-2] = flag | FLAG_REPEAT;
- flags.arrayZ[len-1] = repeat;
+ flags[len-2] = flag | FLAG_REPEAT;
+ flags[len-1] = repeat;
}
}
else
@@ -258,6 +257,7 @@ struct SimpleGlyph
repeat = 0;
flags.push (flag);
}
+ lastflag = flag;
}
bool compile_bytes_with_deltas (const contour_point_vector_t &all_points,
@@ -269,6 +269,7 @@ struct SimpleGlyph
dest_bytes = hb_bytes_t ();
return true;
}
+ //convert absolute values to relative values
unsigned num_points = all_points.length - 4;
hb_vector_t<uint8_t> flags, x_coords, y_coords;
@@ -276,23 +277,23 @@ struct SimpleGlyph
if (unlikely (!x_coords.alloc (2*num_points))) return false;
if (unlikely (!y_coords.alloc (2*num_points))) return false;
- uint8_t lastflag = 255, repeat = 0;
- int prev_x = 0, prev_y = 0;
-
+ uint8_t lastflag = 0, repeat = 0;
+ int prev_x = 0.f, prev_y = 0.f;
+
for (unsigned i = 0; i < num_points; i++)
{
- uint8_t flag = all_points.arrayZ[i].flag;
+ uint8_t flag = all_points[i].flag;
flag &= FLAG_ON_CURVE + FLAG_OVERLAP_SIMPLE;
- int cur_x = roundf (all_points.arrayZ[i].x);
- int cur_y = roundf (all_points.arrayZ[i].y);
+ float cur_x = roundf (all_points[i].x);
+ float cur_y = roundf (all_points[i].y);
encode_coord (cur_x - prev_x, flag, FLAG_X_SHORT, FLAG_X_SAME, x_coords);
encode_coord (cur_y - prev_y, flag, FLAG_Y_SHORT, FLAG_Y_SAME, y_coords);
+ if (i == 0) lastflag = flag + 1; //make lastflag != flag for the first point
encode_flag (flag, repeat, lastflag, flags);
prev_x = cur_x;
prev_y = cur_y;
- lastflag = flag;
}
unsigned len_before_instrs = 2 * header.numberOfContours + 2;
@@ -302,29 +303,29 @@ struct SimpleGlyph
if (!no_hinting)
total_len += len_instrs;
- char *p = (char *) hb_malloc (total_len);
+ char *p = (char *) hb_calloc (total_len, sizeof (char));
if (unlikely (!p)) return false;
const char *src = bytes.arrayZ + GlyphHeader::static_size;
char *cur = p;
- hb_memcpy (p, src, len_before_instrs);
+ memcpy (p, src, len_before_instrs);
cur += len_before_instrs;
src += len_before_instrs;
if (!no_hinting)
{
- hb_memcpy (cur, src, len_instrs);
+ memcpy (cur, src, len_instrs);
cur += len_instrs;
}
- hb_memcpy (cur, flags.arrayZ, flags.length);
+ memcpy (cur, flags.arrayZ, flags.length);
cur += flags.length;
- hb_memcpy (cur, x_coords.arrayZ, x_coords.length);
+ memcpy (cur, x_coords.arrayZ, x_coords.length);
cur += x_coords.length;
- hb_memcpy (cur, y_coords.arrayZ, y_coords.length);
+ memcpy (cur, y_coords.arrayZ, y_coords.length);
dest_bytes = hb_bytes_t (p, total_len);
return true;
diff --git a/src/OT/glyf/SubsetGlyph.hh b/src/OT/glyf/SubsetGlyph.hh
index 1a0370c75..88fc93c43 100644
--- a/src/OT/glyf/SubsetGlyph.hh
+++ b/src/OT/glyf/SubsetGlyph.hh
@@ -21,18 +21,10 @@ struct SubsetGlyph
bool serialize (hb_serialize_context_t *c,
bool use_short_loca,
- const hb_subset_plan_t *plan,
- hb_font_t *font)
+ const hb_subset_plan_t *plan) const
{
TRACE_SERIALIZE (this);
- if (font)
- {
- const OT::glyf_accelerator_t &glyf = *font->face->table.glyf;
- if (!this->compile_bytes_with_deltas (plan, font, glyf))
- return_trace (false);
- }
-
hb_bytes_t dest_glyph = dest_start.copy (c);
dest_glyph = hb_bytes_t (&dest_glyph, dest_glyph.length + dest_end.copy (c).length);
unsigned int pad_length = use_short_loca ? padding () : 0;
diff --git a/src/OT/glyf/VarCompositeGlyph.hh b/src/OT/glyf/VarCompositeGlyph.hh
deleted file mode 100644
index 0f4c71c83..000000000
--- a/src/OT/glyf/VarCompositeGlyph.hh
+++ /dev/null
@@ -1,353 +0,0 @@
-#ifndef OT_GLYF_VARCOMPOSITEGLYPH_HH
-#define OT_GLYF_VARCOMPOSITEGLYPH_HH
-
-
-#include "../../hb-open-type.hh"
-#include "coord-setter.hh"
-
-
-namespace OT {
-namespace glyf_impl {
-
-
-struct VarCompositeGlyphRecord
-{
- protected:
- enum var_composite_glyph_flag_t
- {
- USE_MY_METRICS = 0x0001,
- AXIS_INDICES_ARE_SHORT = 0x0002,
- UNIFORM_SCALE = 0x0004,
- HAVE_TRANSLATE_X = 0x0008,
- HAVE_TRANSLATE_Y = 0x0010,
- HAVE_ROTATION = 0x0020,
- HAVE_SCALE_X = 0x0040,
- HAVE_SCALE_Y = 0x0080,
- HAVE_SKEW_X = 0x0100,
- HAVE_SKEW_Y = 0x0200,
- HAVE_TCENTER_X = 0x0400,
- HAVE_TCENTER_Y = 0x0800,
- GID_IS_24 = 0x1000,
- AXES_HAVE_VARIATION = 0x2000,
- };
-
- public:
-
- unsigned int get_size () const
- {
- unsigned int size = min_size;
-
- unsigned axis_width = (flags & AXIS_INDICES_ARE_SHORT) ? 4 : 3;
- size += numAxes * axis_width;
-
- // gid
- size += 2;
- if (flags & GID_IS_24) size += 1;
-
- if (flags & HAVE_TRANSLATE_X) size += 2;
- if (flags & HAVE_TRANSLATE_Y) size += 2;
- if (flags & HAVE_ROTATION) size += 2;
- if (flags & HAVE_SCALE_X) size += 2;
- if (flags & HAVE_SCALE_Y) size += 2;
- if (flags & HAVE_SKEW_X) size += 2;
- if (flags & HAVE_SKEW_Y) size += 2;
- if (flags & HAVE_TCENTER_X) size += 2;
- if (flags & HAVE_TCENTER_Y) size += 2;
-
- return size;
- }
-
- bool has_more () const { return true; }
-
- bool is_use_my_metrics () const { return flags & USE_MY_METRICS; }
-
- hb_codepoint_t get_gid () const
- {
- if (flags & GID_IS_24)
- return StructAfter<const HBGlyphID24> (numAxes);
- else
- return StructAfter<const HBGlyphID16> (numAxes);
- }
-
- unsigned get_numAxes () const
- {
- return numAxes;
- }
-
- unsigned get_num_points () const
- {
- unsigned num = 0;
- if (flags & AXES_HAVE_VARIATION) num += numAxes;
- if (flags & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y)) num++;
- if (flags & HAVE_ROTATION) num++;
- if (flags & (HAVE_SCALE_X | HAVE_SCALE_Y)) num++;
- if (flags & (HAVE_SKEW_X | HAVE_SKEW_Y)) num++;
- if (flags & (HAVE_TCENTER_X | HAVE_TCENTER_Y)) num++;
- return num;
- }
-
- void transform_points (hb_array_t<contour_point_t> record_points,
- contour_point_vector_t &points) const
- {
- float matrix[4];
- contour_point_t trans;
-
- get_transformation_from_points (record_points, matrix, trans);
-
- points.transform (matrix);
- points.translate (trans);
- }
-
- static inline void transform (float (&matrix)[4], contour_point_t &trans,
- float (other)[6])
- {
- // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L268
- float xx1 = other[0];
- float xy1 = other[1];
- float yx1 = other[2];
- float yy1 = other[3];
- float dx1 = other[4];
- float dy1 = other[5];
- float xx2 = matrix[0];
- float xy2 = matrix[1];
- float yx2 = matrix[2];
- float yy2 = matrix[3];
- float dx2 = trans.x;
- float dy2 = trans.y;
-
- matrix[0] = xx1*xx2 + xy1*yx2;
- matrix[1] = xx1*xy2 + xy1*yy2;
- matrix[2] = yx1*xx2 + yy1*yx2;
- matrix[3] = yx1*xy2 + yy1*yy2;
- trans.x = xx2*dx1 + yx2*dy1 + dx2;
- trans.y = xy2*dx1 + yy2*dy1 + dy2;
- }
-
- static void translate (float (&matrix)[4], contour_point_t &trans,
- float translateX, float translateY)
- {
- // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L213
- float other[6] = {1.f, 0.f, 0.f, 1.f, translateX, translateY};
- transform (matrix, trans, other);
- }
-
- static void scale (float (&matrix)[4], contour_point_t &trans,
- float scaleX, float scaleY)
- {
- // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L224
- float other[6] = {scaleX, 0.f, 0.f, scaleY, 0.f, 0.f};
- transform (matrix, trans, other);
- }
-
- static void rotate (float (&matrix)[4], contour_point_t &trans,
- float rotation)
- {
- // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L240
- rotation = rotation * float (M_PI);
- float c = cosf (rotation);
- float s = sinf (rotation);
- float other[6] = {c, s, -s, c, 0.f, 0.f};
- transform (matrix, trans, other);
- }
-
- static void skew (float (&matrix)[4], contour_point_t &trans,
- float skewX, float skewY)
- {
- // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L255
- skewX = skewX * float (M_PI);
- skewY = skewY * float (M_PI);
- float other[6] = {1.f, tanf (skewY), tanf (skewX), 1.f, 0.f, 0.f};
- transform (matrix, trans, other);
- }
-
- bool get_points (contour_point_vector_t &points) const
- {
- float translateX = 0.f;
- float translateY = 0.f;
- float rotation = 0.f;
- float scaleX = 1.f * (1 << 12);
- float scaleY = 1.f * (1 << 12);
- float skewX = 0.f;
- float skewY = 0.f;
- float tCenterX = 0.f;
- float tCenterY = 0.f;
-
- if (unlikely (!points.resize (points.length + get_num_points ()))) return false;
-
- unsigned axis_width = (flags & AXIS_INDICES_ARE_SHORT) ? 2 : 1;
- unsigned axes_size = numAxes * axis_width;
-
- const F2DOT14 *q = (const F2DOT14 *) (axes_size +
- (flags & GID_IS_24 ? 3 : 2) +
- &StructAfter<const HBUINT8> (numAxes));
-
- hb_array_t<contour_point_t> rec_points = points.as_array ().sub_array (points.length - get_num_points ());
-
- unsigned count = numAxes;
- if (flags & AXES_HAVE_VARIATION)
- {
- for (unsigned i = 0; i < count; i++)
- rec_points[i].x = *q++;
- rec_points += count;
- }
- else
- q += count;
-
- const HBUINT16 *p = (const HBUINT16 *) q;
-
- if (flags & HAVE_TRANSLATE_X) translateX = * (const FWORD *) p++;
- if (flags & HAVE_TRANSLATE_Y) translateY = * (const FWORD *) p++;
- if (flags & HAVE_ROTATION) rotation = * (const F2DOT14 *) p++;
- if (flags & HAVE_SCALE_X) scaleX = * (const F4DOT12 *) p++;
- if (flags & HAVE_SCALE_Y) scaleY = * (const F4DOT12 *) p++;
- if (flags & HAVE_SKEW_X) skewX = * (const F2DOT14 *) p++;
- if (flags & HAVE_SKEW_Y) skewY = * (const F2DOT14 *) p++;
- if (flags & HAVE_TCENTER_X) tCenterX = * (const FWORD *) p++;
- if (flags & HAVE_TCENTER_Y) tCenterY = * (const FWORD *) p++;
-
- if ((flags & UNIFORM_SCALE) && !(flags & HAVE_SCALE_Y))
- scaleY = scaleX;
-
- if (flags & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y))
- {
- rec_points[0].x = translateX;
- rec_points[0].y = translateY;
- rec_points++;
- }
- if (flags & HAVE_ROTATION)
- {
- rec_points[0].x = rotation;
- rec_points++;
- }
- if (flags & (HAVE_SCALE_X | HAVE_SCALE_Y))
- {
- rec_points[0].x = scaleX;
- rec_points[0].y = scaleY;
- rec_points++;
- }
- if (flags & (HAVE_SKEW_X | HAVE_SKEW_Y))
- {
- rec_points[0].x = skewX;
- rec_points[0].y = skewY;
- rec_points++;
- }
- if (flags & (HAVE_TCENTER_X | HAVE_TCENTER_Y))
- {
- rec_points[0].x = tCenterX;
- rec_points[0].y = tCenterY;
- rec_points++;
- }
- assert (!rec_points);
-
- return true;
- }
-
- void get_transformation_from_points (hb_array_t<contour_point_t> rec_points,
- float (&matrix)[4], contour_point_t &trans) const
- {
- if (flags & AXES_HAVE_VARIATION)
- rec_points += numAxes;
-
- matrix[0] = matrix[3] = 1.f;
- matrix[1] = matrix[2] = 0.f;
- trans.init (0.f, 0.f);
-
- float translateX = 0.f;
- float translateY = 0.f;
- float rotation = 0.f;
- float scaleX = 1.f;
- float scaleY = 1.f;
- float skewX = 0.f;
- float skewY = 0.f;
- float tCenterX = 0.f;
- float tCenterY = 0.f;
-
- if (flags & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y))
- {
- translateX = rec_points[0].x;
- translateY = rec_points[0].y;
- rec_points++;
- }
- if (flags & HAVE_ROTATION)
- {
- rotation = rec_points[0].x / (1 << 14);
- rec_points++;
- }
- if (flags & (HAVE_SCALE_X | HAVE_SCALE_Y))
- {
- scaleX = rec_points[0].x / (1 << 12);
- scaleY = rec_points[0].y / (1 << 12);
- rec_points++;
- }
- if (flags & (HAVE_SKEW_X | HAVE_SKEW_Y))
- {
- skewX = rec_points[0].x / (1 << 14);
- skewY = rec_points[0].y / (1 << 14);
- rec_points++;
- }
- if (flags & (HAVE_TCENTER_X | HAVE_TCENTER_Y))
- {
- tCenterX = rec_points[0].x;
- tCenterY = rec_points[0].y;
- rec_points++;
- }
- assert (!rec_points);
-
- translate (matrix, trans, translateX + tCenterX, translateY + tCenterY);
- rotate (matrix, trans, rotation);
- scale (matrix, trans, scaleX, scaleY);
- skew (matrix, trans, -skewX, skewY);
- translate (matrix, trans, -tCenterX, -tCenterY);
- }
-
- void set_variations (coord_setter_t &setter,
- hb_array_t<contour_point_t> rec_points) const
- {
- bool have_variations = flags & AXES_HAVE_VARIATION;
- unsigned axis_width = (flags & AXIS_INDICES_ARE_SHORT) ? 2 : 1;
-
- const HBUINT8 *p = (const HBUINT8 *) (((HBUINT8 *) &numAxes) + numAxes.static_size + (flags & GID_IS_24 ? 3 : 2));
- const HBUINT16 *q = (const HBUINT16 *) (((HBUINT8 *) &numAxes) + numAxes.static_size + (flags & GID_IS_24 ? 3 : 2));
-
- const F2DOT14 *a = (const F2DOT14 *) ((HBUINT8 *) (axis_width == 1 ? (p + numAxes) : (HBUINT8 *) (q + numAxes)));
-
- unsigned count = numAxes;
- for (unsigned i = 0; i < count; i++)
- {
- unsigned axis_index = axis_width == 1 ? (unsigned) *p++ : (unsigned) *q++;
-
- signed v = have_variations ? rec_points[i].x : *a++;
-
- v += setter[axis_index];
- v = hb_clamp (v, -(1<<14), (1<<14));
- setter[axis_index] = v;
- }
- }
-
- protected:
- HBUINT16 flags;
- HBUINT8 numAxes;
- public:
- DEFINE_SIZE_MIN (3);
-};
-
-using var_composite_iter_t = composite_iter_tmpl<VarCompositeGlyphRecord>;
-
-struct VarCompositeGlyph
-{
- const GlyphHeader &header;
- hb_bytes_t bytes;
- VarCompositeGlyph (const GlyphHeader &header_, hb_bytes_t bytes_) :
- header (header_), bytes (bytes_) {}
-
- var_composite_iter_t iter () const
- { return var_composite_iter_t (bytes, &StructAfter<VarCompositeGlyphRecord, GlyphHeader> (header)); }
-
-};
-
-
-} /* namespace glyf_impl */
-} /* namespace OT */
-
-
-#endif /* OT_GLYF_VARCOMPOSITEGLYPH_HH */
diff --git a/src/OT/glyf/composite-iter.hh b/src/OT/glyf/composite-iter.hh
deleted file mode 100644
index d05701f3d..000000000
--- a/src/OT/glyf/composite-iter.hh
+++ /dev/null
@@ -1,68 +0,0 @@
-#ifndef OT_GLYF_COMPOSITE_ITER_HH
-#define OT_GLYF_COMPOSITE_ITER_HH
-
-
-#include "../../hb.hh"
-
-
-namespace OT {
-namespace glyf_impl {
-
-
-template <typename CompositeGlyphRecord>
-struct composite_iter_tmpl : hb_iter_with_fallback_t<composite_iter_tmpl<CompositeGlyphRecord>,
- const CompositeGlyphRecord &>
-{
- typedef const CompositeGlyphRecord *__item_t__;
- composite_iter_tmpl (hb_bytes_t glyph_, __item_t__ current_) :
- glyph (glyph_), current (nullptr), current_size (0)
- {
- set_current (current_);
- }
-
- composite_iter_tmpl () : glyph (hb_bytes_t ()), current (nullptr), current_size (0) {}
-
- const CompositeGlyphRecord & __item__ () const { return *current; }
- bool __more__ () const { return current; }
- void __next__ ()
- {
- if (!current->has_more ()) { current = nullptr; return; }
-
- set_current (&StructAtOffset<CompositeGlyphRecord> (current, current_size));
- }
- composite_iter_tmpl __end__ () const { return composite_iter_tmpl (); }
- bool operator != (const composite_iter_tmpl& o) const
- { return current != o.current; }
-
-
- void set_current (__item_t__ current_)
- {
- if (!glyph.check_range (current_, CompositeGlyphRecord::min_size))
- {
- current = nullptr;
- current_size = 0;
- return;
- }
- unsigned size = current_->get_size ();
- if (!glyph.check_range (current_, size))
- {
- current = nullptr;
- current_size = 0;
- return;
- }
-
- current = current_;
- current_size = size;
- }
-
- private:
- hb_bytes_t glyph;
- __item_t__ current;
- unsigned current_size;
-};
-
-
-} /* namespace glyf_impl */
-} /* namespace OT */
-
-#endif /* OT_GLYF_COMPOSITE_ITER_HH */
diff --git a/src/OT/glyf/coord-setter.hh b/src/OT/glyf/coord-setter.hh
deleted file mode 100644
index df64ed5af..000000000
--- a/src/OT/glyf/coord-setter.hh
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifndef OT_GLYF_COORD_SETTER_HH
-#define OT_GLYF_COORD_SETTER_HH
-
-
-#include "../../hb.hh"
-
-
-namespace OT {
-namespace glyf_impl {
-
-
-struct coord_setter_t
-{
- coord_setter_t (hb_array_t<int> coords) :
- coords (coords) {}
-
- int& operator [] (unsigned idx)
- {
- if (coords.length < idx + 1)
- coords.resize (idx + 1);
- return coords[idx];
- }
-
- hb_array_t<int> get_coords ()
- { return coords.as_array (); }
-
- hb_vector_t<int> coords;
-};
-
-
-} /* namespace glyf_impl */
-} /* namespace OT */
-
-#endif /* OT_GLYF_COORD_SETTER_HH */
diff --git a/src/OT/glyf/glyf.hh b/src/OT/glyf/glyf.hh
index e6e985c38..5fb32f67f 100644
--- a/src/OT/glyf/glyf.hh
+++ b/src/OT/glyf/glyf.hh
@@ -42,15 +42,11 @@ struct glyf
bool serialize (hb_serialize_context_t *c,
Iterator it,
bool use_short_loca,
- const hb_subset_plan_t *plan,
- hb_font_t *font)
+ const hb_subset_plan_t *plan)
{
TRACE_SERIALIZE (this);
-
unsigned init_len = c->length ();
- for (auto &_ : it)
- if (unlikely (!_.serialize (c, use_short_loca, plan, font)))
- return false;
+ for (const auto &_ : it) _.serialize (c, use_short_loca, plan);
/* As a special case when all glyph in the font are empty, add a zero byte
* to the table, so that OTS doesn’t reject it, and to make the table work
@@ -78,11 +74,10 @@ struct glyf
hb_vector_t<glyf_impl::SubsetGlyph> glyphs;
_populate_subset_glyphs (c->plan, glyphs);
- hb_font_t *font = nullptr;
if (!c->plan->pinned_at_default)
{
- font = _create_font_for_instancing (c->plan);
- if (unlikely (!font)) return false;
+ if (!_compile_subset_glyphs_with_deltas (c->plan, &glyphs))
+ return_trace (false);
}
auto padded_offsets =
@@ -90,14 +85,11 @@ struct glyf
| hb_map (&glyf_impl::SubsetGlyph::padded_size)
;
- bool use_short_loca = false;
- if (likely (!c->plan->force_long_loca))
- {
- unsigned max_offset = + padded_offsets | hb_reduce (hb_add, 0);
- use_short_loca = max_offset < 0x1FFFF;
- }
+ unsigned max_offset = + padded_offsets | hb_reduce (hb_add, 0);
+ bool use_short_loca = max_offset < 0x1FFFF;
- glyf_prime->serialize (c->serializer, glyphs.writer (), use_short_loca, c->plan, font);
+
+ glyf_prime->serialize (c->serializer, hb_iter (glyphs), use_short_loca, c->plan);
if (!use_short_loca) {
padded_offsets =
+ hb_iter (glyphs)
@@ -105,12 +97,9 @@ struct glyf
;
}
- if (font)
- {
- _free_compiled_subset_glyphs (&glyphs);
- hb_font_destroy (font);
- }
+ if (!c->plan->pinned_at_default)
+ _free_compiled_subset_glyphs (&glyphs);
if (unlikely (c->serializer->in_error ())) return_trace (false);
return_trace (c->serializer->check_success (glyf_impl::_add_loca_and_head (c->plan,
padded_offsets,
@@ -121,8 +110,9 @@ struct glyf
_populate_subset_glyphs (const hb_subset_plan_t *plan,
hb_vector_t<glyf_impl::SubsetGlyph> &glyphs /* OUT */) const;
- hb_font_t *
- _create_font_for_instancing (const hb_subset_plan_t *plan) const;
+ bool
+ _compile_subset_glyphs_with_deltas (const hb_subset_plan_t *plan,
+ hb_vector_t<glyf_impl::SubsetGlyph> *glyphs /* OUT */) const;
void _free_compiled_subset_glyphs (hb_vector_t<glyf_impl::SubsetGlyph> *glyphs) const
{
@@ -404,11 +394,7 @@ glyf::_populate_subset_glyphs (const hb_subset_plan_t *plan,
plan->pinned_at_default)
subset_glyph.source_glyph = glyf_impl::Glyph ();
else
- {
- /* If plan has an accelerator, the preprocessing step already trimmed glyphs.
- * Don't trim them again! */
- subset_glyph.source_glyph = glyf.glyph_for_gid (subset_glyph.old_gid, !plan->accelerator);
- }
+ subset_glyph.source_glyph = glyf.glyph_for_gid (subset_glyph.old_gid, true);
if (plan->flags & HB_SUBSET_FLAGS_NO_HINTING)
subset_glyph.drop_hints_bytes ();
@@ -417,15 +403,17 @@ glyf::_populate_subset_glyphs (const hb_subset_plan_t *plan,
}
}
-inline hb_font_t *
-glyf::_create_font_for_instancing (const hb_subset_plan_t *plan) const
+inline bool
+glyf::_compile_subset_glyphs_with_deltas (const hb_subset_plan_t *plan,
+ hb_vector_t<glyf_impl::SubsetGlyph> *glyphs /* OUT */) const
{
+ OT::glyf_accelerator_t glyf (plan->source);
hb_font_t *font = hb_font_create (plan->source);
- if (unlikely (font == hb_font_get_empty ())) return nullptr;
+ if (unlikely (!font)) return false;
hb_vector_t<hb_variation_t> vars;
if (unlikely (!vars.alloc (plan->user_axes_location->get_population ())))
- return nullptr;
+ return false;
for (auto _ : *plan->user_axes_location)
{
@@ -435,10 +423,18 @@ glyf::_create_font_for_instancing (const hb_subset_plan_t *plan) const
vars.push (var);
}
-#ifndef HB_NO_VAR
hb_font_set_variations (font, vars.arrayZ, plan->user_axes_location->get_population ());
-#endif
- return font;
+ for (auto& subset_glyph : *glyphs)
+ {
+ if (!const_cast<glyf_impl::SubsetGlyph &> (subset_glyph).compile_bytes_with_deltas (plan, font, glyf))
+ {
+ hb_font_destroy (font);
+ return false;
+ }
+ }
+
+ hb_font_destroy (font);
+ return true;
}
diff --git a/src/check-symbols.py b/src/check-symbols.py
index d0b8bd3c8..11ca28dc7 100755
--- a/src/check-symbols.py
+++ b/src/check-symbols.py
@@ -31,7 +31,7 @@ for soname in ['harfbuzz', 'harfbuzz-subset', 'harfbuzz-icu', 'harfbuzz-gobject'
symprefix = '_' if suffix == 'dylib' else ''
EXPORTED_SYMBOLS = [s.split ()[2]
- for s in re.findall (r'^.+ [BCDGIRSTu] .+$', subprocess.check_output (nm.split() + [so]).decode ('utf-8'), re.MULTILINE)
+ for s in re.findall (r'^.+ [BCDGIRST] .+$', subprocess.check_output (nm.split() + [so]).decode ('utf-8'), re.MULTILINE)
if not re.match (r'.* %s(%s)\b' % (symprefix, IGNORED_SYMBOLS), s)]
# run again c++filt also if is available
diff --git a/src/gen-def.py b/src/gen-def.py
index 9b4efd4f3..e751f524e 100755
--- a/src/gen-def.py
+++ b/src/gen-def.py
@@ -20,7 +20,9 @@ if '--experimental-api' not in sys.argv:
# Move these to harfbuzz-sections.txt when got stable
experimental_symbols = \
"""hb_subset_repack_or_fail
-hb_subset_input_override_name_table
+hb_subset_input_pin_axis_location
+hb_subset_input_pin_axis_to_default
+hb_subset_preprocess
""".splitlines ()
symbols = [x for x in symbols if x not in experimental_symbols]
symbols = "\n".join (symbols)
diff --git a/src/gen-indic-table.py b/src/gen-indic-table.py
index 4ef970265..0ff3ef4ac 100755
--- a/src/gen-indic-table.py
+++ b/src/gen-indic-table.py
@@ -95,7 +95,6 @@ categories = {
'PLACEHOLDER',
'DOTTEDCIRCLE',
'RS',
- 'MPst',
'Repha',
'Ra',
'CM',
@@ -169,6 +168,8 @@ category_map = {
'Vowel' : 'V',
'Vowel_Dependent' : 'M',
'Vowel_Independent' : 'V',
+ 'Dotted_Circle' : 'DOTTEDCIRCLE', # Ours, not Unicode's
+ 'Ra' : 'Ra', # Ours, not Unicode's
}
position_map = {
'Not_Applicable' : 'END',
@@ -239,9 +240,6 @@ category_overrides = {
0x0953: 'SM',
0x0954: 'SM',
- # U+0A40 GURMUKHI VOWEL SIGN II may be preceded by U+0A02 GURMUKHI SIGN BINDI.
- 0x0A40: 'MPst',
-
# The following act like consonants.
0x0A72: 'C',
0x0A73: 'C',
@@ -442,7 +440,7 @@ for k,new_cat in category_overrides.items():
indic_data[k] = (new_cat, pos, unicode_data[2][k])
# We only expect position for certain types
-positioned_categories = ('CM', 'SM', 'RS', 'H', 'M', 'MPst')
+positioned_categories = ('CM', 'SM', 'RS', 'H', 'M')
for k, (cat, pos, block) in indic_data.items():
if cat not in positioned_categories:
pos = 'END'
@@ -452,12 +450,11 @@ for k, (cat, pos, block) in indic_data.items():
# Keep in sync with CONSONANT_FLAGS in the shaper
consonant_categories = ('C', 'CS', 'Ra','CM', 'V', 'PLACEHOLDER', 'DOTTEDCIRCLE')
-matra_categories = ('M', 'MPst')
smvd_categories = ('SM', 'VD', 'A', 'Symbol')
for k, (cat, pos, block) in indic_data.items():
if cat in consonant_categories:
pos = 'BASE_C'
- elif cat in matra_categories:
+ elif cat == 'M':
if block.startswith('Khmer') or block.startswith('Myanmar'):
cat = position_to_category(pos)
else:
@@ -637,7 +634,7 @@ for u in uu:
end = (end-1)//8*8 + 7
if start != last + 1:
- if start - last <= 1+16*2:
+ if start - last <= 1+16*3:
print_block (None, last+1, start-1, indic_data)
else:
if last >= 0:
@@ -694,6 +691,6 @@ print ('#endif')
print ()
print ("/* == End of generated table == */")
-# Maintain at least 50% occupancy in the table */
-if occupancy < 50:
+# Maintain at least 30% occupancy in the table */
+if occupancy < 30:
raise Exception ("Table too sparse, please investigate: ", occupancy)
diff --git a/src/gen-ucd-table.py b/src/gen-ucd-table.py
index d85ae4faa..f4c099f86 100755
--- a/src/gen-ucd-table.py
+++ b/src/gen-ucd-table.py
@@ -25,27 +25,13 @@ hb_common_h = 'hb-common.h' if len (sys.argv) < 3 else sys.argv[2]
logging.info('Preparing data tables...')
-
-# This is how the data is encoded:
-#
-# General_Category (gc), Canonical_Combining_Class (ccc),
-# and Script (sc) are encoded as integers.
-#
-# Mirroring character (bmg) is encoded as difference from
-# the original character.
-#
-# Composition & Decomposition (dm) are encoded elaborately,
-# as discussed below.
-
gc = [u['gc'] for u in ucd]
ccc = [int(u['ccc']) for u in ucd]
bmg = [int(v, 16) - int(u) if v else 0 for u,v in enumerate(u['bmg'] for u in ucd)]
-sc = [u['sc'] for u in ucd]
-
+#gc_ccc_non0 = set((cat,klass) for cat,klass in zip(gc,ccc) if klass)
+#gc_bmg_non0 = set((cat,mirr) for cat,mirr in zip(gc, bmg) if mirr)
-# Prepare Compose / Decompose data
-#
-# This code is very dense. See hb_ucd_compose() / hb_ucd_decompose() for the logic.
+sc = [u['sc'] for u in ucd]
dm = {i:tuple(int(v, 16) for v in u['dm'].split()) for i,u in enumerate(ucd)
if u['dm'] != '#' and u['dt'] == 'can' and not (0xAC00 <= i < 0xAC00+11172)}
@@ -77,9 +63,6 @@ dm_order = {None: 0}
dm_order.update(dm1_order)
dm_order.update(dm2_order)
-
-# Prepare General_Category / Script mapping arrays
-
gc_order = dict()
for i,v in enumerate(('Cc', 'Cf', 'Cn', 'Co', 'Cs', 'Ll', 'Lm', 'Lo', 'Lt', 'Lu',
'Mc', 'Me', 'Mn', 'Nd', 'Nl', 'No', 'Pc', 'Pd', 'Pe', 'Pf',
@@ -100,18 +83,10 @@ for line in open(hb_common_h):
sc_order[i] = tag
sc_array.append(name)
+DEFAULT = 3
+COMPACT = 5
+SLOPPY = 9
-# Write out main data
-
-DEFAULT = 'DEFAULT'
-COMPACT = 'COMPACT'
-SLOPPY = 'SLOPPY'
-
-compression_level = {
- DEFAULT: 5,
- COMPACT: 9,
- SLOPPY: 9,
-}
logging.info('Generating output...')
print("/* == Start of generated table == */")
@@ -129,9 +104,6 @@ print()
print('#include "hb.hh"')
print()
-
-# Write mapping data
-
code = packTab.Code('_hb_ucd')
sc_array, _ = code.addArray('hb_script_t', 'sc_map', sc_array)
dm1_p0_array, _ = code.addArray('uint16_t', 'dm1_p0_map', dm1_p0_array)
@@ -148,24 +120,18 @@ datasets = [
('dm', dm, None, dm_order),
]
-
-# Write main data
-
-for step in (DEFAULT, COMPACT, SLOPPY):
- compression = compression_level[step]
+for compression in (DEFAULT, COMPACT, SLOPPY):
logging.info(' Compression=%d:' % compression)
print()
- if step == DEFAULT:
+ if compression == DEFAULT:
print('#ifndef HB_OPTIMIZE_SIZE')
- elif step == COMPACT:
+ elif compression == COMPACT:
print('#elif !defined(HB_NO_UCD_UNASSIGNED)')
- elif step == SLOPPY:
- print('#else')
else:
- assert False
+ print('#else')
print()
- if step == SLOPPY:
+ if compression == SLOPPY:
for i in range(len(gc)):
if (i % 128) and gc[i] == 'Cn':
gc[i] = gc[i - 1]
@@ -191,7 +157,6 @@ for step in (DEFAULT, COMPACT, SLOPPY):
print()
-
print('#endif')
print()
diff --git a/src/gen-use-table.py b/src/gen-use-table.py
index e8b76dfb5..0600a3388 100755
--- a/src/gen-use-table.py
+++ b/src/gen-use-table.py
@@ -1,9 +1,6 @@
#!/usr/bin/env python3
# flake8: noqa: F821
-import logging
-logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.INFO)
-
"""usage: ./gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt ArabicShaping.txt DerivedCoreProperties.txt UnicodeData.txt Blocks.txt Scripts.txt IndicSyllabicCategory-Additional.txt IndicPositionalCategory-Additional.txt
Input files:
@@ -468,29 +465,10 @@ print ("")
import packTab
data = {u:v[0] for u,v in use_data.items()}
-
-DEFAULT = 5
-COMPACT = 9
-for compression in (DEFAULT, COMPACT):
-
- logging.info(' Compression=%d:' % compression)
- print()
- if compression == DEFAULT:
- print('#ifndef HB_OPTIMIZE_SIZE')
- elif compression == COMPACT:
- print('#else')
- else:
- assert False
- print()
-
- code = packTab.Code('hb_use')
- sol = packTab.pack_table(data, compression=compression, default='O')
- logging.info(' FullCost=%d' % (sol.fullCost))
- sol.genCode(code, f'get_category')
- code.print_c(linkage='static inline')
- print ()
-
-print('#endif')
+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()):
diff --git a/src/graph/classdef-graph.hh b/src/graph/classdef-graph.hh
index c2e24a706..0bda76ac2 100644
--- a/src/graph/classdef-graph.hh
+++ b/src/graph/classdef-graph.hh
@@ -112,7 +112,7 @@ struct ClassDef : public OT::ClassDef
{
case 1: return ((ClassDefFormat1*)this)->sanitize (vertex);
case 2: return ((ClassDefFormat2*)this)->sanitize (vertex);
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
// Not currently supported
case 3:
case 4:
diff --git a/src/graph/coverage-graph.hh b/src/graph/coverage-graph.hh
index 49d093631..3c1022f09 100644
--- a/src/graph/coverage-graph.hh
+++ b/src/graph/coverage-graph.hh
@@ -136,7 +136,7 @@ struct Coverage : public OT::Layout::Common::Coverage
{
case 1: return ((CoverageFormat1*)this)->sanitize (vertex);
case 2: return ((CoverageFormat2*)this)->sanitize (vertex);
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
// Not currently supported
case 3:
case 4:
diff --git a/src/graph/graph.hh b/src/graph/graph.hh
index dc5b6a36f..79c7e690a 100644
--- a/src/graph/graph.hh
+++ b/src/graph/graph.hh
@@ -49,50 +49,6 @@ struct graph_t
unsigned end = 0;
unsigned priority = 0;
-
- bool link_positions_valid (unsigned num_objects, bool removed_nil)
- {
- hb_set_t assigned_bytes;
- for (const auto& l : obj.real_links)
- {
- if (l.objidx >= num_objects
- || (removed_nil && !l.objidx))
- {
- DEBUG_MSG (SUBSET_REPACK, nullptr,
- "Invalid graph. Invalid object index.");
- return false;
- }
-
- unsigned start = l.position;
- unsigned end = start + l.width - 1;
-
- if (unlikely (l.width < 2 || l.width > 4))
- {
- DEBUG_MSG (SUBSET_REPACK, nullptr,
- "Invalid graph. Invalid link width.");
- return false;
- }
-
- if (unlikely (end >= table_size ()))
- {
- DEBUG_MSG (SUBSET_REPACK, nullptr,
- "Invalid graph. Link position is out of bounds.");
- return false;
- }
-
- if (unlikely (assigned_bytes.intersects (start, end)))
- {
- DEBUG_MSG (SUBSET_REPACK, nullptr,
- "Invalid graph. Found offsets whose positions overlap.");
- return false;
- }
-
- assigned_bytes.add_range (start, end);
- }
-
- return !assigned_bytes.in_error ();
- }
-
void normalize ()
{
obj.real_links.qsort ();
@@ -176,7 +132,7 @@ struct graph_t
for (unsigned i = 0; i < parents.length; i++)
{
if (parents[i] != parent_index) continue;
- parents.remove_unordered (i);
+ parents.remove (i);
break;
}
}
@@ -192,7 +148,7 @@ struct graph_t
if ((obj.head + link.position) != offset)
continue;
- obj.real_links.remove_unordered (i);
+ obj.real_links.remove (i);
return;
}
}
@@ -330,6 +286,8 @@ struct graph_t
vertices_scratch_.alloc (objects.length);
for (unsigned i = 0; i < objects.length; i++)
{
+ // TODO(grieger): check all links point to valid objects.
+
// If this graph came from a serialization buffer object 0 is the
// nil object. We don't need it for our purposes here so drop it.
if (i == 0 && !objects[i])
@@ -341,9 +299,6 @@ struct graph_t
vertex_t* v = vertices_.push ();
if (check_success (!vertices_.in_error ()))
v->obj = *objects[i];
-
- check_success (v->link_positions_valid (objects.length, removed_nil));
-
if (!removed_nil) continue;
// Fix indices to account for removed nil object.
for (auto& l : v->obj.all_links_writer ()) {
@@ -463,13 +418,6 @@ struct graph_t
hb_swap (sorted_graph[new_id], vertices_[next_id]);
const vertex_t& next = sorted_graph[new_id];
- if (unlikely (!check_success(new_id >= 0))) {
- // We are out of ids. Which means we've visited a node more than once.
- // This graph contains a cycle which is not allowed.
- DEBUG_MSG (SUBSET_REPACK, nullptr, "Invalid graph. Contains cycle.");
- return;
- }
-
id_map[next_id] = new_id--;
for (const auto& link : next.obj.all_links ()) {
@@ -632,7 +580,7 @@ struct graph_t
while (roots)
{
- uint32_t next = HB_SET_VALUE_INVALID;
+ unsigned next = HB_SET_VALUE_INVALID;
if (unlikely (!check_success (!roots.in_error ()))) break;
if (!roots.next (&next)) break;
@@ -713,8 +661,8 @@ struct graph_t
auto new_subgraph =
+ subgraph.keys ()
- | hb_map([&] (uint32_t node_idx) {
- const uint32_t *v;
+ | hb_map([&] (unsigned node_idx) {
+ const unsigned *v;
if (index_map.has (node_idx, &v)) return *v;
return node_idx;
})
@@ -724,10 +672,10 @@ struct graph_t
remap_obj_indices (index_map, parents.iter (), true);
// Update roots set with new indices as needed.
- uint32_t next = HB_SET_VALUE_INVALID;
+ unsigned next = HB_SET_VALUE_INVALID;
while (roots.next (&next))
{
- const uint32_t *v;
+ const unsigned *v;
if (index_map.has (next, &v))
{
roots.del (next);
@@ -742,7 +690,7 @@ struct graph_t
{
for (const auto& link : vertices_[node_idx].obj.all_links ())
{
- const uint32_t *v;
+ const unsigned *v;
if (subgraph.has (link.objidx, &v))
{
subgraph.set (link.objidx, *v + 1);
@@ -993,72 +941,6 @@ struct graph_t
return made_change;
}
- bool is_fully_connected ()
- {
- update_parents();
-
- if (root().parents)
- // Root cannot have parents.
- return false;
-
- for (unsigned i = 0; i < root_idx (); i++)
- {
- if (!vertices_[i].parents)
- return false;
- }
- return true;
- }
-
-#if 0
- /*
- * Saves the current graph to a packed binary format which the repacker fuzzer takes
- * as a seed.
- */
- void save_fuzzer_seed (hb_tag_t tag) const
- {
- FILE* f = fopen ("./repacker_fuzzer_seed", "w");
- fwrite ((void*) &tag, sizeof (tag), 1, f);
-
- uint16_t num_objects = vertices_.length;
- fwrite ((void*) &num_objects, sizeof (num_objects), 1, f);
-
- for (const auto& v : vertices_)
- {
- uint16_t blob_size = v.table_size ();
- fwrite ((void*) &blob_size, sizeof (blob_size), 1, f);
- fwrite ((const void*) v.obj.head, blob_size, 1, f);
- }
-
- uint16_t link_count = 0;
- for (const auto& v : vertices_)
- link_count += v.obj.real_links.length;
-
- fwrite ((void*) &link_count, sizeof (link_count), 1, f);
-
- typedef struct
- {
- uint16_t parent;
- uint16_t child;
- uint16_t position;
- uint8_t width;
- } link_t;
-
- for (unsigned i = 0; i < vertices_.length; i++)
- {
- for (const auto& l : vertices_[i].obj.real_links)
- {
- link_t link {
- (uint16_t) i, (uint16_t) l.objidx,
- (uint16_t) l.position, (uint8_t) l.width
- };
- fwrite ((void*) &link, sizeof (link), 1, f);
- }
- }
-
- fclose (f);
- }
-#endif
-
void print_orphaned_nodes ()
{
if (!DEBUG_ENABLED(SUBSET_REPACK)) return;
@@ -1067,10 +949,6 @@ struct graph_t
parents_invalid = true;
update_parents();
- if (root().parents) {
- DEBUG_MSG (SUBSET_REPACK, nullptr, "Root node has incoming edges.");
- }
-
for (unsigned i = 0; i < root_idx (); i++)
{
const auto& v = vertices_[i];
@@ -1187,11 +1065,6 @@ struct graph_t
}
}
- for (unsigned i = 0; i < vertices_.length; i++)
- // parents arrays must be accurate or downstream operations like cycle detection
- // and sorting won't work correctly.
- check_success (!vertices_[i].parents.in_error ());
-
parents_invalid = false;
}
@@ -1310,7 +1183,7 @@ struct graph_t
{
for (auto& link : vertices_[i].obj.all_links_writer ())
{
- const uint32_t *v;
+ const unsigned *v;
if (!id_map.has (link.objidx, &v)) continue;
if (only_wide && !(link.width == 4 && !link.is_signed)) continue;
diff --git a/src/graph/gsubgpos-graph.hh b/src/graph/gsubgpos-graph.hh
index c17063840..e8d5bef9a 100644
--- a/src/graph/gsubgpos-graph.hh
+++ b/src/graph/gsubgpos-graph.hh
@@ -201,7 +201,7 @@ struct Lookup : public OT::Lookup
+ new_subtable_count * OT::Offset16::static_size;
char* buffer = (char*) hb_calloc (1, new_size);
c.add_buffer (buffer);
- hb_memcpy (buffer, v.obj.head, v.table_size());
+ memcpy (buffer, v.obj.head, v.table_size());
v.obj.head = buffer;
v.obj.tail = buffer + new_size;
@@ -355,7 +355,7 @@ struct GSTAR : public OT::GSUBGPOS
{
switch (u.version.major) {
case 1: return u.version1.get_lookup_list_offset ();
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 2: return u.version2.get_lookup_list_offset ();
#endif
default: return 0;
@@ -374,7 +374,7 @@ struct GSTAR : public OT::GSUBGPOS
{
switch (u.version.major) {
case 1: find_lookups<SmallTypes> (graph, lookups); break;
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 2: find_lookups<MediumTypes> (graph, lookups); break;
#endif
}
diff --git a/src/graph/markbasepos-graph.hh b/src/graph/markbasepos-graph.hh
index 84ef5f71b..e42a6042c 100644
--- a/src/graph/markbasepos-graph.hh
+++ b/src/graph/markbasepos-graph.hh
@@ -112,7 +112,7 @@ struct AnchorMatrix : public OT::Layout::GPOS_impl::AnchorMatrix
auto& child = c.graph.vertices_[child_idx];
child.remove_parent (this_index);
- o.real_links.remove_unordered (i);
+ o.real_links.remove (i);
num_links--;
i--;
}
@@ -372,7 +372,7 @@ struct MarkBasePosFormat1 : public OT::Layout::GPOS_impl::MarkBasePosFormat1_2<S
if (!mark_coverage) return false;
hb_set_t marks = sc.marks_for (0, count);
auto new_coverage =
- + hb_enumerate (mark_coverage.table->iter ())
+ + hb_zip (hb_range (), mark_coverage.table->iter ())
| hb_filter (marks, hb_first)
| hb_map_retains_sorting (hb_second)
;
@@ -431,7 +431,7 @@ struct MarkBasePosFormat1 : public OT::Layout::GPOS_impl::MarkBasePosFormat1_2<S
if (!mark_coverage) return false;
hb_set_t marks = sc.marks_for (start, end);
auto new_coverage =
- + hb_enumerate (mark_coverage.table->iter ())
+ + hb_zip (hb_range (), mark_coverage.table->iter ())
| hb_filter (marks, hb_first)
| hb_map_retains_sorting (hb_second)
;
@@ -477,7 +477,7 @@ struct MarkBasePos : public OT::Layout::GPOS_impl::MarkBasePos
switch (u.format) {
case 1:
return ((MarkBasePosFormat1*)(&u.format1))->split_subtables (c, parent_index, this_index);
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 2: HB_FALLTHROUGH;
// Don't split 24bit PairPos's.
#endif
@@ -494,7 +494,7 @@ struct MarkBasePos : public OT::Layout::GPOS_impl::MarkBasePos
switch (u.format) {
case 1:
return ((MarkBasePosFormat1*)(&u.format1))->sanitize (vertex);
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 2: HB_FALLTHROUGH;
#endif
default:
diff --git a/src/graph/pairpos-graph.hh b/src/graph/pairpos-graph.hh
index 1c13eb24f..8040778ea 100644
--- a/src/graph/pairpos-graph.hh
+++ b/src/graph/pairpos-graph.hh
@@ -434,7 +434,7 @@ struct PairPosFormat2 : public OT::Layout::GPOS_impl::PairPosFormat2_4<SmallType
char* start_addr = ((char*)&values[0]) + start * split_context.class1_record_size;
unsigned num_records = end - start;
- hb_memcpy (&pair_pos_prime->values[0],
+ memcpy (&pair_pos_prime->values[0],
start_addr,
num_records * split_context.class1_record_size);
@@ -611,7 +611,7 @@ struct PairPos : public OT::Layout::GPOS_impl::PairPos
return ((PairPosFormat1*)(&u.format1))->split_subtables (c, parent_index, this_index);
case 2:
return ((PairPosFormat2*)(&u.format2))->split_subtables (c, parent_index, this_index);
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 3: HB_FALLTHROUGH;
case 4: HB_FALLTHROUGH;
// Don't split 24bit PairPos's.
@@ -631,7 +631,7 @@ struct PairPos : public OT::Layout::GPOS_impl::PairPos
return ((PairPosFormat1*)(&u.format1))->sanitize (vertex);
case 2:
return ((PairPosFormat2*)(&u.format2))->sanitize (vertex);
-#ifndef HB_NO_BEYOND_64K
+#ifndef HB_NO_BORING_EXPANSION
case 3: HB_FALLTHROUGH;
case 4: HB_FALLTHROUGH;
#endif
diff --git a/src/graph/serialize.hh b/src/graph/serialize.hh
index d03a61bd1..ecc6cc5ae 100644
--- a/src/graph/serialize.hh
+++ b/src/graph/serialize.hh
@@ -33,23 +33,6 @@ struct overflow_record_t
{
unsigned parent;
unsigned child;
-
- bool operator != (const overflow_record_t o) const
- { return !(*this == o); }
-
- inline bool operator == (const overflow_record_t& o) const
- {
- return parent == o.parent &&
- child == o.child;
- }
-
- inline uint32_t hash () const
- {
- uint32_t current = 0;
- current = current * 31 + hb_hash (parent);
- current = current * 31 + hb_hash (child);
- return current;
- }
};
inline
@@ -111,7 +94,6 @@ will_overflow (graph_t& graph,
if (overflows) overflows->resize (0);
graph.update_positions ();
- hb_hashmap_t<overflow_record_t*, bool> record_set;
const auto& vertices = graph.vertices_;
for (int parent_idx = vertices.length - 1; parent_idx >= 0; parent_idx--)
{
@@ -127,10 +109,7 @@ will_overflow (graph_t& graph,
overflow_record_t r;
r.parent = parent_idx;
r.child = link.objidx;
- if (record_set.has(&r)) continue; // don't keep duplicate overflows.
-
overflows->push (r);
- record_set.set(&r, true);
}
}
@@ -244,7 +223,7 @@ inline hb_blob_t* serialize (const graph_t& graph)
return nullptr;
}
- hb_memcpy (start, vertices[i].obj.head, size);
+ memcpy (start, vertices[i].obj.head, size);
// Only real links needs to be serialized.
for (const auto& link : vertices[i].obj.real_links)
diff --git a/src/harfbuzz-config.cmake.in b/src/harfbuzz-config.cmake.in
index 0de082c2a..304410d9b 100644
--- a/src/harfbuzz-config.cmake.in
+++ b/src/harfbuzz-config.cmake.in
@@ -1,5 +1,29 @@
+# Set these variables so that the `${prefix}/lib` expands to something we can
+# remove.
+set(_harfbuzz_remove_string "REMOVE_ME")
+set(exec_prefix "${_harfbuzz_remove_string}")
+set(prefix "${_harfbuzz_remove_string}")
+
+# Compute the installation prefix by stripping components from our current
+# location.
+get_filename_component(_harfbuzz_prefix "${CMAKE_CURRENT_LIST_DIR}" DIRECTORY)
+get_filename_component(_harfbuzz_prefix "${_harfbuzz_prefix}" DIRECTORY)
set(_harfbuzz_libdir "@libdir@")
+string(REPLACE "${_harfbuzz_remove_string}/" "" _harfbuzz_libdir "${_harfbuzz_libdir}")
+set(_harfbuzz_libdir_iter "${_harfbuzz_libdir}")
+while (_harfbuzz_libdir_iter)
+ set(_harfbuzz_libdir_prev_iter "${_harfbuzz_libdir_iter}")
+ get_filename_component(_harfbuzz_libdir_iter "${_harfbuzz_libdir_iter}" DIRECTORY)
+ if (_harfbuzz_libdir_prev_iter STREQUAL _harfbuzz_libdir_iter)
+ break()
+ endif ()
+ get_filename_component(_harfbuzz_prefix "${_harfbuzz_prefix}" DIRECTORY)
+endwhile ()
+unset(_harfbuzz_libdir_iter)
+
+# Get the include subdir.
set(_harfbuzz_includedir "@includedir@")
+string(REPLACE "${_harfbuzz_remove_string}/" "" _harfbuzz_includedir "${_harfbuzz_includedir}")
# Extract version information from libtool.
set(_harfbuzz_version_info "@HB_LIBTOOL_VERSION_INFO@")
@@ -24,29 +48,29 @@ endif ()
# Add the libraries.
add_library(harfbuzz::harfbuzz SHARED IMPORTED)
set_target_properties(harfbuzz::harfbuzz PROPERTIES
- INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_includedir}/harfbuzz"
- IMPORTED_LOCATION "${_harfbuzz_libdir}/libharfbuzz${_harfbuzz_lib_suffix}")
+ INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz"
+ IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz${_harfbuzz_lib_suffix}")
add_library(harfbuzz::icu SHARED IMPORTED)
set_target_properties(harfbuzz::icu PROPERTIES
- INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_includedir}/harfbuzz"
+ INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz"
INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz"
- IMPORTED_LOCATION "${_harfbuzz_libdir}/libharfbuzz-icu${_harfbuzz_lib_suffix}")
+ IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz-icu${_harfbuzz_lib_suffix}")
add_library(harfbuzz::subset SHARED IMPORTED)
set_target_properties(harfbuzz::subset PROPERTIES
- INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_includedir}/harfbuzz"
+ INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz"
INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz"
- IMPORTED_LOCATION "${_harfbuzz_libdir}/libharfbuzz-subset${_harfbuzz_lib_suffix}")
+ IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz-subset${_harfbuzz_lib_suffix}")
# Only add the gobject library if it was built.
set(_harfbuzz_have_gobject "@have_gobject@")
if (_harfbuzz_have_gobject)
add_library(harfbuzz::gobject SHARED IMPORTED)
set_target_properties(harfbuzz::gobject PROPERTIES
- INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_includedir}/harfbuzz"
+ INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz"
INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz"
- IMPORTED_LOCATION "${_harfbuzz_libdir}/libharfbuzz-gobject${_harfbuzz_lib_suffix}")
+ IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz-gobject${_harfbuzz_lib_suffix}")
endif ()
# Clean out variables we used in our scope.
@@ -56,3 +80,7 @@ unset(_harfbuzz_revision)
unset(_harfbuzz_age)
unset(_harfbuzz_includedir)
unset(_harfbuzz_libdir)
+unset(_harfbuzz_prefix)
+unset(exec_prefix)
+unset(prefix)
+unset(_harfbuzz_remove_string)
diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh
index 8b9190d0b..aa4ad4cf3 100644
--- a/src/hb-aat-layout-morx-table.hh
+++ b/src/hb-aat-layout-morx-table.hh
@@ -131,14 +131,14 @@ struct RearrangementSubtable
hb_glyph_info_t *info = buffer->info;
hb_glyph_info_t buf[4];
- hb_memcpy (buf, info + start, l * sizeof (buf[0]));
- hb_memcpy (buf + 2, info + end - r, r * sizeof (buf[0]));
+ memcpy (buf, info + start, l * sizeof (buf[0]));
+ memcpy (buf + 2, info + end - r, r * sizeof (buf[0]));
if (l != r)
memmove (info + start + r, info + start + l, (end - start - l - r) * sizeof (buf[0]));
- hb_memcpy (info + start, buf + 2, r * sizeof (buf[0]));
- hb_memcpy (info + end - l, buf, l * sizeof (buf[0]));
+ memcpy (info + start, buf + 2, r * sizeof (buf[0]));
+ memcpy (info + end - l, buf, l * sizeof (buf[0]));
if (reverse_l)
{
buf[0] = info[end - 1];
diff --git a/src/hb-aat-layout.cc b/src/hb-aat-layout.cc
index 78427b0d5..d60126fe1 100644
--- a/src/hb-aat-layout.cc
+++ b/src/hb-aat-layout.cc
@@ -289,7 +289,7 @@ is_deleted_glyph (const hb_glyph_info_t *info)
void
hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer)
{
- buffer->delete_glyphs_inplace (is_deleted_glyph);
+ hb_ot_layout_delete_glyphs_inplace (buffer, is_deleted_glyph);
}
/**
diff --git a/src/hb-aat-map.hh b/src/hb-aat-map.hh
index d0ee7d672..c914f58d7 100644
--- a/src/hb-aat-map.hh
+++ b/src/hb-aat-map.hh
@@ -38,7 +38,7 @@ struct hb_aat_map_t
void init ()
{
- hb_memset (this, 0, sizeof (*this));
+ memset (this, 0, sizeof (*this));
chain_flags.init ();
}
void fini () { chain_flags.fini (); }
diff --git a/src/hb-algs.hh b/src/hb-algs.hh
index d85a4afe1..cc37c073d 100644
--- a/src/hb-algs.hh
+++ b/src/hb-algs.hh
@@ -236,6 +236,17 @@ struct
template <typename T> constexpr auto
impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, hb_deref (v).hash ())
+ template <typename T> constexpr uint32_t
+ impl (const hb::shared_ptr<T>& v, hb_priority<1>) const
+ {
+ return v.get () ? v.get ()->hash () : 0;
+ }
+ template <typename T> constexpr uint32_t
+ impl (const hb::unique_ptr<T>& v, hb_priority<1>) const
+ {
+ return v.get () ? v.get ()->hash () : 0;
+ }
+
template <typename T> constexpr auto
impl (const T& v, hb_priority<0>) const HB_RETURN (uint32_t, std::hash<hb_decay<decltype (hb_deref (v))>>{} (hb_deref (v)))
@@ -484,17 +495,6 @@ struct
}
HB_FUNCOBJ (hb_equal);
-struct
-{
- template <typename T> void
- operator () (T& a, T& b) const
- {
- using std::swap; // allow ADL
- swap (a, b);
- }
-}
-HB_FUNCOBJ (hb_swap);
-
template <typename T1, typename T2>
struct hb_pair_t
@@ -507,7 +507,7 @@ struct hb_pair_t
hb_enable_if (std::is_default_constructible<U1>::value &&
std::is_default_constructible<U2>::value)>
hb_pair_t () : first (), second () {}
- hb_pair_t (T1 a, T2 b) : first (std::forward<T1> (a)), second (std::forward<T2> (b)) {}
+ hb_pair_t (T1 a, T2 b) : first (a), second (b) {}
template <typename Q1, typename Q2,
hb_enable_if (hb_is_convertible (T1, Q1) &&
@@ -524,25 +524,6 @@ struct hb_pair_t
bool operator > (const pair_t& o) const { return first > o.first || (first == o.first && second > o.second); }
bool operator <= (const pair_t& o) const { return !(*this > o); }
- static int cmp (const void *pa, const void *pb)
- {
- pair_t *a = (pair_t *) pa;
- pair_t *b = (pair_t *) pb;
-
- if (a->first < b->first) return -1;
- if (a->first > b->first) return +1;
- if (a->second < b->second) return -1;
- if (a->second > b->second) return +1;
- return 0;
- }
-
- friend void swap (hb_pair_t& a, hb_pair_t& b)
- {
- hb_swap (a.first, b.first);
- hb_swap (a.second, b.second);
- }
-
-
T1 first;
T2 second;
};
@@ -589,6 +570,17 @@ struct
}
HB_FUNCOBJ (hb_clamp);
+struct
+{
+ template <typename T> void
+ operator () (T& a, T& b) const
+ {
+ using std::swap; // allow ADL
+ swap (a, b);
+ }
+}
+HB_FUNCOBJ (hb_swap);
+
/*
* Bithacks.
*/
@@ -857,14 +849,19 @@ hb_in_range (T u, T lo, T hi)
return (T)(u - lo) <= (T)(hi - lo);
}
template <typename T> static inline bool
-hb_in_ranges (T u, T lo1, T hi1)
+hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2)
{
- return hb_in_range (u, lo1, hi1);
+ return hb_in_range (u, lo1, hi1) || hb_in_range (u, lo2, hi2);
}
-template <typename T, typename ...Ts> static inline bool
-hb_in_ranges (T u, T lo1, T hi1, Ts... ds)
+template <typename T> static inline bool
+hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2, T lo3, T hi3)
{
- return hb_in_range<T> (u, lo1, hi1) || hb_in_ranges<T> (u, ds...);
+ return hb_in_range (u, lo1, hi1) || hb_in_range (u, lo2, hi2) || hb_in_range (u, lo3, hi3);
+}
+template <typename T> static inline bool
+hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2, T lo3, T hi3, T lo4, T hi4)
+{
+ return hb_in_range (u, lo1, hi1) || hb_in_range (u, lo2, hi2) || hb_in_range (u, lo3, hi3) || hb_in_range (u, lo4, hi4);
}
@@ -872,18 +869,10 @@ hb_in_ranges (T u, T lo1, T hi1, Ts... ds)
* Overflow checking.
*/
+/* Consider __builtin_mul_overflow use here also */
static inline bool
-hb_unsigned_mul_overflows (unsigned int count, unsigned int size, unsigned *result = nullptr)
+hb_unsigned_mul_overflows (unsigned int count, unsigned int size)
{
-#if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__)
- unsigned stack_result;
- if (!result)
- result = &stack_result;
- return __builtin_mul_overflow (count, size, result);
-#endif
-
- if (result)
- *result = count * size;
return (size > 0) && (count >= ((unsigned int) -1) / size);
}
@@ -1175,12 +1164,9 @@ hb_qsort (void *base, size_t nel, size_t width,
}
-template <typename T, typename T2, typename T3 = int> static inline void
-hb_stable_sort (T *array, unsigned int len, int(*compar)(const T2 *, const T2 *), T3 *array2 = nullptr)
+template <typename T, typename T2, typename T3> static inline void
+hb_stable_sort (T *array, unsigned int len, int(*compar)(const T2 *, const T2 *), T3 *array2)
{
- static_assert (hb_is_trivially_copy_assignable (T), "");
- static_assert (hb_is_trivially_copy_assignable (T3), "");
-
for (unsigned int i = 1; i < len; i++)
{
unsigned int j = i;
@@ -1203,6 +1189,12 @@ hb_stable_sort (T *array, unsigned int len, int(*compar)(const T2 *, const T2 *)
}
}
+template <typename T> static inline void
+hb_stable_sort (T *array, unsigned int len, int(*compar)(const T *, const T *))
+{
+ hb_stable_sort (array, len, compar, (int *) nullptr);
+}
+
static inline hb_bool_t
hb_codepoint_parse (const char *s, unsigned int len, int base, hb_codepoint_t *out)
{
@@ -1330,4 +1322,47 @@ struct
HB_FUNCOBJ (hb_dec);
+/* Compiler-assisted vectorization. */
+
+/* Type behaving similar to vectorized vars defined using __attribute__((vector_size(...))),
+ * basically a fixed-size bitset. */
+template <typename elt_t, unsigned int byte_size>
+struct hb_vector_size_t
+{
+ elt_t& operator [] (unsigned int i) { return v[i]; }
+ const elt_t& operator [] (unsigned int i) const { return v[i]; }
+
+ void clear (unsigned char v = 0) { memset (this, v, sizeof (*this)); }
+
+ template <typename Op>
+ hb_vector_size_t process (const Op& op) const
+ {
+ hb_vector_size_t r;
+ for (unsigned int i = 0; i < ARRAY_LENGTH (v); i++)
+ r.v[i] = op (v[i]);
+ return r;
+ }
+ template <typename Op>
+ hb_vector_size_t process (const Op& op, const hb_vector_size_t &o) const
+ {
+ hb_vector_size_t r;
+ for (unsigned int i = 0; i < ARRAY_LENGTH (v); i++)
+ r.v[i] = op (v[i], o.v[i]);
+ return r;
+ }
+ hb_vector_size_t operator | (const hb_vector_size_t &o) const
+ { return process (hb_bitwise_or, o); }
+ hb_vector_size_t operator & (const hb_vector_size_t &o) const
+ { return process (hb_bitwise_and, o); }
+ hb_vector_size_t operator ^ (const hb_vector_size_t &o) const
+ { return process (hb_bitwise_xor, o); }
+ hb_vector_size_t operator ~ () const
+ { return process (hb_bitwise_neg); }
+
+ private:
+ static_assert (0 == byte_size % sizeof (elt_t), "");
+ elt_t v[byte_size / sizeof (elt_t)];
+};
+
+
#endif /* HB_ALGS_HH */
diff --git a/src/hb-array.hh b/src/hb-array.hh
index 17562bc33..5884007c1 100644
--- a/src/hb-array.hh
+++ b/src/hb-array.hh
@@ -100,18 +100,10 @@ struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, 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 and length.
- *
- * The above comment is outdated now because we implemented separate begin/end to
- * objects that were using hb_array_t for range-based loop before. */
+ * for range-based for loop and just compare arrayZ and length. */
bool operator != (const hb_array_t& o) const
{ return this->arrayZ != o.arrayZ || this->length != o.length; }
- /* Faster range-based for loop without bounds-check. */
- Type *begin () const { return arrayZ; }
- Type *end () const { return arrayZ + length; }
-
-
/* Extra operators.
*/
Type * operator & () const { return arrayZ; }
@@ -120,11 +112,11 @@ struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, Type&>
HB_INTERNAL bool operator == (const hb_array_t &o) const;
- uint32_t hash () const
- {
+ uint32_t hash () const {
uint32_t current = 0;
- for (auto &v : *this)
- current = current * 31 + hb_hash (v);
+ for (unsigned int i = 0; i < this->length; i++) {
+ current = current * 31 + hb_hash (this->arrayZ[i]);
+ }
return current;
}
@@ -192,18 +184,23 @@ struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, Type&>
hb_sorted_array_t<Type> qsort (int (*cmp_)(const void*, const void*))
{
- //static_assert (hb_enable_if (hb_is_trivially_copy_assignable(Type)), "");
if (likely (length))
hb_qsort (arrayZ, length, this->get_item_size (), cmp_);
return hb_sorted_array_t<Type> (*this);
}
hb_sorted_array_t<Type> qsort ()
{
- //static_assert (hb_enable_if (hb_is_trivially_copy_assignable(Type)), "");
if (likely (length))
hb_qsort (arrayZ, length, this->get_item_size (), Type::cmp);
return hb_sorted_array_t<Type> (*this);
}
+ void qsort (unsigned int start, unsigned int end)
+ {
+ end = hb_min (end, length);
+ assert (start <= end);
+ if (likely (start < end))
+ hb_qsort (arrayZ + start, end - start, this->get_item_size (), Type::cmp);
+ }
/*
* Other methods.
@@ -265,31 +262,17 @@ struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, Type&>
void fini ()
{ hb_free ((void *) arrayZ); arrayZ = nullptr; length = 0; }
- template <typename hb_serialize_context_t,
- typename U = Type,
- hb_enable_if (!(sizeof (U) < sizeof (long long) && hb_is_trivially_copy_assignable(hb_decay<Type>)))>
+ template <typename hb_serialize_context_t>
hb_array_t copy (hb_serialize_context_t *c) const
{
TRACE_SERIALIZE (this);
auto* out = c->start_embed (arrayZ);
- if (unlikely (!c->extend_size (out, get_size (), false))) return_trace (hb_array_t ());
+ if (unlikely (!c->extend_size (out, get_size ()))) return_trace (hb_array_t ());
for (unsigned i = 0; i < length; i++)
out[i] = arrayZ[i]; /* TODO: add version that calls c->copy() */
return_trace (hb_array_t (out, length));
}
- template <typename hb_serialize_context_t,
- typename U = Type,
- hb_enable_if (sizeof (U) < sizeof (long long) && hb_is_trivially_copy_assignable(hb_decay<Type>))>
- hb_array_t copy (hb_serialize_context_t *c) const
- {
- TRACE_SERIALIZE (this);
- auto* out = c->start_embed (arrayZ);
- if (unlikely (!c->extend_size (out, get_size (), false))) return_trace (hb_array_t ());
- hb_memcpy (out, arrayZ, get_size ());
- return_trace (hb_array_t (out, length));
- }
-
template <typename hb_sanitize_context_t>
bool sanitize (hb_sanitize_context_t *c) const
{ return c->check_array (arrayZ, length); }
@@ -312,8 +295,8 @@ hb_array (T (&array_)[length_])
template <typename Type>
struct hb_sorted_array_t :
- hb_array_t<Type>,
- hb_iter_t<hb_sorted_array_t<Type>, Type&>
+ hb_iter_t<hb_sorted_array_t<Type>, Type&>,
+ hb_array_t<Type>
{
typedef hb_iter_t<hb_sorted_array_t, Type&> iter_base_t;
HB_ITER_USING (iter_base_t);
@@ -333,8 +316,8 @@ struct hb_sorted_array_t :
template <typename U,
hb_enable_if (hb_is_cr_convertible(U, Type))>
constexpr hb_sorted_array_t (const hb_array_t<U> &o) :
- hb_array_t<Type> (o),
- hb_iter_t<hb_sorted_array_t, Type&> () {}
+ hb_iter_t<hb_sorted_array_t, Type&> (),
+ hb_array_t<Type> (o) {}
template <typename U,
hb_enable_if (hb_is_cr_convertible(U, Type))>
hb_sorted_array_t& operator = (const hb_array_t<U> &o)
@@ -346,11 +329,6 @@ struct hb_sorted_array_t :
bool operator != (const hb_sorted_array_t& o) const
{ return this->arrayZ != o.arrayZ || this->length != o.length; }
- /* Faster range-based for loop without bounds-check. */
- Type *begin () const { return this->arrayZ; }
- Type *end () const { return this->arrayZ + this->length; }
-
-
hb_sorted_array_t sub_array (unsigned int start_offset, unsigned int *seg_count /* IN/OUT */) const
{ return hb_sorted_array_t (((const hb_array_t<Type> *) (this))->sub_array (start_offset, seg_count)); }
hb_sorted_array_t sub_array (unsigned int start_offset, unsigned int seg_count) const
@@ -443,42 +421,18 @@ inline bool hb_array_t<const unsigned char>::operator == (const hb_array_t<const
return 0 == hb_memcmp (arrayZ, o.arrayZ, length);
}
-
-/* Specialize hash() for byte arrays. */
-
template <>
-inline uint32_t hb_array_t<const char>::hash () const
-{
+inline uint32_t hb_array_t<const char>::hash () const {
uint32_t current = 0;
- unsigned i = 0;
-
-#if defined(__OPTIMIZE__) && !defined(HB_NO_PACKED) && \
- ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__))
- struct __attribute__((packed)) packed_uint32_t { uint32_t v; };
- for (; i + 4 <= this->length; i += 4)
- current = current * 31 + hb_hash ((uint32_t) ((packed_uint32_t *) &this->arrayZ[i])->v);
-#endif
-
- for (; i < this->length; i++)
- current = current * 31 + hb_hash (this->arrayZ[i]);
+ for (unsigned int i = 0; i < this->length; i++)
+ current = current * 31 + (uint32_t) (this->arrayZ[i] * 2654435761u);
return current;
}
-
template <>
-inline uint32_t hb_array_t<const unsigned char>::hash () const
-{
+inline uint32_t hb_array_t<const unsigned char>::hash () const {
uint32_t current = 0;
- unsigned i = 0;
-
-#if defined(__OPTIMIZE__) && !defined(HB_NO_PACKED) && \
- ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__))
- struct __attribute__((packed)) packed_uint32_t { uint32_t v; };
- for (; i + 4 <= this->length; i += 4)
- current = current * 31 + hb_hash ((uint32_t) ((packed_uint32_t *) &this->arrayZ[i])->v);
-#endif
-
- for (; i < this->length; i++)
- current = current * 31 + hb_hash (this->arrayZ[i]);
+ for (unsigned int i = 0; i < this->length; i++)
+ current = current * 31 + (uint32_t) (this->arrayZ[i] * 2654435761u);
return current;
}
diff --git a/src/hb-bit-page.hh b/src/hb-bit-page.hh
index 11987054f..95ae1b7bf 100644
--- a/src/hb-bit-page.hh
+++ b/src/hb-bit-page.hh
@@ -30,53 +30,6 @@
#include "hb.hh"
-
-/* Compiler-assisted vectorization. */
-
-/* Type behaving similar to vectorized vars defined using __attribute__((vector_size(...))),
- * basically a fixed-size bitset. */
-template <typename elt_t, unsigned int byte_size>
-struct hb_vector_size_t
-{
- elt_t& operator [] (unsigned int i) { return v[i]; }
- const elt_t& operator [] (unsigned int i) const { return v[i]; }
-
- void clear (unsigned char v = 0) { hb_memset (this, v, sizeof (*this)); }
-
- template <typename Op>
- hb_vector_size_t process (const Op& op) const
- {
- hb_vector_size_t r;
- for (unsigned int i = 0; i < ARRAY_LENGTH (v); i++)
- r.v[i] = op (v[i]);
- return r;
- }
- template <typename Op>
- hb_vector_size_t process (const Op& op, const hb_vector_size_t &o) const
- {
- hb_vector_size_t r;
- for (unsigned int i = 0; i < ARRAY_LENGTH (v); i++)
- r.v[i] = op (v[i], o.v[i]);
- return r;
- }
- hb_vector_size_t operator | (const hb_vector_size_t &o) const
- { return process (hb_bitwise_or, o); }
- hb_vector_size_t operator & (const hb_vector_size_t &o) const
- { return process (hb_bitwise_and, o); }
- hb_vector_size_t operator ^ (const hb_vector_size_t &o) const
- { return process (hb_bitwise_xor, o); }
- hb_vector_size_t operator ~ () const
- { return process (hb_bitwise_neg); }
-
- hb_array_t<const elt_t> iter () const
- { return hb_array (v); }
-
- private:
- static_assert (0 == byte_size % sizeof (elt_t), "");
- elt_t v[byte_size / sizeof (elt_t)];
-};
-
-
struct hb_bit_page_t
{
void init0 () { v.clear (); }
@@ -87,17 +40,17 @@ struct hb_bit_page_t
bool is_empty () const
{
- return
- + hb_iter (v)
- | hb_none
- ;
+ for (unsigned i = 0; i < len (); i++)
+ if (v[i])
+ return false;
+ return true;
}
uint32_t hash () const
{
- return
- + hb_iter (v)
- | hb_reduce ([] (uint32_t h, const elt_t &_) { return h * 31 + hb_hash (_); }, (uint32_t) 0u)
- ;
+ uint32_t h = 0;
+ for (unsigned i = 0; i < len (); i++)
+ h = h * 31 + hb_hash (v[i]);
+ return h;
}
void add (hb_codepoint_t g) { elt (g) |= mask (g); }
@@ -116,7 +69,7 @@ struct hb_bit_page_t
*la |= ~(mask (a) - 1);
la++;
- hb_memset (la, 0xff, (char *) lb - (char *) la);
+ memset (la, 0xff, (char *) lb - (char *) la);
*lb |= ((mask (b) << 1) - 1);
}
@@ -132,7 +85,7 @@ struct hb_bit_page_t
*la &= mask (a) - 1;
la++;
- hb_memset (la, 0, (char *) lb - (char *) la);
+ memset (la, 0, (char *) lb - (char *) la);
*lb &= ~((mask (b) << 1) - 1);
}
@@ -148,13 +101,13 @@ struct hb_bit_page_t
hb_codepoint_t *p,
unsigned int size) const
{
- unsigned int start_v = start_value / ELT_BITS;
+ unsigned int start_v = start_value >> ELT_BITS_LOG_2;
unsigned int start_bit = start_value & ELT_MASK;
unsigned int count = 0;
for (unsigned i = start_v; i < len () && count < size; i++)
{
elt_t bits = v[i];
- uint32_t v_base = base | (i * ELT_BITS);
+ uint32_t v_base = base | (i << ELT_BITS_LOG_2);
for (unsigned int j = start_bit; j < ELT_BITS && count < size; j++)
{
if ((elt_t(1) << j) & bits) {
@@ -179,13 +132,13 @@ struct hb_bit_page_t
unsigned int size,
hb_codepoint_t *next_value) const
{
- unsigned int start_v = start_value / ELT_BITS;
+ unsigned int start_v = start_value >> ELT_BITS_LOG_2;
unsigned int start_bit = start_value & ELT_MASK;
unsigned int count = 0;
for (unsigned i = start_v; i < len () && count < size; i++)
{
elt_t bits = v[i];
- uint32_t v_offset = i * ELT_BITS;
+ uint32_t v_offset = i << ELT_BITS_LOG_2;
for (unsigned int j = start_bit; j < ELT_BITS && count < size; j++)
{
if ((elt_t(1) << j) & bits)
@@ -208,10 +161,7 @@ struct hb_bit_page_t
bool is_equal (const hb_bit_page_t &other) const
{
- for (unsigned i = 0; i < len (); i++)
- if (v[i] != other.v[i])
- return false;
- return true;
+ return 0 == hb_memcmp (&v, &other.v, sizeof (v));
}
bool is_subset (const hb_bit_page_t &larger_page) const
{
@@ -223,10 +173,10 @@ struct hb_bit_page_t
unsigned int get_population () const
{
- return
- + hb_iter (v)
- | hb_reduce ([] (unsigned pop, const elt_t &_) { return pop + hb_popcount (_); }, 0u)
- ;
+ unsigned int pop = 0;
+ for (unsigned int i = 0; i < len (); i++)
+ pop += hb_popcount (v[i]);
+ return pop;
}
bool next (hb_codepoint_t *codepoint) const
@@ -312,6 +262,8 @@ struct hb_bit_page_t
typedef hb_vector_size_t<elt_t, PAGE_BITS / 8> vector_t;
static constexpr unsigned ELT_BITS = sizeof (elt_t) * 8;
+ static constexpr unsigned ELT_BITS_LOG_2 = 6;
+ static_assert (1 << ELT_BITS_LOG_2 == ELT_BITS, "");
static constexpr unsigned ELT_MASK = ELT_BITS - 1;
static constexpr unsigned BITS = sizeof (vector_t) * 8;
diff --git a/src/hb-bit-set-invertible.hh b/src/hb-bit-set-invertible.hh
index ff8aecc60..27fb0732e 100644
--- a/src/hb-bit-set-invertible.hh
+++ b/src/hb-bit-set-invertible.hh
@@ -123,8 +123,10 @@ struct hb_bit_set_invertible_t
bool get (hb_codepoint_t g) const { return s.get (g) ^ inverted; }
/* Has interface. */
- bool operator [] (hb_codepoint_t k) const { return get (k); }
- bool has (hb_codepoint_t k) const { return (*this)[k]; }
+ static constexpr bool SENTINEL = false;
+ typedef bool 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); }
diff --git a/src/hb-bit-set.hh b/src/hb-bit-set.hh
index 8de6e037f..a63887efd 100644
--- a/src/hb-bit-set.hh
+++ b/src/hb-bit-set.hh
@@ -85,10 +85,10 @@ struct hb_bit_set_t
void err () { if (successful) successful = false; } /* TODO Remove */
bool in_error () const { return !successful; }
- bool resize (unsigned int count, bool clear = true)
+ bool resize (unsigned int count)
{
if (unlikely (!successful)) return false;
- if (unlikely (!pages.resize (count, clear) || !page_map.resize (count, clear)))
+ if (unlikely (!pages.resize (count) || !page_map.resize (count)))
{
pages.resize (page_map.length);
successful = false;
@@ -330,8 +330,10 @@ struct hb_bit_set_t
}
/* Has interface. */
- bool operator [] (hb_codepoint_t k) const { return get (k); }
- bool has (hb_codepoint_t k) const { return (*this)[k]; }
+ static constexpr bool SENTINEL = false;
+ typedef bool 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); }
@@ -350,7 +352,7 @@ struct hb_bit_set_t
{
if (unlikely (!successful)) return;
unsigned int count = other.pages.length;
- if (unlikely (!resize (count, false)))
+ if (unlikely (!resize (count)))
return;
population = other.population;
@@ -389,7 +391,7 @@ struct hb_bit_set_t
bool is_subset (const hb_bit_set_t &larger_set) const
{
if (has_population () && larger_set.has_population () &&
- population > larger_set.population)
+ population != larger_set.population)
return false;
uint32_t spi = 0;
@@ -538,21 +540,21 @@ struct hb_bit_set_t
b = nb;
for (; a && b; )
{
- if (page_map.arrayZ[a - 1].major == other.page_map.arrayZ[b - 1].major)
+ if (page_map[a - 1].major == other.page_map[b - 1].major)
{
a--;
b--;
count--;
- page_map.arrayZ[count] = page_map.arrayZ[a];
+ page_map[count] = page_map[a];
page_at (count).v = op (page_at (a).v, other.page_at (b).v);
}
- else if (page_map.arrayZ[a - 1].major > other.page_map.arrayZ[b - 1].major)
+ else if (page_map[a - 1].major > other.page_map[b - 1].major)
{
a--;
if (passthru_left)
{
count--;
- page_map.arrayZ[count] = page_map.arrayZ[a];
+ page_map[count] = page_map[a];
}
}
else
@@ -561,8 +563,8 @@ struct hb_bit_set_t
if (passthru_right)
{
count--;
- page_map.arrayZ[count].major = other.page_map.arrayZ[b].major;
- page_map.arrayZ[count].index = next_page++;
+ page_map[count].major = other.page_map[b].major;
+ page_map[count].index = next_page++;
page_at (count).v = other.page_at (b).v;
}
}
@@ -572,15 +574,15 @@ struct hb_bit_set_t
{
a--;
count--;
- page_map.arrayZ[count] = page_map.arrayZ[a];
+ page_map[count] = page_map [a];
}
if (passthru_right)
while (b)
{
b--;
count--;
- page_map.arrayZ[count].major = other.page_map.arrayZ[b].major;
- page_map.arrayZ[count].index = next_page++;
+ page_map[count].major = other.page_map[b].major;
+ page_map[count].index = next_page++;
page_at (count).v = other.page_at (b).v;
}
assert (!count);
@@ -603,6 +605,8 @@ struct hb_bit_set_t
bool next (hb_codepoint_t *codepoint) const
{
+ // TODO: this should be merged with prev() as both implementations
+ // are very similar.
if (unlikely (*codepoint == INVALID)) {
*codepoint = get_min ();
return *codepoint != INVALID;
@@ -636,7 +640,7 @@ struct hb_bit_set_t
for (; i < page_map.length; i++)
{
- const page_map_t &current = page_map_array[i];
+ const page_map_t &current = page_map.arrayZ[i];
hb_codepoint_t m = pages_array[current.index].get_min ();
if (m != INVALID)
{
@@ -659,21 +663,21 @@ struct hb_bit_set_t
page_map_t map = {get_major (*codepoint), 0};
unsigned int i;
page_map.bfind (map, &i, HB_NOT_FOUND_STORE_CLOSEST);
- if (i < page_map.length && page_map.arrayZ[i].major == map.major)
+ if (i < page_map.length && page_map[i].major == map.major)
{
- if (pages[page_map.arrayZ[i].index].previous (codepoint))
+ if (pages[page_map[i].index].previous (codepoint))
{
- *codepoint += page_map.arrayZ[i].major * page_t::PAGE_BITS;
+ *codepoint += page_map[i].major * page_t::PAGE_BITS;
return true;
}
}
i--;
for (; (int) i >= 0; i--)
{
- hb_codepoint_t m = pages.arrayZ[page_map.arrayZ[i].index].get_max ();
+ hb_codepoint_t m = pages[page_map[i].index].get_max ();
if (m != INVALID)
{
- *codepoint = page_map.arrayZ[i].major * page_t::PAGE_BITS + m;
+ *codepoint = page_map[i].major * page_t::PAGE_BITS + m;
return true;
}
}
@@ -901,7 +905,7 @@ struct hb_bit_set_t
{
auto &cached_page = page_map.arrayZ[i];
if (cached_page.major == major)
- return &pages.arrayZ[cached_page.index];
+ return &pages[cached_page.index];
}
page_map_t map = {major, pages.length};
@@ -913,15 +917,15 @@ struct hb_bit_set_t
if (unlikely (!resize (pages.length + 1)))
return nullptr;
- pages.arrayZ[map.index].init0 ();
- memmove (page_map.arrayZ + i + 1,
- page_map.arrayZ + i,
+ pages[map.index].init0 ();
+ memmove (page_map + i + 1,
+ page_map + i,
(page_map.length - 1 - i) * page_map.item_size);
page_map[i] = map;
}
last_page_lookup = i;
- return &pages.arrayZ[page_map.arrayZ[i].index];
+ return &pages[page_map[i].index];
}
const page_t *page_for (hb_codepoint_t g) const
{
@@ -935,7 +939,7 @@ struct hb_bit_set_t
{
auto &cached_page = page_map.arrayZ[i];
if (cached_page.major == major)
- return &pages.arrayZ[cached_page.index];
+ return &pages[cached_page.index];
}
page_map_t key = {major};
@@ -943,18 +947,10 @@ struct hb_bit_set_t
return nullptr;
last_page_lookup = i;
- return &pages.arrayZ[page_map[i].index];
- }
- page_t &page_at (unsigned int i)
- {
- assert (i < page_map.length);
- return pages.arrayZ[page_map.arrayZ[i].index];
- }
- const page_t &page_at (unsigned int i) const
- {
- assert (i < page_map.length);
- return pages.arrayZ[page_map.arrayZ[i].index];
+ return &pages[page_map[i].index];
}
+ page_t &page_at (unsigned int i) { return pages[page_map[i].index]; }
+ const page_t &page_at (unsigned int i) const { return pages[page_map[i].index]; }
unsigned int get_major (hb_codepoint_t g) const { return g >> page_t::PAGE_BITS_LOG_2; }
unsigned int page_remainder (hb_codepoint_t g) const { return g & page_t::PAGE_BITMASK; }
hb_codepoint_t major_start (unsigned int major) const { return major << page_t::PAGE_BITS_LOG_2; }
diff --git a/src/hb-blob.cc b/src/hb-blob.cc
index f0fda1fa4..9bc12ea3f 100644
--- a/src/hb-blob.cc
+++ b/src/hb-blob.cc
@@ -495,7 +495,7 @@ hb_blob_t::try_make_writable ()
DEBUG_MSG_FUNC (BLOB, this, "dupped successfully -> %p\n", this->data);
- hb_memcpy (new_data, this->data, this->length);
+ memcpy (new_data, this->data, this->length);
this->destroy_user_data ();
this->mode = HB_MEMORY_MODE_WRITABLE;
this->data = new_data;
diff --git a/src/hb-buffer-deserialize-json.hh b/src/hb-buffer-deserialize-json.hh
index 993bb1f69..87095855d 100644
--- a/src/hb-buffer-deserialize-json.hh
+++ b/src/hb-buffer-deserialize-json.hh
@@ -32,7 +32,7 @@
#include "hb.hh"
-#line 33 "hb-buffer-deserialize-json.hh"
+#line 36 "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,
@@ -557,12 +557,12 @@ _hb_buffer_deserialize_json (hb_buffer_t *buffer,
hb_glyph_info_t info = {0};
hb_glyph_position_t pos = {0};
-#line 554 "hb-buffer-deserialize-json.hh"
+#line 561 "hb-buffer-deserialize-json.hh"
{
cs = deserialize_json_start;
}
-#line 557 "hb-buffer-deserialize-json.hh"
+#line 566 "hb-buffer-deserialize-json.hh"
{
int _slen;
int _trans;
@@ -590,8 +590,8 @@ _resume:
case 1:
#line 38 "hb-buffer-deserialize-json.rl"
{
- hb_memset (&info, 0, sizeof (info));
- hb_memset (&pos , 0, sizeof (pos ));
+ memset (&info, 0, sizeof (info));
+ memset (&pos , 0, sizeof (pos ));
}
break;
case 5:
@@ -774,7 +774,7 @@ _resume:
*end_ptr = p;
}
break;
-#line 735 "hb-buffer-deserialize-json.hh"
+#line 778 "hb-buffer-deserialize-json.hh"
}
_again:
diff --git a/src/hb-buffer-deserialize-json.rl b/src/hb-buffer-deserialize-json.rl
index d6fbfe89c..d5e3c138d 100644
--- a/src/hb-buffer-deserialize-json.rl
+++ b/src/hb-buffer-deserialize-json.rl
@@ -36,8 +36,8 @@ alphtype unsigned char;
write data;
action clear_item {
- hb_memset (&info, 0, sizeof (info));
- hb_memset (&pos , 0, sizeof (pos ));
+ memset (&info, 0, sizeof (info));
+ memset (&pos , 0, sizeof (pos ));
}
action add_item {
diff --git a/src/hb-buffer-deserialize-text.hh b/src/hb-buffer-deserialize-text.hh
index 6b9b4282f..9062610de 100644
--- a/src/hb-buffer-deserialize-text.hh
+++ b/src/hb-buffer-deserialize-text.hh
@@ -32,30 +32,32 @@
#include "hb.hh"
-#line 33 "hb-buffer-deserialize-text.hh"
+#line 36 "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, 48u, 57u,
- 45u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 44u, 44u,
- 45u, 57u, 48u, 57u, 44u, 57u, 43u, 124u, 9u, 124u, 9u, 124u, 0u, 0u, 9u, 85u,
+ 0u, 0u, 9u, 91u, 85u, 85u, 43u, 43u, 48u, 102u, 9u, 85u, 48u, 57u, 45u, 57u,
+ 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, 9u, 124u, 9u, 124u, 9u, 124u,
- 0
+ 9u, 124u, 9u, 124u, 9u, 124u, 0
};
static const char _deserialize_text_key_spans[] = {
- 0, 83, 1, 1, 55, 77, 10, 10,
- 13, 10, 13, 10, 10, 13, 10, 1,
- 13, 10, 14, 82, 116, 116, 0, 77,
+ 0, 83, 1, 1, 55, 77, 10, 13,
+ 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
+ 116, 116, 116
};
static const short _deserialize_text_index_offsets[] = {
0, 0, 84, 86, 88, 144, 222, 233,
- 244, 258, 269, 283, 294, 305, 319, 330,
- 332, 346, 357, 372, 455, 572, 689, 690,
+ 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
+ 1704, 1821, 1938, 2055, 2172, 2289, 2406, 2523,
+ 2640, 2757, 2874
};
static const char _deserialize_text_indicies[] = {
@@ -88,34 +90,34 @@ static const char _deserialize_text_indicies[] = {
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 4, 1, 8,
9, 9, 9, 9, 9, 9, 9, 9,
- 9, 1, 10, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 1, 12, 1, 1,
+ 9, 1, 10, 1, 1, 11, 12, 12,
+ 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,
23, 23, 23, 23, 23, 23, 23, 23,
- 23, 1, 24, 1, 1, 25, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 1,
- 27, 28, 28, 28, 28, 28, 28, 28,
- 28, 28, 1, 29, 1, 30, 1, 1,
- 31, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 1, 33, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 1, 29, 1,
- 1, 1, 28, 28, 28, 28, 28, 28,
- 28, 28, 28, 28, 1, 35, 35, 1,
+ 23, 1, 24, 1, 25, 1, 1, 26,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 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, 1, 1, 1, 1, 35,
- 1, 1, 35, 1, 1, 1, 1, 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, 1, 35, 35,
+ 1, 1, 1, 1, 1, 30, 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, 1, 1, 1, 1, 35, 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, 1, 1, 1, 1, 1, 36,
@@ -199,235 +201,282 @@ static const char _deserialize_text_indicies[] = {
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, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 57,
- 35, 35, 58, 35, 35, 35, 35, 35,
- 35, 35, 59, 1, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 60, 35, 35, 61,
- 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 62, 63, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35,
- 35, 35, 35, 64, 35, 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,
+ 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, 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, 66, 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,
- 67, 1, 68, 68, 68, 68, 68, 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, 72, 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, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 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,
+ 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, 1, 1, 1, 69, 1, 70,
- 70, 70, 70, 70, 48, 48, 48, 48,
+ 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, 48, 48, 48, 70, 48,
- 48, 50, 48, 48, 48, 48, 48, 48,
- 48, 51, 1, 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, 52, 48, 48, 53, 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, 54, 55, 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, 48,
- 48, 48, 56, 48, 71, 71, 71, 71,
- 71, 1, 1, 1, 1, 1, 1, 1,
+ 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, 71, 1, 1, 72, 1,
- 1, 1, 1, 1, 1, 1, 1, 73,
1, 1, 1, 1, 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,
+ 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, 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, 1, 1, 1, 1, 75,
- 1, 76, 76, 76, 76, 76, 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, 80, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
- 76, 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, 1, 1, 1, 1,
1, 1, 1, 1, 1, 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, 81, 1, 1, 1, 1, 1,
1, 1, 1, 1, 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, 76, 76,
- 76, 76, 76, 1, 1, 1, 1, 1,
+ 1, 82, 1, 80, 80, 80, 80, 80,
1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 76, 1, 1,
- 77, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 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, 1,
- 1, 1, 78, 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, 1, 1,
- 1, 79, 1, 71, 71, 71, 71, 71,
1, 1, 1, 1, 1, 1, 1, 1,
+ 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, 71, 1, 1, 72, 1, 1,
- 1, 1, 1, 1, 1, 1, 73, 1,
- 1, 1, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 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, 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, 87, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 75, 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, 81, 1, 1, 1, 1, 1,
- 1, 1, 82, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 83,
+ 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, 45, 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, 84, 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, 86,
- 1, 1, 1, 1, 1, 1, 1, 87,
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,
- 1, 88, 1, 1, 1, 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, 90,
+ 90, 90, 90, 90, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
- 89, 1, 85, 85, 85, 85, 85, 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, 85, 1, 1, 86, 1, 1, 1,
- 1, 1, 1, 1, 87, 1, 1, 1,
- 1, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 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,
1, 1, 1, 1, 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, 1, 1,
- 1, 1, 1, 1, 1, 89, 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, 81, 1, 1, 1, 1, 1, 1,
- 1, 82, 1, 1, 1, 1, 90, 90,
- 90, 90, 90, 90, 90, 90, 90, 90,
- 1, 1, 1, 1, 1, 1, 83, 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, 45, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 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, 84, 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, 93,
+ 1, 67, 67, 67, 67, 67, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 91, 91, 91, 91, 91,
- 91, 91, 91, 91, 91, 1, 1, 1,
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,
- 66, 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, 67,
- 1, 0
+ 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, 26, 3, 4, 20, 5,
- 24, 25, 28, 39, 9, 31, 34, 31,
- 34, 11, 32, 33, 32, 33, 35, 38,
- 14, 15, 18, 15, 18, 16, 17, 36,
- 37, 36, 37, 27, 21, 20, 6, 22,
+ 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, 7, 8, 12, 13, 19, 22,
- 30, 27, 7, 8, 12, 13, 19, 22,
- 30, 29, 22, 30, 29, 30, 30, 29,
- 7, 10, 22, 30, 29, 7, 22, 30,
- 29, 7, 8, 13, 30, 29, 7, 8,
- 22, 30, 38, 39
+ 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, 3, 4, 3, 3, 5,
- 5, 4, 3, 3, 5, 5, 3, 3,
- 4, 4, 4, 0, 0, 6, 4, 3,
- 3, 5, 5, 5, 7, 8, 9, 7,
+ 2, 2, 3, 4, 4, 5, 5, 4,
+ 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, 14, 14, 14, 15, 11,
- 11, 17, 18, 18, 18, 18, 0, 16,
- 16, 19, 19, 19, 0, 0, 13, 20,
- 21, 21, 20, 20, 22, 23, 22, 22,
- 10, 24, 24, 24, 10, 25, 26, 26,
- 25, 25, 5, 5
+ 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, 0, 7, 0, 0, 0,
- 10, 10, 11, 16, 19, 0, 11, 20,
- 22, 22, 20, 10, 25, 25, 10, 19
+ 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;
@@ -460,12 +509,12 @@ _hb_buffer_deserialize_text (hb_buffer_t *buffer,
hb_glyph_info_t info = {0};
hb_glyph_position_t pos = {0};
-#line 457 "hb-buffer-deserialize-text.hh"
+#line 513 "hb-buffer-deserialize-text.hh"
{
cs = deserialize_text_start;
}
-#line 460 "hb-buffer-deserialize-text.hh"
+#line 518 "hb-buffer-deserialize-text.hh"
{
int _slen;
int _trans;
@@ -493,11 +542,11 @@ _resume:
case 1:
#line 38 "hb-buffer-deserialize-text.rl"
{
- hb_memset (&info, 0, sizeof (info));
- hb_memset (&pos , 0, sizeof (pos ));
+ memset (&info, 0, sizeof (info));
+ memset (&pos , 0, sizeof (pos ));
}
break;
- case 4:
+ case 3:
#line 51 "hb-buffer-deserialize-text.rl"
{
tok = p;
@@ -511,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. */
@@ -525,7 +574,7 @@ _resume:
#line 66 "hb-buffer-deserialize-text.rl"
{if (!parse_hex (tok, p, &info.codepoint )) return false; }
break;
- case 24:
+ case 23:
#line 68 "hb-buffer-deserialize-text.rl"
{ if (!parse_uint (tok, p, &info.cluster )) return false; }
break;
@@ -537,26 +586,26 @@ _resume:
#line 70 "hb-buffer-deserialize-text.rl"
{ if (!parse_int (tok, p, &pos.y_offset )) return false; }
break;
- case 21:
+ case 22:
#line 71 "hb-buffer-deserialize-text.rl"
{ if (!parse_int (tok, p, &pos.x_advance)) return false; }
break;
- case 23:
+ case 28:
#line 72 "hb-buffer-deserialize-text.rl"
{ if (!parse_int (tok, p, &pos.y_advance)) return false; }
break;
- case 15:
+ case 16:
#line 38 "hb-buffer-deserialize-text.rl"
{
- hb_memset (&info, 0, sizeof (info));
- hb_memset (&pos , 0, sizeof (pos ));
+ memset (&info, 0, sizeof (info));
+ memset (&pos , 0, sizeof (pos ));
}
#line 51 "hb-buffer-deserialize-text.rl"
{
tok = p;
}
break;
- case 3:
+ case 4:
#line 51 "hb-buffer-deserialize-text.rl"
{
tok = p;
@@ -572,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. */
@@ -590,6 +639,18 @@ _resume:
*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"
{if (!parse_hex (tok, p, &info.codepoint )) return false; }
@@ -626,7 +687,7 @@ _resume:
*end_ptr = p;
}
break;
- case 20:
+ 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"
@@ -638,7 +699,7 @@ _resume:
*end_ptr = p;
}
break;
- case 22:
+ 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"
@@ -650,7 +711,7 @@ _resume:
*end_ptr = p;
}
break;
- case 19:
+ 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"
@@ -665,8 +726,8 @@ _resume:
case 12:
#line 38 "hb-buffer-deserialize-text.rl"
{
- hb_memset (&info, 0, sizeof (info));
- hb_memset (&pos , 0, sizeof (pos ));
+ memset (&info, 0, sizeof (info));
+ memset (&pos , 0, sizeof (pos ));
}
#line 51 "hb-buffer-deserialize-text.rl"
{
@@ -675,11 +736,11 @@ _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"
{
- hb_memset (&info, 0, sizeof (info));
- hb_memset (&pos , 0, sizeof (pos ));
+ memset (&info, 0, sizeof (info));
+ memset (&pos , 0, sizeof (pos ));
}
#line 51 "hb-buffer-deserialize-text.rl"
{
@@ -694,7 +755,7 @@ _resume:
return false;
}
break;
- case 17:
+ case 18:
#line 58 "hb-buffer-deserialize-text.rl"
{
/* TODO Unescape delimiters. */
@@ -714,11 +775,31 @@ _resume:
*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:
#line 38 "hb-buffer-deserialize-text.rl"
{
- hb_memset (&info, 0, sizeof (info));
- hb_memset (&pos , 0, sizeof (pos ));
+ memset (&info, 0, sizeof (info));
+ memset (&pos , 0, sizeof (pos ));
}
#line 51 "hb-buffer-deserialize-text.rl"
{
@@ -741,11 +822,54 @@ _resume:
*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);
+ if (unlikely (!buffer->successful))
+ return false;
+ buffer->pos[buffer->len - 1] = pos;
+ *end_ptr = p;
+}
+ break;
case 13:
#line 38 "hb-buffer-deserialize-text.rl"
{
- hb_memset (&info, 0, sizeof (info));
- hb_memset (&pos , 0, sizeof (pos ));
+ memset (&info, 0, sizeof (info));
+ memset (&pos , 0, sizeof (pos ));
}
#line 51 "hb-buffer-deserialize-text.rl"
{
@@ -770,7 +894,7 @@ _resume:
*end_ptr = p;
}
break;
-#line 715 "hb-buffer-deserialize-text.hh"
+#line 898 "hb-buffer-deserialize-text.hh"
}
_again:
@@ -782,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. */
@@ -836,7 +960,7 @@ _again:
*end_ptr = p;
}
break;
- case 20:
+ 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"
@@ -848,7 +972,7 @@ _again:
*end_ptr = p;
}
break;
- case 22:
+ 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"
@@ -860,7 +984,27 @@ _again:
*end_ptr = p;
}
break;
- case 19:
+ 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"
@@ -875,8 +1019,8 @@ _again:
case 11:
#line 38 "hb-buffer-deserialize-text.rl"
{
- hb_memset (&info, 0, sizeof (info));
- hb_memset (&pos , 0, sizeof (pos ));
+ memset (&info, 0, sizeof (info));
+ memset (&pos , 0, sizeof (pos ));
}
#line 51 "hb-buffer-deserialize-text.rl"
{
@@ -899,7 +1043,7 @@ _again:
*end_ptr = p;
}
break;
-#line 825 "hb-buffer-deserialize-text.hh"
+#line 1047 "hb-buffer-deserialize-text.hh"
}
}
diff --git a/src/hb-buffer-deserialize-text.rl b/src/hb-buffer-deserialize-text.rl
index f82d5ab82..0f33eb89d 100644
--- a/src/hb-buffer-deserialize-text.rl
+++ b/src/hb-buffer-deserialize-text.rl
@@ -36,8 +36,8 @@ alphtype unsigned char;
write data;
action clear_item {
- hb_memset (&info, 0, sizeof (info));
- hb_memset (&pos , 0, sizeof (pos ));
+ memset (&info, 0, sizeof (info));
+ memset (&pos , 0, sizeof (pos ));
}
action add_item {
@@ -76,7 +76,7 @@ unum = '0' | [1-9] digit*;
num = '-'? unum;
glyph_id = unum;
-glyph_name = ([^\\\]=@+,#|] | '\\' [\\\]=@+,|]) *;
+glyph_name = ([^\\\]=@+,|] | '\\' [\\\]=@+,|]) *;
glyph = (glyph_id | glyph_name) >tok %parse_glyph;
cluster = '=' (unum >tok %parse_cluster);
diff --git a/src/hb-buffer-serialize.cc b/src/hb-buffer-serialize.cc
index a458f2318..d1e177543 100644
--- a/src/hb-buffer-serialize.cc
+++ b/src/hb-buffer-serialize.cc
@@ -183,7 +183,7 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
unsigned int l = p - b;
if (buf_size > l)
{
- hb_memcpy (buf, b, l);
+ memcpy (buf, b, l);
buf += l;
buf_size -= l;
*buf_consumed += l;
@@ -241,7 +241,7 @@ _hb_buffer_serialize_unicode_json (hb_buffer_t *buffer,
unsigned int l = p - b;
if (buf_size > l)
{
- hb_memcpy (buf, b, l);
+ memcpy (buf, b, l);
buf += l;
buf_size -= l;
*buf_consumed += l;
@@ -329,7 +329,7 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
unsigned int l = p - b;
if (buf_size > l)
{
- hb_memcpy (buf, b, l);
+ memcpy (buf, b, l);
buf += l;
buf_size -= l;
*buf_consumed += l;
@@ -381,7 +381,7 @@ _hb_buffer_serialize_unicode_text (hb_buffer_t *buffer,
unsigned int l = p - b;
if (buf_size > l)
{
- hb_memcpy (buf, b, l);
+ memcpy (buf, b, l);
buf += l;
buf_size -= l;
*buf_consumed += l;
diff --git a/src/hb-buffer-verify.cc b/src/hb-buffer-verify.cc
index 1cd52b39b..5453e1ca9 100644
--- a/src/hb-buffer-verify.cc
+++ b/src/hb-buffer-verify.cc
@@ -186,7 +186,7 @@ buffer_verify_unsafe_to_break (hb_buffer_t *buffer,
bool ret = true;
hb_buffer_diff_flags_t diff = hb_buffer_diff (reconstruction, buffer, (hb_codepoint_t) -1, 0);
- if (diff & ~HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH)
+ if (diff)
{
buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "unsafe-to-break test failed.");
ret = false;
@@ -313,6 +313,7 @@ buffer_verify_unsafe_to_concat (hb_buffer_t *buffer,
bool ret = true;
hb_buffer_diff_flags_t diff;
+
/*
* Shape the two fragment streams.
*/
@@ -381,7 +382,7 @@ buffer_verify_unsafe_to_concat (hb_buffer_t *buffer,
* Diff results.
*/
diff = hb_buffer_diff (reconstruction, buffer, (hb_codepoint_t) -1, 0);
- if (diff & ~HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH)
+ if (diff)
{
buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "unsafe-to-concat test failed.");
ret = false;
diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc
index 4b6c2d9ea..57a5ae03e 100644
--- a/src/hb-buffer.cc
+++ b/src/hb-buffer.cc
@@ -172,13 +172,12 @@ hb_buffer_t::enlarge (unsigned int size)
while (size >= new_allocated)
new_allocated += (new_allocated >> 1) + 32;
- unsigned new_bytes;
- if (unlikely (hb_unsigned_mul_overflows (new_allocated, sizeof (info[0]), &new_bytes)))
+ static_assert ((sizeof (info[0]) == sizeof (pos[0])), "");
+ if (unlikely (hb_unsigned_mul_overflows (new_allocated, sizeof (info[0]))))
goto done;
- static_assert (sizeof (info[0]) == sizeof (pos[0]), "");
- new_pos = (hb_glyph_position_t *) hb_realloc (pos, new_bytes);
- new_info = (hb_glyph_info_t *) hb_realloc (info, new_bytes);
+ new_pos = (hb_glyph_position_t *) hb_realloc (pos, new_allocated * sizeof (pos[0]));
+ new_info = (hb_glyph_info_t *) hb_realloc (info, new_allocated * sizeof (info[0]));
done:
if (unlikely (!new_pos || !new_info))
@@ -209,7 +208,7 @@ hb_buffer_t::make_room_for (unsigned int num_in,
assert (have_output);
out_info = (hb_glyph_info_t *) pos;
- hb_memcpy (out_info, info, out_len * sizeof (out_info[0]));
+ memcpy (out_info, info, out_len * sizeof (out_info[0]));
}
return true;
@@ -230,7 +229,7 @@ hb_buffer_t::shift_forward (unsigned int count)
* Ideally, we should at least set Default_Ignorable bits on
* these, as well as consistent cluster values. But the former
* is layering violation... */
- hb_memset (info + len, 0, (idx + count - len) * sizeof (info[0]));
+ memset (info + len, 0, (idx + count - len) * sizeof (info[0]));
}
len += count;
idx += count;
@@ -299,8 +298,8 @@ hb_buffer_t::clear ()
out_len = 0;
out_info = info;
- hb_memset (context, 0, sizeof context);
- hb_memset (context_len, 0, sizeof context_len);
+ memset (context, 0, sizeof context);
+ memset (context_len, 0, sizeof context_len);
deallocate_var_all ();
serial = 0;
@@ -314,14 +313,15 @@ hb_buffer_t::enter ()
serial = 0;
shaping_failed = false;
scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
- unsigned mul;
- if (likely (!hb_unsigned_mul_overflows (len, HB_BUFFER_MAX_LEN_FACTOR, &mul)))
+ if (likely (!hb_unsigned_mul_overflows (len, HB_BUFFER_MAX_LEN_FACTOR)))
{
- max_len = hb_max (mul, (unsigned) HB_BUFFER_MAX_LEN_MIN);
+ max_len = hb_max (len * HB_BUFFER_MAX_LEN_FACTOR,
+ (unsigned) HB_BUFFER_MAX_LEN_MIN);
}
- if (likely (!hb_unsigned_mul_overflows (len, HB_BUFFER_MAX_OPS_FACTOR, &mul)))
+ if (likely (!hb_unsigned_mul_overflows (len, HB_BUFFER_MAX_OPS_FACTOR)))
{
- max_ops = hb_max (mul, (unsigned) HB_BUFFER_MAX_OPS_MIN);
+ max_ops = hb_max (len * HB_BUFFER_MAX_OPS_FACTOR,
+ (unsigned) HB_BUFFER_MAX_OPS_MIN);
}
}
void
@@ -345,7 +345,7 @@ hb_buffer_t::add (hb_codepoint_t codepoint,
glyph = &info[len];
- hb_memset (glyph, 0, sizeof (*glyph));
+ memset (glyph, 0, sizeof (*glyph));
glyph->codepoint = codepoint;
glyph->mask = 0;
glyph->cluster = cluster;
@@ -606,53 +606,6 @@ done:
}
void
-hb_buffer_t::delete_glyphs_inplace (bool (*filter) (const hb_glyph_info_t *info))
-{
- /* Merge clusters and delete filtered glyphs.
- * NOTE! We can't use out-buffer as we have positioning data. */
- unsigned int j = 0;
- unsigned int count = len;
- for (unsigned int i = 0; i < count; i++)
- {
- if (filter (&info[i]))
- {
- /* Merge clusters.
- * Same logic as delete_glyph(), but for in-place removal. */
-
- unsigned int cluster = info[i].cluster;
- if (i + 1 < count && cluster == info[i + 1].cluster)
- continue; /* Cluster survives; do nothing. */
-
- if (j)
- {
- /* Merge cluster backward. */
- if (cluster < info[j - 1].cluster)
- {
- unsigned int mask = info[i].mask;
- unsigned int old_cluster = info[j - 1].cluster;
- for (unsigned k = j; k && info[k - 1].cluster == old_cluster; k--)
- set_cluster (info[k - 1], cluster, mask);
- }
- continue;
- }
-
- if (i + 1 < count)
- merge_clusters (i, i + 2); /* Merge cluster forward. */
-
- continue;
- }
-
- if (j != i)
- {
- info[j] = info[i];
- pos[j] = pos[i];
- }
- j++;
- }
- len = j;
-}
-
-void
hb_buffer_t::guess_segment_properties ()
{
assert_unicode ();
@@ -980,6 +933,7 @@ hb_buffer_get_unicode_funcs (const hb_buffer_t *buffer)
void
hb_buffer_set_direction (hb_buffer_t *buffer,
hb_direction_t direction)
+
{
if (unlikely (hb_object_is_immutable (buffer)))
return;
@@ -1431,9 +1385,9 @@ hb_buffer_set_length (hb_buffer_t *buffer,
/* Wipe the new space */
if (length > buffer->len) {
- hb_memset (buffer->info + buffer->len, 0, sizeof (buffer->info[0]) * (length - buffer->len));
+ memset (buffer->info + buffer->len, 0, sizeof (buffer->info[0]) * (length - buffer->len));
if (buffer->have_positions)
- hb_memset (buffer->pos + buffer->len, 0, sizeof (buffer->pos[0]) * (length - buffer->len));
+ memset (buffer->pos + buffer->len, 0, sizeof (buffer->pos[0]) * (length - buffer->len));
}
buffer->len = length;
@@ -1841,9 +1795,7 @@ hb_buffer_add_latin1 (hb_buffer_t *buffer,
* marks at stat of run.
*
* This function does not check the validity of @text, it is up to the caller
- * to ensure it contains a valid Unicode scalar values. In contrast,
- * hb_buffer_add_utf32() can be used that takes similar input but performs
- * sanity-check on the input.
+ * to ensure it contains a valid Unicode code points.
*
* Since: 0.9.31
**/
@@ -1906,9 +1858,9 @@ hb_buffer_append (hb_buffer_t *buffer,
hb_segment_properties_overlay (&buffer->props, &source->props);
- hb_memcpy (buffer->info + orig_len, source->info + start, (end - start) * sizeof (buffer->info[0]));
+ memcpy (buffer->info + orig_len, source->info + start, (end - start) * sizeof (buffer->info[0]));
if (buffer->have_positions)
- hb_memcpy (buffer->pos + orig_len, source->pos + start, (end - start) * sizeof (buffer->pos[0]));
+ memcpy (buffer->pos + orig_len, source->pos + start, (end - start) * sizeof (buffer->pos[0]));
if (source->content_type == HB_BUFFER_CONTENT_TYPE_UNICODE)
{
@@ -2096,7 +2048,7 @@ hb_buffer_diff (hb_buffer_t *buffer,
result |= HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH;
if (buf_info->cluster != ref_info->cluster)
result |= HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH;
- if ((buf_info->mask ^ ref_info->mask) & HB_GLYPH_FLAG_DEFINED)
+ if ((buf_info->mask & ~ref_info->mask & HB_GLYPH_FLAG_DEFINED))
result |= HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH;
if (contains && ref_info->codepoint == dottedcircle_glyph)
result |= HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT;
@@ -2151,13 +2103,6 @@ hb_buffer_set_message_func (hb_buffer_t *buffer,
hb_buffer_message_func_t func,
void *user_data, hb_destroy_func_t destroy)
{
- if (unlikely (hb_object_is_immutable (buffer)))
- {
- if (destroy)
- destroy (user_data);
- return;
- }
-
if (buffer->message_destroy)
buffer->message_destroy (buffer->message_data);
diff --git a/src/hb-buffer.hh b/src/hb-buffer.hh
index bb1efe9dd..26c3f0fac 100644
--- a/src/hb-buffer.hh
+++ b/src/hb-buffer.hh
@@ -32,7 +32,6 @@
#include "hb.hh"
#include "hb-unicode.hh"
-#include "hb-set-digest.hh"
#ifndef HB_BUFFER_MAX_LEN_FACTOR
@@ -208,14 +207,6 @@ struct hb_buffer_t
hb_glyph_info_t &prev () { return out_info[out_len ? out_len - 1 : 0]; }
hb_glyph_info_t prev () const { return out_info[out_len ? out_len - 1 : 0]; }
- hb_set_digest_t digest () const
- {
- hb_set_digest_t d;
- d.init ();
- d.add_array (&info[0].codepoint, len, sizeof (info[0]));
- return d;
- }
-
HB_INTERNAL void similar (const hb_buffer_t &src);
HB_INTERNAL void reset ();
HB_INTERNAL void clear ();
@@ -411,8 +402,6 @@ struct hb_buffer_t
HB_INTERNAL void merge_out_clusters (unsigned int start, unsigned int end);
/* Merge clusters for deleting current glyph, and skip it. */
HB_INTERNAL void delete_glyph ();
- HB_INTERNAL void delete_glyphs_inplace (bool (*filter) (const hb_glyph_info_t *info));
-
/* Adds glyph flags in mask to infos with clusters between start and end.
diff --git a/src/hb-cache.hh b/src/hb-cache.hh
index f8c8108f1..897f313fb 100644
--- a/src/hb-cache.hh
+++ b/src/hb-cache.hh
@@ -46,7 +46,7 @@ struct hb_cache_t
>::type;
static_assert ((key_bits >= cache_bits), "");
- static_assert ((key_bits + value_bits <= cache_bits + 8 * sizeof (item_t)), "");
+ static_assert ((key_bits + value_bits - cache_bits <= 8 * sizeof (item_t)), "");
void init () { clear (); }
void fini () {}
diff --git a/src/hb-cff-interp-common.hh b/src/hb-cff-interp-common.hh
index 49805a89c..5c2cb060a 100644
--- a/src/hb-cff-interp-common.hh
+++ b/src/hb-cff-interp-common.hh
@@ -284,56 +284,65 @@ struct UnsizedByteStr : UnsizedArrayOf <HBUINT8>
/* A byte string associated with the current offset and an error condition */
struct byte_str_ref_t
{
- byte_str_ref_t ()
- : str () {}
+ byte_str_ref_t () { init (); }
+
+ void init ()
+ {
+ str = hb_ubytes_t ();
+ offset = 0;
+ error = false;
+ }
+
+ void fini () {}
byte_str_ref_t (const hb_ubytes_t &str_, unsigned int offset_ = 0)
- : str (str_) { set_offset (offset_); }
+ : str (str_), offset (offset_), error (false) {}
void reset (const hb_ubytes_t &str_, unsigned int offset_ = 0)
{
str = str_;
- set_offset (offset_);
+ offset = offset_;
+ error = false;
}
const unsigned char& operator [] (int i) {
- if (unlikely ((unsigned int) (get_offset () + i) >= str.length))
+ if (unlikely ((unsigned int) (offset + i) >= str.length))
{
set_error ();
return Null (unsigned char);
}
- return str.arrayZ[get_offset () + i];
+ return str[offset + i];
}
- unsigned char head_unchecked () const { return str.arrayZ[get_offset ()]; }
-
/* Conversion to hb_ubytes_t */
- operator hb_ubytes_t () const { return str.sub_array (get_offset ()); }
+ operator hb_ubytes_t () const { return str.sub_array (offset, str.length - offset); }
hb_ubytes_t sub_array (unsigned int offset_, unsigned int len_) const
{ return str.sub_array (offset_, len_); }
bool avail (unsigned int count=1) const
- { return get_offset () + count <= str.length; }
+ { return (!in_error () && offset + count <= str.length); }
void inc (unsigned int count=1)
{
- /* Automatically puts us in error if count is out-of-range. */
- set_offset (get_offset () + count);
+ if (likely (!in_error () && (offset <= str.length) && (offset + count <= str.length)))
+ {
+ offset += count;
+ }
+ else
+ {
+ offset = str.length;
+ set_error ();
+ }
}
- /* We (ab)use ubytes backwards_length as a cursor (called offset),
- * as well as to store error condition. */
-
- unsigned get_offset () const { return str.backwards_length; }
- void set_offset (unsigned offset) { str.backwards_length = offset; }
-
- void set_error () { str.backwards_length = str.length + 1; }
- bool in_error () const { return str.backwards_length > str.length; }
+ void set_error () { error = true; }
+ bool in_error () const { return error; }
- unsigned total_size () const { return str.length; }
+ hb_ubytes_t str;
+ unsigned int offset; /* beginning of the sub-string within str */
protected:
- hb_ubytes_t str;
+ bool error;
};
using byte_str_array_t = hb_vector_t<hb_ubytes_t>;
@@ -482,15 +491,8 @@ struct arg_stack_t : cff_stack_t<ARG, 513>
/* an operator prefixed by its operands in a byte string */
struct op_str_t
{
- /* This used to have a hb_ubytes_t. Using a pointer and length
- * in a particular order, saves 8 bytes in this struct and more
- * in our parsed_cs_op_t subclass. */
-
- const unsigned char *ptr = nullptr;
-
+ hb_ubytes_t str;
op_code_t op;
-
- uint8_t length = 0;
};
/* base of OP_SERIALIZER */
@@ -501,11 +503,9 @@ struct op_serializer_t
{
TRACE_SERIALIZE (this);
- unsigned char *d = c->allocate_size<unsigned char> (opstr.length);
+ HBUINT8 *d = c->allocate_size<HBUINT8> (opstr.str.length);
if (unlikely (!d)) return_trace (false);
- /* Faster than hb_memcpy for small strings. */
- for (unsigned i = 0; i < opstr.length; i++)
- d[i] = opstr.ptr[i];
+ memcpy (d, &opstr.str[0], opstr.str.length);
return_trace (true);
}
};
@@ -529,20 +529,16 @@ struct parsed_values_t
{
VAL *val = values.push ();
val->op = op;
- auto arr = str_ref.sub_array (opStart, str_ref.get_offset () - opStart);
- val->ptr = arr.arrayZ;
- val->length = arr.length;
- opStart = str_ref.get_offset ();
+ val->str = str_ref.str.sub_array (opStart, str_ref.offset - opStart);
+ opStart = str_ref.offset;
}
void add_op (op_code_t op, const byte_str_ref_t& str_ref, const VAL &v)
{
VAL *val = values.push (v);
val->op = op;
- auto arr = str_ref.sub_array (opStart, str_ref.get_offset () - opStart);
- val->ptr = arr.arrayZ;
- val->length = arr.length;
- opStart = str_ref.get_offset ();
+ val->str = str_ref.sub_array ( opStart, str_ref.offset - opStart);
+ opStart = str_ref.offset;
}
bool has_op (op_code_t op) const
@@ -553,7 +549,8 @@ struct parsed_values_t
}
unsigned get_count () const { return values.length; }
- const VAL &operator [] (unsigned int i) const { return values[i]; }
+ const VAL &get_value (unsigned int i) const { return values[i]; }
+ const VAL &operator [] (unsigned int i) const { return get_value (i); }
unsigned int opStart;
hb_vector_t<VAL> values;
@@ -568,23 +565,23 @@ struct interp_env_t
str_ref.reset (str_);
}
bool in_error () const
- { return str_ref.in_error () || argStack.in_error (); }
+ { return error || str_ref.in_error () || argStack.in_error (); }
- void set_error () { str_ref.set_error (); }
+ void set_error () { error = true; }
op_code_t fetch_op ()
{
op_code_t op = OpCode_Invalid;
if (unlikely (!str_ref.avail ()))
return OpCode_Invalid;
- op = (op_code_t) str_ref.head_unchecked ();
- str_ref.inc ();
+ op = (op_code_t)(unsigned char)str_ref[0];
if (op == OpCode_escape) {
if (unlikely (!str_ref.avail ()))
return OpCode_Invalid;
- op = Make_OpCode_ESC (str_ref.head_unchecked ());
+ op = Make_OpCode_ESC(str_ref[1]);
str_ref.inc ();
}
+ str_ref.inc ();
return op;
}
@@ -599,6 +596,8 @@ struct interp_env_t
str_ref;
arg_stack_t<ARG>
argStack;
+ protected:
+ bool error = false;
};
using num_interp_env_t = interp_env_t<>;
diff --git a/src/hb-cff2-interp-cs.hh b/src/hb-cff2-interp-cs.hh
index 00c25800e..d0b9e7b08 100644
--- a/src/hb-cff2-interp-cs.hh
+++ b/src/hb-cff2-interp-cs.hh
@@ -40,15 +40,13 @@ struct blend_arg_t : number_t
void set_real (double v) { reset_blends (); number_t::set_real (v); }
void set_blends (unsigned int numValues_, unsigned int valueIndex_,
- hb_array_t<const blend_arg_t> blends_)
+ unsigned int numBlends, hb_array_t<const blend_arg_t> blends_)
{
numValues = numValues_;
valueIndex = valueIndex_;
- unsigned numBlends = blends_.length;
- if (unlikely (!deltas.resize (numBlends)))
- return;
+ deltas.resize (numBlends);
for (unsigned int i = 0; i < numBlends; i++)
- deltas.arrayZ[i] = blends_.arrayZ[i];
+ deltas[i] = blends_[i];
}
bool blending () const { return deltas.length > 0; }
@@ -63,6 +61,7 @@ struct blend_arg_t : number_t
hb_vector_t<number_t> deltas;
};
+typedef interp_env_t<blend_arg_t> BlendInterpEnv;
typedef biased_subrs_t<CFF2Subrs> cff2_biased_subrs_t;
template <typename ELEM>
@@ -155,9 +154,8 @@ struct cff2_cs_interp_env_t : cs_interp_env_t<ELEM, CFF2Subrs>
{
if (likely (scalars.length == deltas.length))
{
- unsigned count = scalars.length;
- for (unsigned i = 0; i < count; i++)
- v += (double) scalars.arrayZ[i] * deltas.arrayZ[i].to_real ();
+ for (unsigned int i = 0; i < scalars.length; i++)
+ v += (double) scalars[i] * deltas[i].to_real ();
}
}
return v;
@@ -222,7 +220,7 @@ struct cff2_cs_opset_t : cs_opset_t<ELEM, OPSET, cff2_cs_interp_env_t<ELEM>, PAR
const hb_array_t<const ELEM> blends,
unsigned n, unsigned i)
{
- arg.set_blends (n, i, blends);
+ arg.set_blends (n, i, blends.length, blends);
}
template <typename T = ELEM,
hb_enable_if (!hb_is_same (T, blend_arg_t))>
diff --git a/src/hb-common.cc b/src/hb-common.cc
index e9f9cfeb5..bbb6cd552 100644
--- a/src/hb-common.cc
+++ b/src/hb-common.cc
@@ -285,7 +285,7 @@ struct hb_language_item_t {
lang = (hb_language_t) hb_malloc(len);
if (likely (lang))
{
- hb_memcpy((unsigned char *) lang, s, len);
+ memcpy((unsigned char *) lang, s, len);
for (unsigned char *p = (unsigned char *) lang; *p; p++)
*p = canon_map[*p];
}
@@ -379,7 +379,7 @@ hb_language_from_string (const char *str, int len)
/* NUL-terminate it. */
char strbuf[64];
len = hb_min (len, (int) sizeof (strbuf) - 1);
- hb_memcpy (strbuf, str, len);
+ memcpy (strbuf, str, len);
strbuf[len] = '\0';
item = lang_find_or_insert (strbuf);
}
@@ -976,7 +976,7 @@ hb_feature_from_string (const char *str, int len,
}
if (feature)
- hb_memset (feature, 0, sizeof (*feature));
+ memset (feature, 0, sizeof (*feature));
return false;
}
@@ -1025,7 +1025,7 @@ hb_feature_to_string (hb_feature_t *feature,
}
assert (len < ARRAY_LENGTH (s));
len = hb_min (len, size - 1);
- hb_memcpy (buf, s, len);
+ memcpy (buf, s, len);
buf[len] = '\0';
}
@@ -1088,7 +1088,7 @@ hb_variation_from_string (const char *str, int len,
}
if (variation)
- hb_memset (variation, 0, sizeof (*variation));
+ memset (variation, 0, sizeof (*variation));
return false;
}
@@ -1136,7 +1136,7 @@ get_C_locale ()
/**
* hb_variation_to_string:
* @variation: an #hb_variation_t to convert
- * @buf: (array length=size) (out caller-allocates): output string
+ * @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
@@ -1166,7 +1166,7 @@ hb_variation_to_string (hb_variation_t *variation,
assert (len < ARRAY_LENGTH (s));
len = hb_min (len, size - 1);
- hb_memcpy (buf, s, len);
+ memcpy (buf, s, len);
buf[len] = '\0';
}
diff --git a/src/hb-config.hh b/src/hb-config.hh
index 98b1e9d0c..d56617f6a 100644
--- a/src/hb-config.hh
+++ b/src/hb-config.hh
@@ -35,9 +35,8 @@
#include "config.h"
#endif
-#ifndef HB_EXPERIMENTAL_API
-#define HB_NO_BEYOND_64K
-#define HB_NO_VAR_COMPOSITES
+#ifndef HB_BORING_EXPANSION
+#define HB_NO_BORING_EXPANSION
#endif
#ifdef HB_TINY
@@ -85,7 +84,6 @@
#define HB_NO_OT_SHAPE_FRACTIONS
#define HB_NO_STYLE
#define HB_NO_SUBSET_LAYOUT
-#define HB_NO_VERTICAL
#define HB_NO_VAR
#endif
@@ -106,7 +104,7 @@
#ifdef HB_NO_BORING_EXPANSION
#define HB_NO_BEYOND_64K
-#define HB_NO_AVAR2
+#define HB_NO_VARIATIONS2
#endif
#ifdef HB_DISABLE_DEPRECATED
@@ -115,11 +113,6 @@
#define HB_IF_NOT_DEPRECATED(x) x
#endif
-#ifdef HB_NO_SHAPER
-#define HB_NO_OT_SHAPE
-#define HB_NO_AAT_SHAPE
-#endif
-
#ifdef HB_NO_AAT
#define HB_NO_OT_NAME_LANGUAGE_AAT
#define HB_NO_AAT_SHAPE
@@ -166,7 +159,6 @@
#define HB_NO_OT_SHAPER_HEBREW_FALLBACK
#define HB_NO_OT_SHAPER_THAI_FALLBACK
#define HB_NO_OT_SHAPER_VOWEL_CONSTRAINTS
-#define HB_NO_OT_SHAPER_MYANMAR_ZAWGYI
#endif
#ifdef NDEBUG
diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc
index 4267e0e13..99b33c001 100644
--- a/src/hb-coretext.cc
+++ b/src/hb-coretext.cc
@@ -347,13 +347,10 @@ _hb_coretext_shaper_font_data_create (hb_font_t *font)
hb_ot_var_axis_info_t info;
unsigned int c = 1;
hb_ot_var_get_axis_infos (font->face, i, &c, &info);
- float v = hb_clamp (font->design_coords[i], info.min_value, info.max_value);
-
- CFNumberRef tag_number = CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &info.tag);
- CFNumberRef value_number = CFNumberCreate (kCFAllocatorDefault, kCFNumberFloatType, &v);
- CFDictionarySetValue (variations, tag_number, value_number);
- CFRelease (tag_number);
- CFRelease (value_number);
+ CFDictionarySetValue (variations,
+ CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &info.tag),
+ CFNumberCreate (kCFAllocatorDefault, kCFNumberFloatType, &font->design_coords[i])
+ );
}
CFDictionaryRef attributes =
@@ -651,7 +648,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan,
} else {
active_feature_t *feature = active_features.lsearch (event->feature);
if (feature)
- active_features.remove_ordered (feature - active_features.arrayZ);
+ active_features.remove (feature - active_features.arrayZ);
}
}
}
diff --git a/src/hb-draw.cc b/src/hb-draw.cc
index 72c203f24..46797e64e 100644
--- a/src/hb-draw.cc
+++ b/src/hb-draw.cc
@@ -80,56 +80,6 @@ hb_draw_close_path_nil (hb_draw_funcs_t *dfuncs HB_UNUSED, void *draw_data HB_UN
void *user_data HB_UNUSED) {}
-static bool
-_hb_draw_funcs_set_preamble (hb_draw_funcs_t *dfuncs,
- bool func_is_null,
- void **user_data,
- hb_destroy_func_t *destroy)
-{
- if (hb_object_is_immutable (dfuncs))
- {
- if (*destroy)
- (*destroy) (*user_data);
- return false;
- }
-
- if (func_is_null)
- {
- if (*destroy)
- (*destroy) (*user_data);
- *destroy = nullptr;
- *user_data = nullptr;
- }
-
- return true;
-}
-
-static bool
-_hb_draw_funcs_set_middle (hb_draw_funcs_t *dfuncs,
- void *user_data,
- hb_destroy_func_t destroy)
-{
- if (user_data && !dfuncs->user_data)
- {
- dfuncs->user_data = (decltype (dfuncs->user_data)) hb_calloc (1, sizeof (*dfuncs->user_data));
- if (unlikely (!dfuncs->user_data))
- goto fail;
- }
- if (destroy && !dfuncs->destroy)
- {
- dfuncs->destroy = (decltype (dfuncs->destroy)) hb_calloc (1, sizeof (*dfuncs->destroy));
- if (unlikely (!dfuncs->destroy))
- goto fail;
- }
-
- return true;
-
-fail:
- if (destroy)
- (destroy) (user_data);
- return false;
-}
-
#define HB_DRAW_FUNC_IMPLEMENT(name) \
\
void \
@@ -138,24 +88,43 @@ hb_draw_funcs_set_##name##_func (hb_draw_funcs_t *dfuncs, \
void *user_data, \
hb_destroy_func_t destroy) \
{ \
- if (!_hb_draw_funcs_set_preamble (dfuncs, !func, &user_data, &destroy))\
- return; \
+ if (hb_object_is_immutable (dfuncs)) \
+ return; \
\
if (dfuncs->destroy && dfuncs->destroy->name) \
dfuncs->destroy->name (!dfuncs->user_data ? nullptr : dfuncs->user_data->name); \
\
- if (!_hb_draw_funcs_set_middle (dfuncs, user_data, destroy)) \
- return; \
+ if (user_data && !dfuncs->user_data) \
+ { \
+ dfuncs->user_data = (decltype (dfuncs->user_data)) hb_calloc (1, sizeof (*dfuncs->user_data)); \
+ if (unlikely (!dfuncs->user_data)) \
+ goto fail; \
+ } \
+ if (destroy && !dfuncs->destroy) \
+ { \
+ dfuncs->destroy = (decltype (dfuncs->destroy)) hb_calloc (1, sizeof (*dfuncs->destroy)); \
+ if (unlikely (!dfuncs->destroy)) \
+ goto fail; \
+ } \
\
- if (func) \
+ if (func) { \
dfuncs->func.name = func; \
- else \
+ if (dfuncs->user_data) \
+ dfuncs->user_data->name = user_data; \
+ if (dfuncs->destroy) \
+ dfuncs->destroy->name = destroy; \
+ } else { \
dfuncs->func.name = hb_draw_##name##_nil; \
- \
- if (dfuncs->user_data) \
- dfuncs->user_data->name = user_data; \
- if (dfuncs->destroy) \
- dfuncs->destroy->name = destroy; \
+ if (dfuncs->user_data) \
+ dfuncs->user_data->name = nullptr; \
+ if (dfuncs->destroy) \
+ dfuncs->destroy->name = nullptr; \
+ } \
+ return; \
+ \
+fail: \
+ if (destroy) \
+ destroy (user_data); \
}
HB_DRAW_FUNCS_IMPLEMENT_CALLBACKS
diff --git a/src/hb-face.cc b/src/hb-face.cc
index 8b4b635c7..e7deb31dd 100644
--- a/src/hb-face.cc
+++ b/src/hb-face.cc
@@ -288,7 +288,6 @@ hb_face_destroy (hb_face_t *face)
{
if (!hb_object_destroy (face)) return;
-#ifndef HB_NO_SHAPER
for (hb_face_t::plan_node_t *node = face->shape_plans; node; )
{
hb_face_t::plan_node_t *next = node->next;
@@ -296,7 +295,6 @@ hb_face_destroy (hb_face_t *face)
hb_free (node);
node = next;
}
-#endif
face->data.fini ();
face->table.fini ();
@@ -638,7 +636,7 @@ hb_face_collect_variation_unicodes (hb_face_t *face,
struct face_table_info_t
{
hb_blob_t* data;
- signed order;
+ unsigned order;
};
struct hb_face_builder_data_t
@@ -786,16 +784,16 @@ hb_face_builder_create ()
hb_bool_t
hb_face_builder_add_table (hb_face_t *face, hb_tag_t tag, hb_blob_t *blob)
{
- if (unlikely (face->destroy != (hb_destroy_func_t) _hb_face_builder_data_destroy))
+ if (tag == HB_MAP_VALUE_INVALID)
return false;
- if (tag == HB_MAP_VALUE_INVALID)
+ if (unlikely (face->destroy != (hb_destroy_func_t) _hb_face_builder_data_destroy))
return false;
hb_face_builder_data_t *data = (hb_face_builder_data_t *) face->user_data;
hb_blob_t* previous = data->tables.get (tag).data;
- if (!data->tables.set (tag, face_table_info_t {hb_blob_reference (blob), -1}))
+ if (!data->tables.set (tag, face_table_info_t {hb_blob_reference (blob), 0}))
{
hb_blob_destroy (blob);
return false;
@@ -821,16 +819,13 @@ void
hb_face_builder_sort_tables (hb_face_t *face,
const hb_tag_t *tags)
{
- if (unlikely (face->destroy != (hb_destroy_func_t) _hb_face_builder_data_destroy))
- return;
-
hb_face_builder_data_t *data = (hb_face_builder_data_t *) face->user_data;
// Sort all unspecified tables after any specified tables.
for (auto& info : data->tables.values_ref())
- info.order = (unsigned) -1;
+ info.order = -1;
- signed order = 0;
+ unsigned order = 0;
for (const hb_tag_t* tag = tags;
*tag;
tag++)
diff --git a/src/hb-face.hh b/src/hb-face.hh
index 1bf0606e5..12e10d01e 100644
--- a/src/hb-face.hh
+++ b/src/hb-face.hh
@@ -65,9 +65,7 @@ struct hb_face_t
hb_shape_plan_t *shape_plan;
plan_node_t *next;
};
-#ifndef HB_NO_SHAPER
hb_atomic_ptr_t<plan_node_t> shape_plans;
-#endif
hb_blob_t *reference_table (hb_tag_t tag) const
{
diff --git a/src/hb-fallback-shape.cc b/src/hb-fallback-shape.cc
index c54ad8764..f8524ecc8 100644
--- a/src/hb-fallback-shape.cc
+++ b/src/hb-fallback-shape.cc
@@ -75,6 +75,16 @@ _hb_fallback_shape (hb_shape_plan_t *shape_plan HB_UNUSED,
const hb_feature_t *features HB_UNUSED,
unsigned int num_features HB_UNUSED)
{
+ /* TODO
+ *
+ * - Apply fallback kern.
+ * - Handle Variation Selectors?
+ * - Apply normalization?
+ *
+ * This will make the fallback shaper into a dumb "TrueType"
+ * shaper which many people unfortunately still request.
+ */
+
hb_codepoint_t space;
bool has_space = (bool) font->get_nominal_glyph (' ', &space);
diff --git a/src/hb-features.h.in b/src/hb-features.h.in
deleted file mode 100644
index 30ebf6519..000000000
--- a/src/hb-features.h.in
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright © 2022 Red Hat, 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.
- */
-
-#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
-#error "Include <hb.h> instead."
-#endif
-
-#ifndef HB_FEATURES_H
-#define HB_FEATURES_H
-
-#include "hb-common.h"
-
-HB_BEGIN_DECLS
-
-
-/**
- * HB_HAS_FREETYPE:
- *
- * Defined if Harfbuzz has been built with Freetype support.
- */
-#mesondefine HB_HAS_FREETYPE
-
-/**
- * HB_HAS_GDI:
- *
- * Defined if Harfbuzz has been built with GDI support.
- */
-#mesondefine HB_HAS_GDI
-
-/**
- * HB_HAS_GRAPHITE:
- *
- * Defined if Harfbuzz has been built with Graphite support.
- */
-#mesondefine HB_HAS_GRAPHITE
-
-/**
- * HB_HAS_GLIB:
- *
- * Defined if Harfbuzz has been built with GLib support.
- */
-#mesondefine HB_HAS_GLIB
-
-/**
- * HB_HAS_UNISCRIBE:
- *
- * Defined if Harfbuzz has been built with Uniscribe support.
- */
-#mesondefine HB_HAS_UNISCRIBE
-
-/**
- * HB_HAS_DIRECTWRITE:
- *
- * Defined if Harfbuzz has been built with DirectWrite support.
- */
-#mesondefine HB_HAS_DIRECTWRITE
-
-/**
- * HB_HAS_CORETEXT:
- *
- * Defined if Harfbuzz has been built with CoreText support.
- */
-#mesondefine HB_HAS_CORETEXT
-
-/**
- * HB_HAS_ICU:
- *
- * Defined if Harfbuzz has been built with ICU support.
- */
-#mesondefine HB_HAS_ICU
-
-
-HB_END_DECLS
-
-#endif /* HB_FEATURES_H */
diff --git a/src/hb-font.cc b/src/hb-font.cc
index 0ce3e2608..856bbdda3 100644
--- a/src/hb-font.cc
+++ b/src/hb-font.cc
@@ -71,7 +71,7 @@ hb_font_get_font_h_extents_nil (hb_font_t *font HB_UNUSED,
hb_font_extents_t *extents,
void *user_data HB_UNUSED)
{
- hb_memset (extents, 0, sizeof (*extents));
+ memset (extents, 0, sizeof (*extents));
return false;
}
@@ -96,7 +96,7 @@ hb_font_get_font_v_extents_nil (hb_font_t *font HB_UNUSED,
hb_font_extents_t *extents,
void *user_data HB_UNUSED)
{
- hb_memset (extents, 0, sizeof (*extents));
+ memset (extents, 0, sizeof (*extents));
return false;
}
@@ -409,7 +409,7 @@ hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED,
hb_glyph_extents_t *extents,
void *user_data HB_UNUSED)
{
- hb_memset (extents, 0, sizeof (*extents));
+ memset (extents, 0, sizeof (*extents));
return false;
}
@@ -518,7 +518,6 @@ typedef struct hb_font_get_glyph_shape_default_adaptor_t {
void *draw_data;
float x_scale;
float y_scale;
- float slant;
} hb_font_get_glyph_shape_default_adaptor_t;
static void
@@ -531,10 +530,9 @@ hb_draw_move_to_default (hb_draw_funcs_t *dfuncs HB_UNUSED,
hb_font_get_glyph_shape_default_adaptor_t *adaptor = (hb_font_get_glyph_shape_default_adaptor_t *) draw_data;
float x_scale = adaptor->x_scale;
float y_scale = adaptor->y_scale;
- float slant = adaptor->slant;
adaptor->draw_funcs->emit_move_to (adaptor->draw_data, *st,
- x_scale * to_x + slant * to_y, y_scale * to_y);
+ x_scale * to_x, y_scale * to_y);
}
static void
@@ -546,13 +544,12 @@ hb_draw_line_to_default (hb_draw_funcs_t *dfuncs HB_UNUSED, void *draw_data,
hb_font_get_glyph_shape_default_adaptor_t *adaptor = (hb_font_get_glyph_shape_default_adaptor_t *) draw_data;
float x_scale = adaptor->x_scale;
float y_scale = adaptor->y_scale;
- float slant = adaptor->slant;
- st->current_x = st->current_x * x_scale + st->current_y * slant;
- st->current_y = st->current_y * y_scale;
+ st->current_x *= x_scale;
+ st->current_y *= y_scale;
adaptor->draw_funcs->emit_line_to (adaptor->draw_data, *st,
- x_scale * to_x + slant * to_y, y_scale * to_y);
+ x_scale * to_x, y_scale * to_y);
}
static void
@@ -565,14 +562,13 @@ hb_draw_quadratic_to_default (hb_draw_funcs_t *dfuncs HB_UNUSED, void *draw_data
hb_font_get_glyph_shape_default_adaptor_t *adaptor = (hb_font_get_glyph_shape_default_adaptor_t *) draw_data;
float x_scale = adaptor->x_scale;
float y_scale = adaptor->y_scale;
- float slant = adaptor->slant;
- st->current_x = st->current_x * x_scale + st->current_y * slant;
- st->current_y = st->current_y * y_scale;
+ st->current_x *= x_scale;
+ st->current_y *= y_scale;
adaptor->draw_funcs->emit_quadratic_to (adaptor->draw_data, *st,
- x_scale * control_x + slant * control_y, y_scale * control_y,
- x_scale * to_x + slant * to_y, y_scale * to_y);
+ x_scale * control_x, y_scale * control_y,
+ x_scale * to_x, y_scale * to_y);
}
static void
@@ -586,15 +582,14 @@ hb_draw_cubic_to_default (hb_draw_funcs_t *dfuncs HB_UNUSED, void *draw_data,
hb_font_get_glyph_shape_default_adaptor_t *adaptor = (hb_font_get_glyph_shape_default_adaptor_t *) draw_data;
float x_scale = adaptor->x_scale;
float y_scale = adaptor->y_scale;
- float slant = adaptor->slant;
- st->current_x = st->current_x * x_scale + st->current_y * slant;
- st->current_y = st->current_y * y_scale;
+ st->current_x *= x_scale;
+ st->current_y *= y_scale;
adaptor->draw_funcs->emit_cubic_to (adaptor->draw_data, *st,
- x_scale * control1_x + slant * control1_y, y_scale * control1_y,
- x_scale * control2_x + slant * control2_y, y_scale * control2_y,
- x_scale * to_x + slant * to_y, y_scale * to_y);
+ x_scale * control1_x, y_scale * control1_y,
+ x_scale * control2_x, y_scale * control2_y,
+ x_scale * to_x, y_scale * to_y);
}
static void
@@ -628,10 +623,8 @@ hb_font_get_glyph_shape_default (hb_font_t *font,
hb_font_get_glyph_shape_default_adaptor_t adaptor = {
draw_funcs,
draw_data,
- font->parent->x_scale ? (float) font->x_scale / (float) font->parent->x_scale : 0.f,
- font->parent->y_scale ? (float) font->y_scale / (float) font->parent->y_scale : 0.f,
- font->parent->y_scale ? (font->slant - font->parent->slant) *
- (float) font->x_scale / (float) font->parent->y_scale : 0.f
+ (float) font->x_scale / (float) font->parent->x_scale,
+ (float) font->y_scale / (float) font->parent->y_scale
};
font->parent->get_glyph_shape (glyph,
@@ -829,56 +822,6 @@ hb_font_funcs_is_immutable (hb_font_funcs_t *ffuncs)
}
-static bool
-_hb_font_funcs_set_preamble (hb_font_funcs_t *ffuncs,
- bool func_is_null,
- void **user_data,
- hb_destroy_func_t *destroy)
-{
- if (hb_object_is_immutable (ffuncs))
- {
- if (*destroy)
- (*destroy) (*user_data);
- return false;
- }
-
- if (func_is_null)
- {
- if (*destroy)
- (*destroy) (*user_data);
- *destroy = nullptr;
- *user_data = nullptr;
- }
-
- return true;
-}
-
-static bool
-_hb_font_funcs_set_middle (hb_font_funcs_t *ffuncs,
- void *user_data,
- hb_destroy_func_t destroy)
-{
- if (user_data && !ffuncs->user_data)
- {
- ffuncs->user_data = (decltype (ffuncs->user_data)) hb_calloc (1, sizeof (*ffuncs->user_data));
- if (unlikely (!ffuncs->user_data))
- goto fail;
- }
- if (destroy && !ffuncs->destroy)
- {
- ffuncs->destroy = (decltype (ffuncs->destroy)) hb_calloc (1, sizeof (*ffuncs->destroy));
- if (unlikely (!ffuncs->destroy))
- goto fail;
- }
-
- return true;
-
-fail:
- if (destroy)
- (destroy) (user_data);
- return false;
-}
-
#define HB_FONT_FUNC_IMPLEMENT(name) \
\
void \
@@ -887,24 +830,51 @@ hb_font_funcs_set_##name##_func (hb_font_funcs_t *ffuncs, \
void *user_data, \
hb_destroy_func_t destroy) \
{ \
- if (!_hb_font_funcs_set_preamble (ffuncs, !func, &user_data, &destroy))\
- return; \
+ if (hb_object_is_immutable (ffuncs)) \
+ goto fail; \
+ \
+ if (!func) \
+ { \
+ if (destroy) \
+ destroy (user_data); \
+ destroy = nullptr; \
+ user_data = nullptr; \
+ } \
\
if (ffuncs->destroy && ffuncs->destroy->name) \
ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name); \
\
- if (!_hb_font_funcs_set_middle (ffuncs, user_data, destroy)) \
- return; \
+ if (user_data && !ffuncs->user_data) \
+ { \
+ ffuncs->user_data = (decltype (ffuncs->user_data)) hb_calloc (1, sizeof (*ffuncs->user_data)); \
+ if (unlikely (!ffuncs->user_data)) \
+ goto fail; \
+ } \
+ if (destroy && !ffuncs->destroy) \
+ { \
+ ffuncs->destroy = (decltype (ffuncs->destroy)) hb_calloc (1, sizeof (*ffuncs->destroy)); \
+ if (unlikely (!ffuncs->destroy)) \
+ goto fail; \
+ } \
\
- if (func) \
+ if (func) { \
ffuncs->get.f.name = func; \
- else \
+ if (ffuncs->user_data) \
+ ffuncs->user_data->name = user_data; \
+ if (ffuncs->destroy) \
+ ffuncs->destroy->name = destroy; \
+ } else { \
ffuncs->get.f.name = hb_font_get_##name##_default; \
- \
- if (ffuncs->user_data) \
- ffuncs->user_data->name = user_data; \
- if (ffuncs->destroy) \
- ffuncs->destroy->name = destroy; \
+ if (ffuncs->user_data) \
+ ffuncs->user_data->name = nullptr; \
+ if (ffuncs->destroy) \
+ ffuncs->destroy->name = nullptr; \
+ } \
+ return; \
+ \
+fail: \
+ if (destroy) \
+ destroy (user_data); \
}
HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
@@ -1353,7 +1323,7 @@ hb_font_get_glyph_from_name (hb_font_t *font,
* @draw_data: User data to pass to draw callbacks
*
* Fetches the glyph shape that corresponds to a glyph in the specified @font.
- * The shape is returned by way of calls to the callbacks of the @dfuncs
+ * The shape is returned by way of calls to the callsbacks of the @dfuncs
* objects, with @draw_data passed to them.
*
* Since: 4.0.0
@@ -1810,8 +1780,8 @@ hb_font_create_sub_font (hb_font_t *parent)
float *design_coords = (float *) hb_calloc (num_coords, sizeof (parent->design_coords[0]));
if (likely (coords && design_coords))
{
- hb_memcpy (coords, parent->coords, num_coords * sizeof (parent->coords[0]));
- hb_memcpy (design_coords, parent->design_coords, num_coords * sizeof (parent->design_coords[0]));
+ memcpy (coords, parent->coords, num_coords * sizeof (parent->coords[0]));
+ memcpy (design_coords, parent->design_coords, num_coords * sizeof (parent->design_coords[0]));
_hb_font_adopt_var_coords (font, coords, design_coords, num_coords);
}
else
@@ -2473,7 +2443,7 @@ hb_font_set_var_coords_design (hb_font_t *font,
}
if (coords_length)
- hb_memcpy (design_coords, coords, coords_length * sizeof (font->design_coords[0]));
+ memcpy (design_coords, coords, coords_length * sizeof (font->design_coords[0]));
hb_ot_var_normalize_coords (font->face, coords_length, coords, normalized);
_hb_font_adopt_var_coords (font, normalized, design_coords, coords_length);
@@ -2549,8 +2519,8 @@ hb_font_set_var_coords_normalized (hb_font_t *font,
if (coords_length)
{
- hb_memcpy (copy, coords, coords_length * sizeof (coords[0]));
- hb_memcpy (unmapped, coords, coords_length * sizeof (coords[0]));
+ memcpy (copy, coords, coords_length * sizeof (coords[0]));
+ memcpy (unmapped, coords, coords_length * sizeof (coords[0]));
}
/* Best effort design coords simulation */
diff --git a/src/hb-font.hh b/src/hb-font.hh
index 6942d99c7..bb402e23e 100644
--- a/src/hb-font.hh
+++ b/src/hb-font.hh
@@ -206,14 +206,14 @@ struct hb_font_t
hb_bool_t get_font_h_extents (hb_font_extents_t *extents)
{
- hb_memset (extents, 0, sizeof (*extents));
+ memset (extents, 0, sizeof (*extents));
return klass->get.f.font_h_extents (this, user_data,
extents,
!klass->user_data ? nullptr : klass->user_data->font_h_extents);
}
hb_bool_t get_font_v_extents (hb_font_extents_t *extents)
{
- hb_memset (extents, 0, sizeof (*extents));
+ memset (extents, 0, sizeof (*extents));
return klass->get.f.font_v_extents (this, user_data,
extents,
!klass->user_data ? nullptr : klass->user_data->font_v_extents);
@@ -342,7 +342,7 @@ struct hb_font_t
hb_bool_t get_glyph_extents (hb_codepoint_t glyph,
hb_glyph_extents_t *extents)
{
- hb_memset (extents, 0, sizeof (*extents));
+ memset (extents, 0, sizeof (*extents));
return klass->get.f.glyph_extents (this, user_data,
glyph,
extents,
diff --git a/src/hb-ft.cc b/src/hb-ft.cc
index 3892dedc1..bcc1dd080 100644
--- a/src/hb-ft.cc
+++ b/src/hb-ft.cc
@@ -89,7 +89,7 @@ struct hb_ft_font_t
bool unref; /* Whether to destroy ft_face when done. */
bool transform; /* Whether to apply FT_Face's transform. */
- mutable hb_mutex_t lock; /* Protects members below. */
+ mutable hb_mutex_t lock;
FT_Face ft_face;
mutable unsigned cached_serial;
mutable hb_ft_advance_cache_t advance_cache;
@@ -732,18 +732,16 @@ hb_ft_get_font_h_extents (hb_font_t *font HB_UNUSED,
static int
_hb_ft_move_to (const FT_Vector *to,
- void *arg)
+ hb_draw_session_t *drawing)
{
- hb_draw_session_t *drawing = (hb_draw_session_t *) arg;
drawing->move_to (to->x, to->y);
return FT_Err_Ok;
}
static int
_hb_ft_line_to (const FT_Vector *to,
- void *arg)
+ hb_draw_session_t *drawing)
{
- hb_draw_session_t *drawing = (hb_draw_session_t *) arg;
drawing->line_to (to->x, to->y);
return FT_Err_Ok;
}
@@ -751,9 +749,8 @@ _hb_ft_line_to (const FT_Vector *to,
static int
_hb_ft_conic_to (const FT_Vector *control,
const FT_Vector *to,
- void *arg)
+ hb_draw_session_t *drawing)
{
- hb_draw_session_t *drawing = (hb_draw_session_t *) arg;
drawing->quadratic_to (control->x, control->y,
to->x, to->y);
return FT_Err_Ok;
@@ -763,9 +760,8 @@ static int
_hb_ft_cubic_to (const FT_Vector *control1,
const FT_Vector *control2,
const FT_Vector *to,
- void *arg)
+ hb_draw_session_t *drawing)
{
- hb_draw_session_t *drawing = (hb_draw_session_t *) arg;
drawing->cubic_to (control1->x, control1->y,
control2->x, control2->y,
to->x, to->y);
@@ -791,10 +787,10 @@ hb_ft_get_glyph_shape (hb_font_t *font HB_UNUSED,
return;
const FT_Outline_Funcs outline_funcs = {
- _hb_ft_move_to,
- _hb_ft_line_to,
- _hb_ft_conic_to,
- _hb_ft_cubic_to,
+ (FT_Outline_MoveToFunc) _hb_ft_move_to,
+ (FT_Outline_LineToFunc) _hb_ft_line_to,
+ (FT_Outline_ConicToFunc) _hb_ft_conic_to,
+ (FT_Outline_CubicToFunc) _hb_ft_cubic_to,
0, /* shift */
0, /* delta */
};
@@ -979,9 +975,8 @@ hb_ft_face_create_referenced (FT_Face ft_face)
}
static void
-hb_ft_face_finalize (void *arg)
+hb_ft_face_finalize (FT_Face ft_face)
{
- FT_Face ft_face = (FT_Face) arg;
hb_face_destroy ((hb_face_t *) ft_face->generic.data);
}
@@ -1013,7 +1008,7 @@ hb_ft_face_create_cached (FT_Face ft_face)
ft_face->generic.finalizer (ft_face);
ft_face->generic.data = hb_ft_face_create (ft_face, nullptr);
- ft_face->generic.finalizer = hb_ft_face_finalize;
+ ft_face->generic.finalizer = (FT_Generic_Finalizer) hb_ft_face_finalize;
}
return hb_face_reference ((hb_face_t *) ft_face->generic.data);
@@ -1222,9 +1217,8 @@ get_ft_library ()
}
static void
-_release_blob (void *arg)
+_release_blob (FT_Face ft_face)
{
- FT_Face ft_face = (FT_Face) arg;
hb_blob_destroy ((hb_blob_t *) ft_face->generic.data);
}
@@ -1277,7 +1271,7 @@ hb_ft_font_set_funcs (hb_font_t *font)
ft_face->generic.data = blob;
- ft_face->generic.finalizer = _release_blob;
+ ft_face->generic.finalizer = (FT_Generic_Finalizer) _release_blob;
_hb_ft_font_set_funcs (font, ft_face, true);
hb_ft_font_set_load_flags (font, FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING);
diff --git a/src/hb-glib.cc b/src/hb-glib.cc
index 1da81696e..8ddc7ebad 100644
--- a/src/hb-glib.cc
+++ b/src/hb-glib.cc
@@ -129,9 +129,32 @@ hb_glib_unicode_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
{
#if GLIB_CHECK_VERSION(2,29,12)
return g_unichar_compose (a, b, ab);
-#else
- return false;
#endif
+
+ /* We don't ifdef-out the fallback code such that compiler always
+ * sees it and makes sure it's compilable. */
+
+ gchar utf8[12];
+ gchar *normalized;
+ int len;
+ hb_bool_t ret;
+
+ len = g_unichar_to_utf8 (a, utf8);
+ len += g_unichar_to_utf8 (b, utf8 + len);
+ normalized = g_utf8_normalize (utf8, len, G_NORMALIZE_NFC);
+ len = g_utf8_strlen (normalized, -1);
+ if (unlikely (!len))
+ return false;
+
+ if (len == 1) {
+ *ab = g_utf8_get_char (normalized);
+ ret = true;
+ } else {
+ ret = false;
+ }
+
+ g_free (normalized);
+ return ret;
}
static hb_bool_t
@@ -143,9 +166,55 @@ hb_glib_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
{
#if GLIB_CHECK_VERSION(2,29,12)
return g_unichar_decompose (ab, a, b);
-#else
- return false;
#endif
+
+ /* We don't ifdef-out the fallback code such that compiler always
+ * sees it and makes sure it's compilable. */
+
+ gchar utf8[6];
+ gchar *normalized;
+ int len;
+ hb_bool_t ret;
+
+ len = g_unichar_to_utf8 (ab, utf8);
+ normalized = g_utf8_normalize (utf8, len, G_NORMALIZE_NFD);
+ len = g_utf8_strlen (normalized, -1);
+ if (unlikely (!len))
+ return false;
+
+ if (len == 1) {
+ *a = g_utf8_get_char (normalized);
+ *b = 0;
+ ret = *a != ab;
+ } else if (len == 2) {
+ *a = g_utf8_get_char (normalized);
+ *b = g_utf8_get_char (g_utf8_next_char (normalized));
+ /* Here's the ugly part: if ab decomposes to a single character and
+ * that character decomposes again, we have to detect that and undo
+ * the second part :-(. */
+ gchar *recomposed = g_utf8_normalize (normalized, -1, G_NORMALIZE_NFC);
+ hb_codepoint_t c = g_utf8_get_char (recomposed);
+ if (c != ab && c != *a) {
+ *a = c;
+ *b = 0;
+ }
+ g_free (recomposed);
+ ret = true;
+ } else {
+ /* If decomposed to more than two characters, take the last one,
+ * and recompose the rest to get the first component. */
+ gchar *end = g_utf8_offset_to_pointer (normalized, len - 1);
+ gchar *recomposed;
+ *b = g_utf8_get_char (end);
+ recomposed = g_utf8_normalize (normalized, end - normalized, G_NORMALIZE_NFC);
+ /* We expect that recomposed has exactly one character now. */
+ *a = g_utf8_get_char (recomposed);
+ g_free (recomposed);
+ ret = true;
+ }
+
+ g_free (normalized);
+ return ret;
}
diff --git a/src/hb-graphite2.cc b/src/hb-graphite2.cc
index 9e068f8d8..4d0e687c7 100644
--- a/src/hb-graphite2.cc
+++ b/src/hb-graphite2.cc
@@ -318,7 +318,7 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED,
#undef ALLOCATE_ARRAY
- hb_memset (clusters, 0, sizeof (clusters[0]) * buffer->len);
+ memset (clusters, 0, sizeof (clusters[0]) * buffer->len);
hb_codepoint_t *pg = gids;
clusters[0].cluster = buffer->info[0].cluster;
diff --git a/src/hb-iter.hh b/src/hb-iter.hh
index b57f37b13..1a3ab43de 100644
--- a/src/hb-iter.hh
+++ b/src/hb-iter.hh
@@ -73,10 +73,8 @@ struct hb_iter_t
/* Operators. */
iter_t iter () const { return *thiz(); }
iter_t operator + () const { return *thiz(); }
- iter_t _begin () const { return *thiz(); }
- iter_t begin () const { return _begin (); }
- iter_t _end () const { return thiz()->__end__ (); }
- iter_t end () const { return _end (); }
+ iter_t begin () const { return *thiz(); }
+ iter_t end () const { return thiz()->__end__ (); }
explicit operator bool () const { return thiz()->__more__ (); }
unsigned len () const { return thiz()->__len__ (); }
/* The following can only be enabled if item_t is reference type. Otherwise
@@ -120,9 +118,7 @@ struct hb_iter_t
#define HB_ITER_USING(Name) \
using item_t = typename Name::item_t; \
- using Name::_begin; \
using Name::begin; \
- using Name::_end; \
using Name::end; \
using Name::get_item_size; \
using Name::is_iterator; \
@@ -381,7 +377,7 @@ struct hb_map_iter_t :
void __forward__ (unsigned n) { it += n; }
void __prev__ () { --it; }
void __rewind__ (unsigned n) { it -= n; }
- hb_map_iter_t __end__ () const { return hb_map_iter_t (it._end (), f); }
+ hb_map_iter_t __end__ () const { return hb_map_iter_t (it.end (), f); }
bool operator != (const hb_map_iter_t& o) const
{ return it != o.it; }
@@ -444,7 +440,7 @@ struct hb_filter_iter_t :
bool __more__ () const { return bool (it); }
void __next__ () { do ++it; while (it && !hb_has (p.get (), hb_get (f.get (), *it))); }
void __prev__ () { do --it; while (it && !hb_has (p.get (), hb_get (f.get (), *it))); }
- hb_filter_iter_t __end__ () const { return hb_filter_iter_t (it._end (), p, f); }
+ hb_filter_iter_t __end__ () const { return hb_filter_iter_t (it.end (), p, f); }
bool operator != (const hb_filter_iter_t& o) const
{ return it != o.it; }
@@ -557,7 +553,7 @@ struct hb_zip_iter_t :
void __forward__ (unsigned n) { a += n; b += n; }
void __prev__ () { --a; --b; }
void __rewind__ (unsigned n) { a -= n; b -= n; }
- hb_zip_iter_t __end__ () const { return hb_zip_iter_t (a._end (), b._end ()); }
+ hb_zip_iter_t __end__ () const { return hb_zip_iter_t (a.end (), b.end ()); }
/* Note, we should stop if ANY of the iters reaches end. As such two compare
* unequal if both items are unequal, NOT if either is unequal. */
bool operator != (const hb_zip_iter_t& o) const
@@ -641,7 +637,7 @@ struct hb_concat_iter_t :
}
}
- hb_concat_iter_t __end__ () const { return hb_concat_iter_t (a._end (), b._end ()); }
+ hb_concat_iter_t __end__ () const { return hb_concat_iter_t (a.end (), b.end ()); }
bool operator != (const hb_concat_iter_t& o) const
{
return a != o.a
diff --git a/src/hb-machinery.hh b/src/hb-machinery.hh
index b555739cf..2571f22e1 100644
--- a/src/hb-machinery.hh
+++ b/src/hb-machinery.hh
@@ -136,13 +136,6 @@ static inline Type& StructAfter(TObject &X)
/*
* Lazy loaders.
- *
- * The lazy-loaders are thread-safe pointer-like objects that create their
- * instead on-demand. They also support access to a "data" object that is
- * necessary for creating their instance. The data object, if specified,
- * is accessed via pointer math, located at a location before the position
- * of the loader itself. This avoids having to store a pointer to data
- * for every lazy-loader. Multiple lazy-loaders can access the same data.
*/
template <typename Data, unsigned int WheresData>
@@ -235,8 +228,7 @@ struct hb_lazy_loader_t : hb_data_wrapper_t<Data, WheresData>
bool cmpexch (Stored *current, Stored *value) const
{
- /* This function can only be safely called directly if no
- * other thread is accessing. */
+ /* This *must* be called when there are no other threads accessing. */
return this->instance.cmpexch (current, value);
}
@@ -269,7 +261,7 @@ struct hb_lazy_loader_t : hb_data_wrapper_t<Data, WheresData>
hb_free (p);
}
- private:
+// private:
/* Must only have one pointer. */
hb_atomic_ptr_t<Stored *> instance;
};
@@ -291,7 +283,7 @@ struct hb_table_lazy_loader_t : hb_lazy_loader_t<T,
{
auto c = hb_sanitize_context_t ();
if (core)
- c.set_num_glyphs (0); // So we don't recurse ad infinitum, or doesn't need num_glyphs
+ c.set_num_glyphs (0); // So we don't recurse ad infinitum...
return c.reference_table<T> (face);
}
static void destroy (hb_blob_t *p) { hb_blob_destroy (p); }
diff --git a/src/hb-map.hh b/src/hb-map.hh
index bfb1b3f76..8302e3f8c 100644
--- a/src/hb-map.hh
+++ b/src/hb-map.hh
@@ -43,9 +43,9 @@ struct hb_hashmap_t
hb_hashmap_t () { init (); }
~hb_hashmap_t () { fini (); }
- hb_hashmap_t (const hb_hashmap_t& o) : hb_hashmap_t () { resize (o.population); hb_copy (o, *this); }
+ hb_hashmap_t (const hb_hashmap_t& o) : hb_hashmap_t () { resize (population); hb_copy (o, *this); }
hb_hashmap_t (hb_hashmap_t&& o) : hb_hashmap_t () { hb_swap (*this, o); }
- hb_hashmap_t& operator= (const hb_hashmap_t& o) { reset (); resize (o.population); hb_copy (o, *this); return *this; }
+ hb_hashmap_t& operator= (const hb_hashmap_t& o) { resize (population); hb_copy (o, *this); return *this; }
hb_hashmap_t& operator= (hb_hashmap_t&& o) { hb_swap (*this, o); return *this; }
hb_hashmap_t (std::initializer_list<hb_pair_t<K, V>> lst) : hb_hashmap_t ()
@@ -71,11 +71,6 @@ struct hb_hashmap_t
uint32_t is_tombstone_ : 1;
V value;
- item_t () : key (),
- hash (0),
- is_used_ (false), is_tombstone_ (false),
- value () {}
-
bool is_used () const { return is_used_; }
void set_used (bool is_used) { is_used_ = is_used; }
bool is_tombstone () const { return is_tombstone_; }
@@ -93,8 +88,17 @@ struct hb_hashmap_t
return minus_1;
};
- bool operator == (const K &o) const { return hb_deref (key) == hb_deref (o); }
- bool operator == (const item_t &o) const { return *this == o.key; }
+ void clear ()
+ {
+ new (std::addressof (key)) K ();
+ new (std::addressof (value)) V ();
+ hash = 0;
+ is_used_ = false;
+ is_tombstone_ = false;
+ }
+
+ bool operator == (const K &o) { return hb_deref (key) == hb_deref (o); }
+ bool operator == (const item_t &o) { return *this == o.key; }
hb_pair_t<K, V> get_pair() const { return hb_pair_t<K, V> (key, value); }
hb_pair_t<const K &, const V &> get_pair_ref() const { return hb_pair_t<const K &, const V &> (key, value); }
@@ -103,8 +107,8 @@ struct hb_hashmap_t
};
hb_object_header_t header;
- unsigned int successful : 1; /* Allocations successful */
- unsigned int population : 31; /* Not including tombstones. */
+ bool successful; /* Allocations successful */
+ unsigned int population; /* Not including tombstones. */
unsigned int occupancy; /* Including tombstones. */
unsigned int mask;
unsigned int prime;
@@ -114,10 +118,7 @@ struct hb_hashmap_t
{
if (unlikely (!a.successful || !b.successful))
return;
- unsigned tmp = a.population;
- a.population = b.population;
- b.population = tmp;
- //hb_swap (a.population, b.population);
+ hb_swap (a.population, b.population);
hb_swap (a.occupancy, b.occupancy);
hb_swap (a.mask, b.mask);
hb_swap (a.prime, b.prime);
@@ -159,9 +160,7 @@ struct hb_hashmap_t
{
if (unlikely (!successful)) return false;
- if (new_population != 0 && (new_population + new_population / 2) < mask) return true;
-
- unsigned int power = hb_bit_storage (hb_max ((unsigned) population, new_population) * 2 + 8);
+ unsigned int power = hb_bit_storage (hb_max (population, new_population) * 2 + 8);
unsigned int new_size = 1u << power;
item_t *new_items = (item_t *) hb_malloc ((size_t) new_size * sizeof (item_t));
if (unlikely (!new_items))
@@ -170,9 +169,9 @@ struct hb_hashmap_t
return false;
}
for (auto &_ : hb_iter (new_items, new_size))
- new (&_) item_t ();
+ _.clear ();
- unsigned int old_size = size ();
+ unsigned int old_size = mask + 1;
item_t *old_items = items;
/* Switch to new, empty, array. */
@@ -182,82 +181,47 @@ struct hb_hashmap_t
items = new_items;
/* Insert back old items. */
- for (unsigned int i = 0; i < old_size; i++)
- {
- if (old_items[i].is_real ())
+ if (old_items)
+ for (unsigned int i = 0; i < old_size; i++)
{
- set_with_hash (std::move (old_items[i].key),
- old_items[i].hash,
- std::move (old_items[i].value));
+ if (old_items[i].is_real ())
+ {
+ set_with_hash (old_items[i].key,
+ old_items[i].hash,
+ std::move (old_items[i].value));
+ }
+ old_items[i].~item_t ();
}
- old_items[i].~item_t ();
- }
hb_free (old_items);
return true;
}
- template <typename KK, typename VV>
- bool set_with_hash (KK&& key, uint32_t hash, VV&& value, bool is_delete=false)
- {
- if (unlikely (!successful)) return false;
- if (unlikely ((occupancy + occupancy / 2) >= mask && !resize ())) return false;
- item_t &item = item_for_hash (key, hash);
-
- if (is_delete && !(item == key))
- return true; /* Trying to delete non-existent key. */
-
- if (item.is_used ())
- {
- occupancy--;
- if (!item.is_tombstone ())
- population--;
- }
-
- item.key = std::forward<KK> (key);
- item.value = std::forward<VV> (value);
- item.hash = hash;
- item.set_used (true);
- item.set_tombstone (is_delete);
-
- occupancy++;
- if (!is_delete)
- population++;
-
- return true;
- }
-
- template <typename VV>
- bool set (const K &key, VV&& value) { return set_with_hash (key, hb_hash (key), std::forward<VV> (value)); }
template <typename VV>
- bool set (K &&key, VV&& value) { return set_with_hash (std::move (key), hb_hash (key), std::forward<VV> (value)); }
+ bool set (K key, VV&& value) { return set_with_hash (key, hb_hash (key), std::forward<VV> (value)); }
- const V& get_with_hash (const K &key, uint32_t hash) const
- {
- if (unlikely (!items)) return item_t::default_value ();
- auto &item = item_for_hash (key, hash);
- return item.is_real () && item == key ? item.value : item_t::default_value ();
- }
- const V& get (const K &key) const
+ const V& get (K key) const
{
if (unlikely (!items)) return item_t::default_value ();
- return get_with_hash (key, hb_hash (key));
+ unsigned int i = bucket_for (key);
+ return items[i].is_real () && items[i] == key ? items[i].value : item_t::default_value ();
}
- void del (const K &key) { set_with_hash (key, hb_hash (key), item_t::default_value (), true); }
+ void del (K key) { set_with_hash (key, hb_hash (key), item_t::default_value (), true); }
/* Has interface. */
- const V& operator [] (K k) const { return get (k); }
+ typedef const V& value_t;
+ value_t operator [] (K k) const { return get (k); }
template <typename VV=V>
bool has (K key, VV **vp = nullptr) const
{
if (unlikely (!items))
return false;
- auto &item = item_for_hash (key, hb_hash (key));
- if (item.is_real () && item == key)
+ unsigned int i = bucket_for (key);
+ if (items[i].is_real () && items[i] == key)
{
- if (vp) *vp = std::addressof (item.value);
+ if (vp) *vp = &items[i].value;
return true;
}
else
@@ -266,18 +230,13 @@ struct hb_hashmap_t
/* Projection. */
V operator () (K k) const { return get (k); }
- unsigned size () const { return mask ? mask + 1 : 0; }
-
void clear ()
{
if (unlikely (!successful)) return;
- for (auto &_ : hb_iter (items, size ()))
- {
- /* Reconstruct items. */
- _.~item_t ();
- new (&_) item_t ();
- }
+ if (items)
+ for (auto &_ : hb_iter (items, mask + 1))
+ _.clear ();
population = occupancy = 0;
}
@@ -287,10 +246,11 @@ struct hb_hashmap_t
uint32_t hash () const
{
- return
- + iter_items ()
- | hb_reduce ([] (uint32_t h, const item_t &_) { return h ^ _.total_hash (); }, (uint32_t) 0u)
- ;
+ uint32_t h = 0;
+ for (const auto &item : + hb_array (items, mask ? mask + 1 : 0)
+ | hb_filter (&item_t::is_real))
+ h ^= item.total_hash ();
+ return h;
}
bool is_equal (const hb_hashmap_t &other) const
@@ -298,7 +258,7 @@ struct hb_hashmap_t
if (population != other.population) return false;
for (auto pair : iter ())
- if (other.get (pair.first) != pair.second)
+ if (get (pair.first) != pair.second)
return false;
return true;
@@ -311,54 +271,87 @@ struct hb_hashmap_t
/*
* Iterator
*/
-
- auto iter_items () const HB_AUTO_RETURN
+ auto iter () const HB_AUTO_RETURN
(
- + hb_iter (items, size ())
+ + hb_array (items, mask ? mask + 1 : 0)
| hb_filter (&item_t::is_real)
+ | hb_map (&item_t::get_pair)
)
auto iter_ref () const HB_AUTO_RETURN
(
- + iter_items ()
+ + hb_array (items, mask ? mask + 1 : 0)
+ | hb_filter (&item_t::is_real)
| hb_map (&item_t::get_pair_ref)
)
- auto iter () const HB_AUTO_RETURN
+ auto keys () const HB_AUTO_RETURN
(
- + iter_items ()
- | hb_map (&item_t::get_pair)
+ + hb_array (items, mask ? mask + 1 : 0)
+ | hb_filter (&item_t::is_real)
+ | hb_map (&item_t::key)
+ | hb_map (hb_ridentity)
)
auto keys_ref () const HB_AUTO_RETURN
(
- + iter_items ()
+ + hb_array (items, mask ? mask + 1 : 0)
+ | hb_filter (&item_t::is_real)
| hb_map (&item_t::key)
)
- auto keys () const HB_AUTO_RETURN
+ auto values () const HB_AUTO_RETURN
(
- + keys_ref ()
+ + hb_array (items, mask ? mask + 1 : 0)
+ | hb_filter (&item_t::is_real)
+ | hb_map (&item_t::value)
| hb_map (hb_ridentity)
)
auto values_ref () const HB_AUTO_RETURN
(
- + iter_items ()
+ + hb_array (items, mask ? mask + 1 : 0)
+ | hb_filter (&item_t::is_real)
| hb_map (&item_t::value)
)
- auto values () const HB_AUTO_RETURN
- (
- + values_ref ()
- | hb_map (hb_ridentity)
- )
/* Sink interface. */
hb_hashmap_t& operator << (const hb_pair_t<K, V>& v)
{ set (v.first, v.second); return *this; }
- hb_hashmap_t& operator << (const hb_pair_t<K, V&&>& v)
- { set (v.first, std::move (v.second)); return *this; }
- hb_hashmap_t& operator << (const hb_pair_t<K&&, V>& v)
- { set (std::move (v.first), v.second); return *this; }
- hb_hashmap_t& operator << (const hb_pair_t<K&&, V&&>& v)
- { set (std::move (v.first), std::move (v.second)); return *this; }
-
- item_t& item_for_hash (const K &key, uint32_t hash) const
+
+ protected:
+
+ template <typename VV>
+ bool set_with_hash (K key, uint32_t hash, VV&& value, bool is_delete=false)
+ {
+ if (unlikely (!successful)) return false;
+ if (unlikely ((occupancy + occupancy / 2) >= mask && !resize ())) return false;
+ unsigned int i = bucket_for_hash (key, hash);
+
+ if (is_delete && items[i].key != key)
+ return true; /* Trying to delete non-existent key. */
+
+ if (items[i].is_used ())
+ {
+ occupancy--;
+ if (!items[i].is_tombstone ())
+ population--;
+ }
+
+ items[i].key = key;
+ items[i].value = std::forward<VV> (value);
+ items[i].hash = hash;
+ items[i].set_used (true);
+ items[i].set_tombstone (is_delete);
+
+ occupancy++;
+ if (!is_delete)
+ population++;
+
+ return true;
+ }
+
+ unsigned int bucket_for (const K &key) const
+ {
+ return bucket_for_hash (key, hb_hash (key));
+ }
+
+ unsigned int bucket_for_hash (const K &key, uint32_t hash) const
{
hash &= 0x3FFFFFFF; // We only store lower 30bit of hash
unsigned int i = hash % prime;
@@ -367,12 +360,12 @@ struct hb_hashmap_t
while (items[i].is_used ())
{
if (items[i].hash == hash && items[i] == key)
- return items[i];
+ return i;
if (tombstone == (unsigned) -1 && items[i].is_tombstone ())
tombstone = i;
i = (i + ++step) & mask;
}
- return items[tombstone == (unsigned) -1 ? i : tombstone];
+ return tombstone == (unsigned) -1 ? i : tombstone;
}
static unsigned int prime_for (unsigned int shift)
diff --git a/src/hb-meta.hh b/src/hb-meta.hh
index 31aa7fa6f..52a6791e3 100644
--- a/src/hb-meta.hh
+++ b/src/hb-meta.hh
@@ -112,7 +112,8 @@ template <typename T> auto _hb_try_add_pointer (hb_priority<1>) -> hb_type_ident
template <typename T> using hb_add_pointer = decltype (_hb_try_add_pointer<T> (hb_prioritize));
-template <typename T> using hb_decay = typename std::decay<T>::type;
+/* TODO Add feature-parity to std::decay. */
+template <typename T> using hb_decay = hb_remove_const<hb_remove_reference<T>>;
#define hb_is_convertible(From,To) std::is_convertible<From, To>::value
diff --git a/src/hb-ms-feature-ranges.hh b/src/hb-ms-feature-ranges.hh
index 46a20c91e..d40fdeaa8 100644
--- a/src/hb-ms-feature-ranges.hh
+++ b/src/hb-ms-feature-ranges.hh
@@ -166,7 +166,7 @@ hb_ms_setup_features (const hb_feature_t *features,
{
auto *feature = active_features.lsearch (event->feature);
if (feature)
- active_features.remove_ordered (feature - active_features.arrayZ);
+ active_features.remove (feature - active_features.arrayZ);
}
}
diff --git a/src/hb-multimap.hh b/src/hb-multimap.hh
deleted file mode 100644
index f0f95917a..000000000
--- a/src/hb-multimap.hh
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright © 2022 Behdad Esfahbod
- *
- * 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.
- */
-
-#ifndef HB_MULTIMAP_HH
-#define HB_MULTIMAP_HH
-
-#include "hb.hh"
-#include "hb-map.hh"
-#include "hb-vector.hh"
-
-
-/*
- * hb_multimap_t
- */
-
-struct hb_multimap_t
-{
- void add (hb_codepoint_t k, hb_codepoint_t v)
- {
- hb_codepoint_t *i;
- if (multiples_indices.has (k, &i))
- {
- multiples_values[*i].push (v);
- return;
- }
-
- hb_codepoint_t *old_v;
- if (singulars.has (k, &old_v))
- {
- hb_codepoint_t old = *old_v;
- singulars.del (k);
-
- multiples_indices.set (k, multiples_values.length);
- auto *vec = multiples_values.push ();
-
- vec->push (old);
- vec->push (v);
-
- return;
- }
-
- singulars.set (k, v);
- }
-
- hb_array_t<const hb_codepoint_t> get (hb_codepoint_t k) const
- {
- hb_codepoint_t *v;
- if (singulars.has (k, &v))
- return hb_array (v, 1);
-
- hb_codepoint_t *i;
- if (multiples_indices.has (k, &i))
- return multiples_values[*i].as_array ();
-
- return hb_array_t<hb_codepoint_t> ();
- }
-
- bool in_error () const
- {
- return singulars.in_error () || multiples_indices.in_error () || multiples_values.in_error ();
- }
-
- protected:
- hb_map_t singulars;
- hb_map_t multiples_indices;
- hb_vector_t<hb_vector_t<hb_codepoint_t>> multiples_values;
-};
-
-
-
-#endif /* HB_MULTIMAP_HH */
diff --git a/src/hb-mutex.hh b/src/hb-mutex.hh
index 053f9ddcc..6914b2245 100644
--- a/src/hb-mutex.hh
+++ b/src/hb-mutex.hh
@@ -108,11 +108,10 @@ struct hb_mutex_t
struct hb_lock_t
{
- hb_lock_t (hb_mutex_t &mutex_) : mutex (&mutex_) { mutex->lock (); }
- hb_lock_t (hb_mutex_t *mutex_) : mutex (mutex_) { if (mutex) mutex->lock (); }
- ~hb_lock_t () { if (mutex) mutex->unlock (); }
+ hb_lock_t (hb_mutex_t &mutex_) : mutex (mutex_) { mutex.lock (); }
+ ~hb_lock_t () { mutex.unlock (); }
private:
- hb_mutex_t *mutex;
+ hb_mutex_t &mutex;
};
diff --git a/src/hb-number-parser.hh b/src/hb-number-parser.hh
index ec68c3a72..1a9dbba6d 100644
--- a/src/hb-number-parser.hh
+++ b/src/hb-number-parser.hh
@@ -31,7 +31,7 @@
#include "hb.hh"
-#line 32 "hb-number-parser.hh"
+#line 35 "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 132 "hb-number-parser.hh"
+#line 139 "hb-number-parser.hh"
{
cs = double_parser_start;
}
-#line 135 "hb-number-parser.hh"
+#line 144 "hb-number-parser.hh"
{
int _slen;
int _trans;
@@ -198,7 +198,7 @@ _resume:
exp_overflow = true;
}
break;
-#line 187 "hb-number-parser.hh"
+#line 202 "hb-number-parser.hh"
}
_again:
diff --git a/src/hb-object.hh b/src/hb-object.hh
index a23c25f7c..9876c2923 100644
--- a/src/hb-object.hh
+++ b/src/hb-object.hh
@@ -80,7 +80,7 @@ struct hb_lockable_set_t
if (item)
{
item_t old = *item;
- *item = std::move (items.tail ());
+ *item = items[items.length - 1];
items.pop ();
l.unlock ();
old.fini ();
@@ -123,7 +123,7 @@ struct hb_lockable_set_t
l.lock ();
while (items.length)
{
- item_t old = items.tail ();
+ item_t old = items[items.length - 1];
items.pop ();
l.unlock ();
old.fini ();
diff --git a/src/hb-open-file.hh b/src/hb-open-file.hh
index 13570a46e..6eee5827c 100644
--- a/src/hb-open-file.hh
+++ b/src/hb-open-file.hh
@@ -90,7 +90,7 @@ typedef struct OpenTypeOffsetTable
{
if (table_count)
{
- + tables.as_array ().sub_array (start_offset, table_count)
+ + tables.sub_array (start_offset, table_count)
| hb_map (&TableRecord::tag)
| hb_sink (hb_array (table_tags, *table_count))
;
@@ -158,7 +158,7 @@ typedef struct OpenTypeOffsetTable
return_trace (false);
if (likely (len))
- hb_memcpy (start, blob->data, len);
+ memcpy (start, blob->data, len);
/* 4-byte alignment. */
c->align (4);
diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh
index 290799127..e66f45182 100644
--- a/src/hb-open-type.hh
+++ b/src/hb-open-type.hh
@@ -148,7 +148,7 @@ struct HBFixed : Type
static_assert (Type::static_size * 8 > fraction_bits, "");
HBFixed& operator = (typename Type::type i ) { Type::operator= (i); return *this; }
- float to_float (float offset = 0) const { return ((int32_t) Type::v + offset) / shift; }
+ float to_float () const { return ((int32_t) Type::v) / shift; }
void set_float (float f) { Type::v = roundf (f * shift); }
public:
DEFINE_SIZE_STATIC (Type::static_size);
@@ -157,9 +157,6 @@ struct HBFixed : Type
/* 16-bit signed fixed number with the low 14 bits of fraction (2.14). */
using F2DOT14 = HBFixed<HBINT16, 14>;
-/* 16-bit signed fixed number with the low 12 bits of fraction (4.12). */
-using F4DOT12 = HBFixed<HBINT16, 12>;
-
/* 32-bit signed fixed-point number (16.16). */
using F16DOT16 = HBFixed<HBINT32, 16>;
@@ -212,12 +209,6 @@ typedef Index NameID;
struct VarIdx : HBUINT32 {
static constexpr unsigned NO_VARIATION = 0xFFFFFFFFu;
- static_assert (NO_VARIATION == HB_OT_LAYOUT_NO_VARIATIONS_INDEX, "");
- static uint32_t add (uint32_t i, unsigned short v)
- {
- if (i == NO_VARIATION) return i;
- return i + v;
- }
VarIdx& operator = (uint32_t i) { HBUINT32::operator= (i); return *this; }
};
DECLARE_NULL_NAMESPACE_BYTES (OT, VarIdx);
@@ -502,10 +493,10 @@ struct UnsizedArrayOf
void qsort (unsigned int len, unsigned int start = 0, unsigned int end = (unsigned int) -1)
{ as_array (len).qsort (start, end); }
- bool serialize (hb_serialize_context_t *c, unsigned int items_len, bool clear = true)
+ bool serialize (hb_serialize_context_t *c, unsigned int items_len)
{
TRACE_SERIALIZE (this);
- if (unlikely (!c->extend_size (this, get_size (items_len), clear))) return_trace (false);
+ if (unlikely (!c->extend (this, items_len))) return_trace (false);
return_trace (true);
}
template <typename Iterator,
@@ -513,8 +504,8 @@ struct UnsizedArrayOf
bool serialize (hb_serialize_context_t *c, Iterator items)
{
TRACE_SERIALIZE (this);
- unsigned count = hb_len (items);
- if (unlikely (!serialize (c, count, false))) return_trace (false);
+ unsigned count = items.len ();
+ if (unlikely (!serialize (c, count))) return_trace (false);
/* TODO Umm. Just exhaust the iterator instead? Being extra
* cautious right now.. */
for (unsigned i = 0; i < count; i++, ++items)
@@ -655,9 +646,14 @@ struct ArrayOf
operator iter_t () const { return iter (); }
operator writer_t () { return writer (); }
- /* Faster range-based for loop. */
- const Type *begin () const { return arrayZ; }
- const Type *end () const { return arrayZ + len; }
+ hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int count) const
+ { return as_array ().sub_array (start_offset, count); }
+ hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) const
+ { return as_array ().sub_array (start_offset, count); }
+ hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int count)
+ { return as_array ().sub_array (start_offset, count); }
+ hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */)
+ { return as_array ().sub_array (start_offset, count); }
template <typename T>
Type &lsearch (const T &x, Type &not_found = Crap (Type))
@@ -671,15 +667,15 @@ struct ArrayOf
unsigned int to_store = (unsigned int) -1) const
{ return as_array ().lfind (x, i, not_found, to_store); }
- void qsort ()
- { as_array ().qsort (); }
+ void qsort (unsigned int start = 0, unsigned int end = (unsigned int) -1)
+ { as_array ().qsort (start, end); }
- HB_NODISCARD bool serialize (hb_serialize_context_t *c, unsigned items_len, bool clear = true)
+ HB_NODISCARD bool serialize (hb_serialize_context_t *c, unsigned items_len)
{
TRACE_SERIALIZE (this);
if (unlikely (!c->extend_min (this))) return_trace (false);
c->check_assign (len, items_len, HB_SERIALIZE_ERROR_ARRAY_OVERFLOW);
- if (unlikely (!c->extend_size (this, get_size (), clear))) return_trace (false);
+ if (unlikely (!c->extend (this))) return_trace (false);
return_trace (true);
}
template <typename Iterator,
@@ -687,8 +683,8 @@ struct ArrayOf
HB_NODISCARD bool serialize (hb_serialize_context_t *c, Iterator items)
{
TRACE_SERIALIZE (this);
- unsigned count = hb_len (items);
- if (unlikely (!serialize (c, count, false))) return_trace (false);
+ unsigned count = items.len ();
+ if (unlikely (!serialize (c, count))) return_trace (false);
/* TODO Umm. Just exhaust the iterator instead? Being extra
* cautious right now.. */
for (unsigned i = 0; i < count; i++, ++items)
@@ -832,25 +828,21 @@ struct HeadlessArrayOf
operator iter_t () const { return iter (); }
operator writer_t () { return writer (); }
- /* Faster range-based for loop. */
- const Type *begin () const { return arrayZ; }
- const Type *end () const { return arrayZ + get_length (); }
-
- HB_NODISCARD bool serialize (hb_serialize_context_t *c, unsigned int items_len, bool clear = true)
+ bool serialize (hb_serialize_context_t *c, unsigned int items_len)
{
TRACE_SERIALIZE (this);
if (unlikely (!c->extend_min (this))) return_trace (false);
c->check_assign (lenP1, items_len + 1, HB_SERIALIZE_ERROR_ARRAY_OVERFLOW);
- if (unlikely (!c->extend_size (this, get_size (), clear))) return_trace (false);
+ if (unlikely (!c->extend (this))) return_trace (false);
return_trace (true);
}
template <typename Iterator,
hb_requires (hb_is_source_of (Iterator, Type))>
- HB_NODISCARD bool serialize (hb_serialize_context_t *c, Iterator items)
+ bool serialize (hb_serialize_context_t *c, Iterator items)
{
TRACE_SERIALIZE (this);
- unsigned count = hb_len (items);
- if (unlikely (!serialize (c, count, false))) return_trace (false);
+ unsigned count = items.len ();
+ if (unlikely (!serialize (c, count))) return_trace (false);
/* TODO Umm. Just exhaust the iterator instead? Being extra
* cautious right now.. */
for (unsigned i = 0; i < count; i++, ++items)
@@ -952,9 +944,14 @@ struct SortedArrayOf : ArrayOf<Type, LenType>
operator iter_t () const { return iter (); }
operator writer_t () { return writer (); }
- /* Faster range-based for loop. */
- const Type *begin () const { return this->arrayZ; }
- const Type *end () const { return this->arrayZ + this->len; }
+ hb_sorted_array_t<const Type> sub_array (unsigned int start_offset, unsigned int count) const
+ { return as_array ().sub_array (start_offset, count); }
+ hb_sorted_array_t<const Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) const
+ { return as_array ().sub_array (start_offset, count); }
+ hb_sorted_array_t<Type> sub_array (unsigned int start_offset, unsigned int count)
+ { return as_array ().sub_array (start_offset, count); }
+ hb_sorted_array_t<Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */)
+ { return as_array ().sub_array (start_offset, count); }
bool serialize (hb_serialize_context_t *c, unsigned int items_len)
{
diff --git a/src/hb-ot-cff-common.hh b/src/hb-ot-cff-common.hh
index f22824fc6..ae3b83a25 100644
--- a/src/hb-ot-cff-common.hh
+++ b/src/hb-ot-cff-common.hh
@@ -66,25 +66,95 @@ struct CFFIndex
{
TRACE_SERIALIZE (this);
unsigned int size = get_size ();
- CFFIndex *out = c->allocate_size<CFFIndex> (size, false);
+ CFFIndex *out = c->allocate_size<CFFIndex> (size);
if (likely (out))
- hb_memcpy (out, this, size);
+ memcpy (out, this, size);
return_trace (out);
}
- template <typename Iterable,
- hb_requires (hb_is_iterable (Iterable))>
bool serialize (hb_serialize_context_t *c,
- const Iterable &iterable)
+ unsigned int offSize_,
+ const byte_str_array_t &byteArray)
{
TRACE_SERIALIZE (this);
- auto it = hb_iter (iterable);
- serialize_header(c, + it | hb_map (hb_iter) | hb_map (hb_len));
+
+ if (byteArray.length == 0)
+ {
+ COUNT *dest = c->allocate_min<COUNT> ();
+ if (unlikely (!dest)) return_trace (false);
+ *dest = 0;
+ return_trace (true);
+ }
+
+ /* serialize CFFIndex header */
+ if (unlikely (!c->extend_min (this))) return_trace (false);
+ this->count = byteArray.length;
+ this->offSize = offSize_;
+ if (unlikely (!c->allocate_size<HBUINT8> (offSize_ * (byteArray.length + 1))))
+ return_trace (false);
+
+ /* serialize indices */
+ unsigned int offset = 1;
+ unsigned int i = 0;
+ for (; i < byteArray.length; i++)
+ {
+ set_offset_at (i, offset);
+ offset += byteArray[i].get_size ();
+ }
+ set_offset_at (i, offset);
+
+ /* serialize data */
+ for (unsigned int i = 0; i < byteArray.length; i++)
+ {
+ const hb_ubytes_t &bs = byteArray[i];
+ unsigned char *dest = c->allocate_size<unsigned char> (bs.length);
+ if (unlikely (!dest)) return_trace (false);
+ memcpy (dest, &bs[0], bs.length);
+ }
+
+ return_trace (true);
+ }
+
+ bool serialize (hb_serialize_context_t *c,
+ unsigned int offSize_,
+ const str_buff_vec_t &buffArray)
+ {
+ byte_str_array_t byteArray;
+ byteArray.init ();
+ byteArray.resize (buffArray.length);
+ for (unsigned int i = 0; i < byteArray.length; i++)
+ byteArray[i] = hb_ubytes_t (buffArray[i].arrayZ, buffArray[i].length);
+ bool result = this->serialize (c, offSize_, byteArray);
+ byteArray.fini ();
+ return result;
+ }
+
+ template <typename Iterator,
+ hb_requires (hb_is_iterator (Iterator))>
+ bool serialize (hb_serialize_context_t *c,
+ Iterator it)
+ {
+ TRACE_SERIALIZE (this);
+ serialize_header(c, + it | hb_map ([] (const hb_ubytes_t &_) { return _.length; }));
for (const auto &_ : +it)
- hb_iter (_).copy (c);
+ _.copy (c);
return_trace (true);
}
+ bool serialize (hb_serialize_context_t *c,
+ const byte_str_array_t &byteArray)
+ { return serialize (c, + hb_iter (byteArray)); }
+
+ bool serialize (hb_serialize_context_t *c,
+ const str_buff_vec_t &buffArray)
+ {
+ auto it =
+ + hb_iter (buffArray)
+ | hb_map ([] (const str_buff_t &_) { return hb_ubytes_t (_.arrayZ, _.length); })
+ ;
+ return serialize (c, it);
+ }
+
template <typename Iterator,
hb_requires (hb_is_iterator (Iterator))>
bool serialize_header (hb_serialize_context_t *c,
@@ -101,7 +171,7 @@ struct CFFIndex
if (!this->count) return_trace (true);
if (unlikely (!c->extend (this->offSize))) return_trace (false);
this->offSize = off_size;
- if (unlikely (!c->allocate_size<HBUINT8> (off_size * (this->count + 1), false)))
+ if (unlikely (!c->allocate_size<HBUINT8> (off_size * (this->count + 1))))
return_trace (false);
/* serialize indices */
@@ -109,27 +179,14 @@ struct CFFIndex
unsigned int i = 0;
for (unsigned _ : +it)
{
- set_offset_at (i++, offset);
+ CFFIndex<COUNT>::set_offset_at (i++, offset);
offset += _;
}
- set_offset_at (i, offset);
+ CFFIndex<COUNT>::set_offset_at (i, offset);
return_trace (true);
}
- template <typename Iterable,
- hb_requires (hb_is_iterable (Iterable))>
- static unsigned total_size (const Iterable &iterable)
- {
- auto it = + hb_iter (iterable) | hb_map (hb_iter) | hb_map (hb_len);
- if (!it) return 0;
-
- unsigned total = + it | hb_reduce (hb_add, 0);
- unsigned off_size = (hb_bit_storage (total + 1) + 7) / 8;
-
- return min_size + HBUINT8::static_size + (hb_len (it) + 1) * off_size + total;
- }
-
void set_offset_at (unsigned int index, unsigned int offset)
{
assert (index <= count);
@@ -150,14 +207,10 @@ struct CFFIndex
unsigned int size = offSize;
const HBUINT8 *p = offsets + size * index;
- switch (size)
- {
- case 1: return * (HBUINT8 *) p;
- case 2: return * (HBUINT16 *) p;
- case 3: return * (HBUINT24 *) p;
- case 4: return * (HBUINT32 *) p;
- default: return 0;
- }
+ unsigned int offset = 0;
+ for (; size; size--)
+ offset = (offset << 8) + *p++;
+ return offset;
}
unsigned int length_at (unsigned int index) const
@@ -176,7 +229,6 @@ struct CFFIndex
hb_ubytes_t operator [] (unsigned int index) const
{
if (unlikely (index >= count)) return hb_ubytes_t ();
- _hb_compiler_memory_r_barrier ();
unsigned length = length_at (index);
if (unlikely (!length)) return hb_ubytes_t ();
return hb_ubytes_t (data_base () + offset_at (index) - 1, length);
@@ -228,7 +280,7 @@ struct CFFIndexOf : CFFIndex<COUNT>
if (unlikely (!c->extend_min (this))) return_trace (false);
this->count = dataArrayLen;
this->offSize = offSize_;
- if (unlikely (!c->allocate_size<HBUINT8> (offSize_ * (dataArrayLen + 1), false)))
+ if (unlikely (!c->allocate_size<HBUINT8> (offSize_ * (dataArrayLen + 1))))
return_trace (false);
/* serialize indices */
@@ -236,10 +288,10 @@ struct CFFIndexOf : CFFIndex<COUNT>
unsigned int i = 0;
for (; i < dataArrayLen; i++)
{
- this->set_offset_at (i, offset);
+ CFFIndex<COUNT>::set_offset_at (i, offset);
offset += dataSizeArray[i];
}
- this->set_offset_at (i, offset);
+ CFFIndex<COUNT>::set_offset_at (i, offset);
/* serialize data */
for (unsigned int i = 0; i < dataArrayLen; i++)
@@ -272,12 +324,13 @@ struct Dict : UnsizedByteStr
template <typename T, typename V>
static bool serialize_int_op (hb_serialize_context_t *c, op_code_t op, V value, op_code_t intOp)
{
- if (unlikely ((!serialize_int<T, V> (c, intOp, value))))
+ // XXX: not sure why but LLVM fails to compile the following 'unlikely' macro invocation
+ if (/*unlikely*/ (!serialize_int<T, V> (c, intOp, value)))
return false;
TRACE_SERIALIZE (this);
/* serialize the opcode */
- HBUINT8 *p = c->allocate_size<HBUINT8> (OpCode_Size (op), false);
+ HBUINT8 *p = c->allocate_size<HBUINT8> (OpCode_Size (op));
if (unlikely (!p)) return_trace (false);
if (Is_OpCode_ESC (op))
{
@@ -362,8 +415,9 @@ struct FDSelect0 {
TRACE_SANITIZE (this);
if (unlikely (!(c->check_struct (this))))
return_trace (false);
- if (unlikely (!c->check_array (fds, c->get_num_glyphs ())))
- return_trace (false);
+ for (unsigned int i = 0; i < c->get_num_glyphs (); i++)
+ if (unlikely (!fds[i].sanitize (c)))
+ return_trace (false);
return_trace (true);
}
@@ -417,20 +471,14 @@ struct FDSelect3_4
return_trace (true);
}
- static int _cmp_range (const void *_key, const void *_item)
- {
- hb_codepoint_t glyph = * (hb_codepoint_t *) _key;
- FDSelect3_4_Range<GID_TYPE, FD_TYPE> *range = (FDSelect3_4_Range<GID_TYPE, FD_TYPE> *) _item;
-
- if (glyph < range[0].first) return -1;
- if (glyph < range[1].first) return 0;
- return +1;
- }
-
hb_codepoint_t get_fd (hb_codepoint_t glyph) const
{
- auto *range = hb_bsearch (glyph, &ranges[0], nRanges () - 1, sizeof (ranges[0]), _cmp_range);
- return range ? range->fd : ranges[nRanges () - 1].fd;
+ unsigned int i;
+ for (i = 1; i < nRanges (); i++)
+ if (glyph < ranges[i].first)
+ break;
+
+ return (hb_codepoint_t) ranges[i - 1].fd;
}
GID_TYPE &nRanges () { return ranges.len; }
@@ -453,9 +501,9 @@ struct FDSelect
{
TRACE_SERIALIZE (this);
unsigned int size = src.get_size (num_glyphs);
- FDSelect *dest = c->allocate_size<FDSelect> (size, false);
+ FDSelect *dest = c->allocate_size<FDSelect> (size);
if (unlikely (!dest)) return_trace (false);
- hb_memcpy (dest, &src, size);
+ memcpy (dest, &src, size);
return_trace (true);
}
diff --git a/src/hb-ot-cff1-table.hh b/src/hb-ot-cff1-table.hh
index bb856c9dd..17b029661 100644
--- a/src/hb-ot-cff1-table.hh
+++ b/src/hb-ot-cff1-table.hh
@@ -175,7 +175,7 @@ struct Encoding
unsigned int size = src.get_size ();
Encoding *dest = c->allocate_size<Encoding> (size);
if (unlikely (!dest)) return_trace (false);
- hb_memcpy (dest, &src, size);
+ memcpy (dest, &src, size);
return_trace (true);
}
@@ -471,7 +471,7 @@ struct Charset
unsigned int size = src.get_size (num_glyphs);
Charset *dest = c->allocate_size<Charset> (size);
if (unlikely (!dest)) return_trace (false);
- hb_memcpy (dest, &src, size);
+ memcpy (dest, &src, size);
return_trace (true);
}
@@ -617,6 +617,7 @@ struct CFF1StringIndex : CFF1Index
}
byte_str_array_t bytesArray;
+ bytesArray.init ();
if (!bytesArray.resize (sidmap.get_population ()))
return_trace (false);
for (unsigned int i = 0; i < strings.count; i++)
@@ -627,6 +628,7 @@ struct CFF1StringIndex : CFF1Index
}
bool result = CFF1Index::serialize (c, bytesArray);
+ bytesArray.fini ();
return_trace (result);
}
};
@@ -811,7 +813,7 @@ struct cff1_top_dict_opset_t : top_dict_opset_t<cff1_top_dict_val_t>
break;
default:
- env.last_offset = env.str_ref.get_offset ();
+ env.last_offset = env.str_ref.offset;
top_dict_opset_t<cff1_top_dict_val_t>::process_op (op, env, dictval);
/* Record this operand below if stack is empty, otherwise done */
if (!env.argStack.is_empty ()) return;
@@ -1293,10 +1295,10 @@ struct cff1
}
protected:
+ hb_blob_t *blob = nullptr;
hb_sanitize_context_t sc;
public:
- hb_blob_t *blob = nullptr;
const Encoding *encoding = nullptr;
const Charset *charset = nullptr;
const CFF1NameIndex *nameIndex = nullptr;
diff --git a/src/hb-ot-cff2-table.hh b/src/hb-ot-cff2-table.hh
index 9081930bb..746160dc8 100644
--- a/src/hb-ot-cff2-table.hh
+++ b/src/hb-ot-cff2-table.hh
@@ -56,7 +56,7 @@ struct CFF2FDSelect
unsigned int size = src.get_size (num_glyphs);
CFF2FDSelect *dest = c->allocate_size<CFF2FDSelect> (size);
if (unlikely (!dest)) return_trace (false);
- hb_memcpy (dest, &src, size);
+ memcpy (dest, &src, size);
return_trace (true);
}
@@ -124,7 +124,7 @@ struct CFF2VariationStore
unsigned int size_ = varStore->get_size ();
CFF2VariationStore *dest = c->allocate_size<CFF2VariationStore> (size_);
if (unlikely (!dest)) return_trace (false);
- hb_memcpy (dest, varStore, size_);
+ memcpy (dest, varStore, size_);
return_trace (true);
}
@@ -483,18 +483,13 @@ struct cff2
blob = nullptr;
}
- hb_map_t *create_glyph_to_sid_map () const
- {
- return nullptr;
- }
-
bool is_valid () const { return blob; }
protected:
+ hb_blob_t *blob = nullptr;
hb_sanitize_context_t sc;
public:
- hb_blob_t *blob = nullptr;
cff2_top_dict_values_t topDict;
const CFF2Subrs *globalSubrs = nullptr;
const CFF2VariationStore *varStore = nullptr;
diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh
index 523196fa7..09c9fe93f 100644
--- a/src/hb-ot-cmap-table.hh
+++ b/src/hb-ot-cmap-table.hh
@@ -909,7 +909,7 @@ struct DefaultUVS : SortedArray32Of<UnicodeValueRange>
hb_codepoint_t first = arrayZ[i].startUnicodeValue;
hb_codepoint_t last = hb_min ((hb_codepoint_t) (first + arrayZ[i].additionalCount),
(hb_codepoint_t) HB_UNICODE_MAX);
- out->add_range (first, last);
+ out->add_range (first, hb_min (last, 0x10FFFFu));
}
}
@@ -925,75 +925,37 @@ struct DefaultUVS : SortedArray32Of<UnicodeValueRange>
if (unlikely (!c->copy<HBUINT32> (len))) return nullptr;
unsigned init_len = c->length ();
- if (this->len > unicodes->get_population () * hb_bit_storage ((unsigned) this->len))
- {
- hb_codepoint_t start = HB_SET_VALUE_INVALID;
- hb_codepoint_t end = HB_SET_VALUE_INVALID;
+ hb_codepoint_t lastCode = HB_MAP_VALUE_INVALID;
+ int count = -1;
- for (hb_codepoint_t u = HB_SET_VALUE_INVALID;
- unicodes->next (&u);)
+ for (const UnicodeValueRange& _ : as_array ())
+ {
+ for (const unsigned addcnt : hb_range ((unsigned) _.additionalCount + 1))
{
- if (!as_array ().bsearch (u))
- continue;
- if (start == HB_SET_VALUE_INVALID)
+ unsigned curEntry = (unsigned) _.startUnicodeValue + addcnt;
+ if (!unicodes->has (curEntry)) continue;
+ count += 1;
+ if (lastCode == HB_MAP_VALUE_INVALID)
+ lastCode = curEntry;
+ else if (lastCode + count != curEntry)
{
- start = u;
- end = start - 1;
- }
- if (end + 1 != u || end - start == 255)
- {
UnicodeValueRange rec;
- rec.startUnicodeValue = start;
- rec.additionalCount = end - start;
+ rec.startUnicodeValue = lastCode;
+ rec.additionalCount = count - 1;
c->copy<UnicodeValueRange> (rec);
- start = u;
- }
- end = u;
- }
- if (start != HB_SET_VALUE_INVALID)
- {
- UnicodeValueRange rec;
- rec.startUnicodeValue = start;
- rec.additionalCount = end - start;
- c->copy<UnicodeValueRange> (rec);
- }
- }
- else
- {
- hb_codepoint_t lastCode = HB_SET_VALUE_INVALID;
- int count = -1;
-
- for (const UnicodeValueRange& _ : *this)
- {
- hb_codepoint_t curEntry = (hb_codepoint_t) (_.startUnicodeValue - 1);
- hb_codepoint_t end = curEntry + _.additionalCount + 2;
-
- for (; unicodes->next (&curEntry) && curEntry < end;)
- {
- count += 1;
- if (lastCode == HB_SET_VALUE_INVALID)
- lastCode = curEntry;
- else if (lastCode + count != curEntry)
- {
- UnicodeValueRange rec;
- rec.startUnicodeValue = lastCode;
- rec.additionalCount = count - 1;
- c->copy<UnicodeValueRange> (rec);
-
- lastCode = curEntry;
- count = 0;
- }
+ lastCode = curEntry;
+ count = 0;
}
}
+ }
- if (lastCode != HB_MAP_VALUE_INVALID)
- {
- UnicodeValueRange rec;
- rec.startUnicodeValue = lastCode;
- rec.additionalCount = count;
- c->copy<UnicodeValueRange> (rec);
- }
+ if (lastCode != HB_MAP_VALUE_INVALID)
+ {
+ UnicodeValueRange rec;
+ rec.startUnicodeValue = lastCode;
+ rec.additionalCount = count;
+ c->copy<UnicodeValueRange> (rec);
}
if (c->length () - init_len == 0)
@@ -1512,80 +1474,32 @@ struct EncodingRecord
DEFINE_SIZE_STATIC (8);
};
-struct cmap;
-
struct SubtableUnicodesCache {
private:
- hb_blob_ptr_t<cmap> base_blob;
- const char* base;
- hb_hashmap_t<unsigned, hb::unique_ptr<hb_set_t>> cached_unicodes;
+ const void* base;
+ hb_hashmap_t<intptr_t, hb::unique_ptr<hb_set_t>> cached_unicodes;
public:
-
- static SubtableUnicodesCache* create (hb_blob_ptr_t<cmap> source_table)
- {
- SubtableUnicodesCache* cache =
- (SubtableUnicodesCache*) hb_malloc (sizeof(SubtableUnicodesCache));
- new (cache) SubtableUnicodesCache (source_table);
- return cache;
- }
-
- static void destroy (void* value) {
- if (!value) return;
-
- SubtableUnicodesCache* cache = (SubtableUnicodesCache*) value;
- cache->~SubtableUnicodesCache ();
- hb_free (cache);
- }
-
SubtableUnicodesCache(const void* cmap_base)
- : base_blob(),
- base ((const char*) cmap_base),
- cached_unicodes ()
- {}
-
- SubtableUnicodesCache(hb_blob_ptr_t<cmap> base_blob_)
- : base_blob(base_blob_),
- base ((const char *) base_blob.get()),
- cached_unicodes ()
- {}
-
- ~SubtableUnicodesCache()
- {
- base_blob.destroy ();
- }
-
- bool same_base(const void* other) const
- {
- return other == (const void*) base;
- }
+ : base(cmap_base), cached_unicodes() {}
- const hb_set_t* set_for (const EncodingRecord* record,
- SubtableUnicodesCache& mutable_cache) const
+ hb_set_t* set_for (const EncodingRecord* record)
{
- if (cached_unicodes.has ((unsigned) ((const char *) record - base)))
- return cached_unicodes.get ((unsigned) ((const char *) record - base));
-
- return mutable_cache.set_for (record);
- }
-
- const hb_set_t* set_for (const EncodingRecord* record)
- {
- if (!cached_unicodes.has ((unsigned) ((const char *) record - base)))
+ if (!cached_unicodes.has ((intptr_t) record))
{
hb_set_t *s = hb_set_create ();
if (unlikely (s->in_error ()))
return hb_set_get_empty ();
-
+
(base+record->subtable).collect_unicodes (s);
- if (unlikely (!cached_unicodes.set ((unsigned) ((const char *) record - base), hb::unique_ptr<hb_set_t> {s})))
+ if (unlikely (!cached_unicodes.set ((intptr_t) record, hb::unique_ptr<hb_set_t> {s})))
return hb_set_get_empty ();
return s;
}
- return cached_unicodes.get ((unsigned) ((const char *) record - base));
+ return cached_unicodes.get ((intptr_t) record);
}
};
@@ -1609,30 +1523,13 @@ struct cmap
{
static constexpr hb_tag_t tableTag = HB_OT_TAG_cmap;
-
- static SubtableUnicodesCache* create_filled_cache(hb_blob_ptr_t<cmap> source_table) {
- const cmap* cmap = source_table.get();
- auto it =
- + hb_iter (cmap->encodingRecord)
- | hb_filter ([&](const EncodingRecord& _) {
- return cmap::filter_encoding_records_for_subset (cmap, _);
- })
- ;
-
- SubtableUnicodesCache* cache = SubtableUnicodesCache::create(source_table);
- for (const EncodingRecord& _ : it)
- cache->set_for(&_); // populate the cache for this encoding record.
-
- return cache;
- }
-
template<typename Iterator, typename EncodingRecIter,
hb_requires (hb_is_iterator (EncodingRecIter))>
bool serialize (hb_serialize_context_t *c,
Iterator it,
EncodingRecIter encodingrec_iter,
const void *base,
- hb_subset_plan_t *plan,
+ const hb_subset_plan_t *plan,
bool drop_format_4 = false)
{
if (unlikely (!c->extend_min ((*this)))) return false;
@@ -1641,14 +1538,7 @@ struct cmap
unsigned format4objidx = 0, format12objidx = 0, format14objidx = 0;
auto snap = c->snapshot ();
- SubtableUnicodesCache local_unicodes_cache (base);
- const SubtableUnicodesCache* unicodes_cache = &local_unicodes_cache;
-
- if (plan->accelerator &&
- plan->accelerator->cmap_cache &&
- plan->accelerator->cmap_cache->same_base (base))
- unicodes_cache = plan->accelerator->cmap_cache;
-
+ SubtableUnicodesCache unicodes_cache (base);
for (const EncodingRecord& _ : encodingrec_iter)
{
if (c->in_error ())
@@ -1657,7 +1547,7 @@ struct cmap
unsigned format = (base+_.subtable).u.format;
if (format != 4 && format != 12 && format != 14) continue;
- const hb_set_t* unicodes_set = unicodes_cache->set_for (&_, local_unicodes_cache);
+ hb_set_t* unicodes_set = unicodes_cache.set_for (&_);
if (!drop_format_4 && format == 4)
{
@@ -1676,13 +1566,7 @@ struct cmap
else if (format == 12)
{
- if (_can_drop (_,
- *unicodes_set,
- base,
- *unicodes_cache,
- local_unicodes_cache,
- + it | hb_map (hb_first), encodingrec_iter))
- continue;
+ if (_can_drop (_, *unicodes_set, base, unicodes_cache, + it | hb_map (hb_first), encodingrec_iter)) continue;
c->copy (_, + it | hb_filter (*unicodes_set, hb_first), 12u, base, plan, &format12objidx);
}
else if (format == 14) c->copy (_, it, 14u, base, plan, &format14objidx);
@@ -1701,8 +1585,7 @@ struct cmap
bool _can_drop (const EncodingRecord& cmap12,
const hb_set_t& cmap12_unicodes,
const void* base,
- const SubtableUnicodesCache& unicodes_cache,
- SubtableUnicodesCache& local_unicodes_cache,
+ SubtableUnicodesCache& unicodes_cache,
Iterator subset_unicodes,
EncodingRecordIterator encoding_records)
{
@@ -1733,7 +1616,7 @@ struct cmap
|| (base+_.subtable).get_language() != target_language)
continue;
- const hb_set_t* sibling_unicodes = unicodes_cache.set_for (&_, local_unicodes_cache);
+ hb_set_t* sibling_unicodes = unicodes_cache.set_for (&_);
auto cmap12 = + subset_unicodes | hb_filter (cmap12_unicodes);
auto sibling = + subset_unicodes | hb_filter (*sibling_unicodes);
@@ -1770,9 +1653,17 @@ struct cmap
auto encodingrec_iter =
+ hb_iter (encodingRecord)
- | hb_filter ([&](const EncodingRecord& _) {
- return cmap::filter_encoding_records_for_subset (this, _);
- })
+ | hb_filter ([&] (const EncodingRecord& _)
+ {
+ if ((_.platformID == 0 && _.encodingID == 3) ||
+ (_.platformID == 0 && _.encodingID == 4) ||
+ (_.platformID == 3 && _.encodingID == 1) ||
+ (_.platformID == 3 && _.encodingID == 10) ||
+ (this + _.subtable).u.format == 14)
+ return true;
+
+ return false;
+ })
;
if (unlikely (!encodingrec_iter.len ())) return_trace (false);
@@ -1801,11 +1692,7 @@ struct cmap
{ return (_.second != HB_MAP_VALUE_INVALID); })
;
- return_trace (cmap_prime->serialize (c->serializer,
- it,
- encodingrec_iter,
- this,
- c->plan));
+ return_trace (cmap_prime->serialize (c->serializer, it, encodingrec_iter, this, c->plan));
}
const CmapSubtable *find_best_subtable (bool *symbol = nullptr) const
@@ -2041,19 +1928,6 @@ struct cmap
encodingRecord.sanitize (c, this));
}
- private:
-
- static bool filter_encoding_records_for_subset(const cmap* cmap,
- const EncodingRecord& _)
- {
- return
- (_.platformID == 0 && _.encodingID == 3) ||
- (_.platformID == 0 && _.encodingID == 4) ||
- (_.platformID == 3 && _.encodingID == 1) ||
- (_.platformID == 3 && _.encodingID == 10) ||
- (cmap + _.subtable).u.format == 14;
- }
-
protected:
HBUINT16 version; /* Table version number (0). */
SortedArray16Of<EncodingRecord>
diff --git a/src/hb-ot-color-cbdt-table.hh b/src/hb-ot-color-cbdt-table.hh
index 3246894d3..23fa56c4f 100644
--- a/src/hb-ot-color-cbdt-table.hh
+++ b/src/hb-ot-color-cbdt-table.hh
@@ -67,7 +67,7 @@ _copy_data_to_cbdt (hb_vector_t<char> *cbdt_prime,
{
unsigned int new_len = cbdt_prime->length + length;
if (unlikely (!cbdt_prime->alloc (new_len))) return false;
- hb_memcpy (cbdt_prime->arrayZ + cbdt_prime->length, data, length);
+ memcpy (cbdt_prime->arrayZ + cbdt_prime->length, data, length);
cbdt_prime->length = new_len;
return true;
}
@@ -468,13 +468,13 @@ struct IndexSubtableRecord
if (unlikely (!c->serializer->check_success (records->resize (records->length + 1))))
return_trace (false);
- records->tail ().firstGlyphIndex = 1;
- records->tail ().lastGlyphIndex = 0;
+ (*records)[records->length - 1].firstGlyphIndex = 1;
+ (*records)[records->length - 1].lastGlyphIndex = 0;
bitmap_size_context->size += IndexSubtableRecord::min_size;
c->serializer->push ();
- if (unlikely (!add_new_subtable (c, bitmap_size_context, &(records->tail ()), lookup, base, start)))
+ if (unlikely (!add_new_subtable (c, bitmap_size_context, &((*records)[records->length - 1]), lookup, base, start)))
{
c->serializer->pop_discard ();
c->serializer->revert (snap);
diff --git a/src/hb-ot-color-colr-table.hh b/src/hb-ot-color-colr-table.hh
index 1af9d3093..908bf550f 100644
--- a/src/hb-ot-color-colr-table.hh
+++ b/src/hb-ot-color-colr-table.hh
@@ -39,7 +39,11 @@
#define HB_OT_TAG_COLR HB_TAG('C','O','L','R')
#ifndef HB_COLRV1_MAX_NESTING_LEVEL
-#define HB_COLRV1_MAX_NESTING_LEVEL 16
+#define HB_COLRV1_MAX_NESTING_LEVEL 100
+#endif
+
+#ifndef COLRV1_ENABLE_SUBSETTING
+#define COLRV1_ENABLE_SUBSETTING 1
#endif
namespace OT {
@@ -184,7 +188,6 @@ struct Variable
protected:
T value;
- public:
VarIdx varIdxBase;
public:
DEFINE_SIZE_STATIC (4 + T::static_size);
@@ -193,8 +196,6 @@ struct Variable
template <typename T>
struct NoVariable
{
- static constexpr uint32_t varIdxBase = VarIdx::NO_VARIATION;
-
NoVariable<T>* copy (hb_serialize_context_t *c) const
{
TRACE_SERIALIZE (this);
@@ -887,11 +888,6 @@ struct PaintComposite
DEFINE_SIZE_STATIC (8);
};
-struct ClipBoxData
-{
- int xMin, yMin, xMax, yMax;
-};
-
struct ClipBoxFormat1
{
bool sanitize (hb_sanitize_context_t *c) const
@@ -900,14 +896,6 @@ struct ClipBoxFormat1
return_trace (c->check_struct (this));
}
- void get_clip_box (ClipBoxData &clip_box, const VarStoreInstancer &instancer HB_UNUSED) const
- {
- clip_box.xMin = xMin;
- clip_box.yMin = yMin;
- clip_box.xMax = xMax;
- clip_box.yMax = yMax;
- }
-
public:
HBUINT8 format; /* format = 1(noVar) or 2(Var)*/
FWORD xMin;
@@ -918,20 +906,7 @@ struct ClipBoxFormat1
DEFINE_SIZE_STATIC (1 + 4 * FWORD::static_size);
};
-struct ClipBoxFormat2 : Variable<ClipBoxFormat1>
-{
- void get_clip_box (ClipBoxData &clip_box, const VarStoreInstancer &instancer) const
- {
- value.get_clip_box(clip_box, instancer);
- if (instancer)
- {
- clip_box.xMin += _hb_roundf (instancer (varIdxBase, 0));
- clip_box.yMin += _hb_roundf (instancer (varIdxBase, 1));
- clip_box.xMax += _hb_roundf (instancer (varIdxBase, 2));
- clip_box.yMax += _hb_roundf (instancer (varIdxBase, 3));
- }
- }
-};
+struct ClipBoxFormat2 : Variable<ClipBoxFormat1> {};
struct ClipBox
{
@@ -957,28 +932,6 @@ struct ClipBox
}
}
- bool get_extents (hb_glyph_extents_t *extents,
- const VarStoreInstancer &instancer) const
- {
- ClipBoxData clip_box;
- switch (u.format) {
- case 1:
- u.format1.get_clip_box (clip_box, instancer);
- break;
- case 2:
- u.format2.get_clip_box (clip_box, instancer);
- break;
- default:
- return false;
- }
-
- extents->x_bearing = clip_box.xMin;
- extents->y_bearing = clip_box.yMax;
- extents->width = clip_box.xMax - clip_box.xMin;
- extents->height = clip_box.yMin - clip_box.yMax;
- return true;
- }
-
protected:
union {
HBUINT8 format; /* Format identifier */
@@ -989,9 +942,6 @@ struct ClipBox
struct ClipRecord
{
- int cmp (hb_codepoint_t g) const
- { return g < startGlyphID ? -1 : g <= endGlyphID ? 0 : +1; }
-
ClipRecord* copy (hb_serialize_context_t *c, const void *base) const
{
TRACE_SERIALIZE (this);
@@ -1007,13 +957,6 @@ struct ClipRecord
return_trace (c->check_struct (this) && clipBox.sanitize (c, base));
}
- bool get_extents (hb_glyph_extents_t *extents,
- const void *base,
- const VarStoreInstancer &instancer) const
- {
- return (base+clipBox).get_extents (extents, instancer);
- }
-
public:
HBUINT16 startGlyphID; // first gid clip applies to
HBUINT16 endGlyphID; // last gid clip applies to, inclusive
@@ -1021,7 +964,6 @@ struct ClipRecord
public:
DEFINE_SIZE_STATIC (7);
};
-DECLARE_NULL_NAMESPACE_BYTES (OT, ClipRecord);
struct ClipList
{
@@ -1110,26 +1052,11 @@ struct ClipList
bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
- // TODO Make a formatted struct!
return_trace (c->check_struct (this) && clips.sanitize (c, this));
}
- bool
- get_extents (hb_codepoint_t gid,
- hb_glyph_extents_t *extents,
- const VarStoreInstancer &instancer) const
- {
- auto *rec = clips.as_array ().bsearch (gid);
- if (rec)
- {
- rec->get_extents (extents, this, instancer);
- return true;
- }
- return false;
- }
-
HBUINT8 format; // Set to 1.
- SortedArray32Of<ClipRecord> clips; // Clip records, sorted by startGlyphID
+ Array32Of<ClipRecord> clips; // Clip records, sorted by startGlyphID
public:
DEFINE_SIZE_ARRAY_SIZED (5, clips);
};
@@ -1432,7 +1359,7 @@ struct COLR
(this+baseGlyphsZ).sanitize (c, numBaseGlyphs) &&
(this+layersZ).sanitize (c, numLayers) &&
(version == 0 ||
- (version == 1 &&
+ (COLRV1_ENABLE_SUBSETTING && version == 1 &&
baseGlyphList.sanitize (c, this) &&
layerList.sanitize (c, this) &&
clipList.sanitize (c, this) &&
@@ -1589,30 +1516,6 @@ struct COLR
return_trace (true);
}
- bool
- get_extents (hb_font_t *font, hb_codepoint_t glyph, hb_glyph_extents_t *extents) const
- {
- if (version != 1)
- return false;
-
- VarStoreInstancer instancer (this+varStore,
- this+varIdxMap,
- hb_array (font->coords, font->num_coords));
-
- if ((this+clipList).get_extents (glyph,
- extents,
- instancer))
- {
- extents->x_bearing = font->em_scale_x (extents->x_bearing);
- extents->y_bearing = font->em_scale_x (extents->y_bearing);
- extents->width = font->em_scale_x (extents->width);
- extents->height = font->em_scale_x (extents->height);
- return true;
- }
-
- return false;
- }
-
protected:
HBUINT16 version; /* Table version number (starts at 0). */
HBUINT16 numBaseGlyphs; /* Number of Base Glyph Records. */
diff --git a/src/hb-ot-face-table-list.hh b/src/hb-ot-face-table-list.hh
index c9da36c1b..c05034b3b 100644
--- a/src/hb-ot-face-table-list.hh
+++ b/src/hb-ot-face-table-list.hh
@@ -56,9 +56,9 @@ HB_OT_CORE_TABLE (OT, maxp)
#if !defined(HB_NO_FACE_COLLECT_UNICODES) || !defined(HB_NO_OT_FONT)
HB_OT_ACCELERATOR (OT, cmap)
#endif
-HB_OT_CORE_TABLE (OT, hhea)
+HB_OT_TABLE (OT, hhea)
HB_OT_ACCELERATOR (OT, hmtx)
-HB_OT_CORE_TABLE (OT, OS2)
+HB_OT_TABLE (OT, OS2)
#if !defined(HB_NO_OT_FONT_GLYPH_NAMES) || !defined(HB_NO_METRICS) || !defined(HB_NO_STYLE)
HB_OT_ACCELERATOR (OT, post)
#endif
@@ -66,7 +66,7 @@ HB_OT_ACCELERATOR (OT, post)
HB_OT_ACCELERATOR (OT, name)
#endif
#ifndef HB_NO_STYLE
-HB_OT_CORE_TABLE (OT, STAT)
+HB_OT_TABLE (OT, STAT)
#endif
#ifndef HB_NO_META
HB_OT_ACCELERATOR (OT, meta)
@@ -74,9 +74,9 @@ HB_OT_ACCELERATOR (OT, meta)
/* Vertical layout. */
#ifndef HB_NO_VERTICAL
-HB_OT_CORE_TABLE (OT, vhea)
+HB_OT_TABLE (OT, vhea)
HB_OT_ACCELERATOR (OT, vmtx)
-HB_OT_CORE_TABLE (OT, VORG)
+HB_OT_TABLE (OT, VORG)
#endif
/* TrueType outlines. */
@@ -91,15 +91,15 @@ HB_OT_ACCELERATOR (OT, cff2)
/* OpenType variations. */
#ifndef HB_NO_VAR
-HB_OT_CORE_TABLE (OT, fvar)
-HB_OT_CORE_TABLE (OT, avar)
+HB_OT_TABLE (OT, fvar)
+HB_OT_TABLE (OT, avar)
HB_OT_ACCELERATOR (OT, gvar)
-HB_OT_CORE_TABLE (OT, MVAR)
+HB_OT_TABLE (OT, MVAR)
#endif
/* Legacy kern. */
#ifndef HB_NO_OT_KERN
-HB_OT_CORE_TABLE (OT, kern)
+HB_OT_TABLE (OT, kern)
#endif
/* OpenType shaping. */
@@ -107,12 +107,12 @@ HB_OT_CORE_TABLE (OT, kern)
HB_OT_ACCELERATOR (OT, GDEF)
HB_OT_ACCELERATOR (OT, GSUB)
HB_OT_ACCELERATOR (OT, GPOS)
-//HB_OT_CORE_TABLE (OT, JSTF)
+//HB_OT_TABLE (OT, JSTF)
#endif
/* OpenType baseline. */
#ifndef HB_NO_BASE
-HB_OT_CORE_TABLE (OT, BASE)
+HB_OT_TABLE (OT, BASE)
#endif
/* AAT shaping. */
@@ -129,8 +129,8 @@ HB_OT_TABLE (AAT, feat)
/* OpenType color fonts. */
#ifndef HB_NO_COLOR
-HB_OT_CORE_TABLE (OT, COLR)
-HB_OT_CORE_TABLE (OT, CPAL)
+HB_OT_TABLE (OT, COLR)
+HB_OT_TABLE (OT, CPAL)
HB_OT_ACCELERATOR (OT, CBDT)
HB_OT_ACCELERATOR (OT, sbix)
HB_OT_ACCELERATOR (OT, SVG)
@@ -138,7 +138,7 @@ HB_OT_ACCELERATOR (OT, SVG)
/* OpenType math. */
#ifndef HB_NO_MATH
-HB_OT_CORE_TABLE (OT, MATH)
+HB_OT_TABLE (OT, MATH)
#endif
diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc
index 840510342..825b30853 100644
--- a/src/hb-ot-font.cc
+++ b/src/hb-ot-font.cc
@@ -45,7 +45,6 @@
#include "hb-ot-vorg-table.hh"
#include "hb-ot-color-cbdt-table.hh"
#include "hb-ot-color-sbix-table.hh"
-#include "hb-ot-color-colr-table.hh"
/**
@@ -351,15 +350,13 @@ hb_ot_get_glyph_extents (hb_font_t *font,
if (ot_face->sbix->get_extents (font, glyph, extents)) return true;
if (ot_face->CBDT->get_extents (font, glyph, extents)) return true;
#endif
-#if !defined(HB_NO_COLOR)
- if (ot_face->COLR->get_extents (font, glyph, extents)) return true;
-#endif
if (ot_face->glyf->get_extents (font, glyph, extents)) return true;
#ifndef HB_NO_OT_FONT_CFF
if (ot_face->cff1->get_extents (font, glyph, extents)) return true;
if (ot_face->cff2->get_extents (font, glyph, extents)) return true;
#endif
+ // TODO Hook up side-bearings variations.
return false;
}
diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh
index 0f424f5aa..579abf011 100644
--- a/src/hb-ot-layout-common.hh
+++ b/src/hb-ot-layout-common.hh
@@ -478,7 +478,7 @@ struct IndexArray : Array16Of<Index>
{
if (_count)
{
- + this->as_array ().sub_array (start_offset, _count)
+ + this->sub_array (start_offset, _count)
| hb_sink (hb_array (_indexes, *_count))
;
}
@@ -658,7 +658,7 @@ struct FeatureParamsCharacterVariants
{
if (char_count)
{
- + characters.as_array ().sub_array (start_offset, char_count)
+ + characters.sub_array (start_offset, char_count)
| hb_sink (hb_array (chars, *char_count))
;
}
@@ -932,7 +932,7 @@ struct RecordArrayOf : SortedArray16Of<Record<Type>>
{
if (record_count)
{
- + this->as_array ().sub_array (start_offset, record_count)
+ + this->sub_array (start_offset, record_count)
| hb_map (&Record<Type>::tag)
| hb_sink (hb_array (record_tags, *record_count))
;
@@ -980,16 +980,18 @@ struct RecordListOfFeature : RecordListOf<Feature>
auto *out = c->serializer->start_embed (*this);
if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
- + hb_enumerate (*this)
- | hb_filter (l->feature_index_map, hb_first)
- | hb_apply ([l, out, this] (const hb_pair_t<unsigned, const Record<Feature>&>& _)
+ unsigned count = this->len;
+
+ + hb_zip (*this, hb_range (count))
+ | hb_filter (l->feature_index_map, hb_second)
+ | hb_apply ([l, out, this] (const hb_pair_t<const Record<Feature>&, unsigned>& _)
{
const Feature *f_sub = nullptr;
const Feature **f = nullptr;
- if (l->feature_substitutes_map->has (_.first, &f))
+ if (l->feature_substitutes_map->has (_.second, &f))
f_sub = *f;
- subset_record_array (l, out, this, f_sub) (_.second);
+ subset_record_array (l, out, this, f_sub) (_.first);
})
;
@@ -1077,7 +1079,7 @@ struct LangSys
auto *out = c->serializer->start_embed (*this);
if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
- const uint32_t *v;
+ const unsigned *v;
out->reqFeatureIndex = l->feature_index_map->has (reqFeatureIndex, &v) ? *v : 0xFFFFu;
if (!l->visitFeatureIndex (featureIndex.len))
@@ -1145,6 +1147,7 @@ struct Script
return;
}
+ unsigned langsys_count = get_lang_sys_count ();
if (has_default_lang_sys ())
{
//only collect features from non-redundant langsys
@@ -1153,24 +1156,24 @@ struct Script
d.collect_features (c);
}
- for (auto _ : + hb_enumerate (langSys))
+ for (auto _ : + hb_zip (langSys, hb_range (langsys_count)))
{
- const LangSys& l = this+_.second.offset;
+ const LangSys& l = this+_.first.offset;
if (!c->visitLangsys (l.get_feature_count ())) continue;
if (l.compare (d, c->duplicate_feature_map)) continue;
l.collect_features (c);
- c->script_langsys_map->get (script_index)->add (_.first);
+ c->script_langsys_map->get (script_index)->add (_.second);
}
}
else
{
- for (auto _ : + hb_enumerate (langSys))
+ for (auto _ : + hb_zip (langSys, hb_range (langsys_count)))
{
- const LangSys& l = this+_.second.offset;
+ const LangSys& l = this+_.first.offset;
if (!c->visitLangsys (l.get_feature_count ())) continue;
l.collect_features (c);
- c->script_langsys_map->get (script_index)->add (_.first);
+ c->script_langsys_map->get (script_index)->add (_.second);
}
}
}
@@ -1208,9 +1211,10 @@ struct Script
const hb_set_t *active_langsys = l->script_langsys_map->get (l->cur_script_index);
if (active_langsys)
{
- + hb_enumerate (langSys)
- | hb_filter (active_langsys, hb_first)
- | hb_map (hb_second)
+ unsigned count = langSys.len;
+ + hb_zip (langSys, hb_range (count))
+ | hb_filter (active_langsys, hb_second)
+ | hb_map (hb_first)
| hb_filter ([=] (const Record<LangSys>& record) {return l->visitLangSys (); })
| hb_apply (subset_record_array (l, &(out->langSys), this))
;
@@ -1246,11 +1250,12 @@ struct RecordListOfScript : RecordListOf<Script>
auto *out = c->serializer->start_embed (*this);
if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
- for (auto _ : + hb_enumerate (*this))
+ unsigned count = this->len;
+ for (auto _ : + hb_zip (*this, hb_range (count)))
{
auto snap = c->serializer->snapshot ();
- l->cur_script_index = _.first;
- bool ret = _.second.subset (l, this);
+ l->cur_script_index = _.second;
+ bool ret = _.first.subset (l, this);
if (!ret) c->serializer->revert (snap);
else out->len++;
}
@@ -1383,13 +1388,7 @@ struct Lookup
outMarkFilteringSet = markFilteringSet;
}
- // Always keep the lookup even if it's empty. The rest of layout subsetting depends on lookup
- // indices being consistent with those computed during planning. So if an empty lookup is
- // discarded during the subset phase it will invalidate all subsequent lookup indices.
- // Generally we shouldn't end up with an empty lookup as we pre-prune them during the planning
- // phase, but it can happen in rare cases such as when during closure subtable is considered
- // degenerate (see: https://github.com/harfbuzz/harfbuzz/issues/3853)
- return true;
+ return_trace (out->subTable.len);
}
template <typename TSubTable>
@@ -1455,9 +1454,10 @@ struct LookupOffsetList : List16OfOffsetTo<TLookup, OffsetType>
auto *out = c->serializer->start_embed (this);
if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
- + hb_enumerate (*this)
- | hb_filter (l->lookup_index_map, hb_first)
- | hb_map (hb_second)
+ unsigned count = this->len;
+ + hb_zip (*this, hb_range (count))
+ | hb_filter (l->lookup_index_map, hb_second)
+ | hb_map (hb_first)
| hb_apply (subset_offset_array (c, *out, this))
;
return_trace (true);
@@ -1491,7 +1491,7 @@ static bool ClassDef_remap_and_serialize (hb_serialize_context_t *c,
klass_map->set (0, 0);
unsigned idx = klass_map->has (0) ? 1 : 0;
- for (const unsigned k: klasses)
+ for (const unsigned k: klasses.iter ())
{
if (klass_map->has (k)) continue;
klass_map->set (k, idx);
@@ -1524,11 +1524,6 @@ struct ClassDefFormat1_3
return classValue[(unsigned int) (glyph_id - startGlyph)];
}
- unsigned get_population () const
- {
- return classValue.len;
- }
-
template<typename Iterator,
hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))>
bool serialize (hb_serialize_context_t *c,
@@ -1553,7 +1548,7 @@ struct ClassDefFormat1_3
startGlyph = glyph_min;
if (unlikely (!classValue.serialize (c, glyph_count))) return_trace (false);
- for (const hb_pair_t<hb_codepoint_t, uint32_t> gid_klass_pair : + it)
+ for (const hb_pair_t<hb_codepoint_t, unsigned> gid_klass_pair : + it)
{
unsigned idx = gid_klass_pair.first - glyph_min;
classValue[idx] = gid_klass_pair.second;
@@ -1644,10 +1639,11 @@ struct ClassDefFormat1_3
bool intersects (const hb_set_t *glyphs) const
{
+ /* TODO Speed up, using hb_set_next()? */
hb_codepoint_t start = startGlyph;
hb_codepoint_t end = startGlyph + classValue.len;
for (hb_codepoint_t iter = startGlyph - 1;
- glyphs->next (&iter) && iter < end;)
+ hb_set_next (glyphs, &iter) && iter < end;)
if (classValue[iter - start]) return true;
return false;
}
@@ -1658,10 +1654,10 @@ struct ClassDefFormat1_3
{
/* Match if there's any glyph that is not listed! */
hb_codepoint_t g = HB_SET_VALUE_INVALID;
- if (!glyphs->next (&g)) return false;
+ if (!hb_set_next (glyphs, &g)) return false;
if (g < startGlyph) return true;
g = startGlyph + count - 1;
- if (glyphs->next (&g)) return true;
+ if (hb_set_next (glyphs, &g)) return true;
/* Fall through. */
}
/* TODO Speed up, using set overlap first? */
@@ -1679,12 +1675,12 @@ struct ClassDefFormat1_3
if (klass == 0)
{
unsigned start_glyph = startGlyph;
- for (uint32_t g = HB_SET_VALUE_INVALID;
- glyphs->next (&g) && g < start_glyph;)
+ for (unsigned g = HB_SET_VALUE_INVALID;
+ hb_set_next (glyphs, &g) && g < start_glyph;)
intersect_glyphs->add (g);
- for (uint32_t g = startGlyph + count - 1;
- glyphs-> next (&g);)
+ for (unsigned g = startGlyph + count - 1;
+ hb_set_next (glyphs, &g);)
intersect_glyphs->add (g);
return;
@@ -1700,7 +1696,7 @@ struct ClassDefFormat1_3
unsigned start_glyph = startGlyph;
unsigned end_glyph = start_glyph + count;
for (unsigned g = startGlyph - 1;
- glyphs->next (&g) && g < end_glyph;)
+ hb_set_next (glyphs, &g) && g < end_glyph;)
if (classValue.arrayZ[g - start_glyph] == klass)
intersect_glyphs->add (g);
#endif
@@ -1743,14 +1739,6 @@ struct ClassDefFormat2_4
return rangeRecord.bsearch (glyph_id).value;
}
- 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<typename Iterator,
hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))>
bool serialize (hb_serialize_context_t *c,
@@ -1814,45 +1802,28 @@ struct ClassDefFormat2_4
{
TRACE_SUBSET (this);
const hb_map_t &glyph_map = *c->plan->glyph_map_gsub;
- const hb_set_t &glyph_set = *c->plan->glyphset_gsub ();
hb_sorted_vector_t<hb_pair_t<hb_codepoint_t, hb_codepoint_t>> glyph_and_klass;
hb_set_t orig_klasses;
- if (glyph_set.get_population () * hb_bit_storage ((unsigned) rangeRecord.len) / 2
- < get_population ())
+ unsigned num_source_glyphs = c->plan->source->get_num_glyphs ();
+ unsigned count = rangeRecord.len;
+ for (unsigned i = 0; i < count; i++)
{
- for (hb_codepoint_t g : glyph_set)
+ unsigned klass = rangeRecord[i].value;
+ if (!klass) continue;
+ hb_codepoint_t start = rangeRecord[i].first;
+ hb_codepoint_t end = hb_min (rangeRecord[i].last + 1, num_source_glyphs);
+ for (hb_codepoint_t g = start; g < end; g++)
{
- unsigned klass = get_class (g);
- if (!klass) continue;
- hb_codepoint_t new_gid = glyph_map[g];
+ hb_codepoint_t new_gid = glyph_map[g];
if (new_gid == HB_MAP_VALUE_INVALID) continue;
- if (glyph_filter && !glyph_filter->has (g)) continue;
+ if (glyph_filter && !glyph_filter->has (g)) continue;
+
glyph_and_klass.push (hb_pair (new_gid, klass));
orig_klasses.add (klass);
}
}
- else
- {
- unsigned num_source_glyphs = c->plan->source->get_num_glyphs ();
- for (auto &range : rangeRecord)
- {
- unsigned klass = range.value;
- if (!klass) continue;
- hb_codepoint_t start = range.first;
- hb_codepoint_t end = hb_min (range.last + 1, num_source_glyphs);
- for (hb_codepoint_t g = start; g < end; g++)
- {
- hb_codepoint_t new_gid = glyph_map[g];
- if (new_gid == HB_MAP_VALUE_INVALID) continue;
- if (glyph_filter && !glyph_filter->has (g)) continue;
-
- glyph_and_klass.push (hb_pair (new_gid, klass));
- orig_klasses.add (klass);
- }
- }
- }
const hb_set_t& glyphset = *c->plan->glyphset_gsub ();
unsigned glyph_count = glyph_filter
@@ -1879,9 +1850,10 @@ struct ClassDefFormat2_4
template <typename set_t>
bool collect_coverage (set_t *glyphs) const
{
- for (auto &range : rangeRecord)
- if (range.value)
- if (unlikely (!range.collect_coverage (glyphs)))
+ unsigned int count = rangeRecord.len;
+ for (unsigned int i = 0; i < count; i++)
+ if (rangeRecord[i].value)
+ if (unlikely (!rangeRecord[i].collect_coverage (glyphs)))
return false;
return true;
}
@@ -1889,10 +1861,11 @@ struct ClassDefFormat2_4
template <typename set_t>
bool collect_class (set_t *glyphs, unsigned int klass) const
{
- for (auto &range : rangeRecord)
+ unsigned int count = rangeRecord.len;
+ for (unsigned int i = 0; i < count; i++)
{
- if (range.value == klass)
- if (unlikely (!range.collect_coverage (glyphs)))
+ if (rangeRecord[i].value == klass)
+ if (unlikely (!rangeRecord[i].collect_coverage (glyphs)))
return false;
}
return true;
@@ -1900,32 +1873,32 @@ struct ClassDefFormat2_4
bool intersects (const hb_set_t *glyphs) const
{
- if (rangeRecord.len > glyphs->get_population () * hb_bit_storage ((unsigned) rangeRecord.len) / 2)
+ /* TODO Speed up, using hb_set_next() and bsearch()? */
+ unsigned int count = rangeRecord.len;
+ for (unsigned int i = 0; i < count; i++)
{
- for (hb_codepoint_t g = HB_SET_VALUE_INVALID; glyphs->next (&g);)
- if (get_class (g))
- return true;
- return false;
+ const auto& range = rangeRecord[i];
+ if (range.intersects (*glyphs) && range.value)
+ return true;
}
-
- return hb_any (+ hb_iter (rangeRecord)
- | hb_map ([glyphs] (const RangeRecord<Types> &range) { return range.intersects (*glyphs) && range.value; }));
+ return false;
}
bool intersects_class (const hb_set_t *glyphs, uint16_t klass) const
{
+ unsigned int count = rangeRecord.len;
if (klass == 0)
{
/* Match if there's any glyph that is not listed! */
hb_codepoint_t g = HB_SET_VALUE_INVALID;
- for (auto &range : rangeRecord)
+ for (unsigned int i = 0; i < count; i++)
{
- if (!glyphs->next (&g))
+ if (!hb_set_next (glyphs, &g))
break;
- if (g < range.first)
+ if (g < rangeRecord[i].first)
return true;
- g = range.last;
+ g = rangeRecord[i].last;
}
- if (g != HB_SET_VALUE_INVALID && glyphs->next (&g))
+ if (g != HB_SET_VALUE_INVALID && hb_set_next (glyphs, &g))
return true;
/* Fall through. */
}
@@ -1937,49 +1910,49 @@ struct ClassDefFormat2_4
void intersected_class_glyphs (const hb_set_t *glyphs, unsigned klass, hb_set_t *intersect_glyphs) const
{
+ unsigned count = rangeRecord.len;
if (klass == 0)
{
hb_codepoint_t g = HB_SET_VALUE_INVALID;
- for (auto &range : rangeRecord)
+ for (unsigned int i = 0; i < count; i++)
{
- if (!glyphs->next (&g))
+ if (!hb_set_next (glyphs, &g))
goto done;
- while (g < range.first)
+ while (g < rangeRecord[i].first)
{
intersect_glyphs->add (g);
- if (!glyphs->next (&g))
+ if (!hb_set_next (glyphs, &g))
goto done;
}
- g = range.last;
+ g = rangeRecord[i].last;
}
- while (glyphs->next (&g))
+ while (hb_set_next (glyphs, &g))
intersect_glyphs->add (g);
done:
return;
}
- unsigned count = rangeRecord.len;
- if (count > glyphs->get_population () * hb_bit_storage (count) * 8)
+#if 0
+ /* The following implementation is faster asymptotically, but slower
+ * in practice. */
+ if ((count >> 3) > glyphs->get_population ())
{
for (hb_codepoint_t g = HB_SET_VALUE_INVALID;
- glyphs->next (&g);)
- {
- unsigned i;
- if (rangeRecord.as_array ().bfind (g, &i) &&
- rangeRecord.arrayZ[i].value == klass)
+ hb_set_next (glyphs, &g);)
+ if (rangeRecord.as_array ().bfind (g))
intersect_glyphs->add (g);
- }
return;
}
+#endif
- for (auto &range : rangeRecord)
+ for (unsigned int i = 0; i < count; i++)
{
- if (range.value != klass) continue;
+ if (rangeRecord[i].value != klass) continue;
- unsigned end = range.last + 1;
- for (hb_codepoint_t g = range.first - 1;
- glyphs->next (&g) && g < end;)
+ unsigned end = rangeRecord[i].last + 1;
+ for (hb_codepoint_t g = rangeRecord[i].first - 1;
+ hb_set_next (glyphs, &g) && g < end;)
intersect_glyphs->add (g);
}
}
@@ -1988,24 +1961,25 @@ struct ClassDefFormat2_4
{
if (glyphs->is_empty ()) return;
+ unsigned count = rangeRecord.len;
hb_codepoint_t g = HB_SET_VALUE_INVALID;
- for (auto &range : rangeRecord)
+ for (unsigned int i = 0; i < count; i++)
{
- if (!glyphs->next (&g))
+ if (!hb_set_next (glyphs, &g))
break;
- if (g < range.first)
+ if (g < rangeRecord[i].first)
{
intersect_classes->add (0);
break;
}
- g = range.last;
+ g = rangeRecord[i].last;
}
- if (g != HB_SET_VALUE_INVALID && glyphs->next (&g))
+ if (g != HB_SET_VALUE_INVALID && hb_set_next (glyphs, &g))
intersect_classes->add (0);
- for (const auto& range : rangeRecord)
- if (range.intersects (*glyphs))
- intersect_classes->add (range.value);
+ for (const auto& record : rangeRecord.iter ())
+ if (record.intersects (*glyphs))
+ intersect_classes->add (record.value);
}
protected:
@@ -2020,8 +1994,10 @@ struct ClassDefFormat2_4
struct ClassDef
{
/* Has interface. */
- unsigned operator [] (hb_codepoint_t k) const { return get (k); }
- bool has (hb_codepoint_t k) const { return (*this)[k]; }
+ static constexpr unsigned SENTINEL = 0;
+ 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; }
/* Projection. */
hb_codepoint_t operator () (hb_codepoint_t k) const { return get (k); }
@@ -2039,19 +2015,6 @@ struct ClassDef
}
}
- unsigned get_population () const
- {
- switch (u.format) {
- case 1: return u.format1.get_population ();
- case 2: return u.format2.get_population ();
-#ifndef HB_NO_BEYOND_64K
- case 3: return u.format3.get_population ();
- case 4: return u.format4.get_population ();
-#endif
- default:return NOT_COVERED;
- }
- }
-
template<typename Iterator,
hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))>
bool serialize (hb_serialize_context_t *c, Iterator it_with_class_zero)
@@ -2369,7 +2332,7 @@ struct VarRegionList
{
unsigned int backward = region_map.backward (r);
if (backward >= region_count) return_trace (false);
- hb_memcpy (&axesZ[axisCount * r], &src->axesZ[axisCount * backward], VarRegionAxis::static_size * axisCount);
+ memcpy (&axesZ[axisCount * r], &src->axesZ[axisCount * backward], VarRegionAxis::static_size * axisCount);
}
return_trace (true);
@@ -2479,26 +2442,21 @@ struct VarData
unsigned ri_count = src->regionIndices.len;
enum delta_size_t { kZero=0, kNonWord, kWord };
hb_vector_t<delta_size_t> delta_sz;
- hb_vector_t<unsigned int> ri_map; /* maps new index to old index */
+ hb_vector_t<unsigned int> ri_map; /* maps old index to new index */
delta_sz.resize (ri_count);
ri_map.resize (ri_count);
unsigned int new_word_count = 0;
unsigned int r;
- const HBUINT8 *src_delta_bytes = src->get_delta_bytes ();
- unsigned src_row_size = src->get_row_size ();
- unsigned src_word_count = src->wordCount ();
- bool src_long_words = src->longWords ();
-
bool has_long = false;
- if (src_long_words)
+ if (src->longWords ())
{
- for (r = 0; r < src_word_count; r++)
+ for (r = 0; r < ri_count; r++)
{
for (unsigned int i = 0; i < inner_map.get_next_value (); i++)
{
unsigned int old = inner_map.backward (i);
- int32_t delta = src->get_item_delta_fast (old, r, src_delta_bytes, src_row_size);
+ int32_t delta = src->get_item_delta (old, r);
if (delta < -65536 || 65535 < delta)
{
has_long = true;
@@ -2512,13 +2470,11 @@ struct VarData
signed max_threshold = has_long ? +65535 : +127;
for (r = 0; r < ri_count; r++)
{
- bool short_circuit = src_long_words == has_long && src_word_count <= r;
-
delta_sz[r] = kZero;
for (unsigned int i = 0; i < inner_map.get_next_value (); i++)
{
unsigned int old = inner_map.backward (i);
- int32_t delta = src->get_item_delta_fast (old, r, src_delta_bytes, src_row_size);
+ int32_t delta = src->get_item_delta (old, r);
if (delta < min_threshold || max_threshold < delta)
{
delta_sz[r] = kWord;
@@ -2526,11 +2482,7 @@ struct VarData
break;
}
else if (delta != 0)
- {
delta_sz[r] = kNonWord;
- if (short_circuit)
- break;
- }
}
}
@@ -2540,8 +2492,7 @@ struct VarData
for (r = 0; r < ri_count; r++)
if (delta_sz[r])
{
- unsigned new_r = (delta_sz[r] == kWord)? word_index++ : non_word_index++;
- ri_map[new_r] = r;
+ ri_map[r] = (delta_sz[r] == kWord)? word_index++ : non_word_index++;
new_ri_count++;
}
@@ -2551,20 +2502,14 @@ struct VarData
if (unlikely (!c->extend (this))) return_trace (false);
- for (r = 0; r < new_ri_count; r++)
- regionIndices[r] = region_map[src->regionIndices[ri_map[r]]];
+ for (r = 0; r < ri_count; r++)
+ if (delta_sz[r]) regionIndices[ri_map[r]] = region_map[src->regionIndices[r]];
- HBUINT8 *delta_bytes = get_delta_bytes ();
- unsigned row_size = get_row_size ();
- unsigned count = itemCount;
- for (unsigned int i = 0; i < count; i++)
+ for (unsigned int i = 0; i < itemCount; i++)
{
- unsigned int old = inner_map.backward (i);
- for (unsigned int r = 0; r < new_ri_count; r++)
- set_item_delta_fast (i, r,
- src->get_item_delta_fast (old, ri_map[r],
- src_delta_bytes, src_row_size),
- delta_bytes, row_size);
+ unsigned int old = inner_map.backward (i);
+ for (unsigned int r = 0; r < ri_count; r++)
+ if (delta_sz[r]) set_item_delta (i, ri_map[r], src->get_item_delta (old, r));
}
return_trace (true);
@@ -2572,15 +2517,12 @@ struct VarData
void collect_region_refs (hb_set_t &region_indices, const hb_inc_bimap_t &inner_map) const
{
- const HBUINT8 *delta_bytes = get_delta_bytes ();
- unsigned row_size = get_row_size ();
-
for (unsigned int r = 0; r < regionIndices.len; r++)
{
- unsigned int region = regionIndices.arrayZ[r];
+ unsigned int region = regionIndices[r];
if (region_indices.has (region)) continue;
for (unsigned int i = 0; i < inner_map.get_next_value (); i++)
- if (get_item_delta_fast (inner_map.backward (i), r, delta_bytes, row_size) != 0)
+ if (get_item_delta (inner_map.backward (i), r) != 0)
{
region_indices.add (region);
break;
@@ -2595,12 +2537,10 @@ struct VarData
HBUINT8 *get_delta_bytes ()
{ return &StructAfter<HBUINT8> (regionIndices); }
- int32_t get_item_delta_fast (unsigned int item, unsigned int region,
- const HBUINT8 *delta_bytes, unsigned row_size) const
+ int32_t get_item_delta (unsigned int item, unsigned int region) const
{
- if (unlikely (item >= itemCount || region >= regionIndices.len)) return 0;
-
- const HBINT8 *p = (const HBINT8 *) delta_bytes + item * row_size;
+ if ( item >= itemCount || unlikely (region >= regionIndices.len)) return 0;
+ const HBINT8 *p = (const HBINT8 *) get_delta_bytes () + item * get_row_size ();
unsigned word_count = wordCount ();
bool is_long = longWords ();
if (is_long)
@@ -2618,17 +2558,10 @@ struct VarData
return (p + HBINT16::static_size * word_count)[region - word_count];
}
}
- int32_t get_item_delta (unsigned int item, unsigned int region) const
- {
- return get_item_delta_fast (item, region,
- get_delta_bytes (),
- get_row_size ());
- }
- void set_item_delta_fast (unsigned int item, unsigned int region, int32_t delta,
- HBUINT8 *delta_bytes, unsigned row_size)
+ void set_item_delta (unsigned int item, unsigned int region, int32_t delta)
{
- HBINT8 *p = (HBINT8 *) delta_bytes + item * row_size;
+ HBINT8 *p = (HBINT8 *)get_delta_bytes () + item * get_row_size ();
unsigned word_count = wordCount ();
bool is_long = longWords ();
if (is_long)
@@ -2646,12 +2579,6 @@ struct VarData
(p + HBINT16::static_size * word_count)[region - word_count] = delta;
}
}
- void set_item_delta (unsigned int item, unsigned int region, int32_t delta)
- {
- set_item_delta_fast (item, region, delta,
- get_delta_bytes (),
- get_row_size ());
- }
bool longWords () const { return wordSizeCount & 0x8000u /* LONG_WORDS */; }
unsigned wordCount () const { return wordSizeCount & 0x7FFFu /* WORD_DELTA_COUNT_MASK */; }
@@ -2715,14 +2642,6 @@ struct VariationStore
unsigned int inner = index & 0xFFFF;
return get_delta (outer, inner, coords, coord_count, cache);
}
- float get_delta (unsigned int index,
- hb_array_t<int> coords,
- VarRegionList::cache_t *cache = nullptr) const
- {
- return get_delta (index,
- coords.arrayZ, coords.length,
- cache);
- }
bool sanitize (hb_sanitize_context_t *c) const
{
@@ -3029,7 +2948,7 @@ struct ConditionSet
// all conditions met
if (num_kept_cond == 0) return DROP_COND_WITH_VAR;
-
+
//check if condition_set is unique with variations
if (c->conditionset_map->has (p))
//duplicate found, drop the entire record
@@ -3501,16 +3420,17 @@ struct VariationDevice
{
TRACE_SERIALIZE (this);
if (!layout_variation_idx_delta_map) return_trace (nullptr);
-
- hb_pair_t<unsigned, int> *v;
- if (!layout_variation_idx_delta_map->has (varIdx, &v))
- return_trace (nullptr);
-
- c->start_zerocopy (this->static_size);
+ auto snap = c->snapshot ();
auto *out = c->embed (this);
if (unlikely (!out)) return_trace (nullptr);
- unsigned new_idx = hb_first (*v);
+ /* TODO Just get() and bail if NO_VARIATION. Needs to setup the map to return that. */
+ if (!layout_variation_idx_delta_map->has (varIdx))
+ {
+ c->revert (snap);
+ return_trace (nullptr);
+ }
+ unsigned new_idx = hb_first (layout_variation_idx_delta_map->get (varIdx));
out->varIdx = new_idx;
return_trace (out);
}
diff --git a/src/hb-ot-layout-gdef-table.hh b/src/hb-ot-layout-gdef-table.hh
index a84edef16..22925fdfa 100644
--- a/src/hb-ot-layout-gdef-table.hh
+++ b/src/hb-ot-layout-gdef-table.hh
@@ -73,7 +73,7 @@ struct AttachList
if (point_count)
{
- + points.as_array ().sub_array (start_offset, point_count)
+ + points.sub_array (start_offset, point_count)
| hb_sink (hb_array (point_array, *point_count))
;
}
@@ -322,7 +322,7 @@ struct LigGlyph
{
if (caret_count)
{
- + carets.as_array ().sub_array (start_offset, caret_count)
+ + carets.sub_array (start_offset, caret_count)
| hb_map (hb_add (this))
| hb_map ([&] (const CaretValue &value) { return value.get_caret_value (font, direction, glyph_id, var_store); })
| hb_sink (hb_array (caret_array, *caret_count))
diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh
index 04ccefd10..d1d94255f 100644
--- a/src/hb-ot-layout-gsubgpos.hh
+++ b/src/hb-ot-layout-gsubgpos.hh
@@ -100,8 +100,8 @@ struct hb_closure_context_t :
bool is_lookup_done (unsigned int lookup_index)
{
- if (unlikely (done_lookups_glyph_count->in_error () ||
- done_lookups_glyph_set->in_error ()))
+ if (done_lookups_glyph_count->in_error () ||
+ done_lookups_glyph_set->in_error ())
return true;
/* Have we visited this lookup with the current set of glyphs? */
@@ -535,12 +535,7 @@ struct hb_ot_apply_context_t :
bool next (unsigned *unsafe_to = nullptr)
{
assert (num_items > 0);
- /* The alternate condition below is faster at string boundaries,
- * but produces subpar "unsafe-to-concat" values. */
- signed stop = (signed) end - (signed) num_items;
- if (c->buffer->flags & HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT)
- stop = (signed) end - 1;
- while ((signed) idx < stop)
+ while (idx + num_items < end)
{
idx++;
hb_glyph_info_t &info = c->buffer->info[idx];
@@ -573,12 +568,7 @@ struct hb_ot_apply_context_t :
bool prev (unsigned *unsafe_from = nullptr)
{
assert (num_items > 0);
- /* The alternate condition below is faster at string boundaries,
- * but produces subpar "unsafe-to-concat" values. */
- unsigned stop = num_items - 1;
- if (c->buffer->flags & HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT)
- stop = 1 - 1;
- while (idx > stop)
+ while (idx > num_items - 1)
{
idx--;
hb_glyph_info_t &info = c->buffer->out_info[idx];
@@ -682,7 +672,6 @@ struct hb_ot_apply_context_t :
const GDEF &gdef;
const VariationStore &var_store;
VariationStore::cache_t *var_store_cache;
- hb_set_digest_t digest;
hb_direction_t direction;
hb_mask_t lookup_mask = 1;
@@ -718,7 +707,6 @@ struct hb_ot_apply_context_t :
nullptr
#endif
),
- digest (buffer_->digest ()),
direction (buffer_->props.direction),
has_glyph_classes (gdef.has_glyph_classes ())
{ init_iters (); }
@@ -793,10 +781,8 @@ struct hb_ot_apply_context_t :
void _set_glyph_class (hb_codepoint_t glyph_index,
unsigned int class_guess = 0,
bool ligature = false,
- bool component = false)
+ bool component = false) const
{
- digest.add (glyph_index);
-
if (new_syllables != (unsigned) -1)
buffer->cur().syllable() = new_syllables;
@@ -829,24 +815,24 @@ struct hb_ot_apply_context_t :
_hb_glyph_info_set_glyph_props (&buffer->cur(), props);
}
- void replace_glyph (hb_codepoint_t glyph_index)
+ void replace_glyph (hb_codepoint_t glyph_index) const
{
_set_glyph_class (glyph_index);
(void) buffer->replace_glyph (glyph_index);
}
- void replace_glyph_inplace (hb_codepoint_t glyph_index)
+ void replace_glyph_inplace (hb_codepoint_t glyph_index) const
{
_set_glyph_class (glyph_index);
buffer->cur().codepoint = glyph_index;
}
void replace_glyph_with_ligature (hb_codepoint_t glyph_index,
- unsigned int class_guess)
+ unsigned int class_guess) const
{
_set_glyph_class (glyph_index, class_guess, true);
(void) buffer->replace_glyph (glyph_index);
}
void output_glyph_for_component (hb_codepoint_t glyph_index,
- unsigned int class_guess)
+ unsigned int class_guess) const
{
_set_glyph_class (glyph_index, class_guess, false, true);
(void) buffer->output_glyph (glyph_index);
@@ -858,7 +844,7 @@ struct hb_accelerate_subtables_context_t :
hb_dispatch_context_t<hb_accelerate_subtables_context_t>
{
template <typename Type>
- static inline bool apply_to (const void *obj, hb_ot_apply_context_t *c)
+ static inline bool apply_to (const void *obj, OT::hb_ot_apply_context_t *c)
{
const Type *typed_obj = (const Type *) obj;
return typed_obj->apply (c);
@@ -866,30 +852,30 @@ struct hb_accelerate_subtables_context_t :
#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
template <typename T>
- static inline auto apply_cached_ (const T *obj, hb_ot_apply_context_t *c, hb_priority<1>) HB_RETURN (bool, obj->apply (c, true) )
+ static inline auto apply_cached_ (const T *obj, OT::hb_ot_apply_context_t *c, hb_priority<1>) HB_RETURN (bool, obj->apply (c, true) )
template <typename T>
- static inline auto apply_cached_ (const T *obj, hb_ot_apply_context_t *c, hb_priority<0>) HB_RETURN (bool, obj->apply (c) )
+ static inline auto apply_cached_ (const T *obj, OT::hb_ot_apply_context_t *c, hb_priority<0>) HB_RETURN (bool, obj->apply (c) )
template <typename Type>
- static inline bool apply_cached_to (const void *obj, hb_ot_apply_context_t *c)
+ static inline bool apply_cached_to (const void *obj, OT::hb_ot_apply_context_t *c)
{
const Type *typed_obj = (const Type *) obj;
return apply_cached_ (typed_obj, c, hb_prioritize);
}
template <typename T>
- static inline auto cache_func_ (const T *obj, hb_ot_apply_context_t *c, bool enter, hb_priority<1>) HB_RETURN (bool, obj->cache_func (c, enter) )
+ static inline auto cache_func_ (const T *obj, OT::hb_ot_apply_context_t *c, bool enter, hb_priority<1>) HB_RETURN (bool, obj->cache_func (c, enter) )
template <typename T>
- static inline bool cache_func_ (const T *obj, hb_ot_apply_context_t *c, bool enter, hb_priority<0>) { return false; }
+ static inline bool cache_func_ (const T *obj, OT::hb_ot_apply_context_t *c, bool enter, hb_priority<0>) { return false; }
template <typename Type>
- static inline bool cache_func_to (const void *obj, hb_ot_apply_context_t *c, bool enter)
+ static inline bool cache_func_to (const void *obj, OT::hb_ot_apply_context_t *c, bool enter)
{
const Type *typed_obj = (const Type *) obj;
return cache_func_ (typed_obj, c, enter, hb_prioritize);
}
#endif
- typedef bool (*hb_apply_func_t) (const void *obj, hb_ot_apply_context_t *c);
- typedef bool (*hb_cache_func_t) (const void *obj, hb_ot_apply_context_t *c, bool enter);
+ typedef bool (*hb_apply_func_t) (const void *obj, OT::hb_ot_apply_context_t *c);
+ typedef bool (*hb_cache_func_t) (const void *obj, OT::hb_ot_apply_context_t *c, bool enter);
struct hb_applicable_t
{
@@ -915,20 +901,20 @@ struct hb_accelerate_subtables_context_t :
obj_.get_coverage ().collect_coverage (&digest);
}
- bool apply (hb_ot_apply_context_t *c) const
+ bool apply (OT::hb_ot_apply_context_t *c) const
{
return digest.may_have (c->buffer->cur().codepoint) && apply_func (obj, c);
}
#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
- bool apply_cached (hb_ot_apply_context_t *c) const
+ bool apply_cached (OT::hb_ot_apply_context_t *c) const
{
return digest.may_have (c->buffer->cur().codepoint) && apply_cached_func (obj, c);
}
- bool cache_enter (hb_ot_apply_context_t *c) const
+ bool cache_enter (OT::hb_ot_apply_context_t *c) const
{
return cache_func (obj, c, true);
}
- void cache_leave (hb_ot_apply_context_t *c) const
+ void cache_leave (OT::hb_ot_apply_context_t *c) const
{
cache_func (obj, c, false);
}
@@ -1002,8 +988,8 @@ struct hb_accelerate_subtables_context_t :
};
-typedef bool (*intersects_func_t) (const hb_set_t *glyphs, unsigned value, const void *data, void *cache);
-typedef void (*intersected_glyphs_func_t) (const hb_set_t *glyphs, const void *data, unsigned value, hb_set_t *intersected_glyphs, void *cache);
+typedef bool (*intersects_func_t) (const hb_set_t *glyphs, unsigned value, const void *data);
+typedef void (*intersected_glyphs_func_t) (const hb_set_t *glyphs, const void *data, unsigned value, hb_set_t *intersected_glyphs);
typedef void (*collect_glyphs_func_t) (hb_set_t *glyphs, unsigned value, const void *data);
typedef bool (*match_func_t) (hb_glyph_info_t &info, unsigned value, const void *data);
@@ -1026,25 +1012,16 @@ struct ChainContextApplyFuncs
};
-static inline bool intersects_glyph (const hb_set_t *glyphs, unsigned value, const void *data HB_UNUSED, void *cache HB_UNUSED)
+static inline bool intersects_glyph (const hb_set_t *glyphs, unsigned value, const void *data HB_UNUSED)
{
return glyphs->has (value);
}
-static inline bool intersects_class (const hb_set_t *glyphs, unsigned value, const void *data, void *cache)
+static inline bool intersects_class (const hb_set_t *glyphs, unsigned value, const void *data)
{
const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
- hb_map_t *map = (hb_map_t *) cache;
-
- hb_codepoint_t *cached_v;
- if (map->has (value, &cached_v))
- return *cached_v;
-
- bool v = class_def.intersects_class (glyphs, value);
- map->set (value, v);
-
- return v;
+ return class_def.intersects_class (glyphs, value);
}
-static inline bool intersects_coverage (const hb_set_t *glyphs, unsigned value, const void *data, void *cache HB_UNUSED)
+static inline bool intersects_coverage (const hb_set_t *glyphs, unsigned value, const void *data)
{
Offset16To<Coverage> coverage;
coverage = value;
@@ -1052,36 +1029,17 @@ static inline bool intersects_coverage (const hb_set_t *glyphs, unsigned value,
}
-static inline void intersected_glyph (const hb_set_t *glyphs HB_UNUSED, const void *data, unsigned value, hb_set_t *intersected_glyphs, HB_UNUSED void *cache)
+static inline void intersected_glyph (const hb_set_t *glyphs HB_UNUSED, const void *data, unsigned value, hb_set_t *intersected_glyphs)
{
unsigned g = reinterpret_cast<const HBUINT16 *>(data)[value];
intersected_glyphs->add (g);
}
-
-using intersected_class_cache_t = hb_hashmap_t<unsigned, hb_set_t>;
-
-static inline void intersected_class_glyphs (const hb_set_t *glyphs, const void *data, unsigned value, hb_set_t *intersected_glyphs, void *cache)
+static inline void intersected_class_glyphs (const hb_set_t *glyphs, const void *data, unsigned value, hb_set_t *intersected_glyphs)
{
const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
-
- intersected_class_cache_t *map = (intersected_class_cache_t *) cache;
-
- hb_set_t *cached_v;
- if (map->has (value, &cached_v))
- {
- intersected_glyphs->union_ (*cached_v);
- return;
- }
-
- hb_set_t v;
- class_def.intersected_class_glyphs (glyphs, value, &v);
-
- intersected_glyphs->union_ (v);
-
- map->set (value, std::move (v));
+ class_def.intersected_class_glyphs (glyphs, value, intersected_glyphs);
}
-
-static inline void intersected_coverage_glyphs (const hb_set_t *glyphs, const void *data, unsigned value, hb_set_t *intersected_glyphs, HB_UNUSED void *cache)
+static inline void intersected_coverage_glyphs (const hb_set_t *glyphs, const void *data, unsigned value, hb_set_t *intersected_glyphs)
{
Offset16To<Coverage> coverage;
coverage = value;
@@ -1094,11 +1052,10 @@ static inline bool array_is_subset_of (const hb_set_t *glyphs,
unsigned int count,
const HBUINT values[],
intersects_func_t intersects_func,
- const void *intersects_data,
- void *cache)
+ const void *intersects_data)
{
for (const auto &_ : + hb_iter (values, count))
- if (!intersects_func (glyphs, _, intersects_data, cache)) return false;
+ if (!intersects_func (glyphs, _, intersects_data)) return false;
return true;
}
@@ -1535,8 +1492,7 @@ static void context_closure_recurse_lookups (hb_closure_context_t *c,
unsigned value,
ContextFormat context_format,
const void *data,
- intersected_glyphs_func_t intersected_glyphs_func,
- void *cache)
+ intersected_glyphs_func_t intersected_glyphs_func)
{
hb_set_t *covered_seq_indicies = hb_set_create ();
for (unsigned int i = 0; i < lookupCount; i++)
@@ -1557,7 +1513,7 @@ static void context_closure_recurse_lookups (hb_closure_context_t *c,
pos_glyphs.add (value);
break;
case ContextFormat::ClassBasedContext:
- intersected_glyphs_func (&c->parent_active_glyphs (), data, value, &pos_glyphs, cache);
+ intersected_glyphs_func (&c->parent_active_glyphs (), data, value, &pos_glyphs);
break;
case ContextFormat::CoverageBasedContext:
pos_glyphs.set (c->parent_active_glyphs ());
@@ -1574,7 +1530,7 @@ static void context_closure_recurse_lookups (hb_closure_context_t *c,
input_value = input[seqIndex - 1];
}
- intersected_glyphs_func (c->glyphs, input_data, input_value, &pos_glyphs, cache);
+ intersected_glyphs_func (c->glyphs, input_data, input_value, &pos_glyphs);
}
}
@@ -1754,8 +1710,6 @@ struct ContextClosureLookupContext
ContextClosureFuncs funcs;
ContextFormat context_format;
const void *intersects_data;
- void *intersects_cache;
- void *intersected_glyphs_cache;
};
struct ContextCollectGlyphsLookupContext
@@ -1778,9 +1732,7 @@ static inline bool context_intersects (const hb_set_t *glyphs,
{
return array_is_subset_of (glyphs,
inputCount ? inputCount - 1 : 0, input,
- lookup_context.funcs.intersects,
- lookup_context.intersects_data,
- lookup_context.intersects_cache);
+ lookup_context.funcs.intersects, lookup_context.intersects_data);
}
template <typename HBUINT>
@@ -1801,8 +1753,7 @@ static inline void context_closure_lookup (hb_closure_context_t *c,
value,
lookup_context.context_format,
lookup_context.intersects_data,
- lookup_context.funcs.intersected_glyphs,
- lookup_context.intersected_glyphs_cache);
+ lookup_context.funcs.intersected_glyphs);
}
template <typename HBUINT>
@@ -1826,7 +1777,7 @@ static inline bool context_would_apply_lookup (hb_would_apply_context_t *c,
const HBUINT input[], /* Array of input values--start with second glyph */
unsigned int lookupCount HB_UNUSED,
const LookupRecord lookupRecord[] HB_UNUSED,
- const ContextApplyLookupContext &lookup_context)
+ ContextApplyLookupContext &lookup_context)
{
return would_match_input (c,
inputCount, input,
@@ -1839,7 +1790,7 @@ static inline bool context_apply_lookup (hb_ot_apply_context_t *c,
const HBUINT input[], /* Array of input values--start with second glyph */
unsigned int lookupCount,
const LookupRecord lookupRecord[],
- const ContextApplyLookupContext &lookup_context)
+ ContextApplyLookupContext &lookup_context)
{
unsigned match_end = 0;
unsigned match_positions[HB_MAX_CONTEXT_LENGTH];
@@ -1907,7 +1858,7 @@ struct Rule
}
bool would_apply (hb_would_apply_context_t *c,
- const ContextApplyLookupContext &lookup_context) const
+ ContextApplyLookupContext &lookup_context) const
{
const auto &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord>>
(inputZ.as_array (inputCount ? inputCount - 1 : 0));
@@ -1918,7 +1869,7 @@ struct Rule
}
bool apply (hb_ot_apply_context_t *c,
- const ContextApplyLookupContext &lookup_context) const
+ ContextApplyLookupContext &lookup_context) const
{
TRACE_APPLY (this);
const auto &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord>>
@@ -2038,7 +1989,7 @@ struct RuleSet
}
bool would_apply (hb_would_apply_context_t *c,
- const ContextApplyLookupContext &lookup_context) const
+ ContextApplyLookupContext &lookup_context) const
{
return
+ hb_iter (rule)
@@ -2049,7 +2000,7 @@ struct RuleSet
}
bool apply (hb_ot_apply_context_t *c,
- const ContextApplyLookupContext &lookup_context) const
+ ContextApplyLookupContext &lookup_context) const
{
TRACE_APPLY (this);
return_trace (
@@ -2157,7 +2108,7 @@ struct ContextFormat1_4
void closure_lookups (hb_closure_lookups_context_t *c) const
{
struct ContextClosureLookupContext lookup_context = {
- {intersects_glyph, nullptr},
+ {intersects_glyph, intersected_glyph},
ContextFormat::SimpleContext,
nullptr
};
@@ -2269,12 +2220,10 @@ struct ContextFormat2_5
const ClassDef &class_def = this+classDef;
- hb_map_t cache;
struct ContextClosureLookupContext lookup_context = {
- {intersects_class, nullptr},
+ {intersects_class, intersected_class_glyphs},
ContextFormat::ClassBasedContext,
- &class_def,
- &cache
+ &class_def
};
hb_set_t retained_coverage_glyphs;
@@ -2310,14 +2259,10 @@ struct ContextFormat2_5
const ClassDef &class_def = this+classDef;
- hb_map_t cache;
- intersected_class_cache_t intersected_cache;
struct ContextClosureLookupContext lookup_context = {
{intersects_class, intersected_class_glyphs},
ContextFormat::ClassBasedContext,
- &class_def,
- &cache,
- &intersected_cache
+ &class_def
};
+ hb_enumerate (ruleSet)
@@ -2341,12 +2286,10 @@ struct ContextFormat2_5
const ClassDef &class_def = this+classDef;
- hb_map_t cache;
struct ContextClosureLookupContext lookup_context = {
- {intersects_class, nullptr},
+ {intersects_class, intersected_class_glyphs},
ContextFormat::ClassBasedContext,
- &class_def,
- &cache
+ &class_def
};
+ hb_iter (ruleSet)
@@ -2464,7 +2407,6 @@ struct ContextFormat2_5
const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups;
bool ret = true;
int non_zero_index = -1, index = 0;
- auto snapshot = c->serializer->snapshot();
for (const auto& _ : + hb_enumerate (ruleSet)
| hb_filter (klass_map, hb_first))
{
@@ -2476,10 +2418,8 @@ struct ContextFormat2_5
}
if (coverage_glyph_classes.has (_.first) &&
- o->serialize_subset (c, _.second, this, lookup_map, &klass_map)) {
+ o->serialize_subset (c, _.second, this, lookup_map, &klass_map))
non_zero_index = index;
- snapshot = c->serializer->snapshot();
- }
index++;
}
@@ -2493,7 +2433,6 @@ struct ContextFormat2_5
out->ruleSet.pop ();
index--;
}
- c->serializer->revert (snapshot);
return_trace (bool (out->ruleSet));
}
@@ -2530,7 +2469,7 @@ struct ContextFormat3
return false;
struct ContextClosureLookupContext lookup_context = {
- {intersects_coverage, nullptr},
+ {intersects_coverage, intersected_coverage_glyphs},
ContextFormat::CoverageBasedContext,
this
};
@@ -2716,8 +2655,6 @@ struct ChainContextClosureLookupContext
ContextClosureFuncs funcs;
ContextFormat context_format;
const void *intersects_data[3];
- void *intersects_cache[3];
- void *intersected_glyphs_cache;
};
struct ChainContextCollectGlyphsLookupContext
@@ -2744,19 +2681,13 @@ static inline bool chain_context_intersects (const hb_set_t *glyphs,
{
return array_is_subset_of (glyphs,
backtrackCount, backtrack,
- lookup_context.funcs.intersects,
- lookup_context.intersects_data[0],
- lookup_context.intersects_cache[0])
+ lookup_context.funcs.intersects, lookup_context.intersects_data[0])
&& array_is_subset_of (glyphs,
inputCount ? inputCount - 1 : 0, input,
- lookup_context.funcs.intersects,
- lookup_context.intersects_data[1],
- lookup_context.intersects_cache[1])
+ lookup_context.funcs.intersects, lookup_context.intersects_data[1])
&& array_is_subset_of (glyphs,
lookaheadCount, lookahead,
- lookup_context.funcs.intersects,
- lookup_context.intersects_data[2],
- lookup_context.intersects_cache[2]);
+ lookup_context.funcs.intersects, lookup_context.intersects_data[2]);
}
template <typename HBUINT>
@@ -2783,8 +2714,7 @@ static inline void chain_context_closure_lookup (hb_closure_context_t *c,
value,
lookup_context.context_format,
lookup_context.intersects_data[1],
- lookup_context.funcs.intersected_glyphs,
- lookup_context.intersected_glyphs_cache);
+ lookup_context.funcs.intersected_glyphs);
}
template <typename HBUINT>
@@ -2822,7 +2752,7 @@ static inline bool chain_context_would_apply_lookup (hb_would_apply_context_t *c
const HBUINT lookahead[] HB_UNUSED,
unsigned int lookupCount HB_UNUSED,
const LookupRecord lookupRecord[] HB_UNUSED,
- const ChainContextApplyLookupContext &lookup_context)
+ ChainContextApplyLookupContext &lookup_context)
{
return (c->zero_context ? !backtrackCount && !lookaheadCount : true)
&& would_match_input (c,
@@ -2840,7 +2770,7 @@ static inline bool chain_context_apply_lookup (hb_ot_apply_context_t *c,
const HBUINT lookahead[],
unsigned int lookupCount,
const LookupRecord lookupRecord[],
- const ChainContextApplyLookupContext &lookup_context)
+ ChainContextApplyLookupContext &lookup_context)
{
unsigned end_index = c->buffer->idx;
unsigned match_end = 0;
@@ -2934,7 +2864,7 @@ struct ChainRule
}
bool would_apply (hb_would_apply_context_t *c,
- const ChainContextApplyLookupContext &lookup_context) const
+ ChainContextApplyLookupContext &lookup_context) const
{
const auto &input = StructAfter<decltype (inputX)> (backtrack);
const auto &lookahead = StructAfter<decltype (lookaheadX)> (input);
@@ -2946,8 +2876,7 @@ struct ChainRule
lookup.arrayZ, lookup_context);
}
- bool apply (hb_ot_apply_context_t *c,
- const ChainContextApplyLookupContext &lookup_context) const
+ bool apply (hb_ot_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
{
TRACE_APPLY (this);
const auto &input = StructAfter<decltype (inputX)> (backtrack);
@@ -3113,8 +3042,7 @@ struct ChainRuleSet
;
}
- bool would_apply (hb_would_apply_context_t *c,
- const ChainContextApplyLookupContext &lookup_context) const
+ bool would_apply (hb_would_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
{
return
+ hb_iter (rule)
@@ -3124,8 +3052,7 @@ struct ChainRuleSet
;
}
- bool apply (hb_ot_apply_context_t *c,
- const ChainContextApplyLookupContext &lookup_context) const
+ bool apply (hb_ot_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const
{
TRACE_APPLY (this);
return_trace (
@@ -3239,7 +3166,7 @@ struct ChainContextFormat1_4
void closure_lookups (hb_closure_lookups_context_t *c) const
{
struct ChainContextClosureLookupContext lookup_context = {
- {intersects_glyph, nullptr},
+ {intersects_glyph, intersected_glyph},
ContextFormat::SimpleContext,
{nullptr, nullptr, nullptr}
};
@@ -3351,14 +3278,12 @@ struct ChainContextFormat2_5
const ClassDef &input_class_def = this+inputClassDef;
const ClassDef &lookahead_class_def = this+lookaheadClassDef;
- hb_map_t caches[3] = {};
struct ChainContextClosureLookupContext lookup_context = {
- {intersects_class, nullptr},
+ {intersects_class, intersected_class_glyphs},
ContextFormat::ClassBasedContext,
{&backtrack_class_def,
&input_class_def,
- &lookahead_class_def},
- {&caches[0], &caches[1], &caches[2]}
+ &lookahead_class_def}
};
hb_set_t retained_coverage_glyphs;
@@ -3396,16 +3321,12 @@ struct ChainContextFormat2_5
const ClassDef &input_class_def = this+inputClassDef;
const ClassDef &lookahead_class_def = this+lookaheadClassDef;
- hb_map_t caches[3] = {};
- intersected_class_cache_t intersected_cache;
struct ChainContextClosureLookupContext lookup_context = {
{intersects_class, intersected_class_glyphs},
ContextFormat::ClassBasedContext,
{&backtrack_class_def,
&input_class_def,
- &lookahead_class_def},
- {&caches[0], &caches[1], &caches[2]},
- &intersected_cache
+ &lookahead_class_def}
};
+ hb_enumerate (ruleSet)
@@ -3431,14 +3352,12 @@ struct ChainContextFormat2_5
const ClassDef &input_class_def = this+inputClassDef;
const ClassDef &lookahead_class_def = this+lookaheadClassDef;
- hb_map_t caches[3] = {};
struct ChainContextClosureLookupContext lookup_context = {
- {intersects_class, nullptr},
+ {intersects_class, intersected_class_glyphs},
ContextFormat::ClassBasedContext,
{&backtrack_class_def,
&input_class_def,
- &lookahead_class_def},
- {&caches[0], &caches[1], &caches[2]}
+ &lookahead_class_def}
};
+ hb_iter (ruleSet)
@@ -3668,7 +3587,7 @@ struct ChainContextFormat3
const auto &lookahead = StructAfter<decltype (lookaheadX)> (input);
struct ChainContextClosureLookupContext lookup_context = {
- {intersects_coverage, nullptr},
+ {intersects_coverage, intersected_coverage_glyphs},
ContextFormat::CoverageBasedContext,
{this, this, this}
};
@@ -4019,14 +3938,13 @@ struct hb_ot_layout_lookup_accelerator_t
template <typename TLookup>
void init (const TLookup &lookup)
{
+ digest.init ();
+ lookup.collect_coverage (&digest);
+
subtables.init ();
- hb_accelerate_subtables_context_t c_accelerate_subtables (subtables);
+ OT::hb_accelerate_subtables_context_t c_accelerate_subtables (subtables);
lookup.dispatch (&c_accelerate_subtables);
- digest.init ();
- for (auto& subtable : hb_iter (subtables))
- digest.add (subtable.digest);
-
#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
cache_user_idx = c_accelerate_subtables.cache_user_idx;
for (unsigned i = 0; i < subtables.length; i++)
@@ -4044,25 +3962,21 @@ struct hb_ot_layout_lookup_accelerator_t
#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
if (use_cache)
{
- return
- + hb_iter (subtables)
- | hb_map ([&c] (const hb_accelerate_subtables_context_t::hb_applicable_t &_) { return _.apply_cached (c); })
- | hb_any
- ;
+ for (unsigned int i = 0; i < subtables.length; i++)
+ if (subtables[i].apply_cached (c))
+ return true;
}
else
#endif
{
- return
- + hb_iter (subtables)
- | hb_map ([&c] (const hb_accelerate_subtables_context_t::hb_applicable_t &_) { return _.apply (c); })
- | hb_any
- ;
+ for (unsigned int i = 0; i < subtables.length; i++)
+ if (subtables[i].apply (c))
+ return true;
}
return false;
}
- bool cache_enter (hb_ot_apply_context_t *c) const
+ bool cache_enter (OT::hb_ot_apply_context_t *c) const
{
#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
return cache_user_idx != (unsigned) -1 &&
@@ -4071,7 +3985,7 @@ struct hb_ot_layout_lookup_accelerator_t
return false;
#endif
}
- void cache_leave (hb_ot_apply_context_t *c) const
+ void cache_leave (OT::hb_ot_apply_context_t *c) const
{
#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
subtables[cache_user_idx].cache_leave (c);
@@ -4079,8 +3993,8 @@ struct hb_ot_layout_lookup_accelerator_t
}
- hb_set_digest_t digest;
private:
+ hb_set_digest_t digest;
hb_accelerate_subtables_context_t::array_t subtables;
#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
unsigned cache_user_idx = (unsigned) -1;
@@ -4341,11 +4255,11 @@ struct GSUBGPOS
hb_set_t *lookup_indexes /* IN/OUT */) const
{
hb_set_t visited_lookups, inactive_lookups;
- hb_closure_lookups_context_t c (face, glyphs, &visited_lookups, &inactive_lookups);
+ OT::hb_closure_lookups_context_t c (face, glyphs, &visited_lookups, &inactive_lookups);
c.set_recurse_func (TLookup::template dispatch_recurse_func<hb_closure_lookups_context_t>);
- for (unsigned lookup_index : *lookup_indexes)
+ for (unsigned lookup_index : + hb_iter (lookup_indexes))
reinterpret_cast<const TLookup &> (get_lookup (lookup_index)).closure_lookups (&c, lookup_index);
hb_set_union (lookup_indexes, &visited_lookups);
@@ -4387,7 +4301,7 @@ struct GSUBGPOS
}
#endif
- for (unsigned i : hb_iter (feature_indices))
+ for (unsigned i : feature_indices->iter())
{
hb_tag_t tag = get_feature_tag (i);
if (tag == HB_TAG ('p', 'r', 'e', 'f'))
diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc
index e8091ec3e..dbb30076a 100644
--- a/src/hb-ot-layout.cc
+++ b/src/hb-ot-layout.cc
@@ -1465,6 +1465,56 @@ hb_ot_layout_substitute_start (hb_font_t *font,
_hb_ot_layout_set_glyph_props (font, buffer);
}
+void
+hb_ot_layout_delete_glyphs_inplace (hb_buffer_t *buffer,
+ bool (*filter) (const hb_glyph_info_t *info))
+{
+ /* Merge clusters and delete filtered glyphs.
+ * NOTE! We can't use out-buffer as we have positioning data. */
+ unsigned int j = 0;
+ unsigned int count = buffer->len;
+ hb_glyph_info_t *info = buffer->info;
+ hb_glyph_position_t *pos = buffer->pos;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ if (filter (&info[i]))
+ {
+ /* Merge clusters.
+ * Same logic as buffer->delete_glyph(), but for in-place removal. */
+
+ unsigned int cluster = info[i].cluster;
+ if (i + 1 < count && cluster == info[i + 1].cluster)
+ continue; /* Cluster survives; do nothing. */
+
+ if (j)
+ {
+ /* Merge cluster backward. */
+ if (cluster < info[j - 1].cluster)
+ {
+ unsigned int mask = info[i].mask;
+ unsigned int old_cluster = info[j - 1].cluster;
+ for (unsigned k = j; k && info[k - 1].cluster == old_cluster; k--)
+ buffer->set_cluster (info[k - 1], cluster, mask);
+ }
+ continue;
+ }
+
+ if (i + 1 < count)
+ buffer->merge_clusters (i, i + 2); /* Merge cluster forward. */
+
+ continue;
+ }
+
+ if (j != i)
+ {
+ info[j] = info[i];
+ pos[j] = pos[i];
+ }
+ j++;
+ }
+ buffer->len = j;
+}
+
/**
* hb_ot_layout_lookup_substitute_closure:
* @face: #hb_face_t to work upon
@@ -1817,7 +1867,7 @@ apply_forward (OT::hb_ot_apply_context_t *c,
while (buffer->idx < buffer->len && buffer->successful)
{
bool applied = false;
- if (accel.digest.may_have (buffer->cur().codepoint) &&
+ if (accel.may_have (buffer->cur().codepoint) &&
(buffer->cur().mask & c->lookup_mask) &&
c->check_glyph_property (&buffer->cur(), c->lookup_props))
{
@@ -1844,7 +1894,7 @@ apply_backward (OT::hb_ot_apply_context_t *c,
hb_buffer_t *buffer = c->buffer;
do
{
- if (accel.digest.may_have (buffer->cur().codepoint) &&
+ if (accel.may_have (buffer->cur().codepoint) &&
(buffer->cur().mask & c->lookup_mask) &&
c->check_glyph_property (&buffer->cur(), c->lookup_props))
ret |= accel.apply (c, false);
@@ -1858,16 +1908,15 @@ apply_backward (OT::hb_ot_apply_context_t *c,
}
template <typename Proxy>
-static inline bool
+static inline void
apply_string (OT::hb_ot_apply_context_t *c,
const typename Proxy::Lookup &lookup,
const OT::hb_ot_layout_lookup_accelerator_t &accel)
{
- bool ret = false;
hb_buffer_t *buffer = c->buffer;
if (unlikely (!buffer->len || !c->lookup_mask))
- return ret;
+ return;
c->set_lookup_props (lookup.get_props ());
@@ -1878,7 +1927,7 @@ apply_string (OT::hb_ot_apply_context_t *c,
buffer->clear_output ();
buffer->idx = 0;
- ret = apply_forward (c, accel);
+ apply_forward (c, accel);
if (!Proxy::always_inplace)
buffer->sync ();
@@ -1888,10 +1937,8 @@ apply_string (OT::hb_ot_apply_context_t *c,
/* in-place backward substitution/positioning */
assert (!buffer->have_output);
buffer->idx = buffer->len - 1;
- ret = apply_backward (c, accel);
+ apply_backward (c, accel);
}
-
- return ret;
}
template <typename Proxy>
@@ -1910,42 +1957,23 @@ inline void hb_ot_map_t::apply (const Proxy &proxy,
const stage_map_t *stage = &stages[table_index][stage_index];
for (; i < stage->last_lookup; i++)
{
- auto &lookup = lookups[table_index][i];
-
- unsigned int lookup_index = lookup.index;
- if (!buffer->message (font, "start lookup %d feature '%c%c%c%c'", lookup_index, HB_UNTAG (lookup.feature_tag))) continue;
-
- /* c.digest is a digest of all the current glyphs in the buffer
- * (plus some past glyphs).
- *
- * Only try applying the lookup if there is any overlap. */
- if (proxy.accels[lookup_index].digest.may_have (c.digest))
- {
- c.set_lookup_index (lookup_index);
- c.set_lookup_mask (lookup.mask);
- c.set_auto_zwj (lookup.auto_zwj);
- c.set_auto_zwnj (lookup.auto_zwnj);
- c.set_random (lookup.random);
- c.set_per_syllable (lookup.per_syllable);
-
- apply_string<Proxy> (&c,
- proxy.table.get_lookup (lookup_index),
- proxy.accels[lookup_index]);
- }
- else
- (void) buffer->message (font, "skipped lookup %d feature '%c%c%c%c' because no glyph matches", lookup_index, HB_UNTAG (lookup.feature_tag));
-
- (void) buffer->message (font, "end lookup %d feature '%c%c%c%c'", lookup_index, HB_UNTAG (lookup.feature_tag));
+ unsigned int lookup_index = lookups[table_index][i].index;
+ if (!buffer->message (font, "start lookup %d", lookup_index)) continue;
+ c.set_lookup_index (lookup_index);
+ c.set_lookup_mask (lookups[table_index][i].mask);
+ c.set_auto_zwj (lookups[table_index][i].auto_zwj);
+ c.set_auto_zwnj (lookups[table_index][i].auto_zwnj);
+ c.set_random (lookups[table_index][i].random);
+ c.set_per_syllable (lookups[table_index][i].per_syllable);
+
+ apply_string<Proxy> (&c,
+ proxy.table.get_lookup (lookup_index),
+ proxy.accels[lookup_index]);
+ (void) buffer->message (font, "end lookup %d", lookup_index);
}
if (stage->pause_func)
- {
- if (stage->pause_func (plan, font, buffer))
- {
- /* Refresh working buffer digest since buffer changed. */
- c.digest = buffer->digest ();
- }
- }
+ stage->pause_func (plan, font, buffer);
}
}
diff --git a/src/hb-ot-layout.hh b/src/hb-ot-layout.hh
index 9505d5f14..de06610cb 100644
--- a/src/hb-ot-layout.hh
+++ b/src/hb-ot-layout.hh
@@ -102,6 +102,10 @@ HB_INTERNAL void
hb_ot_layout_substitute_start (hb_font_t *font,
hb_buffer_t *buffer);
+HB_INTERNAL void
+hb_ot_layout_delete_glyphs_inplace (hb_buffer_t *buffer,
+ bool (*filter) (const hb_glyph_info_t *info));
+
namespace OT {
struct hb_ot_apply_context_t;
struct hb_ot_layout_lookup_accelerator_t;
@@ -548,7 +552,7 @@ _hb_glyph_info_clear_substituted (hb_glyph_info_t *info)
info->glyph_props() &= ~(HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED);
}
-static inline bool
+static inline void
_hb_clear_substitution_flags (const hb_ot_shape_plan_t *plan HB_UNUSED,
hb_font_t *font HB_UNUSED,
hb_buffer_t *buffer)
@@ -557,7 +561,6 @@ _hb_clear_substitution_flags (const hb_ot_shape_plan_t *plan HB_UNUSED,
unsigned int count = buffer->len;
for (unsigned int i = 0; i < count; i++)
_hb_glyph_info_clear_substituted (&info[i]);
- return false;
}
diff --git a/src/hb-ot-map.cc b/src/hb-ot-map.cc
index 8882dbacc..39215b335 100644
--- a/src/hb-ot-map.cc
+++ b/src/hb-ot-map.cc
@@ -45,7 +45,7 @@ void hb_ot_map_t::collect_lookups (unsigned int table_index, hb_set_t *lookups_o
hb_ot_map_builder_t::hb_ot_map_builder_t (hb_face_t *face_,
const hb_segment_properties_t &props_)
{
- hb_memset (this, 0, sizeof (*this));
+ memset (this, 0, sizeof (*this));
feature_infos.init ();
for (unsigned int table_index = 0; table_index < 2; table_index++)
@@ -133,8 +133,7 @@ hb_ot_map_builder_t::add_lookups (hb_ot_map_t &m,
bool auto_zwnj,
bool auto_zwj,
bool random,
- bool per_syllable,
- hb_tag_t feature_tag)
+ bool per_syllable)
{
unsigned int lookup_indices[32];
unsigned int offset, len;
@@ -163,7 +162,6 @@ hb_ot_map_builder_t::add_lookups (hb_ot_map_t &m,
lookup->auto_zwj = auto_zwj;
lookup->random = random;
lookup->per_syllable = per_syllable;
- lookup->feature_tag = feature_tag;
}
offset += len;
@@ -214,26 +212,24 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m,
if (feature_infos.length)
{
feature_infos.qsort ();
- auto *f = feature_infos.arrayZ;
unsigned int j = 0;
- unsigned count = feature_infos.length;
- for (unsigned int i = 1; i < count; i++)
- if (f[i].tag != f[j].tag)
- f[++j] = f[i];
+ for (unsigned int i = 1; i < feature_infos.length; i++)
+ if (feature_infos[i].tag != feature_infos[j].tag)
+ feature_infos[++j] = feature_infos[i];
else {
- if (f[i].flags & F_GLOBAL) {
- f[j].flags |= F_GLOBAL;
- f[j].max_value = f[i].max_value;
- f[j].default_value = f[i].default_value;
+ if (feature_infos[i].flags & F_GLOBAL) {
+ feature_infos[j].flags |= F_GLOBAL;
+ feature_infos[j].max_value = feature_infos[i].max_value;
+ feature_infos[j].default_value = feature_infos[i].default_value;
} else {
- if (f[j].flags & F_GLOBAL)
- f[j].flags ^= F_GLOBAL;
- f[j].max_value = hb_max (f[j].max_value, f[i].max_value);
+ if (feature_infos[j].flags & F_GLOBAL)
+ feature_infos[j].flags ^= F_GLOBAL;
+ feature_infos[j].max_value = hb_max (feature_infos[j].max_value, feature_infos[i].max_value);
/* Inherit default_value from j */
}
- f[j].flags |= (f[i].flags & F_HAS_FALLBACK);
- f[j].stage[0] = hb_min (f[j].stage[0], f[i].stage[0]);
- f[j].stage[1] = hb_min (f[j].stage[1], f[i].stage[1]);
+ feature_infos[j].flags |= (feature_infos[i].flags & F_HAS_FALLBACK);
+ feature_infos[j].stage[0] = hb_min (feature_infos[j].stage[0], feature_infos[i].stage[0]);
+ feature_infos[j].stage[1] = hb_min (feature_infos[j].stage[1], feature_infos[i].stage[1]);
}
feature_infos.shrink (j + 1);
}
@@ -243,8 +239,7 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m,
static_assert ((!(HB_GLYPH_FLAG_DEFINED & (HB_GLYPH_FLAG_DEFINED + 1))), "");
unsigned int next_bit = hb_popcount (HB_GLYPH_FLAG_DEFINED) + 1;
- unsigned count = feature_infos.length;
- for (unsigned int i = 0; i < count; i++)
+ for (unsigned int i = 0; i < feature_infos.length; i++)
{
const feature_info_t *info = &feature_infos[i];
@@ -313,7 +308,7 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m,
map->_1_mask = (1u << map->shift) & map->mask;
map->needs_fallback = !found;
}
- //feature_infos.shrink (0); /* Done with these */
+ feature_infos.shrink (0); /* Done with these */
add_gsub_pause (nullptr);
@@ -322,7 +317,6 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m,
for (unsigned int table_index = 0; table_index < 2; table_index++)
{
/* Collect lookup indices for features */
- auto &lookups = m.lookups[table_index];
unsigned int stage_index = 0;
unsigned int last_num_lookups = 0;
@@ -335,39 +329,36 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m,
key.variations_index[table_index],
global_bit_mask);
- for (auto &feature : m.features)
- {
- if (feature.stage[table_index] == stage)
+ for (unsigned i = 0; i < m.features.length; i++)
+ if (m.features[i].stage[table_index] == stage)
add_lookups (m, table_index,
- feature.index[table_index],
+ m.features[i].index[table_index],
key.variations_index[table_index],
- feature.mask,
- feature.auto_zwnj,
- feature.auto_zwj,
- feature.random,
- feature.per_syllable,
- feature.tag);
- }
+ m.features[i].mask,
+ m.features[i].auto_zwnj,
+ m.features[i].auto_zwj,
+ m.features[i].random,
+ m.features[i].per_syllable);
/* Sort lookups and merge duplicates */
- if (last_num_lookups < lookups.length)
+ if (last_num_lookups < m.lookups[table_index].length)
{
- lookups.as_array ().sub_array (last_num_lookups, lookups.length - last_num_lookups).qsort ();
+ m.lookups[table_index].qsort (last_num_lookups, m.lookups[table_index].length);
unsigned int j = last_num_lookups;
- for (unsigned int i = j + 1; i < lookups.length; i++)
- if (lookups.arrayZ[i].index != lookups.arrayZ[j].index)
- lookups.arrayZ[++j] = lookups.arrayZ[i];
+ for (unsigned int i = j + 1; i < m.lookups[table_index].length; i++)
+ if (m.lookups[table_index][i].index != m.lookups[table_index][j].index)
+ m.lookups[table_index][++j] = m.lookups[table_index][i];
else
{
- lookups.arrayZ[j].mask |= lookups.arrayZ[i].mask;
- lookups.arrayZ[j].auto_zwnj &= lookups.arrayZ[i].auto_zwnj;
- lookups.arrayZ[j].auto_zwj &= lookups.arrayZ[i].auto_zwj;
+ m.lookups[table_index][j].mask |= m.lookups[table_index][i].mask;
+ m.lookups[table_index][j].auto_zwnj &= m.lookups[table_index][i].auto_zwnj;
+ m.lookups[table_index][j].auto_zwj &= m.lookups[table_index][i].auto_zwj;
}
- lookups.shrink (j + 1);
+ m.lookups[table_index].shrink (j + 1);
}
- last_num_lookups = lookups.length;
+ last_num_lookups = m.lookups[table_index].length;
if (stage_index < stages[table_index].length && stages[table_index][stage_index].index == stage) {
hb_ot_map_t::stage_map_t *stage_map = m.stages[table_index].push ();
diff --git a/src/hb-ot-map.hh b/src/hb-ot-map.hh
index efc8cae96..a7b5eec30 100644
--- a/src/hb-ot-map.hh
+++ b/src/hb-ot-map.hh
@@ -69,7 +69,6 @@ struct hb_ot_map_t
unsigned short random : 1;
unsigned short per_syllable : 1;
hb_mask_t mask;
- hb_tag_t feature_tag;
HB_INTERNAL static int cmp (const void *pa, const void *pb)
{
@@ -79,9 +78,7 @@ struct hb_ot_map_t
}
};
- /* Pause functions return true if new glyph indices might have been
- * added to the buffer. This is used to update buffer digest. */
- typedef bool (*pause_func_t) (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer);
+ typedef void (*pause_func_t) (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer);
struct stage_map_t {
unsigned int last_lookup; /* Cumulative */
@@ -90,13 +87,13 @@ struct hb_ot_map_t
void init ()
{
- hb_memset (this, 0, sizeof (*this));
+ memset (this, 0, sizeof (*this));
- features.init0 ();
+ features.init ();
for (unsigned int table_index = 0; table_index < 2; table_index++)
{
- lookups[table_index].init0 ();
- stages[table_index].init0 ();
+ lookups[table_index].init ();
+ stages[table_index].init ();
}
}
void fini ()
@@ -242,8 +239,7 @@ struct hb_ot_map_builder_t
bool auto_zwnj = true,
bool auto_zwj = true,
bool random = false,
- bool per_syllable = false,
- hb_tag_t feature_tag = HB_TAG(' ',' ',' ',' '));
+ bool per_syllable = false);
struct feature_info_t {
hb_tag_t tag;
diff --git a/src/hb-ot-math-table.hh b/src/hb-ot-math-table.hh
index 93953370e..d834d9437 100644
--- a/src/hb-ot-math-table.hh
+++ b/src/hb-ot-math-table.hh
@@ -77,11 +77,11 @@ struct MathConstants
HBINT16 *p = c->allocate_size<HBINT16> (HBINT16::static_size * 2);
if (unlikely (!p)) return_trace (nullptr);
- hb_memcpy (p, percentScaleDown, HBINT16::static_size * 2);
+ memcpy (p, percentScaleDown, HBINT16::static_size * 2);
HBUINT16 *m = c->allocate_size<HBUINT16> (HBUINT16::static_size * 2);
if (unlikely (!m)) return_trace (nullptr);
- hb_memcpy (m, minHeight, HBUINT16::static_size * 2);
+ memcpy (m, minHeight, HBUINT16::static_size * 2);
unsigned count = ARRAY_LENGTH (mathValueRecords);
for (unsigned i = 0; i < count; i++)
@@ -786,7 +786,7 @@ struct MathGlyphAssembly
if (parts_count)
{
int64_t mult = font->dir_mult (direction);
- for (auto _ : hb_zip (partRecords.as_array ().sub_array (start_offset, parts_count),
+ for (auto _ : hb_zip (partRecords.sub_array (start_offset, parts_count),
hb_array (parts, *parts_count)))
_.first.extract (_.second, mult, font);
}
@@ -855,7 +855,7 @@ struct MathGlyphConstruction
if (variants_count)
{
int64_t mult = font->dir_mult (direction);
- for (auto _ : hb_zip (mathGlyphVariantRecord.as_array ().sub_array (start_offset, variants_count),
+ for (auto _ : hb_zip (mathGlyphVariantRecord.sub_array (start_offset, variants_count),
hb_array (variants, *variants_count)))
_.second = {_.first.variantGlyph, font->em_mult (_.first.advanceMeasurement, mult)};
}
diff --git a/src/hb-ot-meta-table.hh b/src/hb-ot-meta-table.hh
index e1b68bcf9..93e64c532 100644
--- a/src/hb-ot-meta-table.hh
+++ b/src/hb-ot-meta-table.hh
@@ -84,7 +84,7 @@ struct meta
{
if (count)
{
- + table->dataMaps.as_array ().sub_array (start_offset, count)
+ + table->dataMaps.sub_array (start_offset, count)
| hb_map (&DataMap::get_tag)
| hb_map ([](hb_tag_t tag) { return (hb_ot_meta_tag_t) tag; })
| hb_sink (hb_array (entries, *count))
diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh
index 6f4461cc1..1f2131ffc 100644
--- a/src/hb-ot-name-table.hh
+++ b/src/hb-ot-name-table.hh
@@ -30,55 +30,10 @@
#include "hb-open-type.hh"
#include "hb-ot-name-language.hh"
#include "hb-aat-layout.hh"
-#include "hb-utf.hh"
namespace OT {
-template <typename in_utf_t, typename out_utf_t>
-inline unsigned int
-hb_ot_name_convert_utf (hb_bytes_t bytes,
- unsigned int *text_size /* IN/OUT */,
- typename out_utf_t::codepoint_t *text /* OUT */)
-{
- unsigned int src_len = bytes.length / sizeof (typename in_utf_t::codepoint_t);
- const typename in_utf_t::codepoint_t *src = (const typename in_utf_t::codepoint_t *) bytes.arrayZ;
- const typename in_utf_t::codepoint_t *src_end = src + src_len;
-
- typename out_utf_t::codepoint_t *dst = text;
-
- hb_codepoint_t unicode;
- const hb_codepoint_t replacement = HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT;
-
- if (text_size && *text_size)
- {
- (*text_size)--; /* Save room for NUL-termination. */
- const typename out_utf_t::codepoint_t *dst_end = text + *text_size;
-
- while (src < src_end && dst < dst_end)
- {
- const typename in_utf_t::codepoint_t *src_next = in_utf_t::next (src, src_end, &unicode, replacement);
- typename out_utf_t::codepoint_t *dst_next = out_utf_t::encode (dst, dst_end, unicode);
- if (dst_next == dst)
- break; /* Out-of-room. */
-
- dst = dst_next;
- src = src_next;
- }
-
- *text_size = dst - text;
- *dst = 0; /* NUL-terminate. */
- }
-
- /* Accumulate length of rest. */
- unsigned int dst_len = dst - text;
- while (src < src_end)
- {
- src = in_utf_t::next (src, src_end, &unicode, replacement);
- dst_len += out_utf_t::encode_len (unicode);
- }
- return dst_len;
-}
#define entry_score var.u16[0]
#define entry_index var.u16[1]
@@ -142,68 +97,12 @@ struct NameRecord
return UNSUPPORTED;
}
- NameRecord* copy (hb_serialize_context_t *c, const void *base
-#ifdef HB_EXPERIMENTAL_API
- , const hb_hashmap_t<hb_ot_name_record_ids_t, hb_bytes_t> *name_table_overrides
-#endif
- ) const
+ NameRecord* copy (hb_serialize_context_t *c, const void *base) const
{
TRACE_SERIALIZE (this);
- HB_UNUSED auto snap = c->snapshot ();
auto *out = c->embed (this);
if (unlikely (!out)) return_trace (nullptr);
-#ifdef HB_EXPERIMENTAL_API
- hb_ot_name_record_ids_t record_ids (platformID, encodingID, languageID, nameID);
- hb_bytes_t* name_bytes;
-
- if (name_table_overrides->has (record_ids, &name_bytes)) {
- hb_bytes_t encoded_bytes = *name_bytes;
- char *name_str_utf16_be = nullptr;
-
- if (platformID != 1)
- {
- unsigned text_size = hb_ot_name_convert_utf<hb_utf8_t, hb_utf16_be_t> (*name_bytes, nullptr, nullptr);
-
- text_size++; // needs to consider NULL terminator for use in hb_ot_name_convert_utf()
- unsigned byte_len = text_size * hb_utf16_be_t::codepoint_t::static_size;
- name_str_utf16_be = (char *) hb_calloc (byte_len, 1);
- if (!name_str_utf16_be)
- {
- c->revert (snap);
- return_trace (nullptr);
- }
- hb_ot_name_convert_utf<hb_utf8_t, hb_utf16_be_t> (*name_bytes, &text_size,
- (hb_utf16_be_t::codepoint_t *) name_str_utf16_be);
-
- unsigned encoded_byte_len = text_size * hb_utf16_be_t::codepoint_t::static_size;
- if (!encoded_byte_len || !c->check_assign (out->length, encoded_byte_len, HB_SERIALIZE_ERROR_INT_OVERFLOW)) {
- c->revert (snap);
- hb_free (name_str_utf16_be);
- return_trace (nullptr);
- }
-
- encoded_bytes = hb_bytes_t (name_str_utf16_be, encoded_byte_len);
- }
- else
- {
- // mac platform, copy the UTF-8 string(all ascii characters) as is
- if (!c->check_assign (out->length, encoded_bytes.length, HB_SERIALIZE_ERROR_INT_OVERFLOW)) {
- c->revert (snap);
- return_trace (nullptr);
- }
- }
-
- out->offset = 0;
- c->push ();
- encoded_bytes.copy (c);
- c->add_link (out->offset, c->pop_pack (), hb_serialize_context_t::Tail, 0);
- hb_free (name_str_utf16_be);
- }
- else
-#endif
- {
- out->offset.serialize_copy (c, offset, base, 0, hb_serialize_context_t::Tail, length);
- }
+ out->offset.serialize_copy (c, offset, base, 0, hb_serialize_context_t::Tail, length);
return_trace (out);
}
@@ -317,61 +216,29 @@ struct name
hb_requires (hb_is_source_of (Iterator, const NameRecord &))>
bool serialize (hb_serialize_context_t *c,
Iterator it,
- const void *src_string_pool
-#ifdef HB_EXPERIMENTAL_API
- , const hb_vector_t<hb_ot_name_record_ids_t>& insert_name_records
- , const hb_hashmap_t<hb_ot_name_record_ids_t, hb_bytes_t> *name_table_overrides
-#endif
- )
+ const void *src_string_pool)
{
TRACE_SERIALIZE (this);
if (unlikely (!c->extend_min ((*this)))) return_trace (false);
- unsigned total_count = it.len ()
-#ifdef HB_EXPERIMENTAL_API
- + insert_name_records.length
-#endif
- ;
this->format = 0;
- if (!c->check_assign (this->count, total_count, HB_SERIALIZE_ERROR_INT_OVERFLOW))
- return false;
+ this->count = it.len ();
- NameRecord *name_records = (NameRecord *) hb_calloc (total_count, NameRecord::static_size);
+ NameRecord *name_records = (NameRecord *) hb_calloc (it.len (), NameRecord::static_size);
if (unlikely (!name_records)) return_trace (false);
- hb_array_t<NameRecord> records (name_records, total_count);
+ hb_array_t<NameRecord> records (name_records, it.len ());
for (const NameRecord& record : it)
{
- hb_memcpy (name_records, &record, NameRecord::static_size);
- name_records++;
- }
-
-#ifdef HB_EXPERIMENTAL_API
- for (unsigned i = 0; i < insert_name_records.length; i++)
- {
- const hb_ot_name_record_ids_t& ids = insert_name_records[i];
- NameRecord record;
- record.platformID = ids.platform_id;
- record.encodingID = ids.encoding_id;
- record.languageID = ids.language_id;
- record.nameID = ids.name_id;
- record.length = 0; // handled in NameRecord copy()
- record.offset = 0;
memcpy (name_records, &record, NameRecord::static_size);
name_records++;
}
-#endif
records.qsort ();
- c->copy_all (records,
- src_string_pool
-#ifdef HB_EXPERIMENTAL_API
- , name_table_overrides
-#endif
- );
+ c->copy_all (records, src_string_pool);
hb_free (records.arrayZ);
@@ -389,11 +256,6 @@ struct name
name *name_prime = c->serializer->start_embed<name> ();
if (unlikely (!name_prime)) return_trace (false);
-#ifdef HB_EXPERIMENTAL_API
- const hb_hashmap_t<hb_ot_name_record_ids_t, hb_bytes_t> *name_table_overrides =
- c->plan->name_table_overrides;
-#endif
-
auto it =
+ nameRecordZ.as_array (count)
| hb_filter (c->plan->name_ids, &NameRecord::nameID)
@@ -403,48 +265,10 @@ struct name
(c->plan->flags & HB_SUBSET_FLAGS_NAME_LEGACY)
|| namerecord.isUnicode ();
})
-#ifdef HB_EXPERIMENTAL_API
- | hb_filter ([&] (const NameRecord& namerecord) {
- if (name_table_overrides->is_empty ())
- return true;
- hb_ot_name_record_ids_t rec_ids (namerecord.platformID,
- namerecord.encodingID,
- namerecord.languageID,
- namerecord.nameID);
-
- hb_bytes_t *p;
- if (name_table_overrides->has (rec_ids, &p) &&
- (*p).length == 0)
- return false;
- return true;
- })
-#endif
;
-#ifdef HB_EXPERIMENTAL_API
- hb_vector_t<hb_ot_name_record_ids_t> insert_name_records;
- if (!name_table_overrides->is_empty ())
- {
- if (unlikely (!insert_name_records.alloc (name_table_overrides->get_population ())))
- return_trace (false);
- for (const auto& record_ids : name_table_overrides->keys ())
- {
- if (name_table_overrides->get (record_ids).length == 0)
- continue;
- if (has_name_record_with_ids (record_ids))
- continue;
- insert_name_records.push (record_ids);
- }
- }
-#endif
-
- return (name_prime->serialize (c->serializer, it,
- std::addressof (this + stringOffset)
-#ifdef HB_EXPERIMENTAL_API
- , insert_name_records
- , name_table_overrides
-#endif
- ));
+ name_prime->serialize (c->serializer, it, std::addressof (this + stringOffset));
+ return_trace (name_prime->count);
}
bool sanitize_records (hb_sanitize_context_t *c) const
@@ -554,23 +378,6 @@ struct name
hb_vector_t<hb_ot_name_entry_t> names;
};
- private:
- // sometimes NameRecords are not sorted in the font file, so use linear search
- // here
- bool has_name_record_with_ids (const hb_ot_name_record_ids_t& record_ids) const
- {
- for (const auto& record : nameRecordZ.as_array (count))
- {
- if (record.platformID == record_ids.platform_id &&
- record.encodingID == record_ids.encoding_id &&
- record.languageID == record_ids.language_id &&
- record.nameID == record_ids.name_id)
- return true;
- }
- return false;
- }
-
- public:
/* We only implement format 0 for now. */
HBUINT16 format; /* Format selector (=0/1). */
HBUINT16 count; /* Number of name records. */
diff --git a/src/hb-ot-name.cc b/src/hb-ot-name.cc
index 6adf1e8fb..c35ac5b3d 100644
--- a/src/hb-ot-name.cc
+++ b/src/hb-ot-name.cc
@@ -64,6 +64,52 @@ hb_ot_name_list_names (hb_face_t *face,
return (const hb_ot_name_entry_t *) name.names;
}
+
+template <typename in_utf_t, typename out_utf_t>
+static inline unsigned int
+hb_ot_name_convert_utf (hb_bytes_t bytes,
+ unsigned int *text_size /* IN/OUT */,
+ typename out_utf_t::codepoint_t *text /* OUT */)
+{
+ unsigned int src_len = bytes.length / sizeof (typename in_utf_t::codepoint_t);
+ const typename in_utf_t::codepoint_t *src = (const typename in_utf_t::codepoint_t *) bytes.arrayZ;
+ const typename in_utf_t::codepoint_t *src_end = src + src_len;
+
+ typename out_utf_t::codepoint_t *dst = text;
+
+ hb_codepoint_t unicode;
+ const hb_codepoint_t replacement = HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT;
+
+ if (text_size && *text_size)
+ {
+ (*text_size)--; /* Same room for NUL-termination. */
+ const typename out_utf_t::codepoint_t *dst_end = text + *text_size;
+
+ while (src < src_end && dst < dst_end)
+ {
+ const typename in_utf_t::codepoint_t *src_next = in_utf_t::next (src, src_end, &unicode, replacement);
+ typename out_utf_t::codepoint_t *dst_next = out_utf_t::encode (dst, dst_end, unicode);
+ if (dst_next == dst)
+ break; /* Out-of-room. */
+
+ dst = dst_next;
+ src = src_next;
+ }
+
+ *text_size = dst - text;
+ *dst = 0; /* NUL-terminate. */
+ }
+
+ /* Accumulate length of rest. */
+ unsigned int dst_len = dst - text;
+ while (src < src_end)
+ {
+ src = in_utf_t::next (src, src_end, &unicode, replacement);
+ dst_len += out_utf_t::encode_len (unicode);
+ }
+ return dst_len;
+}
+
template <typename utf_t>
static inline unsigned int
hb_ot_name_get_utf (hb_face_t *face,
@@ -84,10 +130,10 @@ hb_ot_name_get_utf (hb_face_t *face,
hb_bytes_t bytes = name.get_name (idx);
if (width == 2) /* UTF16-BE */
- return OT::hb_ot_name_convert_utf<hb_utf16_be_t, utf_t> (bytes, text_size, text);
+ return hb_ot_name_convert_utf<hb_utf16_be_t, utf_t> (bytes, text_size, text);
if (width == 1) /* ASCII */
- return OT::hb_ot_name_convert_utf<hb_ascii_t, utf_t> (bytes, text_size, text);
+ return hb_ot_name_convert_utf<hb_ascii_t, utf_t> (bytes, text_size, text);
}
if (text_size)
@@ -181,4 +227,5 @@ hb_ot_name_get_utf32 (hb_face_t *face,
return hb_ot_name_get_utf<hb_utf32_t> (face, name_id, language, text_size, text);
}
+
#endif
diff --git a/src/hb-ot-os2-table.hh b/src/hb-ot-os2-table.hh
index 5b017d56a..c6e8fad6f 100644
--- a/src/hb-ot-os2-table.hh
+++ b/src/hb-ot-os2-table.hh
@@ -212,6 +212,17 @@ struct OS2
TRACE_SUBSET (this);
OS2 *os2_prime = c->serializer->embed (this);
if (unlikely (!os2_prime)) return_trace (false);
+ if (c->plan->flags & HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES)
+ return_trace (true);
+
+ /* when --gids option is not used, no need to do collect_mapping that is
+ * iterating all codepoints in each subtable, which is not efficient */
+ uint16_t min_cp, max_cp;
+ find_min_and_max_codepoint (c->plan->unicodes, &min_cp, &max_cp);
+ os2_prime->usFirstCharIndex = min_cp;
+ os2_prime->usLastCharIndex = max_cp;
+
+ _update_unicode_ranges (c->plan->unicodes, os2_prime->ulUnicodeRange);
if (c->plan->user_axes_location->has (HB_TAG ('w','g','h','t')) &&
!c->plan->pinned_at_default)
@@ -233,18 +244,6 @@ struct OS2
return_trace (false);
}
- if (c->plan->flags & HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES)
- return_trace (true);
-
- /* when --gids option is not used, no need to do collect_mapping that is
- * iterating all codepoints in each subtable, which is not efficient */
- uint16_t min_cp, max_cp;
- find_min_and_max_codepoint (c->plan->unicodes, &min_cp, &max_cp);
- os2_prime->usFirstCharIndex = min_cp;
- os2_prime->usLastCharIndex = max_cp;
-
- _update_unicode_ranges (c->plan->unicodes, os2_prime->ulUnicodeRange);
-
return_trace (true);
}
diff --git a/src/hb-ot-post-table-v2subset.hh b/src/hb-ot-post-table-v2subset.hh
index 951e6395d..4d427e543 100644
--- a/src/hb-ot-post-table-v2subset.hh
+++ b/src/hb-ot-post-table-v2subset.hh
@@ -78,14 +78,14 @@ HB_INTERNAL bool postV2Tail::subset (hb_subset_context_t *c) const
post::accelerator_t _post (c->plan->source);
- hb_hashmap_t<hb_bytes_t, uint32_t, true> glyph_name_to_new_index;
+ hb_hashmap_t<hb_bytes_t, unsigned, true> glyph_name_to_new_index;
for (hb_codepoint_t new_gid = 0; new_gid < num_glyphs; new_gid++)
{
hb_codepoint_t old_gid = reverse_glyph_map.get (new_gid);
unsigned old_index = glyphNameIndex[old_gid];
unsigned new_index;
- const uint32_t *new_index2;
+ const unsigned *new_index2;
if (old_index <= 257) new_index = old_index;
else if (old_new_index_map.has (old_index, &new_index2))
{
diff --git a/src/hb-ot-post-table.hh b/src/hb-ot-post-table.hh
index a04b80357..59c1de378 100644
--- a/src/hb-ot-post-table.hh
+++ b/src/hb-ot-post-table.hh
@@ -84,7 +84,7 @@ struct post
post *post_prime = c->allocate_min<post> ();
if (unlikely (!post_prime)) return_trace (false);
- hb_memcpy (post_prime, this, post::min_size);
+ memcpy (post_prime, this, post::min_size);
if (!glyph_names)
return_trace (c->check_assign (post_prime->version.major, 3,
HB_SERIALIZE_ERROR_INT_OVERFLOW)); // Version 3 does not have any glyph names.
diff --git a/src/hb-ot-shape-normalize.cc b/src/hb-ot-shape-normalize.cc
index 897377aa1..7db0b25b7 100644
--- a/src/hb-ot-shape-normalize.cc
+++ b/src/hb-ot-shape-normalize.cc
@@ -341,7 +341,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
{
unsigned int end;
for (end = buffer->idx + 1; end < count; end++)
- if (_hb_glyph_info_is_unicode_mark (&buffer->info[end]))
+ if (unlikely (_hb_glyph_info_is_unicode_mark (&buffer->info[end])))
break;
if (end < count)
diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc
index bbdfc214a..249b5a864 100644
--- a/src/hb-ot-shape.cc
+++ b/src/hb-ot-shape.cc
@@ -91,11 +91,9 @@ hb_ot_shape_planner_t::hb_ot_shape_planner_t (hb_face_t *fac
script_zero_marks = shaper->zero_width_marks != HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE;
script_fallback_mark_positioning = shaper->fallback_position;
-#ifndef HB_NO_AAT_SHAPE
/* https://github.com/harfbuzz/harfbuzz/issues/1528 */
if (apply_morx && shaper != &_hb_ot_shaper_default)
shaper = &_hb_ot_shaper_dumber;
-#endif
}
void
@@ -866,7 +864,7 @@ hb_ot_hide_default_ignorables (hb_buffer_t *buffer,
}
}
else
- buffer->delete_glyphs_inplace (_hb_glyph_info_is_default_ignorable);
+ hb_ot_layout_delete_glyphs_inplace (buffer, _hb_glyph_info_is_default_ignorable);
}
diff --git a/src/hb-ot-shape.hh b/src/hb-ot-shape.hh
index ace28602f..cd6f15cbe 100644
--- a/src/hb-ot-shape.hh
+++ b/src/hb-ot-shape.hh
@@ -51,7 +51,7 @@ struct hb_ot_shape_plan_key_t
bool equal (const hb_ot_shape_plan_key_t *other)
{
- return 0 == hb_memcmp (this, other, sizeof (*this));
+ return 0 == memcmp (this, other, sizeof (*this));
}
};
diff --git a/src/hb-ot-shaper-arabic.cc b/src/hb-ot-shaper-arabic.cc
index 2332ae369..ed2748b82 100644
--- a/src/hb-ot-shaper-arabic.cc
+++ b/src/hb-ot-shaper-arabic.cc
@@ -161,23 +161,22 @@ static const struct arabic_state_table_entry {
};
-static bool
+static void
arabic_fallback_shape (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
-static bool
+static void
record_stch (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
-static bool
+static void
deallocate_buffer_var (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer)
{
HB_BUFFER_DEALLOCATE_VAR (buffer, arabic_shaping_action);
- return false;
}
static void
@@ -413,19 +412,19 @@ setup_masks_arabic (const hb_ot_shape_plan_t *plan,
setup_masks_arabic_plan (arabic_plan, buffer, plan->props.script);
}
-static bool
+static void
arabic_fallback_shape (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer)
{
#ifdef HB_NO_OT_SHAPER_ARABIC_FALLBACK
- return false;
+ return;
#endif
const arabic_shape_plan_t *arabic_plan = (const arabic_shape_plan_t *) plan->data;
if (!arabic_plan->do_fallback)
- return false;
+ return;
retry:
arabic_fallback_plan_t *fallback_plan = arabic_plan->fallback_plan;
@@ -441,7 +440,6 @@ retry:
}
arabic_fallback_plan_shape (fallback_plan, font, buffer);
- return true;
}
/*
@@ -452,14 +450,14 @@ retry:
* marks can use it as well.
*/
-static bool
+static void
record_stch (const hb_ot_shape_plan_t *plan,
hb_font_t *font HB_UNUSED,
hb_buffer_t *buffer)
{
const arabic_shape_plan_t *arabic_plan = (const arabic_shape_plan_t *) plan->data;
if (!arabic_plan->has_stch)
- return false;
+ return;
/* 'stch' feature was just applied. Look for anything that multiplied,
* and record it for stch treatment later. Note that rtlm, frac, etc
@@ -475,7 +473,6 @@ record_stch (const hb_ot_shape_plan_t *plan,
info[i].arabic_shaping_action() = comp % 2 ? STCH_REPEATING : STCH_FIXED;
buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_ARABIC_HAS_STCH;
}
- return false;
}
static void
diff --git a/src/hb-ot-shaper-default.cc b/src/hb-ot-shaper-default.cc
index f0404a4d2..2f6f499ee 100644
--- a/src/hb-ot-shaper-default.cc
+++ b/src/hb-ot-shaper-default.cc
@@ -49,7 +49,6 @@ const hb_ot_shaper_t _hb_ot_shaper_default =
true, /* fallback_position */
};
-#ifndef HB_NO_AAT_SHAPE
/* Same as default but no mark advance zeroing / fallback positioning.
* Dumbest shaper ever, basically. */
const hb_ot_shaper_t _hb_ot_shaper_dumber =
@@ -69,7 +68,6 @@ const hb_ot_shaper_t _hb_ot_shaper_dumber =
HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
false, /* fallback_position */
};
-#endif
#endif
diff --git a/src/hb-ot-shaper-indic-machine.hh b/src/hb-ot-shaper-indic-machine.hh
index d6c67b81b..d52b13f61 100644
--- a/src/hb-ot-shaper-indic-machine.hh
+++ b/src/hb-ot-shaper-indic-machine.hh
@@ -53,7 +53,7 @@ enum indic_syllable_type_t {
};
-#line 54 "hb-ot-shaper-indic-machine.hh"
+#line 57 "hb-ot-shaper-indic-machine.hh"
#define indic_syllable_machine_ex_A 9u
#define indic_syllable_machine_ex_C 1u
#define indic_syllable_machine_ex_CM 16u
@@ -61,7 +61,6 @@ enum indic_syllable_type_t {
#define indic_syllable_machine_ex_DOTTEDCIRCLE 11u
#define indic_syllable_machine_ex_H 4u
#define indic_syllable_machine_ex_M 7u
-#define indic_syllable_machine_ex_MPst 13u
#define indic_syllable_machine_ex_N 3u
#define indic_syllable_machine_ex_PLACEHOLDER 10u
#define indic_syllable_machine_ex_RS 12u
@@ -76,302 +75,268 @@ enum indic_syllable_type_t {
#define indic_syllable_machine_ex_ZWNJ 5u
-#line 75 "hb-ot-shaper-indic-machine.hh"
+#line 79 "hb-ot-shaper-indic-machine.hh"
static const unsigned char _indic_syllable_machine_trans_keys[] = {
- 8u, 8u, 4u, 13u, 5u, 13u, 5u, 13u, 13u, 13u, 4u, 13u, 4u, 13u, 4u, 13u,
- 8u, 8u, 5u, 13u, 5u, 13u, 13u, 13u, 4u, 13u, 4u, 13u, 4u, 13u, 4u, 13u,
- 8u, 8u, 5u, 13u, 5u, 13u, 13u, 13u, 4u, 13u, 4u, 13u, 4u, 13u, 8u, 8u,
- 5u, 13u, 5u, 13u, 13u, 13u, 4u, 13u, 4u, 13u, 5u, 13u, 8u, 8u, 1u, 18u,
- 3u, 16u, 3u, 16u, 4u, 16u, 1u, 15u, 5u, 9u, 5u, 9u, 9u, 9u, 5u, 9u,
- 1u, 15u, 1u, 15u, 1u, 15u, 3u, 13u, 4u, 13u, 5u, 13u, 5u, 13u, 4u, 13u,
- 5u, 9u, 3u, 9u, 5u, 9u, 3u, 16u, 3u, 16u, 3u, 16u, 3u, 16u, 4u, 16u,
- 1u, 15u, 3u, 16u, 3u, 16u, 4u, 16u, 1u, 15u, 5u, 9u, 9u, 9u, 5u, 9u,
- 1u, 15u, 1u, 15u, 3u, 13u, 4u, 13u, 5u, 13u, 5u, 13u, 4u, 13u, 5u, 9u,
- 5u, 9u, 3u, 9u, 5u, 9u, 3u, 16u, 3u, 16u, 4u, 13u, 3u, 16u, 3u, 16u,
- 4u, 16u, 1u, 15u, 3u, 16u, 1u, 15u, 5u, 9u, 9u, 9u, 5u, 9u, 1u, 15u,
- 1u, 15u, 3u, 13u, 4u, 13u, 5u, 13u, 5u, 13u, 3u, 16u, 4u, 13u, 5u, 9u,
- 5u, 9u, 3u, 9u, 5u, 9u, 3u, 16u, 4u, 13u, 4u, 13u, 3u, 16u, 3u, 16u,
- 4u, 16u, 1u, 15u, 3u, 16u, 1u, 15u, 5u, 9u, 9u, 9u, 5u, 9u, 1u, 15u,
- 1u, 15u, 3u, 13u, 4u, 13u, 5u, 13u, 5u, 13u, 3u, 16u, 4u, 13u, 5u, 9u,
- 5u, 9u, 3u, 9u, 5u, 9u, 1u, 16u, 3u, 16u, 1u, 16u, 4u, 13u, 5u, 13u,
- 5u, 13u, 9u, 9u, 5u, 9u, 1u, 15u, 3u, 9u, 5u, 9u, 5u, 9u, 9u, 9u,
- 5u, 9u, 1u, 15u, 0
+ 8u, 8u, 4u, 8u, 5u, 7u, 5u, 8u, 4u, 8u, 4u, 12u, 4u, 8u, 8u, 8u,
+ 5u, 7u, 5u, 8u, 4u, 8u, 4u, 12u, 4u, 12u, 4u, 12u, 8u, 8u, 5u, 7u,
+ 5u, 8u, 4u, 8u, 4u, 8u, 4u, 12u, 8u, 8u, 5u, 7u, 5u, 8u, 4u, 8u,
+ 4u, 8u, 5u, 8u, 8u, 8u, 1u, 18u, 3u, 16u, 3u, 16u, 4u, 16u, 1u, 15u,
+ 5u, 9u, 5u, 9u, 9u, 9u, 5u, 9u, 1u, 15u, 1u, 15u, 1u, 15u, 3u, 9u,
+ 4u, 9u, 5u, 9u, 4u, 9u, 5u, 9u, 3u, 9u, 5u, 9u, 3u, 16u, 3u, 16u,
+ 3u, 16u, 3u, 16u, 4u, 16u, 1u, 15u, 3u, 16u, 3u, 16u, 4u, 16u, 1u, 15u,
+ 5u, 9u, 9u, 9u, 5u, 9u, 1u, 15u, 1u, 15u, 3u, 9u, 4u, 9u, 5u, 9u,
+ 4u, 9u, 5u, 9u, 5u, 9u, 3u, 9u, 5u, 9u, 3u, 16u, 3u, 16u, 4u, 8u,
+ 3u, 16u, 3u, 16u, 4u, 16u, 1u, 15u, 3u, 16u, 1u, 15u, 5u, 9u, 9u, 9u,
+ 5u, 9u, 1u, 15u, 1u, 15u, 3u, 9u, 4u, 9u, 5u, 9u, 3u, 16u, 4u, 9u,
+ 5u, 9u, 5u, 9u, 3u, 9u, 5u, 9u, 3u, 16u, 4u, 12u, 4u, 8u, 3u, 16u,
+ 3u, 16u, 4u, 16u, 1u, 15u, 3u, 16u, 1u, 15u, 5u, 9u, 9u, 9u, 5u, 9u,
+ 1u, 15u, 1u, 15u, 3u, 9u, 4u, 9u, 5u, 9u, 3u, 16u, 4u, 9u, 5u, 9u,
+ 5u, 9u, 3u, 9u, 5u, 9u, 1u, 16u, 3u, 16u, 1u, 16u, 4u, 12u, 5u, 9u,
+ 9u, 9u, 5u, 9u, 1u, 15u, 3u, 9u, 5u, 9u, 5u, 9u, 9u, 9u, 5u, 9u,
+ 1u, 15u, 0
};
static const char _indic_syllable_machine_key_spans[] = {
- 1, 10, 9, 9, 1, 10, 10, 10,
- 1, 9, 9, 1, 10, 10, 10, 10,
- 1, 9, 9, 1, 10, 10, 10, 1,
- 9, 9, 1, 10, 10, 9, 1, 18,
- 14, 14, 13, 15, 5, 5, 1, 5,
- 15, 15, 15, 11, 10, 9, 9, 10,
- 5, 7, 5, 14, 14, 14, 14, 13,
- 15, 14, 14, 13, 15, 5, 1, 5,
- 15, 15, 11, 10, 9, 9, 10, 5,
- 5, 7, 5, 14, 14, 10, 14, 14,
- 13, 15, 14, 15, 5, 1, 5, 15,
- 15, 11, 10, 9, 9, 14, 10, 5,
- 5, 7, 5, 14, 10, 10, 14, 14,
- 13, 15, 14, 15, 5, 1, 5, 15,
- 15, 11, 10, 9, 9, 14, 10, 5,
- 5, 7, 5, 16, 14, 16, 10, 9,
- 9, 1, 5, 15, 7, 5, 5, 1,
- 5, 15
+ 1, 5, 3, 4, 5, 9, 5, 1,
+ 3, 4, 5, 9, 9, 9, 1, 3,
+ 4, 5, 5, 9, 1, 3, 4, 5,
+ 5, 4, 1, 18, 14, 14, 13, 15,
+ 5, 5, 1, 5, 15, 15, 15, 7,
+ 6, 5, 6, 5, 7, 5, 14, 14,
+ 14, 14, 13, 15, 14, 14, 13, 15,
+ 5, 1, 5, 15, 15, 7, 6, 5,
+ 6, 5, 5, 7, 5, 14, 14, 5,
+ 14, 14, 13, 15, 14, 15, 5, 1,
+ 5, 15, 15, 7, 6, 5, 14, 6,
+ 5, 5, 7, 5, 14, 9, 5, 14,
+ 14, 13, 15, 14, 15, 5, 1, 5,
+ 15, 15, 7, 6, 5, 14, 6, 5,
+ 5, 7, 5, 16, 14, 16, 9, 5,
+ 1, 5, 15, 7, 5, 5, 1, 5,
+ 15
};
static const short _indic_syllable_machine_index_offsets[] = {
- 0, 2, 13, 23, 33, 35, 46, 57,
- 68, 70, 80, 90, 92, 103, 114, 125,
- 136, 138, 148, 158, 160, 171, 182, 193,
- 195, 205, 215, 217, 228, 239, 249, 251,
- 270, 285, 300, 314, 330, 336, 342, 344,
- 350, 366, 382, 398, 410, 421, 431, 441,
- 452, 458, 466, 472, 487, 502, 517, 532,
- 546, 562, 577, 592, 606, 622, 628, 630,
- 636, 652, 668, 680, 691, 701, 711, 722,
- 728, 734, 742, 748, 763, 778, 789, 804,
- 819, 833, 849, 864, 880, 886, 888, 894,
- 910, 926, 938, 949, 959, 969, 984, 995,
- 1001, 1007, 1015, 1021, 1036, 1047, 1058, 1073,
- 1088, 1102, 1118, 1133, 1149, 1155, 1157, 1163,
- 1179, 1195, 1207, 1218, 1228, 1238, 1253, 1264,
- 1270, 1276, 1284, 1290, 1307, 1322, 1339, 1350,
- 1360, 1370, 1372, 1378, 1394, 1402, 1408, 1414,
- 1416, 1422
+ 0, 2, 8, 12, 17, 23, 33, 39,
+ 41, 45, 50, 56, 66, 76, 86, 88,
+ 92, 97, 103, 109, 119, 121, 125, 130,
+ 136, 142, 147, 149, 168, 183, 198, 212,
+ 228, 234, 240, 242, 248, 264, 280, 296,
+ 304, 311, 317, 324, 330, 338, 344, 359,
+ 374, 389, 404, 418, 434, 449, 464, 478,
+ 494, 500, 502, 508, 524, 540, 548, 555,
+ 561, 568, 574, 580, 588, 594, 609, 624,
+ 630, 645, 660, 674, 690, 705, 721, 727,
+ 729, 735, 751, 767, 775, 782, 788, 803,
+ 810, 816, 822, 830, 836, 851, 861, 867,
+ 882, 897, 911, 927, 942, 958, 964, 966,
+ 972, 988, 1004, 1012, 1019, 1025, 1040, 1047,
+ 1053, 1059, 1067, 1073, 1090, 1105, 1122, 1132,
+ 1138, 1140, 1146, 1162, 1170, 1176, 1182, 1184,
+ 1190
};
static const unsigned char _indic_syllable_machine_indicies[] = {
- 1, 0, 2, 3, 3, 4, 5, 0,
- 0, 0, 0, 4, 0, 3, 3, 4,
- 6, 0, 0, 0, 0, 4, 0, 3,
- 3, 4, 5, 0, 0, 0, 0, 4,
- 0, 4, 0, 7, 3, 3, 4, 5,
- 0, 0, 0, 0, 4, 0, 2, 3,
- 3, 4, 5, 0, 0, 0, 8, 4,
- 0, 10, 11, 11, 12, 13, 9, 9,
- 9, 9, 12, 9, 14, 9, 11, 11,
- 12, 15, 9, 9, 9, 9, 12, 9,
- 11, 11, 12, 13, 9, 9, 9, 9,
- 12, 9, 12, 9, 16, 11, 11, 12,
- 13, 9, 9, 9, 9, 12, 9, 10,
- 11, 11, 12, 13, 9, 9, 9, 17,
- 12, 9, 10, 11, 11, 12, 13, 9,
- 9, 9, 18, 12, 9, 20, 21, 21,
- 22, 23, 19, 19, 19, 24, 22, 19,
- 25, 19, 21, 21, 22, 27, 26, 26,
- 26, 26, 22, 26, 21, 21, 22, 23,
- 19, 19, 19, 19, 22, 19, 22, 26,
- 20, 21, 21, 22, 23, 19, 19, 19,
- 19, 22, 19, 28, 21, 21, 22, 23,
- 19, 19, 19, 19, 22, 19, 30, 31,
- 31, 32, 33, 29, 29, 29, 34, 32,
- 29, 35, 29, 31, 31, 32, 36, 29,
- 29, 29, 29, 32, 29, 31, 31, 32,
- 33, 29, 29, 29, 29, 32, 29, 32,
- 29, 30, 31, 31, 32, 33, 29, 29,
- 29, 29, 32, 29, 37, 31, 31, 32,
- 33, 29, 29, 29, 29, 32, 29, 21,
- 21, 22, 38, 0, 0, 0, 0, 22,
- 0, 40, 39, 42, 43, 44, 45, 46,
- 47, 22, 23, 48, 49, 49, 24, 22,
- 50, 51, 52, 53, 54, 41, 56, 57,
- 58, 59, 4, 5, 60, 55, 55, 8,
- 4, 55, 55, 61, 55, 62, 57, 63,
- 63, 4, 5, 60, 55, 55, 55, 4,
- 55, 55, 61, 55, 57, 63, 63, 4,
- 5, 60, 55, 55, 55, 4, 55, 55,
- 61, 55, 42, 55, 55, 55, 64, 65,
- 55, 1, 60, 55, 55, 55, 55, 55,
- 42, 55, 66, 66, 55, 1, 60, 55,
- 60, 55, 55, 67, 60, 55, 60, 55,
- 60, 55, 55, 55, 60, 55, 42, 55,
- 68, 55, 66, 66, 55, 1, 60, 55,
- 55, 55, 55, 55, 42, 55, 42, 55,
- 55, 55, 66, 66, 55, 1, 60, 55,
- 55, 55, 55, 55, 42, 55, 42, 55,
- 55, 55, 66, 65, 55, 1, 60, 55,
- 55, 55, 55, 55, 42, 55, 69, 70,
- 71, 71, 4, 5, 60, 55, 55, 55,
- 4, 55, 70, 71, 71, 4, 5, 60,
- 55, 55, 55, 4, 55, 71, 71, 4,
- 5, 60, 55, 55, 55, 4, 55, 60,
- 55, 55, 67, 60, 55, 55, 55, 4,
- 55, 72, 73, 73, 4, 5, 60, 55,
- 55, 55, 4, 55, 64, 74, 55, 1,
- 60, 55, 64, 55, 66, 66, 55, 1,
- 60, 55, 66, 74, 55, 1, 60, 55,
- 56, 57, 63, 63, 4, 5, 60, 55,
- 55, 55, 4, 55, 55, 61, 55, 56,
- 57, 58, 63, 4, 5, 60, 55, 55,
- 8, 4, 55, 55, 61, 55, 76, 77,
- 78, 79, 12, 13, 80, 75, 75, 18,
- 12, 75, 75, 81, 75, 82, 77, 83,
- 79, 12, 13, 80, 75, 75, 75, 12,
- 75, 75, 81, 75, 77, 83, 79, 12,
- 13, 80, 75, 75, 75, 12, 75, 75,
- 81, 75, 84, 75, 75, 75, 85, 86,
- 75, 14, 80, 75, 75, 75, 75, 75,
- 84, 75, 87, 77, 88, 89, 12, 13,
- 80, 75, 75, 17, 12, 75, 75, 81,
- 75, 90, 77, 83, 83, 12, 13, 80,
- 75, 75, 75, 12, 75, 75, 81, 75,
- 77, 83, 83, 12, 13, 80, 75, 75,
- 75, 12, 75, 75, 81, 75, 84, 75,
- 75, 75, 91, 86, 75, 14, 80, 75,
- 75, 75, 75, 75, 84, 75, 80, 75,
- 75, 92, 80, 75, 80, 75, 80, 75,
- 75, 75, 80, 75, 84, 75, 93, 75,
- 91, 91, 75, 14, 80, 75, 75, 75,
- 75, 75, 84, 75, 84, 75, 75, 75,
- 91, 91, 75, 14, 80, 75, 75, 75,
- 75, 75, 84, 75, 94, 95, 96, 96,
- 12, 13, 80, 75, 75, 75, 12, 75,
- 95, 96, 96, 12, 13, 80, 75, 75,
- 75, 12, 75, 96, 96, 12, 13, 80,
- 75, 75, 75, 12, 75, 80, 75, 75,
- 92, 80, 75, 75, 75, 12, 75, 97,
- 98, 98, 12, 13, 80, 75, 75, 75,
- 12, 75, 85, 99, 75, 14, 80, 75,
- 91, 91, 75, 14, 80, 75, 85, 75,
- 91, 91, 75, 14, 80, 75, 91, 99,
- 75, 14, 80, 75, 87, 77, 83, 83,
- 12, 13, 80, 75, 75, 75, 12, 75,
- 75, 81, 75, 87, 77, 88, 83, 12,
- 13, 80, 75, 75, 17, 12, 75, 75,
- 81, 75, 10, 11, 11, 12, 13, 75,
- 75, 75, 75, 12, 75, 76, 77, 83,
- 79, 12, 13, 80, 75, 75, 75, 12,
- 75, 75, 81, 75, 101, 45, 102, 102,
- 22, 23, 48, 100, 100, 100, 22, 100,
- 100, 52, 100, 45, 102, 102, 22, 23,
- 48, 100, 100, 100, 22, 100, 100, 52,
- 100, 103, 100, 100, 100, 104, 105, 100,
- 25, 48, 100, 100, 100, 100, 100, 103,
- 100, 44, 45, 106, 107, 22, 23, 48,
- 100, 100, 24, 22, 100, 100, 52, 100,
- 103, 100, 100, 100, 108, 105, 100, 25,
- 48, 100, 100, 100, 100, 100, 103, 100,
- 48, 100, 100, 109, 48, 100, 48, 100,
- 48, 100, 100, 100, 48, 100, 103, 100,
- 110, 100, 108, 108, 100, 25, 48, 100,
- 100, 100, 100, 100, 103, 100, 103, 100,
- 100, 100, 108, 108, 100, 25, 48, 100,
- 100, 100, 100, 100, 103, 100, 111, 112,
- 113, 113, 22, 23, 48, 100, 100, 100,
- 22, 100, 112, 113, 113, 22, 23, 48,
- 100, 100, 100, 22, 100, 113, 113, 22,
- 23, 48, 100, 100, 100, 22, 100, 48,
- 100, 100, 109, 48, 100, 100, 100, 22,
- 100, 44, 45, 102, 102, 22, 23, 48,
- 100, 100, 100, 22, 100, 100, 52, 100,
- 114, 115, 115, 22, 23, 48, 100, 100,
- 100, 22, 100, 104, 116, 100, 25, 48,
- 100, 108, 108, 100, 25, 48, 100, 104,
- 100, 108, 108, 100, 25, 48, 100, 108,
- 116, 100, 25, 48, 100, 44, 45, 106,
- 102, 22, 23, 48, 100, 100, 24, 22,
- 100, 100, 52, 100, 20, 21, 21, 22,
- 23, 117, 117, 117, 24, 22, 117, 20,
- 21, 21, 22, 23, 117, 117, 117, 117,
- 22, 117, 119, 120, 121, 122, 32, 33,
- 123, 118, 118, 34, 32, 118, 118, 124,
- 118, 125, 120, 122, 122, 32, 33, 123,
- 118, 118, 118, 32, 118, 118, 124, 118,
- 120, 122, 122, 32, 33, 123, 118, 118,
- 118, 32, 118, 118, 124, 118, 126, 118,
- 118, 118, 127, 128, 118, 35, 123, 118,
- 118, 118, 118, 118, 126, 118, 119, 120,
- 121, 49, 32, 33, 123, 118, 118, 34,
- 32, 118, 118, 124, 118, 126, 118, 118,
- 118, 129, 128, 118, 35, 123, 118, 118,
- 118, 118, 118, 126, 118, 123, 118, 118,
- 130, 123, 118, 123, 118, 123, 118, 118,
- 118, 123, 118, 126, 118, 131, 118, 129,
- 129, 118, 35, 123, 118, 118, 118, 118,
- 118, 126, 118, 126, 118, 118, 118, 129,
- 129, 118, 35, 123, 118, 118, 118, 118,
- 118, 126, 118, 132, 133, 134, 134, 32,
- 33, 123, 118, 118, 118, 32, 118, 133,
- 134, 134, 32, 33, 123, 118, 118, 118,
- 32, 118, 134, 134, 32, 33, 123, 118,
- 118, 118, 32, 118, 123, 118, 118, 130,
- 123, 118, 118, 118, 32, 118, 119, 120,
- 122, 122, 32, 33, 123, 118, 118, 118,
- 32, 118, 118, 124, 118, 135, 136, 136,
- 32, 33, 123, 118, 118, 118, 32, 118,
- 127, 137, 118, 35, 123, 118, 129, 129,
- 118, 35, 123, 118, 127, 118, 129, 129,
- 118, 35, 123, 118, 129, 137, 118, 35,
- 123, 118, 42, 43, 44, 45, 106, 102,
- 22, 23, 48, 49, 49, 24, 22, 100,
- 42, 52, 100, 56, 138, 58, 59, 4,
- 5, 60, 55, 55, 8, 4, 55, 55,
- 61, 55, 42, 43, 44, 45, 139, 140,
- 22, 141, 142, 55, 49, 24, 22, 55,
- 42, 52, 55, 20, 143, 143, 22, 141,
- 60, 55, 55, 24, 22, 55, 60, 55,
- 55, 67, 60, 55, 55, 55, 22, 55,
- 142, 55, 55, 144, 142, 55, 55, 55,
- 22, 55, 142, 55, 142, 55, 55, 55,
- 142, 55, 42, 55, 68, 20, 143, 143,
- 22, 141, 60, 55, 55, 55, 22, 55,
- 42, 55, 146, 145, 147, 147, 145, 40,
- 148, 145, 147, 147, 145, 40, 148, 145,
- 148, 145, 145, 149, 148, 145, 148, 145,
- 148, 145, 145, 145, 148, 145, 42, 117,
- 117, 117, 117, 117, 117, 117, 117, 49,
- 117, 117, 117, 117, 42, 117, 0
+ 1, 0, 2, 3, 3, 4, 1, 0,
+ 3, 3, 4, 0, 3, 3, 4, 1,
+ 0, 5, 3, 3, 4, 1, 0, 2,
+ 3, 3, 4, 1, 0, 0, 0, 6,
+ 0, 8, 9, 9, 10, 11, 7, 11,
+ 7, 9, 9, 10, 7, 9, 9, 10,
+ 11, 7, 12, 9, 9, 10, 11, 7,
+ 8, 9, 9, 10, 11, 7, 7, 7,
+ 13, 7, 8, 9, 9, 10, 11, 7,
+ 7, 7, 14, 7, 16, 17, 17, 18,
+ 19, 15, 15, 15, 20, 15, 19, 15,
+ 17, 17, 18, 21, 17, 17, 18, 19,
+ 15, 16, 17, 17, 18, 19, 15, 22,
+ 17, 17, 18, 19, 15, 24, 25, 25,
+ 26, 27, 23, 23, 23, 28, 23, 27,
+ 23, 25, 25, 26, 23, 25, 25, 26,
+ 27, 23, 24, 25, 25, 26, 27, 23,
+ 29, 25, 25, 26, 27, 23, 17, 17,
+ 18, 1, 0, 31, 30, 33, 34, 35,
+ 36, 37, 38, 18, 19, 39, 40, 40,
+ 20, 32, 41, 42, 43, 44, 45, 32,
+ 47, 48, 49, 50, 4, 1, 51, 46,
+ 46, 6, 46, 46, 46, 52, 46, 53,
+ 48, 54, 54, 4, 1, 51, 46, 46,
+ 46, 46, 46, 46, 52, 46, 48, 54,
+ 54, 4, 1, 51, 46, 46, 46, 46,
+ 46, 46, 52, 46, 33, 46, 46, 46,
+ 55, 56, 46, 1, 51, 46, 46, 46,
+ 46, 46, 33, 46, 57, 57, 46, 1,
+ 51, 46, 51, 46, 46, 58, 51, 46,
+ 51, 46, 51, 46, 46, 46, 51, 46,
+ 33, 46, 59, 46, 57, 57, 46, 1,
+ 51, 46, 46, 46, 46, 46, 33, 46,
+ 33, 46, 46, 46, 57, 57, 46, 1,
+ 51, 46, 46, 46, 46, 46, 33, 46,
+ 33, 46, 46, 46, 57, 56, 46, 1,
+ 51, 46, 46, 46, 46, 46, 33, 46,
+ 60, 61, 62, 62, 4, 1, 51, 46,
+ 61, 62, 62, 4, 1, 51, 46, 62,
+ 62, 4, 1, 51, 46, 63, 64, 64,
+ 4, 1, 51, 46, 55, 65, 46, 1,
+ 51, 46, 55, 46, 57, 57, 46, 1,
+ 51, 46, 57, 65, 46, 1, 51, 46,
+ 47, 48, 54, 54, 4, 1, 51, 46,
+ 46, 46, 46, 46, 46, 52, 46, 47,
+ 48, 49, 54, 4, 1, 51, 46, 46,
+ 6, 46, 46, 46, 52, 46, 67, 68,
+ 69, 70, 10, 11, 71, 66, 66, 14,
+ 66, 66, 66, 72, 66, 73, 68, 74,
+ 70, 10, 11, 71, 66, 66, 66, 66,
+ 66, 66, 72, 66, 68, 74, 70, 10,
+ 11, 71, 66, 66, 66, 66, 66, 66,
+ 72, 66, 75, 66, 66, 66, 76, 77,
+ 66, 11, 71, 66, 66, 66, 66, 66,
+ 75, 66, 78, 68, 79, 80, 10, 11,
+ 71, 66, 66, 13, 66, 66, 66, 72,
+ 66, 81, 68, 74, 74, 10, 11, 71,
+ 66, 66, 66, 66, 66, 66, 72, 66,
+ 68, 74, 74, 10, 11, 71, 66, 66,
+ 66, 66, 66, 66, 72, 66, 75, 66,
+ 66, 66, 82, 77, 66, 11, 71, 66,
+ 66, 66, 66, 66, 75, 66, 71, 66,
+ 66, 83, 71, 66, 71, 66, 71, 66,
+ 66, 66, 71, 66, 75, 66, 84, 66,
+ 82, 82, 66, 11, 71, 66, 66, 66,
+ 66, 66, 75, 66, 75, 66, 66, 66,
+ 82, 82, 66, 11, 71, 66, 66, 66,
+ 66, 66, 75, 66, 85, 86, 87, 87,
+ 10, 11, 71, 66, 86, 87, 87, 10,
+ 11, 71, 66, 87, 87, 10, 11, 71,
+ 66, 88, 89, 89, 10, 11, 71, 66,
+ 76, 90, 66, 11, 71, 66, 82, 82,
+ 66, 11, 71, 66, 76, 66, 82, 82,
+ 66, 11, 71, 66, 82, 90, 66, 11,
+ 71, 66, 78, 68, 74, 74, 10, 11,
+ 71, 66, 66, 66, 66, 66, 66, 72,
+ 66, 78, 68, 79, 74, 10, 11, 71,
+ 66, 66, 13, 66, 66, 66, 72, 66,
+ 8, 9, 9, 10, 11, 66, 67, 68,
+ 74, 70, 10, 11, 71, 66, 66, 66,
+ 66, 66, 66, 72, 66, 92, 36, 93,
+ 93, 18, 19, 39, 91, 91, 91, 91,
+ 91, 91, 43, 91, 36, 93, 93, 18,
+ 19, 39, 91, 91, 91, 91, 91, 91,
+ 43, 91, 94, 91, 91, 91, 95, 96,
+ 91, 19, 39, 91, 91, 91, 91, 91,
+ 94, 91, 35, 36, 97, 98, 18, 19,
+ 39, 91, 91, 20, 91, 91, 91, 43,
+ 91, 94, 91, 91, 91, 99, 96, 91,
+ 19, 39, 91, 91, 91, 91, 91, 94,
+ 91, 39, 91, 91, 100, 39, 91, 39,
+ 91, 39, 91, 91, 91, 39, 91, 94,
+ 91, 101, 91, 99, 99, 91, 19, 39,
+ 91, 91, 91, 91, 91, 94, 91, 94,
+ 91, 91, 91, 99, 99, 91, 19, 39,
+ 91, 91, 91, 91, 91, 94, 91, 102,
+ 103, 104, 104, 18, 19, 39, 91, 103,
+ 104, 104, 18, 19, 39, 91, 104, 104,
+ 18, 19, 39, 91, 35, 36, 93, 93,
+ 18, 19, 39, 91, 91, 91, 91, 91,
+ 91, 43, 91, 105, 106, 106, 18, 19,
+ 39, 91, 95, 107, 91, 19, 39, 91,
+ 99, 99, 91, 19, 39, 91, 95, 91,
+ 99, 99, 91, 19, 39, 91, 99, 107,
+ 91, 19, 39, 91, 35, 36, 97, 93,
+ 18, 19, 39, 91, 91, 20, 91, 91,
+ 91, 43, 91, 16, 17, 17, 18, 19,
+ 108, 108, 108, 20, 108, 16, 17, 17,
+ 18, 19, 108, 110, 111, 112, 113, 26,
+ 27, 114, 109, 109, 28, 109, 109, 109,
+ 115, 109, 116, 111, 113, 113, 26, 27,
+ 114, 109, 109, 109, 109, 109, 109, 115,
+ 109, 111, 113, 113, 26, 27, 114, 109,
+ 109, 109, 109, 109, 109, 115, 109, 117,
+ 109, 109, 109, 118, 119, 109, 27, 114,
+ 109, 109, 109, 109, 109, 117, 109, 110,
+ 111, 112, 40, 26, 27, 114, 109, 109,
+ 28, 109, 109, 109, 115, 109, 117, 109,
+ 109, 109, 120, 119, 109, 27, 114, 109,
+ 109, 109, 109, 109, 117, 109, 114, 109,
+ 109, 121, 114, 109, 114, 109, 114, 109,
+ 109, 109, 114, 109, 117, 109, 122, 109,
+ 120, 120, 109, 27, 114, 109, 109, 109,
+ 109, 109, 117, 109, 117, 109, 109, 109,
+ 120, 120, 109, 27, 114, 109, 109, 109,
+ 109, 109, 117, 109, 123, 124, 125, 125,
+ 26, 27, 114, 109, 124, 125, 125, 26,
+ 27, 114, 109, 125, 125, 26, 27, 114,
+ 109, 110, 111, 113, 113, 26, 27, 114,
+ 109, 109, 109, 109, 109, 109, 115, 109,
+ 126, 127, 127, 26, 27, 114, 109, 118,
+ 128, 109, 27, 114, 109, 120, 120, 109,
+ 27, 114, 109, 118, 109, 120, 120, 109,
+ 27, 114, 109, 120, 128, 109, 27, 114,
+ 109, 33, 34, 35, 36, 97, 93, 18,
+ 19, 39, 40, 40, 20, 91, 91, 33,
+ 43, 91, 47, 129, 49, 50, 4, 1,
+ 51, 46, 46, 6, 46, 46, 46, 52,
+ 46, 33, 34, 35, 36, 130, 131, 18,
+ 132, 133, 46, 40, 20, 46, 46, 33,
+ 43, 46, 16, 134, 134, 18, 132, 51,
+ 46, 46, 20, 46, 133, 46, 46, 135,
+ 133, 46, 133, 46, 133, 46, 46, 46,
+ 133, 46, 33, 46, 59, 16, 134, 134,
+ 18, 132, 51, 46, 46, 46, 46, 46,
+ 33, 46, 137, 136, 138, 138, 136, 31,
+ 139, 136, 138, 138, 136, 31, 139, 136,
+ 139, 136, 136, 140, 139, 136, 139, 136,
+ 139, 136, 136, 136, 139, 136, 33, 108,
+ 108, 108, 108, 108, 108, 108, 108, 40,
+ 108, 108, 108, 108, 33, 108, 0
};
static const unsigned char _indic_syllable_machine_trans_targs[] = {
- 31, 37, 42, 2, 43, 46, 4, 50,
- 51, 31, 60, 9, 66, 69, 61, 11,
- 74, 75, 78, 31, 83, 17, 89, 92,
- 93, 84, 31, 19, 98, 31, 107, 24,
- 113, 116, 117, 108, 26, 122, 127, 31,
- 134, 31, 32, 53, 79, 81, 100, 101,
- 85, 102, 123, 124, 94, 132, 137, 31,
- 33, 35, 6, 52, 38, 47, 34, 1,
- 36, 40, 0, 39, 41, 44, 45, 3,
- 48, 5, 49, 31, 54, 56, 14, 77,
- 62, 70, 55, 7, 57, 72, 64, 58,
- 13, 76, 59, 8, 63, 65, 67, 68,
- 10, 71, 12, 73, 31, 80, 20, 82,
- 96, 87, 15, 99, 16, 86, 88, 90,
- 91, 18, 95, 21, 97, 31, 31, 103,
- 105, 22, 27, 109, 118, 104, 106, 120,
- 111, 23, 110, 112, 114, 115, 25, 119,
- 28, 121, 125, 126, 131, 128, 129, 29,
- 130, 31, 133, 30, 135, 136
+ 27, 33, 38, 2, 39, 45, 46, 27,
+ 55, 8, 61, 56, 68, 69, 72, 27,
+ 77, 15, 83, 78, 86, 27, 91, 27,
+ 100, 21, 106, 101, 109, 114, 27, 125,
+ 27, 28, 48, 73, 75, 93, 94, 79,
+ 95, 115, 116, 87, 123, 128, 27, 29,
+ 31, 5, 47, 34, 42, 30, 1, 32,
+ 36, 0, 35, 37, 40, 41, 3, 43,
+ 4, 44, 27, 49, 51, 12, 71, 57,
+ 64, 50, 6, 52, 66, 59, 53, 11,
+ 70, 54, 7, 58, 60, 62, 63, 9,
+ 65, 10, 67, 27, 74, 17, 76, 89,
+ 81, 13, 92, 14, 80, 82, 84, 85,
+ 16, 88, 18, 90, 27, 27, 96, 98,
+ 19, 23, 102, 110, 97, 99, 112, 104,
+ 20, 103, 105, 107, 108, 22, 111, 24,
+ 113, 117, 118, 122, 119, 120, 25, 121,
+ 27, 124, 26, 126, 127
};
static const char _indic_syllable_machine_trans_actions[] = {
- 1, 0, 2, 0, 2, 0, 0, 2,
- 2, 3, 2, 0, 2, 0, 0, 0,
- 2, 2, 2, 4, 2, 0, 5, 0,
- 5, 0, 6, 0, 2, 7, 2, 0,
- 2, 0, 2, 0, 0, 2, 0, 8,
- 0, 11, 2, 2, 5, 0, 12, 12,
- 0, 2, 5, 2, 5, 2, 0, 13,
- 2, 0, 0, 2, 0, 2, 2, 0,
- 2, 2, 0, 0, 2, 2, 2, 0,
- 0, 0, 2, 14, 2, 0, 0, 2,
- 0, 2, 2, 0, 2, 2, 2, 2,
- 0, 2, 2, 0, 0, 2, 2, 2,
- 0, 0, 0, 2, 15, 5, 0, 5,
- 2, 2, 0, 5, 0, 0, 2, 5,
- 5, 0, 0, 0, 2, 16, 17, 2,
- 0, 0, 0, 0, 2, 2, 2, 2,
+ 1, 0, 2, 0, 2, 2, 2, 3,
+ 2, 0, 2, 0, 2, 2, 2, 4,
+ 2, 0, 5, 0, 5, 6, 2, 7,
+ 2, 0, 2, 0, 2, 2, 8, 0,
+ 11, 2, 2, 5, 0, 12, 12, 0,
+ 2, 5, 2, 5, 2, 0, 13, 2,
+ 0, 0, 2, 0, 2, 2, 0, 2,
2, 0, 0, 2, 2, 2, 0, 0,
- 0, 2, 0, 18, 18, 0, 0, 0,
- 0, 19, 2, 0, 0, 0
+ 0, 2, 14, 2, 0, 0, 2, 0,
+ 2, 2, 0, 2, 2, 2, 2, 0,
+ 2, 2, 0, 0, 2, 2, 2, 0,
+ 0, 0, 2, 15, 5, 0, 5, 2,
+ 2, 0, 5, 0, 0, 2, 5, 5,
+ 0, 0, 0, 2, 16, 17, 2, 0,
+ 0, 0, 0, 2, 2, 2, 2, 2,
+ 0, 0, 2, 2, 2, 0, 0, 0,
+ 2, 0, 18, 18, 0, 0, 0, 0,
+ 19, 2, 0, 0, 0
};
static const char _indic_syllable_machine_to_state_actions[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 9,
+ 0, 0, 0, 9, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
@@ -384,16 +349,14 @@ static const char _indic_syllable_machine_to_state_actions[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0
+ 0
};
static const char _indic_syllable_machine_from_state_actions[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 10,
- 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 10, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
@@ -406,42 +369,41 @@ static const char _indic_syllable_machine_from_state_actions[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0
+ 0
};
static const short _indic_syllable_machine_eof_trans[] = {
- 1, 1, 1, 1, 1, 1, 1, 10,
- 10, 10, 10, 10, 10, 10, 10, 20,
- 20, 27, 20, 27, 20, 20, 30, 30,
- 30, 30, 30, 30, 30, 1, 40, 0,
- 56, 56, 56, 56, 56, 56, 56, 56,
- 56, 56, 56, 56, 56, 56, 56, 56,
- 56, 56, 56, 56, 56, 76, 76, 76,
- 76, 76, 76, 76, 76, 76, 76, 76,
- 76, 76, 76, 76, 76, 76, 76, 76,
- 76, 76, 76, 76, 76, 76, 76, 101,
- 101, 101, 101, 101, 101, 101, 101, 101,
- 101, 101, 101, 101, 101, 101, 101, 101,
- 101, 101, 101, 101, 118, 118, 119, 119,
- 119, 119, 119, 119, 119, 119, 119, 119,
- 119, 119, 119, 119, 119, 119, 119, 119,
- 119, 119, 119, 101, 56, 56, 56, 56,
- 56, 56, 56, 56, 146, 146, 146, 146,
- 146, 118
+ 1, 1, 1, 1, 1, 1, 8, 8,
+ 8, 8, 8, 8, 8, 16, 16, 22,
+ 16, 16, 16, 24, 24, 24, 24, 24,
+ 24, 1, 31, 0, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47,
+ 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 67,
+ 67, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 92, 92, 92, 92, 109, 109, 110,
+ 110, 110, 110, 110, 110, 110, 110, 110,
+ 110, 110, 110, 110, 110, 110, 110, 110,
+ 110, 110, 110, 92, 47, 47, 47, 47,
+ 47, 47, 47, 137, 137, 137, 137, 137,
+ 109
};
-static const int indic_syllable_machine_start = 31;
-static const int indic_syllable_machine_first_final = 31;
+static const int indic_syllable_machine_start = 27;
+static const int indic_syllable_machine_first_final = 27;
static const int indic_syllable_machine_error = -1;
-static const int indic_syllable_machine_en_main = 31;
+static const int indic_syllable_machine_en_main = 27;
#line 58 "hb-ot-shaper-indic-machine.rl"
-#line 118 "hb-ot-shaper-indic-machine.rl"
+#line 117 "hb-ot-shaper-indic-machine.rl"
#define found_syllable(syllable_type) \
@@ -450,7 +412,7 @@ static const int indic_syllable_machine_en_main = 31;
for (unsigned int i = ts; i < te; i++) \
info[i].syllable() = (syllable_serial << 4) | syllable_type; \
syllable_serial++; \
- if (syllable_serial == 16) syllable_serial = 1; \
+ if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
} HB_STMT_END
inline void
@@ -460,7 +422,7 @@ find_syllables_indic (hb_buffer_t *buffer)
int cs;
hb_glyph_info_t *info = buffer->info;
-#line 453 "hb-ot-shaper-indic-machine.hh"
+#line 426 "hb-ot-shaper-indic-machine.hh"
{
cs = indic_syllable_machine_start;
ts = 0;
@@ -468,7 +430,7 @@ find_syllables_indic (hb_buffer_t *buffer)
act = 0;
}
-#line 138 "hb-ot-shaper-indic-machine.rl"
+#line 137 "hb-ot-shaper-indic-machine.rl"
p = 0;
@@ -476,7 +438,7 @@ find_syllables_indic (hb_buffer_t *buffer)
unsigned int syllable_serial = 1;
-#line 465 "hb-ot-shaper-indic-machine.hh"
+#line 442 "hb-ot-shaper-indic-machine.hh"
{
int _slen;
int _trans;
@@ -490,7 +452,7 @@ _resume:
#line 1 "NONE"
{ts = p;}
break;
-#line 477 "hb-ot-shaper-indic-machine.hh"
+#line 456 "hb-ot-shaper-indic-machine.hh"
}
_keys = _indic_syllable_machine_trans_keys + (cs<<1);
@@ -513,51 +475,51 @@ _eof_trans:
{te = p+1;}
break;
case 11:
-#line 114 "hb-ot-shaper-indic-machine.rl"
+#line 113 "hb-ot-shaper-indic-machine.rl"
{te = p+1;{ found_syllable (indic_non_indic_cluster); }}
break;
case 13:
-#line 109 "hb-ot-shaper-indic-machine.rl"
+#line 108 "hb-ot-shaper-indic-machine.rl"
{te = p;p--;{ found_syllable (indic_consonant_syllable); }}
break;
case 14:
-#line 110 "hb-ot-shaper-indic-machine.rl"
+#line 109 "hb-ot-shaper-indic-machine.rl"
{te = p;p--;{ found_syllable (indic_vowel_syllable); }}
break;
case 17:
-#line 111 "hb-ot-shaper-indic-machine.rl"
+#line 110 "hb-ot-shaper-indic-machine.rl"
{te = p;p--;{ found_syllable (indic_standalone_cluster); }}
break;
case 19:
-#line 112 "hb-ot-shaper-indic-machine.rl"
+#line 111 "hb-ot-shaper-indic-machine.rl"
{te = p;p--;{ found_syllable (indic_symbol_cluster); }}
break;
case 15:
-#line 113 "hb-ot-shaper-indic-machine.rl"
+#line 112 "hb-ot-shaper-indic-machine.rl"
{te = p;p--;{ found_syllable (indic_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }}
break;
case 16:
-#line 114 "hb-ot-shaper-indic-machine.rl"
+#line 113 "hb-ot-shaper-indic-machine.rl"
{te = p;p--;{ found_syllable (indic_non_indic_cluster); }}
break;
case 1:
-#line 109 "hb-ot-shaper-indic-machine.rl"
+#line 108 "hb-ot-shaper-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (indic_consonant_syllable); }}
break;
case 3:
-#line 110 "hb-ot-shaper-indic-machine.rl"
+#line 109 "hb-ot-shaper-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (indic_vowel_syllable); }}
break;
case 7:
-#line 111 "hb-ot-shaper-indic-machine.rl"
+#line 110 "hb-ot-shaper-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (indic_standalone_cluster); }}
break;
case 8:
-#line 112 "hb-ot-shaper-indic-machine.rl"
+#line 111 "hb-ot-shaper-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (indic_symbol_cluster); }}
break;
case 4:
-#line 113 "hb-ot-shaper-indic-machine.rl"
+#line 112 "hb-ot-shaper-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (indic_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }}
break;
case 6:
@@ -578,19 +540,19 @@ _eof_trans:
case 18:
#line 1 "NONE"
{te = p+1;}
-#line 109 "hb-ot-shaper-indic-machine.rl"
+#line 108 "hb-ot-shaper-indic-machine.rl"
{act = 1;}
break;
case 5:
#line 1 "NONE"
{te = p+1;}
-#line 113 "hb-ot-shaper-indic-machine.rl"
+#line 112 "hb-ot-shaper-indic-machine.rl"
{act = 5;}
break;
case 12:
#line 1 "NONE"
{te = p+1;}
-#line 114 "hb-ot-shaper-indic-machine.rl"
+#line 113 "hb-ot-shaper-indic-machine.rl"
{act = 6;}
break;
#line 559 "hb-ot-shaper-indic-machine.hh"
@@ -602,7 +564,7 @@ _again:
#line 1 "NONE"
{ts = 0;}
break;
-#line 566 "hb-ot-shaper-indic-machine.hh"
+#line 568 "hb-ot-shaper-indic-machine.hh"
}
if ( ++p != pe )
@@ -618,7 +580,7 @@ _again:
}
-#line 146 "hb-ot-shaper-indic-machine.rl"
+#line 145 "hb-ot-shaper-indic-machine.rl"
}
diff --git a/src/hb-ot-shaper-indic-machine.rl b/src/hb-ot-shaper-indic-machine.rl
index 46841884d..3274a776a 100644
--- a/src/hb-ot-shaper-indic-machine.rl
+++ b/src/hb-ot-shaper-indic-machine.rl
@@ -74,7 +74,6 @@ export VD = 9;
export PLACEHOLDER = 10;
export DOTTEDCIRCLE = 11;
export RS = 12;
-export MPst = 13;
export Repha = 14;
export Ra = 15;
export CM = 16;
@@ -89,7 +88,7 @@ reph = (Ra H | Repha); # possible reph
cn = c.ZWJ?.n?;
symbol = Symbol.N?;
-matra_group = z*.(M | SM? MPst).N?.H?;
+matra_group = z*.M.N?.H?;
syllable_tail = (z?.SM.SM?.ZWNJ?)? (A | VD)*;
halant_group = (z?.H.(ZWJ.N?)?);
final_halant_group = halant_group | H.ZWNJ;
@@ -123,7 +122,7 @@ main := |*
for (unsigned int i = ts; i < te; i++) \
info[i].syllable() = (syllable_serial << 4) | syllable_type; \
syllable_serial++; \
- if (syllable_serial == 16) syllable_serial = 1; \
+ if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
} HB_STMT_END
inline void
diff --git a/src/hb-ot-shaper-indic-table.cc b/src/hb-ot-shaper-indic-table.cc
index d9fb0510e..bf6a2757b 100644
--- a/src/hb-ot-shaper-indic-table.cc
+++ b/src/hb-ot-shaper-indic-table.cc
@@ -42,7 +42,6 @@
#define OT_PLACEHOLDER I_Cat(PLACEHOLDER)
#define OT_DOTTEDCIRCLE I_Cat(DOTTEDCIRCLE)
#define OT_RS I_Cat(RS)
-#define OT_MPst I_Cat(MPst)
#define OT_Repha I_Cat(Repha)
#define OT_Ra I_Cat(Ra)
#define OT_CM I_Cat(CM)
@@ -81,10 +80,9 @@ static_assert (OT_VPst == M_Cat(VPst), "");
#define _OT_CS OT_CS /* 2 chars; CS */
#define _OT_DC OT_DOTTEDCIRCLE /* 1 chars; DOTTEDCIRCLE */
#define _OT_H OT_H /* 11 chars; H */
-#define _OT_M OT_M /* 142 chars; M */
+#define _OT_M OT_M /* 143 chars; M */
#define _OT_MH OT_MH /* 1 chars; MH */
#define _OT_ML OT_ML /* 1 chars; ML */
-#define _OT_MP OT_MPst /* 1 chars; MPst */
#define _OT_MR OT_MR /* 1 chars; MR */
#define _OT_MW OT_MW /* 2 chars; MW */
#define _OT_MY OT_MY /* 3 chars; MY */
@@ -202,7 +200,7 @@ static const uint16_t indic_table[] = {
/* 0A28 */ _(C,C), _(X,X), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C),
/* 0A30 */ _(R,C), _(X,X), _(C,C), _(C,C), _(X,X), _(C,C), _(C,C), _(X,X),
/* 0A38 */ _(C,C), _(C,C), _(X,X), _(X,X), _(N,X), _(X,X), _(M,AP), _(M,LM),
- /* 0A40 */_(MP,AP), _(M,AP), _(M,AP), _(X,X), _(X,X), _(X,X), _(X,X), _(M,AP),
+ /* 0A40 */ _(M,AP), _(M,AP), _(M,AP), _(X,X), _(X,X), _(X,X), _(X,X), _(M,AP),
/* 0A48 */ _(M,AP), _(X,X), _(X,X), _(M,AP), _(M,AP), _(H,B), _(X,X), _(X,X),
/* 0A50 */ _(X,X), _(M,B), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
/* 0A58 */ _(X,X), _(C,C), _(C,C), _(C,C), _(C,C), _(X,X), _(C,C), _(X,X),
@@ -453,12 +451,15 @@ static const uint16_t indic_table[] = {
/* Grantha */
/* 11300 */ _(X,X),_(SM,SM),_(SM,SM),_(SM,SM), _(X,X), _(X,X), _(X,X), _(X,X),
-
-#define indic_offset_0x11338u 1720
-
+ /* 11308 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
+ /* 11310 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
+ /* 11318 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
+ /* 11320 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
+ /* 11328 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
+ /* 11330 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X),
/* 11338 */ _(X,X), _(X,X), _(X,X), _(N,X), _(N,X), _(X,X), _(X,X), _(X,X),
-}; /* Table items: 1728; occupancy: 71% */
+}; /* Table items: 1776; occupancy: 69% */
uint16_t
hb_indic_get_categories (hb_codepoint_t u)
@@ -496,8 +497,7 @@ hb_indic_get_categories (hb_codepoint_t u)
break;
case 0x11u:
- if (hb_in_range<hb_codepoint_t> (u, 0x11300u, 0x11307u)) return indic_table[u - 0x11300u + indic_offset_0x11300u];
- if (hb_in_range<hb_codepoint_t> (u, 0x11338u, 0x1133Fu)) return indic_table[u - 0x11338u + indic_offset_0x11338u];
+ if (hb_in_range<hb_codepoint_t> (u, 0x11300u, 0x1133Fu)) return indic_table[u - 0x11300u + indic_offset_0x11300u];
break;
default:
@@ -519,7 +519,6 @@ hb_indic_get_categories (hb_codepoint_t u)
#undef _OT_M
#undef _OT_MH
#undef _OT_ML
-#undef _OT_MP
#undef _OT_MR
#undef _OT_MW
#undef _OT_MY
diff --git a/src/hb-ot-shaper-indic.cc b/src/hb-ot-shaper-indic.cc
index 7652210d9..55509c110 100644
--- a/src/hb-ot-shaper-indic.cc
+++ b/src/hb-ot-shaper-indic.cc
@@ -223,15 +223,15 @@ enum {
INDIC_BASIC_FEATURES = INDIC_INIT, /* Don't forget to update this! */
};
-static bool
+static void
setup_syllables_indic (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
-static bool
+static void
initial_reordering_indic (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
-static bool
+static void
final_reordering_indic (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
@@ -413,7 +413,7 @@ setup_masks_indic (const hb_ot_shape_plan_t *plan HB_UNUSED,
set_indic_properties (info[i]);
}
-static bool
+static void
setup_syllables_indic (const hb_ot_shape_plan_t *plan HB_UNUSED,
hb_font_t *font HB_UNUSED,
hb_buffer_t *buffer)
@@ -422,7 +422,6 @@ setup_syllables_indic (const hb_ot_shape_plan_t *plan HB_UNUSED,
find_syllables_indic (buffer);
foreach_syllable (buffer, start, end)
buffer->unsafe_to_break (start, end);
- return false;
}
static int
@@ -715,9 +714,6 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
}
}
} else if (info[i].indic_position() != POS_SMVD) {
- if (info[i].indic_category() == I_Cat(MPst) &&
- i > start && info[i - 1].indic_category() == I_Cat(SM))
- info[i - 1].indic_position() = info[i].indic_position();
last_pos = (indic_position_t) info[i].indic_position();
}
}
@@ -733,7 +729,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
if (info[j].indic_position() < POS_SMVD)
info[j].indic_position() = info[i].indic_position();
last = i;
- } else if (FLAG_UNSAFE (info[i].indic_category()) & (FLAG (I_Cat(M)) | FLAG (I_Cat(MPst))))
+ } else if (info[i].indic_category() == I_Cat(M))
last = i;
}
@@ -746,40 +742,14 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
/* Sit tight, rock 'n roll! */
hb_stable_sort (info + start, end - start, compare_indic_order);
-
- /* Find base again; also flip left-matra sequence. */
- unsigned first_left_matra = end;
- unsigned last_left_matra = end;
+ /* Find base again */
base = end;
for (unsigned int i = start; i < end; i++)
- {
if (info[i].indic_position() == POS_BASE_C)
{
base = i;
break;
}
- else if (info[i].indic_position() == POS_PRE_M)
- {
- if (first_left_matra == end)
- first_left_matra = i;
- last_left_matra = i;
- }
- }
- /* https://github.com/harfbuzz/harfbuzz/issues/3863 */
- if (first_left_matra < last_left_matra)
- {
- /* No need to merge clusters, handled later. */
- buffer->reverse_range (first_left_matra, last_left_matra + 1);
- /* Reverse back nuktas, etc. */
- unsigned i = first_left_matra;
- for (unsigned j = i; j <= last_left_matra; j++)
- if (FLAG_UNSAFE (info[j].indic_category()) & (FLAG (I_Cat(M)) | FLAG (I_Cat(MPst))))
- {
- buffer->reverse_range (i, j + 1);
- i = j + 1;
- }
- }
-
/* Things are out-of-control for post base positions, they may shuffle
* around like crazy. In old-spec mode, we move halants around, so in
* that case merge all clusters after base. Otherwise, check the sort
@@ -985,29 +955,25 @@ initial_reordering_syllable_indic (const hb_ot_shape_plan_t *plan,
}
}
-static bool
+static void
initial_reordering_indic (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer)
{
- bool ret = false;
if (!buffer->message (font, "start reordering indic initial"))
- return ret;
+ return;
update_consonant_positions_indic (plan, font, buffer);
- if (hb_syllabic_insert_dotted_circles (font, buffer,
- indic_broken_cluster,
- I_Cat(DOTTEDCIRCLE),
- I_Cat(Repha),
- POS_END))
- ret = true;
+ hb_syllabic_insert_dotted_circles (font, buffer,
+ indic_broken_cluster,
+ I_Cat(DOTTEDCIRCLE),
+ I_Cat(Repha),
+ POS_END);
foreach_syllable (buffer, start, end)
initial_reordering_syllable_indic (plan, font->face, buffer, start, end);
(void) buffer->message (font, "end reordering indic initial");
-
- return ret;
}
static void
@@ -1150,7 +1116,7 @@ final_reordering_syllable_indic (const hb_ot_shape_plan_t *plan,
{
search:
while (new_pos > start &&
- !(is_one_of (info[new_pos], (FLAG (I_Cat(M)) | FLAG (I_Cat(MPst)) | FLAG (I_Cat(H))))))
+ !(is_one_of (info[new_pos], (FLAG (I_Cat(M)) | FLAG (I_Cat(H))))))
new_pos--;
/* If we found no Halant we are done.
@@ -1350,8 +1316,7 @@ final_reordering_syllable_indic (const hb_ot_shape_plan_t *plan,
unlikely (is_halant (info[new_reph_pos])))
{
for (unsigned int i = base + 1; i < new_reph_pos; i++)
- if (FLAG_UNSAFE (info[i].indic_category()) & (FLAG (I_Cat(M)) | FLAG (I_Cat(MPst))))
- {
+ if (info[i].indic_category() == I_Cat(M)) {
/* Ok, got it. */
new_reph_pos--;
}
@@ -1411,7 +1376,7 @@ final_reordering_syllable_indic (const hb_ot_shape_plan_t *plan,
if (buffer->props.script != HB_SCRIPT_MALAYALAM && buffer->props.script != HB_SCRIPT_TAMIL)
{
while (new_pos > start &&
- !(is_one_of (info[new_pos - 1], FLAG (I_Cat(M)) | FLAG (I_Cat(MPst)) | FLAG (I_Cat(H)))))
+ !(is_one_of (info[new_pos - 1], FLAG(I_Cat(M)) | FLAG (I_Cat(H)))))
new_pos--;
}
@@ -1474,13 +1439,13 @@ final_reordering_syllable_indic (const hb_ot_shape_plan_t *plan,
}
-static bool
+static void
final_reordering_indic (const hb_ot_shape_plan_t *plan,
hb_font_t *font HB_UNUSED,
hb_buffer_t *buffer)
{
unsigned int count = buffer->len;
- if (unlikely (!count)) return false;
+ if (unlikely (!count)) return;
if (buffer->message (font, "start reordering indic final")) {
foreach_syllable (buffer, start, end)
@@ -1490,8 +1455,6 @@ final_reordering_indic (const hb_ot_shape_plan_t *plan,
HB_BUFFER_DEALLOCATE_VAR (buffer, indic_category);
HB_BUFFER_DEALLOCATE_VAR (buffer, indic_position);
-
- return false;
}
diff --git a/src/hb-ot-shaper-khmer-machine.hh b/src/hb-ot-shaper-khmer-machine.hh
index fd91ee0ca..e18bd75ef 100644
--- a/src/hb-ot-shaper-khmer-machine.hh
+++ b/src/hb-ot-shaper-khmer-machine.hh
@@ -48,7 +48,7 @@ enum khmer_syllable_type_t {
};
-#line 49 "hb-ot-shaper-khmer-machine.hh"
+#line 52 "hb-ot-shaper-khmer-machine.hh"
#define khmer_syllable_machine_ex_C 1u
#define khmer_syllable_machine_ex_DOTTEDCIRCLE 11u
#define khmer_syllable_machine_ex_H 4u
@@ -66,7 +66,7 @@ enum khmer_syllable_type_t {
#define khmer_syllable_machine_ex_ZWNJ 5u
-#line 65 "hb-ot-shaper-khmer-machine.hh"
+#line 70 "hb-ot-shaper-khmer-machine.hh"
static const unsigned char _khmer_syllable_machine_trans_keys[] = {
5u, 26u, 5u, 26u, 1u, 15u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u,
5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 1u, 15u, 5u, 26u, 5u, 26u,
@@ -284,7 +284,7 @@ static const int khmer_syllable_machine_en_main = 21;
for (unsigned int i = ts; i < te; i++) \
info[i].syllable() = (syllable_serial << 4) | syllable_type; \
syllable_serial++; \
- if (syllable_serial == 16) syllable_serial = 1; \
+ if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
} HB_STMT_END
inline void
@@ -294,7 +294,7 @@ find_syllables_khmer (hb_buffer_t *buffer)
int cs;
hb_glyph_info_t *info = buffer->info;
-#line 287 "hb-ot-shaper-khmer-machine.hh"
+#line 298 "hb-ot-shaper-khmer-machine.hh"
{
cs = khmer_syllable_machine_start;
ts = 0;
@@ -310,7 +310,7 @@ find_syllables_khmer (hb_buffer_t *buffer)
unsigned int syllable_serial = 1;
-#line 299 "hb-ot-shaper-khmer-machine.hh"
+#line 314 "hb-ot-shaper-khmer-machine.hh"
{
int _slen;
int _trans;
@@ -324,7 +324,7 @@ _resume:
#line 1 "NONE"
{ts = p;}
break;
-#line 311 "hb-ot-shaper-khmer-machine.hh"
+#line 328 "hb-ot-shaper-khmer-machine.hh"
}
_keys = _khmer_syllable_machine_trans_keys + (cs<<1);
@@ -394,7 +394,7 @@ _eof_trans:
#line 98 "hb-ot-shaper-khmer-machine.rl"
{act = 3;}
break;
-#line 368 "hb-ot-shaper-khmer-machine.hh"
+#line 398 "hb-ot-shaper-khmer-machine.hh"
}
_again:
@@ -403,7 +403,7 @@ _again:
#line 1 "NONE"
{ts = 0;}
break;
-#line 375 "hb-ot-shaper-khmer-machine.hh"
+#line 407 "hb-ot-shaper-khmer-machine.hh"
}
if ( ++p != pe )
diff --git a/src/hb-ot-shaper-khmer-machine.rl b/src/hb-ot-shaper-khmer-machine.rl
index d5d429d67..f180471bb 100644
--- a/src/hb-ot-shaper-khmer-machine.rl
+++ b/src/hb-ot-shaper-khmer-machine.rl
@@ -107,7 +107,7 @@ main := |*
for (unsigned int i = ts; i < te; i++) \
info[i].syllable() = (syllable_serial << 4) | syllable_type; \
syllable_serial++; \
- if (syllable_serial == 16) syllable_serial = 1; \
+ if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
} HB_STMT_END
inline void
diff --git a/src/hb-ot-shaper-khmer.cc b/src/hb-ot-shaper-khmer.cc
index 019a28510..d9795589f 100644
--- a/src/hb-ot-shaper-khmer.cc
+++ b/src/hb-ot-shaper-khmer.cc
@@ -89,11 +89,11 @@ set_khmer_properties (hb_glyph_info_t &info)
info.khmer_category() = (khmer_category_t) (type & 0xFFu);
}
-static bool
+static void
setup_syllables_khmer (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
-static bool
+static void
reorder_khmer (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
@@ -192,7 +192,7 @@ setup_masks_khmer (const hb_ot_shape_plan_t *plan HB_UNUSED,
set_khmer_properties (info[i]);
}
-static bool
+static void
setup_syllables_khmer (const hb_ot_shape_plan_t *plan HB_UNUSED,
hb_font_t *font HB_UNUSED,
hb_buffer_t *buffer)
@@ -201,7 +201,6 @@ setup_syllables_khmer (const hb_ot_shape_plan_t *plan HB_UNUSED,
find_syllables_khmer (buffer);
foreach_syllable (buffer, start, end)
buffer->unsafe_to_break (start, end);
- return false;
}
@@ -304,27 +303,23 @@ reorder_syllable_khmer (const hb_ot_shape_plan_t *plan,
}
}
-static bool
+static void
reorder_khmer (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer)
{
- bool ret = false;
if (buffer->message (font, "start reordering khmer"))
{
- if (hb_syllabic_insert_dotted_circles (font, buffer,
- khmer_broken_cluster,
- K_Cat(DOTTEDCIRCLE),
- (unsigned) -1))
- ret = true;
+ hb_syllabic_insert_dotted_circles (font, buffer,
+ khmer_broken_cluster,
+ K_Cat(DOTTEDCIRCLE),
+ (unsigned) -1);
foreach_syllable (buffer, start, end)
reorder_syllable_khmer (plan, font->face, buffer, start, end);
(void) buffer->message (font, "end reordering khmer");
}
HB_BUFFER_DEALLOCATE_VAR (buffer, khmer_category);
-
- return ret;
}
diff --git a/src/hb-ot-shaper-myanmar-machine.hh b/src/hb-ot-shaper-myanmar-machine.hh
index 87cded4ed..b10970893 100644
--- a/src/hb-ot-shaper-myanmar-machine.hh
+++ b/src/hb-ot-shaper-myanmar-machine.hh
@@ -50,7 +50,7 @@ enum myanmar_syllable_type_t {
};
-#line 51 "hb-ot-shaper-myanmar-machine.hh"
+#line 54 "hb-ot-shaper-myanmar-machine.hh"
#define myanmar_syllable_machine_ex_A 9u
#define myanmar_syllable_machine_ex_As 32u
#define myanmar_syllable_machine_ex_C 1u
@@ -77,7 +77,7 @@ enum myanmar_syllable_type_t {
#define myanmar_syllable_machine_ex_ZWNJ 5u
-#line 76 "hb-ot-shaper-myanmar-machine.hh"
+#line 81 "hb-ot-shaper-myanmar-machine.hh"
static const unsigned char _myanmar_syllable_machine_trans_keys[] = {
1u, 41u, 3u, 41u, 5u, 39u, 5u, 8u, 3u, 41u, 3u, 39u, 3u, 39u, 5u, 39u,
5u, 39u, 3u, 39u, 3u, 39u, 3u, 41u, 5u, 39u, 1u, 15u, 3u, 39u, 3u, 39u,
@@ -433,7 +433,7 @@ static const int myanmar_syllable_machine_en_main = 0;
for (unsigned int i = ts; i < te; i++) \
info[i].syllable() = (syllable_serial << 4) | syllable_type; \
syllable_serial++; \
- if (syllable_serial == 16) syllable_serial = 1; \
+ if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
} HB_STMT_END
inline void
@@ -443,7 +443,7 @@ find_syllables_myanmar (hb_buffer_t *buffer)
int cs;
hb_glyph_info_t *info = buffer->info;
-#line 436 "hb-ot-shaper-myanmar-machine.hh"
+#line 447 "hb-ot-shaper-myanmar-machine.hh"
{
cs = myanmar_syllable_machine_start;
ts = 0;
@@ -459,7 +459,7 @@ find_syllables_myanmar (hb_buffer_t *buffer)
unsigned int syllable_serial = 1;
-#line 448 "hb-ot-shaper-myanmar-machine.hh"
+#line 463 "hb-ot-shaper-myanmar-machine.hh"
{
int _slen;
int _trans;
@@ -473,7 +473,7 @@ _resume:
#line 1 "NONE"
{ts = p;}
break;
-#line 460 "hb-ot-shaper-myanmar-machine.hh"
+#line 477 "hb-ot-shaper-myanmar-machine.hh"
}
_keys = _myanmar_syllable_machine_trans_keys + (cs<<1);
@@ -519,7 +519,7 @@ _eof_trans:
#line 113 "hb-ot-shaper-myanmar-machine.rl"
{te = p;p--;{ found_syllable (myanmar_non_myanmar_cluster); }}
break;
-#line 498 "hb-ot-shaper-myanmar-machine.hh"
+#line 523 "hb-ot-shaper-myanmar-machine.hh"
}
_again:
@@ -528,7 +528,7 @@ _again:
#line 1 "NONE"
{ts = 0;}
break;
-#line 505 "hb-ot-shaper-myanmar-machine.hh"
+#line 532 "hb-ot-shaper-myanmar-machine.hh"
}
if ( ++p != pe )
diff --git a/src/hb-ot-shaper-myanmar-machine.rl b/src/hb-ot-shaper-myanmar-machine.rl
index db6a44c60..2cb6e4e77 100644
--- a/src/hb-ot-shaper-myanmar-machine.rl
+++ b/src/hb-ot-shaper-myanmar-machine.rl
@@ -122,7 +122,7 @@ main := |*
for (unsigned int i = ts; i < te; i++) \
info[i].syllable() = (syllable_serial << 4) | syllable_type; \
syllable_serial++; \
- if (syllable_serial == 16) syllable_serial = 1; \
+ if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
} HB_STMT_END
inline void
diff --git a/src/hb-ot-shaper-myanmar.cc b/src/hb-ot-shaper-myanmar.cc
index 1b2a085a8..78bd8de52 100644
--- a/src/hb-ot-shaper-myanmar.cc
+++ b/src/hb-ot-shaper-myanmar.cc
@@ -98,11 +98,11 @@ is_consonant_myanmar (const hb_glyph_info_t &info)
}
-static bool
+static void
setup_syllables_myanmar (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
-static bool
+static void
reorder_myanmar (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
@@ -150,7 +150,7 @@ setup_masks_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED,
set_myanmar_properties (info[i]);
}
-static bool
+static void
setup_syllables_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED,
hb_font_t *font HB_UNUSED,
hb_buffer_t *buffer)
@@ -159,7 +159,6 @@ setup_syllables_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED,
find_syllables_myanmar (buffer);
foreach_syllable (buffer, start, end)
buffer->unsafe_to_break (start, end);
- return false;
}
static int
@@ -271,33 +270,6 @@ initial_reordering_consonant_syllable (hb_buffer_t *buffer,
/* Sit tight, rock 'n roll! */
buffer->sort (start, end, compare_myanmar_order);
-
- /* Flip left-matra sequence. */
- unsigned first_left_matra = end;
- unsigned last_left_matra = end;
- for (unsigned int i = start; i < end; i++)
- {
- if (info[i].myanmar_position() == POS_PRE_M)
- {
- if (first_left_matra == end)
- first_left_matra = i;
- last_left_matra = i;
- }
- }
- /* https://github.com/harfbuzz/harfbuzz/issues/3863 */
- if (first_left_matra < last_left_matra)
- {
- /* No need to merge clusters, done already? */
- buffer->reverse_range (first_left_matra, last_left_matra + 1);
- /* Reverse back VS, etc. */
- unsigned i = first_left_matra;
- for (unsigned j = i; j <= last_left_matra; j++)
- if (info[j].myanmar_category() == M_Cat(VPre))
- {
- buffer->reverse_range (i, j + 1);
- i = j + 1;
- }
- }
}
static void
@@ -319,18 +291,16 @@ reorder_syllable_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED,
}
}
-static bool
+static void
reorder_myanmar (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer)
{
- bool ret = false;
if (buffer->message (font, "start reordering myanmar"))
{
- if (hb_syllabic_insert_dotted_circles (font, buffer,
- myanmar_broken_cluster,
- M_Cat(DOTTEDCIRCLE)))
- ret = true;
+ hb_syllabic_insert_dotted_circles (font, buffer,
+ myanmar_broken_cluster,
+ M_Cat(DOTTEDCIRCLE));
foreach_syllable (buffer, start, end)
reorder_syllable_myanmar (plan, font->face, buffer, start, end);
@@ -339,8 +309,6 @@ reorder_myanmar (const hb_ot_shape_plan_t *plan,
HB_BUFFER_DEALLOCATE_VAR (buffer, myanmar_category);
HB_BUFFER_DEALLOCATE_VAR (buffer, myanmar_position);
-
- return ret;
}
@@ -363,7 +331,6 @@ const hb_ot_shaper_t _hb_ot_shaper_myanmar =
};
-#ifndef HB_NO_OT_SHAPER_MYANMAR_ZAWGYI
/* Ugly Zawgyi encoding.
* Disable all auto processing.
* https://github.com/harfbuzz/harfbuzz/issues/1162 */
@@ -384,7 +351,6 @@ const hb_ot_shaper_t _hb_ot_shaper_myanmar_zawgyi =
HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
false, /* fallback_position */
};
-#endif
#endif
diff --git a/src/hb-ot-shaper-syllabic.cc b/src/hb-ot-shaper-syllabic.cc
index 89226ae4a..a8e0d8e8c 100644
--- a/src/hb-ot-shaper-syllabic.cc
+++ b/src/hb-ot-shaper-syllabic.cc
@@ -29,7 +29,7 @@
#include "hb-ot-shaper-syllabic.hh"
-bool
+void
hb_syllabic_insert_dotted_circles (hb_font_t *font,
hb_buffer_t *buffer,
unsigned int broken_syllable_type,
@@ -38,13 +38,13 @@ hb_syllabic_insert_dotted_circles (hb_font_t *font,
int dottedcircle_position)
{
if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
- return false;
+ return;
if (likely (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE)))
- return false;
+ return;
hb_codepoint_t dottedcircle_glyph;
if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph))
- return false;
+ return;
hb_glyph_info_t dottedcircle = {0};
dottedcircle.codepoint = 0x25CCu;
@@ -84,16 +84,14 @@ hb_syllabic_insert_dotted_circles (hb_font_t *font,
(void) buffer->next_glyph ();
}
buffer->sync ();
- return true;
}
-HB_INTERNAL bool
+HB_INTERNAL void
hb_syllabic_clear_var (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer)
{
HB_BUFFER_DEALLOCATE_VAR (buffer, syllable);
- return false;
}
diff --git a/src/hb-ot-shaper-syllabic.hh b/src/hb-ot-shaper-syllabic.hh
index f240ad1c2..e8a15bb48 100644
--- a/src/hb-ot-shaper-syllabic.hh
+++ b/src/hb-ot-shaper-syllabic.hh
@@ -30,7 +30,7 @@
#include "hb-ot-shaper.hh"
-HB_INTERNAL bool
+HB_INTERNAL void
hb_syllabic_insert_dotted_circles (hb_font_t *font,
hb_buffer_t *buffer,
unsigned int broken_syllable_type,
@@ -38,7 +38,7 @@ hb_syllabic_insert_dotted_circles (hb_font_t *font,
int repha_category = -1,
int dottedcircle_position = -1);
-HB_INTERNAL bool
+HB_INTERNAL void
hb_syllabic_clear_var (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
diff --git a/src/hb-ot-shaper-thai.cc b/src/hb-ot-shaper-thai.cc
index 6cd67cde3..15349b1e6 100644
--- a/src/hb-ot-shaper-thai.cc
+++ b/src/hb-ot-shaper-thai.cc
@@ -98,9 +98,9 @@ static hb_codepoint_t
thai_pua_shape (hb_codepoint_t u, thai_action_t action, hb_font_t *font)
{
struct thai_pua_mapping_t {
- uint16_t u;
- uint16_t win_pua;
- uint16_t mac_pua;
+ hb_codepoint_t u;
+ hb_codepoint_t win_pua;
+ hb_codepoint_t mac_pua;
} const *pua_mappings = nullptr;
static const thai_pua_mapping_t SD_mappings[] = {
{0x0E48u, 0xF70Au, 0xF88Bu}, /* MAI EK */
diff --git a/src/hb-ot-shaper-use-machine.hh b/src/hb-ot-shaper-use-machine.hh
index f2fbdb725..41e8a34f3 100644
--- a/src/hb-ot-shaper-use-machine.hh
+++ b/src/hb-ot-shaper-use-machine.hh
@@ -53,7 +53,7 @@ enum use_syllable_type_t {
};
-#line 54 "hb-ot-shaper-use-machine.hh"
+#line 57 "hb-ot-shaper-use-machine.hh"
#define use_syllable_machine_ex_B 1u
#define use_syllable_machine_ex_CGJ 6u
#define use_syllable_machine_ex_CMAbv 31u
@@ -97,7 +97,7 @@ enum use_syllable_type_t {
#define use_syllable_machine_ex_ZWNJ 14u
-#line 96 "hb-ot-shaper-use-machine.hh"
+#line 101 "hb-ot-shaper-use-machine.hh"
static const unsigned char _use_syllable_machine_trans_keys[] = {
0u, 53u, 11u, 53u, 11u, 53u, 1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u,
14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u,
@@ -839,7 +839,7 @@ static const int use_syllable_machine_en_main = 0;
for (unsigned i = (*ts).second.first; i < (*te).second.first; ++i) \
info[i].syllable() = (syllable_serial << 4) | syllable_type; \
syllable_serial++; \
- if (syllable_serial == 16) syllable_serial = 1; \
+ if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
} HB_STMT_END
@@ -929,7 +929,7 @@ find_syllables_use (hb_buffer_t *buffer)
unsigned int act HB_UNUSED;
int cs;
-#line 922 "hb-ot-shaper-use-machine.hh"
+#line 933 "hb-ot-shaper-use-machine.hh"
{
cs = use_syllable_machine_start;
ts = 0;
@@ -942,7 +942,7 @@ find_syllables_use (hb_buffer_t *buffer)
unsigned int syllable_serial = 1;
-#line 931 "hb-ot-shaper-use-machine.hh"
+#line 946 "hb-ot-shaper-use-machine.hh"
{
int _slen;
int _trans;
@@ -956,7 +956,7 @@ _resume:
#line 1 "NONE"
{ts = p;}
break;
-#line 943 "hb-ot-shaper-use-machine.hh"
+#line 960 "hb-ot-shaper-use-machine.hh"
}
_keys = _use_syllable_machine_trans_keys + (cs<<1);
@@ -1046,7 +1046,7 @@ _eof_trans:
#line 178 "hb-ot-shaper-use-machine.rl"
{te = p;p--;{ found_syllable (use_non_cluster); }}
break;
-#line 1014 "hb-ot-shaper-use-machine.hh"
+#line 1050 "hb-ot-shaper-use-machine.hh"
}
_again:
@@ -1055,7 +1055,7 @@ _again:
#line 1 "NONE"
{ts = 0;}
break;
-#line 1021 "hb-ot-shaper-use-machine.hh"
+#line 1059 "hb-ot-shaper-use-machine.hh"
}
if ( ++p != pe )
diff --git a/src/hb-ot-shaper-use-machine.rl b/src/hb-ot-shaper-use-machine.rl
index 8ace1f026..9f22057ea 100644
--- a/src/hb-ot-shaper-use-machine.rl
+++ b/src/hb-ot-shaper-use-machine.rl
@@ -187,7 +187,7 @@ main := |*
for (unsigned i = (*ts).second.first; i < (*te).second.first; ++i) \
info[i].syllable() = (syllable_serial << 4) | syllable_type; \
syllable_serial++; \
- if (syllable_serial == 16) syllable_serial = 1; \
+ if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
} HB_STMT_END
diff --git a/src/hb-ot-shaper-use-table.hh b/src/hb-ot-shaper-use-table.hh
index 6b6b552ee..9833fb55d 100644
--- a/src/hb-ot-shaper-use-table.hh
+++ b/src/hb-ot-shaper-use-table.hh
@@ -91,9 +91,6 @@
#define VMPre USE(VMPre)
#pragma GCC diagnostic pop
-
-#ifndef HB_OPTIMIZE_SIZE
-
static const uint8_t
hb_use_u8[3141] =
{
@@ -360,273 +357,6 @@ hb_use_get_category (unsigned u)
return u<921600u?hb_use_u8[2777+(((hb_use_u8[593+(((hb_use_u16[((hb_use_u8[113+(((hb_use_b4(hb_use_u8,u>>1>>3>>3>>5))<<5)+((u>>1>>3>>3)&31u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:O;
}
-
-#else
-
-static const uint8_t
-hb_use_u8[3413] =
-{
- 16, 50, 51, 51, 51, 52, 51, 83, 118, 131, 51, 57, 58, 179, 195, 61,
- 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
- 14, 0, 1, 1, 2, 1, 1, 3, 4, 5, 6, 7, 8, 9, 10, 1,
- 11, 12, 1, 1, 1, 1, 1, 1, 13, 14, 15, 16, 17, 18, 19, 1,
- 1, 20, 1, 1, 1, 1, 21, 1, 1, 1, 1, 1, 1, 1, 22, 1,
- 1, 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, 24, 25, 26, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27,
- 28, 1, 1, 1, 1, 1, 29, 1, 1, 1, 1, 30, 31, 1, 32, 33,
- 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 1, 46, 47, 48,
- 49, 50, 50, 50, 50, 51, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 52, 53, 1, 1, 1,
- 54, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 50, 55, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 56, 1, 1,
- 1, 1, 57, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 58, 59, 1, 60, 1, 1, 1, 1, 61, 1, 1, 1, 1, 1,
- 1, 62, 63, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
- 62, 0, 1, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 8, 0, 0, 0, 0,
- 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
- 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
- 40, 41, 42, 43, 36, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
- 0, 55, 56, 57, 58, 59, 0, 0, 0, 60, 61, 62, 63, 55, 64, 65,
- 66, 67, 55, 55, 68, 69, 70, 0, 0, 71, 72, 73, 74, 55, 75, 76,
- 0, 77, 55, 78, 79, 80, 0, 0, 0, 81, 82, 83, 84, 85, 86, 55,
- 87, 55, 88, 89, 0, 0, 0, 90, 91, 0, 0, 0, 0, 0, 0, 0,
- 92, 93, 94, 0, 95, 96, 0, 0, 97, 0, 0, 0, 0, 0, 0, 98,
- 0, 0, 99, 55, 100, 0, 0, 0, 0, 101, 102, 55, 103, 104, 105, 106,
- 107, 55, 108, 109, 0, 110, 111, 112, 113, 55, 114, 115, 116, 55, 117, 118,
- 119, 0, 0, 0, 0, 0, 0, 55, 120, 121, 0, 0, 0, 0, 0, 0,
- 122, 0, 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, 124, 125, 126, 0,
- 0, 127, 128, 129, 0, 0, 0, 50, 130, 0, 0, 0, 0, 131, 132, 0,
- 0, 55, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 134, 0,
- 0, 0, 99, 135, 99, 136, 137, 138, 0, 139, 140, 141, 142, 143, 144, 145,
- 0, 146, 147, 148, 149, 143, 150, 151, 152, 153, 154, 155, 0, 156, 157, 158,
- 159, 160, 161, 162, 163, 0, 0, 0, 0, 55, 164, 165, 166, 167, 168, 169,
- 0, 0, 0, 0, 0, 55, 170, 171, 0, 55, 172, 173, 0, 55, 174, 66,
- 0, 175, 176, 177, 0, 0, 0, 0, 0, 55, 178, 0, 0, 0, 0, 0,
- 0, 179, 180, 181, 0, 0, 182, 183, 184, 185, 186, 187, 55, 188, 0, 0,
- 0, 189, 190, 191, 192, 193, 194, 0, 0, 195, 196, 197, 198, 199, 66, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 200, 201, 202, 203, 0, 0, 0, 0,
- 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 204, 205, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 66, 0, 55, 206, 0, 0, 0, 0, 0,
- 0, 55, 55, 207, 208, 209, 0, 0, 210, 55, 55, 55, 55, 55, 55, 211,
- 0, 55, 55, 55, 212, 213, 0, 0, 0, 0, 0, 0, 214, 0, 0, 0,
- 0, 55, 215, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 217, 55,
- 218, 0, 0, 0, 0, 0, 0, 99, 219, 55, 55, 220, 0, 0, 0, 0,
- 0, 221, 221, 221, 221, 221, 221, 221, 221, 222, 222, 222, 222, 222, 222, 222,
- 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 2, 2, 2, 2, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4,
- 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 8, 9, 9, 9, 9, 0, 0, 0, 7, 10,
- 0, 2, 2, 2, 2, 11, 12, 0, 0, 9, 13, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 14, 15, 16, 17, 18, 19, 20, 14, 21, 22,
- 23, 10, 24, 25, 18, 2, 2, 2, 2, 2, 18, 0, 2, 2, 2, 2,
- 2, 0, 2, 2, 2, 2, 2, 2, 2, 26, 27, 28, 2, 2, 2, 7,
- 28, 7, 28, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 2, 2,
- 2, 7, 7, 0, 2, 2, 0, 15, 16, 17, 18, 29, 30, 31, 30, 32,
- 0, 0, 0, 0, 33, 0, 0, 2, 28, 2, 0, 0, 0, 0, 0, 7,
- 34, 10, 13, 28, 2, 2, 7, 0, 28, 7, 2, 28, 7, 2, 0, 35,
- 16, 17, 29, 0, 25, 36, 25, 37, 0, 38, 0, 0, 0, 28, 2, 7,
- 7, 0, 0, 0, 2, 2, 2, 2, 2, 39, 40, 41, 0, 0, 0, 0,
- 0, 10, 13, 28, 2, 2, 2, 2, 28, 2, 28, 2, 2, 2, 2, 2,
- 2, 7, 2, 28, 2, 2, 0, 15, 16, 17, 18, 19, 25, 20, 33, 22,
- 0, 0, 0, 0, 0, 28, 39, 39, 42, 10, 27, 28, 2, 2, 2, 7,
- 28, 7, 2, 28, 2, 2, 0, 15, 43, 0, 0, 25, 20, 0, 0, 2,
- 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 44, 28, 2, 2, 7, 0,
- 2, 7, 2, 2, 0, 28, 7, 7, 2, 0, 28, 7, 0, 2, 7, 0,
- 2, 2, 2, 2, 2, 2, 0, 0, 21, 14, 45, 0, 46, 31, 46, 32,
- 0, 0, 0, 0, 33, 0, 0, 0, 0, 13, 27, 47, 2, 2, 2, 7,
- 2, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 15,
- 20, 14, 21, 45, 20, 36, 20, 37, 0, 0, 0, 25, 29, 2, 7, 0,
- 0, 8, 27, 28, 2, 2, 2, 7, 2, 2, 2, 28, 2, 2, 0, 15,
- 43, 0, 0, 33, 45, 0, 0, 0, 7, 48, 49, 0, 0, 0, 0, 0,
- 0, 9, 27, 2, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 50, 51,
- 21, 21, 17, 29, 46, 31, 46, 32, 52, 0, 0, 0, 33, 0, 0, 0,
- 28, 10, 27, 28, 2, 2, 2, 2, 2, 2, 2, 2, 7, 0, 2, 2,
- 2, 2, 28, 2, 2, 2, 2, 28, 0, 2, 2, 2, 7, 0, 53, 0,
- 33, 21, 20, 29, 29, 16, 46, 46, 23, 0, 21, 0, 0, 0, 0, 0,
- 0, 2, 0, 2, 7, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0,
- 0, 2, 2, 54, 54, 55, 0, 0, 16, 2, 2, 2, 2, 28, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 7, 0, 56, 19, 57, 20, 20, 18, 18,
- 44, 19, 9, 29, 9, 2, 2, 58, 59, 59, 59, 59, 59, 60, 59, 59,
- 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 61,
- 0, 0, 0, 0, 62, 0, 0, 0, 0, 2, 2, 2, 2, 2, 63, 43,
- 57, 64, 20, 20, 65, 66, 67, 68, 69, 2, 2, 2, 2, 2, 1, 0,
- 3, 2, 2, 2, 21, 18, 2, 2, 70, 69, 71, 72, 63, 71, 27, 27,
- 2, 50, 20, 51, 2, 2, 2, 2, 2, 2, 73, 74, 75, 27, 27, 76,
- 77, 2, 2, 2, 2, 2, 27, 43, 0, 2, 57, 78, 0, 0, 0, 0,
- 28, 2, 57, 45, 0, 0, 0, 0, 0, 2, 57, 0, 0, 0, 0, 0,
- 0, 2, 2, 2, 2, 2, 2, 7, 2, 7, 57, 0, 0, 0, 0, 0,
- 0, 2, 2, 79, 43, 20, 57, 18, 46, 46, 46, 46, 13, 80, 81, 82,
- 83, 84, 85, 0, 0, 0, 0, 86, 0, 7, 0, 0, 28, 0, 87, 79,
- 88, 2, 2, 2, 2, 7, 0, 0, 0, 40, 40, 89, 90, 2, 2, 2,
- 2, 2, 2, 2, 2, 11, 7, 0, 0, 91, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 7, 20, 78, 43, 20, 92, 59, 0,
- 0, 93, 94, 93, 93, 95, 96, 0, 0, 2, 2, 2, 2, 2, 2, 2,
- 0, 2, 2, 7, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0,
- 0, 2, 2, 2, 2, 27, 0, 0, 0, 2, 2, 2, 2, 2, 7, 0,
- 0, 2, 2, 2, 50, 97, 43, 0, 0, 2, 2, 98, 99, 100, 101, 59,
- 61, 102, 14, 43, 20, 57, 19, 78, 46, 46, 74, 9, 9, 9, 103, 44,
- 38, 9, 104, 72, 2, 2, 2, 2, 2, 2, 2, 105, 20, 18, 18, 20,
- 46, 46, 20, 106, 2, 2, 2, 7, 0, 0, 0, 0, 0, 0, 107, 108,
- 109, 109, 109, 0, 0, 0, 0, 0, 0, 104, 72, 2, 2, 2, 2, 2,
- 2, 58, 59, 57, 23, 20, 110, 59, 2, 2, 2, 2, 105, 20, 21, 43,
- 43, 100, 12, 0, 0, 0, 0, 0, 0, 2, 2, 59, 16, 46, 21, 111,
- 100, 100, 100, 112, 113, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 28,
- 2, 9, 44, 114, 114, 114, 9, 114, 114, 13, 114, 114, 114, 24, 0, 38,
- 0, 0, 0, 115, 49, 9, 3, 0, 0, 0, 0, 0, 0, 0, 116, 0,
- 0, 0, 0, 0, 0, 0, 4, 117, 118, 40, 40, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 118, 118, 119, 118, 118, 118, 118, 118, 118, 118,
- 118, 0, 0, 120, 0, 0, 0, 0, 0, 0, 5, 120, 0, 0, 0, 0,
- 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,
- 0, 2, 2, 2, 2, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0,
- 121, 2, 51, 2, 106, 2, 8, 2, 2, 2, 63, 17, 14, 0, 0, 29,
- 0, 2, 2, 0, 0, 0, 0, 0, 0, 27, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 122, 21, 21, 21, 21, 21, 21, 21, 123, 0, 0, 0, 0,
- 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, 0,
- 50, 2, 2, 2, 20, 20, 124, 114, 0, 2, 2, 2, 125, 18, 57, 18,
- 111, 100, 126, 0, 0, 0, 0, 0, 0, 9, 127, 2, 2, 2, 2, 2,
- 2, 2, 128, 21, 20, 18, 46, 129, 130, 131, 0, 0, 0, 0, 0, 0,
- 0, 2, 2, 50, 28, 2, 2, 2, 2, 2, 2, 2, 2, 8, 20, 57,
- 97, 74, 132, 133, 134, 0, 0, 0, 0, 2, 135, 2, 2, 2, 2, 136,
- 0, 28, 2, 40, 3, 0, 77, 13, 2, 51, 20, 137, 50, 51, 2, 2,
- 103, 8, 7, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 138, 19,
- 23, 0, 0, 139, 140, 0, 0, 0, 0, 2, 63, 43, 21, 78, 45, 141,
- 0, 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, 0, 0, 0, 0, 0,
- 4, 118, 118, 118, 118, 119, 0, 0, 0, 2, 2, 2, 2, 2, 7, 2,
- 2, 2, 7, 2, 28, 2, 2, 2, 2, 2, 28, 2, 2, 2, 28, 7,
- 0, 125, 18, 25, 29, 0, 0, 142, 143, 2, 2, 28, 2, 28, 2, 2,
- 2, 2, 2, 2, 0, 12, 35, 0, 144, 2, 2, 11, 35, 0, 28, 2,
- 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 2, 2,
- 7, 2, 2, 9, 39, 0, 0, 0, 0, 2, 2, 2, 2, 2, 25, 36,
- 0, 2, 2, 2, 114, 114, 114, 114, 114, 145, 2, 7, 0, 0, 0, 0,
- 0, 2, 12, 12, 0, 0, 0, 0, 0, 7, 2, 2, 7, 2, 2, 2,
- 2, 28, 2, 7, 0, 28, 2, 0, 0, 146, 147, 148, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 20, 20, 18, 18, 18, 20, 20, 131, 0, 0, 0,
- 0, 0, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 2, 2, 2, 2,
- 2, 51, 50, 51, 0, 0, 0, 0, 150, 9, 72, 2, 2, 2, 2, 2,
- 2, 16, 17, 19, 14, 22, 35, 0, 0, 0, 29, 0, 0, 0, 0, 0,
- 0, 9, 47, 2, 2, 2, 2, 2, 2, 2, 2, 2, 125, 18, 20, 151,
- 20, 19, 152, 153, 2, 2, 2, 2, 2, 0, 0, 63, 154, 0, 0, 0,
- 0, 2, 11, 0, 0, 0, 0, 0, 0, 2, 63, 23, 18, 18, 18, 20,
- 20, 106, 155, 0, 0, 54, 156, 29, 157, 28, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 21, 17, 20, 20, 158, 42, 0, 0, 0,
- 47, 125, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 7, 7, 2, 2,
- 28, 2, 2, 2, 2, 2, 2, 2, 28, 2, 2, 2, 2, 2, 2, 2,
- 8, 16, 17, 19, 20, 159, 29, 0, 0, 9, 9, 28, 2, 2, 2, 7,
- 28, 7, 2, 28, 2, 2, 56, 15, 21, 14, 21, 45, 30, 31, 30, 32,
- 0, 0, 0, 0, 33, 0, 0, 0, 2, 2, 21, 0, 9, 9, 9, 44,
- 0, 9, 9, 44, 0, 0, 0, 0, 0, 2, 2, 63, 23, 18, 18, 18,
- 20, 21, 123, 13, 15, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0,
- 160, 161, 0, 0, 0, 0, 0, 0, 0, 16, 17, 18, 18, 64, 97, 23,
- 157, 9, 162, 7, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2,
- 63, 23, 18, 18, 0, 46, 46, 9, 163, 35, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 2, 2, 18, 0, 21, 17, 18, 18, 19, 14, 80,
- 163, 36, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 8, 164,
- 23, 18, 20, 20, 162, 7, 0, 0, 0, 2, 2, 2, 2, 2, 7, 41,
- 133, 21, 20, 18, 74, 19, 20, 0, 0, 2, 2, 2, 7, 0, 0, 0,
- 0, 2, 2, 2, 2, 2, 2, 16, 17, 18, 19, 20, 103, 163, 35, 0,
- 0, 2, 2, 2, 7, 28, 0, 2, 2, 2, 2, 28, 7, 2, 2, 2,
- 2, 21, 21, 16, 30, 31, 10, 165, 166, 167, 168, 0, 0, 0, 0, 0,
- 0, 2, 2, 2, 2, 0, 2, 2, 2, 63, 23, 18, 18, 0, 20, 21,
- 27, 106, 0, 31, 0, 0, 0, 0, 0, 50, 18, 20, 20, 20, 137, 2,
- 2, 2, 169, 170, 9, 13, 171, 70, 172, 0, 0, 1, 144, 0, 0, 0,
- 0, 50, 18, 20, 14, 17, 18, 2, 2, 2, 2, 155, 155, 155, 173, 173,
- 173, 173, 173, 173, 13, 174, 0, 28, 0, 20, 18, 18, 29, 20, 20, 9,
- 163, 0, 59, 59, 59, 59, 59, 59, 59, 64, 19, 80, 44, 0, 0, 0,
- 0, 2, 2, 2, 7, 2, 28, 2, 2, 50, 20, 20, 29, 0, 36, 20,
- 25, 9, 156, 175, 171, 0, 0, 0, 0, 2, 2, 2, 28, 7, 2, 2,
- 2, 2, 2, 2, 2, 2, 21, 21, 45, 20, 33, 80, 66, 0, 0, 0,
- 0, 2, 176, 64, 45, 0, 0, 0, 0, 9, 177, 2, 2, 2, 2, 2,
- 2, 2, 2, 21, 20, 18, 29, 0, 46, 14, 140, 0, 0, 0, 0, 0,
- 0, 178, 178, 178, 106, 179, 178, 0, 0, 145, 2, 2, 180, 114, 114, 114,
- 114, 114, 114, 114, 0, 0, 0, 0, 0, 9, 9, 9, 44, 0, 0, 0,
- 0, 2, 2, 2, 2, 2, 7, 0, 56, 181, 18, 18, 18, 18, 18, 18,
- 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0,
- 38, 114, 24, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0,
- 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 56,
- 35, 0, 4, 118, 118, 118, 119, 0, 0, 9, 9, 9, 47, 2, 2, 2,
- 0, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2,
- 44, 2, 2, 2, 2, 2, 2, 9, 9, 2, 2, 2, 2, 2, 2, 20,
- 20, 2, 2, 42, 42, 42, 90, 0, 0, O, O, O, GB, B, B, GB,
- O, O, WJ,FMPst,FMPst, O, CGJ, B, O, B,VMAbv,VMAbv,VMAbv, O,VMAbv, B,
- CMBlw,CMBlw,CMBlw,VMAbv,VMPst, VAbv, VPst,CMBlw, B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw,
- VAbv, VAbv, VAbv, VPst, VPst, VPst, H, VPre, VPst,VMBlw, O, O, VAbv, GB,VMAbv,VMPst,
- VMPst, O, B, VBlw, O, O, VPre, VPre, O, VPre, H, O, VPst,FMAbv, O,CMBlw,
- O, VAbv, O, VAbv, H, O,VMBlw,VMAbv,CMAbv, GB, GB, O, MBlw,CMAbv,CMAbv, VPst,
- VAbv,VMAbv, O, VPst, O, VPre, VPre,VMAbv, B, O, CS, CS,VMPst, B, VAbv, VAbv,
- B, R, O, HVM, O, O,FMBlw, O,CMAbv, O,CMBlw, VAbv, VBlw, B, SUB, SUB,
- SUB, O, SUB, SUB, O,FMBlw, O, B, VPst, VBlw, VPre,VMAbv,VMBlw,VMPst, IS, VAbv,
- MPst, MPre, MBlw, MBlw, B, MBlw, MBlw, VPst,VMPst,VMPst, B, MBlw, VPst, VPre, VAbv, VAbv,
- VMPst,VMPst,VMBlw, B,VMPst, VBlw, VPst, CGJ, CGJ, VPst,VMAbv,VMAbv,FMAbv, FAbv,CMAbv,FMAbv,
- VMAbv,FMAbv, VAbv, IS,FMAbv, B,FMAbv, B, CGJ, WJ, CGJ, GB,CMAbv,CMAbv, B, GB,
- B, VAbv, SUB, FPst, FPst,VMBlw, FPst, FPst, FBlw,VMAbv,FMBlw, VAbv, VPre, B, MPre, MBlw,
- SUB, FAbv, FAbv, MAbv, SUB, Sk, VPst, VAbv,VMAbv,VMAbv, FAbv,CMAbv, VPst, H, B, O,
- SMAbv,SMBlw,SMAbv,SMAbv,SMAbv, VPst, IS, VBlw, FAbv,VMPre,VMPre,FMAbv,CMBlw,VMBlw,VMBlw,VMAbv,
- CS, O,FMAbv, ZWNJ, CGJ, WJ, WJ, WJ, O,FMPst, O, O, H, MPst, VPst, H,
- VMAbv, VAbv,VMBlw, B, VBlw, FPst, VPst, FAbv,VMPst, B,CMAbv, VAbv, MBlw, MPst, MBlw, H,
- O, VBlw, MPst, MPre, MAbv, MBlw, O, B, FAbv, FAbv, FPst, VBlw, B, B, VPre, O,
- VMPst, IS, O,VMPst, VBlw, VPst,VMBlw,VMBlw,VMAbv, O, IS,VMBlw, B,VMPst,VMAbv,VMPst,
- CS, CS, B, N, N, O, HN, VPre, VBlw, VAbv, IS,CMAbv, O, VPst, B, R,
- R,CMBlw, VAbv, VPre,VMAbv,VMAbv, H, VAbv,CMBlw,FMAbv, B, CS, CS, H,CMBlw,VMPst,
- H,VMPst, VAbv,VMAbv, VPst, IS, R, MPst, R, MPst,CMBlw, B,FMBlw, VBlw,VMAbv, R,
- MBlw, MBlw, GB, FBlw, FBlw,CMAbv, IS, VBlw, IS, GB, VAbv, R,VMPst, H, H, B,
- H, B,VMBlw, O, VBlw,
-};
-static const uint16_t
-hb_use_u16[448] =
-{
- 0, 0, 1, 2, 3, 4, 0, 5, 6, 0, 7, 0, 8, 9, 10, 11,
- 9, 12, 13, 9, 9, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
- 17, 25, 26, 20, 21, 27, 28, 29, 30, 31, 32, 33, 21, 34, 35, 0,
- 17, 36, 37, 20, 21, 38, 23, 39, 17, 40, 41, 42, 43, 44, 45, 46,
- 30, 0, 47, 48, 21, 49, 50, 51, 17, 0, 52, 48, 21, 53, 50, 54,
- 17, 55, 56, 48, 9, 57, 58, 59, 60, 61, 9, 62, 63, 64, 30, 65,
- 66, 67, 9, 68, 69, 9, 70, 71, 72, 73, 74, 75, 76, 0, 9, 9,
- 77, 78, 79, 80, 81, 82, 83, 84, 9, 85, 9, 86, 9, 87, 88, 89,
- 9, 90, 91, 92, 2, 0, 93, 0, 9, 94, 95, 9, 96, 0, 97, 98,
- 99,100, 30, 9,101,102,103, 9,104,105, 9,106, 9,107,108,109,
- 2, 2,110, 9, 9,111,112, 2,113,114,115, 9,116, 9,117,118,
- 119,120,121, 0, 0,122,123,124, 0,125,126,127,128, 0,129,130,
- 131, 0, 0,132,133, 0, 0, 9,134,135,136, 9,137, 0, 9,138,
- 139, 9, 9,140,141, 2,142,143,144, 9,145,146,147, 9, 9,148,
- 149, 2,150, 98,151,152,153, 2, 9,154, 9,155,156, 0,157,158,
- 159, 2,160, 0, 0,161, 0,162, 0,163,163,164, 33,165,166,167,
- 9,168, 94, 0,169, 0, 9,170,171, 0,172, 2,173,170,174,175,
- 176, 0, 0,177,178, 0,179, 9, 9,180,181,182,183,184,185, 9,
- 9,186,187, 0,188, 9,189,190,191, 9, 9,192, 9,193,194,105,
- 195,102, 9, 33,196,197,198, 0,199,200, 94, 9, 9,201,202, 2,
- 203, 20, 21,204,205,206,207,208, 9,209,210,211,212, 0,195, 9,
- 9,213,214, 2,215,216,217,218, 9,219,220, 2,221,222, 9,223,
- 224,103,225, 0,226,227,228,229, 9,230,231, 2,232, 9, 9,233,
- 234, 0,235, 9, 9,236,237,238,239,240, 21, 9,215,241, 7, 9,
- 70, 18, 9,242, 73,243,244, 9, 9,245,246, 2,247, 9,248,249,
- 9,250,251, 48, 9,252,253, 2, 9,254,255,256, 9,257,258,259,
- 260,260,261,262,263, 0, 9,264,105, 70, 94,265, 0,266, 70,267,
- 268, 0,269, 0,270, 2,271, 2,272, 2,129,129,160,160,160,129,
-};
-
-static inline unsigned
-hb_use_b4 (const uint8_t* a, unsigned i)
-{
- return (a[i>>1]>>((i&1u)<<2))&15u;
-}
-static inline uint_fast8_t
-hb_use_get_category (unsigned u)
-{
- return u<921600u?hb_use_u8[3049+(((hb_use_u8[865+(((hb_use_u16[((hb_use_u8[353+(((hb_use_u8[113+(((hb_use_b4(hb_use_u8,u>>1>>3>>1>>3>>4))<<4)+((u>>1>>3>>1>>3)&15u))])<<3)+((u>>1>>3>>1)&7u))])<<1)+((u>>1>>3)&1u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:O;
-}
-
-#endif
-
#undef B
#undef CGJ
#undef CS
diff --git a/src/hb-ot-shaper-use.cc b/src/hb-ot-shaper-use.cc
index 342aba123..c40ec52f9 100644
--- a/src/hb-ot-shaper-use.cc
+++ b/src/hb-ot-shaper-use.cc
@@ -89,19 +89,19 @@ use_other_features[] =
HB_TAG('p','s','t','s'),
};
-static bool
+static void
setup_syllables_use (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
-static bool
+static void
record_rphf_use (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
-static bool
+static void
record_pref_use (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
-static bool
+static void
reorder_use (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
@@ -293,7 +293,7 @@ setup_topographical_masks (const hb_ot_shape_plan_t *plan,
}
}
-static bool
+static void
setup_syllables_use (const hb_ot_shape_plan_t *plan,
hb_font_t *font HB_UNUSED,
hb_buffer_t *buffer)
@@ -304,10 +304,9 @@ setup_syllables_use (const hb_ot_shape_plan_t *plan,
buffer->unsafe_to_break (start, end);
setup_rphf_mask (plan, buffer);
setup_topographical_masks (plan, buffer);
- return false;
}
-static bool
+static void
record_rphf_use (const hb_ot_shape_plan_t *plan,
hb_font_t *font HB_UNUSED,
hb_buffer_t *buffer)
@@ -315,7 +314,7 @@ record_rphf_use (const hb_ot_shape_plan_t *plan,
const use_shape_plan_t *use_plan = (const use_shape_plan_t *) plan->data;
hb_mask_t mask = use_plan->rphf_mask;
- if (!mask) return false;
+ if (!mask) return;
hb_glyph_info_t *info = buffer->info;
foreach_syllable (buffer, start, end)
@@ -328,10 +327,9 @@ record_rphf_use (const hb_ot_shape_plan_t *plan,
break;
}
}
- return false;
}
-static bool
+static void
record_pref_use (const hb_ot_shape_plan_t *plan HB_UNUSED,
hb_font_t *font HB_UNUSED,
hb_buffer_t *buffer)
@@ -348,7 +346,6 @@ record_pref_use (const hb_ot_shape_plan_t *plan HB_UNUSED,
break;
}
}
- return false;
}
static inline bool
@@ -441,19 +438,17 @@ reorder_syllable_use (hb_buffer_t *buffer, unsigned int start, unsigned int end)
}
}
-static bool
+static void
reorder_use (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer)
{
- bool ret = false;
if (buffer->message (font, "start reordering USE"))
{
- if (hb_syllabic_insert_dotted_circles (font, buffer,
- use_broken_cluster,
- USE(B),
- USE(R)))
- ret = true;
+ hb_syllabic_insert_dotted_circles (font, buffer,
+ use_broken_cluster,
+ USE(B),
+ USE(R));
foreach_syllable (buffer, start, end)
reorder_syllable_use (buffer, start, end);
@@ -462,8 +457,6 @@ reorder_use (const hb_ot_shape_plan_t *plan,
}
HB_BUFFER_DEALLOCATE_VAR (buffer, use_category);
-
- return ret;
}
diff --git a/src/hb-ot-shaper.hh b/src/hb-ot-shaper.hh
index 0207b2bbe..b2d1acb39 100644
--- a/src/hb-ot-shaper.hh
+++ b/src/hb-ot-shaper.hh
@@ -262,13 +262,11 @@ hb_ot_shaper_categorize (const hb_ot_shape_planner_t *planner)
return &_hb_ot_shaper_myanmar;
-#ifndef HB_NO_OT_SHAPER_MYANMAR_ZAWGYI
#define HB_SCRIPT_MYANMAR_ZAWGYI ((hb_script_t) HB_TAG ('Q','a','a','g'))
case HB_SCRIPT_MYANMAR_ZAWGYI:
/* https://github.com/harfbuzz/harfbuzz/issues/1162 */
return &_hb_ot_shaper_myanmar_zawgyi;
-#endif
/* Unicode-2.0 additions */
diff --git a/src/hb-ot-stat-table.hh b/src/hb-ot-stat-table.hh
index 59bb2dacc..af6d550c0 100644
--- a/src/hb-ot-stat-table.hh
+++ b/src/hb-ot-stat-table.hh
@@ -320,7 +320,7 @@ struct AxisValueFormat4
unsigned total_size = min_size + axisCount * AxisValueRecord::static_size;
auto *out = c->serializer->allocate_size<AxisValueFormat4> (total_size);
if (unlikely (!out)) return_trace (false);
- hb_memcpy (out, this, total_size);
+ memcpy (out, this, total_size);
return_trace (true);
}
diff --git a/src/hb-ot-tag.cc b/src/hb-ot-tag.cc
index f6ba3b0d4..1b18270cc 100644
--- a/src/hb-ot-tag.cc
+++ b/src/hb-ot-tag.cc
@@ -577,7 +577,7 @@ hb_ot_tags_to_script_and_language (hb_tag_t script_tag,
else
{
int shift;
- hb_memcpy (buf, lang_str, len);
+ memcpy (buf, lang_str, len);
if (lang_str[0] != 'x' || lang_str[1] != '-') {
buf[len++] = '-';
buf[len++] = 'x';
diff --git a/src/hb-ot-var-avar-table.hh b/src/hb-ot-var-avar-table.hh
index cc5c5c006..f60bc4a3c 100644
--- a/src/hb-ot-var-avar-table.hh
+++ b/src/hb-ot-var-avar-table.hh
@@ -143,7 +143,7 @@ struct avar
TRACE_SANITIZE (this);
if (!(version.sanitize (c) &&
(version.major == 1
-#ifndef HB_NO_AVAR2
+#ifndef HB_NO_VARIATIONS2
|| version.major == 2
#endif
) &&
@@ -159,7 +159,7 @@ struct avar
map = &StructAfter<SegmentMaps> (*map);
}
-#ifndef HB_NO_AVAR2
+#ifndef HB_NO_VARIATIONS2
if (version.major < 2)
return_trace (true);
@@ -182,7 +182,7 @@ struct avar
map = &StructAfter<SegmentMaps> (*map);
}
-#ifndef HB_NO_AVAR2
+#ifndef HB_NO_VARIATIONS2
if (version.major < 2)
return;
diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh
index 4997c2e2e..1d29e3e4f 100644
--- a/src/hb-ot-var-common.hh
+++ b/src/hb-ot-var-common.hh
@@ -47,7 +47,7 @@ struct DeltaSetIndexMapFormat01
HBUINT8 *p = c->allocate_size<HBUINT8> (total_size);
if (unlikely (!p)) return_trace (nullptr);
- hb_memcpy (p, this, HBUINT8::static_size * total_size);
+ memcpy (p, this, HBUINT8::static_size * total_size);
return_trace (out);
}
@@ -219,25 +219,6 @@ struct DeltaSetIndexMap
DEFINE_SIZE_UNION (1, format);
};
-
-struct VarStoreInstancer
-{
- VarStoreInstancer (const VariationStore &varStore,
- const DeltaSetIndexMap &varIdxMap,
- hb_array_t<int> coords) :
- varStore (varStore), varIdxMap (varIdxMap), coords (coords) {}
-
- operator bool () const { return bool (coords); }
-
- float operator() (uint32_t varIdx, unsigned short offset = 0) const
- { return varStore.get_delta (varIdxMap.map (VarIdx::add (varIdx, offset)), coords); }
-
- const VariationStore &varStore;
- const DeltaSetIndexMap &varIdxMap;
- hb_array_t<int> coords;
-};
-
-
} /* namespace OT */
diff --git a/src/hb-ot-var-fvar-table.hh b/src/hb-ot-var-fvar-table.hh
index c1d57a002..af2386287 100644
--- a/src/hb-ot-var-fvar-table.hh
+++ b/src/hb-ot-var-fvar-table.hh
@@ -59,7 +59,7 @@ struct InstanceRecord
const hb_hashmap_t<hb_tag_t, float> *axes_location = c->plan->user_axes_location;
for (unsigned i = 0 ; i < axis_count; i++)
{
- uint32_t *axis_tag;
+ unsigned *axis_tag;
// only keep instances whose coordinates == pinned axis location
if (!c->plan->axes_old_index_tag_map->has (i, &axis_tag)) continue;
@@ -337,13 +337,13 @@ struct fvar
{
const InstanceRecord *instance = get_instance (i);
- if (hb_any (+ hb_enumerate (instance->get_coordinates (axisCount))
- | hb_filter (pinned_axes, hb_first)
- | hb_map ([&] (const hb_pair_t<unsigned, const F16DOT16&>& _)
+ if (hb_any (+ hb_zip (instance->get_coordinates (axisCount), hb_range ((unsigned)axisCount))
+ | hb_filter (pinned_axes, hb_second)
+ | hb_map ([&] (const hb_pair_t<const F16DOT16&, unsigned>& _)
{
- hb_tag_t axis_tag = pinned_axes.get (_.first);
+ hb_tag_t axis_tag = pinned_axes.get (_.second);
float location = user_axes_location->get (axis_tag);
- if (fabs ((double)location - (double)_.second.to_float ()) > 0.001) return true;
+ if (fabs ((double)location - (double)_.first.to_float ()) > 0.001) return true;
return false;
})
))
diff --git a/src/hb-ot-var-gvar-table.hh b/src/hb-ot-var-gvar-table.hh
index e02063ca4..bf1039d1d 100644
--- a/src/hb-ot-var-gvar-table.hh
+++ b/src/hb-ot-var-gvar-table.hh
@@ -56,11 +56,12 @@ struct contour_point_vector_t : hb_vector_t<contour_point_t>
void extend (const hb_array_t<contour_point_t> &a)
{
unsigned int old_len = length;
- if (unlikely (!resize (old_len + a.length, false)))
+ if (unlikely (!resize (old_len + a.length)))
return;
auto arrayZ = this->arrayZ + old_len;
unsigned count = a.length;
- hb_memcpy (arrayZ, a.arrayZ, count * sizeof (arrayZ[0]));
+ for (unsigned int i = 0; i < count; i++)
+ arrayZ[i] = a.arrayZ[i];
}
void transform (const float (&matrix)[4])
@@ -230,8 +231,8 @@ struct GlyphVariationData
{
return (index < var_data->tupleVarCount.get_count ()) &&
var_data_bytes.check_range (current_tuple, TupleVariationHeader::min_size) &&
- var_data_bytes.check_range (current_tuple, hb_max (current_tuple->get_data_size (),
- current_tuple->get_size (axis_count)));
+ var_data_bytes.check_range (current_tuple, hb_max (current_tuple->get_data_size (), current_tuple->get_size (axis_count))) &&
+ current_tuple->get_size (axis_count);
}
bool move_to_next ()
@@ -280,42 +281,42 @@ struct GlyphVariationData
if (unlikely (p + 1 > end)) return false;
- unsigned count = *p++;
+ uint16_t count = *p++;
if (count & POINTS_ARE_WORDS)
{
if (unlikely (p + 1 > end)) return false;
count = ((count & POINT_RUN_COUNT_MASK) << 8) | *p++;
}
- if (unlikely (!points.resize (count, false))) return false;
+ if (unlikely (!points.resize (count))) return false;
- unsigned n = 0;
- unsigned i = 0;
+ unsigned int n = 0;
+ uint16_t i = 0;
while (i < count)
{
if (unlikely (p + 1 > end)) return false;
- unsigned control = *p++;
- unsigned run_count = (control & POINT_RUN_COUNT_MASK) + 1;
- if (unlikely (i + run_count > count)) return false;
- unsigned j;
+ uint16_t j;
+ uint8_t control = *p++;
+ uint16_t run_count = (control & POINT_RUN_COUNT_MASK) + 1;
if (control & POINTS_ARE_WORDS)
{
- if (unlikely (p + run_count * HBUINT16::static_size > end)) return false;
- for (j = 0; j < run_count; j++, i++)
+ for (j = 0; j < run_count && i < count; j++, i++)
{
+ if (unlikely (p + HBUINT16::static_size > end)) return false;
n += *(const HBUINT16 *)p;
- points.arrayZ[i] = n;
+ points[i] = n;
p += HBUINT16::static_size;
}
}
else
{
- if (unlikely (p + run_count > end)) return false;
- for (j = 0; j < run_count; j++, i++)
+ for (j = 0; j < run_count && i < count; j++, i++)
{
+ if (unlikely (p + 1 > end)) return false;
n += *p++;
- points.arrayZ[i] = n;
+ points[i] = n;
}
}
+ if (j < run_count) return false;
}
return true;
}
@@ -331,37 +332,32 @@ struct GlyphVariationData
DELTA_RUN_COUNT_MASK = 0x3F
};
- unsigned i = 0;
- unsigned count = deltas.length;
+ unsigned int i = 0;
+ unsigned int count = deltas.length;
while (i < count)
{
if (unlikely (p + 1 > end)) return false;
- unsigned control = *p++;
- unsigned run_count = (control & DELTA_RUN_COUNT_MASK) + 1;
- if (unlikely (i + run_count > count)) return false;
- unsigned j;
+ uint8_t control = *p++;
+ unsigned int run_count = (control & DELTA_RUN_COUNT_MASK) + 1;
+ unsigned int j;
if (control & DELTAS_ARE_ZERO)
- {
- for (j = 0; j < run_count; j++, i++)
- deltas.arrayZ[i] = 0;
- }
+ for (j = 0; j < run_count && i < count; j++, i++)
+ deltas[i] = 0;
else if (control & DELTAS_ARE_WORDS)
- {
- if (unlikely (p + run_count * HBUINT16::static_size > end)) return false;
- for (j = 0; j < run_count; j++, i++)
+ for (j = 0; j < run_count && i < count; j++, i++)
{
- deltas.arrayZ[i] = * (const HBINT16 *) p;
+ if (unlikely (p + HBUINT16::static_size > end)) return false;
+ deltas[i] = *(const HBINT16 *) p;
p += HBUINT16::static_size;
}
- }
else
- {
- if (unlikely (p + run_count > end)) return false;
- for (j = 0; j < run_count; j++, i++)
+ for (j = 0; j < run_count && i < count; j++, i++)
{
- deltas.arrayZ[i] = * (const HBINT8 *) p++;
+ if (unlikely (p + 1 > end)) return false;
+ deltas[i] = *(const HBINT8 *) p++;
}
- }
+ if (j < run_count)
+ return false;
}
return true;
}
@@ -454,7 +450,7 @@ struct gvar
F2DOT14 *tuples = c->serializer->allocate_size<F2DOT14> (shared_tuple_size);
if (!tuples) return_trace (false);
out->sharedTuples = (char *) tuples - (char *) out;
- hb_memcpy (tuples, this+sharedTuples, shared_tuple_size);
+ memcpy (tuples, this+sharedTuples, shared_tuple_size);
}
char *subset_data = c->serializer->allocate_size<char> (subset_data_size);
@@ -477,7 +473,7 @@ struct gvar
((HBUINT16 *) subset_offsets)[gid] = glyph_offset / 2;
if (var_data_bytes.length > 0)
- hb_memcpy (subset_data, var_data_bytes.arrayZ, var_data_bytes.length);
+ memcpy (subset_data, var_data_bytes.arrayZ, var_data_bytes.length);
subset_data += var_data_bytes.length;
glyph_offset += var_data_bytes.length;
}
@@ -505,7 +501,6 @@ struct gvar
unsigned get_offset (unsigned i) const
{
if (unlikely (i > glyphCount)) return 0;
- _hb_compiler_memory_r_barrier ();
return is_long_offset () ? get_long_offset_array ()[i] : get_short_offset_array ()[i] * 2;
}
@@ -526,11 +521,11 @@ struct gvar
unsigned int target, unsigned int prev, unsigned int next,
float contour_point_t::*m)
{
- float target_val = points.arrayZ[target].*m;
- float prev_val = points.arrayZ[prev].*m;
- float next_val = points.arrayZ[next].*m;
- float prev_delta = deltas.arrayZ[prev].*m;
- float next_delta = deltas.arrayZ[next].*m;
+ float target_val = points[target].*m;
+ float prev_val = points[prev].*m;
+ float next_val = points[next].*m;
+ float prev_delta = deltas[prev].*m;
+ float next_delta = deltas[next].*m;
if (prev_val == next_val)
return (prev_delta == next_delta) ? prev_delta : 0.f;
@@ -548,11 +543,10 @@ struct gvar
{ return (i >= end) ? start : (i + 1); }
public:
- bool apply_deltas_to_points (hb_codepoint_t glyph,
- hb_array_t<int> coords,
+ bool apply_deltas_to_points (hb_codepoint_t glyph, hb_font_t *font,
const hb_array_t<contour_point_t> points) const
{
- if (!coords) return true;
+ if (!font->num_coords) return true;
if (unlikely (glyph >= table->glyphCount)) return true;
@@ -565,20 +559,20 @@ struct gvar
return true; /* so isn't applied at all */
/* Save original points for inferred delta calculation */
- contour_point_vector_t orig_points_vec;
- orig_points_vec.extend (points);
- if (unlikely (orig_points_vec.in_error ())) return false;
- auto orig_points = orig_points_vec.as_array ();
+ contour_point_vector_t orig_points;
+ if (unlikely (!orig_points.resize (points.length))) return false;
+ for (unsigned int i = 0; i < orig_points.length; i++)
+ orig_points.arrayZ[i] = points.arrayZ[i];
- contour_point_vector_t deltas_vec; /* flag is used to indicate referenced point */
- if (unlikely (!deltas_vec.resize (points.length, false))) return false;
- auto deltas = deltas_vec.as_array ();
+ contour_point_vector_t deltas; /* flag is used to indicate referenced point */
+ if (unlikely (!deltas.resize (points.length))) return false;
hb_vector_t<unsigned> end_points;
for (unsigned i = 0; i < points.length; ++i)
- if (points.arrayZ[i].is_end_point)
+ if (points[i].is_end_point)
end_points.push (i);
+ auto coords = hb_array (font->coords, font->num_coords);
unsigned num_coords = table->axisCount;
hb_array_t<const F2DOT14> shared_tuples = (table+table->sharedTuples).as_array (table->sharedTupleCount * table->axisCount);
@@ -604,89 +598,70 @@ struct gvar
bool apply_to_all = (indices.length == 0);
unsigned int num_deltas = apply_to_all ? points.length : indices.length;
- if (unlikely (!x_deltas.resize (num_deltas, false))) return false;
+ if (unlikely (!x_deltas.resize (num_deltas))) return false;
if (unlikely (!GlyphVariationData::unpack_deltas (p, x_deltas, end))) return false;
- if (unlikely (!y_deltas.resize (num_deltas, false))) return false;
+ if (unlikely (!y_deltas.resize (num_deltas))) return false;
if (unlikely (!GlyphVariationData::unpack_deltas (p, y_deltas, end))) return false;
- hb_memset (deltas.arrayZ, 0, deltas.get_size ());
-
- unsigned ref_points = 0;
- if (scalar != 1.0f)
- for (unsigned int i = 0; i < num_deltas; i++)
- {
- unsigned int pt_index = apply_to_all ? i : indices[i];
- if (unlikely (pt_index >= deltas.length)) continue;
- auto &delta = deltas.arrayZ[pt_index];
- ref_points += !delta.flag;
- delta.flag = 1; /* this point is referenced, i.e., explicit deltas specified */
- delta.x += x_deltas.arrayZ[i] * scalar;
- delta.y += y_deltas.arrayZ[i] * scalar;
- }
- else
- for (unsigned int i = 0; i < num_deltas; i++)
- {
- unsigned int pt_index = apply_to_all ? i : indices[i];
- if (unlikely (pt_index >= deltas.length)) continue;
- auto &delta = deltas.arrayZ[pt_index];
- ref_points += !delta.flag;
- delta.flag = 1; /* this point is referenced, i.e., explicit deltas specified */
- delta.x += x_deltas.arrayZ[i];
- delta.y += y_deltas.arrayZ[i];
- }
+ for (unsigned int i = 0; i < deltas.length; i++)
+ deltas[i].init ();
+ for (unsigned int i = 0; i < num_deltas; i++)
+ {
+ unsigned int pt_index = apply_to_all ? i : indices[i];
+ if (unlikely (pt_index >= deltas.length)) continue;
+ deltas.arrayZ[pt_index].flag = 1; /* this point is referenced, i.e., explicit deltas specified */
+ deltas.arrayZ[pt_index].x += x_deltas.arrayZ[i] * scalar;
+ deltas.arrayZ[pt_index].y += y_deltas.arrayZ[i] * scalar;
+ }
/* infer deltas for unreferenced points */
- if (ref_points && ref_points < orig_points.length)
+ unsigned start_point = 0;
+ for (unsigned c = 0; c < end_points.length; c++)
{
- unsigned start_point = 0;
- for (unsigned c = 0; c < end_points.length; c++)
- {
- unsigned end_point = end_points.arrayZ[c];
+ unsigned end_point = end_points[c];
- /* Check the number of unreferenced points in a contour. If no unref points or no ref points, nothing to do. */
- unsigned unref_count = 0;
- for (unsigned i = start_point; i < end_point + 1; i++)
- unref_count += deltas.arrayZ[i].flag;
- unref_count = (end_point - start_point + 1) - unref_count;
+ /* Check the number of unreferenced points in a contour. If no unref points or no ref points, nothing to do. */
+ unsigned unref_count = 0;
+ for (unsigned i = start_point; i <= end_point; i++)
+ if (!deltas[i].flag) unref_count++;
- unsigned j = start_point;
- if (unref_count == 0 || unref_count > end_point - start_point)
- goto no_more_gaps;
+ unsigned j = start_point;
+ if (unref_count == 0 || unref_count > end_point - start_point)
+ goto no_more_gaps;
+ for (;;)
+ {
+ /* Locate the next gap of unreferenced points between two referenced points prev and next.
+ * Note that a gap may wrap around at left (start_point) and/or at right (end_point).
+ */
+ unsigned int prev, next, i;
+ for (;;)
+ {
+ i = j;
+ j = next_index (i, start_point, end_point);
+ if (deltas[i].flag && !deltas[j].flag) break;
+ }
+ prev = j = i;
+ for (;;)
+ {
+ i = j;
+ j = next_index (i, start_point, end_point);
+ if (!deltas[i].flag && deltas[j].flag) break;
+ }
+ next = j;
+ /* Infer deltas for all unref points in the gap between prev and next */
+ i = prev;
for (;;)
{
- /* Locate the next gap of unreferenced points between two referenced points prev and next.
- * Note that a gap may wrap around at left (start_point) and/or at right (end_point).
- */
- unsigned int prev, next, i;
- for (;;)
- {
- i = j;
- j = next_index (i, start_point, end_point);
- if (deltas.arrayZ[i].flag && !deltas.arrayZ[j].flag) break;
- }
- prev = j = i;
- for (;;)
- {
- i = j;
- j = next_index (i, start_point, end_point);
- if (!deltas.arrayZ[i].flag && deltas.arrayZ[j].flag) break;
- }
- next = j;
- /* Infer deltas for all unref points in the gap between prev and next */
- i = prev;
- for (;;)
- {
- i = next_index (i, start_point, end_point);
- if (i == next) break;
- deltas.arrayZ[i].x = infer_delta (orig_points, deltas, i, prev, next, &contour_point_t::x);
- deltas.arrayZ[i].y = infer_delta (orig_points, deltas, i, prev, next, &contour_point_t::y);
- if (--unref_count == 0) goto no_more_gaps;
- }
+ i = next_index (i, start_point, end_point);
+ if (i == next) break;
+ deltas[i].x = infer_delta (orig_points.as_array (), deltas.as_array (), i, prev, next, &contour_point_t::x);
+ deltas[i].y = infer_delta (orig_points.as_array (), deltas.as_array (), i, prev, next, &contour_point_t::y);
+ if (--unref_count == 0) goto no_more_gaps;
}
- no_more_gaps:
- start_point = end_point + 1;
}
+ no_more_gaps:
+ start_point = end_point + 1;
}
/* apply specified / inferred deltas to points */
diff --git a/src/hb-pool.hh b/src/hb-pool.hh
index e4bb64f62..dcf8f6627 100644
--- a/src/hb-pool.hh
+++ b/src/hb-pool.hh
@@ -35,13 +35,15 @@ template <typename T, unsigned ChunkLen = 16>
struct hb_pool_t
{
hb_pool_t () : next (nullptr) {}
- ~hb_pool_t ()
+ ~hb_pool_t () { fini (); }
+
+ void fini ()
{
next = nullptr;
- + hb_iter (chunks)
- | hb_apply (hb_free)
- ;
+ for (chunk_t *_ : chunks) hb_free (_);
+
+ chunks.fini ();
}
T* alloc ()
@@ -58,7 +60,7 @@ struct hb_pool_t
T* obj = next;
next = * ((T**) next);
- hb_memset (obj, 0, sizeof (T));
+ memset (obj, 0, sizeof (T));
return obj;
}
diff --git a/src/hb-priority-queue.hh b/src/hb-priority-queue.hh
index ac76b7d95..ffb86e30a 100644
--- a/src/hb-priority-queue.hh
+++ b/src/hb-priority-queue.hh
@@ -63,9 +63,7 @@ struct hb_priority_queue_t
heap.arrayZ[0] = heap.arrayZ[heap.length - 1];
heap.shrink (heap.length - 1);
-
- if (!is_empty ())
- bubble_down (0);
+ bubble_down (0);
return result;
}
@@ -102,7 +100,7 @@ struct hb_priority_queue_t
void bubble_down (unsigned index)
{
- assert (index < heap.length);
+ assert (index <= heap.length);
unsigned left = left_child (index);
unsigned right = right_child (index);
@@ -114,7 +112,7 @@ struct hb_priority_queue_t
bool has_right = right < heap.length;
if (heap.arrayZ[index].first <= heap.arrayZ[left].first
- && (!has_right || heap.arrayZ[index].first <= heap.arrayZ[right].first))
+ && (!has_right || heap[index].first <= heap.arrayZ[right].first))
return;
if (!has_right || heap.arrayZ[left].first < heap.arrayZ[right].first)
@@ -130,7 +128,7 @@ struct hb_priority_queue_t
void bubble_up (unsigned index)
{
- assert (index < heap.length);
+ assert (index <= heap.length);
if (index == 0) return;
@@ -144,8 +142,8 @@ struct hb_priority_queue_t
void swap (unsigned a, unsigned b)
{
- assert (a < heap.length);
- assert (b < heap.length);
+ assert (a <= heap.length);
+ assert (b <= heap.length);
hb_swap (heap.arrayZ[a], heap.arrayZ[b]);
}
};
diff --git a/src/hb-repacker.hh b/src/hb-repacker.hh
index 7a3143cec..c97ce6cc2 100644
--- a/src/hb-repacker.hh
+++ b/src/hb-repacker.hh
@@ -209,7 +209,7 @@ bool _try_isolating_subgraphs (const hb_vector_t<graph::overflow_record_t>& over
// Only move at most half of the roots in a space at a time.
unsigned extra = roots_to_isolate.get_population () - maximum_to_move;
while (extra--) {
- uint32_t root = HB_SET_VALUE_INVALID;
+ unsigned root = HB_SET_VALUE_INVALID;
roots_to_isolate.previous (&root);
roots_to_isolate.del (root);
}
@@ -283,11 +283,6 @@ hb_resolve_graph_overflows (hb_tag_t table_tag,
graph_t& sorted_graph /* IN/OUT */)
{
sorted_graph.sort_shortest_distance ();
- if (sorted_graph.in_error ())
- {
- DEBUG_MSG (SUBSET_REPACK, nullptr, "Sorted graph in error state after initial sort.");
- return false;
- }
bool will_overflow = graph::will_overflow (sorted_graph);
if (!will_overflow)
@@ -381,26 +376,6 @@ hb_resolve_overflows (const T& packed,
unsigned max_rounds = 20,
bool recalculate_extensions = false) {
graph_t sorted_graph (packed);
- if (sorted_graph.in_error ())
- {
- // Invalid graph definition.
- return nullptr;
- }
-
- if (!sorted_graph.is_fully_connected ())
- {
- sorted_graph.print_orphaned_nodes ();
- return nullptr;
- }
-
- if (sorted_graph.in_error ())
- {
- // Allocations failed somewhere
- DEBUG_MSG (SUBSET_REPACK, nullptr,
- "Graph is in error, likely due to a memory allocation error.");
- return nullptr;
- }
-
if (!hb_resolve_graph_overflows (table_tag, max_rounds, recalculate_extensions, sorted_graph))
return nullptr;
diff --git a/src/hb-sanitize.hh b/src/hb-sanitize.hh
index bd3250e58..65c277220 100644
--- a/src/hb-sanitize.hh
+++ b/src/hb-sanitize.hh
@@ -198,11 +198,10 @@ struct hb_sanitize_context_t :
void start_processing ()
{
reset_object ();
- unsigned m;
- if (unlikely (hb_unsigned_mul_overflows (this->end - this->start, HB_SANITIZE_MAX_OPS_FACTOR, &m)))
+ if (unlikely (hb_unsigned_mul_overflows (this->end - this->start, HB_SANITIZE_MAX_OPS_FACTOR)))
this->max_ops = HB_SANITIZE_MAX_OPS_MAX;
else
- this->max_ops = hb_clamp (m,
+ this->max_ops = hb_clamp ((unsigned) (this->end - this->start) * HB_SANITIZE_MAX_OPS_FACTOR,
(unsigned) HB_SANITIZE_MAX_OPS_MIN,
(unsigned) HB_SANITIZE_MAX_OPS_MAX);
this->edit_count = 0;
@@ -253,9 +252,8 @@ struct hb_sanitize_context_t :
unsigned int a,
unsigned int b) const
{
- unsigned m;
- return !hb_unsigned_mul_overflows (a, b, &m) &&
- this->check_range (base, m);
+ return !hb_unsigned_mul_overflows (a, b) &&
+ this->check_range (base, a * b);
}
template <typename T>
@@ -264,9 +262,8 @@ struct hb_sanitize_context_t :
unsigned int b,
unsigned int c) const
{
- unsigned m;
- return !hb_unsigned_mul_overflows (a, b, &m) &&
- this->check_range (base, m, c);
+ return !hb_unsigned_mul_overflows (a, b) &&
+ this->check_range (base, a * b, c);
}
template <typename T>
diff --git a/src/hb-serialize.hh b/src/hb-serialize.hh
index d5573281f..f47cde5eb 100644
--- a/src/hb-serialize.hh
+++ b/src/hb-serialize.hh
@@ -194,6 +194,7 @@ struct hb_serialize_context_t
current = current->next;
_->fini ();
}
+ object_pool.fini ();
}
bool in_error () const { return bool (errors); }
@@ -223,7 +224,6 @@ struct hb_serialize_context_t
this->errors = HB_SERIALIZE_ERROR_NONE;
this->head = this->start;
this->tail = this->end;
- this->zerocopy = nullptr;
this->debug_depth = 0;
fini ();
@@ -326,8 +326,7 @@ struct hb_serialize_context_t
if (unlikely (in_error() && !only_overflow ())) return;
current = current->next;
- revert (zerocopy ? zerocopy : obj->head, obj->tail);
- zerocopy = nullptr;
+ revert (obj->head, obj->tail);
obj->fini ();
object_pool.release (obj);
}
@@ -345,11 +344,8 @@ struct hb_serialize_context_t
current = current->next;
obj->tail = head;
obj->next = nullptr;
- assert (obj->head <= obj->tail);
unsigned len = obj->tail - obj->head;
- head = zerocopy ? zerocopy : obj->head; /* Rewind head. */
- bool was_zerocopy = zerocopy;
- zerocopy = nullptr;
+ head = obj->head; /* Rewind head. */
if (!len)
{
@@ -359,11 +355,9 @@ struct hb_serialize_context_t
}
objidx_t objidx;
- uint32_t hash = 0;
if (share)
{
- hash = hb_hash (obj);
- objidx = packed_map.get_with_hash (obj, hash);
+ objidx = packed_map.get (obj);
if (objidx)
{
merge_virtual_links (obj, objidx);
@@ -373,10 +367,7 @@ struct hb_serialize_context_t
}
tail -= len;
- if (was_zerocopy)
- assert (tail == obj->head);
- else
- memmove (tail, obj->head, len);
+ memmove (tail, obj->head, len);
obj->head = tail;
obj->tail = tail + len;
@@ -394,7 +385,7 @@ struct hb_serialize_context_t
objidx = packed.length - 1;
- if (share) packed_map.set_with_hash (obj, hash, objidx);
+ if (share) packed_map.set (obj, objidx);
propagate_error (packed_map);
return objidx;
@@ -578,26 +569,8 @@ struct hb_serialize_context_t
return !bool ((errors = (errors | err_type)));
}
- bool start_zerocopy (size_t size)
- {
- if (unlikely (in_error ())) return false;
-
- if (unlikely (size > INT_MAX || this->tail - this->head < ptrdiff_t (size)))
- {
- err (HB_SERIALIZE_ERROR_OUT_OF_ROOM);
- return false;
- }
-
- assert (!this->zerocopy);
- this->zerocopy = this->head;
-
- assert (this->current->head == this->head);
- this->current->head = this->current->tail = this->head = this->tail - size;
- return true;
- }
-
template <typename Type>
- Type *allocate_size (size_t size, bool clear = true)
+ Type *allocate_size (size_t size)
{
if (unlikely (in_error ())) return nullptr;
@@ -606,8 +579,7 @@ struct hb_serialize_context_t
err (HB_SERIALIZE_ERROR_OUT_OF_ROOM);
return nullptr;
}
- if (clear)
- hb_memset (this->head, 0, size);
+ hb_memset (this->head, 0, size);
char *ret = this->head;
this->head += size;
return reinterpret_cast<Type *> (ret);
@@ -621,9 +593,9 @@ struct hb_serialize_context_t
Type *embed (const Type *obj)
{
unsigned int size = obj->get_size ();
- Type *ret = this->allocate_size<Type> (size, false);
+ Type *ret = this->allocate_size<Type> (size);
if (unlikely (!ret)) return nullptr;
- hb_memcpy (ret, obj, size);
+ memcpy (ret, obj, size);
return ret;
}
template <typename Type>
@@ -644,7 +616,7 @@ struct hb_serialize_context_t
}
/* Like embed, but active: calls obj.operator=() or obj.copy() to transfer data
- * instead of hb_memcpy(). */
+ * instead of memcpy(). */
template <typename Type, typename ...Ts>
Type *copy (const Type &src, Ts&&... ds)
{ return _copy (src, hb_prioritize, std::forward<Ts> (ds)...); }
@@ -662,7 +634,7 @@ struct hb_serialize_context_t
hb_serialize_context_t& operator << (const Type &obj) & { embed (obj); return *this; }
template <typename Type>
- Type *extend_size (Type *obj, size_t size, bool clear = true)
+ Type *extend_size (Type *obj, size_t size)
{
if (unlikely (in_error ())) return nullptr;
@@ -670,12 +642,12 @@ struct hb_serialize_context_t
assert ((char *) obj <= this->head);
assert ((size_t) (this->head - (char *) obj) <= size);
if (unlikely (((char *) obj + size < (char *) obj) ||
- !this->allocate_size<Type> (((char *) obj) + size - this->head, clear))) return nullptr;
+ !this->allocate_size<Type> (((char *) obj) + size - this->head))) return nullptr;
return reinterpret_cast<Type *> (obj);
}
template <typename Type>
- Type *extend_size (Type &obj, size_t size, bool clear = true)
- { return extend_size (std::addressof (obj), size, clear); }
+ Type *extend_size (Type &obj, size_t size)
+ { return extend_size (std::addressof (obj), size); }
template <typename Type>
Type *extend_min (Type *obj) { return extend_size (obj, obj->min_size); }
@@ -704,8 +676,8 @@ struct hb_serialize_context_t
char *p = (char *) hb_malloc (len);
if (unlikely (!p)) return hb_bytes_t ();
- hb_memcpy (p, this->start, this->head - this->start);
- hb_memcpy (p + (this->head - this->start), this->tail, this->end - this->tail);
+ memcpy (p, this->start, this->head - this->start);
+ memcpy (p + (this->head - this->start), this->tail, this->end - this->tail);
return hb_bytes_t (p, len);
}
template <typename Type>
@@ -732,7 +704,7 @@ struct hb_serialize_context_t
}
public:
- char *start, *head, *tail, *end, *zerocopy;
+ char *start, *head, *tail, *end;
unsigned int debug_depth;
hb_serialize_error_t errors;
diff --git a/src/hb-set-digest.hh b/src/hb-set-digest.hh
index e8409111f..fab36216e 100644
--- a/src/hb-set-digest.hh
+++ b/src/hb-set-digest.hh
@@ -28,7 +28,6 @@
#define HB_SET_DIGEST_HH
#include "hb.hh"
-#include "hb-machinery.hh"
/*
* The set-digests here implement various "filters" that support
@@ -76,8 +75,6 @@ struct hb_set_digest_bits_pattern_t
void init () { mask = 0; }
- void add (const hb_set_digest_bits_pattern_t &o) { mask |= o.mask; }
-
void add (hb_codepoint_t g) { mask |= mask_for (g); }
bool add_range (hb_codepoint_t a, hb_codepoint_t b)
@@ -98,7 +95,7 @@ struct hb_set_digest_bits_pattern_t
for (unsigned int i = 0; i < count; i++)
{
add (*array);
- array = &StructAtOffsetUnaligned<T> ((const void *) array, stride);
+ array = (const T *) (stride + (const char *) array);
}
}
template <typename T>
@@ -106,15 +103,16 @@ struct hb_set_digest_bits_pattern_t
template <typename T>
bool add_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
{
- add_array (array, count, stride);
+ for (unsigned int i = 0; i < count; i++)
+ {
+ add (*array);
+ array = (const T *) (stride + (const char *) array);
+ }
return true;
}
template <typename T>
bool add_sorted_array (const hb_sorted_array_t<const T>& arr) { return add_sorted_array (&arr, arr.len ()); }
- bool may_have (const hb_set_digest_bits_pattern_t &o) const
- { return mask & o.mask; }
-
bool may_have (hb_codepoint_t g) const
{ return mask & mask_for (g); }
@@ -134,12 +132,6 @@ struct hb_set_digest_combiner_t
tail.init ();
}
- void add (const hb_set_digest_combiner_t &o)
- {
- head.add (o.head);
- tail.add (o.tail);
- }
-
void add (hb_codepoint_t g)
{
head.add (g);
@@ -148,8 +140,9 @@ struct hb_set_digest_combiner_t
bool add_range (hb_codepoint_t a, hb_codepoint_t b)
{
- return head.add_range (a, b) &&
- tail.add_range (a, b);
+ head.add_range (a, b);
+ tail.add_range (a, b);
+ return true;
}
template <typename T>
void add_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
@@ -162,17 +155,13 @@ struct hb_set_digest_combiner_t
template <typename T>
bool add_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
{
- return head.add_sorted_array (array, count, stride) &&
- tail.add_sorted_array (array, count, stride);
+ head.add_sorted_array (array, count, stride);
+ tail.add_sorted_array (array, count, stride);
+ return true;
}
template <typename T>
bool add_sorted_array (const hb_sorted_array_t<const T>& arr) { return add_sorted_array (&arr, arr.len ()); }
- bool may_have (const hb_set_digest_combiner_t &o) const
- {
- return head.may_have (o.head) && tail.may_have (o.tail);
- }
-
bool may_have (hb_codepoint_t g) const
{
return head.may_have (g) && tail.may_have (g);
diff --git a/src/hb-set.hh b/src/hb-set.hh
index f958a081f..5d5576cb9 100644
--- a/src/hb-set.hh
+++ b/src/hb-set.hh
@@ -105,8 +105,10 @@ struct hb_sparseset_t
bool get (hb_codepoint_t g) const { return s.get (g); }
/* Has interface. */
- bool operator [] (hb_codepoint_t k) const { return get (k); }
- bool has (hb_codepoint_t k) const { return (*this)[k]; }
+ static constexpr bool SENTINEL = false;
+ typedef bool 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); }
diff --git a/src/hb-shape-plan.cc b/src/hb-shape-plan.cc
index cabcbd4e7..9e513c045 100644
--- a/src/hb-shape-plan.cc
+++ b/src/hb-shape-plan.cc
@@ -31,8 +31,6 @@
#include "hb-buffer.hh"
-#ifndef HB_NO_SHAPER
-
/**
* SECTION:hb-shape-plan
* @title: hb-shape-plan
@@ -76,7 +74,7 @@ hb_shape_plan_key_t::init (bool copy,
this->user_features = copy ? features : user_features;
if (copy && num_user_features)
{
- hb_memcpy (features, user_features, num_user_features * sizeof (hb_feature_t));
+ memcpy (features, user_features, num_user_features * sizeof (hb_feature_t));
/* Make start/end uniform to easier catch bugs. */
for (unsigned int i = 0; i < num_user_features; i++)
{
@@ -576,6 +574,3 @@ retry:
return hb_shape_plan_reference (shape_plan);
}
-
-
-#endif
diff --git a/src/hb-shape.cc b/src/hb-shape.cc
index 7b5bf2c5e..547d0afc4 100644
--- a/src/hb-shape.cc
+++ b/src/hb-shape.cc
@@ -35,8 +35,6 @@
#include "hb-machinery.hh"
-#ifndef HB_NO_SHAPER
-
/**
* SECTION:hb-shape
* @title: hb-shape
@@ -194,6 +192,3 @@ hb_shape (hb_font_t *font,
{
hb_shape_full (font, buffer, features, num_features, nullptr);
}
-
-
-#endif
diff --git a/src/hb-shaper.cc b/src/hb-shaper.cc
index c4885cda9..a900ac699 100644
--- a/src/hb-shaper.cc
+++ b/src/hb-shaper.cc
@@ -53,7 +53,7 @@ static struct hb_shapers_lazy_loader_t : hb_lazy_loader_t<hb_shaper_entry_t,
if (unlikely (!shapers))
return nullptr;
- hb_memcpy (shapers, _hb_all_shapers, sizeof (_hb_all_shapers));
+ memcpy (shapers, _hb_all_shapers, sizeof (_hb_all_shapers));
/* Reorder shaper list to prefer requested shapers. */
unsigned int i = 0;
diff --git a/src/hb-static.cc b/src/hb-static.cc
index eac50754c..5d4c7cda1 100644
--- a/src/hb-static.cc
+++ b/src/hb-static.cc
@@ -33,7 +33,6 @@
#include "hb-aat-layout-feat-table.hh"
#include "hb-ot-layout-common.hh"
#include "hb-ot-cmap-table.hh"
-#include "hb-ot-color-colr-table.hh"
#include "hb-ot-glyf-table.hh"
#include "hb-ot-head-table.hh"
#include "hb-ot-maxp-table.hh"
@@ -48,7 +47,6 @@ DEFINE_NULL_NAMESPACE_BYTES (OT, Index) = {0xFF,0xFF};
DEFINE_NULL_NAMESPACE_BYTES (OT, VarIdx) = {0xFF,0xFF,0xFF,0xFF};
DEFINE_NULL_NAMESPACE_BYTES (OT, LangSys) = {0x00,0x00, 0xFF,0xFF, 0x00,0x00};
DEFINE_NULL_NAMESPACE_BYTES (OT, RangeRecord) = {0x01};
-DEFINE_NULL_NAMESPACE_BYTES (OT, ClipRecord) = {0x01};
DEFINE_NULL_NAMESPACE_BYTES (OT, CmapSubtableLongGroup) = {0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00};
DEFINE_NULL_NAMESPACE_BYTES (AAT, SettingName) = {0xFF,0xFF, 0xFF,0xFF};
DEFINE_NULL_NAMESPACE_BYTES (AAT, Lookup) = {0xFF,0xFF};
diff --git a/src/hb-subset-accelerator.hh b/src/hb-subset-accelerator.hh
index 63ae6d77e..34bd0534f 100644
--- a/src/hb-subset-accelerator.hh
+++ b/src/hb-subset-accelerator.hh
@@ -31,34 +31,21 @@
#include "hb.hh"
#include "hb-map.hh"
-#include "hb-multimap.hh"
#include "hb-set.hh"
-extern HB_INTERNAL hb_user_data_key_t _hb_subset_accelerator_user_data_key;
-
-namespace CFF {
-struct cff_subset_accelerator_t;
-}
-
-namespace OT {
-struct SubtableUnicodesCache;
-};
-
struct hb_subset_accelerator_t
{
static hb_user_data_key_t* user_data_key()
{
- return &_hb_subset_accelerator_user_data_key;
+ static hb_user_data_key_t key;
+ return &key;
}
static hb_subset_accelerator_t* create(const hb_map_t& unicode_to_gid_,
- const hb_multimap_t gid_to_unicodes_,
- const hb_set_t& unicodes_,
- bool has_seac_) {
+ const hb_set_t& unicodes_) {
hb_subset_accelerator_t* accel =
(hb_subset_accelerator_t*) hb_malloc (sizeof(hb_subset_accelerator_t));
- new (accel) hb_subset_accelerator_t (unicode_to_gid_, gid_to_unicodes_, unicodes_);
- accel->has_seac = has_seac_;
+ new (accel) hb_subset_accelerator_t (unicode_to_gid_, unicodes_);
return accel;
}
@@ -66,54 +53,22 @@ struct hb_subset_accelerator_t
if (!value) return;
hb_subset_accelerator_t* accel = (hb_subset_accelerator_t*) value;
-
- if (accel->cff_accelerator && accel->destroy_cff_accelerator)
- accel->destroy_cff_accelerator ((void*) accel->cff_accelerator);
-
- if (accel->cmap_cache && accel->destroy_cmap_cache)
- accel->destroy_cmap_cache ((void*) accel->cmap_cache);
-
accel->~hb_subset_accelerator_t ();
hb_free (accel);
}
- hb_subset_accelerator_t (const hb_map_t& unicode_to_gid_,
- const hb_multimap_t& gid_to_unicodes_,
+ hb_subset_accelerator_t(const hb_map_t& unicode_to_gid_,
const hb_set_t& unicodes_)
- : unicode_to_gid(unicode_to_gid_), gid_to_unicodes (gid_to_unicodes_), unicodes(unicodes_),
- cmap_cache(nullptr), destroy_cmap_cache(nullptr),
- has_seac(false), cff_accelerator(nullptr), destroy_cff_accelerator(nullptr)
- { sanitized_table_cache_lock.init (); }
-
- ~hb_subset_accelerator_t ()
- { sanitized_table_cache_lock.fini (); }
-
- // Generic
-
- mutable hb_mutex_t sanitized_table_cache_lock;
- mutable hb_hashmap_t<hb_tag_t, hb::unique_ptr<hb_blob_t>> sanitized_table_cache;
+ : unicode_to_gid(unicode_to_gid_), unicodes(unicodes_) {}
const hb_map_t unicode_to_gid;
- const hb_multimap_t gid_to_unicodes;
const hb_set_t unicodes;
-
- // cmap
- const OT::SubtableUnicodesCache* cmap_cache;
- hb_destroy_func_t destroy_cmap_cache;
-
- // CFF
- bool has_seac;
- const CFF::cff_subset_accelerator_t* cff_accelerator;
- hb_destroy_func_t destroy_cff_accelerator;
-
// TODO(garretrieger): cumulative glyf checksum map
+ // TODO(garretrieger): sanitized table cache.
bool in_error () const
{
- return unicode_to_gid.in_error () ||
- gid_to_unicodes.in_error () ||
- unicodes.in_error () ||
- sanitized_table_cache.in_error ();
+ return unicode_to_gid.in_error() || unicodes.in_error ();
}
};
diff --git a/src/hb-subset-cff-common.cc b/src/hb-subset-cff-common.cc
index 6e1b6f713..711b2236d 100644
--- a/src/hb-subset-cff-common.cc
+++ b/src/hb-subset-cff-common.cc
@@ -66,7 +66,8 @@ hb_plan_subset_cff_fdselect (const hb_subset_plan_t *plan,
{
/* use hb_set to determine the subset of font dicts */
- hb_set_t set;
+ hb_set_t *set = hb_set_create ();
+ if (unlikely (set == &Null (hb_set_t))) return false;
hb_codepoint_t prev_fd = CFF_UNDEF_CODE;
for (hb_codepoint_t i = 0; i < subset_num_glyphs; i++)
{
@@ -78,7 +79,7 @@ hb_plan_subset_cff_fdselect (const hb_subset_plan_t *plan,
glyph = i;
}
fd = src.get_fd (glyph);
- set.add (fd);
+ set->add (fd);
if (fd != prev_fd)
{
@@ -89,11 +90,12 @@ hb_plan_subset_cff_fdselect (const hb_subset_plan_t *plan,
}
}
- subset_fd_count = set.get_population ();
+ subset_fd_count = set->get_population ();
if (subset_fd_count == fdCount)
{
/* all font dicts belong to the subset. no need to subset FDSelect & FDArray */
fdmap.identity (fdCount);
+ hb_set_destroy (set);
}
else
{
@@ -101,8 +103,9 @@ hb_plan_subset_cff_fdselect (const hb_subset_plan_t *plan,
fdmap.reset ();
hb_codepoint_t fd = CFF_UNDEF_CODE;
- while (set.next (&fd))
+ while (set->next (&fd))
fdmap.add (fd);
+ hb_set_destroy (set);
if (unlikely (fdmap.get_population () != subset_fd_count))
return false;
}
diff --git a/src/hb-subset-cff-common.hh b/src/hb-subset-cff-common.hh
index 8bbc01765..bb9f27eec 100644
--- a/src/hb-subset-cff-common.hh
+++ b/src/hb-subset-cff-common.hh
@@ -38,16 +38,15 @@ namespace CFF {
struct str_encoder_t
{
str_encoder_t (str_buff_t &buff_)
- : buff (buff_) {}
+ : buff (buff_), error (false) {}
void reset () { buff.reset (); }
void encode_byte (unsigned char b)
{
- if (likely ((signed) buff.length < buff.allocated))
- buff.arrayZ[buff.length++] = b;
- else
- buff.push (b);
+ buff.push (b);
+ if (unlikely (buff.in_error ()))
+ set_error ();
}
void encode_int (int v)
@@ -109,18 +108,27 @@ struct str_encoder_t
encode_byte (op);
}
- void copy_str (const unsigned char *str, unsigned length)
+ void copy_str (const hb_ubytes_t &str)
{
- assert ((signed) (buff.length + length) <= buff.allocated);
- hb_memcpy (buff.arrayZ + buff.length, str, length);
- buff.length += length;
+ unsigned int offset = buff.length;
+ /* Manually resize buffer since faster. */
+ if ((signed) (buff.length + str.length) <= buff.allocated)
+ buff.length += str.length;
+ else if (unlikely (!buff.resize (offset + str.length)))
+ {
+ set_error ();
+ return;
+ }
+ memcpy (buff.arrayZ + offset, &str[0], str.length);
}
- bool in_error () const { return buff.in_error (); }
+ bool is_error () const { return error; }
protected:
+ void set_error () { error = true; }
str_buff_t &buff;
+ bool error;
};
struct cff_sub_table_info_t {
@@ -179,12 +187,9 @@ struct cff_font_dict_op_serializer_t : op_serializer_t
}
else
{
- unsigned char *d = c->allocate_size<unsigned char> (opstr.length);
+ HBUINT8 *d = c->allocate_size<HBUINT8> (opstr.str.length);
if (unlikely (!d)) return_trace (false);
- /* Faster than hb_memcpy for small strings. */
- for (unsigned i = 0; i < opstr.length; i++)
- d[i] = opstr.ptr[i];
- //hb_memcpy (d, opstr.ptr, opstr.length);
+ memcpy (d, &opstr.str[0], opstr.str.length);
}
return_trace (true);
}
@@ -234,10 +239,11 @@ struct subr_flattener_t
bool flatten (str_buff_vec_t &flat_charstrings)
{
- unsigned count = plan->num_output_glyphs ();
- if (!flat_charstrings.resize (count))
+ if (!flat_charstrings.resize (plan->num_output_glyphs ()))
return false;
- for (unsigned int i = 0; i < count; i++)
+ for (unsigned int i = 0; i < plan->num_output_glyphs (); i++)
+ flat_charstrings[i].init ();
+ for (unsigned int i = 0; i < plan->num_output_glyphs (); i++)
{
hb_codepoint_t glyph;
if (!plan->old_gid_for_new_gid (i, &glyph))
@@ -253,7 +259,7 @@ struct subr_flattener_t
ENV env (str, acc, fd);
cs_interpreter_t<ENV, OPSET, flatten_param_t> interp (env);
flatten_param_t param = {
- flat_charstrings.arrayZ[i],
+ flat_charstrings[i],
(bool) (plan->flags & HB_SUBSET_FLAGS_NO_HINTING)
};
if (unlikely (!interp.interpret (param)))
@@ -268,9 +274,11 @@ struct subr_flattener_t
struct subr_closures_t
{
- subr_closures_t (unsigned int fd_count) : global_closure (), local_closures ()
+ subr_closures_t (unsigned int fd_count) : valid (false), global_closure (), local_closures ()
{
- local_closures.resize (fd_count);
+ valid = true;
+ if (!local_closures.resize (fd_count))
+ valid = false;
}
void reset ()
@@ -280,38 +288,47 @@ struct subr_closures_t
local_closures[i].clear();
}
- bool in_error () const { return local_closures.in_error (); }
+ bool is_valid () const { return valid; }
+ bool valid;
hb_set_t global_closure;
hb_vector_t<hb_set_t> local_closures;
};
struct parsed_cs_op_t : op_str_t
{
- parsed_cs_op_t (unsigned int subr_num_ = 0) :
- subr_num (subr_num_) {}
+ void init (unsigned int subr_num_ = 0)
+ {
+ subr_num = subr_num_;
+ drop_flag = false;
+ keep_flag = false;
+ skip_flag = false;
+ }
- bool is_hinting () const { return hinting_flag; }
- void set_hinting () { hinting_flag = true; }
+ bool for_drop () const { return drop_flag; }
+ void set_drop () { if (!for_keep ()) drop_flag = true; }
- /* The layout of this struct is designed to fit within the
- * padding of op_str_t! */
+ bool for_keep () const { return keep_flag; }
+ void set_keep () { keep_flag = true; }
- protected:
- bool hinting_flag = false;
+ bool for_skip () const { return skip_flag; }
+ void set_skip () { skip_flag = true; }
- public:
- uint16_t subr_num;
+ unsigned int subr_num;
+
+ protected:
+ bool drop_flag;
+ bool keep_flag;
+ bool skip_flag;
};
struct parsed_cs_str_t : parsed_values_t<parsed_cs_op_t>
{
- parsed_cs_str_t () :
- parsed (false),
- hint_dropped (false),
- has_prefix_ (false),
- has_calls_ (false)
+ void init ()
{
SUPER::init ();
+ parsed = false;
+ hint_dropped = false;
+ has_prefix_ = false;
}
void add_op (op_code_t op, const byte_str_ref_t& str_ref)
@@ -324,12 +341,13 @@ struct parsed_cs_str_t : parsed_values_t<parsed_cs_op_t>
{
if (!is_parsed ())
{
- has_calls_ = true;
+ unsigned int parsed_len = get_count ();
+ if (likely (parsed_len > 0))
+ values[parsed_len-1].set_skip ();
- /* Pop the subroutine number. */
- values.pop ();
-
- SUPER::add_op (op, str_ref, {subr_num});
+ parsed_cs_op_t val;
+ val.init (subr_num);
+ SUPER::add_op (op, str_ref, val);
}
}
@@ -359,14 +377,11 @@ struct parsed_cs_str_t : parsed_values_t<parsed_cs_op_t>
op_code_t prefix_op () const { return prefix_op_; }
const number_t &prefix_num () const { return prefix_num_; }
- bool has_calls () const { return has_calls_; }
-
protected:
- bool parsed : 1;
- bool hint_dropped : 1;
- bool vsindex_dropped : 1;
- bool has_prefix_ : 1;
- bool has_calls_ : 1;
+ bool parsed;
+ bool hint_dropped;
+ bool vsindex_dropped;
+ bool has_prefix_;
op_code_t prefix_op_;
number_t prefix_num_;
@@ -380,59 +395,6 @@ struct parsed_cs_str_vec_t : hb_vector_t<parsed_cs_str_t>
typedef hb_vector_t<parsed_cs_str_t> SUPER;
};
-struct cff_subset_accelerator_t
-{
- static cff_subset_accelerator_t* create (
- hb_blob_t* original_blob,
- const parsed_cs_str_vec_t& parsed_charstrings,
- const parsed_cs_str_vec_t& parsed_global_subrs,
- const hb_vector_t<parsed_cs_str_vec_t>& parsed_local_subrs) {
- cff_subset_accelerator_t* accel =
- (cff_subset_accelerator_t*) hb_malloc (sizeof(cff_subset_accelerator_t));
- new (accel) cff_subset_accelerator_t (original_blob,
- parsed_charstrings,
- parsed_global_subrs,
- parsed_local_subrs);
- return accel;
- }
-
- static void destroy (void* value) {
- if (!value) return;
-
- cff_subset_accelerator_t* accel = (cff_subset_accelerator_t*) value;
- accel->~cff_subset_accelerator_t ();
- hb_free (accel);
- }
-
- cff_subset_accelerator_t(
- hb_blob_t* original_blob_,
- const parsed_cs_str_vec_t& parsed_charstrings_,
- const parsed_cs_str_vec_t& parsed_global_subrs_,
- const hb_vector_t<parsed_cs_str_vec_t>& parsed_local_subrs_)
- {
- parsed_charstrings = parsed_charstrings_;
- parsed_global_subrs = parsed_global_subrs_;
- parsed_local_subrs = parsed_local_subrs_;
-
- // the parsed charstrings point to memory in the original CFF table so we must hold a reference
- // to it to keep the memory valid.
- original_blob = hb_blob_reference (original_blob_);
- }
-
- ~cff_subset_accelerator_t() {
- hb_blob_destroy (original_blob);
- hb_map_destroy (glyph_to_sid_map.get_relaxed ());
- }
-
- parsed_cs_str_vec_t parsed_charstrings;
- parsed_cs_str_vec_t parsed_global_subrs;
- hb_vector_t<parsed_cs_str_vec_t> parsed_local_subrs;
- mutable hb_atomic_ptr_t<hb_map_t> glyph_to_sid_map = nullptr;
-
- private:
- hb_blob_t* original_blob;
-};
-
struct subr_subset_param_t
{
subr_subset_param_t (parsed_cs_str_t *parsed_charstring_,
@@ -484,11 +446,7 @@ struct subr_subset_param_t
if (unlikely (calling && !parsed_str->is_parsed () && (parsed_str->values.length > 0)))
env.set_error ();
else
- {
- if (!parsed_str->is_parsed ())
- parsed_str->alloc (env.str_ref.total_size () / 2);
current_parsed_str = parsed_str;
- }
}
parsed_cs_str_t *current_parsed_str;
@@ -548,7 +506,7 @@ struct subr_remaps_t
{
global_remap.create (&closures.global_closure);
for (unsigned int i = 0; i < local_remaps.length; i++)
- local_remaps.arrayZ[i].create (&closures.local_closures[i]);
+ local_remaps[i].create (&closures.local_closures[i]);
}
subr_remap_t global_remap;
@@ -559,8 +517,7 @@ template <typename SUBSETTER, typename SUBRS, typename ACC, typename ENV, typena
struct subr_subsetter_t
{
subr_subsetter_t (ACC &acc_, const hb_subset_plan_t *plan_)
- : acc (acc_), plan (plan_), closures(acc_.fdCount),
- remaps(acc_.fdCount)
+ : acc (acc_), plan (plan_), closures(acc_.fdCount), remaps(acc_.fdCount)
{}
/* Subroutine subsetting with --no-desubroutinize runs in phases:
@@ -579,96 +536,55 @@ struct subr_subsetter_t
*/
bool subset (void)
{
- unsigned fd_count = acc.fdCount;
- const cff_subset_accelerator_t* cff_accelerator = nullptr;
- if (plan->accelerator && plan->accelerator->cff_accelerator) {
- cff_accelerator = plan->accelerator->cff_accelerator;
- fd_count = cff_accelerator->parsed_local_subrs.length;
- }
-
- if (cff_accelerator) {
- // If we are not dropping hinting then charstrings are not modified so we can
- // just use a reference to the cached copies.
- cached_charstrings.resize (plan->num_output_glyphs ());
- parsed_global_subrs = &cff_accelerator->parsed_global_subrs;
- parsed_local_subrs = &cff_accelerator->parsed_local_subrs;
- } else {
- parsed_charstrings.resize (plan->num_output_glyphs ());
- parsed_global_subrs_storage.resize (acc.globalSubrs->count);
-
- if (unlikely (!parsed_local_subrs_storage.resize (fd_count))) return false;
-
- for (unsigned int i = 0; i < acc.fdCount; i++)
- {
- unsigned count = acc.privateDicts[i].localSubrs->count;
- parsed_local_subrs_storage[i].resize (count);
- if (unlikely (parsed_local_subrs_storage[i].in_error ())) return false;
- }
-
- parsed_global_subrs = &parsed_global_subrs_storage;
- parsed_local_subrs = &parsed_local_subrs_storage;
- }
+ parsed_charstrings.resize (plan->num_output_glyphs ());
+ parsed_global_subrs.resize (acc.globalSubrs->count);
if (unlikely (remaps.in_error()
- || cached_charstrings.in_error ()
|| parsed_charstrings.in_error ()
- || parsed_global_subrs->in_error ()
- || closures.in_error ())) {
+ || parsed_global_subrs.in_error ())) {
return false;
}
+ if (unlikely (!parsed_local_subrs.resize (acc.fdCount))) return false;
+
+ for (unsigned int i = 0; i < acc.fdCount; i++)
+ {
+ parsed_local_subrs[i].resize (acc.privateDicts[i].localSubrs->count);
+ if (unlikely (parsed_local_subrs[i].in_error ())) return false;
+ }
+ if (unlikely (!closures.valid))
+ return false;
+
/* phase 1 & 2 */
for (unsigned int i = 0; i < plan->num_output_glyphs (); i++)
{
hb_codepoint_t glyph;
if (!plan->old_gid_for_new_gid (i, &glyph))
- continue;
-
+ continue;
const hb_ubytes_t str = (*acc.charStrings)[glyph];
unsigned int fd = acc.fdSelect->get_fd (glyph);
if (unlikely (fd >= acc.fdCount))
- return false;
-
- if (cff_accelerator)
- {
- // parsed string already exists in accelerator, copy it and move
- // on.
- if (cached_charstrings)
- cached_charstrings[i] = &cff_accelerator->parsed_charstrings[glyph];
- else
- parsed_charstrings[i] = cff_accelerator->parsed_charstrings[glyph];
-
- continue;
- }
+ return false;
ENV env (str, acc, fd);
cs_interpreter_t<ENV, OPSET, subr_subset_param_t> interp (env);
- parsed_charstrings[i].alloc (str.length / 2);
+ parsed_charstrings[i].alloc (str.length);
subr_subset_param_t param (&parsed_charstrings[i],
- &parsed_global_subrs_storage,
- &parsed_local_subrs_storage[fd],
- &closures.global_closure,
- &closures.local_closures[fd],
- plan->flags & HB_SUBSET_FLAGS_NO_HINTING);
+ &parsed_global_subrs,
+ &parsed_local_subrs[fd],
+ &closures.global_closure,
+ &closures.local_closures[fd],
+ plan->flags & HB_SUBSET_FLAGS_NO_HINTING);
if (unlikely (!interp.interpret (param)))
- return false;
+ return false;
/* complete parsed string esp. copy CFF1 width or CFF2 vsindex to the parsed charstring for encoding */
SUBSETTER::complete_parsed_str (interp.env, param, parsed_charstrings[i]);
}
- // Since parsed strings were loaded from accelerator, we still need
- // to compute the subroutine closures which would have normally happened during
- // parsing.
- if (cff_accelerator &&
- !closure_subroutines(*parsed_global_subrs,
- *parsed_local_subrs))
- return false;
-
- if ((plan->flags & HB_SUBSET_FLAGS_NO_HINTING && !cff_accelerator) ||
- plan->inprogress_accelerator)
+ if (plan->flags & HB_SUBSET_FLAGS_NO_HINTING)
{
/* mark hint ops and arguments for drop */
for (unsigned int i = 0; i < plan->num_output_glyphs (); i++)
@@ -680,8 +596,8 @@ struct subr_subsetter_t
if (unlikely (fd >= acc.fdCount))
return false;
subr_subset_param_t param (&parsed_charstrings[i],
- &parsed_global_subrs_storage,
- &parsed_local_subrs_storage[fd],
+ &parsed_global_subrs,
+ &parsed_local_subrs[fd],
&closures.global_closure,
&closures.local_closures[fd],
plan->flags & HB_SUBSET_FLAGS_NO_HINTING);
@@ -696,14 +612,27 @@ struct subr_subsetter_t
}
/* after dropping hints recreate closures of actually used subrs */
- if (plan->flags & HB_SUBSET_FLAGS_NO_HINTING &&
- !cff_accelerator &&
- !closure_subroutines(*parsed_global_subrs, *parsed_local_subrs)) return false;
+ closures.reset ();
+ for (unsigned int i = 0; i < plan->num_output_glyphs (); i++)
+ {
+ hb_codepoint_t glyph;
+ if (!plan->old_gid_for_new_gid (i, &glyph))
+ continue;
+ unsigned int fd = acc.fdSelect->get_fd (glyph);
+ if (unlikely (fd >= acc.fdCount))
+ return false;
+ subr_subset_param_t param (&parsed_charstrings[i],
+ &parsed_global_subrs,
+ &parsed_local_subrs[fd],
+ &closures.global_closure,
+ &closures.local_closures[fd],
+ plan->flags & HB_SUBSET_FLAGS_NO_HINTING);
+ collect_subr_refs_in_str (parsed_charstrings[i], param);
+ }
}
remaps.create (closures);
- populate_subset_accelerator ();
return true;
}
@@ -717,13 +646,13 @@ struct subr_subsetter_t
if (!plan->old_gid_for_new_gid (i, &glyph))
{
/* add an endchar only charstring for a missing glyph if CFF1 */
- if (endchar_op != OpCode_Invalid) buffArray.arrayZ[i].push (endchar_op);
+ if (endchar_op != OpCode_Invalid) buffArray[i].push (endchar_op);
continue;
}
unsigned int fd = acc.fdSelect->get_fd (glyph);
if (unlikely (fd >= acc.fdCount))
return false;
- if (unlikely (!encode_str (get_parsed_charstring (i), fd, buffArray.arrayZ[i])))
+ if (unlikely (!encode_str (parsed_charstrings[i], fd, buffArray[i])))
return false;
}
return true;
@@ -735,25 +664,26 @@ struct subr_subsetter_t
if (unlikely (!buffArray.resize (count)))
return false;
- for (unsigned int new_num = 0; new_num < count; new_num++)
+ for (unsigned int old_num = 0; old_num < subrs.length; old_num++)
{
- hb_codepoint_t old_num = remap.backward (new_num);
- assert (old_num != CFF_UNDEF_CODE);
-
- if (unlikely (!encode_str (subrs[old_num], fd, buffArray[new_num])))
- return false;
+ hb_codepoint_t new_num = remap[old_num];
+ if (new_num != CFF_UNDEF_CODE)
+ {
+ if (unlikely (!encode_str (subrs[old_num], fd, buffArray[new_num])))
+ return false;
+ }
}
return true;
}
bool encode_globalsubrs (str_buff_vec_t &buffArray)
{
- return encode_subrs (*parsed_global_subrs, remaps.global_remap, 0, buffArray);
+ return encode_subrs (parsed_global_subrs, remaps.global_remap, 0, buffArray);
}
bool encode_localsubrs (unsigned int fd, str_buff_vec_t &buffArray) const
{
- return encode_subrs ((*parsed_local_subrs)[fd], remaps.local_remaps[fd], fd, buffArray);
+ return encode_subrs (parsed_local_subrs[fd], remaps.local_remaps[fd], fd, buffArray);
}
protected:
@@ -782,7 +712,7 @@ struct subr_subsetter_t
* then this entire subroutine must be a hint. drop its call. */
if (drop.ends_in_hint)
{
- str.values[pos].set_hinting ();
+ str.values[pos].set_drop ();
/* if this subr call is at the end of the parent subr, propagate the flag
* otherwise reset the flag */
if (!str.at_end (pos))
@@ -790,7 +720,7 @@ struct subr_subsetter_t
}
else if (drop.all_dropped)
{
- str.values[pos].set_hinting ();
+ str.values[pos].set_drop ();
}
return has_hint;
@@ -801,22 +731,20 @@ struct subr_subsetter_t
{
bool seen_hint = false;
- unsigned count = str.values.length;
- auto *values = str.values.arrayZ;
- for (unsigned int pos = 0; pos < count; pos++)
+ for (unsigned int pos = 0; pos < str.values.length; pos++)
{
bool has_hint = false;
- switch (values[pos].op)
+ switch (str.values[pos].op)
{
case OpCode_callsubr:
has_hint = drop_hints_in_subr (str, pos,
- *param.parsed_local_subrs, values[pos].subr_num,
+ *param.parsed_local_subrs, str.values[pos].subr_num,
param, drop);
break;
case OpCode_callgsubr:
has_hint = drop_hints_in_subr (str, pos,
- *param.parsed_global_subrs, values[pos].subr_num,
+ *param.parsed_global_subrs, str.values[pos].subr_num,
param, drop);
break;
@@ -830,7 +758,7 @@ struct subr_subsetter_t
case OpCode_cntrmask:
if (drop.seen_moveto)
{
- values[pos].set_hinting ();
+ str.values[pos].set_drop ();
break;
}
HB_FALLTHROUGH;
@@ -840,13 +768,13 @@ struct subr_subsetter_t
case OpCode_hstem:
case OpCode_vstem:
has_hint = true;
- values[pos].set_hinting ();
+ str.values[pos].set_drop ();
if (str.at_end (pos))
drop.ends_in_hint = true;
break;
case OpCode_dotsection:
- values[pos].set_hinting ();
+ str.values[pos].set_drop ();
break;
default:
@@ -857,10 +785,10 @@ struct subr_subsetter_t
{
for (int i = pos - 1; i >= 0; i--)
{
- parsed_cs_op_t &csop = values[(unsigned)i];
- if (csop.is_hinting ())
+ parsed_cs_op_t &csop = str.values[(unsigned)i];
+ if (csop.for_drop ())
break;
- csop.set_hinting ();
+ csop.set_drop ();
if (csop.op == OpCode_vsindexcs)
drop.vsindex_dropped = true;
}
@@ -873,12 +801,12 @@ struct subr_subsetter_t
* only (usually one) hintmask operator, then calls to this subr can be dropped.
*/
drop.all_dropped = true;
- for (unsigned int pos = 0; pos < count; pos++)
+ for (unsigned int pos = 0; pos < str.values.length; pos++)
{
- parsed_cs_op_t &csop = values[pos];
+ parsed_cs_op_t &csop = str.values[pos];
if (csop.op == OpCode_return)
break;
- if (!csop.is_hinting ())
+ if (!csop.for_drop ())
{
drop.all_dropped = false;
break;
@@ -888,62 +816,32 @@ struct subr_subsetter_t
return seen_hint;
}
- bool closure_subroutines (const parsed_cs_str_vec_t& global_subrs,
- const hb_vector_t<parsed_cs_str_vec_t>& local_subrs)
- {
- closures.reset ();
- for (unsigned int i = 0; i < plan->num_output_glyphs (); i++)
- {
- hb_codepoint_t glyph;
- if (!plan->old_gid_for_new_gid (i, &glyph))
- continue;
- unsigned int fd = acc.fdSelect->get_fd (glyph);
- if (unlikely (fd >= acc.fdCount))
- return false;
-
- // Note: const cast is safe here because the collect_subr_refs_in_str only performs a
- // closure and does not modify any of the charstrings.
- subr_subset_param_t param (const_cast<parsed_cs_str_t*> (&get_parsed_charstring (i)),
- const_cast<parsed_cs_str_vec_t*> (&global_subrs),
- const_cast<parsed_cs_str_vec_t*> (&local_subrs[fd]),
- &closures.global_closure,
- &closures.local_closures[fd],
- plan->flags & HB_SUBSET_FLAGS_NO_HINTING);
- collect_subr_refs_in_str (get_parsed_charstring (i), param);
- }
-
- return true;
- }
-
- void collect_subr_refs_in_subr (unsigned int subr_num, parsed_cs_str_vec_t &subrs,
+ void collect_subr_refs_in_subr (parsed_cs_str_t &str, unsigned int pos,
+ unsigned int subr_num, parsed_cs_str_vec_t &subrs,
hb_set_t *closure,
const subr_subset_param_t &param)
{
- if (closure->has (subr_num))
- return;
closure->add (subr_num);
collect_subr_refs_in_str (subrs[subr_num], param);
}
- void collect_subr_refs_in_str (const parsed_cs_str_t &str,
- const subr_subset_param_t &param)
+ void collect_subr_refs_in_str (parsed_cs_str_t &str, const subr_subset_param_t &param)
{
- if (!str.has_calls ())
- return;
-
- for (auto &opstr : str.values)
+ for (unsigned int pos = 0; pos < str.values.length; pos++)
{
- if (!param.drop_hints || !opstr.is_hinting ())
+ if (!str.values[pos].for_drop ())
{
- switch (opstr.op)
+ switch (str.values[pos].op)
{
case OpCode_callsubr:
- collect_subr_refs_in_subr (opstr.subr_num, *param.parsed_local_subrs,
+ collect_subr_refs_in_subr (str, pos,
+ str.values[pos].subr_num, *param.parsed_local_subrs,
param.local_closure, param);
break;
case OpCode_callgsubr:
- collect_subr_refs_in_subr (opstr.subr_num, *param.parsed_global_subrs,
+ collect_subr_refs_in_subr (str, pos,
+ str.values[pos].subr_num, *param.parsed_global_subrs,
param.global_closure, param);
break;
@@ -955,113 +853,42 @@ struct subr_subsetter_t
bool encode_str (const parsed_cs_str_t &str, const unsigned int fd, str_buff_t &buff) const
{
+ unsigned count = str.get_count ();
str_encoder_t encoder (buff);
encoder.reset ();
- bool hinting = !(plan->flags & HB_SUBSET_FLAGS_NO_HINTING);
+ buff.alloc (count * 3);
/* if a prefix (CFF1 width or CFF2 vsindex) has been removed along with hints,
* re-insert it at the beginning of charstreing */
- if (str.has_prefix () && !hinting && str.is_hint_dropped ())
+ if (str.has_prefix () && str.is_hint_dropped ())
{
encoder.encode_num (str.prefix_num ());
if (str.prefix_op () != OpCode_Invalid)
encoder.encode_op (str.prefix_op ());
}
-
- unsigned size = 0;
- for (auto &opstr : str.values)
- {
- size += opstr.length;
- if (opstr.op == OpCode_callsubr || opstr.op == OpCode_callgsubr)
- size += 3;
- }
- if (!buff.alloc (buff.length + size))
- return false;
-
- for (auto &opstr : str.values)
+ for (unsigned int i = 0; i < count; i++)
{
- if (hinting || !opstr.is_hinting ())
+ const parsed_cs_op_t &opstr = str.values[i];
+ if (!opstr.for_drop () && !opstr.for_skip ())
{
switch (opstr.op)
{
case OpCode_callsubr:
encoder.encode_int (remaps.local_remaps[fd].biased_num (opstr.subr_num));
- encoder.copy_str (opstr.ptr, opstr.length);
+ encoder.encode_op (OpCode_callsubr);
break;
case OpCode_callgsubr:
encoder.encode_int (remaps.global_remap.biased_num (opstr.subr_num));
- encoder.copy_str (opstr.ptr, opstr.length);
+ encoder.encode_op (OpCode_callgsubr);
break;
default:
- encoder.copy_str (opstr.ptr, opstr.length);
+ encoder.copy_str (opstr.str);
break;
}
}
}
- return !encoder.in_error ();
- }
-
- void compact_parsed_strings () const
- {
- for (auto &cs : parsed_charstrings)
- compact_string (cs);
- for (auto &cs : parsed_global_subrs_storage)
- compact_string (cs);
- for (auto &vec : parsed_local_subrs_storage)
- for (auto &cs : vec)
- compact_string (cs);
- }
-
- static void compact_string (parsed_cs_str_t &str)
- {
- unsigned count = str.values.length;
- if (unlikely (!count)) return;
- auto &opstr = str.values.arrayZ;
- unsigned j = 0;
- for (unsigned i = 1; i < count; i++)
- {
- /* See if we can combine op j and op i. */
- bool combine =
- (opstr[j].op != OpCode_callsubr && opstr[j].op != OpCode_callgsubr) &&
- (opstr[i].op != OpCode_callsubr && opstr[i].op != OpCode_callgsubr) &&
- (opstr[j].is_hinting () == opstr[i].is_hinting ()) &&
- (opstr[j].ptr + opstr[j].length == opstr[i].ptr) &&
- (opstr[j].length + opstr[i].length <= 255);
-
- if (combine)
- {
- opstr[j].length += opstr[i].length;
- opstr[j].op = OpCode_Invalid;
- }
- else
- {
- opstr[++j] = opstr[i];
- }
- }
- str.values.shrink (j + 1);
- }
-
- void populate_subset_accelerator () const
- {
- if (!plan->inprogress_accelerator) return;
-
- compact_parsed_strings ();
-
- plan->inprogress_accelerator->cff_accelerator =
- cff_subset_accelerator_t::create(acc.blob,
- parsed_charstrings,
- parsed_global_subrs_storage,
- parsed_local_subrs_storage);
- plan->inprogress_accelerator->destroy_cff_accelerator =
- cff_subset_accelerator_t::destroy;
-
- }
-
- const parsed_cs_str_t& get_parsed_charstring (unsigned i) const
- {
- if (cached_charstrings) return *(cached_charstrings[i]);
- return parsed_charstrings[i];
+ return !encoder.is_error ();
}
protected:
@@ -1070,17 +897,13 @@ struct subr_subsetter_t
subr_closures_t closures;
- hb_vector_t<const parsed_cs_str_t*> cached_charstrings;
- const parsed_cs_str_vec_t* parsed_global_subrs;
- const hb_vector_t<parsed_cs_str_vec_t>* parsed_local_subrs;
+ parsed_cs_str_vec_t parsed_charstrings;
+ parsed_cs_str_vec_t parsed_global_subrs;
+ hb_vector_t<parsed_cs_str_vec_t> parsed_local_subrs;
subr_remaps_t remaps;
private:
-
- parsed_cs_str_vec_t parsed_charstrings;
- parsed_cs_str_vec_t parsed_global_subrs_storage;
- hb_vector_t<parsed_cs_str_vec_t> parsed_local_subrs_storage;
typedef typename SUBRS::count_type subr_count_type;
};
diff --git a/src/hb-subset-cff1.cc b/src/hb-subset-cff1.cc
index 538f28f5a..52bb13d32 100644
--- a/src/hb-subset-cff1.cc
+++ b/src/hb-subset-cff1.cc
@@ -167,10 +167,9 @@ struct cff1_top_dict_op_serializer_t : cff_top_dict_op_serializer_t<cff1_top_dic
* for supplement, the original byte string is copied along with the op code */
op_str_t supp_op;
supp_op.op = op;
- if ( unlikely (!(opstr.length >= opstr.last_arg_offset + 3)))
+ if ( unlikely (!(opstr.str.length >= opstr.last_arg_offset + 3)))
return_trace (false);
- supp_op.ptr = opstr.ptr + opstr.last_arg_offset;
- supp_op.length = opstr.length - opstr.last_arg_offset;
+ supp_op.str = hb_ubytes_t (&opstr.str + opstr.last_arg_offset, opstr.str.length - opstr.last_arg_offset);
return_trace (UnsizedByteStr::serialize_int2 (c, mod.nameSIDs[name_dict_values_t::registry]) &&
UnsizedByteStr::serialize_int2 (c, mod.nameSIDs[name_dict_values_t::ordering]) &&
copy_opstr (c, supp_op));
@@ -443,17 +442,8 @@ struct cff_subset_plan {
return;
}
- hb_map_t *glyph_to_sid_map = (plan->accelerator && plan->accelerator->cff_accelerator) ?
- plan->accelerator->cff_accelerator->glyph_to_sid_map :
- nullptr;
- bool created_map = false;
- if (!glyph_to_sid_map &&
- ((plan->accelerator && plan->accelerator->cff_accelerator) ||
- plan->num_output_glyphs () > plan->source->get_num_glyphs () / 8.))
- {
- created_map = true;
- glyph_to_sid_map = acc.create_glyph_to_sid_map ();
- }
+ bool use_glyph_to_sid_map = plan->num_output_glyphs () > plan->source->get_num_glyphs () / 8.;
+ hb_map_t *glyph_to_sid_map = use_glyph_to_sid_map ? acc.create_glyph_to_sid_map () : nullptr;
unsigned int glyph;
for (glyph = 1; glyph < plan->num_output_glyphs (); glyph++)
@@ -477,12 +467,8 @@ struct cff_subset_plan {
last_sid = sid;
}
- if (created_map)
- {
- if (!(plan->accelerator && plan->accelerator->cff_accelerator) ||
- !plan->accelerator->cff_accelerator->glyph_to_sid_map.cmpexch (nullptr, glyph_to_sid_map))
- hb_map_destroy (glyph_to_sid_map);
- }
+ if (glyph_to_sid_map)
+ hb_map_destroy (glyph_to_sid_map);
bool two_byte = subset_charset_ranges.complete (glyph);
@@ -742,17 +728,11 @@ static bool _serialize_cff1 (hb_serialize_context_t *c,
/* CharStrings */
{
- c->push<CFF1CharStrings> ();
-
- unsigned total_size = CFF1CharStrings::total_size (plan.subset_charstrings);
- if (unlikely (!c->start_zerocopy (total_size)))
- return false;
-
CFF1CharStrings *cs = c->start_embed<CFF1CharStrings> ();
if (unlikely (!cs)) return false;
-
+ c->push ();
if (likely (cs->serialize (c, plan.subset_charstrings)))
- plan.info.char_strings_link = c->pop_pack (false);
+ plan.info.char_strings_link = c->pop_pack ();
else
{
c->pop_discard ();
@@ -835,7 +815,7 @@ static bool _serialize_cff1 (hb_serialize_context_t *c,
CFF1Subrs *dest = c->start_embed <CFF1Subrs> ();
if (unlikely (!dest)) return false;
if (likely (dest->serialize (c, plan.subset_globalsubrs)))
- c->pop_pack (false);
+ c->pop_pack ();
else
{
c->pop_discard ();
diff --git a/src/hb-subset-cff2.cc b/src/hb-subset-cff2.cc
index 60946b028..08e820efc 100644
--- a/src/hb-subset-cff2.cc
+++ b/src/hb-subset-cff2.cc
@@ -334,7 +334,7 @@ static bool _serialize_cff2 (hb_serialize_context_t *c,
if (unlikely (!dest)) return false;
c->push ();
if (likely (dest->serialize (c, plan.subset_localsubrs[i])))
- subrs_link = c->pop_pack (false);
+ subrs_link = c->pop_pack ();
else
{
c->pop_discard ();
@@ -361,17 +361,11 @@ static bool _serialize_cff2 (hb_serialize_context_t *c,
/* CharStrings */
{
- c->push ();
-
- unsigned total_size = CFF2CharStrings::total_size (plan.subset_charstrings);
- if (unlikely (!c->start_zerocopy (total_size)))
- return false;
-
CFF2CharStrings *cs = c->start_embed<CFF2CharStrings> ();
if (unlikely (!cs)) return false;
-
+ c->push ();
if (likely (cs->serialize (c, plan.subset_charstrings)))
- plan.info.char_strings_link = c->pop_pack (false);
+ plan.info.char_strings_link = c->pop_pack ();
else
{
c->pop_discard ();
@@ -383,10 +377,9 @@ static bool _serialize_cff2 (hb_serialize_context_t *c,
if (acc.fdSelect != &Null (CFF2FDSelect))
{
c->push ();
- if (likely (hb_serialize_cff_fdselect (c, num_glyphs, *(const FDSelect *)acc.fdSelect,
- plan.orig_fdcount,
- plan.subset_fdselect_format, plan.subset_fdselect_size,
- plan.subset_fdselect_ranges)))
+ if (likely (hb_serialize_cff_fdselect (c, num_glyphs, *(const FDSelect *)acc.fdSelect, plan.orig_fdcount,
+ plan.subset_fdselect_format, plan.subset_fdselect_size,
+ plan.subset_fdselect_ranges)))
plan.info.fd_select.link = c->pop_pack ();
else
{
@@ -408,7 +401,7 @@ static bool _serialize_cff2 (hb_serialize_context_t *c,
hb_iter (private_dict_infos))
;
if (unlikely (!fda->serialize (c, it, fontSzr))) return false;
- plan.info.fd_array_link = c->pop_pack (false);
+ plan.info.fd_array_link = c->pop_pack ();
}
/* variation store */
@@ -417,7 +410,7 @@ static bool _serialize_cff2 (hb_serialize_context_t *c,
c->push ();
CFF2VariationStore *dest = c->start_embed<CFF2VariationStore> ();
if (unlikely (!dest || !dest->serialize (c, acc.varStore))) return false;
- plan.info.var_store_link = c->pop_pack (false);
+ plan.info.var_store_link = c->pop_pack ();
}
OT::cff2 *cff2 = c->allocate_min<OT::cff2> ();
diff --git a/src/hb-subset-input.cc b/src/hb-subset-input.cc
index 42434ae0e..fd250104b 100644
--- a/src/hb-subset-input.cc
+++ b/src/hb-subset-input.cc
@@ -26,7 +26,7 @@
#include "hb-subset.hh"
#include "hb-set.hh"
-#include "hb-utf.hh"
+
/**
* hb_subset_input_create_or_fail:
*
@@ -49,15 +49,8 @@ hb_subset_input_create_or_fail (void)
set = hb_set_create ();
input->axes_location = hb_hashmap_create<hb_tag_t, float> ();
-#ifdef HB_EXPERIMENTAL_API
- input->name_table_overrides = hb_hashmap_create<hb_ot_name_record_ids_t, hb_bytes_t> ();
-#endif
- if (!input->axes_location ||
-#ifdef HB_EXPERIMENTAL_API
- !input->name_table_overrides ||
-#endif
- input->in_error ())
+ if (!input->axes_location || input->in_error ())
{
hb_subset_input_destroy (input);
return nullptr;
@@ -255,15 +248,6 @@ hb_subset_input_destroy (hb_subset_input_t *input)
hb_hashmap_destroy (input->axes_location);
-#ifdef HB_EXPERIMENTAL_API
- if (input->name_table_overrides)
- {
- for (auto _ : *input->name_table_overrides)
- _.second.fini ();
- }
- hb_hashmap_destroy (input->name_table_overrides);
-#endif
-
hb_free (input);
}
@@ -395,6 +379,7 @@ hb_subset_input_get_user_data (const hb_subset_input_t *input,
return hb_object_get_user_data (input, key);
}
+#ifdef HB_EXPERIMENTAL_API
#ifndef HB_NO_VAR
/**
* hb_subset_input_pin_axis_to_default: (skip)
@@ -403,12 +388,9 @@ hb_subset_input_get_user_data (const hb_subset_input_t *input,
*
* Pin an axis to its default location in the given subset input object.
*
- * Currently only works for fonts with 'glyf' tables. CFF and CFF2 is not
- * yet supported. Additionally all axes in a font must be pinned.
- *
* Return value: `true` if success, `false` otherwise
*
- * Since: 6.0.0
+ * Since: EXPERIMENTAL
**/
HB_EXTERN hb_bool_t
hb_subset_input_pin_axis_to_default (hb_subset_input_t *input,
@@ -430,12 +412,9 @@ hb_subset_input_pin_axis_to_default (hb_subset_input_t *input,
*
* Pin an axis to a fixed location in the given subset input object.
*
- * Currently only works for fonts with 'glyf' tables. CFF and CFF2 is not
- * yet supported. Additionally all axes in a font must be pinned.
- *
* Return value: `true` if success, `false` otherwise
*
- * Since: 6.0.0
+ * Since: EXPERIMENTAL
**/
HB_EXTERN hb_bool_t
hb_subset_input_pin_axis_location (hb_subset_input_t *input,
@@ -451,41 +430,28 @@ hb_subset_input_pin_axis_location (hb_subset_input_t *input,
return input->axes_location->set (axis_tag, val);
}
#endif
+#endif
+#ifdef HB_EXPERIMENTAL_API
/**
- * hb_subset_preprocess:
- * @source: a #hb_face_t object.
+ * hb_subset_preprocess
+ * @input: a #hb_face_t object.
*
* Preprocesses the face and attaches data that will be needed by the
* subsetter. Future subsetting operations can then use the precomputed data
* to speed up the subsetting operation.
*
- * See [subset-preprocessing](https://github.com/harfbuzz/harfbuzz/blob/main/docs/subset-preprocessing.md)
- * for more information.
- *
- * Note: the preprocessed face may contain sub-blobs that reference the memory
- * backing the source #hb_face_t. Therefore in the case that this memory is not
- * owned by the source face you will need to ensure that memory lives
- * as long as the returned #hb_face_t.
- *
- * Returns: a new #hb_face_t.
- *
- * Since: 6.0.0
+ * Since: EXPERIMENTAL
**/
HB_EXTERN hb_face_t *
hb_subset_preprocess (hb_face_t *source)
{
hb_subset_input_t* input = hb_subset_input_create_or_fail ();
- if (!input)
- return source;
hb_set_clear (hb_subset_input_set(input, HB_SUBSET_SETS_UNICODE));
hb_set_invert (hb_subset_input_set(input, HB_SUBSET_SETS_UNICODE));
- hb_set_clear (hb_subset_input_set(input, HB_SUBSET_SETS_GLYPH_INDEX));
- hb_set_invert (hb_subset_input_set(input, HB_SUBSET_SETS_GLYPH_INDEX));
-
hb_set_clear (hb_subset_input_set(input,
HB_SUBSET_SETS_LAYOUT_FEATURE_TAG));
hb_set_invert (hb_subset_input_set(input,
@@ -501,100 +467,15 @@ hb_subset_preprocess (hb_face_t *source)
hb_set_invert (hb_subset_input_set(input,
HB_SUBSET_SETS_NAME_ID));
- hb_set_clear (hb_subset_input_set(input,
- HB_SUBSET_SETS_NAME_LANG_ID));
- hb_set_invert (hb_subset_input_set(input,
- HB_SUBSET_SETS_NAME_LANG_ID));
-
hb_subset_input_set_flags(input,
HB_SUBSET_FLAGS_NOTDEF_OUTLINE |
HB_SUBSET_FLAGS_GLYPH_NAMES |
- HB_SUBSET_FLAGS_RETAIN_GIDS |
- HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES);
+ HB_SUBSET_FLAGS_RETAIN_GIDS);
input->attach_accelerator_data = true;
- // Always use long loca in the preprocessed version. This allows
- // us to store the glyph bytes unpadded which allows the future subset
- // operation to run faster by skipping the trim padding step.
- input->force_long_loca = true;
-
hb_face_t* new_source = hb_subset_or_fail (source, input);
hb_subset_input_destroy (input);
- if (!new_source) {
- DEBUG_MSG (SUBSET, nullptr, "Preprocessing failed due to subset failure.");
- return source;
- }
-
return new_source;
}
-
-#ifdef HB_EXPERIMENTAL_API
-/**
- * hb_subset_input_override_name_table:
- * @input: a #hb_subset_input_t object.
- * @name_id: name_id of a nameRecord
- * @platform_id: platform ID of a nameRecord
- * @encoding_id: encoding ID of a nameRecord
- * @language_id: language ID of a nameRecord
- * @name_str: pointer to name string new value or null to indicate should remove
- * @str_len: the size of @name_str, or -1 if it is `NULL`-terminated
- *
- * Override the name string of the NameRecord identified by name_id,
- * platform_id, encoding_id and language_id. If a record with that name_id
- * doesn't exist, create it and insert to the name table.
- *
- * Note: for mac platform, we only support name_str with all ascii characters,
- * name_str with non-ascii characters will be ignored.
- *
- * Since: EXPERIMENTAL
- **/
-HB_EXTERN hb_bool_t
-hb_subset_input_override_name_table (hb_subset_input_t *input,
- hb_ot_name_id_t name_id,
- unsigned platform_id,
- unsigned encoding_id,
- unsigned language_id,
- const char *name_str,
- int str_len /* -1 means nul-terminated */)
-{
- if (!name_str)
- {
- str_len = 0;
- }
- else if (str_len == -1)
- {
- str_len = strlen (name_str);
- }
-
- hb_bytes_t name_bytes (nullptr, 0);
- if (str_len)
- {
- if (platform_id == 1)
- {
- const uint8_t *src = reinterpret_cast<const uint8_t*> (name_str);
- const uint8_t *src_end = src + str_len;
-
- hb_codepoint_t unicode;
- const hb_codepoint_t replacement = HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT;
- while (src < src_end)
- {
- src = hb_utf8_t::next (src, src_end, &unicode, replacement);
- if (unicode >= 0x0080u)
- {
- printf ("Non-ascii character detected, ignored...This API supports acsii characters only for mac platform\n");
- return false;
- }
- }
- }
- char *override_name = (char *) hb_malloc (str_len);
- if (unlikely (!override_name)) return false;
-
- hb_memcpy (override_name, name_str, str_len);
- name_bytes = hb_bytes_t (override_name, str_len);
- }
- input->name_table_overrides->set (hb_ot_name_record_ids_t (platform_id, encoding_id, language_id, name_id), name_bytes);
- return true;
-}
-
#endif
diff --git a/src/hb-subset-input.hh b/src/hb-subset-input.hh
index ecd47b7ab..dabb4918f 100644
--- a/src/hb-subset-input.hh
+++ b/src/hb-subset-input.hh
@@ -36,48 +36,6 @@
#include "hb-font.hh"
-struct hb_ot_name_record_ids_t
-{
- hb_ot_name_record_ids_t () = default;
- hb_ot_name_record_ids_t (unsigned platform_id_,
- unsigned encoding_id_,
- unsigned language_id_,
- unsigned name_id_)
- :platform_id (platform_id_),
- encoding_id (encoding_id_),
- language_id (language_id_),
- name_id (name_id_) {}
-
- bool operator != (const hb_ot_name_record_ids_t o) const
- { return !(*this == o); }
-
- inline bool operator == (const hb_ot_name_record_ids_t& o) const
- {
- return platform_id == o.platform_id &&
- encoding_id == o.encoding_id &&
- language_id == o.language_id &&
- name_id == o.name_id;
- }
-
- inline uint32_t hash () const
- {
- uint32_t current = 0;
- current = current * 31 + hb_hash (platform_id);
- current = current * 31 + hb_hash (encoding_id);
- current = current * 31 + hb_hash (language_id);
- current = current * 31 + hb_hash (name_id);
- return current;
- }
-
- unsigned platform_id;
- unsigned encoding_id;
- unsigned language_id;
- unsigned name_id;
-};
-
-typedef struct hb_ot_name_record_ids_t hb_ot_name_record_ids_t;
-
-
HB_MARK_AS_FLAG_T (hb_subset_flags_t);
struct hb_subset_input_t
@@ -102,14 +60,7 @@ struct hb_subset_input_t
unsigned flags;
bool attach_accelerator_data = false;
-
- // If set loca format will always be the long version.
- bool force_long_loca = false;
-
hb_hashmap_t<hb_tag_t, float> *axes_location;
-#ifdef HB_EXPERIMENTAL_API
- hb_hashmap_t<hb_ot_name_record_ids_t, hb_bytes_t> *name_table_overrides;
-#endif
inline unsigned num_sets () const
{
@@ -129,11 +80,7 @@ struct hb_subset_input_t
return true;
}
- return axes_location->in_error ()
-#ifdef HB_EXPERIMENTAL_API
- || name_table_overrides->in_error ()
-#endif
- ;
+ return axes_location->in_error ();
}
};
diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc
index 71bc908ff..9cf7c9e43 100644
--- a/src/hb-subset-plan.cc
+++ b/src/hb-subset-plan.cc
@@ -27,7 +27,6 @@
#include "hb-subset-plan.hh"
#include "hb-subset-accelerator.hh"
#include "hb-map.hh"
-#include "hb-multimap.hh"
#include "hb-set.hh"
#include "hb-ot-cmap-table.hh"
@@ -48,7 +47,7 @@ using OT::Layout::GPOS;
typedef hb_hashmap_t<unsigned, hb::unique_ptr<hb_set_t>> script_langsys_map;
#ifndef HB_NO_SUBSET_CFF
-static inline bool
+static inline void
_add_cff_seac_components (const OT::cff1::accelerator_t &cff,
hb_codepoint_t gid,
hb_set_t *gids_to_retain)
@@ -58,9 +57,7 @@ _add_cff_seac_components (const OT::cff1::accelerator_t &cff,
{
gids_to_retain->add (base_gid);
gids_to_retain->add (accent_gid);
- return true;
}
- return false;
}
#endif
@@ -85,8 +82,10 @@ static void
_remap_indexes (const hb_set_t *indexes,
hb_map_t *mapping /* OUT */)
{
- for (auto _ : + hb_enumerate (indexes->iter ()))
- mapping->set (_.second, _.first);
+ unsigned count = indexes->get_population ();
+
+ for (auto _ : + hb_zip (indexes->iter (), hb_range (count)))
+ mapping->set (_.first, _.second);
}
@@ -345,9 +344,7 @@ _get_hb_font_with_variations (const hb_subset_plan_t *plan)
vars.push (var);
}
-#ifndef HB_NO_VAR
hb_font_set_variations (font, vars.arrayZ, plan->user_axes_location->get_population ());
-#endif
return font;
}
@@ -524,44 +521,14 @@ _populate_unicodes_to_retain (const hb_set_t *unicodes,
cmap_unicodes = &plan->accelerator->unicodes;
}
- if (plan->accelerator &&
- unicodes->get_population () < cmap_unicodes->get_population () &&
- glyphs->get_population () < cmap_unicodes->get_population ())
- {
- auto &gid_to_unicodes = plan->accelerator->gid_to_unicodes;
- for (hb_codepoint_t gid : *glyphs)
- {
- auto unicodes = gid_to_unicodes.get (gid);
-
- for (hb_codepoint_t cp : unicodes)
- {
- plan->codepoint_to_glyph->set (cp, gid);
- plan->unicode_to_new_gid_list.push (hb_pair (cp, gid));
- }
- }
- for (hb_codepoint_t cp : *unicodes)
- {
- /* Don't double-add entry. */
- if (plan->codepoint_to_glyph->has (cp))
- continue;
-
- hb_codepoint_t gid = (*unicode_glyphid_map)[cp];
- plan->codepoint_to_glyph->set (cp, gid);
- plan->unicode_to_new_gid_list.push (hb_pair (cp, gid));
- }
- plan->unicode_to_new_gid_list.qsort ();
- }
- else
+ for (hb_codepoint_t cp : *cmap_unicodes)
{
- for (hb_codepoint_t cp : *cmap_unicodes)
- {
- hb_codepoint_t gid = (*unicode_glyphid_map)[cp];
- if (!unicodes->has (cp) && !glyphs->has (gid))
- continue;
+ hb_codepoint_t gid = (*unicode_glyphid_map)[cp];
+ if (!unicodes->has (cp) && !glyphs->has (gid))
+ continue;
- plan->codepoint_to_glyph->set (cp, gid);
- plan->unicode_to_new_gid_list.push (hb_pair (cp, gid));
- }
+ plan->codepoint_to_glyph->set (cp, gid);
+ plan->unicode_to_new_gid_list.push (hb_pair (cp, gid));
}
/* Add gids which where requested, but not mapped in cmap */
@@ -672,15 +639,9 @@ _populate_gids_to_retain (hb_subset_plan_t* plan,
else
plan->_glyphset->union_ (cur_glyphset);
#ifndef HB_NO_SUBSET_CFF
- if (!plan->accelerator || plan->accelerator->has_seac)
- {
- bool has_seac = false;
- if (cff.is_valid ())
- for (hb_codepoint_t gid : cur_glyphset)
- if (_add_cff_seac_components (cff, gid, plan->_glyphset))
- has_seac = true;
- plan->has_seac = has_seac;
- }
+ if (cff.is_valid ())
+ for (hb_codepoint_t gid : cur_glyphset)
+ _add_cff_seac_components (cff, gid, plan->_glyphset);
#endif
_remove_invalid_gids (plan->_glyphset, plan->source->get_num_glyphs ());
@@ -887,28 +848,9 @@ hb_subset_plan_create_or_fail (hb_face_t *face,
plan->check_success (plan->vmtx_map = hb_hashmap_create<unsigned, hb_pair_t<unsigned, int>> ());
plan->check_success (plan->hmtx_map = hb_hashmap_create<unsigned, hb_pair_t<unsigned, int>> ());
-#ifdef HB_EXPERIMENTAL_API
- plan->check_success (plan->name_table_overrides = hb_hashmap_create<hb_ot_name_record_ids_t, hb_bytes_t> ());
- if (plan->name_table_overrides && input->name_table_overrides)
- {
- for (auto _ : *input->name_table_overrides)
- {
- hb_bytes_t name_bytes = _.second;
- unsigned len = name_bytes.length;
- char *name_str = (char *) hb_malloc (len);
- if (unlikely (!plan->check_success (name_str)))
- break;
-
- hb_memcpy (name_str, name_bytes.arrayZ, len);
- plan->name_table_overrides->set (_.first, hb_bytes_t (name_str, len));
- }
- }
-#endif
-
void* accel = hb_face_get_user_data(face, hb_subset_accelerator_t::user_data_key());
plan->attach_accelerator_data = input->attach_accelerator_data;
- plan->force_long_loca = input->force_long_loca;
if (accel)
plan->accelerator = (hb_subset_accelerator_t*) accel;
@@ -951,28 +893,6 @@ hb_subset_plan_create_or_fail (hb_face_t *face,
hb_subset_plan_destroy (plan);
return nullptr;
}
-
-
- if (plan->attach_accelerator_data)
- {
- hb_multimap_t gid_to_unicodes;
-
- hb_map_t &unicode_to_gid = *plan->codepoint_to_glyph;
-
- for (auto unicode : *plan->unicodes)
- {
- auto gid = unicode_to_gid[unicode];
- gid_to_unicodes.add (gid, unicode);
- }
-
- plan->inprogress_accelerator =
- hb_subset_accelerator_t::create (*plan->codepoint_to_glyph,
- gid_to_unicodes,
- *plan->unicodes,
- plan->has_seac);
- }
-
-
return plan;
}
diff --git a/src/hb-subset-plan.hh b/src/hb-subset-plan.hh
index 1b2aee782..15fabba9c 100644
--- a/src/hb-subset-plan.hh
+++ b/src/hb-subset-plan.hh
@@ -87,18 +87,6 @@ struct hb_subset_plan_t
hb_hashmap_destroy (vmtx_map);
hb_hashmap_destroy (layout_variation_idx_delta_map);
-#ifdef HB_EXPERIMENTAL_API
- if (name_table_overrides)
- {
- for (auto _ : *name_table_overrides)
- _.second.fini ();
- }
- hb_hashmap_destroy (name_table_overrides);
-#endif
-
- if (inprogress_accelerator)
- hb_subset_accelerator_t::destroy ((void*) inprogress_accelerator);
-
if (user_axes_location)
{
hb_object_destroy (user_axes_location);
@@ -111,11 +99,10 @@ struct hb_subset_plan_t
bool successful;
unsigned flags;
bool attach_accelerator_data = false;
- bool force_long_loca = false;
// For each cp that we'd like to retain maps to the corresponding gid.
hb_set_t *unicodes;
- hb_sorted_vector_t<hb_pair_t<hb_codepoint_t, hb_codepoint_t>> unicode_to_new_gid_list;
+ hb_vector_t<hb_pair_t<hb_codepoint_t, hb_codepoint_t>> unicode_to_new_gid_list;
// name_ids we would like to retain
hb_set_t *name_ids;
@@ -198,41 +185,31 @@ struct hb_subset_plan_t
hb_map_t *axes_old_index_tag_map;
bool all_axes_pinned;
bool pinned_at_default;
- bool has_seac;
//hmtx metrics map: new gid->(advance, lsb)
hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *hmtx_map;
//vmtx metrics map: new gid->(advance, lsb)
hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *vmtx_map;
-#ifdef HB_EXPERIMENTAL_API
- // name table overrides map: hb_ot_name_record_ids_t-> name string new value or
- // None to indicate should remove
- hb_hashmap_t<hb_ot_name_record_ids_t, hb_bytes_t> *name_table_overrides;
-#endif
-
const hb_subset_accelerator_t* accelerator;
- hb_subset_accelerator_t* inprogress_accelerator;
public:
template<typename T>
hb_blob_ptr_t<T> source_table()
{
- hb_lock_t (accelerator ? &accelerator->sanitized_table_cache_lock : nullptr);
-
- auto *cache = accelerator ? &accelerator->sanitized_table_cache : sanitized_table_cache;
- if (cache
- && !cache->in_error ()
- && cache->has (+T::tableTag)) {
- return hb_blob_reference (cache->get (+T::tableTag).get ());
+ if (sanitized_table_cache
+ && !sanitized_table_cache->in_error ()
+ && sanitized_table_cache->has (T::tableTag)) {
+ return hb_blob_reference (sanitized_table_cache->get (T::tableTag).get ());
}
hb::unique_ptr<hb_blob_t> table_blob {hb_sanitize_context_t ().reference_table<T> (source)};
hb_blob_t* ret = hb_blob_reference (table_blob.get ());
- if (likely (cache))
- cache->set (+T::tableTag, std::move (table_blob));
+ if (likely (sanitized_table_cache))
+ sanitized_table_cache->set (T::tableTag,
+ std::move (table_blob));
return ret;
}
diff --git a/src/hb-subset.cc b/src/hb-subset.cc
index 186b12dbb..6026aa6ef 100644
--- a/src/hb-subset.cc
+++ b/src/hb-subset.cc
@@ -82,10 +82,6 @@ using OT::Layout::GPOS;
* retain glyph ids option and configure the subset to pass through the layout tables untouched.
*/
-
-hb_user_data_key_t _hb_subset_accelerator_user_data_key = {};
-
-
/*
* The list of tables in the open type spec. Used to check for tables that may need handling
* if we are unable to list the tables in a face.
@@ -413,14 +409,20 @@ _passthrough (hb_subset_plan_t *plan, hb_tag_t tag)
static bool
_dependencies_satisfied (hb_subset_plan_t *plan, hb_tag_t tag,
- const hb_set_t &subsetted_tags,
- const hb_set_t &pending_subset_tags)
+ hb_set_t &visited_set, hb_set_t &revisit_set)
{
switch (tag)
{
case HB_OT_TAG_hmtx:
case HB_OT_TAG_vmtx:
- return plan->pinned_at_default || !pending_subset_tags.has (HB_OT_TAG_glyf);
+ if (!plan->pinned_at_default &&
+ !visited_set.has (HB_OT_TAG_glyf))
+ {
+ revisit_set.add (tag);
+ return false;
+ }
+ return true;
+
default:
return true;
}
@@ -493,14 +495,12 @@ _subset_table (hb_subset_plan_t *plan,
}
}
-static void _attach_accelerator_data (hb_subset_plan_t* plan,
+static void _attach_accelerator_data (const hb_subset_plan_t* plan,
hb_face_t* face /* IN/OUT */)
{
- if (!plan->inprogress_accelerator) return;
-
- // Transfer the accelerator from the plan to us.
- hb_subset_accelerator_t* accel = plan->inprogress_accelerator;
- plan->inprogress_accelerator = nullptr;
+ hb_subset_accelerator_t* accel =
+ hb_subset_accelerator_t::create (*plan->codepoint_to_glyph,
+ *plan->unicodes);
if (accel->in_error ())
{
@@ -508,11 +508,6 @@ static void _attach_accelerator_data (hb_subset_plan_t* plan,
return;
}
- // Populate caches that need access to the final tables.
- hb_blob_ptr_t<OT::cmap> cmap_ptr (hb_sanitize_context_t ().reference_table<OT::cmap> (face));
- accel->cmap_cache = OT::cmap::create_filled_cache (cmap_ptr);
- accel->destroy_cmap_cache = OT::SubtableUnicodesCache::destroy;
-
if (!hb_face_set_user_data(face,
hb_subset_accelerator_t::user_data_key(),
accel,
@@ -566,63 +561,41 @@ hb_subset_plan_execute_or_fail (hb_subset_plan_t *plan)
return nullptr;
}
+ hb_set_t tags_set, revisit_set;
+ bool success = true;
hb_tag_t table_tags[32];
unsigned offset = 0, num_tables = ARRAY_LENGTH (table_tags);
+ hb_vector_t<char> buf;
+ buf.alloc (4096 - 16);
- hb_set_t subsetted_tags, pending_subset_tags;
while (((void) _get_table_tags (plan, offset, &num_tables, table_tags), num_tables))
{
for (unsigned i = 0; i < num_tables; ++i)
{
hb_tag_t tag = table_tags[i];
- if (_should_drop_table (plan, tag)) continue;
- pending_subset_tags.add (tag);
- }
-
- offset += num_tables;
- }
-
- hb_vector_t<char> buf;
- buf.alloc (4096 - 16);
-
-
- bool success = true;
-
- while (!pending_subset_tags.is_empty ())
- {
- if (subsetted_tags.in_error ()
- || pending_subset_tags.in_error ()) {
- success = false;
- goto end;
- }
-
- bool made_changes = false;
- for (hb_tag_t tag : pending_subset_tags)
- {
- if (!_dependencies_satisfied (plan, tag,
- subsetted_tags,
- pending_subset_tags))
- {
- // delayed subsetting for some tables since they might have dependency on other tables
- // in some cases: e.g: during instantiating glyf tables, hmetrics/vmetrics are updated
- // and saved in subset plan, hmtx/vmtx subsetting need to use these updated metrics values
- continue;
- }
-
- pending_subset_tags.del (tag);
- subsetted_tags.add (tag);
- made_changes = true;
-
+ if (_should_drop_table (plan, tag) && !tags_set.has (tag)) continue;
+ if (!_dependencies_satisfied (plan, tag, tags_set, revisit_set)) continue;
+ tags_set.add (tag);
success = _subset_table (plan, buf, tag);
if (unlikely (!success)) goto end;
}
- if (!made_changes)
+ /*delayed subsetting for some tables since they might have dependency on other tables in some cases:
+ e.g: during instantiating glyf tables, hmetrics/vmetrics are updated and saved in subset plan,
+ hmtx/vmtx subsetting need to use these updated metrics values*/
+ while (!revisit_set.is_empty ())
{
- DEBUG_MSG (SUBSET, nullptr, "Table dependencies unable to be satisfied. Subset failed.");
- success = false;
- goto end;
+ hb_set_t revisit_temp;
+ for (hb_tag_t tag : revisit_set)
+ {
+ if (!_dependencies_satisfied (plan, tag, tags_set, revisit_temp)) continue;
+ tags_set.add (tag);
+ success = _subset_table (plan, buf, tag);
+ if (unlikely (!success)) goto end;
+ }
+ revisit_set = revisit_temp;
}
+ offset += num_tables;
}
if (success && plan->attach_accelerator_data) {
diff --git a/src/hb-subset.h b/src/hb-subset.h
index b83264ea5..6a2c5f611 100644
--- a/src/hb-subset.h
+++ b/src/hb-subset.h
@@ -28,7 +28,6 @@
#define HB_SUBSET_H
#include "hb.h"
-#include "hb-ot.h"
HB_BEGIN_DECLS
@@ -165,6 +164,8 @@ HB_EXTERN void
hb_subset_input_set_flags (hb_subset_input_t *input,
unsigned value);
+#ifdef HB_EXPERIMENTAL_API
+#ifndef HB_NO_VAR
HB_EXTERN hb_bool_t
hb_subset_input_pin_axis_to_default (hb_subset_input_t *input,
hb_face_t *face,
@@ -175,22 +176,16 @@ hb_subset_input_pin_axis_location (hb_subset_input_t *input,
hb_face_t *face,
hb_tag_t axis_tag,
float axis_value);
+#endif
+#endif
#ifdef HB_EXPERIMENTAL_API
-HB_EXTERN hb_bool_t
-hb_subset_input_override_name_table (hb_subset_input_t *input,
- hb_ot_name_id_t name_id,
- unsigned platform_id,
- unsigned encoding_id,
- unsigned language_id,
- const char *name_str,
- int str_len);
-
-#endif
HB_EXTERN hb_face_t *
hb_subset_preprocess (hb_face_t *source);
+#endif
+
HB_EXTERN hb_face_t *
hb_subset_or_fail (hb_face_t *source, const hb_subset_input_t *input);
diff --git a/src/hb-ucd-table.hh b/src/hb-ucd-table.hh
index f7d76eee1..a372a4afc 100644
--- a/src/hb-ucd-table.hh
+++ b/src/hb-ucd-table.hh
@@ -1069,7 +1069,7 @@ _hb_ucd_dm2_u64_map[388] =
#ifndef HB_OPTIMIZE_SIZE
static const uint8_t
-_hb_ucd_u8[17868] =
+_hb_ucd_u8[18260] =
{
0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 9, 10, 7, 7, 7, 7, 11, 12, 13, 13, 13, 14,
@@ -1535,167 +1535,191 @@ _hb_ucd_u8[17868] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0,
0, 0, 38, 39, 0, 0, 0, 0, 0, 0, 40, 41, 42, 0, 43, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0,
- 0, 0, 3, 0, 0, 0, 4, 5, 6, 7, 0, 8, 9, 10, 0, 11,
- 12, 13, 14, 15, 16, 17, 16, 18, 16, 19, 16, 19, 16, 19, 0, 19,
- 16, 20, 16, 19, 21, 19, 0, 22, 23, 24, 25, 26, 27, 28, 29, 30,
- 31, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0,
- 0, 0, 0, 0, 34, 0, 0, 35, 0, 0, 36, 0, 37, 0, 0, 0,
- 38, 39, 40, 41, 42, 43, 44, 45, 46, 0, 0, 47, 0, 0, 0, 48,
- 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 51, 0, 52,
- 53, 0, 54, 0, 0, 0, 0, 0, 0, 55, 56, 57, 0, 0, 0, 0,
- 58, 0, 0, 59, 60, 61, 62, 63, 0, 0, 64, 65, 0, 0, 0, 66,
- 0, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 0,
- 72, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0,
- 0, 0, 75, 76, 0, 77, 78, 0, 0, 79, 80, 0, 81, 62, 0, 82,
- 83, 0, 0, 84, 85, 86, 0, 0, 0, 87, 0, 88, 0, 0, 51, 89,
- 51, 0, 90, 0, 91, 0, 0, 0, 80, 0, 0, 0, 92, 93, 0, 94,
- 95, 96, 97, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 98, 99, 0,
- 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0,101,102, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0,103, 0, 0,104, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,105,106, 0, 0,107, 0, 0, 0, 0, 0, 0,
- 108, 0,109, 0,102, 0, 0, 0, 0, 0,110,111, 0, 0, 0, 0,
- 0, 0, 0,112, 0, 0, 0, 0, 0, 0, 0,113, 0,114, 0, 0,
- 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 0, 0, 0,
- 0, 9, 10, 11, 12, 0, 0, 0, 0, 13, 0, 0, 14, 15, 0, 16,
- 0, 17, 18, 0, 0, 19, 0, 20, 21, 0, 0, 0, 0, 0, 22, 23,
- 0, 24, 25, 0, 0, 26, 0, 0, 0, 27, 0, 0, 28, 29, 30, 31,
- 0, 0, 0, 32, 33, 34, 0, 0, 33, 0, 0, 35, 33, 0, 0, 0,
- 33, 36, 0, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 39,
- 40, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, 43, 0, 44,
- 0, 0, 0, 45, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 48,
- 49, 0, 0, 0, 0, 50, 0, 0, 0, 51, 0, 52, 0, 53, 0, 0,
- 0, 0, 54, 0, 0, 0, 0, 55, 0, 56, 0, 0, 0, 0, 57, 58,
- 0, 0, 0, 59, 60, 0, 0, 0, 0, 0, 0, 61, 52, 0, 62, 63,
- 0, 0, 64, 0, 0, 0, 65, 66, 0, 0, 0, 67, 0, 68, 69, 70,
- 71, 72, 1, 73, 0, 74, 75, 76, 0, 0, 77, 78, 0, 0, 0, 79,
- 0, 0, 1, 1, 0, 0, 80, 0, 0, 81, 0, 0, 0, 0, 77, 82,
- 0, 83, 0, 0, 0, 0, 0, 78, 84, 0, 85, 0, 52, 0, 1, 78,
- 0, 0, 86, 0, 0, 87, 0, 0, 0, 0, 0, 88, 57, 0, 0, 0,
- 0, 0, 0, 89, 90, 0, 0, 84, 0, 0, 33, 0, 0, 91, 0, 0,
- 0, 0, 92, 0, 0, 0, 0, 49, 0, 0, 93, 0, 0, 0, 0, 94,
- 95, 0, 0, 96, 0, 0, 97, 0, 0, 0, 98, 0, 0, 0, 99, 0,
- 0, 0, 0,100,101, 93, 0, 0,102, 0, 0, 0, 84, 0, 0,103,
- 0, 0, 0,104,105, 0, 0,106,107, 0, 0, 0, 0, 0, 0,108,
- 0, 0,109, 0, 0, 0, 0,110, 33, 0,111,112,113, 35, 0, 0,
- 114, 0, 0, 0,115, 0, 0, 0, 0, 0, 0,116, 0, 0,117, 0,
- 0, 0, 0,118, 88, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 52,
- 119, 0, 0, 0, 0,120, 0, 0,121, 0, 0, 0, 0,119, 0, 0,
- 122, 0, 0, 0, 0, 0, 0,123, 0, 0, 0,124, 0, 0, 0,125,
- 0,126, 0, 0, 0, 0,127,128,129, 0,130, 0,131, 0, 0, 0,
- 132,133,134, 0, 77, 0, 0, 0, 0, 0, 35, 0, 0, 0,135, 0,
- 0, 0,136, 0, 0,137, 0, 0,138, 0, 0, 0, 0, 0, 0, 0,
- 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 4, 4, 8, 9, 10,
- 1, 11, 12, 13, 14, 15, 16, 17, 18, 1, 1, 1, 19, 1, 0, 0,
- 20, 21, 22, 1, 23, 4, 21, 24, 25, 26, 27, 28, 29, 30, 0, 0,
- 1, 1, 31, 0, 0, 0, 32, 33, 34, 35, 1, 36, 37, 0, 0, 0,
- 0, 38, 1, 39, 14, 39, 40, 41, 42, 0, 0, 0, 43, 36, 44, 45,
- 21, 45, 46, 0, 0, 0, 19, 1, 21, 0, 0, 47, 0, 38, 48, 1,
- 1, 49, 49, 50, 0, 0, 51, 0, 0, 0, 52, 1, 0, 0, 38, 14,
- 4, 1, 1, 1, 53, 21, 43, 52, 54, 21, 35, 1, 0, 0, 0, 55,
- 0, 0, 0, 56, 57, 58, 0, 0, 0, 0, 0, 59, 0, 60, 0, 0,
- 0, 0, 61, 62, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 65, 0,
- 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 69, 70, 0,
- 71, 72, 73, 74, 75, 76, 0, 0, 0, 77, 0, 0, 0, 78, 79, 0,
- 0, 0, 0, 47, 0, 0, 0, 49, 0, 80, 0, 0, 0, 62, 0, 0,
- 63, 0, 0, 81, 0, 0, 82, 0, 0, 0, 83, 0, 0, 19, 84, 0,
- 62, 0, 0, 0, 0, 49, 1, 85, 1, 52, 15, 86, 36, 10, 21, 87,
- 0, 55, 0, 0, 0, 0, 19, 10, 1, 0, 0, 0, 0, 0, 88, 0,
- 0, 89, 0, 0, 88, 0, 0, 0, 0, 78, 0, 0, 87, 9, 12, 4,
- 90, 8, 91, 47, 0, 58, 50, 0, 21, 1, 21, 92, 93, 1, 1, 1,
- 1, 94, 95, 96, 97, 1, 98, 58, 81, 99,100, 4, 58, 0, 0, 0,
- 0, 0, 0, 19, 50, 0, 0, 0, 0, 0, 0, 61, 0, 0,101,102,
- 0, 0,103, 0, 0, 1, 1, 50, 0, 0, 0, 38, 0, 63, 0, 0,
- 0, 0, 0, 62, 0, 0,104, 68, 61, 0, 0, 0, 78, 0, 0, 0,
- 105,106, 58, 38, 81, 0, 0, 0, 0, 0, 0,107, 1, 14, 4, 12,
- 84, 0, 0, 0, 0, 38, 87, 0, 0, 0, 0,108, 0, 0,109, 61,
- 0,110, 0, 0, 0, 1, 0, 0, 0, 0, 19, 58, 0, 0, 0, 51,
- 0,111, 14, 52,112, 41, 0, 0, 62, 0, 0, 61, 0, 0,113, 0,
- 87, 0, 0, 0, 61, 62, 0, 0, 62, 0, 89, 0, 0,113, 0, 0,
- 0, 0,114, 0, 0, 0, 78, 55, 0, 38, 1, 58, 1, 58, 0, 0,
- 63, 89, 0, 0,115, 0, 0, 0, 55, 0, 0, 0, 0,115, 0, 0,
- 0, 0, 61, 0, 0, 0, 0, 79, 0, 61, 0, 0, 0, 0, 56, 0,
- 89, 80, 0, 0, 79, 0, 0, 0, 8, 91, 0, 0, 1, 87, 0, 0,
- 116, 0, 0, 0, 0, 0, 0,117, 0,118,119,120,121, 0,104, 4,
- 122, 49, 23, 0, 0, 0, 38, 50, 38, 58, 0, 0, 1, 87, 1, 1,
- 1, 1, 39, 1, 48,105, 87, 0, 0, 0, 0, 1, 0, 0, 0,123,
- 4,122, 0, 0, 0, 1,124, 0, 0, 0, 0, 0,230,230,230,230,
- 230,232,220,220,220,220,232,216,220,220,220,220,220,202,202,220,
- 220,220,220,202,202,220,220,220, 1, 1, 1, 1, 1,220,220,220,
- 220,230,230,230,230,240,230,220,220,220,230,230,230,220,220, 0,
- 230,230,230,220,220,220,220,230,232,220,220,230,233,234,234,233,
- 234,234,233,230, 0, 0, 0,230, 0,220,230,230,230,230,220,230,
- 230,230,222,220,230,230,220,220,230,222,228,230, 10, 11, 12, 13,
- 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 0, 23, 0, 24, 25, 0,
- 230,220, 0, 18, 30, 31, 32, 0, 0, 0, 0, 27, 28, 29, 30, 31,
- 32, 33, 34,230,230,220,220,230,220,230,230,220, 35, 0, 0, 0,
- 0, 0,230,230,230, 0, 0,230,230, 0,220,230,230,220, 0, 0,
- 0, 36, 0, 0,230,220,230,230,220,220,230,220,220,230,220,230,
- 220,230,230, 0, 0,220, 0, 0,230,230, 0,230, 0,230,230,230,
- 230,230, 0, 0, 0,220,220,220,230,220,220,220,230,230, 0,220,
- 27, 28, 29,230, 7, 0, 0, 0, 0, 9, 0, 0, 0,230,220,230,
- 230, 0, 0, 0, 0, 0,230, 0, 0, 84, 91, 0, 0, 0, 0, 9,
- 9, 0, 0, 0, 0, 0, 9, 0,103,103, 9, 0,107,107,107,107,
- 118,118, 9, 0,122,122,122,122,220,220, 0, 0, 0,220, 0,220,
- 0,216, 0, 0, 0,129,130, 0,132, 0, 0, 0, 0, 0,130,130,
- 130,130, 0, 0,130, 0,230,230, 9, 0,230,230, 0, 0,220, 0,
- 0, 0, 0, 7, 0, 9, 9, 0, 9, 9, 0, 0, 0,230, 0, 0,
- 0,228, 0, 0, 0,222,230,220,220, 0, 0, 0,230, 0, 0,220,
- 230,220, 0,220,230,230,230, 0, 0, 0, 9, 9, 0, 0, 7, 0,
- 230, 0, 1, 1, 1, 0, 0, 0,230,234,214,220,202,230,230,230,
- 230,230,232,228,228,220,218,230,233,220,230,220,230,230, 1, 1,
- 1, 1, 1,230, 0, 1, 1,230,220,230, 1, 1, 0, 0,218,228,
- 232,222,224,224, 0, 8, 8, 0, 0, 0, 0,220,230, 0,230,230,
- 220, 0, 0,230, 0, 0, 26, 0, 0,220, 0,230,230, 1,220, 0,
- 0,230,220, 0, 0, 0,220,220, 0, 0,230,220, 0, 9, 7, 0,
- 0, 7, 9, 0, 0, 0, 9, 7, 6, 6, 0, 0, 0, 0, 1, 0,
- 0,216,216, 1, 1, 1, 0, 0, 0,226,216,216,216,216,216, 0,
- 220,220,220, 0,232,232,220,230,230,230, 7, 0, 16, 17, 17, 17,
- 17, 17, 17, 33, 17, 17, 17, 19, 17, 17, 17, 17, 20,101, 17,113,
- 129,169, 17, 27, 28, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0,
+ 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 0,
+ 9, 0, 10, 11, 0, 0, 12, 13, 14, 15, 16, 0, 0, 0, 0, 17,
+ 18, 19, 20, 0, 21, 0, 22, 23, 0, 24, 25, 0, 0, 24, 26, 27,
+ 0, 24, 26, 0, 0, 24, 26, 0, 0, 24, 26, 0, 0, 0, 26, 0,
+ 0, 24, 28, 0, 0, 24, 26, 0, 0, 29, 26, 0, 0, 0, 30, 0,
+ 0, 31, 32, 0, 0, 33, 34, 0, 35, 36, 0, 37, 38, 0, 39, 0,
+ 0, 40, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 0, 0, 0, 0, 45, 0,
+ 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0,
+ 48, 0, 0, 49, 0, 50, 51, 0, 0, 52, 53, 54, 0, 55, 0, 56,
+ 0, 57, 0, 0, 0, 0, 58, 59, 0, 0, 0, 0, 0, 0, 60, 61,
+ 0, 0, 0, 0, 0, 0, 62, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 65, 0, 0, 0, 66,
+ 0, 67, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 69, 70, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0,
+ 72, 73, 0, 0, 0, 0, 53, 74, 0, 75, 76, 0, 0, 77, 78, 0,
+ 0, 0, 0, 0, 0, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, 26,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0,
+ 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,
+ 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 86, 0, 0, 0, 0,
+ 87, 88, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 91, 0, 92, 0, 0, 93, 0, 94, 0, 0, 0,
+ 0, 0, 72, 95, 0, 96, 0, 0, 97, 98, 0, 77, 0, 0, 99, 0,
+ 0,100, 0, 0, 0, 0, 0,101, 0,102, 26,103, 0, 0, 0, 0,
+ 0, 0,104, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 65,106, 0,
+ 0, 65, 0, 0, 0,107, 0, 0, 0,108, 0, 0, 0, 0, 0, 0,
+ 0, 96, 0, 0, 0, 0, 0, 0, 0,109,110, 0, 0, 0, 0, 78,
+ 0, 44,111, 0,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 65, 0, 0, 0, 0, 0, 0, 0, 0,113, 0,114, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,116, 0,117, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118,
+ 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,121,122, 0, 0,
+ 0, 0,123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 124,125, 0, 0,126, 0, 0, 0, 0,117, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,127, 0,128, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,129, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,130, 0, 0, 0,131, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 3, 4,
+ 5, 6, 7, 4, 4, 8, 9, 10, 1, 11, 12, 13, 14, 15, 16, 17,
+ 18, 1, 1, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 20, 21, 22, 1, 23, 4, 21, 24, 25, 26, 27, 28,
+ 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 31, 0,
+ 0, 0, 32, 33, 34, 35, 1, 36, 0, 0, 0, 0, 37, 0, 0, 0,
+ 0, 0, 0, 0, 0, 38, 1, 39, 14, 39, 40, 41, 0, 0, 0, 0,
+ 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 43, 36, 44, 45,
+ 21, 45, 46, 0, 0, 0, 0, 0, 0, 0, 19, 1, 21, 0, 0, 47,
+ 0, 0, 0, 0, 0, 38, 48, 1, 1, 49, 49, 50, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 52, 1,
+ 0, 0, 38, 14, 4, 1, 1, 1, 53, 21, 43, 52, 54, 21, 35, 1,
+ 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 56, 57, 58, 0, 0,
+ 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59,
+ 0, 0, 0, 56, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62,
+ 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0,
+ 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0,
+ 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0,
+ 0, 0, 0, 0, 0, 69, 70, 0, 0, 0, 0, 0, 71, 72, 73, 74,
+ 75, 76, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 78, 79, 0, 0, 0, 0, 47, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 80, 0, 0,
+ 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 63, 0, 0, 81,
+ 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0,
+ 0, 0, 0, 0, 0, 19, 84, 0, 62, 0, 0, 0, 0, 49, 1, 85,
+ 0, 0, 0, 0, 1, 52, 15, 86, 36, 10, 21, 87, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 55, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0,
+ 0, 0, 19, 10, 1, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0,
+ 0, 89, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0,
+ 0, 0, 0, 0, 87, 9, 12, 4, 90, 8, 91, 47, 0, 58, 50, 0,
+ 21, 1, 21, 92, 93, 1, 1, 1, 1, 1, 1, 1, 1, 94, 95, 96,
+ 0, 0, 0, 0, 97, 1, 98, 58, 81, 99,100, 4, 58, 0, 0, 0,
+ 0, 0, 0, 19, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61,
+ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,101,102, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,103, 0, 0, 0, 0, 19, 0, 1, 1, 50,
+ 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 50, 0, 0, 0,
+ 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0,
+ 1, 1, 1, 1, 50, 0, 0, 0, 0, 0,104, 68, 0, 0, 0, 0,
+ 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0,
+ 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105,106, 58, 38,
+ 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,107, 1, 14, 4, 12, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 47, 84, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 38, 87, 0, 0, 0, 0,108, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,109, 61, 0,110, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 19, 58, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 51, 0,111, 14, 52, 84, 0, 0, 0,
+ 112, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 61,
+ 0, 0, 0, 0, 0, 0,113, 0, 87, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 61, 62, 0, 0, 62, 0, 89, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,113, 0, 0, 0, 0,114, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 78, 55, 0, 38, 1, 58, 1, 58, 0, 0,
+ 63, 89, 0, 0, 0, 0, 0, 59,115, 0, 0, 0, 0, 0, 0, 0,
+ 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115, 0, 0,
+ 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,
+ 78, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 56, 0, 89, 80, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 61, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 8, 91, 0, 0, 0, 0, 0, 0, 1, 87, 0, 0,
+ 0, 0, 0, 0,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,117,
+ 0,118,119,120,121, 0,104, 4,122, 49, 23, 0, 0, 0, 0, 0,
+ 0, 0, 38, 50, 0, 0, 0, 0, 38, 58, 0, 0, 0, 0, 0, 0,
+ 1, 87, 1, 1, 1, 1, 39, 1, 48,105, 87, 0, 0, 0, 0, 0,
+ 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,123, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4,122, 0, 0, 0, 1,124, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,230,230,230,230,230,232,220,220,220,220,232,216,
+ 220,220,220,220,220,202,202,220,220,220,220,202,202,220,220,220,
+ 1, 1, 1, 1, 1,220,220,220,220,230,230,230,230,240,230,220,
+ 220,220,230,230,230,220,220, 0,230,230,230,220,220,220,220,230,
+ 232,220,220,230,233,234,234,233,234,234,233,230, 0, 0, 0,230,
+ 0,220,230,230,230,230,220,230,230,230,222,220,230,230,220,220,
+ 230,222,228,230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20,
+ 21, 22, 0, 23, 0, 24, 25, 0,230,220, 0, 18, 30, 31, 32, 0,
+ 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34,230,230,220,220,230,
+ 220,230,230,220, 35, 0, 0, 0, 0, 0,230,230,230, 0, 0,230,
+ 230, 0,220,230,230,220, 0, 0, 0, 36, 0, 0,230,220,230,230,
+ 220,220,230,220,220,230,220,230,220,230,230, 0, 0,220, 0, 0,
+ 230,230, 0,230, 0,230,230,230,230,230, 0, 0, 0,220,220,220,
+ 230,220,220,220,230,230, 0,220, 27, 28, 29,230, 7, 0, 0, 0,
+ 0, 9, 0, 0, 0,230,220,230,230, 0, 0, 0, 0, 0,230, 0,
+ 0, 84, 91, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 9, 0,
+ 103,103, 9, 0,107,107,107,107,118,118, 9, 0,122,122,122,122,
+ 220,220, 0, 0, 0,220, 0,220, 0,216, 0, 0, 0,129,130, 0,
+ 132, 0, 0, 0, 0, 0,130,130,130,130, 0, 0,130, 0,230,230,
+ 9, 0,230,230, 0, 0,220, 0, 0, 0, 0, 7, 0, 9, 9, 0,
+ 9, 9, 0, 0, 0,230, 0, 0, 0,228, 0, 0, 0,222,230,220,
+ 220, 0, 0, 0,230, 0, 0,220,230,220, 0,220,230,230,230, 0,
+ 0, 0, 9, 9, 0, 0, 7, 0,230, 0, 1, 1, 1, 0, 0, 0,
+ 230,234,214,220,202,230,230,230,230,230,232,228,228,220,218,230,
+ 233,220,230,220,230,230, 1, 1, 1, 1, 1,230, 0, 1, 1,230,
+ 220,230, 1, 1, 0, 0,218,228,232,222,224,224, 0, 8, 8, 0,
+ 0, 0, 0,220,230, 0,230,230,220, 0, 0,230, 0, 0, 26, 0,
+ 0,220, 0,230,230, 1,220, 0, 0,230,220, 0, 0, 0,220,220,
+ 0, 0,230,220, 0, 9, 7, 0, 0, 7, 9, 0, 0, 0, 9, 7,
+ 6, 6, 0, 0, 0, 0, 1, 0, 0,216,216, 1, 1, 1, 0, 0,
+ 0,226,216,216,216,216,216, 0,220,220,220, 0,232,232,220,230,
+ 230,230, 7, 0, 16, 17, 17, 17, 17, 17, 17, 33, 17, 17, 17, 19,
+ 17, 17, 17, 17, 20,101, 17,113,129,169, 17, 27, 28, 17, 17, 17,
17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,237, 0, 1, 2, 2,
- 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 6, 7, 8,
- 9, 0, 0, 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 21, 22, 0, 0, 0, 0,
- 23, 24, 25, 26, 0, 27, 0, 28, 29, 30, 31, 32, 0, 0, 0, 0,
- 0, 0, 0, 33, 34, 35, 36, 0, 0, 0, 0, 0, 37, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 38, 39, 0, 0, 0, 0, 1, 2, 40, 41,
- 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
- 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 5, 0,
- 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0,
- 0, 0, 8, 9, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10,
- 0, 0, 0, 0, 0, 0, 11, 12, 0, 13, 0, 14, 15, 16, 0, 0,
- 0, 0, 0, 1, 17, 18, 0, 19, 7, 1, 0, 0, 0, 20, 20, 7,
- 20, 20, 20, 20, 20, 20, 20, 8, 21, 0, 22, 0, 7, 23, 24, 0,
- 20, 20, 25, 0, 0, 0, 26, 27, 1, 7, 20, 20, 20, 20, 20, 1,
- 28, 29, 30, 31, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 10, 0,
- 0, 0, 0, 0, 0, 0, 20, 20, 20, 1, 0, 0, 8, 21, 32, 4,
- 0, 10, 0, 33, 7, 20, 20, 20, 0, 0, 0, 0, 8, 34, 34, 35,
- 36, 34, 37, 0, 38, 1, 20, 20, 0, 0, 39, 0, 1, 1, 0, 8,
- 21, 1, 20, 0, 0, 0, 1, 0, 0, 40, 1, 1, 0, 0, 8, 21,
- 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 26, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 21, 7, 20, 41, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 21, 0, 42, 43, 44, 0, 45, 0, 8, 21, 0, 0, 0, 0, 0,
- 0, 0, 0, 46, 7, 1, 10, 1, 0, 0, 0, 1, 20, 20, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 34, 9, 0, 0, 20, 20,
- 1, 20, 20, 0, 0, 0, 0, 0, 0, 0, 26, 21, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 47, 48, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 11, 11, 11, 12, 13,
- 13, 13, 13, 14, 15, 16, 17, 18, 19, 20, 21, 13, 22, 13, 13, 13,
- 13, 23, 24, 24, 25, 26, 13, 13, 13, 27, 28, 29, 13, 30, 31, 32,
- 33, 34, 35, 36, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 37, 7, 38, 39, 7, 40, 7, 7,
- 7, 41, 13, 42, 7, 7, 43, 7, 44, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17,237, 0, 1, 2, 2, 0, 3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5, 0, 0, 0, 0, 6, 7, 8, 9, 0, 0, 0, 10, 11, 12, 13,
+ 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20,
+ 0, 0, 21, 22, 0, 0, 0, 0, 23, 24, 25, 26, 0, 27, 0, 28,
+ 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 33, 34, 35, 36, 0,
+ 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 39,
+ 0, 0, 0, 0, 1, 2, 40, 41, 0, 1, 2, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0,
+ 0, 0, 3, 4, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0,
+ 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0,
+ 0, 0, 10, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 11, 12,
+ 0, 13, 0, 14, 15, 16, 0, 0, 0, 0, 0, 1, 17, 18, 0, 19,
+ 7, 1, 0, 0, 0, 20, 20, 7, 20, 20, 20, 20, 20, 20, 20, 8,
+ 21, 0, 22, 0, 7, 23, 24, 0, 20, 20, 25, 0, 0, 0, 26, 27,
+ 1, 7, 20, 20, 20, 20, 20, 1, 28, 29, 30, 31, 0, 0, 20, 0,
+ 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 20, 20,
+ 20, 1, 0, 0, 8, 21, 32, 4, 0, 10, 0, 33, 7, 20, 20, 20,
+ 0, 0, 0, 0, 8, 34, 34, 35, 36, 34, 37, 0, 38, 1, 20, 20,
+ 0, 0, 39, 0, 1, 1, 0, 8, 21, 1, 20, 0, 0, 0, 1, 0,
+ 0, 40, 1, 1, 0, 0, 8, 21, 0, 1, 0, 1, 0, 1, 0, 0,
+ 0, 0, 26, 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 7, 20, 41,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 0, 42, 43, 44, 0, 45,
+ 0, 8, 21, 0, 0, 0, 0, 0, 0, 0, 0, 46, 7, 1, 10, 1,
+ 0, 0, 0, 1, 20, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 26, 34, 9, 0, 0, 20, 20, 1, 20, 20, 0, 0, 0, 0, 0,
+ 0, 0, 26, 21, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 3, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3,
+ 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 9, 10, 11, 11, 11, 11, 12, 13, 13, 13, 13, 14, 15, 16, 17, 18,
+ 19, 20, 21, 13, 22, 13, 13, 13, 13, 23, 24, 24, 25, 26, 13, 13,
+ 13, 27, 28, 29, 13, 30, 31, 32, 33, 34, 35, 36, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 37, 7, 38, 39, 7, 40, 7, 7, 7, 41, 13, 42, 7, 7, 43, 7,
+ 44, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
@@ -1716,419 +1740,419 @@ _hb_ucd_u8[17868] =
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 45, 0, 0, 1, 2, 2, 2, 3, 4, 5, 6, 7,
- 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
- 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 37,
- 37, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
- 51, 52, 2, 2, 53, 54, 55, 56, 57, 58, 59, 59, 59, 59, 60, 59,
- 59, 59, 59, 59, 59, 59, 61, 61, 59, 59, 59, 59, 62, 63, 64, 65,
- 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 59, 70, 70,
- 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 45, 0, 0, 1,
+ 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38, 39, 40, 41, 42,
+ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 2, 2, 53, 54, 55, 56,
+ 57, 58, 59, 59, 59, 59, 60, 59, 59, 59, 59, 59, 59, 59, 61, 61,
+ 59, 59, 59, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
+ 74, 75, 76, 77, 78, 59, 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, 79, 70, 70, 70, 70, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81,
- 82, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 70, 70, 70, 70, 70, 70, 70, 70, 70, 79, 70, 70, 70, 70, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 81, 82, 82, 83, 84, 85, 86, 87, 88,
+ 89, 90, 91, 92, 93, 94, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
- 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, 97, 98, 99,100,101,101,
- 102,103,104,105,106,107,108,109,110,111, 96,112,113,114,115,116,
- 117,118,119,119,120,121,122,123,124,125,126,127,128,129,130,131,
- 132, 96,133,134,135,136,137,138,139,140,141,142,143, 96,144,145,
- 96,146,147,148,149, 96,150,151,152,153,154,155,156, 96,157,158,
- 159,160, 96,161,162,163,164,164,164,164,164,164,164,165,166,164,
- 167, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
- 96, 96, 96, 96, 96,168,169,169,169,169,169,169,169,169,170, 96,
- 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,171,171,
- 171,171,172, 96, 96, 96,173,173,173,173,174,175,176,177, 96, 96,
- 96, 96,178,179,180,181,182,182,182,182,182,182,182,182,182,182,
- 182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
- 182,182,182,182,182,183,182,182,182,182,182,182,184,184,184,185,
- 186, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
- 96, 96, 96, 96, 96,187,188,189,190,191,191,192, 96, 96, 96, 96,
- 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,193,194,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 95, 96, 96,
96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
- 96, 96, 96, 96,195,196, 59,197,198,199,200,201,202, 96,203,204,
- 205, 59, 59,206, 59,207,208,208,208,208,208,209, 96, 96, 96, 96,
- 96, 96, 96, 96,210, 96,211,212,213, 96, 96,214, 96, 96, 96,215,
- 96, 96, 96, 96, 96,216,217,218,219, 96, 96, 96, 96, 96,220,221,
- 222, 96,223,224, 96, 96,225,226, 59,227,228, 96, 59, 59, 59, 59,
- 59, 59, 59,229,230,231,232,233, 59, 59,234,235, 59,236, 96, 96,
- 96, 96, 96, 96, 96, 96, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70,237, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 70,238, 70,239, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 97, 98, 99,100,101,101,102,103,104,105,106,107,108,109,
+ 110,111, 96,112,113,114,115,116,117,118,119,119,120,121,122,123,
+ 124,125,126,127,128,129,130,131,132, 96,133,134,135,136,137,138,
+ 139,140,141,142,143, 96,144,145, 96,146,147,148,149, 96,150,151,
+ 152,153,154,155,156, 96,157,158,159,160, 96,161,162,163,164,164,
+ 164,164,164,164,164,165,166,164,167, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,168,169,169,
+ 169,169,169,169,169,169,170, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96,171,171,171,171,172, 96, 96, 96,173,173,
+ 173,173,174,175,176,177, 96, 96, 96, 96,178,179,180,181,182,182,
+ 182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+ 182,182,182,182,182,182,182,182,182,182,182,182,182,183,182,182,
+ 182,182,182,182,184,184,184,185,186, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,187,188,189,
+ 190,191,191,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96,193,194, 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,195,196, 59,197,
+ 198,199,200,201,202, 96,203,204,205, 59, 59,206, 59,207,208,208,
+ 208,208,208,209, 96, 96, 96, 96, 96, 96, 96, 96,210, 96,211,212,
+ 213, 96, 96,214, 96, 96, 96,215, 96, 96, 96, 96, 96,216,217,218,
+ 219, 96, 96, 96, 96, 96,220,221,222, 96,223,224, 96, 96,225,226,
+ 59,227,228, 96, 59, 59, 59, 59, 59, 59, 59,229,230,231,232,233,
+ 59, 59,234,235, 59,236, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,237, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,238, 70,239, 70,
70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70,240, 70, 70, 70, 70, 70, 70, 70, 70, 70,241, 96, 96,
- 96, 96, 96, 96, 96, 96, 70, 70, 70, 70,242, 96, 96, 96, 96, 96,
- 96, 96, 96, 96, 96, 96, 70, 70, 70, 70, 70, 70,243, 70, 70, 70,
- 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,244, 96, 96,
- 96, 96, 96, 96, 96, 96,245, 96,246,247, 0, 1, 2, 2, 0, 1,
- 2, 2, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 19, 19,
- 19, 19, 19, 19, 19, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19,
- 19, 19, 19, 0, 0, 0, 0, 0, 26, 26, 0, 0, 0, 0, 1, 1,
- 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 0, 9, 9, 9, 2, 2,
- 9, 9, 9, 9, 0, 9, 2, 2, 2, 2, 9, 0, 9, 0, 9, 9,
- 9, 2, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 2, 9, 9, 9, 9, 9, 9, 9, 55, 55, 55, 55, 55, 55, 55, 55,
- 55, 55, 55, 55, 55, 55, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 1, 1, 6, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4,
- 4, 2, 2, 4, 4, 4, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 2, 2, 2, 2, 2, 2, 2, 2, 14, 14,
- 14, 2, 2, 2, 2, 14, 14, 14, 14, 14, 14, 2, 2, 2, 3, 3,
- 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 0, 0, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 37, 37,
- 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 2, 37, 37, 37,
- 37, 2, 2, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
- 2, 2, 2, 2, 2, 2, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 2, 2, 64, 64, 64, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
- 90, 90, 90, 90, 2, 2, 90, 90, 90, 90, 90, 90, 90, 2, 95, 95,
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 2, 2, 95, 2, 37, 37,
- 37, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3,
- 2, 2, 2, 2, 2, 2, 3, 3, 0, 3, 3, 3, 3, 3, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 7, 7, 7, 7, 7,
- 7, 7, 0, 0, 7, 7, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5,
- 5, 5, 5, 2, 2, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 2,
- 5, 2, 2, 2, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 2,
- 2, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2,
- 2, 2, 5, 5, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 2, 2, 11, 11, 11, 2, 11, 11, 11, 11, 11,
- 11, 2, 2, 2, 2, 11, 11, 2, 2, 11, 11, 11, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, 11, 11, 11, 11, 11, 2,
- 11, 11, 2, 11, 11, 2, 11, 11, 2, 2, 11, 2, 11, 11, 11, 2,
- 2, 11, 11, 11, 2, 2, 2, 11, 2, 2, 2, 2, 2, 2, 2, 11,
- 11, 11, 11, 2, 11, 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11,
- 11, 11, 11, 11, 11, 2, 2, 10, 10, 10, 2, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 2, 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 2,
- 10, 10, 2, 10, 10, 10, 10, 10, 2, 2, 10, 10, 10, 10, 10, 10,
- 2, 10, 10, 10, 2, 2, 10, 2, 2, 2, 2, 2, 2, 2, 10, 10,
- 10, 10, 2, 2, 10, 10, 10, 10, 2, 2, 2, 2, 2, 2, 2, 10,
- 10, 10, 10, 10, 10, 10, 2, 21, 21, 21, 2, 21, 21, 21, 21, 21,
- 21, 21, 21, 2, 2, 21, 21, 2, 2, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 2,
- 21, 21, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, 21, 21, 2,
- 2, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 2, 2,
- 2, 2, 21, 21, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, 2,
- 22, 22, 2, 22, 22, 22, 22, 22, 22, 2, 2, 2, 22, 22, 22, 2,
- 22, 22, 22, 22, 2, 2, 2, 22, 22, 2, 22, 2, 22, 22, 2, 2,
- 2, 22, 22, 2, 2, 2, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 2, 2, 2, 2, 22, 22, 22, 2, 2, 2, 2, 2, 2, 22, 2, 2,
- 2, 2, 2, 2, 22, 22, 22, 22, 22, 2, 2, 2, 2, 2, 23, 23,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 2, 23, 23, 23, 2,
- 23, 23, 23, 23, 23, 23, 23, 23, 2, 2, 23, 23, 23, 23, 23, 2,
- 23, 23, 23, 23, 2, 2, 2, 2, 2, 2, 2, 23, 23, 2, 23, 23,
- 23, 2, 2, 23, 2, 2, 23, 23, 23, 23, 2, 2, 23, 23, 2, 2,
- 2, 2, 2, 2, 2, 23, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 2, 16, 16, 16, 2, 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 2, 16, 16, 16, 16, 16, 2, 2, 16, 16, 16, 16, 16, 2,
- 16, 16, 16, 16, 2, 2, 2, 2, 2, 2, 2, 16, 16, 2, 16, 16,
- 16, 16, 2, 2, 16, 16, 2, 16, 16, 16, 2, 2, 2, 2, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 2, 20, 20, 20, 2,
- 20, 20, 20, 20, 20, 20, 2, 2, 2, 2, 20, 20, 20, 20, 20, 20,
- 20, 20, 2, 2, 20, 20, 2, 36, 36, 36, 2, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2,
- 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 2, 36, 2, 2, 2, 2, 36, 2, 2, 2, 2, 36, 36, 36,
- 36, 36, 36, 2, 36, 2, 2, 2, 2, 2, 2, 2, 36, 36, 2, 2,
- 36, 36, 36, 2, 2, 2, 2, 24, 24, 24, 24, 24, 24, 24, 24, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 2, 2, 2, 2, 0, 24, 24,
- 24, 24, 2, 2, 2, 2, 2, 18, 18, 2, 18, 2, 18, 18, 18, 18,
- 18, 2, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 18, 2, 18, 2, 18, 18, 18, 18, 18, 18, 18, 2, 2, 18, 18,
- 18, 18, 18, 2, 18, 2, 18, 18, 18, 18, 18, 18, 18, 2, 18, 18,
- 2, 2, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 2, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 2, 2, 2, 25, 25,
- 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 25,
- 25, 2, 2, 2, 2, 2, 33, 33, 33, 33, 33, 33, 33, 33, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 2, 8, 2, 2,
- 2, 2, 2, 8, 2, 2, 8, 8, 8, 0, 8, 8, 8, 8, 12, 12,
- 12, 12, 12, 12, 12, 12, 30, 30, 30, 30, 30, 30, 30, 30, 30, 2,
- 30, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 2, 30, 30,
- 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 30, 2, 2, 2, 30, 30,
- 2, 2, 2, 2, 2, 2, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 2, 2, 28, 28, 28, 28, 28, 28, 28, 28, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 2, 2, 2, 35, 35,
- 35, 35, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 35, 35, 35, 2,
- 2, 2, 2, 2, 2, 2, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
- 45, 45, 45, 45, 2, 2, 2, 2, 2, 2, 2, 2, 2, 45, 44, 44,
- 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 2, 43, 43,
- 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 2, 2, 2, 2, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 2, 46, 46, 46, 2,
- 46, 46, 2, 2, 2, 2, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
- 31, 31, 31, 31, 2, 2, 31, 31, 2, 2, 2, 2, 2, 2, 32, 32,
- 0, 0, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 2, 2, 2, 2, 2, 2, 32, 2, 2, 2, 2, 2, 2, 2, 32, 32,
- 32, 2, 2, 2, 2, 2, 28, 28, 28, 28, 28, 28, 2, 2, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 2, 48, 48,
- 48, 48, 2, 2, 2, 2, 48, 2, 2, 2, 48, 48, 48, 48, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 2, 2, 52, 52,
- 52, 52, 52, 2, 2, 2, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
- 58, 58, 2, 2, 2, 2, 58, 58, 2, 2, 2, 2, 2, 2, 58, 58,
- 58, 2, 2, 2, 58, 58, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
- 54, 54, 2, 2, 54, 54, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
- 91, 91, 91, 91, 91, 2, 91, 91, 91, 91, 91, 2, 2, 91, 91, 91,
- 2, 2, 2, 2, 2, 2, 91, 91, 91, 91, 91, 91, 2, 2, 1, 1,
- 1, 1, 1, 1, 1, 2, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
- 62, 62, 62, 2, 2, 2, 62, 62, 62, 62, 62, 62, 62, 2, 76, 76,
- 76, 76, 76, 76, 76, 76, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
- 93, 93, 2, 2, 2, 2, 2, 2, 2, 2, 93, 93, 93, 93, 70, 70,
- 70, 70, 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 70, 70, 70, 70,
- 2, 2, 2, 70, 70, 70, 73, 73, 73, 73, 73, 73, 73, 73, 6, 2,
- 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 8, 8, 8, 1, 1,
- 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1,
- 0, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, 9, 9, 9, 9,
- 9, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 9, 9, 9, 9,
- 19, 19, 19, 19, 9, 9, 9, 9, 9, 19, 19, 19, 19, 19, 6, 19,
- 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 9, 9,
- 9, 9, 9, 9, 2, 2, 2, 9, 2, 9, 2, 9, 2, 9, 9, 9,
- 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, 9, 9,
- 9, 9, 2, 9, 9, 9, 2, 2, 9, 9, 9, 2, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,
- 0, 0, 0, 2, 0, 0, 0, 19, 2, 2, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 2, 19, 19,
- 19, 19, 19, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 1, 2,
- 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0,
- 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 19, 0,
- 0, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 27, 27,
- 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 2, 0, 56, 56, 56, 56, 56, 56, 56, 56, 55, 55,
- 55, 55, 2, 2, 2, 2, 2, 55, 55, 55, 55, 55, 55, 55, 61, 61,
- 61, 61, 61, 61, 61, 61, 2, 2, 2, 2, 2, 2, 2, 61, 61, 2,
- 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 2, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 2, 2, 2, 2, 13, 13, 13, 13, 13, 13, 2, 2, 0, 0,
- 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 13, 0, 13, 0, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 1, 1, 1, 1, 12, 12, 13, 13,
- 13, 13, 0, 0, 0, 0, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 1,
- 1, 0, 0, 15, 15, 15, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 17, 17, 17, 2, 2,
- 2, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 12, 12,
- 12, 12, 12, 12, 12, 0, 17, 17, 17, 17, 17, 17, 17, 0, 39, 39,
- 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 2, 2, 2, 39, 39,
- 39, 39, 39, 39, 39, 2, 86, 86, 86, 86, 86, 86, 86, 86, 77, 77,
- 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 2, 2, 2, 2, 79, 79,
- 79, 79, 79, 79, 79, 79, 0, 0, 19, 19, 19, 19, 19, 19, 0, 0,
- 0, 19, 19, 19, 19, 19, 19, 19, 19, 2, 2, 2, 2, 2, 19, 19,
- 2, 19, 2, 19, 19, 19, 19, 19, 2, 2, 2, 2, 2, 2, 2, 2,
- 19, 19, 19, 19, 19, 19, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
- 60, 60, 60, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 65, 65,
- 65, 65, 65, 65, 65, 65, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
- 75, 75, 75, 75, 2, 2, 2, 2, 2, 2, 2, 2, 75, 75, 75, 75,
- 2, 2, 2, 2, 2, 2, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
- 69, 69, 69, 69, 0, 69, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
- 74, 74, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 74, 12, 12,
- 12, 12, 12, 2, 2, 2, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
- 84, 84, 84, 84, 2, 0, 84, 84, 2, 2, 2, 2, 84, 84, 33, 33,
- 33, 33, 33, 33, 33, 2, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 2, 68, 68, 68, 68, 68, 68, 2, 2, 68, 68,
- 2, 2, 68, 68, 68, 68, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
- 92, 2, 2, 2, 2, 2, 2, 2, 2, 92, 92, 92, 92, 92, 87, 87,
- 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 2, 2, 30,
- 30, 30, 30, 30, 30, 2, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 9, 19, 19, 19, 19, 0, 0, 2, 2, 2, 2, 87, 87,
- 87, 87, 87, 87, 2, 2, 87, 87, 2, 2, 2, 2, 2, 2, 12, 12,
- 12, 12, 2, 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, 12, 13, 13,
- 2, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, 19, 2, 2, 2,
- 2, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 2, 14, 14, 14, 14, 14, 2, 14, 2, 14, 14,
- 2, 14, 14, 2, 14, 14, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2,
- 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 2, 2,
- 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 3, 1, 1,
- 1, 1, 1, 1, 6, 6, 0, 0, 0, 2, 0, 0, 0, 0, 3, 3,
- 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 2, 2, 0, 2, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17,
- 17, 17, 17, 17, 0, 0, 2, 2, 12, 12, 12, 12, 12, 12, 2, 2,
- 12, 12, 12, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 49, 49,
- 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 2, 49, 49, 49, 49, 49,
- 49, 49, 49, 49, 49, 2, 49, 49, 49, 2, 49, 49, 2, 49, 49, 49,
- 49, 49, 49, 49, 2, 2, 49, 49, 49, 2, 2, 2, 2, 2, 0, 0,
- 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0,
- 0, 0, 0, 2, 2, 2, 9, 2, 2, 2, 2, 2, 2, 2, 0, 0,
- 0, 0, 0, 1, 2, 2, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
- 71, 71, 71, 2, 2, 2, 67, 67, 67, 67, 67, 67, 67, 67, 67, 2,
- 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 42, 42,
- 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 42, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
- 41, 2, 2, 2, 2, 2,118,118,118,118,118,118,118,118,118,118,
- 118, 2, 2, 2, 2, 2, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
- 53, 53, 53, 53, 2, 53, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
- 59, 59, 2, 2, 2, 2, 59, 59, 59, 59, 59, 59, 2, 2, 40, 40,
- 40, 40, 40, 40, 40, 40, 51, 51, 51, 51, 51, 51, 51, 51, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 2, 2, 50, 50,
- 2, 2, 2, 2, 2, 2,135,135,135,135,135,135,135,135,135,135,
- 135,135, 2, 2, 2, 2,106,106,106,106,106,106,106,106,104,104,
- 104,104,104,104,104,104,104,104,104,104, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2,104,161,161,161,161,161,161,161,161,161,161,
- 161, 2,161,161,161,161,161,161,161, 2,161,161, 2,161,161,161,
- 2,161,161,161,161,161,161,161, 2,161,161, 2, 2, 2,110,110,
- 110,110,110,110,110,110,110,110,110,110,110,110,110, 2,110,110,
- 110,110,110,110, 2, 2, 19, 19, 19, 19, 19, 19, 2, 19, 19, 2,
- 19, 19, 19, 19, 19, 19, 47, 47, 47, 47, 47, 47, 2, 2, 47, 2,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 2, 47, 47, 2, 2, 2, 47, 2, 2, 47, 81, 81,
- 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 2, 81,120,120,
- 120,120,120,120,120,120,116,116,116,116,116,116,116,116,116,116,
- 116,116,116,116,116, 2, 2, 2, 2, 2, 2, 2, 2,116,128,128,
- 128,128,128,128,128,128,128,128,128, 2,128,128, 2, 2, 2, 2,
- 2,128,128,128,128,128, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
- 66, 66, 2, 2, 2, 66, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
- 2, 2, 2, 2, 2, 72, 98, 98, 98, 98, 98, 98, 98, 98, 97, 97,
- 97, 97, 97, 97, 97, 97, 2, 2, 2, 2, 97, 97, 97, 97, 2, 2,
- 97, 97, 97, 97, 97, 97, 57, 57, 57, 57, 2, 57, 57, 2, 2, 2,
- 2, 2, 57, 57, 57, 57, 57, 57, 57, 57, 2, 57, 57, 57, 2, 57,
- 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
- 57, 57, 57, 57, 2, 2, 57, 57, 57, 2, 2, 2, 2, 57, 57, 2,
- 2, 2, 2, 2, 2, 2, 88, 88, 88, 88, 88, 88, 88, 88,117,117,
- 117,117,117,117,117,117,112,112,112,112,112,112,112,112,112,112,
- 112,112,112,112,112, 2, 2, 2, 2,112,112,112,112,112, 78, 78,
- 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 2, 2, 2, 78,
- 78, 78, 78, 78, 78, 78, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
- 83, 83, 83, 83, 2, 2, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
- 82, 2, 2, 2, 2, 2,122,122,122,122,122,122,122,122,122,122,
- 2, 2, 2, 2, 2, 2, 2,122,122,122,122, 2, 2, 2, 2,122,
- 122,122,122,122,122,122, 89, 89, 89, 89, 89, 89, 89, 89, 89, 2,
- 2, 2, 2, 2, 2, 2,130,130,130,130,130,130,130,130,130,130,
- 130, 2, 2, 2, 2, 2, 2, 2,130,130,130,130,130,130,144,144,
- 144,144,144,144,144,144,144,144, 2, 2, 2, 2, 2, 2,156,156,
- 156,156,156,156,156,156,156,156, 2,156,156,156, 2, 2,156,156,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3,147,147,
- 147,147,147,147,147,147,148,148,148,148,148,148,148,148,148,148,
- 2, 2, 2, 2, 2, 2,158,158,158,158,158,158,158,158,158,158,
- 2, 2, 2, 2, 2, 2,153,153,153,153,153,153,153,153,153,153,
- 153,153, 2, 2, 2, 2,149,149,149,149,149,149,149,149,149,149,
- 149,149,149,149,149, 2, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
- 94, 94, 94, 94, 2, 2, 2, 2, 94, 94, 94, 94, 94, 94, 2, 2,
- 2, 2, 2, 2, 2, 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
- 85, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 85, 2, 2,101,101,
- 101,101,101,101,101,101,101, 2, 2, 2, 2, 2, 2, 2,101,101,
- 2, 2, 2, 2, 2, 2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
- 96, 96, 96, 2, 96, 96,111,111,111,111,111,111,111,111,111,111,
- 111,111,111,111,111, 2,100,100,100,100,100,100,100,100, 2, 36,
- 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2,108,108,
- 108,108,108,108,108,108,108,108, 2,108,108,108,108,108,108,108,
- 2, 2, 2, 2, 2, 2,129,129,129,129,129,129,129, 2,129, 2,
- 129,129,129,129, 2,129,129,129,129,129,129,129,129,129,129,129,
- 129,129,129,129, 2,129,129,129, 2, 2, 2, 2, 2, 2,109,109,
- 109,109,109,109,109,109,109,109,109, 2, 2, 2, 2, 2,109,109,
- 2, 2, 2, 2, 2, 2,107,107,107,107, 2,107,107,107,107,107,
- 107,107,107, 2, 2,107,107, 2, 2,107,107,107,107,107,107,107,
- 107,107,107,107,107,107,107, 2,107,107,107,107,107,107,107, 2,
- 107,107, 2,107,107,107,107,107, 2, 1,107,107,107,107,107, 2,
- 2,107,107,107, 2, 2,107, 2, 2, 2, 2, 2, 2,107, 2, 2,
- 2, 2, 2,107,107,107,107,107,107,107, 2, 2,107,107,107,107,
- 107,107,107, 2, 2, 2,137,137,137,137,137,137,137,137,137,137,
- 137,137, 2,137,137,137,137,137, 2, 2, 2, 2, 2, 2,124,124,
- 124,124,124,124,124,124,124,124, 2, 2, 2, 2, 2, 2,123,123,
- 123,123,123,123,123,123,123,123,123,123,123,123, 2, 2,114,114,
- 114,114,114,114,114,114,114,114,114,114,114, 2, 2, 2,114,114,
- 2, 2, 2, 2, 2, 2, 32, 32, 32, 32, 32, 2, 2, 2,102,102,
- 102,102,102,102,102,102,102,102, 2, 2, 2, 2, 2, 2,126,126,
- 126,126,126,126,126,126,126,126,126, 2, 2,126,126,126,126,126,
- 126,126, 2, 2, 2, 2,126,126,126,126,126,126,126, 2,142,142,
- 142,142,142,142,142,142,142,142,142,142, 2, 2, 2, 2,125,125,
- 125,125,125,125,125,125,125,125,125, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2,125,154,154,154,154,154,154,154, 2, 2,154,
- 2, 2,154,154,154,154,154,154,154,154, 2,154,154, 2,154,154,
- 154,154,154,154,154,154,154,154,154,154,154,154, 2,154,154, 2,
- 2,154,154,154,154,154,154,154, 2, 2, 2, 2, 2, 2,150,150,
- 150,150,150,150,150,150, 2, 2,150,150,150,150,150,150,150,150,
- 150,150,150, 2, 2, 2,141,141,141,141,141,141,141,141,140,140,
- 140,140,140,140,140,140,140,140,140, 2, 2, 2, 2, 2,121,121,
- 121,121,121,121,121,121,121, 2, 2, 2, 2, 2, 2, 2, 7, 7,
- 2, 2, 2, 2, 2, 2,133,133,133,133,133,133,133,133,133, 2,
- 133,133,133,133,133,133,133,133,133,133,133,133,133, 2,133,133,
- 133,133,133,133, 2, 2,133,133,133,133,133, 2, 2, 2,134,134,
- 134,134,134,134,134,134, 2, 2,134,134,134,134,134,134, 2,134,
- 134,134,134,134,134,134,134,134,134,134,134,134,134, 2,138,138,
- 138,138,138,138,138, 2,138,138, 2,138,138,138,138,138,138,138,
- 138,138,138,138,138,138, 2, 2,138, 2,138,138, 2,138,138,138,
- 2, 2, 2, 2, 2, 2,143,143,143,143,143,143, 2,143,143, 2,
- 143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,
- 143,143,143,143,143, 2,143,143, 2,143,143,143,143,143,143, 2,
- 2, 2, 2, 2, 2, 2,143,143, 2, 2, 2, 2, 2, 2,145,145,
- 145,145,145,145,145,145,145, 2, 2, 2, 2, 2, 2, 2,163,163,
- 163,163,163,163,163,163,163, 2,163,163,163,163,163,163,163,163,
- 163, 2, 2, 2,163,163,163,163, 2, 2, 2, 2, 2, 2, 86, 2,
- 2, 2, 2, 2, 2, 2, 22, 22, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 22, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
- 2, 2, 2, 2, 2, 2, 63, 63, 63, 63, 63, 63, 63, 2, 63, 63,
- 63, 63, 63, 2, 2, 2, 63, 63, 63, 63, 2, 2, 2, 2,157,157,
- 157,157,157,157,157,157,157,157,157, 2, 2, 2, 2, 2, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 2, 2,127,127,
- 127,127,127,127,127,127,127,127,127,127,127,127,127, 2, 79, 2,
- 2, 2, 2, 2, 2, 2,115,115,115,115,115,115,115,115,115,115,
- 115,115,115,115,115, 2,115,115, 2, 2, 2, 2,115,115,159,159,
- 159,159,159,159,159,159,159,159,159,159,159,159,159, 2,159,159,
- 2, 2, 2, 2, 2, 2,103,103,103,103,103,103,103,103,103,103,
- 103,103,103,103, 2, 2,119,119,119,119,119,119,119,119,119,119,
- 119,119,119,119, 2, 2,119,119, 2,119,119,119,119,119, 2, 2,
- 2, 2, 2,119,119,119,146,146,146,146,146,146,146,146,146,146,
- 146, 2, 2, 2, 2, 2, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
- 99, 2, 2, 2, 2, 99, 2, 2, 2, 2, 2, 2, 2, 99,136,139,
- 13, 13,155, 2, 2, 2,136,136,136,136,136,136,136,136,155,155,
- 155,155,155,155,155,155,155,155,155,155,155,155, 2, 2,136, 2,
- 2, 2, 2, 2, 2, 2, 17, 17, 17, 17, 2, 17, 17, 17, 17, 17,
- 17, 17, 2, 17, 17, 2, 17, 15, 15, 15, 15, 15, 15, 15, 17, 17,
- 17, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, 2, 15, 15,
- 15, 2, 2, 17, 2, 2, 2, 2, 2, 2, 17, 17, 17, 17,139,139,
- 139,139,139,139,139,139,139,139,139,139, 2, 2, 2, 2,105,105,
- 105,105,105,105,105,105,105,105,105, 2, 2, 2, 2, 2,105,105,
- 105,105,105, 2, 2, 2,105, 2, 2, 2, 2, 2, 2, 2,105,105,
- 2, 2,105,105,105,105, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0,
- 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1,
- 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 2, 2,
- 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0,
- 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
- 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0,
- 0, 0, 0, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2,
- 0, 0, 0, 0, 0, 0,131,131,131,131,131,131,131,131,131,131,
- 131,131, 2, 2, 2, 2, 2, 2, 2,131,131,131,131,131, 2,131,
- 131,131,131,131,131,131, 2, 2, 2, 2, 2, 19, 19, 19, 56, 56,
- 56, 56, 56, 56, 56, 2, 56, 2, 2, 56, 56, 56, 56, 56, 56, 56,
- 2, 56, 56, 2, 56, 56, 56, 56, 56, 2, 2, 2, 2, 2, 6, 6,
- 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6,151,151,
- 151,151,151,151,151,151,151,151,151,151,151, 2, 2, 2,151,151,
- 151,151,151,151, 2, 2,151,151, 2, 2, 2, 2,151,151,160,160,
- 160,160,160,160,160,160,160,160,160,160,160,160,160, 2,152,152,
- 152,152,152,152,152,152,152,152, 2, 2, 2, 2, 2,152,164,164,
- 164,164,164,164,164,164,164,164, 2, 2, 2, 2, 2, 2, 30, 30,
- 30, 30, 2, 30, 30, 2,113,113,113,113,113,113,113,113,113,113,
- 113,113,113, 2, 2,113,113,113,113,113,113,113,113, 2,132,132,
- 132,132,132,132,132,132,132,132,132,132, 2, 2, 2, 2,132,132,
- 2, 2, 2, 2,132,132, 3, 3, 3, 3, 2, 3, 3, 3, 2, 3,
- 3, 2, 3, 2, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2,
- 3, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 2, 3,
- 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 3,
- 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3,
- 3, 3, 2, 3, 3, 3, 2, 2, 2, 2, 2, 2, 0, 0, 15, 0,
- 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2,
- 2, 0, 0, 0, 0, 0, 13, 2, 2, 2, 2, 2, 2, 2, 13, 13,
- 13, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 1,
- 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 10, 9, 11, 12, 13,
- 9, 9, 9, 14, 9, 9, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,240, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70,241, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70,
+ 70, 70,242, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70,
+ 70, 70, 70, 70,243, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70, 70,244, 96, 96, 96, 96, 96, 96, 96, 96,245, 96,
+ 246,247, 0, 1, 2, 2, 0, 1, 2, 2, 2, 3, 4, 5, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, 0, 0,
+ 19, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 0, 19, 0,
+ 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0,
+ 26, 26, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9,
+ 9, 9, 0, 9, 9, 9, 2, 2, 9, 9, 9, 9, 0, 9, 2, 2,
+ 2, 2, 9, 0, 9, 0, 9, 9, 9, 2, 9, 2, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 9,
+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 6, 2, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 2, 4, 4, 4, 2, 2, 4, 4, 4, 2, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 2,
+ 2, 2, 2, 2, 2, 2, 14, 14, 14, 2, 2, 2, 2, 14, 14, 14,
+ 14, 14, 14, 2, 2, 2, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3,
+ 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 0, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 3,
+ 3, 3, 3, 3, 3, 3, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 2, 37, 37, 37, 37, 2, 2, 37, 37, 37, 38, 38,
+ 38, 38, 38, 38, 38, 38, 38, 38, 2, 2, 2, 2, 2, 2, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 2, 2, 64, 64, 64, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 2, 2, 90, 90,
+ 90, 90, 90, 90, 90, 2, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,
+ 95, 95, 2, 2, 95, 2, 37, 37, 37, 2, 2, 2, 2, 2, 3, 3,
+ 3, 3, 3, 3, 3, 2, 3, 3, 2, 2, 2, 2, 2, 2, 3, 3,
+ 0, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1,
+ 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 5, 5,
+ 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 2,
+ 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2,
+ 5, 5, 5, 5, 5, 5, 5, 2, 5, 2, 2, 2, 5, 5, 5, 5,
+ 2, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 2, 2, 2,
+ 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 5, 5, 2, 5, 5, 5,
+ 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 11,
+ 11, 11, 2, 11, 11, 11, 11, 11, 11, 2, 2, 2, 2, 11, 11, 2,
+ 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2,
+ 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, 2, 11, 11, 2, 11, 11,
+ 2, 2, 11, 2, 11, 11, 11, 2, 2, 11, 11, 11, 2, 2, 2, 11,
+ 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, 2, 11, 2, 2, 2,
+ 2, 2, 2, 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, 2, 10,
+ 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10,
+ 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2,
+ 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 2, 10, 10, 10, 10, 10,
+ 2, 2, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, 2, 2, 10, 2,
+ 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 2, 2, 10, 10, 10, 10,
+ 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 2, 21,
+ 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2,
+ 2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2,
+ 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, 2, 21, 21, 21, 21, 21,
+ 2, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, 2, 2, 2, 2,
+ 2, 2, 2, 21, 21, 21, 2, 2, 2, 2, 21, 21, 2, 21, 21, 21,
+ 21, 21, 2, 2, 21, 21, 2, 2, 22, 22, 2, 22, 22, 22, 22, 22,
+ 22, 2, 2, 2, 22, 22, 22, 2, 22, 22, 22, 22, 2, 2, 2, 22,
+ 22, 2, 22, 2, 22, 22, 2, 2, 2, 22, 22, 2, 2, 2, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, 22, 22, 22, 2,
+ 2, 2, 2, 2, 2, 22, 2, 2, 2, 2, 2, 2, 22, 22, 22, 22,
+ 22, 2, 2, 2, 2, 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 2, 23, 23, 23, 2, 23, 23, 23, 23, 23, 23, 23, 23,
+ 2, 2, 23, 23, 23, 23, 23, 2, 23, 23, 23, 23, 2, 2, 2, 2,
+ 2, 2, 2, 23, 23, 2, 23, 23, 23, 2, 2, 23, 2, 2, 23, 23,
+ 23, 23, 2, 2, 23, 23, 2, 2, 2, 2, 2, 2, 2, 23, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 2,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 16,
+ 2, 2, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 2, 2, 2, 2,
+ 2, 2, 2, 16, 16, 2, 16, 16, 16, 16, 2, 2, 16, 16, 2, 16,
+ 16, 16, 2, 2, 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 2, 20, 20, 20, 2, 20, 20, 20, 20, 20, 20, 2, 2,
+ 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 2, 2, 20, 20, 2, 36,
+ 36, 36, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 2, 2, 2, 36, 36, 36, 36, 36, 36, 36, 36,
+ 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 2, 2,
+ 36, 2, 2, 2, 2, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 2,
+ 2, 2, 2, 2, 36, 36, 2, 2, 36, 36, 36, 2, 2, 2, 2, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 2, 2, 2, 2, 0, 24, 24, 24, 24, 2, 2, 2, 2, 2, 18,
+ 18, 2, 18, 2, 18, 18, 18, 18, 18, 2, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18, 18,
+ 18, 18, 18, 18, 2, 2, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18,
+ 18, 18, 18, 18, 18, 2, 18, 18, 2, 2, 18, 18, 18, 18, 25, 25,
+ 25, 25, 25, 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 2, 2, 2, 25, 25, 25, 25, 25, 2, 25, 25, 25, 25,
+ 25, 25, 25, 0, 0, 0, 0, 25, 25, 2, 2, 2, 2, 2, 33, 33,
+ 33, 33, 33, 33, 33, 33, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 2, 8, 2, 2, 2, 2, 2, 8, 2, 2, 8, 8,
+ 8, 0, 8, 8, 8, 8, 12, 12, 12, 12, 12, 12, 12, 12, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 2, 30, 30, 30, 30, 2, 2, 30, 30,
+ 30, 30, 30, 30, 30, 2, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30,
+ 30, 30, 30, 2, 2, 2, 30, 30, 2, 2, 2, 2, 2, 2, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 2, 2, 28, 28,
+ 28, 28, 28, 28, 28, 28, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 2, 2, 2, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 0, 0, 0, 35, 35, 35, 2, 2, 2, 2, 2, 2, 2, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 45, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 0, 0, 2, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 2, 2, 2, 2, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 2, 46, 46, 46, 2, 46, 46, 2, 2, 2, 2, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 2, 2, 31, 31,
+ 2, 2, 2, 2, 2, 2, 32, 32, 0, 0, 32, 0, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 2, 2, 2, 2, 2, 2, 32, 2,
+ 2, 2, 2, 2, 2, 2, 32, 32, 32, 2, 2, 2, 2, 2, 28, 28,
+ 28, 28, 28, 28, 2, 2, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 2, 48, 48, 48, 48, 2, 2, 2, 2, 48, 2,
+ 2, 2, 48, 48, 48, 48, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 2, 2, 52, 52, 52, 52, 52, 2, 2, 2, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 2, 2, 2, 2, 58, 58,
+ 2, 2, 2, 2, 2, 2, 58, 58, 58, 2, 2, 2, 58, 58, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 2, 2, 54, 54, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 2, 91, 91,
+ 91, 91, 91, 2, 2, 91, 91, 91, 2, 2, 2, 2, 2, 2, 91, 91,
+ 91, 91, 91, 91, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 2, 2, 2, 62, 62,
+ 62, 62, 62, 62, 62, 2, 76, 76, 76, 76, 76, 76, 76, 76, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 2, 2, 2, 2, 2, 2,
+ 2, 2, 93, 93, 93, 93, 70, 70, 70, 70, 70, 70, 70, 70, 2, 2,
+ 2, 70, 70, 70, 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 73, 73,
+ 73, 73, 73, 73, 73, 73, 6, 2, 2, 2, 2, 2, 2, 2, 8, 8,
+ 8, 2, 2, 8, 8, 8, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0,
+ 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 1, 1, 0, 2, 2, 2, 2, 2, 19, 19,
+ 19, 19, 19, 19, 9, 9, 9, 9, 9, 6, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 9, 9, 9, 9, 9, 19, 19, 19, 19, 9, 9, 9, 9,
+ 9, 19, 19, 19, 19, 19, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 9, 9, 9, 9, 9, 9, 9, 2, 2, 2, 9,
+ 2, 9, 2, 9, 2, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 9,
+ 9, 9, 2, 2, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 2, 2,
+ 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 0, 0,
+ 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 19,
+ 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0,
+ 0, 0, 0, 0, 0, 2, 19, 19, 19, 19, 19, 2, 2, 2, 0, 2,
+ 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0, 19, 19, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 19, 0, 19, 0, 0, 0, 2, 2, 2, 2, 0, 0,
+ 0, 2, 2, 2, 2, 2, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0,
+ 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 56, 56,
+ 56, 56, 56, 56, 56, 56, 55, 55, 55, 55, 2, 2, 2, 2, 2, 55,
+ 55, 55, 55, 55, 55, 55, 61, 61, 61, 61, 61, 61, 61, 61, 2, 2,
+ 2, 2, 2, 2, 2, 61, 61, 2, 2, 2, 2, 2, 2, 2, 0, 0,
+ 0, 0, 0, 0, 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 13, 13,
+ 13, 13, 13, 13, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0,
+ 0, 0, 0, 13, 0, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 1, 1, 1, 1, 12, 12, 13, 13, 13, 13, 0, 0, 0, 0, 2, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 2, 2, 1, 1, 0, 0, 15, 15, 15, 0, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 0, 0, 17, 17, 17, 2, 2, 2, 2, 2, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 2, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 2, 12, 12, 12, 12, 12, 12, 12, 0, 17, 17,
+ 17, 17, 17, 17, 17, 0, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 2, 2, 2, 39, 39, 39, 39, 39, 39, 39, 2, 86, 86,
+ 86, 86, 86, 86, 86, 86, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 2, 2, 2, 2, 79, 79, 79, 79, 79, 79, 79, 79, 0, 0,
+ 19, 19, 19, 19, 19, 19, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19,
+ 19, 2, 2, 2, 2, 2, 19, 19, 2, 19, 2, 19, 19, 19, 19, 19,
+ 2, 2, 2, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, 60, 60,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 2, 2, 2, 0, 0,
+ 2, 2, 2, 2, 2, 2, 65, 65, 65, 65, 65, 65, 65, 65, 75, 75,
+ 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 2, 2, 2, 2,
+ 2, 2, 2, 2, 75, 75, 75, 75, 2, 2, 2, 2, 2, 2, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 0, 69, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 74, 12, 12, 12, 12, 12, 2, 2, 2, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 2, 0, 84, 84,
+ 2, 2, 2, 2, 84, 84, 33, 33, 33, 33, 33, 33, 33, 2, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 2, 68, 68,
+ 68, 68, 68, 68, 2, 2, 68, 68, 2, 2, 68, 68, 68, 68, 92, 92,
+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 2, 2, 2, 2, 2, 2, 2,
+ 2, 92, 92, 92, 92, 92, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 2, 2, 30, 30, 30, 30, 30, 30, 2, 19, 19,
+ 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 19, 19, 19, 19,
+ 0, 0, 2, 2, 2, 2, 87, 87, 87, 87, 87, 87, 2, 2, 87, 87,
+ 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2,
+ 2, 12, 12, 12, 12, 12, 13, 13, 2, 2, 2, 2, 2, 2, 19, 19,
+ 19, 19, 19, 19, 19, 2, 2, 2, 2, 4, 4, 4, 4, 4, 2, 2,
+ 2, 2, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 14, 14,
+ 14, 14, 14, 2, 14, 2, 14, 14, 2, 14, 14, 2, 14, 14, 3, 3,
+ 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 0, 0, 2, 2, 3, 3, 3, 3, 3, 3, 2, 2,
+ 2, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1, 1, 6, 6, 0, 0,
+ 0, 2, 0, 0, 0, 0, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3,
+ 3, 3, 3, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 2, 2,
+ 12, 12, 12, 12, 12, 12, 2, 2, 12, 12, 12, 2, 2, 2, 2, 0,
+ 0, 0, 0, 0, 2, 2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 2, 49, 49,
+ 49, 2, 49, 49, 2, 49, 49, 49, 49, 49, 49, 49, 2, 2, 49, 49,
+ 49, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0,
+ 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 9, 2,
+ 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 1, 2, 2, 71, 71,
+ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 2, 2, 2, 67, 67,
+ 67, 67, 67, 67, 67, 67, 67, 2, 2, 2, 2, 2, 2, 2, 1, 0,
+ 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 2, 2, 2, 2, 2, 2, 2, 2, 2, 42, 42, 42, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 2, 2, 2, 2, 2,118,118,
+ 118,118,118,118,118,118,118,118,118, 2, 2, 2, 2, 2, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 2, 53, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 2, 2, 2, 2, 59, 59,
+ 59, 59, 59, 59, 2, 2, 40, 40, 40, 40, 40, 40, 40, 40, 51, 51,
+ 51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 2, 2, 50, 50, 2, 2, 2, 2, 2, 2,135,135,
+ 135,135,135,135,135,135,135,135,135,135, 2, 2, 2, 2,106,106,
+ 106,106,106,106,106,106,104,104,104,104,104,104,104,104,104,104,
+ 104,104, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,104,161,161,
+ 161,161,161,161,161,161,161,161,161, 2,161,161,161,161,161,161,
+ 161, 2,161,161, 2,161,161,161, 2,161,161,161,161,161,161,161,
+ 2,161,161, 2, 2, 2,110,110,110,110,110,110,110,110,110,110,
+ 110,110,110,110,110, 2,110,110,110,110,110,110, 2, 2, 19, 19,
+ 19, 19, 19, 19, 2, 19, 19, 2, 19, 19, 19, 19, 19, 19, 47, 47,
+ 47, 47, 47, 47, 2, 2, 47, 2, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 2, 47, 47, 2,
+ 2, 2, 47, 2, 2, 47, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 2, 81,120,120,120,120,120,120,120,120,116,116,
+ 116,116,116,116,116,116,116,116,116,116,116,116,116, 2, 2, 2,
+ 2, 2, 2, 2, 2,116,128,128,128,128,128,128,128,128,128,128,
+ 128, 2,128,128, 2, 2, 2, 2, 2,128,128,128,128,128, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 2, 2, 2, 66, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 2, 2, 2, 2, 2, 72, 98, 98,
+ 98, 98, 98, 98, 98, 98, 97, 97, 97, 97, 97, 97, 97, 97, 2, 2,
+ 2, 2, 97, 97, 97, 97, 2, 2, 97, 97, 97, 97, 97, 97, 57, 57,
+ 57, 57, 2, 57, 57, 2, 2, 2, 2, 2, 57, 57, 57, 57, 57, 57,
+ 57, 57, 2, 57, 57, 57, 2, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 57, 57,
+ 57, 2, 2, 2, 2, 57, 57, 2, 2, 2, 2, 2, 2, 2, 88, 88,
+ 88, 88, 88, 88, 88, 88,117,117,117,117,117,117,117,117,112,112,
+ 112,112,112,112,112,112,112,112,112,112,112,112,112, 2, 2, 2,
+ 2,112,112,112,112,112, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 2, 2, 2, 78, 78, 78, 78, 78, 78, 78, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 2, 2, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 2, 2, 2, 2, 2,122,122,
+ 122,122,122,122,122,122,122,122, 2, 2, 2, 2, 2, 2, 2,122,
+ 122,122,122, 2, 2, 2, 2,122,122,122,122,122,122,122, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 2, 2, 2, 2, 2, 2, 2,130,130,
+ 130,130,130,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2,
+ 130,130,130,130,130,130,144,144,144,144,144,144,144,144,144,144,
+ 2, 2, 2, 2, 2, 2,156,156,156,156,156,156,156,156,156,156,
+ 2,156,156,156, 2, 2,156,156, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 3, 3, 3,147,147,147,147,147,147,147,147,148,148,
+ 148,148,148,148,148,148,148,148, 2, 2, 2, 2, 2, 2,158,158,
+ 158,158,158,158,158,158,158,158, 2, 2, 2, 2, 2, 2,153,153,
+ 153,153,153,153,153,153,153,153,153,153, 2, 2, 2, 2,149,149,
+ 149,149,149,149,149,149,149,149,149,149,149,149,149, 2, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 2, 2, 2, 2,
+ 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, 2, 2, 2, 94, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 85, 2, 2,101,101,101,101,101,101,101,101,101, 2,
+ 2, 2, 2, 2, 2, 2,101,101, 2, 2, 2, 2, 2, 2, 96, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 2, 96, 96,111,111,
+ 111,111,111,111,111,111,111,111,111,111,111,111,111, 2,100,100,
+ 100,100,100,100,100,100, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 2, 2, 2,108,108,108,108,108,108,108,108,108,108,
+ 2,108,108,108,108,108,108,108, 2, 2, 2, 2, 2, 2,129,129,
+ 129,129,129,129,129, 2,129, 2,129,129,129,129, 2,129,129,129,
+ 129,129,129,129,129,129,129,129,129,129,129,129, 2,129,129,129,
+ 2, 2, 2, 2, 2, 2,109,109,109,109,109,109,109,109,109,109,
+ 109, 2, 2, 2, 2, 2,109,109, 2, 2, 2, 2, 2, 2,107,107,
+ 107,107, 2,107,107,107,107,107,107,107,107, 2, 2,107,107, 2,
+ 2,107,107,107,107,107,107,107,107,107,107,107,107,107,107, 2,
+ 107,107,107,107,107,107,107, 2,107,107, 2,107,107,107,107,107,
+ 2, 1,107,107,107,107,107, 2, 2,107,107,107, 2, 2,107, 2,
+ 2, 2, 2, 2, 2,107, 2, 2, 2, 2, 2,107,107,107,107,107,
+ 107,107, 2, 2,107,107,107,107,107,107,107, 2, 2, 2,137,137,
+ 137,137,137,137,137,137,137,137,137,137, 2,137,137,137,137,137,
+ 2, 2, 2, 2, 2, 2,124,124,124,124,124,124,124,124,124,124,
+ 2, 2, 2, 2, 2, 2,123,123,123,123,123,123,123,123,123,123,
+ 123,123,123,123, 2, 2,114,114,114,114,114,114,114,114,114,114,
+ 114,114,114, 2, 2, 2,114,114, 2, 2, 2, 2, 2, 2, 32, 32,
+ 32, 32, 32, 2, 2, 2,102,102,102,102,102,102,102,102,102,102,
+ 2, 2, 2, 2, 2, 2,126,126,126,126,126,126,126,126,126,126,
+ 126, 2, 2,126,126,126,126,126,126,126, 2, 2, 2, 2,126,126,
+ 126,126,126,126,126, 2,142,142,142,142,142,142,142,142,142,142,
+ 142,142, 2, 2, 2, 2,125,125,125,125,125,125,125,125,125,125,
+ 125, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,125,154,154,
+ 154,154,154,154,154, 2, 2,154, 2, 2,154,154,154,154,154,154,
+ 154,154, 2,154,154, 2,154,154,154,154,154,154,154,154,154,154,
+ 154,154,154,154, 2,154,154, 2, 2,154,154,154,154,154,154,154,
+ 2, 2, 2, 2, 2, 2,150,150,150,150,150,150,150,150, 2, 2,
+ 150,150,150,150,150,150,150,150,150,150,150, 2, 2, 2,141,141,
+ 141,141,141,141,141,141,140,140,140,140,140,140,140,140,140,140,
+ 140, 2, 2, 2, 2, 2,121,121,121,121,121,121,121,121,121, 2,
+ 2, 2, 2, 2, 2, 2, 7, 7, 2, 2, 2, 2, 2, 2,133,133,
+ 133,133,133,133,133,133,133, 2,133,133,133,133,133,133,133,133,
+ 133,133,133,133,133, 2,133,133,133,133,133,133, 2, 2,133,133,
+ 133,133,133, 2, 2, 2,134,134,134,134,134,134,134,134, 2, 2,
+ 134,134,134,134,134,134, 2,134,134,134,134,134,134,134,134,134,
+ 134,134,134,134,134, 2,138,138,138,138,138,138,138, 2,138,138,
+ 2,138,138,138,138,138,138,138,138,138,138,138,138,138, 2, 2,
+ 138, 2,138,138, 2,138,138,138, 2, 2, 2, 2, 2, 2,143,143,
+ 143,143,143,143, 2,143,143, 2,143,143,143,143,143,143,143,143,
+ 143,143,143,143,143,143,143,143,143,143,143,143,143, 2,143,143,
+ 2,143,143,143,143,143,143, 2, 2, 2, 2, 2, 2, 2,143,143,
+ 2, 2, 2, 2, 2, 2,145,145,145,145,145,145,145,145,145, 2,
+ 2, 2, 2, 2, 2, 2,163,163,163,163,163,163,163,163,163, 2,
+ 163,163,163,163,163,163,163,163,163, 2, 2, 2,163,163,163,163,
+ 2, 2, 2, 2, 2, 2, 86, 2, 2, 2, 2, 2, 2, 2, 22, 22,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 22, 63, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63, 2, 2, 2, 2, 2, 2, 63, 63,
+ 63, 63, 63, 63, 63, 2, 63, 63, 63, 63, 63, 2, 2, 2, 63, 63,
+ 63, 63, 2, 2, 2, 2,157,157,157,157,157,157,157,157,157,157,
+ 157, 2, 2, 2, 2, 2, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 2, 2,127,127,127,127,127,127,127,127,127,127,
+ 127,127,127,127,127, 2, 79, 2, 2, 2, 2, 2, 2, 2,115,115,
+ 115,115,115,115,115,115,115,115,115,115,115,115,115, 2,115,115,
+ 2, 2, 2, 2,115,115,159,159,159,159,159,159,159,159,159,159,
+ 159,159,159,159,159, 2,159,159, 2, 2, 2, 2, 2, 2,103,103,
+ 103,103,103,103,103,103,103,103,103,103,103,103, 2, 2,119,119,
+ 119,119,119,119,119,119,119,119,119,119,119,119, 2, 2,119,119,
+ 2,119,119,119,119,119, 2, 2, 2, 2, 2,119,119,119,146,146,
+ 146,146,146,146,146,146,146,146,146, 2, 2, 2, 2, 2, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99, 99, 2, 2, 2, 2, 99, 2, 2,
+ 2, 2, 2, 2, 2, 99,136,139, 13, 13,155, 2, 2, 2,136,136,
+ 136,136,136,136,136,136,155,155,155,155,155,155,155,155,155,155,
+ 155,155,155,155, 2, 2,136, 2, 2, 2, 2, 2, 2, 2, 17, 17,
+ 17, 17, 2, 17, 17, 17, 17, 17, 17, 17, 2, 17, 17, 2, 17, 15,
+ 15, 15, 15, 15, 15, 15, 17, 17, 17, 2, 2, 2, 2, 2, 2, 2,
+ 15, 2, 2, 2, 2, 2, 15, 15, 15, 2, 2, 17, 2, 2, 2, 2,
+ 2, 2, 17, 17, 17, 17,139,139,139,139,139,139,139,139,139,139,
+ 139,139, 2, 2, 2, 2,105,105,105,105,105,105,105,105,105,105,
+ 105, 2, 2, 2, 2, 2,105,105,105,105,105, 2, 2, 2,105, 2,
+ 2, 2, 2, 2, 2, 2,105,105, 2, 2,105,105,105,105, 1, 1,
+ 1, 1, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 0, 0, 2, 2, 0, 2, 2, 0, 0, 2, 2, 0,
+ 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0,
+ 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2,
+ 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,131,131,
+ 131,131,131,131,131,131,131,131,131,131, 2, 2, 2, 2, 2, 2,
+ 2,131,131,131,131,131, 2,131,131,131,131,131,131,131, 2, 2,
+ 2, 2, 2, 19, 19, 19, 56, 56, 56, 56, 56, 56, 56, 2, 56, 2,
+ 2, 56, 56, 56, 56, 56, 56, 56, 2, 56, 56, 2, 56, 56, 56, 56,
+ 56, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 6,151,151,151,151,151,151,151,151,151,151,
+ 151,151,151, 2, 2, 2,151,151,151,151,151,151, 2, 2,151,151,
+ 2, 2, 2, 2,151,151,160,160,160,160,160,160,160,160,160,160,
+ 160,160,160,160,160, 2,152,152,152,152,152,152,152,152,152,152,
+ 2, 2, 2, 2, 2,152,164,164,164,164,164,164,164,164,164,164,
+ 2, 2, 2, 2, 2, 2, 30, 30, 30, 30, 2, 30, 30, 2,113,113,
+ 113,113,113,113,113,113,113,113,113,113,113, 2, 2,113,113,113,
+ 113,113,113,113,113, 2,132,132,132,132,132,132,132,132,132,132,
+ 132,132, 2, 2, 2, 2,132,132, 2, 2, 2, 2,132,132, 3, 3,
+ 3, 3, 2, 3, 3, 3, 2, 3, 3, 2, 3, 2, 2, 3, 2, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 2, 3,
+ 2, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 3, 2, 3,
+ 2, 3, 2, 3, 3, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
+ 3, 3, 3, 2, 3, 2, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 2, 2,
+ 2, 2, 2, 2, 0, 0, 15, 0, 0, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 13, 2,
+ 2, 2, 2, 2, 2, 2, 13, 13, 13, 2, 2, 2, 2, 2, 2, 0,
+ 2, 2, 2, 2, 2, 2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ 9, 9, 9, 10, 9, 11, 12, 13, 9, 9, 9, 14, 9, 9, 15, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 16, 17, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 18, 19, 20, 9, 21, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 16, 17, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 19,
+ 20, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 22, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
@@ -2137,57 +2161,58 @@ _hb_ucd_u8[17868] =
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 23, 24, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8,
- 9, 10, 11, 12, 0, 0, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 23, 0, 0, 24, 25, 26, 27, 28, 29, 30, 0, 0, 31, 32, 0, 33,
- 0, 34, 0, 35, 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, 0, 0,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 23, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 24, 25, 26, 27, 28,
+ 29, 30, 0, 0, 31, 32, 0, 33, 0, 34, 0, 35, 0, 0, 0, 0,
+ 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 41, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44,
- 0, 45, 0, 0, 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, 0, 48,
- 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 50, 51, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0,
- 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0,
- 56, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 43, 44, 0, 45, 0, 0, 0, 0, 0, 0,
+ 46, 47, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, 0, 0, 0, 52, 0, 0,
+ 53, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0,
+ 55, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0,
+ 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 60, 61, 62, 63, 64, 65,
+ 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 58, 59, 60, 61, 62, 63, 64, 65, 0, 0, 0, 0, 0, 0, 66, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 67, 68, 0, 69, 70, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
+ 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98,
+ 99,100,101,102,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 0, 0,105,106, 0,
+ 107, 0, 0, 0,108, 0,109, 0,110, 0,111,112,113, 0,114, 0,
+ 0, 0,115, 0, 0, 0,116, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 69,
- 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 73, 74,
- 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
- 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 0,
- 0, 0, 0, 0, 0,105,106, 0,107, 0, 0, 0,108, 0,109, 0,
- 110, 0,111,112,113, 0,114, 0, 0, 0,115, 0, 0, 0,116, 0,
+ 0,117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,118,119,120,121, 0,122,123,124,
+ 125,126, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,117, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,128,129,130,131,132,133,134,135,136,137,138,139,
+ 140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,
+ 156,157, 0, 0, 0,158,159,160,161, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,162,163, 0,
+ 0, 0, 0, 0, 0, 0,164, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 118,119,120,121, 0,122,123,124,125,126, 0,127, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,165, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,166,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,129,130,131,
- 132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,
- 148,149,150,151,152,153,154,155,156,157, 0, 0, 0,158,159,160,
- 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,162,163, 0, 0, 0, 0, 0, 0, 0,164, 0,
+ 0, 0, 0, 0, 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,169,170, 0, 0, 0, 0,171,
+ 172, 0, 0, 0,173,174,175,176,177,178,179,180,181,182,183,184,
+ 185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,
+ 201,202,203,204,205,206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0,167, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0,169,170, 0, 0, 0, 0,171,172, 0, 0, 0,173,174,175,176,
- 177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,
- 193,194,195,196,197,198,199,200,201,202,203,204,205,206, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4,
+ 1, 2, 3, 4,
};
static const uint16_t
_hb_ucd_u16[9320] =
@@ -2802,7 +2827,7 @@ _hb_ucd_gc (unsigned u)
static inline uint_fast8_t
_hb_ucd_ccc (unsigned u)
{
- return u<125259u?_hb_ucd_u8[8792+(((_hb_ucd_u8[8236+(((_hb_ucd_u8[7776+(((_hb_ucd_u8[7424+(((_hb_ucd_u8[7178+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0;
+ return u<125259u?_hb_ucd_u8[9184+(((_hb_ucd_u8[8128+(((_hb_ucd_u8[7424+(((_hb_ucd_u8[7178+(u>>2>>3>>4)])<<4)+((u>>2>>3)&15u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u))]:0;
}
static inline unsigned
_hb_ucd_b4 (const uint8_t* a, unsigned i)
@@ -2812,24 +2837,24 @@ _hb_ucd_b4 (const uint8_t* a, unsigned i)
static inline int_fast16_t
_hb_ucd_bmg (unsigned u)
{
- return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9540+(((_hb_ucd_u8[9420+(((_hb_ucd_b4(9292+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0;
+ return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9932+(((_hb_ucd_u8[9812+(((_hb_ucd_b4(9684+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0;
}
static inline uint_fast8_t
_hb_ucd_sc (unsigned u)
{
- return u<918000u?_hb_ucd_u8[11062+(((_hb_ucd_u16[2040+(((_hb_ucd_u8[10326+(((_hb_ucd_u8[9876+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2;
+ return u<918000u?_hb_ucd_u8[11454+(((_hb_ucd_u16[2040+(((_hb_ucd_u8[10718+(((_hb_ucd_u8[10268+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2;
}
static inline uint_fast16_t
_hb_ucd_dm (unsigned u)
{
- return u<195102u?_hb_ucd_u16[6008+(((_hb_ucd_u8[17068+(((_hb_ucd_u8[16686+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0;
+ return u<195102u?_hb_ucd_u16[6008+(((_hb_ucd_u8[17460+(((_hb_ucd_u8[17078+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0;
}
#elif !defined(HB_NO_UCD_UNASSIGNED)
static const uint8_t
-_hb_ucd_u8[14744] =
+_hb_ucd_u8[17868] =
{
0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 9, 10, 7, 7, 7, 7, 11, 12, 13, 13, 13, 14,
@@ -3411,54 +3436,50 @@ _hb_ucd_u8[14744] =
0,230,220, 0, 0, 0,220,220, 0, 0,230,220, 0, 9, 7, 0,
0, 7, 9, 0, 0, 0, 9, 7, 6, 6, 0, 0, 0, 0, 1, 0,
0,216,216, 1, 1, 1, 0, 0, 0,226,216,216,216,216,216, 0,
- 220,220,220, 0,232,232,220,230,230,230, 7, 0, 16, 17, 17, 33,
- 17, 49, 17, 17, 84, 97,135,145, 26, 17, 17, 17, 17, 17, 17, 17,
+ 220,220,220, 0,232,232,220,230,230,230, 7, 0, 16, 17, 17, 17,
+ 17, 17, 17, 33, 17, 17, 17, 19, 17, 17, 17, 17, 20,101, 17,113,
+ 129,169, 17, 27, 28, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,177, 0, 1, 2, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 4, 3, 3, 3, 3, 3, 5, 3, 3, 3, 3, 3, 6, 7, 8, 3,
- 3, 3, 3, 3, 9, 10, 11, 12, 13, 3, 3, 3, 3, 3, 3, 3,
- 3, 14, 3, 15, 3, 3, 3, 3, 3, 3, 16, 17, 18, 19, 20, 21,
- 3, 3, 3, 22, 23, 24, 3, 3, 3, 3, 3, 3, 25, 3, 3, 3,
- 3, 3, 3, 3, 3, 26, 3, 3, 27, 28, 0, 1, 0, 0, 0, 0,
- 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0,
- 0, 4, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 8, 9, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 0,
- 0, 0, 0, 0, 0, 10, 11, 12, 13, 0, 0, 14, 15, 16, 6, 0,
- 17, 18, 19, 19, 19, 20, 21, 22, 23, 24, 19, 25, 0, 26, 27, 19,
- 19, 28, 29, 30, 0, 31, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0,
- 0, 19, 28, 0, 32, 33, 9, 34, 35, 19, 0, 0, 36, 37, 38, 39,
- 40, 19, 0, 41, 42, 43, 44, 31, 0, 1, 45, 42, 0, 0, 0, 0,
- 0, 32, 14, 14, 0, 0, 0, 0, 14, 0, 0, 46, 47, 47, 47, 47,
- 48, 49, 47, 47, 47, 47, 50, 51, 52, 53, 43, 21, 0, 0, 0, 0,
- 0, 0, 0, 54, 6, 55, 0, 14, 19, 1, 0, 0, 0, 0, 56, 57,
- 0, 0, 0, 0, 0, 19, 58, 31, 0, 0, 0, 0, 0, 0, 0, 59,
- 14, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 60,
- 61, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 3,
- 0, 4, 5, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 1, 1, 0,
- 0, 8, 9, 0, 8, 9, 0, 0, 0, 0, 8, 9, 10, 11, 12, 0,
- 0, 0, 13, 0, 0, 0, 0, 14, 15, 16, 17, 0, 0, 0, 1, 0,
- 0, 18, 19, 0, 0, 0, 20, 0, 0, 0, 1, 1, 1, 1, 0, 1,
- 1, 1, 1, 1, 1, 1, 0, 8, 21, 9, 0, 0, 22, 0, 0, 0,
- 0, 1, 0, 23, 24, 25, 0, 0, 26, 0, 0, 0, 8, 21, 27, 0,
- 1, 0, 0, 1, 1, 1, 1, 0, 1, 28, 29, 30, 0, 31, 32, 20,
- 1, 1, 0, 0, 0, 8, 21, 9, 1, 4, 5, 0, 0, 0, 33, 9,
- 0, 1, 1, 1, 0, 8, 21, 21, 21, 21, 34, 1, 35, 21, 21, 21,
- 9, 36, 0, 0, 37, 38, 1, 0, 39, 0, 0, 0, 1, 0, 1, 0,
- 0, 0, 0, 8, 21, 9, 1, 0, 0, 0, 40, 0, 8, 21, 21, 21,
- 21, 21, 21, 21, 21, 9, 0, 1, 1, 1, 1, 8, 21, 21, 21, 9,
- 0, 0, 0, 41, 0, 42, 43, 0, 0, 0, 1, 44, 0, 0, 0, 45,
- 8, 9, 1, 0, 0, 0, 8, 21, 21, 21, 9, 0, 1, 0, 1, 1,
- 8, 21, 21, 9, 0, 4, 5, 8, 9, 1, 0, 0, 0, 1, 2, 3,
- 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 9, 10, 11, 11, 11, 11, 12, 13, 13, 13, 13, 14, 15, 16, 17, 18,
- 19, 20, 21, 13, 22, 13, 13, 13, 13, 23, 24, 24, 25, 26, 13, 13,
- 13, 27, 28, 29, 13, 30, 31, 32, 33, 34, 35, 36, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 37, 7, 38, 39, 7, 40, 7, 7, 7, 41, 13, 42, 7, 7, 43, 7,
- 44, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,237, 0, 1, 2, 2,
+ 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 6, 7, 8,
+ 9, 0, 0, 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 21, 22, 0, 0, 0, 0,
+ 23, 24, 25, 26, 0, 27, 0, 28, 29, 30, 31, 32, 0, 0, 0, 0,
+ 0, 0, 0, 33, 34, 35, 36, 0, 0, 0, 0, 0, 37, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 38, 39, 0, 0, 0, 0, 1, 2, 40, 41,
+ 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 5, 0,
+ 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0,
+ 0, 0, 8, 9, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10,
+ 0, 0, 0, 0, 0, 0, 11, 12, 0, 13, 0, 14, 15, 16, 0, 0,
+ 0, 0, 0, 1, 17, 18, 0, 19, 7, 1, 0, 0, 0, 20, 20, 7,
+ 20, 20, 20, 20, 20, 20, 20, 8, 21, 0, 22, 0, 7, 23, 24, 0,
+ 20, 20, 25, 0, 0, 0, 26, 27, 1, 7, 20, 20, 20, 20, 20, 1,
+ 28, 29, 30, 31, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 10, 0,
+ 0, 0, 0, 0, 0, 0, 20, 20, 20, 1, 0, 0, 8, 21, 32, 4,
+ 0, 10, 0, 33, 7, 20, 20, 20, 0, 0, 0, 0, 8, 34, 34, 35,
+ 36, 34, 37, 0, 38, 1, 20, 20, 0, 0, 39, 0, 1, 1, 0, 8,
+ 21, 1, 20, 0, 0, 0, 1, 0, 0, 40, 1, 1, 0, 0, 8, 21,
+ 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 26, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 21, 7, 20, 41, 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 21, 0, 42, 43, 44, 0, 45, 0, 8, 21, 0, 0, 0, 0, 0,
+ 0, 0, 0, 46, 7, 1, 10, 1, 0, 0, 0, 1, 20, 20, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 34, 9, 0, 0, 20, 20,
+ 1, 20, 20, 0, 0, 0, 0, 0, 0, 0, 26, 21, 0, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 47, 48, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 11, 11, 11, 12, 13,
+ 13, 13, 13, 14, 15, 16, 17, 18, 19, 20, 21, 13, 22, 13, 13, 13,
+ 13, 23, 24, 24, 25, 26, 13, 13, 13, 27, 28, 29, 13, 30, 31, 32,
+ 33, 34, 35, 36, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 37, 7, 38, 39, 7, 40, 7, 7,
+ 7, 41, 13, 42, 7, 7, 43, 7, 44, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
@@ -3479,221 +3500,420 @@ _hb_ucd_u8[14744] =
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 45, 0, 0, 1,
- 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
- 32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38, 39, 40, 41, 42,
- 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 2, 2, 53, 54, 55, 56,
- 57, 58, 59, 59, 59, 59, 60, 59, 59, 59, 59, 59, 59, 59, 61, 61,
- 59, 59, 59, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
- 74, 75, 76, 77, 78, 59, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 45, 0, 0, 1, 2, 2, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 37,
+ 37, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+ 51, 52, 2, 2, 53, 54, 55, 56, 57, 58, 59, 59, 59, 59, 60, 59,
+ 59, 59, 59, 59, 59, 59, 61, 61, 59, 59, 59, 59, 62, 63, 64, 65,
+ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 59, 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, 79, 70, 70, 70, 70, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 81, 82, 82, 83, 84, 85, 86, 87, 88,
- 89, 90, 91, 92, 93, 94, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 79, 70, 70, 70, 70, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81,
+ 82, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 32, 32,
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 95, 96, 96,
- 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
- 70, 70, 97, 98, 99,100,101,101,102,103,104,105,106,107,108,109,
- 110,111, 96,112,113,114,115,116,117,118,119,119,120,121,122,123,
- 124,125,126,127,128,129,130,131,132, 96,133,134,135,136,137,138,
- 139,140,141,142,143, 96,144,145, 96,146,147,148,149, 96,150,151,
- 152,153,154,155,156, 96,157,158,159,160, 96,161,162,163,164,164,
- 164,164,164,164,164,165,166,164,167, 96, 96, 96, 96, 96, 96, 96,
- 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,168,169,169,
- 169,169,169,169,169,169,170, 96, 96, 96, 96, 96, 96, 96, 96, 96,
- 96, 96, 96, 96, 96, 96,171,171,171,171,172, 96, 96, 96,173,173,
- 173,173,174,175,176,177, 96, 96, 96, 96,178,179,180,181,182,182,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, 97, 98, 99,100,101,101,
+ 102,103,104,105,106,107,108,109,110,111, 96,112,113,114,115,116,
+ 117,118,119,119,120,121,122,123,124,125,126,127,128,129,130,131,
+ 132, 96,133,134,135,136,137,138,139,140,141,142,143, 96,144,145,
+ 96,146,147,148,149, 96,150,151,152,153,154,155,156, 96,157,158,
+ 159,160, 96,161,162,163,164,164,164,164,164,164,164,165,166,164,
+ 167, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96,168,169,169,169,169,169,169,169,169,170, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,171,171,
+ 171,171,172, 96, 96, 96,173,173,173,173,174,175,176,177, 96, 96,
+ 96, 96,178,179,180,181,182,182,182,182,182,182,182,182,182,182,
182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
- 182,182,182,182,182,182,182,182,182,182,182,182,182,183,182,182,
- 182,182,182,182,184,184,184,185,186, 96, 96, 96, 96, 96, 96, 96,
- 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,187,188,189,
- 190,191,191,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
- 96, 96, 96, 96, 96, 96,193,194, 96, 96, 96, 96, 96, 96, 96, 96,
- 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,195,196, 59,197,
- 198,199,200,201,202, 96,203,204,205, 59, 59,206, 59,207,208,208,
- 208,208,208,209, 96, 96, 96, 96, 96, 96, 96, 96,210, 96,211,212,
- 213, 96, 96,214, 96, 96, 96,215, 96, 96, 96, 96, 96,216,217,218,
- 219, 96, 96, 96, 96, 96,220,221,222, 96,223,224, 96, 96,225,226,
- 59,227,228, 96, 59, 59, 59, 59, 59, 59, 59,229,230,231,232,233,
- 59, 59,234,235, 59,236, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70,
- 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,237, 70, 70, 70, 70,
- 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,238, 70,239, 70,
+ 182,182,182,182,182,183,182,182,182,182,182,182,184,184,184,185,
+ 186, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96,187,188,189,190,191,191,192, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,193,194,
+ 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96,195,196, 59,197,198,199,200,201,202, 96,203,204,
+ 205, 59, 59,206, 59,207,208,208,208,208,208,209, 96, 96, 96, 96,
+ 96, 96, 96, 96,210, 96,211,212,213, 96, 96,214, 96, 96, 96,215,
+ 96, 96, 96, 96, 96,216,217,218,219, 96, 96, 96, 96, 96,220,221,
+ 222, 96,223,224, 96, 96,225,226, 59,227,228, 96, 59, 59, 59, 59,
+ 59, 59, 59,229,230,231,232,233, 59, 59,234,235, 59,236, 96, 96,
+ 96, 96, 96, 96, 96, 96, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70,237, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
+ 70, 70, 70, 70,238, 70,239, 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,240, 70, 70, 70, 70,
- 70, 70, 70, 70, 70,241, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70,
- 70, 70,242, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70,
- 70, 70, 70, 70,243, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 70, 70,244, 96, 96, 96, 96, 96, 96, 96, 96,245, 96,
- 246,247, 0, 1, 2, 2, 0, 1, 2, 2, 2, 3, 4, 5, 0, 0,
- 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0,
- 19, 0, 19, 0, 0, 0, 0, 0, 26, 26, 1, 1, 1, 1, 9, 9,
- 9, 9, 0, 9, 9, 9, 2, 2, 9, 9, 9, 9, 0, 9, 2, 2,
- 2, 2, 9, 0, 9, 0, 9, 9, 9, 2, 9, 2, 9, 9, 9, 9,
- 2, 9, 9, 9, 55, 55, 55, 55, 55, 55, 6, 6, 6, 6, 6, 1,
- 1, 6, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 14,
- 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 2, 2, 2, 14, 14, 2,
- 2, 2, 3, 3, 3, 3, 3, 0, 3, 3, 0, 3, 3, 3, 3, 3,
- 3, 0, 3, 3, 3, 1, 1, 1, 3, 3, 1, 3, 3, 3, 37, 37,
- 37, 37, 37, 37, 2, 37, 37, 37, 37, 2, 2, 37, 37, 37, 38, 38,
- 38, 38, 38, 38, 2, 2, 64, 64, 64, 64, 64, 64, 64, 2, 2, 64,
- 64, 64, 90, 90, 90, 90, 90, 90, 2, 2, 90, 90, 90, 2, 95, 95,
- 95, 95, 2, 2, 95, 2, 3, 3, 3, 2, 3, 3, 2, 2, 3, 3,
- 0, 3, 7, 7, 7, 7, 7, 1, 1, 1, 1, 7, 7, 7, 0, 0,
- 7, 7, 5, 5, 5, 5, 2, 5, 5, 5, 5, 2, 2, 5, 5, 2,
- 5, 5, 5, 2, 5, 2, 2, 2, 5, 5, 5, 5, 2, 2, 5, 5,
- 5, 2, 2, 2, 2, 5, 5, 5, 2, 5, 2, 11, 11, 11, 11, 11,
- 11, 2, 2, 2, 2, 11, 11, 2, 2, 11, 11, 11, 11, 11, 11, 2,
- 11, 11, 2, 11, 11, 2, 11, 11, 2, 2, 2, 11, 2, 2, 11, 2,
- 11, 2, 2, 2, 11, 11, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 2, 10, 10, 2, 10, 10, 10, 10, 2, 2, 10, 2, 2, 2, 2, 2,
- 10, 10, 2, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2,
- 21, 21, 21, 21, 2, 2, 21, 21, 2, 21, 2, 2, 21, 21, 2, 2,
- 22, 22, 2, 22, 22, 22, 22, 22, 22, 2, 22, 2, 22, 22, 22, 22,
- 2, 2, 2, 22, 22, 2, 2, 2, 2, 22, 22, 2, 2, 2, 22, 22,
- 22, 22, 23, 23, 23, 23, 23, 2, 23, 23, 23, 23, 2, 2, 2, 23,
- 23, 2, 23, 23, 23, 2, 2, 23, 2, 2, 2, 2, 23, 23, 2, 2,
- 2, 23, 16, 16, 16, 16, 16, 2, 16, 16, 2, 16, 16, 16, 16, 16,
- 2, 2, 2, 16, 16, 2, 2, 2, 16, 16, 20, 20, 20, 20, 20, 2,
- 20, 20, 2, 2, 20, 20, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 2, 2, 2, 36, 36, 36, 36, 2, 36, 2, 36, 2, 2, 2, 2,
- 36, 2, 2, 2, 2, 36, 36, 2, 36, 2, 36, 2, 2, 2, 2, 24,
- 24, 24, 24, 24, 24, 24, 24, 24, 24, 2, 2, 2, 2, 0, 2, 18,
- 18, 2, 18, 2, 18, 18, 18, 18, 18, 2, 18, 18, 18, 18, 2, 18,
- 2, 18, 18, 18, 2, 2, 18, 2, 18, 2, 25, 25, 25, 25, 2, 25,
- 25, 25, 25, 2, 2, 2, 25, 2, 25, 25, 25, 0, 0, 0, 0, 25,
- 25, 2, 33, 33, 33, 33, 8, 8, 8, 8, 8, 8, 2, 8, 2, 8,
- 2, 2, 8, 8, 8, 0, 12, 12, 12, 12, 30, 30, 30, 30, 30, 2,
- 30, 30, 30, 30, 2, 2, 30, 30, 30, 2, 2, 30, 30, 30, 30, 2,
- 2, 2, 29, 29, 29, 29, 29, 29, 2, 2, 28, 28, 28, 28, 34, 34,
- 34, 34, 34, 2, 2, 2, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0,
- 35, 35, 35, 2, 2, 2, 45, 45, 45, 45, 45, 45, 2, 2, 2, 2,
- 2, 45, 44, 44, 44, 44, 44, 0, 0, 2, 43, 43, 43, 43, 46, 46,
- 46, 46, 46, 2, 46, 46, 31, 31, 31, 31, 31, 31, 2, 2, 32, 32,
- 0, 0, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, 2, 2, 32, 2,
- 2, 2, 32, 32, 32, 2, 28, 28, 2, 2, 48, 48, 48, 48, 48, 48,
- 48, 2, 48, 2, 2, 2, 52, 52, 52, 52, 52, 52, 2, 2, 52, 2,
- 2, 2, 58, 58, 58, 58, 58, 58, 2, 2, 58, 58, 58, 2, 2, 2,
- 58, 58, 54, 54, 54, 54, 2, 2, 54, 54, 91, 91, 91, 91, 91, 91,
- 91, 2, 91, 2, 2, 91, 91, 91, 2, 2, 1, 1, 1, 2, 62, 62,
- 62, 62, 62, 2, 2, 2, 62, 62, 62, 2, 76, 76, 76, 76, 93, 93,
- 93, 93, 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 2, 2, 2, 70,
- 70, 70, 73, 73, 73, 73, 6, 2, 2, 2, 8, 8, 8, 2, 2, 8,
- 8, 8, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1,
- 0, 0, 1, 1, 0, 2, 19, 19, 9, 9, 9, 9, 9, 6, 19, 9,
- 9, 9, 9, 9, 19, 19, 9, 9, 9, 19, 6, 19, 19, 19, 19, 19,
- 19, 9, 9, 9, 2, 2, 2, 9, 2, 9, 2, 9, 9, 9, 1, 1,
- 0, 0, 0, 2, 0, 0, 0, 19, 2, 2, 0, 0, 0, 19, 0, 0,
- 0, 2, 19, 2, 2, 2, 0, 2, 2, 2, 1, 2, 2, 2, 0, 0,
- 9, 0, 0, 0, 19, 19, 27, 27, 27, 27, 2, 2, 0, 0, 0, 0,
- 2, 0, 56, 56, 56, 56, 2, 55, 55, 55, 61, 61, 61, 61, 2, 2,
- 2, 61, 61, 2, 2, 2, 0, 0, 2, 2, 13, 13, 13, 13, 13, 13,
- 2, 13, 13, 13, 2, 2, 0, 13, 0, 13, 0, 13, 13, 13, 13, 13,
- 1, 1, 1, 1, 12, 12, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 2, 2, 1, 1, 0, 0, 15, 15, 15, 0, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 0, 2, 26, 26, 26, 26, 26, 26, 26, 2, 12,
- 12, 12, 12, 12, 12, 2, 12, 12, 12, 0, 39, 39, 39, 39, 39, 2,
- 2, 2, 39, 39, 39, 2, 86, 86, 86, 86, 77, 77, 77, 77, 79, 79,
- 79, 79, 19, 19, 19, 2, 19, 19, 2, 19, 2, 19, 19, 19, 19, 19,
- 2, 2, 2, 2, 19, 19, 60, 60, 60, 60, 60, 2, 2, 2, 65, 65,
- 65, 65, 75, 75, 75, 75, 75, 75, 2, 2, 2, 2, 75, 75, 69, 69,
- 69, 69, 69, 69, 0, 69, 74, 74, 74, 74, 2, 2, 2, 74, 12, 2,
- 2, 2, 84, 84, 84, 84, 84, 84, 2, 0, 84, 84, 2, 2, 2, 2,
- 84, 84, 33, 33, 33, 2, 68, 68, 68, 68, 68, 68, 68, 2, 68, 68,
- 2, 2, 92, 92, 92, 92, 92, 92, 92, 2, 2, 2, 2, 92, 87, 87,
- 87, 87, 87, 87, 87, 2, 19, 9, 19, 19, 19, 19, 0, 0, 87, 87,
- 2, 2, 2, 2, 2, 12, 2, 2, 2, 4, 14, 2, 14, 2, 14, 14,
- 2, 14, 14, 2, 14, 14, 2, 2, 2, 3, 3, 3, 0, 0, 2, 2,
- 3, 3, 1, 1, 6, 6, 3, 2, 3, 3, 3, 2, 2, 0, 2, 0,
- 0, 0, 0, 0, 17, 17, 17, 17, 0, 0, 2, 2, 12, 12, 49, 49,
- 49, 49, 2, 49, 49, 49, 49, 49, 49, 2, 49, 49, 2, 49, 49, 49,
- 2, 2, 9, 2, 2, 2, 0, 1, 2, 2, 71, 71, 71, 71, 71, 2,
- 2, 2, 67, 67, 67, 67, 67, 2, 2, 2, 42, 42, 42, 42, 2, 42,
- 42, 42, 41, 41, 41, 41, 41, 41, 41, 2,118,118,118,118,118,118,
- 118, 2, 53, 53, 53, 53, 53, 53, 2, 53, 59, 59, 59, 59, 59, 59,
- 2, 2, 40, 40, 40, 40, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50,
- 2, 2,135,135,135,135,106,106,106,106,104,104,104,104, 2, 2,
- 2,104,161,161,161,161,161,161,161, 2,161,161, 2,161,161, 2,
- 2, 2,110,110,110,110,110,110,110, 2,110,110, 2, 2, 19, 2,
- 19, 19, 47, 47, 47, 47, 47, 47, 2, 2, 47, 2, 47, 47, 47, 47,
- 2, 47, 47, 2, 2, 2, 47, 2, 2, 47, 81, 81, 81, 81, 81, 81,
- 2, 81,120,120,120,120,116,116,116,116,116,116,116, 2, 2, 2,
- 2,116,128,128,128,128,128,128,128, 2,128,128, 2, 2, 2, 2,
- 2,128, 66, 66, 66, 66, 2, 2, 2, 66, 72, 72, 72, 72, 72, 72,
- 2, 2, 2, 2, 2, 72, 98, 98, 98, 98, 97, 97, 97, 97, 2, 2,
- 97, 97, 57, 57, 57, 57, 2, 57, 57, 2, 2, 57, 57, 57, 57, 57,
- 2, 2, 57, 57, 57, 2, 2, 2, 2, 57, 57, 2, 2, 2, 88, 88,
- 88, 88,117,117,117,117,112,112,112,112,112,112,112, 2, 2, 2,
- 2,112, 78, 78, 78, 78, 78, 78, 2, 2, 2, 78, 78, 78, 83, 83,
- 83, 83, 83, 83, 2, 2, 82, 82, 82, 82, 82, 82, 82, 2,122,122,
- 122,122,122,122, 2, 2, 2,122,122,122,122, 2, 2, 2, 89, 89,
- 89, 89, 89, 2, 2, 2,130,130,130,130,130,130,130, 2, 2, 2,
- 130,130,144,144,144,144,144,144, 2, 2,156,156,156,156,156,156,
- 2,156,156,156, 2, 2, 2, 3, 3, 3,147,147,147,147,148,148,
- 148,148,148,148, 2, 2,158,158,158,158,158,158, 2, 2,153,153,
- 153,153,149,149,149,149,149,149,149, 2, 94, 94, 94, 94, 94, 94,
- 2, 2, 2, 2, 94, 94, 2, 2, 2, 94, 85, 85, 85, 85, 85, 85,
- 85, 2, 2, 85, 2, 2,101,101,101,101,101, 2, 2, 2,101,101,
- 2, 2, 96, 96, 96, 96, 96, 2, 96, 96,111,111,111,111,111,111,
- 111, 2,100,100,100,100,108,108,108,108,108,108, 2,108,108,108,
- 2, 2,129,129,129,129,129,129,129, 2,129, 2,129,129,129,129,
- 2,129,129,129, 2, 2,109,109,109,109,109,109,109, 2,109,109,
- 2, 2,107,107,107,107, 2,107,107,107,107, 2, 2,107,107, 2,
- 107,107,107,107, 2, 1,107,107, 2, 2,107, 2, 2, 2, 2, 2,
- 2,107, 2, 2,107,107,137,137,137,137, 2,137,137,137,137,137,
- 2, 2,124,124,124,124,124,124, 2, 2,123,123,123,123,123,123,
- 2, 2,114,114,114,114,114, 2, 2, 2,114,114, 2, 2,102,102,
- 102,102,102,102, 2, 2,126,126,126,126,126,126,126, 2, 2,126,
- 126,126,142,142,142,142,125,125,125,125,125,125,125, 2, 2, 2,
- 2,125,154,154,154,154,154,154,154, 2, 2,154, 2, 2, 2,154,
- 154, 2,154,154, 2,154,154, 2, 2,154,154,154, 2, 2,150,150,
- 150,150, 2, 2,150,150,150, 2, 2, 2,141,141,141,141,140,140,
- 140,140,140,140,140, 2,121,121,121,121,121, 2, 2, 2, 7, 7,
- 2, 2,133,133,133,133,133, 2,133,133,133,133,133, 2,133,133,
- 2, 2,133, 2, 2, 2,134,134,134,134, 2, 2,134,134, 2,134,
- 134,134,134,134,134, 2,138,138,138,138,138,138,138, 2,138,138,
- 2,138, 2, 2,138, 2,138,138, 2, 2,143,143,143,143,143,143,
- 2,143,143, 2,143,143,143,143,143, 2,143, 2, 2, 2,143,143,
- 2, 2,145,145,145,145,145, 2, 2, 2,163,163,163,163,163, 2,
- 163,163,163,163,163, 2, 2, 2,163,163,163,163, 2, 2, 86, 2,
- 2, 2, 63, 63, 63, 63, 63, 63, 2, 2, 63, 63, 63, 2, 63, 2,
- 2, 2,157,157,157,157,157,157,157, 2, 80, 80, 80, 80, 80, 80,
- 2, 2,127,127,127,127,127,127,127, 2, 79, 2, 2, 2,115,115,
+ 70, 70, 70,240, 70, 70, 70, 70, 70, 70, 70, 70, 70,241, 96, 96,
+ 96, 96, 96, 96, 96, 96, 70, 70, 70, 70,242, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96, 70, 70, 70, 70, 70, 70,243, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,244, 96, 96,
+ 96, 96, 96, 96, 96, 96,245, 96,246,247, 0, 1, 2, 2, 0, 1,
+ 2, 2, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 19, 19,
+ 19, 19, 19, 19, 19, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19,
+ 19, 19, 19, 0, 0, 0, 0, 0, 26, 26, 0, 0, 0, 0, 1, 1,
+ 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 0, 9, 9, 9, 2, 2,
+ 9, 9, 9, 9, 0, 9, 2, 2, 2, 2, 9, 0, 9, 0, 9, 9,
+ 9, 2, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 2, 9, 9, 9, 9, 9, 9, 9, 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 1, 1, 6, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4,
+ 4, 2, 2, 4, 4, 4, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 2, 2, 2, 2, 2, 2, 2, 2, 14, 14,
+ 14, 2, 2, 2, 2, 14, 14, 14, 14, 14, 14, 2, 2, 2, 3, 3,
+ 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 0, 0, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 2, 37, 37, 37,
+ 37, 2, 2, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+ 2, 2, 2, 2, 2, 2, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 2, 2, 64, 64, 64, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 2, 2, 90, 90, 90, 90, 90, 90, 90, 2, 95, 95,
+ 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 2, 2, 95, 2, 37, 37,
+ 37, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3,
+ 2, 2, 2, 2, 2, 2, 3, 3, 0, 3, 3, 3, 3, 3, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 7, 7, 7, 7, 7,
+ 7, 7, 0, 0, 7, 7, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5,
+ 5, 5, 5, 2, 2, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 2,
+ 5, 2, 2, 2, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 2,
+ 2, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2,
+ 2, 2, 5, 5, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 2, 2, 11, 11, 11, 2, 11, 11, 11, 11, 11,
+ 11, 2, 2, 2, 2, 11, 11, 2, 2, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, 11, 11, 11, 11, 11, 2,
+ 11, 11, 2, 11, 11, 2, 11, 11, 2, 2, 11, 2, 11, 11, 11, 2,
+ 2, 11, 11, 11, 2, 2, 2, 11, 2, 2, 2, 2, 2, 2, 2, 11,
+ 11, 11, 11, 2, 11, 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 2, 2, 10, 10, 10, 2, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 2, 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 2,
+ 10, 10, 2, 10, 10, 10, 10, 10, 2, 2, 10, 10, 10, 10, 10, 10,
+ 2, 10, 10, 10, 2, 2, 10, 2, 2, 2, 2, 2, 2, 2, 10, 10,
+ 10, 10, 2, 2, 10, 10, 10, 10, 2, 2, 2, 2, 2, 2, 2, 10,
+ 10, 10, 10, 10, 10, 10, 2, 21, 21, 21, 2, 21, 21, 21, 21, 21,
+ 21, 21, 21, 2, 2, 21, 21, 2, 2, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 2,
+ 21, 21, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, 21, 21, 2,
+ 2, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 2, 2,
+ 2, 2, 21, 21, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, 2,
+ 22, 22, 2, 22, 22, 22, 22, 22, 22, 2, 2, 2, 22, 22, 22, 2,
+ 22, 22, 22, 22, 2, 2, 2, 22, 22, 2, 22, 2, 22, 22, 2, 2,
+ 2, 22, 22, 2, 2, 2, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 2, 2, 2, 2, 22, 22, 22, 2, 2, 2, 2, 2, 2, 22, 2, 2,
+ 2, 2, 2, 2, 22, 22, 22, 22, 22, 2, 2, 2, 2, 2, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 2, 23, 23, 23, 2,
+ 23, 23, 23, 23, 23, 23, 23, 23, 2, 2, 23, 23, 23, 23, 23, 2,
+ 23, 23, 23, 23, 2, 2, 2, 2, 2, 2, 2, 23, 23, 2, 23, 23,
+ 23, 2, 2, 23, 2, 2, 23, 23, 23, 23, 2, 2, 23, 23, 2, 2,
+ 2, 2, 2, 2, 2, 23, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 2, 16, 16, 16, 2, 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 2, 16, 16, 16, 16, 16, 2, 2, 16, 16, 16, 16, 16, 2,
+ 16, 16, 16, 16, 2, 2, 2, 2, 2, 2, 2, 16, 16, 2, 16, 16,
+ 16, 16, 2, 2, 16, 16, 2, 16, 16, 16, 2, 2, 2, 2, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 2, 20, 20, 20, 2,
+ 20, 20, 20, 20, 20, 20, 2, 2, 2, 2, 20, 20, 20, 20, 20, 20,
+ 20, 20, 2, 2, 20, 20, 2, 36, 36, 36, 2, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2,
+ 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 2, 36, 2, 2, 2, 2, 36, 2, 2, 2, 2, 36, 36, 36,
+ 36, 36, 36, 2, 36, 2, 2, 2, 2, 2, 2, 2, 36, 36, 2, 2,
+ 36, 36, 36, 2, 2, 2, 2, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 2, 2, 2, 2, 0, 24, 24,
+ 24, 24, 2, 2, 2, 2, 2, 18, 18, 2, 18, 2, 18, 18, 18, 18,
+ 18, 2, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 2, 18, 2, 18, 18, 18, 18, 18, 18, 18, 2, 2, 18, 18,
+ 18, 18, 18, 2, 18, 2, 18, 18, 18, 18, 18, 18, 18, 2, 18, 18,
+ 2, 2, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 2, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 2, 2, 2, 25, 25,
+ 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 25,
+ 25, 2, 2, 2, 2, 2, 33, 33, 33, 33, 33, 33, 33, 33, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 2, 8, 2, 2,
+ 2, 2, 2, 8, 2, 2, 8, 8, 8, 0, 8, 8, 8, 8, 12, 12,
+ 12, 12, 12, 12, 12, 12, 30, 30, 30, 30, 30, 30, 30, 30, 30, 2,
+ 30, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 2, 30, 30,
+ 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 30, 2, 2, 2, 30, 30,
+ 2, 2, 2, 2, 2, 2, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 2, 2, 28, 28, 28, 28, 28, 28, 28, 28, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 2, 2, 2, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 35, 35, 35, 2,
+ 2, 2, 2, 2, 2, 2, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 2, 2, 2, 2, 2, 2, 2, 2, 2, 45, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 2, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 2, 2, 2, 2, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 2, 46, 46, 46, 2,
+ 46, 46, 2, 2, 2, 2, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 2, 2, 31, 31, 2, 2, 2, 2, 2, 2, 32, 32,
+ 0, 0, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 2, 2, 2, 2, 2, 2, 32, 2, 2, 2, 2, 2, 2, 2, 32, 32,
+ 32, 2, 2, 2, 2, 2, 28, 28, 28, 28, 28, 28, 2, 2, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 2, 48, 48,
+ 48, 48, 2, 2, 2, 2, 48, 2, 2, 2, 48, 48, 48, 48, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 2, 2, 52, 52,
+ 52, 52, 52, 2, 2, 2, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 2, 2, 2, 2, 58, 58, 2, 2, 2, 2, 2, 2, 58, 58,
+ 58, 2, 2, 2, 58, 58, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 2, 2, 54, 54, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 2, 91, 91, 91, 91, 91, 2, 2, 91, 91, 91,
+ 2, 2, 2, 2, 2, 2, 91, 91, 91, 91, 91, 91, 2, 2, 1, 1,
+ 1, 1, 1, 1, 1, 2, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 2, 2, 2, 62, 62, 62, 62, 62, 62, 62, 2, 76, 76,
+ 76, 76, 76, 76, 76, 76, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 93, 2, 2, 2, 2, 2, 2, 2, 2, 93, 93, 93, 93, 70, 70,
+ 70, 70, 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 70, 70, 70, 70,
+ 2, 2, 2, 70, 70, 70, 73, 73, 73, 73, 73, 73, 73, 73, 6, 2,
+ 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 8, 8, 8, 1, 1,
+ 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1,
+ 0, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, 9, 9, 9, 9,
+ 9, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 9, 9, 9, 9,
+ 19, 19, 19, 19, 9, 9, 9, 9, 9, 19, 19, 19, 19, 19, 6, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 9, 9,
+ 9, 9, 9, 9, 2, 2, 2, 9, 2, 9, 2, 9, 2, 9, 9, 9,
+ 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, 9, 9,
+ 9, 9, 2, 9, 9, 9, 2, 2, 9, 9, 9, 2, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, 0, 0, 19, 2, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 2, 19, 19,
+ 19, 19, 19, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 1, 2,
+ 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0,
+ 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 19, 0,
+ 0, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 27, 27,
+ 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 56, 56, 56, 56, 56, 56, 56, 56, 55, 55,
+ 55, 55, 2, 2, 2, 2, 2, 55, 55, 55, 55, 55, 55, 55, 61, 61,
+ 61, 61, 61, 61, 61, 61, 2, 2, 2, 2, 2, 2, 2, 61, 61, 2,
+ 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 2, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 2, 2, 2, 2, 13, 13, 13, 13, 13, 13, 2, 2, 0, 0,
+ 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 13, 0, 13, 0, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 1, 1, 1, 1, 12, 12, 13, 13,
+ 13, 13, 0, 0, 0, 0, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 1,
+ 1, 0, 0, 15, 15, 15, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 17, 17, 17, 2, 2,
+ 2, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 12, 12,
+ 12, 12, 12, 12, 12, 0, 17, 17, 17, 17, 17, 17, 17, 0, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 2, 2, 2, 39, 39,
+ 39, 39, 39, 39, 39, 2, 86, 86, 86, 86, 86, 86, 86, 86, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 2, 2, 2, 2, 79, 79,
+ 79, 79, 79, 79, 79, 79, 0, 0, 19, 19, 19, 19, 19, 19, 0, 0,
+ 0, 19, 19, 19, 19, 19, 19, 19, 19, 2, 2, 2, 2, 2, 19, 19,
+ 2, 19, 2, 19, 19, 19, 19, 19, 2, 2, 2, 2, 2, 2, 2, 2,
+ 19, 19, 19, 19, 19, 19, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+ 60, 60, 60, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 65, 65,
+ 65, 65, 65, 65, 65, 65, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
+ 75, 75, 75, 75, 2, 2, 2, 2, 2, 2, 2, 2, 75, 75, 75, 75,
+ 2, 2, 2, 2, 2, 2, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 0, 69, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 74, 12, 12,
+ 12, 12, 12, 2, 2, 2, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 2, 0, 84, 84, 2, 2, 2, 2, 84, 84, 33, 33,
+ 33, 33, 33, 33, 33, 2, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 2, 68, 68, 68, 68, 68, 68, 2, 2, 68, 68,
+ 2, 2, 68, 68, 68, 68, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 92, 2, 2, 2, 2, 2, 2, 2, 2, 92, 92, 92, 92, 92, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 2, 2, 30,
+ 30, 30, 30, 30, 30, 2, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 9, 19, 19, 19, 19, 0, 0, 2, 2, 2, 2, 87, 87,
+ 87, 87, 87, 87, 2, 2, 87, 87, 2, 2, 2, 2, 2, 2, 12, 12,
+ 12, 12, 2, 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, 12, 13, 13,
+ 2, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, 19, 2, 2, 2,
+ 2, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 2, 14, 14, 14, 14, 14, 2, 14, 2, 14, 14,
+ 2, 14, 14, 2, 14, 14, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2,
+ 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 2, 2,
+ 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 3, 1, 1,
+ 1, 1, 1, 1, 6, 6, 0, 0, 0, 2, 0, 0, 0, 0, 3, 3,
+ 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 2, 2, 0, 2, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17,
+ 17, 17, 17, 17, 0, 0, 2, 2, 12, 12, 12, 12, 12, 12, 2, 2,
+ 12, 12, 12, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 2, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 2, 49, 49, 49, 2, 49, 49, 2, 49, 49, 49,
+ 49, 49, 49, 49, 2, 2, 49, 49, 49, 2, 2, 2, 2, 2, 0, 0,
+ 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0,
+ 0, 0, 0, 2, 2, 2, 9, 2, 2, 2, 2, 2, 2, 2, 0, 0,
+ 0, 0, 0, 1, 2, 2, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
+ 71, 71, 71, 2, 2, 2, 67, 67, 67, 67, 67, 67, 67, 67, 67, 2,
+ 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 42, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 2, 2, 2, 2, 2,118,118,118,118,118,118,118,118,118,118,
+ 118, 2, 2, 2, 2, 2, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 2, 53, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 2, 2, 2, 2, 59, 59, 59, 59, 59, 59, 2, 2, 40, 40,
+ 40, 40, 40, 40, 40, 40, 51, 51, 51, 51, 51, 51, 51, 51, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 2, 2, 50, 50,
+ 2, 2, 2, 2, 2, 2,135,135,135,135,135,135,135,135,135,135,
+ 135,135, 2, 2, 2, 2,106,106,106,106,106,106,106,106,104,104,
+ 104,104,104,104,104,104,104,104,104,104, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2,104,161,161,161,161,161,161,161,161,161,161,
+ 161, 2,161,161,161,161,161,161,161, 2,161,161, 2,161,161,161,
+ 2,161,161,161,161,161,161,161, 2,161,161, 2, 2, 2,110,110,
+ 110,110,110,110,110,110,110,110,110,110,110,110,110, 2,110,110,
+ 110,110,110,110, 2, 2, 19, 19, 19, 19, 19, 19, 2, 19, 19, 2,
+ 19, 19, 19, 19, 19, 19, 47, 47, 47, 47, 47, 47, 2, 2, 47, 2,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 2, 47, 47, 2, 2, 2, 47, 2, 2, 47, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 2, 81,120,120,
+ 120,120,120,120,120,120,116,116,116,116,116,116,116,116,116,116,
+ 116,116,116,116,116, 2, 2, 2, 2, 2, 2, 2, 2,116,128,128,
+ 128,128,128,128,128,128,128,128,128, 2,128,128, 2, 2, 2, 2,
+ 2,128,128,128,128,128, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 2, 2, 2, 66, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 2, 2, 2, 2, 2, 72, 98, 98, 98, 98, 98, 98, 98, 98, 97, 97,
+ 97, 97, 97, 97, 97, 97, 2, 2, 2, 2, 97, 97, 97, 97, 2, 2,
+ 97, 97, 97, 97, 97, 97, 57, 57, 57, 57, 2, 57, 57, 2, 2, 2,
+ 2, 2, 57, 57, 57, 57, 57, 57, 57, 57, 2, 57, 57, 57, 2, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 2, 2, 57, 57, 57, 2, 2, 2, 2, 57, 57, 2,
+ 2, 2, 2, 2, 2, 2, 88, 88, 88, 88, 88, 88, 88, 88,117,117,
+ 117,117,117,117,117,117,112,112,112,112,112,112,112,112,112,112,
+ 112,112,112,112,112, 2, 2, 2, 2,112,112,112,112,112, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 2, 2, 2, 78,
+ 78, 78, 78, 78, 78, 78, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 2, 2, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 2, 2, 2, 2, 2,122,122,122,122,122,122,122,122,122,122,
+ 2, 2, 2, 2, 2, 2, 2,122,122,122,122, 2, 2, 2, 2,122,
+ 122,122,122,122,122,122, 89, 89, 89, 89, 89, 89, 89, 89, 89, 2,
+ 2, 2, 2, 2, 2, 2,130,130,130,130,130,130,130,130,130,130,
+ 130, 2, 2, 2, 2, 2, 2, 2,130,130,130,130,130,130,144,144,
+ 144,144,144,144,144,144,144,144, 2, 2, 2, 2, 2, 2,156,156,
+ 156,156,156,156,156,156,156,156, 2,156,156,156, 2, 2,156,156,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3,147,147,
+ 147,147,147,147,147,147,148,148,148,148,148,148,148,148,148,148,
+ 2, 2, 2, 2, 2, 2,158,158,158,158,158,158,158,158,158,158,
+ 2, 2, 2, 2, 2, 2,153,153,153,153,153,153,153,153,153,153,
+ 153,153, 2, 2, 2, 2,149,149,149,149,149,149,149,149,149,149,
+ 149,149,149,149,149, 2, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 2, 2, 2, 2, 94, 94, 94, 94, 94, 94, 2, 2,
+ 2, 2, 2, 2, 2, 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 85, 2, 2,101,101,
+ 101,101,101,101,101,101,101, 2, 2, 2, 2, 2, 2, 2,101,101,
+ 2, 2, 2, 2, 2, 2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 2, 96, 96,111,111,111,111,111,111,111,111,111,111,
+ 111,111,111,111,111, 2,100,100,100,100,100,100,100,100, 2, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2,108,108,
+ 108,108,108,108,108,108,108,108, 2,108,108,108,108,108,108,108,
+ 2, 2, 2, 2, 2, 2,129,129,129,129,129,129,129, 2,129, 2,
+ 129,129,129,129, 2,129,129,129,129,129,129,129,129,129,129,129,
+ 129,129,129,129, 2,129,129,129, 2, 2, 2, 2, 2, 2,109,109,
+ 109,109,109,109,109,109,109,109,109, 2, 2, 2, 2, 2,109,109,
+ 2, 2, 2, 2, 2, 2,107,107,107,107, 2,107,107,107,107,107,
+ 107,107,107, 2, 2,107,107, 2, 2,107,107,107,107,107,107,107,
+ 107,107,107,107,107,107,107, 2,107,107,107,107,107,107,107, 2,
+ 107,107, 2,107,107,107,107,107, 2, 1,107,107,107,107,107, 2,
+ 2,107,107,107, 2, 2,107, 2, 2, 2, 2, 2, 2,107, 2, 2,
+ 2, 2, 2,107,107,107,107,107,107,107, 2, 2,107,107,107,107,
+ 107,107,107, 2, 2, 2,137,137,137,137,137,137,137,137,137,137,
+ 137,137, 2,137,137,137,137,137, 2, 2, 2, 2, 2, 2,124,124,
+ 124,124,124,124,124,124,124,124, 2, 2, 2, 2, 2, 2,123,123,
+ 123,123,123,123,123,123,123,123,123,123,123,123, 2, 2,114,114,
+ 114,114,114,114,114,114,114,114,114,114,114, 2, 2, 2,114,114,
+ 2, 2, 2, 2, 2, 2, 32, 32, 32, 32, 32, 2, 2, 2,102,102,
+ 102,102,102,102,102,102,102,102, 2, 2, 2, 2, 2, 2,126,126,
+ 126,126,126,126,126,126,126,126,126, 2, 2,126,126,126,126,126,
+ 126,126, 2, 2, 2, 2,126,126,126,126,126,126,126, 2,142,142,
+ 142,142,142,142,142,142,142,142,142,142, 2, 2, 2, 2,125,125,
+ 125,125,125,125,125,125,125,125,125, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2,125,154,154,154,154,154,154,154, 2, 2,154,
+ 2, 2,154,154,154,154,154,154,154,154, 2,154,154, 2,154,154,
+ 154,154,154,154,154,154,154,154,154,154,154,154, 2,154,154, 2,
+ 2,154,154,154,154,154,154,154, 2, 2, 2, 2, 2, 2,150,150,
+ 150,150,150,150,150,150, 2, 2,150,150,150,150,150,150,150,150,
+ 150,150,150, 2, 2, 2,141,141,141,141,141,141,141,141,140,140,
+ 140,140,140,140,140,140,140,140,140, 2, 2, 2, 2, 2,121,121,
+ 121,121,121,121,121,121,121, 2, 2, 2, 2, 2, 2, 2, 7, 7,
+ 2, 2, 2, 2, 2, 2,133,133,133,133,133,133,133,133,133, 2,
+ 133,133,133,133,133,133,133,133,133,133,133,133,133, 2,133,133,
+ 133,133,133,133, 2, 2,133,133,133,133,133, 2, 2, 2,134,134,
+ 134,134,134,134,134,134, 2, 2,134,134,134,134,134,134, 2,134,
+ 134,134,134,134,134,134,134,134,134,134,134,134,134, 2,138,138,
+ 138,138,138,138,138, 2,138,138, 2,138,138,138,138,138,138,138,
+ 138,138,138,138,138,138, 2, 2,138, 2,138,138, 2,138,138,138,
+ 2, 2, 2, 2, 2, 2,143,143,143,143,143,143, 2,143,143, 2,
+ 143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,
+ 143,143,143,143,143, 2,143,143, 2,143,143,143,143,143,143, 2,
+ 2, 2, 2, 2, 2, 2,143,143, 2, 2, 2, 2, 2, 2,145,145,
+ 145,145,145,145,145,145,145, 2, 2, 2, 2, 2, 2, 2,163,163,
+ 163,163,163,163,163,163,163, 2,163,163,163,163,163,163,163,163,
+ 163, 2, 2, 2,163,163,163,163, 2, 2, 2, 2, 2, 2, 86, 2,
+ 2, 2, 2, 2, 2, 2, 22, 22, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 22, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
+ 2, 2, 2, 2, 2, 2, 63, 63, 63, 63, 63, 63, 63, 2, 63, 63,
+ 63, 63, 63, 2, 2, 2, 63, 63, 63, 63, 2, 2, 2, 2,157,157,
+ 157,157,157,157,157,157,157,157,157, 2, 2, 2, 2, 2, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 2, 2,127,127,
+ 127,127,127,127,127,127,127,127,127,127,127,127,127, 2, 79, 2,
+ 2, 2, 2, 2, 2, 2,115,115,115,115,115,115,115,115,115,115,
115,115,115,115,115, 2,115,115, 2, 2, 2, 2,115,115,159,159,
- 159,159,159,159,159, 2,159,159, 2, 2,103,103,103,103,103,103,
- 2, 2,119,119,119,119,119,119, 2, 2,119,119, 2,119, 2,119,
- 119,119,146,146,146,146,146,146,146, 2, 99, 99, 99, 99, 99, 99,
- 99, 2, 2, 2, 2, 99,136,139, 13, 13,155, 2, 2, 2,136,136,
- 136,136,155,155,155,155,155,155, 2, 2,136, 2, 2, 2, 2, 17,
- 17, 17, 2, 17, 17, 2, 17, 15, 15, 15, 17, 17, 17, 2, 2, 2,
- 15, 2, 2, 17, 2, 2,139,139,139,139,105,105,105,105,105,105,
- 105, 2,105, 2, 2, 2,105,105, 2, 2, 1, 1, 2, 2, 0, 0,
- 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 2, 2, 0, 2, 2, 0,
- 0, 2, 0, 2, 0, 2,131,131,131,131, 2, 2, 2,131, 2,131,
- 131,131, 56, 56, 56, 2, 56, 2, 2, 56, 56, 56, 2, 56, 56, 2,
- 56, 56, 6, 6, 2, 2, 2, 2, 2, 6,151,151,151,151,151, 2,
- 2, 2,151,151, 2, 2, 2, 2,151,151,160,160,160,160,160,160,
- 160, 2,152,152,152,152,152,152, 2, 2, 2, 2, 2,152,164,164,
- 164,164,164,164, 2, 2, 2, 30, 30, 2,113,113,113,113,113, 2,
- 2,113,113,113,113, 2,132,132,132,132,132,132, 2, 2, 2, 2,
- 132,132, 2, 3, 3, 2, 3, 2, 2, 3, 2, 3, 2, 3, 2, 2,
- 3, 2, 3, 2, 3, 2, 3, 3, 2, 3, 15, 0, 0, 2, 13, 2,
- 2, 2, 13, 13, 13, 2, 2, 0, 2, 2, 0, 1, 2, 3, 4, 5,
- 6, 7, 8, 9, 9, 9, 9, 10, 9, 11, 12, 13, 9, 9, 9, 14,
- 9, 9, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 159,159,159,159,159,159,159,159,159,159,159,159,159, 2,159,159,
+ 2, 2, 2, 2, 2, 2,103,103,103,103,103,103,103,103,103,103,
+ 103,103,103,103, 2, 2,119,119,119,119,119,119,119,119,119,119,
+ 119,119,119,119, 2, 2,119,119, 2,119,119,119,119,119, 2, 2,
+ 2, 2, 2,119,119,119,146,146,146,146,146,146,146,146,146,146,
+ 146, 2, 2, 2, 2, 2, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 2, 2, 2, 2, 99, 2, 2, 2, 2, 2, 2, 2, 99,136,139,
+ 13, 13,155, 2, 2, 2,136,136,136,136,136,136,136,136,155,155,
+ 155,155,155,155,155,155,155,155,155,155,155,155, 2, 2,136, 2,
+ 2, 2, 2, 2, 2, 2, 17, 17, 17, 17, 2, 17, 17, 17, 17, 17,
+ 17, 17, 2, 17, 17, 2, 17, 15, 15, 15, 15, 15, 15, 15, 17, 17,
+ 17, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, 2, 15, 15,
+ 15, 2, 2, 17, 2, 2, 2, 2, 2, 2, 17, 17, 17, 17,139,139,
+ 139,139,139,139,139,139,139,139,139,139, 2, 2, 2, 2,105,105,
+ 105,105,105,105,105,105,105,105,105, 2, 2, 2, 2, 2,105,105,
+ 105,105,105, 2, 2, 2,105, 2, 2, 2, 2, 2, 2, 2,105,105,
+ 2, 2,105,105,105,105, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1,
+ 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 2, 2,
+ 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0,
+ 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
+ 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0,
+ 0, 0, 0, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2,
+ 0, 0, 0, 0, 0, 0,131,131,131,131,131,131,131,131,131,131,
+ 131,131, 2, 2, 2, 2, 2, 2, 2,131,131,131,131,131, 2,131,
+ 131,131,131,131,131,131, 2, 2, 2, 2, 2, 19, 19, 19, 56, 56,
+ 56, 56, 56, 56, 56, 2, 56, 2, 2, 56, 56, 56, 56, 56, 56, 56,
+ 2, 56, 56, 2, 56, 56, 56, 56, 56, 2, 2, 2, 2, 2, 6, 6,
+ 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6,151,151,
+ 151,151,151,151,151,151,151,151,151,151,151, 2, 2, 2,151,151,
+ 151,151,151,151, 2, 2,151,151, 2, 2, 2, 2,151,151,160,160,
+ 160,160,160,160,160,160,160,160,160,160,160,160,160, 2,152,152,
+ 152,152,152,152,152,152,152,152, 2, 2, 2, 2, 2,152,164,164,
+ 164,164,164,164,164,164,164,164, 2, 2, 2, 2, 2, 2, 30, 30,
+ 30, 30, 2, 30, 30, 2,113,113,113,113,113,113,113,113,113,113,
+ 113,113,113, 2, 2,113,113,113,113,113,113,113,113, 2,132,132,
+ 132,132,132,132,132,132,132,132,132,132, 2, 2, 2, 2,132,132,
+ 2, 2, 2, 2,132,132, 3, 3, 3, 3, 2, 3, 3, 3, 2, 3,
+ 3, 2, 3, 2, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2,
+ 3, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 2, 3,
+ 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 3,
+ 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3,
+ 3, 3, 2, 3, 3, 3, 2, 2, 2, 2, 2, 2, 0, 0, 15, 0,
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2,
+ 2, 0, 0, 0, 0, 0, 13, 2, 2, 2, 2, 2, 2, 2, 13, 13,
+ 13, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 1,
+ 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 10, 9, 11, 12, 13,
+ 9, 9, 9, 14, 9, 9, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 16, 17, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 18, 19, 20, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 16, 17, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 18, 19, 20, 9, 21, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
@@ -3702,60 +3922,60 @@ _hb_ucd_u8[14744] =
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 23, 24, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
- 0, 0, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 24,
- 25, 26, 27, 28, 29, 30, 0, 0, 31, 32, 0, 33, 0, 34, 0, 35,
- 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 23, 24, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, 12, 0, 0, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 23, 0, 0, 24, 25, 26, 27, 28, 29, 30, 0, 0, 31, 32, 0, 33,
+ 0, 34, 0, 35, 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44,
+ 0, 45, 0, 0, 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, 0, 48,
+ 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 50, 51, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0,
+ 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0,
+ 56, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 58, 59, 60, 61, 62, 63, 64, 65, 0, 0, 0, 0, 0, 0, 66, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 0, 45, 0, 0,
- 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, 0, 0,
- 0, 52, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0,
- 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0,
- 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 60, 61,
- 62, 63, 64, 65, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 69,
+ 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 73, 74,
+ 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
+ 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 0,
+ 0, 0, 0, 0, 0,105,106, 0,107, 0, 0, 0,108, 0,109, 0,
+ 110, 0,111,112,113, 0,114, 0, 0, 0,115, 0, 0, 0,116, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 69, 70, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 73, 74, 75, 76, 77, 78,
- 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,
- 95, 96, 97, 98, 99,100,101,102,103, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 0,
- 0,105,106, 0,107, 0, 0, 0,108, 0,109, 0,110, 0,111,112,
- 113, 0,114, 0, 0, 0,115, 0, 0, 0,116, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,117, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118,119,120,121,
- 0,122,123,124,125,126, 0,127, 0, 0, 0, 0, 0, 0, 0, 0,
+ 118,119,120,121, 0,122,123,124,125,126, 0,127, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,128,129,130,131,132,133,134,135,
- 136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,
- 152,153,154,155,156,157, 0, 0, 0,158,159,160,161, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,129,130,131,
+ 132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,
+ 148,149,150,151,152,153,154,155,156,157, 0, 0, 0,158,159,160,
+ 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,162,163, 0, 0, 0, 0, 0, 0, 0,164, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0,162,163, 0, 0, 0, 0, 0, 0, 0,164, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,165, 0, 0, 0,
+ 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,167, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0,167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,169,170, 0,
- 0, 0, 0,171,172, 0, 0, 0,173,174,175,176,177,178,179,180,
- 181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,
- 197,198,199,200,201,202,203,204,205,206, 0, 0, 0, 0, 0, 0,
+ 0,169,170, 0, 0, 0, 0,171,172, 0, 0, 0,173,174,175,176,
+ 177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,
+ 193,194,195,196,197,198,199,200,201,202,203,204,205,206, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 2, 3, 4,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4,
};
static const uint16_t
-_hb_ucd_u16[10040] =
+_hb_ucd_u16[9320] =
{
0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12,
13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23,
@@ -3884,300 +4104,255 @@ _hb_ucd_u16[10040] =
48, 48, 48, 48, 71, 48, 48, 48, 48, 48, 48, 140, 140, 140, 140, 140,
683, 140, 570, 570, 570, 570, 570, 570, 32, 32, 32, 32, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 140, 391, 391, 391, 391, 391, 391, 391, 684,
- 391, 391, 391, 391, 391, 391, 391, 685, 0, 0, 0, 0, 1, 2, 1, 2,
- 0, 0, 3, 3, 4, 5, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 6, 0, 0, 7, 0, 8, 8, 8, 8, 8, 8, 8, 9,
- 10, 11, 12, 11, 11, 11, 13, 11, 14, 14, 14, 14, 14, 14, 14, 14,
- 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 16, 17, 18, 17, 17,
- 19, 20, 21, 21, 22, 21, 23, 24, 25, 26, 27, 27, 28, 29, 27, 30,
- 27, 27, 27, 27, 27, 31, 27, 27, 32, 33, 33, 33, 34, 27, 27, 27,
- 35, 35, 35, 36, 37, 37, 37, 38, 39, 39, 40, 41, 42, 43, 44, 27,
- 45, 46, 27, 27, 27, 27, 47, 27, 48, 48, 48, 48, 48, 49, 50, 48,
- 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
- 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
- 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98,
- 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 109, 110, 111, 112, 109,
- 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 122, 123, 122, 124, 125, 125,
- 126, 127, 128, 129, 130, 131, 125, 125, 132, 132, 132, 132, 133, 132, 134, 135,
- 132, 133, 132, 136, 136, 137, 125, 125, 138, 138, 138, 138, 138, 138, 138, 138,
- 138, 138, 139, 139, 140, 139, 139, 141, 142, 142, 142, 142, 142, 142, 142, 142,
- 143, 143, 143, 143, 144, 145, 143, 143, 144, 143, 143, 146, 147, 148, 143, 143,
- 143, 147, 143, 143, 143, 149, 143, 150, 143, 151, 152, 152, 152, 152, 152, 153,
- 154, 154, 154, 154, 154, 154, 154, 154, 155, 156, 157, 157, 157, 157, 158, 159,
- 160, 161, 162, 163, 164, 165, 166, 167, 168, 168, 168, 168, 168, 169, 170, 170,
- 171, 172, 173, 173, 173, 173, 173, 174, 173, 173, 175, 154, 154, 154, 154, 176,
- 177, 178, 179, 179, 180, 181, 182, 183, 184, 184, 185, 184, 186, 187, 168, 168,
- 188, 189, 190, 190, 190, 191, 190, 192, 193, 193, 194, 8, 195, 125, 125, 125,
- 196, 196, 196, 196, 197, 196, 196, 198, 199, 199, 199, 199, 200, 200, 200, 201,
- 202, 202, 202, 203, 204, 205, 205, 205, 206, 139, 139, 207, 208, 209, 210, 211,
- 4, 4, 212, 4, 4, 213, 214, 215, 4, 4, 4, 216, 8, 8, 8, 8,
- 11, 217, 11, 11, 217, 218, 11, 219, 11, 11, 11, 220, 220, 221, 11, 222,
- 223, 0, 0, 0, 0, 0, 224, 225, 226, 227, 0, 0, 228, 8, 8, 229,
- 0, 0, 230, 231, 232, 0, 4, 4, 233, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 125, 235, 125, 0, 0,
- 236, 236, 236, 236, 236, 236, 236, 236, 0, 0, 0, 0, 0, 0, 0, 237,
- 0, 238, 0, 0, 0, 0, 0, 0, 239, 239, 239, 239, 239, 239, 4, 4,
- 240, 240, 240, 240, 240, 240, 240, 241, 139, 139, 140, 242, 242, 242, 243, 244,
- 143, 245, 246, 246, 246, 246, 14, 14, 0, 0, 0, 0, 0, 247, 125, 125,
- 248, 249, 248, 248, 248, 248, 248, 250, 248, 248, 248, 248, 248, 248, 248, 248,
- 248, 248, 248, 248, 248, 251, 125, 252, 253, 0, 254, 255, 256, 257, 257, 257,
- 257, 258, 259, 260, 260, 260, 260, 261, 262, 263, 263, 264, 142, 142, 142, 142,
- 265, 0, 263, 263, 0, 0, 266, 260, 142, 265, 0, 0, 0, 0, 142, 267,
- 0, 0, 0, 0, 0, 260, 260, 268, 260, 260, 260, 260, 260, 269, 0, 0,
- 248, 248, 248, 248, 0, 0, 0, 0, 270, 270, 270, 270, 270, 270, 270, 270,
- 271, 270, 270, 270, 272, 273, 273, 273, 274, 274, 274, 274, 274, 274, 274, 274,
- 274, 274, 275, 125, 14, 14, 14, 14, 14, 14, 276, 276, 276, 276, 276, 277,
- 0, 0, 278, 4, 4, 4, 4, 4, 279, 4, 4, 4, 280, 281, 125, 282,
- 283, 283, 284, 285, 286, 286, 286, 287, 288, 288, 288, 288, 289, 290, 48, 48,
- 291, 291, 292, 293, 293, 294, 142, 295, 296, 296, 296, 296, 297, 298, 138, 299,
- 300, 300, 300, 301, 302, 303, 138, 138, 304, 304, 304, 304, 305, 306, 307, 308,
- 309, 310, 246, 4, 4, 311, 312, 152, 152, 152, 152, 152, 307, 307, 313, 314,
- 142, 142, 315, 142, 316, 142, 142, 317, 125, 125, 125, 125, 125, 125, 125, 125,
- 248, 248, 248, 248, 248, 248, 318, 248, 248, 248, 248, 248, 248, 319, 125, 125,
- 320, 321, 21, 322, 323, 27, 27, 27, 27, 27, 27, 27, 324, 325, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 326, 27, 27, 27, 27,
- 27, 327, 27, 27, 328, 125, 125, 27, 8, 285, 329, 0, 0, 330, 331, 332,
- 27, 27, 27, 27, 27, 27, 27, 333, 334, 0, 1, 2, 1, 2, 335, 259,
- 260, 336, 142, 265, 337, 338, 339, 340, 341, 342, 343, 344, 345, 345, 125, 125,
- 342, 342, 342, 342, 342, 342, 342, 346, 347, 0, 0, 348, 11, 11, 11, 11,
- 349, 350, 351, 125, 125, 0, 0, 352, 353, 354, 355, 355, 355, 356, 357, 252,
- 358, 358, 359, 360, 361, 362, 362, 363, 364, 365, 366, 366, 367, 368, 125, 125,
- 369, 369, 369, 369, 369, 370, 370, 370, 371, 372, 373, 374, 374, 375, 374, 376,
- 377, 377, 378, 379, 379, 379, 380, 381, 381, 382, 383, 384, 125, 125, 125, 125,
- 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 386, 385, 387, 388, 125,
- 389, 4, 4, 390, 125, 125, 125, 125, 391, 392, 392, 393, 394, 395, 396, 396,
- 397, 398, 399, 125, 125, 125, 400, 401, 402, 403, 404, 405, 125, 125, 125, 125,
- 406, 406, 407, 408, 407, 409, 407, 407, 410, 411, 412, 413, 414, 414, 415, 415,
- 416, 416, 125, 125, 417, 417, 418, 419, 420, 420, 420, 421, 422, 423, 424, 425,
- 426, 427, 428, 125, 125, 125, 125, 125, 429, 429, 429, 429, 430, 125, 125, 125,
- 431, 431, 431, 432, 431, 431, 431, 433, 434, 434, 435, 436, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 27, 45, 437, 437, 438, 439, 125, 125, 125, 440,
- 441, 441, 442, 443, 443, 444, 125, 445, 446, 125, 125, 447, 448, 125, 449, 450,
- 451, 451, 451, 451, 452, 453, 451, 454, 455, 455, 455, 455, 456, 457, 458, 459,
- 460, 460, 460, 461, 462, 463, 463, 464, 465, 465, 465, 465, 465, 465, 466, 467,
- 468, 469, 468, 468, 470, 125, 125, 125, 471, 472, 473, 474, 474, 474, 475, 476,
- 477, 478, 479, 480, 481, 482, 483, 484, 485, 485, 485, 485, 485, 486, 487, 125,
- 488, 488, 488, 488, 489, 490, 125, 125, 491, 491, 491, 492, 491, 493, 125, 125,
- 494, 494, 494, 494, 495, 496, 497, 125, 498, 498, 498, 499, 499, 125, 125, 125,
- 500, 501, 502, 500, 503, 125, 125, 125, 504, 504, 504, 505, 125, 125, 125, 125,
- 125, 125, 506, 506, 506, 506, 506, 507, 508, 509, 510, 511, 512, 513, 125, 125,
- 125, 125, 514, 515, 515, 514, 516, 125, 517, 517, 517, 517, 518, 519, 519, 519,
- 519, 519, 520, 154, 521, 521, 521, 522, 523, 125, 125, 125, 125, 125, 125, 125,
- 524, 525, 525, 526, 527, 525, 528, 529, 529, 530, 531, 532, 125, 125, 125, 125,
- 533, 534, 534, 535, 536, 537, 538, 539, 540, 541, 542, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 543, 544, 545, 546, 545, 547, 545, 548, 125, 125,
- 125, 125, 125, 549, 550, 550, 550, 551, 552, 552, 552, 552, 552, 552, 552, 552,
- 552, 553, 125, 125, 125, 125, 125, 125, 552, 552, 552, 552, 552, 552, 554, 555,
- 552, 552, 552, 552, 556, 125, 125, 125, 125, 557, 557, 557, 557, 557, 557, 558,
- 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 560, 125, 125,
- 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 562, 125, 125, 125,
- 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 563, 564, 565, 566, 567,
- 567, 567, 567, 568, 569, 570, 571, 572, 573, 573, 573, 573, 574, 575, 576, 577,
- 573, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 578, 578, 578, 578,
- 578, 579, 125, 125, 125, 125, 125, 125, 580, 580, 580, 580, 581, 580, 580, 580,
- 582, 580, 125, 125, 125, 125, 583, 584, 585, 585, 585, 585, 585, 585, 585, 585,
- 585, 585, 585, 585, 585, 585, 585, 586, 587, 587, 587, 587, 587, 587, 587, 587,
- 587, 587, 587, 587, 587, 588, 125, 125, 589, 125, 125, 125, 125, 125, 125, 125,
- 125, 125, 125, 125, 125, 125, 125, 590, 591, 257, 257, 257, 257, 257, 257, 257,
- 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 592, 593, 125, 594, 595, 596,
- 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 597,
- 598, 598, 598, 598, 598, 598, 599, 600, 601, 602, 266, 125, 125, 125, 125, 125,
- 8, 8, 603, 8, 604, 0, 0, 0, 0, 0, 0, 0, 266, 125, 125, 125,
- 0, 0, 0, 0, 0, 0, 0, 605, 0, 0, 606, 0, 0, 0, 607, 608,
- 609, 0, 610, 0, 0, 0, 235, 125, 11, 11, 11, 11, 611, 125, 125, 125,
- 125, 125, 125, 125, 0, 266, 0, 266, 0, 0, 0, 0, 0, 234, 0, 612,
- 0, 0, 0, 0, 0, 224, 0, 0, 0, 613, 614, 615, 616, 0, 0, 0,
- 617, 618, 0, 619, 620, 621, 0, 0, 0, 0, 622, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 623, 0, 0, 0, 624, 624, 624, 624, 624, 624, 624, 624,
- 625, 626, 627, 125, 125, 125, 125, 125, 4, 628, 629, 125, 125, 125, 125, 125,
- 630, 631, 632, 14, 14, 14, 633, 125, 634, 125, 125, 125, 125, 125, 125, 125,
- 635, 635, 636, 637, 638, 125, 125, 125, 125, 639, 640, 125, 641, 641, 641, 642,
- 125, 125, 125, 125, 125, 643, 643, 644, 125, 125, 125, 125, 125, 125, 645, 646,
- 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 648, 649, 125, 125,
- 650, 650, 650, 650, 651, 652, 125, 125, 125, 125, 125, 125, 125, 125, 125, 334,
- 0, 0, 0, 653, 125, 125, 125, 125, 334, 0, 0, 247, 125, 125, 125, 125,
- 654, 27, 655, 656, 657, 658, 659, 660, 661, 662, 663, 662, 125, 125, 125, 664,
- 0, 0, 252, 0, 0, 0, 0, 0, 0, 266, 226, 334, 334, 334, 0, 605,
- 0, 0, 247, 125, 125, 125, 665, 0, 666, 0, 0, 252, 612, 667, 605, 125,
- 0, 0, 0, 0, 0, 668, 350, 350, 0, 0, 0, 0, 0, 0, 0, 669,
- 0, 0, 0, 0, 0, 285, 252, 228, 252, 0, 0, 0, 670, 285, 0, 0,
- 670, 0, 247, 667, 125, 125, 125, 125, 0, 0, 0, 0, 0, 266, 247, 350,
- 612, 0, 0, 671, 672, 252, 612, 612, 0, 330, 0, 0, 235, 125, 125, 285,
- 248, 248, 248, 248, 248, 248, 125, 125, 248, 248, 248, 319, 248, 248, 248, 248,
- 248, 318, 248, 248, 248, 248, 248, 248, 248, 248, 584, 248, 248, 248, 248, 248,
- 248, 248, 248, 248, 248, 248, 673, 125, 248, 318, 125, 125, 125, 125, 125, 125,
- 248, 248, 248, 248, 674, 248, 248, 248, 248, 248, 248, 125, 125, 125, 125, 125,
- 675, 125, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 1, 2, 2, 2,
- 2, 2, 3, 0, 0, 0, 4, 0, 2, 2, 2, 2, 2, 3, 2, 2,
- 2, 2, 5, 0, 2, 5, 6, 0, 7, 7, 7, 7, 8, 9, 10, 11,
- 12, 13, 14, 15, 8, 8, 8, 8, 16, 8, 8, 8, 17, 18, 18, 18,
- 19, 19, 19, 19, 19, 20, 19, 19, 21, 22, 22, 22, 22, 22, 22, 22,
- 22, 23, 21, 22, 22, 22, 23, 21, 24, 25, 25, 25, 25, 25, 25, 25,
- 25, 25, 12, 12, 25, 25, 26, 27, 25, 28, 12, 12, 29, 30, 29, 31,
- 29, 29, 32, 32, 29, 29, 29, 29, 31, 29, 33, 7, 7, 34, 29, 29,
- 35, 29, 29, 29, 29, 29, 29, 30, 36, 36, 36, 37, 36, 36, 36, 36,
- 36, 36, 38, 39, 40, 40, 40, 40, 41, 12, 12, 12, 42, 42, 42, 42,
- 42, 42, 43, 44, 45, 45, 45, 45, 45, 45, 45, 46, 45, 45, 45, 47,
- 48, 48, 48, 48, 48, 48, 48, 49, 36, 36, 38, 12, 29, 29, 29, 50,
- 51, 12, 29, 29, 52, 29, 29, 29, 53, 53, 53, 53, 54, 55, 53, 53,
- 53, 56, 53, 53, 57, 58, 57, 59, 59, 57, 57, 57, 57, 57, 60, 57,
- 61, 62, 63, 57, 57, 59, 59, 64, 12, 65, 12, 66, 57, 62, 57, 57,
- 57, 57, 57, 64, 67, 67, 68, 69, 70, 71, 71, 71, 71, 71, 72, 71,
- 72, 73, 74, 72, 68, 69, 70, 74, 75, 12, 67, 76, 12, 77, 71, 71,
- 71, 68, 12, 12, 78, 78, 79, 80, 80, 79, 79, 79, 79, 79, 81, 79,
- 81, 78, 82, 79, 79, 80, 80, 82, 83, 12, 12, 12, 79, 84, 79, 79,
- 82, 12, 78, 79, 85, 85, 86, 87, 87, 86, 86, 86, 86, 86, 88, 86,
- 88, 85, 89, 86, 86, 87, 87, 89, 12, 85, 12, 90, 86, 91, 86, 86,
- 86, 86, 12, 12, 92, 93, 94, 92, 95, 96, 97, 95, 98, 99, 94, 92,
- 100, 100, 96, 92, 94, 92, 95, 96, 99, 98, 12, 12, 12, 92, 100, 100,
- 100, 100, 94, 12, 101, 101, 101, 102, 102, 101, 101, 101, 101, 101, 102, 101,
- 101, 101, 103, 101, 101, 102, 102, 103, 12, 104, 105, 106, 101, 107, 101, 101,
- 12, 108, 101, 101, 109, 109, 109, 110, 110, 109, 109, 109, 109, 109, 110, 109,
- 109, 111, 112, 109, 109, 110, 110, 112, 12, 113, 12, 113, 109, 114, 109, 109,
- 111, 12, 12, 12, 115, 115, 115, 116, 116, 115, 115, 115, 115, 115, 115, 115,
- 115, 116, 116, 115, 12, 115, 115, 115, 115, 117, 115, 115, 118, 118, 119, 119,
- 119, 120, 121, 119, 119, 119, 119, 119, 122, 119, 119, 123, 119, 120, 124, 125,
- 119, 126, 119, 119, 12, 121, 119, 119, 121, 127, 12, 12, 128, 129, 129, 129,
- 129, 129, 129, 129, 129, 129, 130, 131, 129, 129, 129, 12, 12, 12, 12, 12,
- 132, 133, 134, 135, 135, 135, 135, 135, 135, 136, 135, 135, 135, 135, 135, 137,
- 135, 138, 135, 134, 135, 135, 137, 135, 139, 139, 139, 139, 139, 139, 140, 139,
- 139, 139, 139, 141, 140, 139, 139, 139, 139, 139, 139, 142, 139, 143, 144, 12,
- 145, 145, 145, 145, 146, 146, 146, 146, 146, 147, 12, 148, 146, 146, 149, 146,
- 150, 150, 150, 150, 151, 151, 151, 151, 151, 151, 152, 153, 151, 154, 152, 153,
- 152, 153, 151, 154, 152, 153, 151, 151, 151, 154, 151, 151, 151, 151, 154, 155,
- 151, 151, 151, 156, 151, 151, 153, 12, 157, 157, 157, 157, 157, 158, 157, 158,
- 159, 159, 159, 159, 160, 160, 160, 160, 160, 160, 160, 161, 162, 162, 162, 162,
- 162, 162, 163, 164, 162, 162, 165, 12, 166, 166, 166, 166, 166, 167, 12, 168,
- 169, 169, 169, 169, 169, 170, 12, 12, 171, 171, 171, 171, 171, 12, 12, 12,
- 172, 172, 172, 173, 173, 12, 12, 12, 174, 174, 174, 174, 174, 174, 174, 175,
- 174, 174, 175, 12, 176, 177, 178, 178, 178, 178, 179, 12, 178, 178, 178, 178,
- 178, 178, 180, 12, 178, 178, 181, 12, 159, 182, 12, 12, 183, 183, 183, 183,
- 183, 183, 183, 184, 183, 183, 183, 12, 185, 183, 183, 183, 186, 186, 186, 186,
- 186, 186, 186, 187, 186, 188, 12, 12, 189, 189, 189, 189, 189, 189, 189, 12,
- 189, 189, 190, 12, 189, 189, 191, 192, 193, 193, 193, 193, 193, 193, 193, 194,
- 195, 195, 195, 195, 195, 195, 195, 196, 195, 195, 195, 197, 195, 195, 198, 12,
- 195, 195, 195, 198, 7, 7, 7, 199, 200, 200, 200, 200, 200, 200, 200, 201,
- 200, 200, 200, 202, 203, 203, 203, 203, 204, 204, 204, 204, 204, 12, 12, 204,
- 205, 205, 205, 205, 205, 205, 206, 205, 205, 205, 207, 208, 209, 209, 209, 209,
- 19, 19, 210, 12, 146, 146, 211, 212, 203, 203, 12, 12, 213, 7, 7, 7,
- 214, 7, 215, 216, 0, 215, 217, 12, 2, 218, 219, 2, 2, 2, 2, 220,
- 221, 218, 222, 2, 2, 2, 223, 2, 2, 2, 2, 224, 8, 225, 8, 225,
- 8, 8, 226, 226, 8, 8, 8, 225, 8, 15, 8, 8, 8, 10, 8, 227,
- 10, 15, 8, 14, 0, 0, 0, 228, 0, 229, 0, 0, 230, 0, 0, 231,
- 0, 0, 0, 232, 2, 2, 2, 233, 234, 12, 12, 12, 235, 12, 12, 12,
- 0, 236, 237, 0, 4, 0, 0, 0, 0, 0, 0, 4, 2, 2, 5, 12,
- 0, 232, 12, 12, 0, 0, 232, 12, 238, 238, 238, 238, 0, 239, 0, 0,
- 0, 240, 0, 0, 241, 241, 241, 241, 18, 18, 18, 18, 18, 12, 242, 18,
- 243, 243, 243, 243, 243, 243, 12, 244, 245, 12, 12, 244, 151, 154, 12, 12,
- 151, 154, 151, 154, 0, 0, 0, 246, 247, 247, 247, 247, 247, 247, 248, 247,
- 247, 12, 12, 12, 247, 249, 12, 12, 0, 0, 0, 12, 0, 250, 0, 0,
- 251, 247, 252, 253, 0, 0, 247, 0, 254, 255, 255, 255, 255, 255, 255, 255,
- 255, 256, 257, 258, 259, 260, 260, 260, 260, 260, 260, 260, 260, 260, 261, 259,
- 12, 262, 263, 263, 263, 263, 263, 263, 264, 150, 150, 150, 150, 150, 150, 265,
- 0, 12, 12, 12, 150, 150, 150, 266, 260, 260, 260, 261, 260, 260, 0, 0,
- 267, 267, 267, 267, 267, 267, 267, 268, 267, 269, 12, 12, 270, 270, 270, 270,
- 271, 271, 271, 271, 271, 271, 271, 12, 272, 272, 272, 272, 272, 272, 12, 12,
- 237, 2, 2, 2, 2, 2, 231, 2, 2, 2, 273, 12, 274, 275, 276, 12,
- 277, 2, 2, 2, 278, 278, 278, 278, 278, 278, 278, 279, 0, 0, 246, 12,
- 280, 280, 280, 280, 280, 280, 12, 12, 281, 281, 281, 281, 281, 282, 12, 283,
- 281, 281, 282, 12, 284, 284, 284, 284, 284, 284, 284, 285, 286, 286, 286, 286,
- 286, 12, 12, 287, 150, 150, 150, 288, 289, 289, 289, 289, 289, 289, 289, 290,
- 289, 289, 291, 292, 145, 145, 145, 293, 294, 294, 294, 294, 294, 295, 12, 12,
- 294, 294, 294, 296, 294, 294, 296, 294, 297, 297, 297, 297, 298, 12, 12, 12,
- 12, 12, 299, 297, 300, 300, 300, 300, 300, 301, 12, 12, 155, 154, 155, 154,
- 155, 154, 12, 12, 2, 2, 3, 2, 2, 302, 303, 12, 300, 300, 300, 304,
- 300, 300, 304, 12, 150, 12, 12, 12, 150, 265, 305, 150, 150, 150, 150, 12,
- 247, 247, 247, 249, 247, 247, 249, 12, 2, 273, 12, 12, 306, 22, 12, 24,
- 25, 26, 25, 307, 308, 309, 25, 25, 50, 12, 12, 12, 310, 29, 29, 29,
- 29, 29, 29, 311, 312, 29, 29, 29, 29, 29, 12, 310, 7, 7, 7, 313,
- 232, 0, 0, 0, 0, 232, 0, 12, 29, 314, 29, 29, 29, 29, 29, 315,
- 316, 0, 0, 0, 0, 317, 260, 260, 260, 260, 260, 318, 319, 150, 319, 150,
- 319, 150, 319, 288, 0, 232, 0, 232, 12, 12, 316, 246, 320, 320, 320, 321,
- 320, 320, 320, 320, 320, 322, 320, 320, 320, 320, 322, 323, 320, 320, 320, 324,
- 320, 320, 322, 12, 232, 131, 0, 0, 0, 131, 0, 0, 8, 8, 8, 14,
- 0, 0, 0, 234, 325, 12, 12, 12, 0, 0, 0, 326, 327, 327, 327, 327,
- 327, 327, 327, 328, 329, 329, 329, 329, 330, 12, 12, 12, 215, 0, 0, 0,
- 331, 331, 331, 331, 331, 12, 12, 332, 333, 333, 333, 333, 333, 333, 334, 12,
- 335, 335, 335, 335, 335, 335, 336, 12, 337, 337, 337, 337, 337, 337, 337, 338,
- 339, 339, 339, 339, 339, 12, 339, 339, 339, 340, 12, 12, 341, 341, 341, 341,
- 342, 342, 342, 342, 343, 343, 343, 343, 343, 343, 343, 344, 343, 343, 344, 12,
- 345, 345, 345, 345, 345, 12, 345, 345, 345, 345, 345, 12, 346, 346, 346, 346,
- 346, 346, 12, 12, 347, 347, 347, 347, 347, 12, 12, 348, 349, 349, 350, 349,
- 350, 351, 349, 349, 351, 349, 349, 349, 351, 349, 351, 352, 353, 353, 353, 353,
- 353, 354, 12, 12, 353, 355, 12, 12, 353, 353, 12, 12, 2, 274, 2, 2,
- 356, 2, 273, 12, 357, 358, 359, 357, 357, 357, 357, 357, 357, 360, 361, 362,
- 363, 363, 363, 363, 363, 364, 363, 363, 365, 365, 365, 365, 366, 366, 366, 366,
- 366, 366, 366, 367, 12, 368, 366, 366, 369, 369, 369, 369, 370, 371, 372, 369,
- 373, 373, 373, 373, 373, 373, 373, 374, 375, 375, 375, 375, 375, 375, 376, 377,
- 378, 378, 378, 378, 379, 379, 379, 379, 379, 379, 12, 379, 380, 379, 379, 379,
- 381, 382, 12, 381, 381, 383, 383, 381, 381, 381, 381, 381, 381, 384, 385, 386,
- 381, 381, 387, 12, 388, 388, 388, 388, 389, 389, 389, 389, 390, 390, 390, 390,
- 390, 391, 392, 390, 390, 391, 12, 12, 393, 393, 393, 393, 393, 394, 395, 393,
- 396, 396, 396, 396, 396, 397, 396, 396, 398, 398, 398, 398, 399, 12, 398, 398,
- 400, 400, 400, 400, 401, 12, 402, 403, 12, 12, 402, 400, 404, 404, 404, 404,
- 404, 404, 405, 12, 406, 406, 406, 406, 407, 12, 12, 12, 407, 12, 408, 406,
- 409, 409, 409, 409, 409, 409, 12, 12, 409, 409, 410, 12, 411, 411, 411, 411,
- 411, 411, 412, 413, 413, 12, 12, 12, 12, 12, 12, 414, 415, 415, 415, 415,
- 415, 415, 12, 12, 416, 416, 416, 416, 416, 416, 417, 12, 418, 418, 418, 418,
- 418, 418, 419, 12, 420, 420, 420, 420, 420, 420, 420, 12, 421, 421, 421, 421,
- 421, 422, 12, 12, 423, 423, 423, 423, 423, 423, 423, 424, 425, 423, 423, 423,
- 423, 424, 12, 426, 427, 427, 427, 427, 428, 12, 12, 429, 430, 430, 430, 430,
- 430, 430, 431, 12, 430, 430, 432, 12, 433, 433, 433, 433, 433, 434, 433, 433,
- 433, 433, 12, 12, 435, 435, 435, 435, 435, 436, 12, 12, 437, 437, 437, 437,
- 118, 119, 119, 119, 119, 127, 12, 12, 438, 438, 438, 438, 439, 438, 438, 438,
- 440, 12, 12, 12, 441, 442, 443, 444, 441, 441, 441, 444, 441, 441, 445, 12,
- 446, 446, 446, 446, 446, 446, 447, 12, 446, 446, 448, 12, 449, 450, 449, 451,
- 451, 449, 449, 449, 449, 449, 452, 449, 452, 450, 453, 449, 449, 451, 451, 454,
- 455, 456, 12, 450, 449, 457, 449, 455, 449, 455, 12, 12, 458, 458, 458, 458,
- 458, 458, 458, 459, 460, 12, 12, 12, 461, 461, 461, 461, 461, 461, 12, 12,
- 461, 461, 462, 12, 463, 463, 463, 463, 463, 464, 463, 463, 463, 463, 463, 464,
- 465, 465, 465, 465, 465, 466, 12, 12, 465, 465, 467, 12, 178, 178, 178, 180,
- 468, 468, 468, 468, 468, 468, 469, 12, 470, 470, 470, 470, 470, 470, 471, 472,
- 470, 470, 470, 12, 470, 471, 12, 12, 473, 473, 473, 473, 473, 473, 473, 12,
- 474, 474, 474, 474, 475, 12, 12, 476, 477, 478, 479, 477, 477, 480, 477, 477,
- 477, 477, 477, 477, 477, 481, 482, 477, 477, 478, 12, 12, 477, 477, 483, 12,
- 484, 484, 485, 484, 484, 484, 484, 484, 484, 486, 12, 12, 487, 487, 487, 487,
- 487, 487, 12, 12, 488, 488, 488, 488, 489, 12, 12, 12, 490, 490, 490, 490,
- 490, 490, 491, 12, 53, 53, 492, 12, 493, 493, 494, 493, 493, 493, 493, 493,
- 493, 495, 493, 493, 493, 496, 12, 12, 493, 493, 493, 497, 498, 498, 498, 498,
- 499, 498, 498, 498, 498, 498, 500, 498, 498, 501, 12, 12, 502, 503, 504, 502,
- 502, 502, 502, 502, 502, 503, 505, 504, 502, 502, 12, 12, 502, 502, 506, 12,
- 507, 508, 509, 507, 507, 507, 507, 507, 507, 507, 507, 510, 508, 507, 511, 12,
- 507, 507, 512, 12, 513, 513, 513, 513, 513, 513, 514, 12, 515, 515, 515, 515,
- 516, 515, 515, 515, 515, 515, 517, 518, 515, 515, 519, 12, 520, 12, 12, 12,
- 100, 100, 100, 100, 96, 12, 12, 98, 521, 521, 521, 521, 521, 521, 522, 12,
- 521, 521, 521, 523, 521, 524, 12, 12, 521, 12, 12, 12, 525, 525, 525, 525,
- 526, 12, 12, 12, 527, 527, 527, 527, 527, 528, 12, 12, 529, 529, 529, 529,
- 529, 530, 12, 12, 272, 272, 531, 12, 532, 532, 532, 532, 532, 532, 532, 533,
- 532, 532, 534, 535, 536, 536, 536, 536, 536, 536, 536, 537, 536, 536, 538, 12,
- 539, 539, 539, 539, 539, 539, 539, 540, 539, 540, 12, 12, 541, 541, 541, 541,
- 541, 542, 12, 12, 541, 541, 543, 541, 543, 541, 541, 541, 541, 541, 12, 544,
- 545, 545, 545, 545, 545, 545, 546, 12, 547, 547, 547, 547, 547, 547, 548, 549,
- 547, 547, 12, 549, 550, 551, 12, 12, 249, 12, 12, 12, 552, 552, 552, 552,
- 552, 552, 12, 12, 553, 553, 553, 553, 553, 554, 12, 12, 552, 552, 555, 12,
- 260, 556, 260, 557, 558, 255, 255, 255, 559, 12, 12, 12, 560, 12, 12, 12,
- 256, 561, 12, 12, 12, 260, 12, 12, 562, 562, 562, 562, 562, 562, 562, 12,
- 563, 563, 563, 563, 563, 563, 564, 12, 563, 563, 563, 565, 563, 563, 565, 12,
- 563, 563, 566, 563, 7, 7, 7, 567, 7, 199, 12, 12, 0, 246, 12, 12,
- 0, 232, 316, 0, 0, 568, 228, 0, 0, 0, 568, 7, 213, 569, 7, 0,
- 0, 0, 570, 228, 8, 225, 12, 12, 0, 0, 234, 12, 0, 0, 0, 229,
- 571, 572, 316, 229, 0, 0, 240, 316, 0, 316, 0, 0, 0, 240, 232, 316,
- 0, 229, 0, 229, 0, 0, 240, 232, 0, 573, 239, 0, 229, 0, 0, 0,
- 0, 246, 0, 0, 0, 0, 0, 239, 574, 574, 574, 574, 574, 574, 574, 12,
- 12, 12, 575, 574, 576, 574, 574, 574, 2, 2, 2, 273, 12, 275, 273, 12,
- 241, 577, 241, 241, 241, 241, 578, 241, 579, 580, 577, 12, 19, 19, 19, 581,
- 12, 12, 12, 582, 583, 583, 583, 583, 583, 583, 583, 584, 583, 583, 583, 585,
- 583, 583, 585, 586, 587, 587, 587, 587, 587, 587, 587, 588, 589, 589, 589, 589,
- 589, 589, 590, 591, 592, 592, 592, 592, 592, 592, 593, 12, 151, 154, 151, 594,
- 151, 151, 151, 154, 595, 595, 595, 595, 595, 596, 595, 595, 595, 597, 12, 12,
- 598, 598, 598, 598, 598, 598, 598, 12, 598, 598, 599, 600, 0, 234, 12, 12,
- 29, 414, 29, 29, 601, 602, 414, 29, 50, 29, 603, 12, 604, 310, 603, 414,
- 601, 602, 603, 603, 601, 602, 50, 29, 50, 29, 414, 605, 29, 29, 606, 29,
- 29, 29, 29, 12, 414, 414, 606, 29, 51, 12, 12, 12, 12, 239, 0, 0,
- 607, 12, 12, 12, 246, 12, 12, 12, 0, 0, 12, 0, 0, 232, 131, 0,
- 0, 0, 12, 12, 0, 0, 0, 240, 0, 246, 12, 239, 608, 12, 12, 12,
- 247, 247, 609, 12, 610, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0,
+ 391, 391, 391, 391, 391, 391, 391, 685, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2, 2, 3, 1, 2, 2, 3, 0, 0, 0, 0, 0, 4, 0, 4,
+ 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6,
+ 0, 0, 0, 0, 7, 8, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 10, 11, 12, 13, 14, 14, 15, 14, 14, 14,
+ 14, 14, 14, 14, 16, 17, 14, 14, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 19, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 20, 21,
+ 21, 21, 22, 20, 21, 21, 21, 21, 21, 23, 24, 25, 25, 25, 25, 25,
+ 25, 26, 25, 25, 25, 27, 28, 26, 29, 30, 31, 32, 31, 31, 31, 31,
+ 33, 34, 35, 31, 31, 31, 36, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 29, 31, 31, 31, 31, 37, 38, 37, 37, 37, 37, 37, 37,
+ 37, 39, 31, 31, 31, 31, 31, 31, 40, 40, 40, 40, 40, 40, 41, 26,
+ 42, 42, 42, 42, 42, 42, 42, 43, 44, 44, 44, 44, 44, 45, 44, 46,
+ 47, 47, 47, 48, 37, 49, 31, 31, 31, 50, 51, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 52, 31, 31, 31, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 54, 53, 55, 53, 53, 53, 56, 57, 58, 59, 59, 60, 61, 62,
+ 57, 63, 64, 65, 66, 59, 59, 67, 68, 69, 70, 71, 71, 72, 73, 74,
+ 69, 75, 76, 77, 78, 71, 79, 26, 80, 81, 82, 83, 83, 84, 85, 86,
+ 81, 87, 88, 26, 89, 83, 90, 91, 92, 93, 94, 95, 95, 96, 97, 98,
+ 93, 99, 100, 101, 102, 95, 95, 26, 103, 104, 105, 106, 107, 104, 108, 109,
+ 104, 105, 110, 26, 111, 108, 108, 112, 113, 114, 115, 113, 113, 115, 113, 116,
+ 114, 117, 118, 119, 120, 113, 121, 113, 122, 123, 124, 122, 122, 124, 125, 126,
+ 123, 127, 128, 128, 129, 122, 130, 26, 131, 132, 133, 131, 131, 131, 131, 131,
+ 132, 133, 134, 131, 135, 131, 131, 131, 136, 137, 138, 139, 137, 137, 140, 141,
+ 138, 142, 143, 137, 144, 137, 145, 26, 146, 147, 147, 147, 147, 147, 147, 148,
+ 147, 147, 147, 149, 26, 26, 26, 26, 150, 151, 152, 152, 153, 152, 152, 154,
+ 155, 156, 152, 157, 26, 26, 26, 26, 158, 158, 158, 158, 158, 158, 158, 158,
+ 158, 159, 158, 158, 158, 160, 159, 158, 158, 158, 158, 159, 158, 158, 158, 161,
+ 158, 161, 162, 163, 26, 26, 26, 26, 164, 164, 164, 164, 164, 164, 164, 164,
+ 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 165, 165, 165, 165,
+ 166, 167, 165, 165, 165, 165, 165, 168, 169, 169, 169, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 171, 172, 171, 170, 170, 170, 170, 170, 171, 170, 170, 170, 170, 171, 172,
+ 171, 170, 172, 170, 170, 170, 170, 170, 170, 170, 171, 170, 170, 170, 170, 170,
+ 170, 170, 170, 173, 170, 170, 170, 174, 170, 170, 170, 175, 176, 176, 176, 176,
+ 176, 176, 176, 176, 176, 176, 177, 177, 178, 178, 178, 178, 178, 178, 178, 178,
+ 178, 178, 178, 178, 178, 178, 178, 178, 179, 179, 179, 180, 181, 181, 181, 181,
+ 181, 181, 181, 181, 181, 182, 181, 183, 184, 184, 185, 186, 187, 187, 188, 26,
+ 189, 189, 190, 26, 191, 192, 193, 26, 194, 194, 194, 194, 194, 194, 194, 194,
+ 194, 194, 194, 195, 194, 196, 194, 196, 197, 198, 198, 199, 198, 198, 198, 198,
+ 198, 198, 198, 198, 198, 198, 198, 200, 198, 198, 198, 198, 198, 201, 178, 178,
+ 178, 178, 178, 178, 178, 178, 202, 26, 203, 203, 203, 204, 203, 205, 203, 205,
+ 206, 203, 207, 207, 207, 208, 209, 26, 210, 210, 210, 210, 210, 211, 210, 210,
+ 210, 212, 210, 213, 194, 194, 194, 194, 214, 214, 214, 215, 216, 216, 216, 216,
+ 216, 216, 216, 217, 216, 216, 216, 218, 216, 219, 216, 219, 216, 220, 9, 9,
+ 9, 221, 26, 26, 26, 26, 26, 26, 222, 222, 222, 222, 222, 222, 222, 222,
+ 222, 223, 222, 222, 222, 222, 222, 224, 225, 225, 225, 225, 225, 225, 225, 225,
+ 226, 226, 226, 226, 226, 226, 227, 228, 229, 229, 229, 229, 229, 229, 229, 230,
+ 229, 231, 232, 232, 232, 232, 232, 232, 18, 233, 165, 165, 165, 165, 165, 234,
+ 225, 26, 235, 9, 236, 237, 238, 239, 2, 2, 2, 2, 240, 241, 2, 2,
+ 2, 2, 2, 242, 243, 244, 2, 245, 2, 2, 2, 2, 2, 2, 2, 246,
+ 9, 9, 9, 9, 9, 9, 9, 9, 14, 14, 247, 247, 14, 14, 14, 14,
+ 247, 247, 14, 248, 14, 14, 14, 247, 14, 14, 14, 14, 14, 14, 249, 14,
+ 249, 14, 250, 251, 14, 14, 252, 253, 0, 254, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 255, 0, 256, 257, 0, 258, 2, 259, 0, 0, 0, 0,
+ 260, 26, 9, 9, 9, 9, 261, 26, 0, 0, 0, 0, 262, 263, 4, 0,
+ 0, 264, 0, 0, 2, 2, 2, 2, 2, 265, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 258, 26, 26, 26,
+ 0, 266, 26, 26, 0, 0, 0, 0, 267, 267, 267, 267, 267, 267, 267, 267,
+ 267, 267, 267, 267, 267, 267, 267, 267, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 268, 0, 0, 0, 269, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 270, 270, 270, 270, 270, 270, 270, 270,
+ 270, 270, 270, 270, 2, 2, 2, 2, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 271, 272, 165, 165, 165, 165, 166, 167, 273, 273,
+ 273, 273, 273, 273, 273, 274, 275, 274, 170, 170, 172, 26, 172, 172, 172, 172,
+ 172, 172, 172, 172, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 276, 26, 26, 26, 26, 277, 277, 277, 278, 277, 277, 277, 277,
+ 277, 277, 277, 277, 277, 277, 279, 26, 277, 277, 277, 277, 277, 277, 277, 277,
+ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ 277, 277, 280, 26, 26, 26, 0, 281, 282, 0, 0, 0, 283, 284, 0, 285,
+ 286, 287, 287, 287, 287, 287, 287, 287, 287, 287, 288, 289, 290, 291, 291, 291,
+ 291, 291, 291, 291, 291, 291, 291, 292, 293, 294, 294, 294, 294, 294, 295, 169,
+ 169, 169, 169, 169, 169, 169, 169, 169, 169, 296, 0, 0, 294, 294, 294, 294,
+ 0, 0, 0, 0, 281, 26, 291, 291, 169, 169, 169, 296, 0, 0, 0, 0,
+ 0, 0, 0, 0, 169, 169, 169, 297, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 291, 291, 291, 291, 291, 298, 291, 291, 291, 291, 291, 291, 291, 291,
+ 291, 291, 291, 0, 0, 0, 0, 0, 277, 277, 277, 277, 277, 277, 277, 277,
+ 0, 0, 0, 0, 0, 0, 0, 0, 299, 299, 299, 299, 299, 299, 299, 299,
+ 299, 299, 299, 299, 299, 299, 299, 299, 299, 300, 299, 299, 299, 299, 299, 299,
+ 301, 26, 302, 302, 302, 302, 302, 302, 303, 303, 303, 303, 303, 303, 303, 303,
+ 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 304, 26, 26,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 305, 305, 305, 305,
+ 305, 305, 305, 305, 305, 305, 305, 26, 0, 0, 0, 0, 306, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 307, 2, 2, 2, 2, 2, 2,
+ 2, 308, 309, 310, 26, 26, 311, 2, 312, 312, 312, 312, 312, 313, 0, 314,
+ 315, 315, 315, 315, 315, 315, 315, 26, 316, 316, 316, 316, 316, 316, 316, 316,
+ 317, 318, 316, 319, 53, 53, 53, 53, 320, 320, 320, 320, 320, 321, 322, 322,
+ 322, 322, 323, 324, 169, 169, 169, 325, 326, 326, 326, 326, 326, 326, 326, 326,
+ 326, 327, 326, 328, 164, 164, 164, 329, 330, 330, 330, 330, 330, 330, 331, 26,
+ 330, 332, 330, 333, 164, 164, 164, 164, 334, 334, 334, 334, 334, 334, 334, 334,
+ 335, 26, 26, 336, 337, 337, 338, 26, 339, 339, 339, 26, 172, 172, 2, 2,
+ 2, 2, 2, 340, 341, 342, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176,
+ 337, 337, 337, 337, 337, 343, 337, 344, 169, 169, 169, 169, 345, 26, 169, 169,
+ 296, 346, 169, 169, 169, 169, 169, 345, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 277, 277, 277, 277, 277, 277, 277, 277,
+ 277, 277, 277, 277, 277, 280, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ 277, 277, 277, 347, 26, 26, 26, 26, 348, 26, 349, 350, 25, 25, 351, 352,
+ 353, 25, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 354, 26, 355, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 356,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 357, 31, 31, 31, 31, 31,
+ 31, 358, 26, 26, 26, 26, 31, 31, 9, 9, 0, 314, 9, 359, 0, 0,
+ 0, 0, 360, 0, 258, 281, 361, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 362, 363, 0, 0, 0, 1, 2, 2, 3,
+ 1, 2, 2, 3, 364, 291, 290, 291, 291, 291, 291, 365, 169, 169, 169, 296,
+ 366, 366, 366, 367, 258, 258, 26, 368, 369, 370, 369, 369, 371, 369, 369, 372,
+ 369, 373, 369, 373, 26, 26, 26, 26, 369, 369, 369, 369, 369, 369, 369, 369,
+ 369, 369, 369, 369, 369, 369, 369, 374, 375, 0, 0, 0, 0, 0, 376, 0,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 253, 0, 377, 378, 26, 26, 26,
+ 26, 26, 0, 0, 0, 0, 0, 379, 380, 380, 380, 381, 382, 382, 382, 382,
+ 382, 382, 383, 26, 384, 0, 0, 281, 385, 385, 385, 385, 386, 387, 388, 388,
+ 388, 389, 390, 390, 390, 390, 390, 391, 392, 392, 392, 393, 394, 394, 394, 394,
+ 395, 394, 396, 26, 26, 26, 26, 26, 397, 397, 397, 397, 397, 397, 397, 397,
+ 397, 397, 398, 398, 398, 398, 398, 398, 399, 399, 399, 400, 399, 401, 402, 402,
+ 402, 402, 403, 402, 402, 402, 402, 403, 404, 404, 404, 404, 404, 26, 405, 405,
+ 405, 405, 405, 405, 406, 407, 408, 409, 408, 409, 410, 408, 411, 408, 411, 412,
+ 26, 26, 26, 26, 26, 26, 26, 26, 413, 413, 413, 413, 413, 413, 413, 413,
+ 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 414, 26,
+ 413, 413, 415, 26, 413, 26, 26, 26, 416, 2, 2, 2, 2, 2, 417, 308,
+ 26, 26, 26, 26, 26, 26, 26, 26, 418, 419, 420, 420, 420, 420, 421, 422,
+ 423, 423, 424, 423, 425, 425, 425, 425, 426, 426, 426, 427, 428, 426, 26, 26,
+ 26, 26, 26, 26, 429, 429, 430, 431, 432, 432, 432, 433, 434, 434, 434, 435,
+ 26, 26, 26, 26, 26, 26, 26, 26, 436, 436, 436, 436, 437, 437, 437, 438,
+ 437, 437, 439, 437, 437, 437, 437, 437, 440, 441, 442, 443, 444, 444, 445, 446,
+ 444, 447, 444, 447, 448, 448, 448, 448, 449, 449, 449, 449, 26, 26, 26, 26,
+ 450, 450, 450, 450, 451, 452, 451, 26, 453, 453, 453, 453, 453, 453, 454, 455,
+ 456, 456, 457, 456, 458, 458, 459, 458, 460, 460, 461, 462, 26, 463, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 464, 464, 464, 464, 464, 464, 464, 464,
+ 464, 465, 26, 26, 26, 26, 26, 26, 466, 466, 466, 466, 466, 466, 467, 26,
+ 466, 466, 466, 466, 466, 466, 467, 468, 469, 469, 469, 469, 469, 26, 469, 470,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 31, 31, 31, 50, 471, 471, 471, 471, 471, 472, 473, 26,
+ 26, 26, 26, 26, 26, 26, 26, 474, 475, 475, 475, 475, 475, 26, 476, 476,
+ 476, 476, 476, 477, 26, 26, 478, 478, 478, 479, 26, 26, 26, 26, 480, 480,
+ 480, 481, 26, 26, 482, 482, 483, 26, 484, 484, 484, 484, 484, 484, 484, 484,
+ 484, 485, 486, 484, 484, 484, 485, 487, 488, 488, 488, 488, 488, 488, 488, 488,
+ 489, 490, 491, 491, 491, 492, 491, 493, 494, 494, 494, 494, 494, 494, 495, 494,
+ 494, 26, 496, 496, 496, 496, 497, 26, 498, 498, 498, 498, 498, 498, 498, 498,
+ 498, 498, 498, 498, 499, 137, 500, 26, 501, 501, 502, 501, 501, 501, 501, 501,
+ 503, 26, 26, 26, 26, 26, 26, 26, 504, 505, 506, 507, 506, 508, 509, 509,
+ 509, 509, 509, 509, 509, 510, 509, 511, 512, 513, 514, 515, 515, 516, 517, 518,
+ 513, 519, 520, 521, 522, 523, 523, 26, 524, 524, 524, 524, 524, 524, 524, 524,
+ 524, 524, 524, 525, 526, 26, 26, 26, 527, 527, 527, 527, 527, 527, 527, 527,
+ 527, 26, 527, 528, 26, 26, 26, 26, 529, 529, 529, 529, 529, 529, 530, 529,
+ 529, 529, 529, 530, 26, 26, 26, 26, 531, 531, 531, 531, 531, 531, 531, 531,
+ 532, 26, 531, 533, 198, 534, 26, 26, 535, 535, 535, 535, 535, 535, 535, 536,
+ 535, 536, 26, 26, 26, 26, 26, 26, 537, 537, 537, 538, 537, 539, 537, 537,
+ 540, 26, 26, 26, 26, 26, 26, 26, 541, 541, 541, 541, 541, 541, 541, 542,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 543, 543, 543, 543,
+ 543, 543, 543, 543, 543, 543, 544, 545, 546, 547, 548, 549, 549, 549, 550, 551,
+ 546, 26, 549, 552, 26, 26, 26, 26, 26, 26, 26, 26, 553, 554, 553, 553,
+ 553, 553, 553, 554, 555, 26, 26, 26, 556, 556, 556, 556, 556, 556, 556, 556,
+ 556, 26, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 558, 26, 178, 178,
+ 559, 559, 559, 559, 559, 559, 559, 560, 53, 561, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 562, 563, 562, 562, 562, 562, 564, 562,
+ 565, 26, 562, 562, 562, 566, 567, 567, 567, 567, 568, 567, 567, 569, 570, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 571, 572, 573, 573, 573, 573, 571, 574,
+ 573, 26, 573, 575, 576, 577, 578, 578, 578, 579, 580, 581, 578, 582, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 583, 583, 583, 584, 585, 585, 586, 585, 585, 585, 585, 587,
+ 585, 585, 585, 588, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 589, 26,
+ 108, 108, 108, 108, 108, 108, 590, 591, 592, 592, 592, 592, 592, 592, 592, 592,
+ 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 593, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 592, 592, 592, 592, 592, 592, 592, 592,
+ 592, 592, 592, 592, 592, 594, 595, 26, 592, 592, 592, 592, 592, 592, 592, 592,
+ 596, 26, 26, 26, 26, 26, 26, 26, 26, 26, 597, 597, 597, 597, 597, 597,
+ 597, 597, 597, 597, 597, 597, 598, 26, 599, 599, 599, 599, 599, 599, 599, 599,
+ 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599,
+ 599, 599, 600, 26, 26, 26, 26, 26, 601, 601, 601, 601, 601, 601, 601, 601,
+ 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601,
+ 602, 26, 26, 26, 26, 26, 26, 26, 305, 305, 305, 305, 305, 305, 305, 305,
+ 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 603,
+ 604, 604, 604, 605, 604, 606, 607, 607, 607, 607, 607, 607, 607, 607, 607, 608,
+ 607, 609, 610, 610, 610, 611, 611, 26, 612, 612, 612, 612, 612, 612, 612, 612,
+ 613, 26, 612, 614, 614, 612, 612, 615, 612, 612, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 617, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 618, 618, 618, 618, 618, 618, 618, 618,
+ 618, 619, 618, 618, 618, 618, 618, 618, 618, 620, 618, 618, 26, 26, 26, 26,
+ 26, 26, 26, 26, 621, 26, 347, 26, 622, 622, 622, 622, 622, 622, 622, 622,
+ 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622,
+ 622, 622, 622, 622, 622, 622, 622, 26, 623, 623, 623, 623, 623, 623, 623, 623,
+ 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623,
+ 623, 623, 624, 26, 26, 26, 26, 26, 622, 625, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 626, 627, 628, 287, 287, 287, 287, 287, 287, 287,
+ 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287,
+ 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 629, 26, 630, 26,
+ 26, 26, 631, 26, 632, 26, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633,
+ 633, 633, 633, 633, 633, 633, 633, 634, 635, 635, 635, 635, 635, 635, 635, 635,
+ 635, 635, 635, 635, 635, 636, 635, 637, 635, 638, 635, 639, 281, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 9, 9, 9, 9, 9, 640, 9, 9,
+ 221, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 281, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 276, 26, 0, 0, 0, 0, 258, 363, 0, 0,
+ 0, 0, 0, 0, 641, 642, 0, 643, 644, 645, 0, 0, 0, 646, 0, 0,
+ 0, 0, 0, 0, 0, 266, 26, 26, 14, 14, 14, 14, 14, 14, 14, 14,
+ 247, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 0, 0, 281, 26, 0, 0, 281, 26, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 258, 26, 0, 0, 0, 260, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 647, 648, 0, 649,
+ 650, 0, 0, 0, 0, 0, 0, 0, 269, 651, 255, 255, 0, 0, 0, 652,
+ 653, 654, 655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 268, 0, 0, 0, 0, 0, 0, 656, 656, 656, 656, 656, 656, 656, 656,
+ 656, 656, 656, 656, 656, 656, 656, 656, 656, 657, 26, 658, 659, 656, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 348, 660, 308, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 661, 270, 270, 662, 663, 664, 18, 18,
+ 18, 18, 18, 18, 18, 665, 26, 26, 26, 666, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 667, 667, 667, 667, 667, 668, 667, 669,
+ 667, 670, 26, 26, 26, 26, 26, 26, 26, 26, 671, 671, 671, 672, 26, 26,
+ 673, 673, 673, 673, 673, 673, 673, 674, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 675, 675, 675, 675, 675, 676, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 172, 677, 170, 172, 678, 678, 678, 678, 678, 678, 678, 678,
+ 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678,
+ 679, 678, 680, 26, 26, 26, 26, 26, 681, 681, 681, 681, 681, 681, 681, 681,
+ 681, 682, 681, 683, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 363, 0, 0, 0, 0, 0, 0, 0, 377, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 363, 0, 0, 0, 0, 0, 0, 276,
+ 26, 26, 26, 26, 26, 26, 26, 26, 684, 31, 31, 31, 685, 686, 687, 688,
+ 689, 690, 685, 691, 685, 687, 687, 692, 31, 693, 31, 694, 695, 693, 31, 694,
+ 26, 26, 26, 26, 26, 26, 51, 26, 0, 0, 0, 0, 0, 281, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 26, 0, 258, 363, 0,
+ 363, 0, 363, 0, 0, 0, 276, 26, 0, 0, 0, 0, 0, 276, 26, 26,
+ 26, 26, 26, 26, 696, 0, 0, 0, 697, 26, 0, 0, 0, 0, 0, 281,
+ 0, 260, 314, 26, 276, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 698, 0, 377, 0, 377, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 258, 699, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 314, 0, 281, 260, 26, 0, 281, 0, 0, 0, 0, 0, 0,
+ 0, 26, 0, 314, 0, 0, 0, 0, 0, 26, 0, 0, 0, 276, 314, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 281, 26, 0, 276, 0, 377, 0, 260, 0, 0, 0, 0, 0, 269,
+ 276, 696, 0, 281, 0, 260, 0, 260, 0, 0, 360, 0, 0, 0, 0, 0,
+ 0, 266, 26, 26, 26, 26, 0, 314, 277, 277, 277, 277, 277, 277, 277, 277,
+ 277, 277, 277, 277, 26, 26, 26, 26, 277, 277, 277, 277, 277, 277, 277, 347,
+ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 280, 277, 277, 277, 277,
+ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 347, 26, 277, 277,
+ 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277,
+ 277, 277, 277, 277, 700, 26, 26, 26, 277, 277, 277, 280, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 277, 277, 277, 277, 277, 277, 277, 277,
+ 277, 701, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 702, 26, 26, 26, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 939, 940, 941, 942, 946, 948, 0, 962,
969, 970, 971, 976,1001,1002,1003,1008, 0,1033,1040,1041,1042,1043,1047, 0,
0,1080,1081,1082,1086,1110, 0, 0,1124,1125,1126,1127,1131,1133, 0,1147,
@@ -4387,14 +4562,21 @@ _hb_ucd_u16[10040] =
817, 818, 819, 820, 821, 935, 0, 0,
};
static const int16_t
-_hb_ucd_i16[92] =
+_hb_ucd_i16[196] =
{
- 0, 0, 1, -1, 2, 0, -2, 0, 0, 2, 0, -2, 0, 16, 0, -16,
- 0, 1, -1, 0, 3, 3, 3, -3, -3, -3, 0, 2016, 0, 2527, 1923, 1914,
- 1918, 0, 2250, 0, 0, 138, 0, 7, -7, 0, -1, 1, 1824, 0, 2104, 0,
- 2108, 2106, 0, 2106, 1316, 0, -1, -138, 8, 8, 8, 0, 7, 7, -8, -8,
- -8, -7,-1316, 1, -1, 3, -3, 1, 0,-1914,-1918, 0, 0,-1923,-1824, 0,
- 0,-2016,-2104, 0, 0,-2106,-2108,-2106,-2250, 0,-2527, 0,
+ 0, 0, 0, 0, 1, -1, 0, 0, 2, 0, -2, 0, 0, 0, 0, 2,
+ 0, -2, 0, 0, 0, 0, 0, 16, 0, 0, 0, -16, 0, 0, 1, -1,
+ 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, -1, 0, 3, 3, 3, -3,
+ -3, -3, 0, 0, 0, 2016, 0, 0, 0, 0, 0, 2527, 1923, 1914, 1918, 0,
+ 2250, 0, 0, 0, 0, 0, 0, 138, 0, 7, 0, 0, -7, 0, 0, 0,
+ 1, -1, 1, -1, -1, 1, -1, 0, 1824, 0, 0, 0, 0, 0, 2104, 0,
+ 2108, 2106, 0, 2106, 1316, 0, 0, 0, 0, 1, -1, 1, -1, -138, 0, 0,
+ 1, -1, 8, 8, 8, 0, 7, 7, 0, 0, -8, -8, -8, -7, -7, 0,
+ 1, -1, 0, 2,-1316, 1, -1, 0, -1, 1, -1, 1, -1, 3, 1, -1,
+ -3, 1, -1, 1, -1, 0, 0,-1914,-1918, 0, 0,-1923,-1824, 0, 0, 0,
+ 0,-2016, 0, 0, 1, -1, 0, 1, 0, 0,-2104, 0, 0, 0, 0,-2106,
+ -2108,-2106, 0, 0, 1, -1,-2250, 0, 0, 0,-2527, 0, 0, -2, 0, 1,
+ -1, 0, 1, -1,
};
static inline uint_fast8_t
@@ -4415,17 +4597,17 @@ _hb_ucd_b4 (const uint8_t* a, unsigned i)
static inline int_fast16_t
_hb_ucd_bmg (unsigned u)
{
- return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9684+(((_hb_ucd_u8[9452+(((_hb_ucd_u8[9356+(((_hb_ucd_b4(9292+_hb_ucd_u8,u>>1>>2>>3>>3))<<3)+((u>>1>>2>>3)&7u))])<<3)+((u>>1>>2)&7u))])<<2)+((u>>1)&3u))])<<1)+((u)&1u)]:0;
+ return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9540+(((_hb_ucd_u8[9420+(((_hb_ucd_b4(9292+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0;
}
static inline uint_fast8_t
_hb_ucd_sc (unsigned u)
{
- return u<918000u?_hb_ucd_u8[11118+(((_hb_ucd_u16[4024+(((_hb_ucd_u16[2040+(((_hb_ucd_u8[10382+(((_hb_ucd_u8[9932+(u>>2>>2>>3>>4)])<<4)+((u>>2>>2>>3)&15u))])<<3)+((u>>2>>2)&7u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2;
+ return u<918000u?_hb_ucd_u8[11062+(((_hb_ucd_u16[2040+(((_hb_ucd_u8[10326+(((_hb_ucd_u8[9876+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2;
}
static inline uint_fast16_t
_hb_ucd_dm (unsigned u)
{
- return u<195102u?_hb_ucd_u16[6728+(((_hb_ucd_u8[13944+(((_hb_ucd_u8[13562+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0;
+ return u<195102u?_hb_ucd_u16[6008+(((_hb_ucd_u8[17068+(((_hb_ucd_u8[16686+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0;
}
diff --git a/src/hb-ucd.cc b/src/hb-ucd.cc
index 4c8b1ee5e..baea224a2 100644
--- a/src/hb-ucd.cc
+++ b/src/hb-ucd.cc
@@ -129,16 +129,12 @@ hb_ucd_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
hb_codepoint_t a, hb_codepoint_t b, hb_codepoint_t *ab,
void *user_data HB_UNUSED)
{
- // Hangul is handled algorithmically.
if (_hb_ucd_compose_hangul (a, b, ab)) return true;
hb_codepoint_t u = 0;
if ((a & 0xFFFFF800u) == 0x0000u && (b & 0xFFFFFF80) == 0x0300u)
{
- /* If "a" is small enough and "b" is in the U+0300 range,
- * the composition data is encoded in a 32bit array sorted
- * by "a,b" pair. */
uint32_t k = HB_CODEPOINT_ENCODE3_11_7_14 (a, b, 0);
const uint32_t *v = hb_bsearch (k,
_hb_ucd_dm2_u32_map,
@@ -150,8 +146,6 @@ hb_ucd_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
}
else
{
- /* Otherwise it is stored in a 64bit array sorted by
- * "a,b" pair. */
uint64_t k = HB_CODEPOINT_ENCODE3 (a, b, 0);
const uint64_t *v = hb_bsearch (k,
_hb_ucd_dm2_u64_map,
@@ -176,22 +170,15 @@ hb_ucd_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
unsigned i = _hb_ucd_dm (ab);
- /* If no data, there's no decomposition. */
if (likely (!i)) return false;
i--;
- /* Check if it's a single-character decomposition. */
if (i < ARRAY_LENGTH (_hb_ucd_dm1_p0_map) + ARRAY_LENGTH (_hb_ucd_dm1_p2_map))
{
- /* Single-character decompositions currently are only in plane 0 or plane 2. */
if (i < ARRAY_LENGTH (_hb_ucd_dm1_p0_map))
- {
- /* Plane 0. */
*a = _hb_ucd_dm1_p0_map[i];
- }
else
{
- /* Plane 2. */
i -= ARRAY_LENGTH (_hb_ucd_dm1_p0_map);
*a = 0x20000 | _hb_ucd_dm1_p2_map[i];
}
@@ -200,10 +187,8 @@ hb_ucd_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
}
i -= ARRAY_LENGTH (_hb_ucd_dm1_p0_map) + ARRAY_LENGTH (_hb_ucd_dm1_p2_map);
- /* Otherwise they are encoded either in a 32bit array or a 64bit array. */
if (i < ARRAY_LENGTH (_hb_ucd_dm2_u32_map))
{
- /* 32bit array. */
uint32_t v = _hb_ucd_dm2_u32_map[i];
*a = HB_CODEPOINT_DECODE3_11_7_14_1 (v);
*b = HB_CODEPOINT_DECODE3_11_7_14_2 (v);
@@ -211,7 +196,6 @@ hb_ucd_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
}
i -= ARRAY_LENGTH (_hb_ucd_dm2_u32_map);
- /* 64bit array. */
uint64_t v = _hb_ucd_dm2_u64_map[i];
*a = HB_CODEPOINT_DECODE3_1 (v);
*b = HB_CODEPOINT_DECODE3_2 (v);
diff --git a/src/hb-unicode.cc b/src/hb-unicode.cc
index 9a6471e52..c1795dc7f 100644
--- a/src/hb-unicode.cc
+++ b/src/hb-unicode.cc
@@ -377,30 +377,20 @@ hb_unicode_funcs_set_##name##_func (hb_unicode_funcs_t *ufuncs, \
hb_destroy_func_t destroy) \
{ \
if (hb_object_is_immutable (ufuncs)) \
- goto fail; \
- \
- if (!func) \
- { \
- if (destroy) \
- destroy (user_data); \
- destroy = nullptr; \
- user_data = ufuncs->parent->user_data.name; \
- } \
+ return; \
\
if (ufuncs->destroy.name) \
ufuncs->destroy.name (ufuncs->user_data.name); \
\
- if (func) \
+ if (func) { \
ufuncs->func.name = func; \
- else \
+ ufuncs->user_data.name = user_data; \
+ ufuncs->destroy.name = destroy; \
+ } else { \
ufuncs->func.name = ufuncs->parent->func.name; \
- ufuncs->user_data.name = user_data; \
- ufuncs->destroy.name = destroy; \
- return; \
- \
-fail: \
- if (destroy) \
- destroy (user_data); \
+ ufuncs->user_data.name = ufuncs->parent->user_data.name; \
+ ufuncs->destroy.name = nullptr; \
+ } \
}
HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
diff --git a/src/hb-uniscribe.cc b/src/hb-uniscribe.cc
index 9648e0266..50f71ce9c 100644
--- a/src/hb-uniscribe.cc
+++ b/src/hb-uniscribe.cc
@@ -355,7 +355,7 @@ _hb_rename_font (hb_blob_t *blob, wchar_t *new_name)
return nullptr;
}
- hb_memcpy(new_sfnt_data, orig_sfnt_data, length);
+ memcpy(new_sfnt_data, orig_sfnt_data, length);
OT::name &name = StructAtOffset<OT::name> (new_sfnt_data, name_table_offset);
name.format = 0;
@@ -478,11 +478,11 @@ populate_log_font (LOGFONTW *lf,
hb_font_t *font,
unsigned int font_size)
{
- hb_memset (lf, 0, sizeof (*lf));
+ memset (lf, 0, sizeof (*lf));
lf->lfHeight = - (int) font_size;
lf->lfCharSet = DEFAULT_CHARSET;
- hb_memcpy (lf->lfFaceName, font->face->data.uniscribe->face_name, sizeof (lf->lfFaceName));
+ memcpy (lf->lfFaceName, font->face->data.uniscribe->face_name, sizeof (lf->lfFaceName));
return true;
}
diff --git a/src/hb-vector.hh b/src/hb-vector.hh
index 9b52f5ca9..a6d9f6b3f 100644
--- a/src/hb-vector.hh
+++ b/src/hb-vector.hh
@@ -35,7 +35,7 @@
template <typename Type,
bool sorted=false>
-struct hb_vector_t
+struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty_t>::type
{
typedef Type item_t;
static constexpr unsigned item_size = hb_static_size (Type);
@@ -53,10 +53,9 @@ struct hb_vector_t
hb_requires (hb_is_iterable (Iterable))>
hb_vector_t (const Iterable &o) : hb_vector_t ()
{
- auto iter = hb_iter (o);
- if (iter.is_random_access_iterator)
- alloc (hb_len (iter));
- hb_copy (iter, *this);
+ if (hb_iter (o).is_random_access_iterator)
+ alloc (hb_len (hb_iter (o)));
+ hb_copy (o, *this);
}
hb_vector_t (const hb_vector_t &o) : hb_vector_t ()
{
@@ -84,9 +83,6 @@ struct hb_vector_t
allocated = length = 0;
arrayZ = nullptr;
}
- void init0 ()
- {
- }
void fini ()
{
@@ -98,11 +94,7 @@ struct hb_vector_t
void reset ()
{
if (unlikely (in_error ()))
- /* Big Hack! We don't know the true allocated size before
- * an allocation failure happened. But we know it was at
- * least as big as length. Restore it to that and continue
- * as if error did not happen. */
- allocated = length;
+ allocated = length; // Big hack!
resize (0);
}
@@ -130,7 +122,7 @@ struct hb_vector_t
}
hb_bytes_t as_bytes () const
- { return hb_bytes_t ((const char *) arrayZ, get_size ()); }
+ { return hb_bytes_t ((const char *) arrayZ, length * item_size); }
bool operator == (const hb_vector_t &o) const { return as_array () == o.as_array (); }
bool operator != (const hb_vector_t &o) const { return !(*this == o); }
@@ -172,10 +164,14 @@ struct hb_vector_t
operator iter_t () const { return iter (); }
operator writer_t () { return writer (); }
- /* Faster range-based for loop. */
- Type *begin () const { return arrayZ; }
- Type *end () const { return arrayZ + length; }
-
+ c_array_t sub_array (unsigned int start_offset, unsigned int count) const
+ { return as_array ().sub_array (start_offset, count); }
+ c_array_t sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) const
+ { return as_array ().sub_array (start_offset, count); }
+ array_t sub_array (unsigned int start_offset, unsigned int count)
+ { return as_array ().sub_array (start_offset, count); }
+ array_t sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */)
+ { return as_array ().sub_array (start_offset, count); }
hb_sorted_array_t<Type> as_sorted_array ()
{ return hb_sorted_array (arrayZ, length); }
@@ -244,11 +240,12 @@ struct hb_vector_t
if (likely (new_array))
{
for (unsigned i = 0; i < length; i++)
- {
new (std::addressof (new_array[i])) Type ();
+ for (unsigned i = 0; i < (unsigned) length; i++)
new_array[i] = std::move (arrayZ[i]);
- arrayZ[i].~Type ();
- }
+ unsigned old_length = length;
+ shrink_vector (0);
+ length = old_length;
hb_free (arrayZ);
}
return new_array;
@@ -280,14 +277,7 @@ struct hb_vector_t
copy_vector (const hb_vector_t &other)
{
length = other.length;
-#ifndef HB_OPTIMIZE_SIZE
- if (sizeof (T) >= sizeof (long long))
- /* This runs faster because of alignment. */
- for (unsigned i = 0; i < length; i++)
- arrayZ[i] = other.arrayZ[i];
- else
-#endif
- hb_memcpy ((void *) arrayZ, (const void *) other.arrayZ, length * item_size);
+ hb_memcpy ((void *) arrayZ, (const void *) other.arrayZ, length * item_size);
}
template <typename T = Type,
hb_enable_if (!hb_is_trivially_copyable (T) &&
@@ -319,6 +309,15 @@ struct hb_vector_t
}
}
+ template <typename T = Type,
+ hb_enable_if (hb_is_trivially_destructible(T))>
+ void
+ shrink_vector (unsigned size)
+ {
+ length = size;
+ }
+ template <typename T = Type,
+ hb_enable_if (!hb_is_trivially_destructible(T))>
void
shrink_vector (unsigned size)
{
@@ -329,6 +328,17 @@ struct hb_vector_t
}
}
+ template <typename T = Type,
+ hb_enable_if (hb_is_trivially_copy_assignable(T))>
+ void
+ shift_down_vector (unsigned i)
+ {
+ memmove (static_cast<void *> (&arrayZ[i - 1]),
+ static_cast<void *> (&arrayZ[i]),
+ (length - i) * sizeof (Type));
+ }
+ template <typename T = Type,
+ hb_enable_if (!hb_is_trivially_copy_assignable(T))>
void
shift_down_vector (unsigned i)
{
@@ -371,22 +381,16 @@ struct hb_vector_t
return true;
}
- bool resize (int size_, bool initialize = true)
+ bool resize (int size_)
{
unsigned int size = size_ < 0 ? 0u : (unsigned int) size_;
if (!alloc (size))
return false;
if (size > length)
- {
- if (initialize)
- grow_vector (size);
- }
+ grow_vector (size);
else if (size < length)
- {
- if (initialize)
- shrink_vector (size);
- }
+ shrink_vector (size);
length = size;
return true;
@@ -395,13 +399,13 @@ struct hb_vector_t
Type pop ()
{
if (!length) return Null (Type);
- Type v {std::move (arrayZ[length - 1])};
+ Type v = arrayZ[length - 1];
arrayZ[length - 1].~Type ();
length--;
return v;
}
- void remove_ordered (unsigned int i)
+ void remove (unsigned int i)
{
if (unlikely (i >= length))
return;
@@ -410,18 +414,6 @@ struct hb_vector_t
length--;
}
- template <bool Sorted = sorted,
- hb_enable_if (!Sorted)>
- void remove_unordered (unsigned int i)
- {
- if (unlikely (i >= length))
- return;
- if (i != length - 1)
- arrayZ[i] = std::move (arrayZ[length - 1]);
- arrayZ[length - 1].~Type ();
- length--;
- }
-
void shrink (int size_)
{
unsigned int size = size_ < 0 ? 0u : (unsigned int) size_;
@@ -433,8 +425,10 @@ struct hb_vector_t
/* Sorting API. */
- void qsort (int (*cmp)(const void*, const void*) = Type::cmp)
+ void qsort (int (*cmp)(const void*, const void*))
{ as_array ().qsort (cmp); }
+ void qsort (unsigned int start = 0, unsigned int end = (unsigned int) -1)
+ { as_array ().qsort (start, end); }
/* Unsorted search API. */
template <typename T>
diff --git a/src/hb-version.h b/src/hb-version.h
index 1070262a3..8d6ec66e1 100644
--- a/src/hb-version.h
+++ b/src/hb-version.h
@@ -41,26 +41,26 @@ HB_BEGIN_DECLS
*
* The major component of the library version available at compile-time.
*/
-#define HB_VERSION_MAJOR 6
+#define HB_VERSION_MAJOR 5
/**
* HB_VERSION_MINOR:
*
* The minor component of the library version available at compile-time.
*/
-#define HB_VERSION_MINOR 0
+#define HB_VERSION_MINOR 3
/**
* HB_VERSION_MICRO:
*
* The micro component of the library version available at compile-time.
*/
-#define HB_VERSION_MICRO 0
+#define HB_VERSION_MICRO 1
/**
* HB_VERSION_STRING:
*
* A string literal containing the library version available at compile-time.
*/
-#define HB_VERSION_STRING "6.0.0"
+#define HB_VERSION_STRING "5.3.1"
/**
* HB_VERSION_ATLEAST:
diff --git a/src/hb.hh b/src/hb.hh
index 410d090d3..8ec638a2b 100644
--- a/src/hb.hh
+++ b/src/hb.hh
@@ -126,7 +126,6 @@
/* Ignored intentionally. */
#ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_IGNORED
#pragma GCC diagnostic ignored "-Wclass-memaccess"
-#pragma GCC diagnostic ignored "-Wcast-function-type-strict" // https://github.com/harfbuzz/harfbuzz/pull/3859#issuecomment-1295409126
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
#pragma GCC diagnostic ignored "-Wformat-zero-length"
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
diff --git a/src/main.cc b/src/main.cc
index bb18ebe38..99e1528da 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -58,8 +58,7 @@ svg_dump (hb_face_t *face, unsigned face_index)
const char *data = hb_blob_get_data (blob, &length);
char output_path[255];
- snprintf (output_path, sizeof output_path,
- "out/svg-%u-%u.svg%s",
+ sprintf (output_path, "out/svg-%u-%u.svg%s",
glyph_id,
face_index,
// append "z" if the content is gzipped, https://stackoverflow.com/a/6059405
@@ -113,7 +112,7 @@ png_dump (hb_face_t *face, unsigned face_index)
const char *data = hb_blob_get_data (blob, &length);
char output_path[255];
- snprintf (output_path, sizeof output_path, "out/png-%u-%u-%u.png", glyph_id, strike, face_index);
+ sprintf (output_path, "out/png-%u-%u-%u.png", glyph_id, strike, face_index);
FILE *f = fopen (output_path, "wb");
fwrite (data, 1, length, f);
@@ -225,7 +224,7 @@ layered_glyph_dump (hb_font_t *font, hb_draw_funcs_t *funcs, unsigned face_index
}
char output_path[255];
- snprintf (output_path, sizeof output_path, "out/colr-%u-%u-%u.svg", gid, palette, face_index);
+ sprintf (output_path, "out/colr-%u-%u-%u.svg", gid, palette, face_index);
FILE *f = fopen (output_path, "wb");
fprintf (f, "<svg xmlns=\"http://www.w3.org/2000/svg\""
" viewBox=\"%d %d %d %d\">\n",
@@ -275,7 +274,7 @@ dump_glyphs (hb_font_t *font, hb_draw_funcs_t *funcs, unsigned face_index)
}
char output_path[255];
- snprintf (output_path, sizeof output_path, "out/%u-%u.svg", face_index, gid);
+ sprintf (output_path, "out/%u-%u.svg", face_index, gid);
FILE *f = fopen (output_path, "wb");
fprintf (f, "<svg xmlns=\"http://www.w3.org/2000/svg\""
" viewBox=\"%d %d %d %d\"><path d=\"",
diff --git a/src/meson.build b/src/meson.build
index 5d01d9862..ba3470fff 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -56,7 +56,6 @@ hb_base_sources = files(
'hb-map.hh',
'hb-meta.hh',
'hb-ms-feature-ranges.hh',
- 'hb-multimap.hh',
'hb-mutex.hh',
'hb-null.hh',
'hb-number.cc',
@@ -415,40 +414,33 @@ harfbuzz_deps = [thread_dep, m_dep] + harfbuzz_extra_deps
libharfbuzz_link_language = 'c'
-hb_features = configuration_data()
-
if conf.get('HAVE_FREETYPE', 0) == 1
hb_sources += hb_ft_sources
hb_headers += hb_ft_headers
harfbuzz_deps += [freetype_dep]
- hb_features.set('HB_HAS_FREETYPE', 1)
endif
if conf.get('HAVE_GDI', 0) == 1
hb_sources += hb_gdi_sources
hb_headers += hb_gdi_headers
harfbuzz_deps += gdi_uniscribe_deps
- hb_features.set('HB_HAS_GDI', 1)
endif
if conf.get('HAVE_GRAPHITE2', 0) == 1
hb_sources += hb_graphite2_sources
hb_headers += hb_graphite2_headers
harfbuzz_deps += [graphite2_dep, graphite_dep]
- hb_features.set('HB_HAS_GRAPHITE', 1)
endif
if conf.get('HAVE_GLIB', 0) == 1
hb_sources += hb_glib_sources
hb_headers += hb_glib_headers
harfbuzz_deps += [glib_dep]
- hb_features.set('HB_HAS_GLIB', 1)
endif
if conf.get('HAVE_UNISCRIBE', 0) == 1
hb_sources += hb_uniscribe_sources
hb_headers += hb_uniscribe_headers
- hb_features.set('HB_HAS_UNISCRIBE', 1)
endif
if conf.get('HAVE_DIRECTWRITE', 0) == 1
@@ -456,14 +448,12 @@ if conf.get('HAVE_DIRECTWRITE', 0) == 1
hb_headers += hb_directwrite_headers
# hb-directwrite needs a C++ linker
libharfbuzz_link_language = 'cpp'
- hb_features.set('HB_HAS_DIRECTWRITE', 1)
endif
if conf.get('HAVE_CORETEXT', 0) == 1
hb_sources += hb_coretext_sources
hb_headers += hb_coretext_headers
harfbuzz_deps += coretext_deps
- hb_features.set('HB_HAS_CORETEXT', 1)
endif
have_icu = conf.get('HAVE_ICU', 0) == 1
@@ -473,17 +463,8 @@ if have_icu and have_icu_builtin
hb_sources += hb_icu_sources
hb_headers += hb_icu_headers
harfbuzz_deps += [icu_dep]
- hb_features.set('HB_HAS_ICU', 1)
endif
-hb_features_h = configure_file(input: 'hb-features.h.in',
- output: 'hb-features.h',
- configuration: hb_features,
- install: true,
- install_dir: get_option('includedir') / meson.project_name())
-
-# Base and default-included sources and headers
-
# harfbuzz
gen_def = find_program('gen-def.py')
@@ -599,7 +580,6 @@ if get_option('tests').enabled()
'test-iter': ['test-iter.cc', 'hb-static.cc'],
'test-machinery': ['test-machinery.cc', 'hb-static.cc'],
'test-map': ['test-map.cc', 'hb-static.cc'],
- 'test-multimap': ['test-multimap.cc', 'hb-static.cc'],
'test-number': ['test-number.cc', 'hb-number.cc'],
'test-ot-tag': ['hb-ot-tag.cc'],
'test-priority-queue': ['test-priority-queue.cc', 'hb-static.cc'],
@@ -677,8 +657,8 @@ endif
have_gobject = conf.get('HAVE_GOBJECT', 0) == 1
cmake_config = configuration_data()
-cmake_config.set('libdir', get_option('prefix') / get_option('libdir'))
-cmake_config.set('includedir', get_option('prefix') / get_option('includedir'))
+cmake_config.set('libdir', '${prefix}/@0@'.format(get_option('libdir')))
+cmake_config.set('includedir', '${prefix}/@0@'.format(get_option('includedir')))
cmake_config.set('HB_LIBTOOL_VERSION_INFO', hb_libtool_version_info)
cmake_config.set('have_gobject', '@0@'.format(have_gobject))
configure_file(input: 'harfbuzz-config.cmake.in',
diff --git a/src/sample.py b/src/sample.py
index 5d04e803f..fd8504800 100755
--- a/src/sample.py
+++ b/src/sample.py
@@ -2,8 +2,6 @@
import sys
import array
-import gi
-gi.require_version('HarfBuzz', '0.0')
from gi.repository import HarfBuzz as hb
from gi.repository import GLib
diff --git a/src/test-array.cc b/src/test-array.cc
index 28cd02364..6c888138e 100644
--- a/src/test-array.cc
+++ b/src/test-array.cc
@@ -70,9 +70,6 @@ test_reverse_invalid ()
int
main (int argc, char **argv)
{
- /* The following fails on MSVC. */
- // assert (sizeof (hb_array_t<int>) == sizeof (hb_sorted_array_t<int>));
-
test_reverse ();
test_reverse_range ();
test_reverse_invalid ();
diff --git a/src/test-buffer-serialize.cc b/src/test-buffer-serialize.cc
index 8a887922b..bbebcbe7a 100644
--- a/src/test-buffer-serialize.cc
+++ b/src/test-buffer-serialize.cc
@@ -43,8 +43,10 @@ main (int argc, char **argv)
#ifndef HB_NO_BUFFER_SERIALIZE
- if (argc < 2)
- argv[1] = (char *) "/dev/null";
+ if (argc != 2) {
+ fprintf (stderr, "usage: %s font-file\n", argv[0]);
+ exit (1);
+ }
hb_blob_t *blob = hb_blob_create_from_file_or_fail (argv[1]);
assert (blob);
@@ -56,7 +58,7 @@ main (int argc, char **argv)
hb_font_t *font = hb_font_create (face);
hb_face_destroy (face);
hb_font_set_scale (font, upem, upem);
- //hb_ot_font_set_funcs (font);
+ hb_ot_font_set_funcs (font);
#ifdef HAVE_FREETYPE
//hb_ft_font_set_funcs (font);
#endif
diff --git a/src/test-iter.cc b/src/test-iter.cc
index bb966d4c9..c37d1e74d 100644
--- a/src/test-iter.cc
+++ b/src/test-iter.cc
@@ -319,36 +319,13 @@ main (int argc, char **argv)
;
/* The result should be something like 0->10, 1->11, ..., 9->19 */
assert (hb_map_get (result, 9) == 19);
- hb_map_destroy (result);
-
- /* Like above, but passing hb_set_t instead of hb_set_t * */
- temp1 = 10;
- temp2 = 0;
- result =
- + hb_iter (src)
- | hb_map ([&] (int i) -> hb_set_t
- {
- hb_set_t set;
- for (unsigned int i = 0; i < temp1; ++i)
- hb_set_add (&set, i);
- temp1++;
- return set;
- })
- | hb_reduce ([&] (hb_map_t *acc, hb_set_t value) -> hb_map_t *
- {
- hb_map_set (acc, temp2++, hb_set_get_population (&value));
- return acc;
- }, hb_map_create ())
- ;
- /* The result should be something like 0->10, 1->11, ..., 9->19 */
- assert (hb_map_get (result, 9) == 19);
- hb_map_destroy (result);
unsigned int temp3 = 0;
+ hb_iter(src)
| hb_map([&] (int i) { return ++temp3; })
| hb_reduce([&] (float acc, int value) { return acc + value; }, 0)
;
+ hb_map_destroy (result);
+ hb_iter (src)
| hb_drain
diff --git a/src/test-map.cc b/src/test-map.cc
index da77a2f6c..357a8b01b 100644
--- a/src/test-map.cc
+++ b/src/test-map.cc
@@ -179,43 +179,20 @@ main (int argc, char **argv)
hb_hashmap_t<vector_t, vector_t> m1;
+ m1.set (vector_t (), vector_t ());
m1.set (vector_t (), vector_t {1});
m1.set (vector_t {1}, vector_t {2});
- m1 << hb_pair_t<vector_t, vector_t> {vector_t {2}, vector_t ()};
-
assert (m1.get (vector_t ()) == vector_t {1});
assert (m1.get (vector_t {1}) == vector_t {2});
}
- /* Test moving values */
- {
- using vector_t = hb_vector_t<unsigned>;
-
- hb_hashmap_t<vector_t, vector_t> m1;
- vector_t v {3};
- assert (v.length == 1);
- m1 << hb_pair_t<vector_t, vector_t> {vector_t {3}, v};
- assert (v.length == 1);
- m1 << hb_pair_t<vector_t, vector_t&&> {vector_t {4}, std::move (v)};
- assert (v.length == 0);
- m1 << hb_pair_t<vector_t&&, vector_t> {vector_t {4}, vector_t {5}};
- m1 << hb_pair_t<vector_t&&, vector_t&&> {vector_t {4}, vector_t {5}};
-
- hb_hashmap_t<vector_t, vector_t> m2;
- vector_t v2 {3};
- m2.set (vector_t {4}, v2);
- assert (v2.length == 1);
- m2.set (vector_t {5}, std::move (v2));
- assert (v2.length == 0);
- }
-
/* Test hb::shared_ptr. */
+ hb_hash (hb::shared_ptr<hb_set_t> ());
{
hb_hashmap_t<hb::shared_ptr<hb_set_t>, hb::shared_ptr<hb_set_t>> m;
- m.set (hb::shared_ptr<hb_set_t> (hb_set_get_empty ()),
- hb::shared_ptr<hb_set_t> (hb_set_get_empty ()));
+ m.get (hb::shared_ptr<hb_set_t> ());
m.get (hb::shared_ptr<hb_set_t> (hb_set_get_empty ()));
m.iter ();
m.keys ();
@@ -225,14 +202,12 @@ main (int argc, char **argv)
m.values_ref ();
}
/* Test hb::unique_ptr. */
+ hb_hash (hb::unique_ptr<hb_set_t> ());
{
hb_hashmap_t<hb::unique_ptr<hb_set_t>, hb::unique_ptr<hb_set_t>> m;
- m.set (hb::unique_ptr<hb_set_t> (hb_set_get_empty ()),
- hb::unique_ptr<hb_set_t> (hb_set_get_empty ()));
+ m.get (hb::unique_ptr<hb_set_t> ());
m.get (hb::unique_ptr<hb_set_t> (hb_set_get_empty ()));
- hb::unique_ptr<hb_set_t> *v;
- m.has (hb::unique_ptr<hb_set_t> (hb_set_get_empty ()), &v);
m.iter_ref ();
m.keys_ref ();
m.values_ref ();
@@ -259,48 +234,11 @@ main (int argc, char **argv)
hb::shared_ptr<hb_map_t> p1 {m1};
hb::shared_ptr<hb_map_t> p2 {m2};
m.set (p1,1);
-
+
assert (m.has (p2));
m1->set (2,4);
assert (!m.has (p2));
}
- /* Test value type with hb_bytes_t. */
- {
- hb_hashmap_t<int, hb_bytes_t> m;
- char c_str[] = "Test";
- hb_bytes_t bytes (c_str);
-
- m.set (1, bytes);
- assert (m.has (1));
- }
- /* Test operators. */
- {
- hb_map_t m1, m2, m3;
- m1.set (1, 2);
- m1.set (2, 4);
- m2.set (1, 2);
- m2.set (2, 4);
- m3.set (1, 3);
- m3.set (3, 5);
-
- assert (m1 == m2);
- assert (m1 != m3);
- assert (!(m2 == m3));
-
- m2 = m3;
- assert (m2.has (1));
- assert (!m2.has (2));
- assert (m2.has (3));
-
- assert (m3.has (3));
- }
- /* Test reset. */
- {
- hb_hashmap_t<int, hb_set_t> m;
- m.set (1, hb_set_t {1, 2, 3});
- m.reset ();
- }
-
return 0;
}
diff --git a/src/test-multimap.cc b/src/test-multimap.cc
deleted file mode 100644
index 8cd8f5285..000000000
--- a/src/test-multimap.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright © 2022 Behdad Esfahbod
- *
- * 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.
- */
-
-#include "hb.hh"
-#include "hb-multimap.hh"
-
-int
-main (int argc, char **argv)
-{
- hb_multimap_t m;
-
- assert (m.get (10).length == 0);
-
- m.add (10, 11);
- assert (m.get (10).length == 1);
-
- m.add (10, 12);
- assert (m.get (10).length == 2);
-
- m.add (10, 13);
- assert (m.get (10).length == 3);
- assert (m.get (10)[0] == 11);
- assert (m.get (10)[1] == 12);
- assert (m.get (10)[2] == 13);
-
- assert (m.get (11).length == 0);
- m.add (11, 14);
- assert (m.get (10).length == 3);
- assert (m.get (11).length == 1);
- assert (m.get (12).length == 0);
- assert (m.get (10)[0] == 11);
- assert (m.get (10)[1] == 12);
- assert (m.get (10)[2] == 13);
- assert (m.get (11)[0] == 14);
- assert (m.get (12)[0] == 0); // Array fallback value
-
- return 0;
-}
diff --git a/src/test-repacker.cc b/src/test-repacker.cc
index 94ff0849a..cd8789f1b 100644
--- a/src/test-repacker.cc
+++ b/src/test-repacker.cc
@@ -35,7 +35,7 @@ static void extend (const char* value,
hb_serialize_context_t* c)
{
char* obj = c->allocate_size<char> (len);
- hb_memcpy (obj, value, len);
+ memcpy (obj, value, len);
}
static void start_object(const char* tag,
@@ -1476,7 +1476,6 @@ static void test_sort_shortest ()
graph_t graph (c.object_graph ());
graph.sort_shortest_distance ();
- assert (!graph.in_error ());
assert(strncmp (graph.object (4).head, "abc", 3) == 0);
assert(graph.object (4).real_links.length == 3);
diff --git a/src/test-set.cc b/src/test-set.cc
index e760c98f8..983a15910 100644
--- a/src/test-set.cc
+++ b/src/test-set.cc
@@ -34,7 +34,6 @@ main (int argc, char **argv)
hb_set_t v1 {1, 2};
hb_set_t v2 {v1};
assert (v1.get_population () == 2);
- assert (hb_len (hb_iter (v1)) == 2);
assert (v2.get_population () == 2);
}
@@ -52,7 +51,6 @@ main (int argc, char **argv)
hb_set_t s {1, 2};
hb_set_t v (std::move (s));
assert (s.get_population () == 0);
- assert (hb_len (hb_iter (s)) == 0);
assert (v.get_population () == 2);
}
@@ -88,14 +86,11 @@ main (int argc, char **argv)
hb_set_t s;
s.add (18);
- s << 12;
-
- /* Sink a range. */
- s << hb_pair_t<hb_codepoint_t, hb_codepoint_t> {1, 3};
+ s.add (12);
hb_set_t v (hb_iter (s));
- assert (v.get_population () == 5);
+ assert (v.get_population () == 2);
}
/* Test initializing from initializer list and swapping. */
diff --git a/src/test-vector.cc b/src/test-vector.cc
index 65e51c657..37bec309d 100644
--- a/src/test-vector.cc
+++ b/src/test-vector.cc
@@ -26,14 +26,12 @@
#include "hb.hh"
#include "hb-vector.hh"
#include "hb-set.hh"
-#include "hb-map.hh"
#include <string>
int
main (int argc, char **argv)
{
- assert (sizeof (hb_vector_t<int>) == sizeof (hb_sorted_vector_t<int>));
/* Test copy constructor. */
{
@@ -162,24 +160,7 @@ main (int argc, char **argv)
v2 = v;
- v2.remove_ordered (50);
- v2.remove_unordered (50);
- }
-
- {
- hb_vector_t<hb_set_t> v;
- hb_set_t s {1, 5, 7};
- v.push (s);
- v << s;
- assert (s.get_population () == 3);
- v << std::move (s);
- assert (s.get_population () == 0);
- }
-
- {
- hb_vector_t<hb_map_t> v;
- hb_map_t m;
- v.push (m);
+ v2.remove (50);
}
return 0;
diff --git a/subprojects/freetype2.wrap b/subprojects/freetype2.wrap
index 1ff89ecd1..43ab8fa47 100644
--- a/subprojects/freetype2.wrap
+++ b/subprojects/freetype2.wrap
@@ -1,9 +1,7 @@
-[wrap-file]
-directory = freetype-2.12.1
-source_url = https://download.savannah.gnu.org/releases/freetype/freetype-2.12.1.tar.xz
-source_filename = freetype-2.12.1.tar.xz
-source_hash = 4766f20157cc4cf0cd292f80bf917f92d1c439b243ac3018debf6b9140c41a7f
-wrapdb_version = 2.12.1-2
+[wrap-git]
+directory=freetype
+url=https://gitlab.freedesktop.org/freetype/freetype.git
+revision=VER-2-11-0
[provide]
freetype2 = freetype_dep
diff --git a/subprojects/glib.wrap b/subprojects/glib.wrap
index a865af423..914309076 100644
--- a/subprojects/glib.wrap
+++ b/subprojects/glib.wrap
@@ -1,11 +1,10 @@
-[wrap-file]
-directory = glib-2.74.1
-source_url = https://download.gnome.org/sources/glib/2.74/glib-2.74.1.tar.xz
-source_fallback_url = https://ftp.acc.umu.se/pub/gnome/sources/glib/2.74/glib-2.74.1.tar.xz
-source_filename = glib-2.74.1.tar.xz
-source_hash = 0ab981618d1db47845e56417b0d7c123f81a3427b2b9c93f5a46ff5bbb964964
-wrapdb_version = 2.74.1-1
+[wrap-git]
+directory=glib
+url=https://gitlab.gnome.org/GNOME/glib.git
+depth=1
+push-url=git@gitlab.gnome.org:GNOME/glib.git
+revision=2.58.1
[provide]
-dependency_names = gthread-2.0, gobject-2.0, gmodule-no-export-2.0, gmodule-export-2.0, gmodule-2.0, glib-2.0, gio-2.0, gio-windows-2.0, gio-unix-2.0
-program_names = glib-genmarshal, glib-mkenums, glib-compile-schemas, glib-compile-resources, gio-querymodules, gdbus-codegen
+glib-2.0 = libglib_dep
+gobject-2.0 = libgobject_dep
diff --git a/subprojects/google-benchmark.wrap b/subprojects/google-benchmark.wrap
index 6205cd7f7..268ddf929 100644
--- a/subprojects/google-benchmark.wrap
+++ b/subprojects/google-benchmark.wrap
@@ -1,12 +1,11 @@
[wrap-file]
-directory = benchmark-1.7.1
-source_url = https://github.com/google/benchmark/archive/refs/tags/v1.7.1.tar.gz
-source_filename = benchmark-1.7.1.tar.gz
-source_hash = 6430e4092653380d9dc4ccb45a1e2dc9259d581f4866dc0759713126056bc1d7
-patch_filename = google-benchmark_1.7.1-1_patch.zip
-patch_url = https://wrapdb.mesonbuild.com/v2/google-benchmark_1.7.1-1/get_patch
-patch_hash = 9c6694328ac971cd781aa67c45c64291c087f118e23b75946f52670caacf49b7
-wrapdb_version = 1.7.1-1
+directory = benchmark-1.6.0
+source_url = https://github.com/google/benchmark/archive/refs/tags/v1.6.0.tar.gz
+source_filename = benchmark-1.6.0.tar.gz
+source_hash = 1f71c72ce08d2c1310011ea6436b31e39ccab8c2db94186d26657d41747c85d6
+patch_filename = google-benchmark_1.6.0-1_patch.zip
+patch_url = https://wrapdb.mesonbuild.com/v2/google-benchmark_1.6.0-1/get_patch
+patch_hash = f2feff0641a5ebf6b893a4f49ea0bff566ba866ee993c5c3aef62ff40cdc6b14
[provide]
benchmark = google_benchmark_dep
diff --git a/subprojects/zlib.wrap b/subprojects/zlib.wrap
deleted file mode 100644
index 23af071a2..000000000
--- a/subprojects/zlib.wrap
+++ /dev/null
@@ -1,12 +0,0 @@
-[wrap-file]
-directory = zlib-1.2.13
-source_url = http://zlib.net/fossils/zlib-1.2.13.tar.gz
-source_filename = zlib-1.2.13.tar.gz
-source_hash = b3a24de97a8fdbc835b9833169501030b8977031bcb54b3b3ac13740f846ab30
-patch_filename = zlib_1.2.13-2_patch.zip
-patch_url = https://wrapdb.mesonbuild.com/v2/zlib_1.2.13-2/get_patch
-patch_hash = a7abea3ad65dc2c291ad5fbbf5355d0585a7f7b8c935d4a74335b8fe18684506
-wrapdb_version = 1.2.13-2
-
-[provide]
-zlib = zlib_dep
diff --git a/test/api/fonts/nameID.override.expected.ttf b/test/api/fonts/nameID.override.expected.ttf
deleted file mode 100644
index d17ea83cd..000000000
--- a/test/api/fonts/nameID.override.expected.ttf
+++ /dev/null
Binary files differ
diff --git a/test/api/test-subset-nameids.c b/test/api/test-subset-nameids.c
index e51b470ab..b58a86c91 100644
--- a/test/api/test-subset-nameids.c
+++ b/test/api/test-subset-nameids.c
@@ -67,44 +67,6 @@ test_subset_nameids_with_dup_strs (void)
hb_face_destroy (face_expected);
}
-#ifdef HB_EXPERIMENTAL_API
-static void
-test_subset_name_overrides (void)
-{
- hb_face_t *face_origin = hb_test_open_font_file ("fonts/nameID.origin.ttf");
- hb_face_t *face_expected = hb_test_open_font_file ("fonts/nameID.override.expected.ttf");
-
- char str1[] = "Roboto Test";
- char str1_3[] = "Roboto Test unicode platform";
- char str2[] = "Bold";
- char str6[] = "Roboto-Bold";
- char str12[] = "Non ascii test Ü";
- char str16[] = "Roboto-test-inserting";
-
- hb_set_t *name_ids = hb_set_create();
- hb_face_t *face_subset;
- hb_set_add_range (name_ids, 0, 15);
-
- hb_subset_input_t *subset_input = hb_subset_test_create_input_from_nameids (name_ids);
- hb_subset_input_override_name_table (subset_input, 1, 1, 0, 0, str1, -1);
- hb_subset_input_override_name_table (subset_input, 1, 3, 1, 0x409, str1_3, -1);
- hb_subset_input_override_name_table (subset_input, 2, 1, 0, 0, str2, 4);
- hb_subset_input_override_name_table (subset_input, 6, 1, 0, 0, str6, -1);
- hb_subset_input_override_name_table (subset_input, 12, 1, 0, 0, str12, -1);
- hb_subset_input_override_name_table (subset_input, 14, 1, 0, 0, NULL, -1);
- hb_subset_input_override_name_table (subset_input, 16, 1, 0, 0, str16, -1);
-
- face_subset = hb_subset_test_create_subset (face_origin, subset_input);
- hb_set_destroy (name_ids);
-
- hb_subset_test_check (face_expected, face_subset, HB_TAG ('n','a','m','e'));
-
- hb_face_destroy (face_subset);
- hb_face_destroy (face_origin);
- hb_face_destroy (face_expected);
-}
-#endif
-
int
main (int argc, char **argv)
{
@@ -112,9 +74,6 @@ main (int argc, char **argv)
hb_test_add (test_subset_nameids);
hb_test_add (test_subset_nameids_with_dup_strs);
-#ifdef HB_EXPERIMENTAL_API
- hb_test_add (test_subset_name_overrides);
-#endif
return hb_test_run();
}
diff --git a/test/api/test-unicode.c b/test/api/test-unicode.c
index 857308b33..4ec718b8f 100644
--- a/test/api/test-unicode.c
+++ b/test/api/test-unicode.c
@@ -754,9 +754,9 @@ test_unicode_setters (void)
/* Since uf is immutable now, the following setter should do nothing. */
p->func_setter (uf, (get_func_t) a_is_for_arabic_get_script, &data[1], free_up);
- g_assert (data[0].freed && data[1].freed);
+ g_assert (data[0].freed && !data[1].freed);
hb_unicode_funcs_destroy (uf);
- g_assert (data[0].freed && data[1].freed);
+ g_assert (data[0].freed && !data[1].freed);
}
}
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-6635625931735040 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-6635625931735040
deleted file mode 100644
index 333ebaa0a..000000000
--- a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-shape-fuzzer-6635625931735040
+++ /dev/null
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5845846876356608 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5845846876356608
deleted file mode 100644
index faf2e8577..000000000
--- a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5845846876356608
+++ /dev/null
Binary files differ
diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6164014466203648 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6164014466203648
deleted file mode 100644
index 3a15ab230..000000000
--- a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6164014466203648
+++ /dev/null
Binary files differ
diff --git a/test/fuzzing/graphs/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-5390364397928448 b/test/fuzzing/graphs/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-5390364397928448
deleted file mode 100644
index 54ee81658..000000000
--- a/test/fuzzing/graphs/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-5390364397928448
+++ /dev/null
Binary files differ
diff --git a/test/fuzzing/graphs/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-6014493291577344 b/test/fuzzing/graphs/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-6014493291577344
deleted file mode 100644
index a29d1e2fb..000000000
--- a/test/fuzzing/graphs/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-6014493291577344
+++ /dev/null
Binary files differ
diff --git a/test/fuzzing/graphs/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-6714085985353728 b/test/fuzzing/graphs/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-6714085985353728
deleted file mode 100644
index aeee90b6c..000000000
--- a/test/fuzzing/graphs/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-6714085985353728
+++ /dev/null
Binary files differ
diff --git a/test/fuzzing/graphs/crash-3bf72494aa4c9f8cbbcbf887fdc2a2858c87feb4 b/test/fuzzing/graphs/crash-3bf72494aa4c9f8cbbcbf887fdc2a2858c87feb4
deleted file mode 100644
index ff8da7b29..000000000
--- a/test/fuzzing/graphs/crash-3bf72494aa4c9f8cbbcbf887fdc2a2858c87feb4
+++ /dev/null
Binary files differ
diff --git a/test/fuzzing/graphs/crash-442bfac994a3d9929cf06262ae9fb00f6ee1f774 b/test/fuzzing/graphs/crash-442bfac994a3d9929cf06262ae9fb00f6ee1f774
deleted file mode 100644
index 0160ce59b..000000000
--- a/test/fuzzing/graphs/crash-442bfac994a3d9929cf06262ae9fb00f6ee1f774
+++ /dev/null
Binary files differ
diff --git a/test/fuzzing/graphs/leak-a77f29b25edb873729f3ab120148fdb213cfa527 b/test/fuzzing/graphs/leak-a77f29b25edb873729f3ab120148fdb213cfa527
deleted file mode 100644
index 58b4075ad..000000000
--- a/test/fuzzing/graphs/leak-a77f29b25edb873729f3ab120148fdb213cfa527
+++ /dev/null
Binary files differ
diff --git a/test/fuzzing/graphs/noto_nastaliq_urdu b/test/fuzzing/graphs/noto_nastaliq_urdu
deleted file mode 100644
index 2e3cab886..000000000
--- a/test/fuzzing/graphs/noto_nastaliq_urdu
+++ /dev/null
Binary files differ
diff --git a/test/fuzzing/hb-repacker-fuzzer.cc b/test/fuzzing/hb-repacker-fuzzer.cc
deleted file mode 100644
index 0b06fd2af..000000000
--- a/test/fuzzing/hb-repacker-fuzzer.cc
+++ /dev/null
@@ -1,145 +0,0 @@
-#include "hb-fuzzer.hh"
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <assert.h>
-
-#include "hb-subset-repacker.h"
-
-typedef struct
-{
- uint16_t parent;
- uint16_t child;
- uint16_t position;
- uint8_t width;
-} link_t;
-
-/* The fuzzer seed contains a serialized representation of a object graph which forms
- * the input graph to the repacker call. The binary format is:
- *
- * table tag: 4 bytes
- * number of objects: 2 bytes
- * objects[number of objects]:
- * blob size: 2 bytes
- * blob: blob size bytes
- * num of real links: 2 bytes
- * links[number of real links]: link_t struct
- *
- * TODO(garretrieger): add optional virtual links
- */
-
-template <typename T>
-bool read(const uint8_t** data, size_t* size, T* out)
-{
- if (*size < sizeof (T)) return false;
-
- memcpy(out, *data, sizeof (T));
-
- *data += sizeof (T);
- *size -= sizeof (T);
-
- return true;
-}
-
-void cleanup (hb_object_t* objects, uint16_t num_objects)
-{
- for (uint32_t i = 0; i < num_objects; i++)
- {
- free (objects[i].head);
- free (objects[i].real_links);
- }
-}
-
-void add_links_to_objects (hb_object_t* objects, uint16_t num_objects,
- link_t* links, uint16_t num_links)
-{
- unsigned* link_count = (unsigned*) calloc (num_objects, sizeof (unsigned));
-
- for (uint32_t i = 0; i < num_links; i++)
- {
- uint16_t parent_idx = links[i].parent;
- link_count[parent_idx]++;
- }
-
- for (uint32_t i = 0; i < num_objects; i++)
- {
- objects[i].num_real_links = link_count[i];
- objects[i].real_links = (hb_link_t*) calloc (link_count[i], sizeof (hb_link_t));
- objects[i].num_virtual_links = 0;
- objects[i].virtual_links = nullptr;
- }
-
- for (uint32_t i = 0; i < num_links; i++)
- {
- uint16_t parent_idx = links[i].parent;
- uint16_t child_idx = links[i].child + 1; // All indices are shifted by 1 by the null object.
- hb_link_t* link = &(objects[parent_idx].real_links[link_count[parent_idx] - 1]);
-
- link->width = links[i].width;
- link->position = links[i].position;
- link->objidx = child_idx;
- link_count[parent_idx]--;
- }
-
- free (link_count);
-}
-
-extern "C" int LLVMFuzzerTestOneInput (const uint8_t *data, size_t size)
-{
- // TODO(garretrieger): move graph validity checks into repacker graph creation.
- alloc_state = _fuzzing_alloc_state (data, size);
-
- uint16_t num_objects = 0;
- hb_object_t* objects = nullptr;
-
- uint16_t num_real_links = 0;
- link_t* links = nullptr;
-
- hb_tag_t table_tag;
- if (!read<hb_tag_t> (&data, &size, &table_tag)) goto end;
- if (!read<uint16_t> (&data, &size, &num_objects)) goto end;
-
- objects = (hb_object_t*) calloc (num_objects, sizeof (hb_object_t));
- for (uint32_t i = 0; i < num_objects; i++)
- {
- uint16_t blob_size;
- if (!read<uint16_t> (&data, &size, &blob_size)) goto end;
- if (size < blob_size) goto end;
-
- char* copy = (char*) calloc (1, blob_size);
- memcpy (copy, data, blob_size);
- objects[i].head = (char*) copy;
- objects[i].tail = (char*) (copy + blob_size);
-
- size -= blob_size;
- data += blob_size;
- }
-
- if (!read<uint16_t> (&data, &size, &num_real_links)) goto end;
- links = (link_t*) calloc (num_real_links, sizeof (link_t));
- for (uint32_t i = 0; i < num_real_links; i++)
- {
- if (!read<link_t> (&data, &size, &links[i])) goto end;
-
- if (links[i].parent >= num_objects)
- goto end;
- }
-
- add_links_to_objects (objects, num_objects,
- links, num_real_links);
-
- hb_blob_destroy (hb_subset_repack_or_fail (table_tag,
- objects,
- num_objects));
-
-end:
- if (objects)
- {
- cleanup (objects, num_objects);
- free (objects);
- }
- free (links);
-
- return 0;
-}
diff --git a/test/fuzzing/meson.build b/test/fuzzing/meson.build
index d38ca8f9f..3aba9eb67 100644
--- a/test/fuzzing/meson.build
+++ b/test/fuzzing/meson.build
@@ -5,10 +5,6 @@ tests = [
'hb-draw-fuzzer.cc',
]
-if get_option('experimental_api')
- tests += 'hb-repacker-fuzzer.cc'
-endif
-
foreach file_name : tests
test_name = file_name.split('.')[0]
@@ -23,10 +19,6 @@ foreach file_name : tests
extra_cpp_args += '-DHB_IS_IN_FUZZER'
endif
- if get_option('experimental_api')
- extra_cpp_args += '-DHB_EXPERIMENTAL_API'
- endif
-
exe = executable(test_name, sources,
cpp_args: cpp_args + extra_cpp_args,
include_directories: [incconfig, incsrc],
@@ -63,20 +55,6 @@ test('subset_fuzzer', find_program('run-subset-fuzzer-tests.py'),
suite: ['fuzzing', 'slow'],
)
-if get_option('experimental_api')
- test('repacker_fuzzer', find_program('run-repacker-fuzzer-tests.py'),
- args: [
- hb_repacker_fuzzer_exe,
- ],
- # as the tests are ran concurrently let's raise acceptable time here
- # ideally better to break and let meson handles them in parallel
- timeout: 300,
- workdir: meson.current_build_dir() / '..' / '..',
- env: env,
- suite: ['fuzzing', 'slow'],
- )
-endif
-
test('draw_fuzzer', find_program('run-draw-fuzzer-tests.py'),
args: [
hb_draw_fuzzer_exe,
diff --git a/test/fuzzing/run-repacker-fuzzer-tests.py b/test/fuzzing/run-repacker-fuzzer-tests.py
deleted file mode 100644
index 85a23e13e..000000000
--- a/test/fuzzing/run-repacker-fuzzer-tests.py
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/usr/bin/env python3
-
-import sys, os, subprocess, tempfile, shutil
-
-
-def cmd (command):
- # https://stackoverflow.com/a/4408409 as we might have huge output sometimes
- with tempfile.TemporaryFile () as tempf:
- p = subprocess.Popen (command, stderr=tempf)
-
- try:
- p.wait ()
- tempf.seek (0)
- text = tempf.read ()
-
- #TODO: Detect debug mode with a better way
- is_debug_mode = b"SANITIZE" in text
-
- return ("" if is_debug_mode else text.decode ("utf-8").strip ()), p.returncode
- except subprocess.TimeoutExpired:
- return 'error: timeout, ' + ' '.join (command), 1
-
-
-srcdir = os.getenv ("srcdir", ".")
-EXEEXT = os.getenv ("EXEEXT", "")
-top_builddir = os.getenv ("top_builddir", ".")
-hb_repacker_fuzzer = os.path.join (top_builddir, "hb-repacker-fuzzer" + EXEEXT)
-
-if not os.path.exists (hb_repacker_fuzzer):
- if len (sys.argv) < 2 or not os.path.exists (sys.argv[1]):
- sys.exit ("""Failed to find hb-repacker-fuzzer binary automatically,
-please provide it as the first argument to the tool""")
-
- hb_repacker_fuzzer = sys.argv[1]
-
-print ('hb_repacker_fuzzer:', hb_repacker_fuzzer)
-fails = 0
-
-valgrind = None
-if os.getenv ('RUN_VALGRIND', ''):
- valgrind = shutil.which ('valgrind')
- if valgrind is None:
- sys.exit ("""Valgrind requested but not found.""")
-
-def run_dir (parent_path):
- global fails
- for file in os.listdir (parent_path):
- path = os.path.join(parent_path, file)
- print ("running repacker fuzzer against %s" % path)
- if valgrind:
- text, returncode = cmd ([valgrind, '--leak-check=full', '--error-exitcode=1', hb_repacker_fuzzer, path])
- else:
- text, returncode = cmd ([hb_repacker_fuzzer, path])
- if 'error' in text:
- returncode = 1
-
- if (not valgrind or returncode) and text.strip ():
- print (text)
-
- if returncode != 0:
- print ("failed for %s" % path)
- fails = fails + 1
-
-
-run_dir (os.path.join (srcdir, "graphs"))
-
-if fails:
- sys.exit ("%d repacker fuzzer related tests failed." % fails)
diff --git a/test/shape/data/in-house/fonts/5f73fff1ffc07b5a99a90c0909609f2b09fef274.ttf b/test/shape/data/in-house/fonts/5f73fff1ffc07b5a99a90c0909609f2b09fef274.ttf
deleted file mode 100644
index f94d2aa84..000000000
--- a/test/shape/data/in-house/fonts/5f73fff1ffc07b5a99a90c0909609f2b09fef274.ttf
+++ /dev/null
Binary files differ
diff --git a/test/shape/data/in-house/fonts/9d8c53cb64b8747abdd2b70755cce2ee0eb42ef7.ttf b/test/shape/data/in-house/fonts/9d8c53cb64b8747abdd2b70755cce2ee0eb42ef7.ttf
deleted file mode 100644
index 9c9f9426a..000000000
--- a/test/shape/data/in-house/fonts/9d8c53cb64b8747abdd2b70755cce2ee0eb42ef7.ttf
+++ /dev/null
Binary files differ
diff --git a/test/shape/data/in-house/fonts/a232bb734d4c6c898a44506547d19768f0eba6a6.ttf b/test/shape/data/in-house/fonts/a232bb734d4c6c898a44506547d19768f0eba6a6.ttf
deleted file mode 100644
index e0325bb0c..000000000
--- a/test/shape/data/in-house/fonts/a232bb734d4c6c898a44506547d19768f0eba6a6.ttf
+++ /dev/null
Binary files differ
diff --git a/test/shape/data/in-house/tests/indic-special-cases.tests b/test/shape/data/in-house/tests/indic-special-cases.tests
index d563dec11..016f8947f 100644
--- a/test/shape/data/in-house/tests/indic-special-cases.tests
+++ b/test/shape/data/in-house/tests/indic-special-cases.tests
@@ -2,7 +2,3 @@
../fonts/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf;;U+0CB0,U+200D,U+0CCD,U+0C95;[gid2=0+1334|gid6=0+358]
../fonts/3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf;;U+0CB0,U+0CCD,U+200D,U+0C95;[gid2=0+1334|gid6=0+358]
../fonts/e716f6bd00a108d186b7e9f47b4515565f784f36.ttf;;U+0C1A,U+0C3F,U+0C32,U+0C4D,U+0C15,U+0C42,U+0C30,U+0C4D;[civoweltelu=0+766|latelu=2+709|uuvowelsigntelu=2+661|kasubscripttelu=2+483|rahalanttelu=6+593]
-../fonts/9d8c53cb64b8747abdd2b70755cce2ee0eb42ef7.ttf;;U+0915,U+093F,U+094E,U+093C;[uni094E=0+273|uni093C=0+0|ivowelsign03deva=0+259|uni0915=0+762]
-../fonts/9d8c53cb64b8747abdd2b70755cce2ee0eb42ef7.ttf;;U+0915,U+093F,U+093C,U+094E;[uni094E=0+273|ivowelsign00deva=0+259|uni093C=0+0|uni0915=0+762]
-../fonts/5f73fff1ffc07b5a99a90c0909609f2b09fef274.ttf;;U+0A15,U+0A40,U+0A02;[uni0A15=0+505|uni0A40=0+427|uni0A02=0+0]
-../fonts/5f73fff1ffc07b5a99a90c0909609f2b09fef274.ttf;;U+0A15,U+0A02,U+0A40;[uni0A15=0+505|uni0A02=0+0|uni0A40=0+427]
diff --git a/test/shape/data/in-house/tests/myanmar-misc.tests b/test/shape/data/in-house/tests/myanmar-misc.tests
index 8ba0be472..527386394 100644
--- a/test/shape/data/in-house/tests/myanmar-misc.tests
+++ b/test/shape/data/in-house/tests/myanmar-misc.tests
@@ -1,2 +1 @@
../fonts/065b01e54f35f0d849fd43bd5b936212739a50cb.ttf;;U+101A,U+1035;[ya_e_above=0+1000]
-../fonts/a232bb734d4c6c898a44506547d19768f0eba6a6.ttf;;U+1000,U+1031,U+1084;[e_shn=0+592|_e=0+618|ka=0+1124]
diff --git a/test/subset/data/Makefile.am b/test/subset/data/Makefile.am
index e6d2325ee..8ee692359 100644
--- a/test/subset/data/Makefile.am
+++ b/test/subset/data/Makefile.am
@@ -7,7 +7,6 @@ SUBDIRS = repack_tests
EXTRA_DIST += \
$(TESTS) \
- $(DISABLED_TESTS) \
expected/32bit_var_store \
expected/basics \
expected/full-font \
@@ -56,10 +55,6 @@ EXTRA_DIST += \
expected/math \
expected/math_coverage_offset \
expected/post \
- expected/full_instance \
- expected/instance_feature_variations \
- expected/instantiate_glyf \
- expected/pin_all_at_default \
fonts \
profiles \
$(NULL)
diff --git a/test/subset/data/Makefile.sources b/test/subset/data/Makefile.sources
index 845a77e73..798db64f2 100644
--- a/test/subset/data/Makefile.sources
+++ b/test/subset/data/Makefile.sources
@@ -47,10 +47,6 @@ TESTS = \
tests/math.tests \
tests/math_coverage_offset.tests \
tests/post.tests \
- tests/full_instance.tests \
- tests/instance_feature_variations.tests \
- tests/instantiate_glyf.tests \
- tests/pin_all_at_default.tests \
$(NULL)
# TODO: re-enable once colrv1 subsetting is stabilized.
@@ -61,6 +57,5 @@ TESTS = \
XFAIL_TESTS = \
$(NULL)
-# Disabled because instancing is only available w/ experimental API on.
DISABLED_TESTS = \
$(NULL)
diff --git a/test/subset/data/expected/full_instance/Roboto-Variable.no-prune-unicode-ranges.retain-all-codepoint.wght=150,wdth=80.ttf b/test/subset/data/expected/full_instance/Roboto-Variable.no-prune-unicode-ranges.retain-all-codepoint.wght=150,wdth=80.ttf
deleted file mode 100644
index ca2aeeff6..000000000
--- a/test/subset/data/expected/full_instance/Roboto-Variable.no-prune-unicode-ranges.retain-all-codepoint.wght=150,wdth=80.ttf
+++ /dev/null
Binary files differ
diff --git a/test/subset/data/expected/full_instance/Roboto-Variable.no-prune-unicode-ranges.retain-all-codepoint.wght=300,wdth=90.ttf b/test/subset/data/expected/full_instance/Roboto-Variable.no-prune-unicode-ranges.retain-all-codepoint.wght=300,wdth=90.ttf
deleted file mode 100644
index 04be94efe..000000000
--- a/test/subset/data/expected/full_instance/Roboto-Variable.no-prune-unicode-ranges.retain-all-codepoint.wght=300,wdth=90.ttf
+++ /dev/null
Binary files differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf
index 5ae5d5b20..70dd0fdc6 100644
--- a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf
+++ b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41,42,43.otf
Binary files differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41,42.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41,42.otf
index cfe6648e2..f9349f6f3 100644
--- a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41,42.otf
+++ b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.41,42.otf
Binary files differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf
index 0e98d1a93..07e6ad538 100644
--- a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf
+++ b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test-retain-gids.retain-all-codepoint.otf
Binary files differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41,42,43.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41,42,43.otf
index 6530ab6ec..070f9ec0d 100644
--- a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41,42,43.otf
+++ b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41,42,43.otf
Binary files differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41,42.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41,42.otf
index cac1abba3..60fd45c69 100644
--- a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41,42.otf
+++ b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.41,42.otf
Binary files differ
diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.retain-all-codepoint.otf
index 0e98d1a93..07e6ad538 100644
--- a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.retain-all-codepoint.otf
+++ b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.layout-test.retain-all-codepoint.otf
Binary files differ
diff --git a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.retain-all-codepoint.ttf b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.retain-all-codepoint.ttf
index c64ef972a..ab0c1d1c6 100644
--- a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.retain-all-codepoint.ttf
+++ b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.default.retain-all-codepoint.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.retain-all-codepoint.ttf b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.retain-all-codepoint.ttf
index b4a267702..2306381ea 100644
--- a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.retain-all-codepoint.ttf
+++ b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.drop-hints.retain-all-codepoint.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.retain-all-codepoint.ttf b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.retain-all-codepoint.ttf
index c64ef972a..ab0c1d1c6 100644
--- a/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.retain-all-codepoint.ttf
+++ b/test/subset/data/expected/layout.gdef-attachlist/IndicTestJalandhar-Regular.keep-gdef.retain-all-codepoint.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41,42,43.otf
index f6b78bc97..1d3f3cd70 100644
--- a/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41,42,43.otf
+++ b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41,42,43.otf
Binary files differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41,42.otf b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41,42.otf
index 6f2e7ef13..5a0d0c4aa 100644
--- a/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41,42.otf
+++ b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.41,42.otf
Binary files differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.retain-all-codepoint.otf
index ff0595a94..b3d6ae9e4 100644
--- a/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.retain-all-codepoint.otf
+++ b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test-retain-gids.retain-all-codepoint.otf
Binary files differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41,42,43.otf b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41,42,43.otf
index 808605142..0a693c641 100644
--- a/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41,42,43.otf
+++ b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41,42,43.otf
Binary files differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41,42.otf b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41,42.otf
index 0a26e0fd1..128c1d413 100644
--- a/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41,42.otf
+++ b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.41,42.otf
Binary files differ
diff --git a/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.retain-all-codepoint.otf
index ff0595a94..b3d6ae9e4 100644
--- a/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.retain-all-codepoint.otf
+++ b/test/subset/data/expected/layout.gsub5/gsub_context2_multiple_subrules_f2.layout-test.retain-all-codepoint.otf
Binary files differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.627,644,62D,628.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.627,644,62D,628.ttf
index e402e57bb..cbfad3d56 100644
--- a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.627,644,62D,628.ttf
+++ b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.627,644,62D,628.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.633,6D2.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.633,6D2.ttf
index 5683d04b2..f4938d8b0 100644
--- a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.633,6D2.ttf
+++ b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.633,6D2.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.63A,64A,631.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.63A,64A,631.ttf
index e19feda42..6ac7bcdb0 100644
--- a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.63A,64A,631.ttf
+++ b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.63A,64A,631.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.retain-all-codepoint.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.retain-all-codepoint.ttf
index ea153c9f5..ba99d30f2 100644
--- a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.retain-all-codepoint.ttf
+++ b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.default.retain-all-codepoint.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.627,644,62D,628.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.627,644,62D,628.ttf
index fb9746e01..81ee9e87d 100644
--- a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.627,644,62D,628.ttf
+++ b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.627,644,62D,628.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.633,6D2.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.633,6D2.ttf
index 81319fdc8..3f5367ae3 100644
--- a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.633,6D2.ttf
+++ b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.633,6D2.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.63A,64A,631.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.63A,64A,631.ttf
index b9aa70b85..2610a64a5 100644
--- a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.63A,64A,631.ttf
+++ b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.63A,64A,631.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.retain-all-codepoint.ttf
index 4458d5fbf..e41720cdc 100644
--- a/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.retain-all-codepoint.ttf
+++ b/test/subset/data/expected/layout.notonastaliqurdu/NotoNastaliqUrdu-Regular.retain-gids.retain-all-codepoint.ttf
Binary files differ
diff --git a/test/subset/data/tests/full_instance.tests b/test/subset/data/tests/full_instance.tests
index f99e5ebe9..1b0867387 100644
--- a/test/subset/data/tests/full_instance.tests
+++ b/test/subset/data/tests/full_instance.tests
@@ -3,7 +3,6 @@ Roboto-Variable.ttf
PROFILES:
default.txt
-no-prune-unicode-ranges.txt
SUBSETS:
*
diff --git a/test/subset/generate-expected-outputs.py b/test/subset/generate-expected-outputs.py
index 2b7a87f29..48b2f913c 100755
--- a/test/subset/generate-expected-outputs.py
+++ b/test/subset/generate-expected-outputs.py
@@ -45,7 +45,6 @@ def generate_expected_output(input_file, unicodes, profile_flags, instance_flags
args = ["fonttools", "subset", input_path]
args.extend(["--drop-tables+=DSIG",
"--drop-tables-=sbix",
- "--no-harfbuzz-repacker", # disable harfbuzz repacker so we aren't comparing to ourself.
"--unicodes=%s" % unicodes,
"--output-file=%s" % fonttools_path])
args.extend(profile_flags)
diff --git a/test/subset/meson.build b/test/subset/meson.build
index 77a2029d7..319d8bb21 100644
--- a/test/subset/meson.build
+++ b/test/subset/meson.build
@@ -40,8 +40,8 @@ tests = [
'colr_glyphs',
'math',
'math_coverage_offset',
- # TODO: re-enable once colrv1 subsetting is stabilized.
- # 'colrv1.notoemoji',
+# TODO: re-enable once colrv1 subsetting is stabilized.
+# 'colrv1.notoemoji',
'colrv1',
'colr_with_components',
'cbdt',
@@ -49,10 +49,11 @@ tests = [
'glyph_names',
'post',
'32bit_var_store',
- 'pin_all_at_default',
- 'instantiate_glyf',
- 'full_instance',
- 'instance_feature_variations',
+# instacing tests, enable when --instance is not experimental
+# 'pin_all_at_default',
+# 'instantiate_glyf',
+# 'full_instance',
+# 'instance_feature_variations',
]
repack_tests = [
@@ -64,6 +65,7 @@ repack_tests = [
'space_splitting',
]
+
run_test = find_program('run-tests.py')
foreach t : tests
diff --git a/test/subset/run-tests.py b/test/subset/run-tests.py
index db3c042a1..6a2146dbe 100755
--- a/test/subset/run-tests.py
+++ b/test/subset/run-tests.py
@@ -47,16 +47,14 @@ def fail_test (test, cli_args, message):
print (' expected_file %s' % os.path.abspath (expected_file))
return 1
-def run_test (test, should_check_ots, preprocess):
+def run_test (test, should_check_ots):
out_file = os.path.join (tempfile.mkdtemp (), test.get_font_name () + '-subset' + test.get_font_extension ())
cli_args = ["--font-file=" + test.font_path,
"--output-file=" + out_file,
"--unicodes=%s" % test.unicodes (),
+ "--preprocess-face",
"--drop-tables+=DSIG",
"--drop-tables-=sbix"]
- if preprocess:
- cli_args.extend(["--preprocess-face",])
-
cli_args.extend (test.get_profile_flags ())
if test.get_instance_flags ():
cli_args.extend (["--instance=%s" % ','.join(test.get_instance_flags ())])
@@ -144,10 +142,7 @@ for path in args:
print ("Running tests in " + path)
test_suite = SubsetTestSuite (path, f.read ())
for test in test_suite.tests ():
- # Tests are run with and without preprocessing, results should be the
- # same between them.
- fails += run_test (test, has_ots, False)
- fails += run_test (test, has_ots, True)
+ fails += run_test (test, has_ots)
if fails != 0:
sys.exit ("%d test(s) failed." % fails)
diff --git a/util/hb-subset.cc b/util/hb-subset.cc
index bd4dea2d3..f2606c767 100644
--- a/util/hb-subset.cc
+++ b/util/hb-subset.cc
@@ -34,7 +34,11 @@
static hb_face_t* preprocess_face(hb_face_t* face)
{
+ #ifdef HB_EXPERIMENTAL_API
return hb_subset_preprocess (face);
+ #else
+ return hb_face_reference(face);
+ #endif
}
/*
@@ -116,7 +120,7 @@ struct subset_main_t : option_parser_t, face_options_t, output_options_t<false>
for (unsigned i = 0; i < num_iterations; i++)
{
hb_face_destroy (new_face);
- new_face = hb_subset_or_fail (orig_face, input);
+ new_face = hb_subset_or_fail (face, input);
}
bool success = new_face;
@@ -660,6 +664,7 @@ parse_drop_tables (const char *name,
return true;
}
+#ifdef HB_EXPERIMENTAL_API
#ifndef HB_NO_VAR
static gboolean
parse_instance (const char *name,
@@ -724,6 +729,7 @@ parse_instance (const char *name,
return true;
}
#endif
+#endif
template <GOptionArgFunc line_parser, bool allow_comments=true>
static gboolean
@@ -834,7 +840,7 @@ subset_main_t::add_options ()
GOptionEntry glyphset_entries[] =
{
- {"gids", 'g', 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_gids,
+ {"gids", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_gids,
"Specify glyph IDs or ranges to include in the subset.\n"
" "
"Use --gids-=... to subtract codepoints from the current set.", "list of glyph indices/ranges or *"},
@@ -848,13 +854,13 @@ subset_main_t::add_options ()
{"glyphs-file", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_file_for<parse_glyphs>, "Specify file to read glyph names from", "filename"},
- {"text", 't', 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_text, "Specify text to include in the subset. Use --text-=... to subtract codepoints from the current set.", "string"},
+ {"text", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_text, "Specify text to include in the subset. Use --text-=... to subtract codepoints from the current set.", "string"},
{"text-", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_text, "Specify text to remove from the subset", "string"},
{"text+", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_text, "Specify text to include in the subset", "string"},
{"text-file", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_file_for<parse_text, false>,"Specify file to read text from", "filename"},
- {"unicodes", 'u', 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_unicodes,
+ {"unicodes", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_unicodes,
"Specify Unicode codepoints or ranges to include in the subset. Use * to include all codepoints.\n"
" "
"--unicodes-=... can be used to subtract codepoints from the current set.\n"
@@ -895,6 +901,7 @@ subset_main_t::add_options ()
{"drop-tables", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_drop_tables, "Drop the specified tables. Use --drop-tables-=... to subtract from the current set.", "list of string table tags or *"},
{"drop-tables+", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_drop_tables, "Drop the specified tables.", "list of string table tags or *"},
{"drop-tables-", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_drop_tables, "Drop the specified tables.", "list of string table tags or *"},
+#ifdef HB_EXPERIMENTAL_API
#ifndef HB_NO_VAR
{"instance", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_instance,
"(Partially|Fully) Instantiate a variable font. A location consists of the tag of a variation axis, followed by '=', followed by a\n"
@@ -904,6 +911,7 @@ subset_main_t::add_options ()
"Note: currently only fully instancing to the default location is supported\n",
"list of comma separated axis-locations"},
#endif
+#endif
{nullptr}
};
add_group (other_entries,
diff --git a/util/helper-cairo.hh b/util/helper-cairo.hh
index a8463de4d..6df92e560 100644
--- a/util/helper-cairo.hh
+++ b/util/helper-cairo.hh
@@ -29,9 +29,7 @@
#include "view-options.hh"
#include "output-options.hh"
-#ifdef HAVE_CAIRO_FT
-# include "helper-cairo-ft.hh"
-#endif
+#include "helper-cairo-ft.hh"
#include "helper-cairo-user.hh"
#include <cairo.h>
@@ -73,35 +71,21 @@ helper_cairo_use_hb_draw (const font_options_t *font_opts)
{
const char *env = getenv ("HB_DRAW");
if (!env)
-#if 1
- /* Following branch disabled because we prefer our
- * OpenType extensions working, ie going through hb-draw,
- * over avoiding the obscure cairo bug. */
- return true;
-#else
- /* Older cairo had a bug in rendering COLRv0 fonts in
- * right-to-left direction. */
return cairo_version () >= CAIRO_VERSION_ENCODE (1, 17, 5);
-#endif
-
return atoi (env);
}
static inline cairo_scaled_font_t *
helper_cairo_create_scaled_font (const font_options_t *font_opts)
{
+ bool use_hb_draw = helper_cairo_use_hb_draw (font_opts);
hb_font_t *font = hb_font_reference (font_opts->font);
-#ifdef HAVE_CAIRO_FT
- bool use_hb_draw = helper_cairo_use_hb_draw (font_opts);
cairo_font_face_t *cairo_face;
if (use_hb_draw)
cairo_face = helper_cairo_create_user_font_face (font_opts);
else
cairo_face = helper_cairo_create_ft_font_face (font_opts);
-#else
- cairo_font_face_t *cairo_face = helper_cairo_create_user_font_face (font_opts);
-#endif
cairo_matrix_t ctm, font_matrix;
cairo_font_options_t *font_options;
@@ -110,10 +94,8 @@ helper_cairo_create_scaled_font (const font_options_t *font_opts)
cairo_matrix_init_scale (&font_matrix,
font_opts->font_size_x,
font_opts->font_size_y);
-#ifdef HAVE_CAIRO_FT
- if (!use_hb_draw)
+ if (use_hb_draw)
font_matrix.xy = -font_opts->slant * font_opts->font_size_x;
-#endif
font_options = cairo_font_options_create ();
cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_NONE);
@@ -140,14 +122,10 @@ helper_cairo_create_scaled_font (const font_options_t *font_opts)
static inline bool
helper_cairo_scaled_font_has_color (cairo_scaled_font_t *scaled_font)
{
-#ifdef HAVE_CAIRO_FT
if (helper_cairo_user_font_face_has_data (cairo_scaled_font_get_font_face (scaled_font)))
return helper_cairo_user_scaled_font_has_color (scaled_font);
else
return helper_cairo_ft_scaled_font_has_color (scaled_font);
-#else
- return helper_cairo_user_scaled_font_has_color (scaled_font);
-#endif
}
diff --git a/util/meson.build b/util/meson.build
index 136740554..fdab620fc 100644
--- a/util/meson.build
+++ b/util/meson.build
@@ -17,7 +17,8 @@ hb_subset_cli_sources = [
util_deps = [freetype_dep, cairo_dep, cairo_ft_dep, glib_dep]
if conf.get('HAVE_GLIB', 0) == 1
- if conf.get('HAVE_CAIRO', 0) == 1
+ if conf.get('HAVE_FREETYPE', 0) == 1 and conf.get('HAVE_CAIRO_FT', 0) == 1
+
hb_view = executable('hb-view', hb_view_sources,
cpp_args: cpp_args,
include_directories: [incconfig, incsrc],
diff --git a/util/shape-consumer.hh b/util/shape-consumer.hh
index 8ee4bd697..21151890b 100644
--- a/util/shape-consumer.hh
+++ b/util/shape-consumer.hh
@@ -61,11 +61,11 @@ struct shape_consumer_t : shape_options_t
for (unsigned int n = num_iterations; n; n--)
{
+ const char *error = nullptr;
+
populate_buffer (buffer, text, text_len, app.text_before, app.text_after);
if (n == 1)
output.consume_text (buffer, text, text_len, utf8_clusters);
-
- const char *error = nullptr;
if (!shape (app.font, buffer, &error))
{
failed = true;