From f60caad7ffd796c6dc1cc57f0cecee6fd643d827 Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Wed, 11 Aug 2021 22:54:30 +0200 Subject: [PATCH 1/7] [test] hb_ot_layout_table_get_script_tags() --- test/api/Makefile.am | 1 + test/api/meson.build | 1 + test/api/test-ot-layout.c | 77 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 test/api/test-ot-layout.c diff --git a/test/api/Makefile.am b/test/api/Makefile.am index 88502ac5c..a491a17df 100644 --- a/test/api/Makefile.am +++ b/test/api/Makefile.am @@ -46,6 +46,7 @@ TEST_PROGS = \ test-ot-face \ test-ot-glyphname \ test-ot-ligature-carets \ + test-ot-layout \ test-ot-name \ test-ot-meta \ test-ot-metrics \ diff --git a/test/api/meson.build b/test/api/meson.build index a1c862b61..cba80f018 100644 --- a/test/api/meson.build +++ b/test/api/meson.build @@ -21,6 +21,7 @@ tests = [ 'test-ot-color.c', 'test-ot-face.c', 'test-ot-glyphname.c', + 'test-ot-layout.c', 'test-ot-ligature-carets.c', 'test-ot-name.c', 'test-ot-meta.c', diff --git a/test/api/test-ot-layout.c b/test/api/test-ot-layout.c new file mode 100644 index 000000000..026270b53 --- /dev/null +++ b/test/api/test-ot-layout.c @@ -0,0 +1,77 @@ +/* + * Copyright © 2021 Khaled Hosny + * + * 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-test.h" + +#include +#include + +#define STATIC_ARRAY_SIZE 255 + +static void +test_ot_layout_table_get_script_tags (void) +{ + hb_face_t *face = hb_test_open_font_file ("fonts/NotoNastaliqUrdu-Regular.ttf"); + + unsigned int total = 0; + unsigned int count = STATIC_ARRAY_SIZE; + unsigned int offset = 0; + hb_tag_t tags[STATIC_ARRAY_SIZE]; + while (count == STATIC_ARRAY_SIZE) + { + total = hb_ot_layout_table_get_script_tags (face, HB_OT_TAG_GSUB, offset, &count, tags); + g_assert_cmpuint (3, ==, total); + offset += count; + if (count) + { + g_assert_cmpuint (3, ==, count); + g_assert_cmpuint (HB_TAG ('a','r','a','b'), ==, tags[0]); + g_assert_cmpuint (HB_TAG ('d','f','l','t'), ==, tags[1]); + g_assert_cmpuint (HB_TAG ('l','a','t','n'), ==, tags[2]); + } + } + count = STATIC_ARRAY_SIZE; + offset = 0; + while (count == STATIC_ARRAY_SIZE) + { + total = hb_ot_layout_table_get_script_tags (face, HB_OT_TAG_GPOS, offset, &count, tags); + g_assert_cmpuint (1, ==, total); + offset += count; + if (count) + { + g_assert_cmpuint (1, ==, count); + g_assert_cmpuint (HB_TAG ('a','r','a','b'), ==, tags[0]); + } + } + + hb_face_destroy (face); +} + +int +main (int argc, char **argv) +{ + hb_test_init (&argc, &argv); + hb_test_add (test_ot_layout_table_get_script_tags); + return hb_test_run (); +} From 2f88ea5a200a8c33ed307460ef153cf51d486683 Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Wed, 11 Aug 2021 23:12:00 +0200 Subject: [PATCH 2/7] [test] hb_ot_layout_table_find_script() --- test/api/test-ot-layout.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/api/test-ot-layout.c b/test/api/test-ot-layout.c index 026270b53..11cc9c031 100644 --- a/test/api/test-ot-layout.c +++ b/test/api/test-ot-layout.c @@ -68,10 +68,34 @@ test_ot_layout_table_get_script_tags (void) hb_face_destroy (face); } +static void +test_ot_layout_table_find_script (void) +{ + hb_face_t *face = hb_test_open_font_file ("fonts/NotoNastaliqUrdu-Regular.ttf"); + unsigned int index; + + g_assert (hb_ot_layout_table_find_script (face, HB_OT_TAG_GSUB, HB_TAG ('a','r','a','b'), &index)); + g_assert_cmpuint (0, ==, index); + g_assert (hb_ot_layout_table_find_script (face, HB_OT_TAG_GSUB, HB_TAG ('d','f','l','t'), &index)); + g_assert_cmpuint (1, ==, index); + g_assert (hb_ot_layout_table_find_script (face, HB_OT_TAG_GSUB, HB_TAG ('l','a','t','n'), &index)); + g_assert_cmpuint (2, ==, index); + + g_assert (hb_ot_layout_table_find_script (face, HB_OT_TAG_GPOS, HB_TAG ('a','r','a','b'), &index)); + g_assert_cmpuint (0, ==, index); + g_assert (!hb_ot_layout_table_find_script (face, HB_OT_TAG_GPOS, HB_TAG ('d','f','l','t'), &index)); + g_assert_cmpuint (0xFFFF, ==, index); + g_assert (!hb_ot_layout_table_find_script (face, HB_OT_TAG_GPOS, HB_TAG ('l','a','t','n'), &index)); + g_assert_cmpuint (0xFFFF, ==, index); + + hb_face_destroy (face); +} + int main (int argc, char **argv) { hb_test_init (&argc, &argv); hb_test_add (test_ot_layout_table_get_script_tags); + hb_test_add (test_ot_layout_table_find_script); return hb_test_run (); } From bf438b815f488afe97ae8442ec4a0989a8bc0c65 Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Wed, 11 Aug 2021 23:23:51 +0200 Subject: [PATCH 3/7] [test] hb_ot_layout_table_get_feature_tags() --- test/api/test-ot-layout.c | 42 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/test/api/test-ot-layout.c b/test/api/test-ot-layout.c index 11cc9c031..cc72692cf 100644 --- a/test/api/test-ot-layout.c +++ b/test/api/test-ot-layout.c @@ -91,11 +91,53 @@ test_ot_layout_table_find_script (void) hb_face_destroy (face); } +static void +test_ot_layout_table_get_feature_tags (void) +{ + hb_face_t *face = hb_test_open_font_file ("fonts/NotoNastaliqUrdu-Regular.ttf"); + + unsigned int total = 0; + unsigned int count = STATIC_ARRAY_SIZE; + unsigned int offset = 0; + hb_tag_t tags[STATIC_ARRAY_SIZE]; + while (count == STATIC_ARRAY_SIZE) + { + total = hb_ot_layout_table_get_feature_tags (face, HB_OT_TAG_GSUB, offset, &count, tags); + g_assert_cmpuint (14, ==, total); + offset += count; + if (count) + { + g_assert_cmpuint (14, ==, count); + g_assert_cmpuint (HB_TAG ('c','c','m','p'), ==, tags[0]); + g_assert_cmpuint (HB_TAG ('i','s','o','l'), ==, tags[10]); + g_assert_cmpuint (HB_TAG ('r','l','i','g'), ==, tags[13]); + } + } + count = STATIC_ARRAY_SIZE; + offset = 0; + while (count == STATIC_ARRAY_SIZE) + { + total = hb_ot_layout_table_get_feature_tags (face, HB_OT_TAG_GPOS, offset, &count, tags); + g_assert_cmpuint (3, ==, total); + offset += count; + if (count) + { + g_assert_cmpuint (3, ==, count); + g_assert_cmpuint (HB_TAG ('c','u','r','s'), ==, tags[0]); + g_assert_cmpuint (HB_TAG ('m','a','r','k'), ==, tags[1]); + g_assert_cmpuint (HB_TAG ('m','k','m','k'), ==, tags[2]); + } + } + + hb_face_destroy (face); +} + int main (int argc, char **argv) { hb_test_init (&argc, &argv); hb_test_add (test_ot_layout_table_get_script_tags); hb_test_add (test_ot_layout_table_find_script); + hb_test_add (test_ot_layout_table_get_feature_tags); return hb_test_run (); } From e9b743b26d9ac4a981ac519d85d975ad1d74f513 Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Wed, 11 Aug 2021 23:51:12 +0200 Subject: [PATCH 4/7] [test] hb_ot_layout_script_get_language_tags() --- test/api/test-ot-layout.c | 40 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/test/api/test-ot-layout.c b/test/api/test-ot-layout.c index cc72692cf..c19765f6e 100644 --- a/test/api/test-ot-layout.c +++ b/test/api/test-ot-layout.c @@ -132,12 +132,52 @@ test_ot_layout_table_get_feature_tags (void) hb_face_destroy (face); } +static void +test_ot_layout_script_get_language_tags (void) +{ + hb_face_t *face = hb_test_open_font_file ("fonts/Estedad-VF.ttf"); + + unsigned int total = 0; + unsigned int count = STATIC_ARRAY_SIZE; + unsigned int offset = 0; + hb_tag_t tags[STATIC_ARRAY_SIZE]; + while (count == STATIC_ARRAY_SIZE) + { + total = hb_ot_layout_script_get_language_tags (face, HB_OT_TAG_GSUB, 0, offset, &count, tags); + g_assert_cmpuint (2, ==, total); + offset += count; + if (count) + { + g_assert_cmpuint (2, ==, count); + g_assert_cmpuint (HB_TAG ('F','A','R',' '), ==, tags[0]); + g_assert_cmpuint (HB_TAG ('K','U','R',' '), ==, tags[1]); + } + } + count = STATIC_ARRAY_SIZE; + offset = 0; + while (count == STATIC_ARRAY_SIZE) + { + total = hb_ot_layout_script_get_language_tags (face, HB_OT_TAG_GPOS, 1, offset, &count, tags); + g_assert_cmpuint (2, ==, total); + offset += count; + if (count) + { + g_assert_cmpuint (2, ==, count); + g_assert_cmpuint (HB_TAG ('F','A','R',' '), ==, tags[0]); + g_assert_cmpuint (HB_TAG ('K','U','R',' '), ==, tags[1]); + } + } + + hb_face_destroy (face); +} + int main (int argc, char **argv) { hb_test_init (&argc, &argv); hb_test_add (test_ot_layout_table_get_script_tags); hb_test_add (test_ot_layout_table_find_script); + hb_test_add (test_ot_layout_script_get_language_tags); hb_test_add (test_ot_layout_table_get_feature_tags); return hb_test_run (); } From 6ac6a2b27b3abe42508828e7919c9ff55a7840d7 Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Thu, 12 Aug 2021 00:04:32 +0200 Subject: [PATCH 5/7] [test] hb_ot_layout_language_get_feature_tags() --- test/api/test-ot-layout.c | 45 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/test/api/test-ot-layout.c b/test/api/test-ot-layout.c index c19765f6e..5c6ccce4d 100644 --- a/test/api/test-ot-layout.c +++ b/test/api/test-ot-layout.c @@ -171,6 +171,50 @@ test_ot_layout_script_get_language_tags (void) hb_face_destroy (face); } +static void +test_ot_layout_language_get_feature_tags (void) +{ + hb_face_t *face = hb_test_open_font_file ("fonts/Estedad-VF.ttf"); + + unsigned int total = 0; + unsigned int count = STATIC_ARRAY_SIZE; + unsigned int offset = 0; + hb_tag_t tags[STATIC_ARRAY_SIZE]; + while (count == STATIC_ARRAY_SIZE) + { + total = hb_ot_layout_language_get_feature_tags (face, HB_OT_TAG_GSUB, 0, 0, offset, &count, tags); + g_assert_cmpuint (6, ==, total); + offset += count; + if (count) + { + g_assert_cmpuint (6, ==, count); + g_assert_cmpuint (HB_TAG ('c','a','l','t'), ==, tags[0]); + g_assert_cmpuint (HB_TAG ('f','i','n','a'), ==, tags[1]); + g_assert_cmpuint (HB_TAG ('i','n','i','t'), ==, tags[2]); + g_assert_cmpuint (HB_TAG ('l','i','g','a'), ==, tags[3]); + g_assert_cmpuint (HB_TAG ('m','e','d','i'), ==, tags[4]); + g_assert_cmpuint (HB_TAG ('r','l','i','g'), ==, tags[5]); + } + } + count = STATIC_ARRAY_SIZE; + offset = 0; + while (count == STATIC_ARRAY_SIZE) + { + total = hb_ot_layout_language_get_feature_tags (face, HB_OT_TAG_GPOS, 1, 0, offset, &count, tags); + g_assert_cmpuint (3, ==, total); + offset += count; + if (count) + { + g_assert_cmpuint (3, ==, count); + g_assert_cmpuint (HB_TAG ('k','e','r','n'), ==, tags[0]); + g_assert_cmpuint (HB_TAG ('m','a','r','k'), ==, tags[1]); + g_assert_cmpuint (HB_TAG ('m','k','m','k'), ==, tags[2]); + } + } + + hb_face_destroy (face); +} + int main (int argc, char **argv) { @@ -179,5 +223,6 @@ main (int argc, char **argv) hb_test_add (test_ot_layout_table_find_script); hb_test_add (test_ot_layout_script_get_language_tags); hb_test_add (test_ot_layout_table_get_feature_tags); + hb_test_add (test_ot_layout_language_get_feature_tags); return hb_test_run (); } From f1226988104281b576878cd8c306d03cc91aa111 Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Thu, 12 Aug 2021 01:47:35 +0200 Subject: [PATCH 6/7] [test] Improve generate-expected-outputs.py diff output --- test/subset/generate-expected-outputs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/subset/generate-expected-outputs.py b/test/subset/generate-expected-outputs.py index fabdfef4b..2182643ab 100755 --- a/test/subset/generate-expected-outputs.py +++ b/test/subset/generate-expected-outputs.py @@ -28,7 +28,7 @@ def strip_check_sum (ttx_string): def generate_expected_output(input_file, unicodes, profile_flags, output_directory, font_name): - fonttools_path = os.path.join(output_directory, font_name) + fonttools_path = os.path.join(tempfile.mkdtemp (), font_name) args = ["fonttools", "subset", input_file] args.extend(["--drop-tables+=DSIG", "--drop-tables-=sbix", @@ -57,7 +57,7 @@ def generate_expected_output(input_file, unicodes, profile_flags, output_directo harfbuzz_ttx = strip_check_sum (fp.getvalue ()) if harfbuzz_ttx != fonttools_ttx: - for line in unified_diff (fonttools_ttx.splitlines (1), harfbuzz_ttx.splitlines (1)): + for line in unified_diff (fonttools_ttx.splitlines (1), harfbuzz_ttx.splitlines (1), fonttools_path, harfbuzz_path): sys.stdout.write (line) sys.stdout.flush () raise Exception ('ttx for fonttools and harfbuzz does not match.') From 43722cc9f428bbfa759d4d93008ba4cf6efaceba Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Thu, 12 Aug 2021 02:32:29 +0200 Subject: [PATCH 7/7] [test] Add some real reverse sub tests --- .../1b66a1f4b076b734caa6397b3e57231af1feaafb.ttf | Bin 0 -> 3220 bytes .../3f24aff8b768e586162e9b9d03b15c36508dd2ae.ttf | Bin 0 -> 5760 bytes .../data/in-house/tests/reverse-sub.tests | 2 ++ 3 files changed, 2 insertions(+) create mode 100644 test/shaping/data/in-house/fonts/1b66a1f4b076b734caa6397b3e57231af1feaafb.ttf create mode 100644 test/shaping/data/in-house/fonts/3f24aff8b768e586162e9b9d03b15c36508dd2ae.ttf diff --git a/test/shaping/data/in-house/fonts/1b66a1f4b076b734caa6397b3e57231af1feaafb.ttf b/test/shaping/data/in-house/fonts/1b66a1f4b076b734caa6397b3e57231af1feaafb.ttf new file mode 100644 index 0000000000000000000000000000000000000000..906f5bf8260ea6991de3be791a5cf08aa111f719 GIT binary patch literal 3220 zcmbVO3sh8f8vpLSb7ypNM^P`y49*=DA7S7~VVIb_cAx}C9s(+jjxaD|%nZy7N@1;) z1#{RJtpyX>DwlkCokXtn@$hr)9r;M?H1gv!}E7p6`C| z-}l|`e;;|mYw`Q zA7FSW>dOk8*3vjf-wyPrq8@9vSqrsyRv!Zx7Ki#QI~s;*6js#zsE65|zKX}EayHZ} zP+#M;R+NHa0g7-CN$IjWZBv@(RU!Ur0OpfYx7YW(9T0{1)#x_>U@Tr4P_V!-%=mP- z&*k>Hv#c(!$zv_>IovL9M5e8{yu|8}0wVo0z;9&yGg<#Q#rQRdF@mK*BRHBx*ZNxr ze$V@-jodsQfPZncKPm_wMpT@|XwX6!M8GU~3Q`~wmOvqtfDc}RD%b#9p#i%+2CZ<5 z8UBLJcG zTp?+U9K^$N*a>%;>5PZzWh&(Kg>Nh^ElcoI$KeL}{QO8sDPFv)G{Cvf*z zIL)PttkVq?3i?T&USlUDc)*gNq6=yG$pwEs*H~Y>WoLazwXMdTsU56RA$(o%75d|P z6?ueAJ&=6x{QGS;G)B^r^=c(NnbiHS+bHf*;A+|`(G=oo&vS0R} z5N;>-(nqGxa}?z1Pnh|p_V;#Q(p`D4!1QF=LONXhZQOY!8QoJ9^;k|09XmgvZl774 zt#Wmrd%0IfGWxEPpqp7AP~|ppz3Q9oU1x7;5w(@f5-v~jml;*`>%nq9j{Jkp>LasM z^yX!OtRP+6c5FYmWp~JW<+`QS7L%5iV=H8j{}~~_U~QF8tRn?HIdp~ope&`|oN)7- z_I7S=){#-2xsel-7Eer#+rD>+7^5mX@ySa)IuiS@Z^$$f5^;%65jFNs(k0Lpcc+k0 zB3`|QQ_;sBit?TM*ObJ#sg;C~G~K=fRj=+6dsQ3DZEv`Bv_6BbpjPqg4B^9b zpWeKFGSf);%$z5t}MQn$?mc7bY)>6Ce_Gv`8q7+Y-0 z2-niz^d*rU|odr{RMw!o^eXUTxOD^%{T8-o4DE zO~}a$4_nf9Ufus`Eqk2KFZe}q6B6K>5)tSbX~6@39n98lePZ1scO<4e2(U-KEK5GTsV5-W9`M^!i)ReLe5DM24YFA2>JjVE^Mx4zDw zdEtP!P-`nI%gQcmY}RihD}<)qJB}Y~TxBmRT~)YRU+|W5XOmVVq%Es(E*B3y%QqZ) zr}n7s$o>ke)#*+VGqcYs&mUd6B)`OED#(Ac-Xf-|R<#^^wN*#dogJ4tu=*dxH&iWK z4>omZKU#9~QN2c(u^|2N==Mc@?FV-?ZWlKw=e+KWqm1skmFqXYD4JDOwT;#FI+Apl z2xK%Fm()E|jG>c-uBLsbKiq4{vKJL+W_b>tK_F_f(J?fL246_KcD?)TjlPAgvDwAt z?&rlS<(C@{oF|NK_pYkfYsGHW`qgD`ROskbdPI1q>2O!ao{~lB4riX(+14rnRVgcJ z;r>cI9Q*JZ5{|*7{;GMfJkowpWhp2y?dMMql!&C|^Z&b*1!-9{fHo zqKEigk~_WkmWt-TFI*wRYwH_ZHr0l#d#+}=TN|m;2nk9WJfmrG$C0`>>uR^Y8M4m3 zuGFEWd;hG`;2)JiVwvPELH%h!y7^KNaqIfqy+1hC1m^HSPd1yA zp&g8dq(BWt1Tz_((yV|T$9{;+AWuRCi}6>}My6x74_xxqjS*R3MNNt|VU!g&0X{@<%eG9+DTZ>y zwW2QyvyFI0!yN3wjAt@RKgYX|_Die??Chs#KhOK$eMoop)7%`?JlJ!fPiZ>$JNr56 zukQwzPhL|F`B-T+WUhc|$d#Z#orT$kq@f|y@yQq(8oKc1mB2HB7R*|MY^YA!@BWuV zLQ{htXU8O&QnO(gBI1E)l7}g&=oavmr5 zIU3~}*@G_y$_$7y7K2v?R>&R$<_i!E55qVJ!5y*=(Z*vx(qBM8F5RPqJ?sHu%mYLz b<{_L(;0*|%jzwMWT&|%+bSX;Of5U$OI3E$& literal 0 HcmV?d00001 diff --git a/test/shaping/data/in-house/fonts/3f24aff8b768e586162e9b9d03b15c36508dd2ae.ttf b/test/shaping/data/in-house/fonts/3f24aff8b768e586162e9b9d03b15c36508dd2ae.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7449e489db77f72d6b6a62e97d7386061fff3b48 GIT binary patch literal 5760 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 literal 0 HcmV?d00001 diff --git a/test/shaping/data/in-house/tests/reverse-sub.tests b/test/shaping/data/in-house/tests/reverse-sub.tests index 9563a58b6..60a536956 100644 --- a/test/shaping/data/in-house/tests/reverse-sub.tests +++ b/test/shaping/data/in-house/tests/reverse-sub.tests @@ -1 +1,3 @@ ../fonts/a706511c65fb278fda87eaf2180ca6684a80f423.ttf;;U+0041,U+0020,U+0041,U+0042;[A.alt1=0+1000|space=1+1000|A.alt1=2+1000|B=3+1000] +../fonts/3f24aff8b768e586162e9b9d03b15c36508dd2ae.ttf;--features=salt=2;U+0635,U+0644,U+0637,U+062E,U+0644,U+0637,U+062C;[gid43=6@143,-124+0|gid8=6+178|gid25=5@0,110+670|gid33=4@0,110+120|gid41=3@-8,343+0|gid10=3@0,110+88|gid26=2@0,220+670|gid34=1@0,220+120|gid21=0@0,220+670] +../fonts/1b66a1f4b076b734caa6397b3e57231af1feaafb.ttf;;U+0031,U+0032,U+0033,U+0034,U+0035,U+0036,U+0037,U+0038,U+0039,U+0030,U+2044,U+0031,U+0032,U+0033,U+0034,U+0035,U+0036,U+0037,U+0038,U+0039,U+0030;[one.numr=0+350|two.numr=1+350|three.numr=2+350|four.numr=3+350|five.numr=4+350|six.numr=5+350|seven.numr=6+350|eight.numr=7+350|nine.numr=8+350|zero.numr=9+350|fraction=10+130|one.dnom=11+350|two.dnom=12+350|three.dnom=13+350|four.dnom=14+350|five.dnom=15+350|six.dnom=16+350|seven.dnom=17+350|eight.dnom=18+350|nine.dnom=19+350|zero.dnom=20+350]