fast_excel 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +5 -5
  2. data/.dockerignore +2 -0
  3. data/.gitignore +7 -0
  4. data/.travis.yml +44 -0
  5. data/CHANGELOG.md +41 -1
  6. data/Dockerfile.test +16 -0
  7. data/Gemfile +5 -2
  8. data/Gemfile.lock +30 -23
  9. data/LICENSE +21 -0
  10. data/Makefile +13 -0
  11. data/README.md +177 -40
  12. data/Rakefile +16 -0
  13. data/appveyor.yml +25 -0
  14. data/benchmarks/1k_rows.rb +17 -4
  15. data/benchmarks/20k_rows.rb +4 -0
  16. data/benchmarks/auto_width.rb +37 -0
  17. data/benchmarks/init.rb +14 -2
  18. data/benchmarks/memory.rb +8 -0
  19. data/benchmarks/profiler.rb +27 -0
  20. data/benchmarks/write_value.rb +62 -0
  21. data/examples/example.rb +3 -4
  22. data/examples/example_align.rb +23 -0
  23. data/examples/example_auto_width.rb +26 -0
  24. data/examples/example_colors.rb +37 -0
  25. data/examples/example_filters.rb +36 -0
  26. data/examples/example_formula.rb +1 -5
  27. data/examples/example_hyperlink.rb +20 -0
  28. data/examples/example_image.rb +1 -1
  29. data/examples/example_styles.rb +27 -0
  30. data/examples/logo.png +0 -0
  31. data/ext/fast_excel/extconf.rb +3 -0
  32. data/ext/fast_excel/text_width_ext.c +460 -0
  33. data/fast_excel.gemspec +2 -3
  34. data/letters.html +114 -0
  35. data/lib/fast_excel.rb +455 -78
  36. data/lib/fast_excel/binding.rb +31 -21
  37. data/lib/fast_excel/binding/chart.rb +20 -1
  38. data/lib/fast_excel/binding/format.rb +11 -4
  39. data/lib/fast_excel/binding/workbook.rb +10 -2
  40. data/lib/fast_excel/binding/worksheet.rb +44 -27
  41. data/libxlsxwriter/.gitignore +1 -0
  42. data/libxlsxwriter/.indent.pro +8 -0
  43. data/libxlsxwriter/.travis.yml +12 -0
  44. data/libxlsxwriter/CMakeLists.txt +338 -0
  45. data/libxlsxwriter/CONTRIBUTING.md +1 -1
  46. data/libxlsxwriter/Changes.txt +162 -0
  47. data/libxlsxwriter/LICENSE.txt +65 -4
  48. data/libxlsxwriter/Makefile +33 -11
  49. data/libxlsxwriter/Readme.md +3 -1
  50. data/libxlsxwriter/cocoapods/libxlsxwriter-umbrella.h +2 -1
  51. data/libxlsxwriter/cocoapods/libxlsxwriter.modulemap +2 -2
  52. data/libxlsxwriter/include/xlsxwriter.h +2 -2
  53. data/libxlsxwriter/include/xlsxwriter/app.h +2 -2
  54. data/libxlsxwriter/include/xlsxwriter/chart.h +164 -13
  55. data/libxlsxwriter/include/xlsxwriter/chartsheet.h +544 -0
  56. data/libxlsxwriter/include/xlsxwriter/common.h +35 -6
  57. data/libxlsxwriter/include/xlsxwriter/content_types.h +5 -2
  58. data/libxlsxwriter/include/xlsxwriter/core.h +2 -2
  59. data/libxlsxwriter/include/xlsxwriter/custom.h +2 -2
  60. data/libxlsxwriter/include/xlsxwriter/drawing.h +3 -2
  61. data/libxlsxwriter/include/xlsxwriter/format.h +8 -8
  62. data/libxlsxwriter/include/xlsxwriter/hash_table.h +1 -1
  63. data/libxlsxwriter/include/xlsxwriter/packager.h +18 -8
  64. data/libxlsxwriter/include/xlsxwriter/relationships.h +2 -2
  65. data/libxlsxwriter/include/xlsxwriter/shared_strings.h +5 -3
  66. data/libxlsxwriter/include/xlsxwriter/styles.h +10 -5
  67. data/libxlsxwriter/include/xlsxwriter/theme.h +2 -2
  68. data/libxlsxwriter/include/xlsxwriter/utility.h +35 -5
  69. data/libxlsxwriter/include/xlsxwriter/workbook.h +234 -57
  70. data/libxlsxwriter/include/xlsxwriter/worksheet.h +780 -91
  71. data/libxlsxwriter/include/xlsxwriter/xmlwriter.h +4 -2
  72. data/libxlsxwriter/libxlsxwriter.podspec +4 -2
  73. data/libxlsxwriter/src/Makefile +31 -6
  74. data/libxlsxwriter/src/app.c +2 -2
  75. data/libxlsxwriter/src/chart.c +116 -23
  76. data/libxlsxwriter/src/chartsheet.c +508 -0
  77. data/libxlsxwriter/src/content_types.c +12 -4
  78. data/libxlsxwriter/src/core.c +11 -11
  79. data/libxlsxwriter/src/custom.c +3 -3
  80. data/libxlsxwriter/src/drawing.c +114 -17
  81. data/libxlsxwriter/src/format.c +5 -5
  82. data/libxlsxwriter/src/hash_table.c +1 -1
  83. data/libxlsxwriter/src/packager.c +378 -61
  84. data/libxlsxwriter/src/relationships.c +2 -2
  85. data/libxlsxwriter/src/shared_strings.c +18 -4
  86. data/libxlsxwriter/src/styles.c +59 -12
  87. data/libxlsxwriter/src/theme.c +2 -2
  88. data/libxlsxwriter/src/utility.c +93 -6
  89. data/libxlsxwriter/src/workbook.c +379 -61
  90. data/libxlsxwriter/src/worksheet.c +1240 -174
  91. data/libxlsxwriter/src/xmlwriter.c +18 -9
  92. data/libxlsxwriter/third_party/minizip/Makefile +6 -1
  93. data/libxlsxwriter/third_party/minizip/ioapi.c +10 -0
  94. data/libxlsxwriter/third_party/minizip/zip.c +2 -0
  95. data/libxlsxwriter/third_party/tmpfileplus/tmpfileplus.c +2 -2
  96. data/libxlsxwriter/version.txt +1 -1
  97. data/test/auto_width_test.rb +19 -0
  98. data/test/date_test.rb +34 -0
  99. data/test/format_test.rb +179 -0
  100. data/test/reopen_test.rb +22 -0
  101. data/test/test_helper.rb +23 -4
  102. data/test/text_width_test.rb +80 -0
  103. data/test/tmpfile_test.rb +1 -0
  104. data/test/validations_test.rb +47 -0
  105. data/test/worksheet_test.rb +129 -0
  106. metadata +34 -5
@@ -0,0 +1,20 @@
1
+ require_relative '../lib/fast_excel'
2
+
3
+ workbook = FastExcel.open("example_hyperlink.xlsx", constant_memory: false)
4
+ worksheet = workbook.add_worksheet
5
+ worksheet.auto_width = true
6
+
7
+ url_format = workbook.add_format(underline: :underline_single, font_color: :blue)
8
+
9
+ worksheet.append_row([
10
+ "Ultra Fast Excel Writer for Ruby",
11
+ FastExcel::URL.new("https://github.com/Paxa/fast_excel"),
12
+ FastExcel::URL.new("postgres://localhost")
13
+ ], [nil, url_format])
14
+
15
+ # Same as:
16
+ # worksheet.write_value(0, 0, "Ultra Fast Excel Writer for Ruby")
17
+ # worksheet.write_url(0, 1, "https://github.com/Paxa/fast_excel", url_format)
18
+
19
+ workbook.close
20
+ puts "Saved to file example_hyperlink.xlsx"
@@ -7,7 +7,7 @@ img_options = Libxlsxwriter::ImageOptions.new
7
7
  img_options[:x_offset] = 0
8
8
  img_options[:y_offset] = 0
9
9
 
10
- worksheet.insert_image_opt(3, 3, "libxlsxwriter/examples/logo.png", img_options)
10
+ worksheet.insert_image_opt(3, 3, "examples/logo.png", img_options)
11
11
 
12
12
  workbook.close
13
13
  puts "Saved to file example_image.xlsx"
@@ -0,0 +1,27 @@
1
+ require_relative '../lib/fast_excel'
2
+
3
+ workbook = FastExcel.open("example_styles.xlsx", constant_memory: true)
4
+
5
+ #workbook.default_format.set(
6
+ # font_size: 0, # user's default
7
+ # #font_family: "Arial"
8
+ #)
9
+
10
+ worksheet = workbook.add_worksheet
11
+
12
+ worksheet.set_columns_width(0, 11, 11)
13
+
14
+ worksheet.write_value(0, 0, "Bold", workbook.add_format(bold: true))
15
+ worksheet.write_value(0, 1, "Italic", workbook.add_format(italic: true))
16
+ worksheet.write_value(0, 2, "Underline", workbook.add_format(underline: :underline_single))
17
+ worksheet.write_value(0, 3, "Double line", workbook.add_format(underline: :underline_double))
18
+ worksheet.write_value(0, 4, "Indent", workbook.add_format(indent: 1))
19
+ worksheet.write_value(0, 5, "Border", workbook.add_format(border: :border_thin))
20
+ worksheet.write_value(0, 6, "Border2", workbook.add_format(border: :border_medium))
21
+ worksheet.write_value(0, 7, "Pattern", workbook.add_format(pattern: :pattern_light_up, bg_color: :yellow))
22
+ worksheet.write_value(0, 8, "Script", workbook.add_format(font_script: :font_subscript))
23
+ worksheet.write_value(0, 9, "Strike", workbook.add_format(font_strikeout: true))
24
+ worksheet.write_value(0, 10, "Shaddow", workbook.add_format(font_shadow: true))
25
+
26
+ workbook.close
27
+ puts "Saved to file example_styles.xlsx"
Binary file
@@ -0,0 +1,3 @@
1
+ require 'mkmf'
2
+
3
+ create_makefile('ext/text_width_ext')
@@ -0,0 +1,460 @@
1
+ #include "ruby.h"
2
+ #include <stdio.h>
3
+ #include <string.h>
4
+
5
+ static float ARIAL_DEFAULT = 52.6953125;
6
+ static float ARIAL_CHAR_WIDTH[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, 27.783203125, 27.783203125, 35.498046875, 55.615234375, 55.615234375, 88.916015625, 66.69921875, 19.091796875, 33.30078125, 33.30078125, 38.916015625, 58.3984375, 27.783203125, 33.30078125, 27.783203125, 27.783203125, 55.615234375, 55.615234375, 55.615234375, 55.615234375, 55.615234375, 55.615234375, 55.615234375, 55.615234375, 55.615234375, 55.615234375, 27.783203125, 27.783203125, 58.3984375, 58.3984375, 58.3984375, 55.615234375, 101.513671875, 66.69921875, 66.69921875, 72.216796875, 72.216796875, 66.69921875, 61.083984375, 77.783203125, 72.216796875, 27.783203125, 50, 66.69921875, 55.615234375, 83.30078125, 72.216796875, 77.783203125, 66.69921875, 77.783203125, 72.216796875, 66.69921875, 61.083984375, 72.216796875, 66.69921875, 94.384765625, 66.69921875, 66.69921875, 61.083984375, 27.783203125, 27.783203125, 27.783203125, 46.923828125, 55.615234375, 33.30078125, 55.615234375, 55.615234375, 50, 55.615234375, 55.615234375, 27.783203125, 55.615234375, 55.615234375, 22.216796875, 22.216796875, 50, 22.216796875, 83.30078125, 55.615234375, 55.615234375, 55.615234375, 55.615234375, 33.30078125, 50, 27.783203125, 55.615234375, 50, 72.216796875, 50, 50, 50, 33.3984375, 25.9765625, 33.3984375, 58.3984375};
7
+ static float ARIAL_KERNING[127][127] = {
8
+ /* 0 : */ { 0 },
9
+ /* 1 : */ { 0 },
10
+ /* 2 : */ { 0 },
11
+ /* 3 : */ { 0 },
12
+ /* 4 : */ { 0 },
13
+ /* 5 : */ { 0 },
14
+ /* 6 : */ { 0 },
15
+ /* 7 : */ { 0 },
16
+ /* 8 : */ { 0 },
17
+ /* 9 : */ { 0 },
18
+ /* 10 : */ { 0 },
19
+ /* 11 : */ { 0 },
20
+ /* 12 : */ { 0 },
21
+ /* 13 : */ { 0 },
22
+ /* 14 : */ { 0 },
23
+ /* 15 : */ { 0 },
24
+ /* 16 : */ { 0 },
25
+ /* 17 : */ { 0 },
26
+ /* 18 : */ { 0 },
27
+ /* 19 : */ { 0 },
28
+ /* 20 : */ { 0 },
29
+ /* 21 : */ { 0 },
30
+ /* 22 : */ { 0 },
31
+ /* 23 : */ { 0 },
32
+ /* 24 : */ { 0 },
33
+ /* 25 : */ { 0 },
34
+ /* 26 : */ { 0 },
35
+ /* 27 : */ { 0 },
36
+ /* 28 : */ { 0 },
37
+ /* 29 : */ { 0 },
38
+ /* 30 : */ { 0 },
39
+ /* 31 : */ { 0 },
40
+ /* 32 : */ { 0 },
41
+ /* 33 : ! */ { 0 },
42
+ /* 34 : " */ { 0 },
43
+ /* 35 : # */ { 0 },
44
+ /* 36 : $ */ { 0 },
45
+ /* 37 : % */ { 0 },
46
+ /* 38 : & */ { 0 },
47
+ /* 39 : ' */ { 0 },
48
+ /* 40 : ( */ { 0 },
49
+ /* 41 : ) */ { 0 },
50
+ /* 42 : * */ { 0 },
51
+ /* 43 : + */ { 0 },
52
+ /* 44 : , */ { 0 },
53
+ /* 45 : - */ { 0 },
54
+ /* 46 : . */ { 0 },
55
+ /* 47 : / */ { 0 },
56
+ /* 48 : 0 */ { 0 },
57
+ /* 49 : 1 */ { 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, 103.80859375, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
58
+ /* 50 : 2 */ { 0 },
59
+ /* 51 : 3 */ { 0 },
60
+ /* 52 : 4 */ { 0 },
61
+ /* 53 : 5 */ { 0 },
62
+ /* 54 : 6 */ { 0 },
63
+ /* 55 : 7 */ { 0 },
64
+ /* 56 : 8 */ { 0 },
65
+ /* 57 : 9 */ { 0 },
66
+ /* 58 : : */ { 0 },
67
+ /* 59 : ; */ { 0 },
68
+ /* 60 : < */ { 0 },
69
+ /* 61 : = */ { 0 },
70
+ /* 62 : > */ { 0 },
71
+ /* 63 : ? */ { 0 },
72
+ /* 64 : @ */ { 0 },
73
+ /* 65 : A */ { 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, 88.96484375, 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, 120.361328125, 0, 125.9765625, 157.373046875, 0, 125.9765625, 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, 114.892578125, 137.109375, 0, 114.892578125, 0, 0, 0, 0, 0 },
74
+ /* 66 : B */ { 0 },
75
+ /* 67 : C */ { 0 },
76
+ /* 68 : D */ { 0 },
77
+ /* 69 : E */ { 0 },
78
+ /* 70 : F */ { 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, 77.783203125, 0, 77.783203125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122.265625, 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 },
79
+ /* 71 : G */ { 0 },
80
+ /* 72 : H */ { 0 },
81
+ /* 73 : I */ { 0 },
82
+ /* 74 : J */ { 0 },
83
+ /* 75 : K */ { 0 },
84
+ /* 76 : L */ { 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, 79.6875, 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, 109.27734375, 0, 114.892578125, 142.578125, 0, 114.892578125, 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, 101.904296875, 0, 0, 0, 0, 0 },
85
+ /* 77 : M */ { 0 },
86
+ /* 78 : N */ { 0 },
87
+ /* 79 : O */ { 0 },
88
+ /* 80 : P */ { 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, 92.67578125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81.591796875, 0, 81.591796875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125.9765625, 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 },
89
+ /* 81 : Q */ { 0 },
90
+ /* 82 : R */ { 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131.494140625, 0, 137.109375, 164.794921875, 0, 137.109375, 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 },
91
+ /* 83 : S */ { 0 },
92
+ /* 84 : T */ { 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, 87.060546875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77.783203125, 88.8671875, 77.783203125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77.783203125, 77.783203125, 0, 0, 0, 0, 0, 120.361328125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137.060546875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105.615234375, 0, 100, 0, 105.615234375, 0, 0, 0, 79.58984375, 0, 0, 0, 0, 0, 105.615234375, 0, 0, 90.673828125, 100, 0, 112.98828125, 0, 127.783203125, 0, 105.56640625, 0, 0, 0, 0, 0 },
93
+ /* 85 : U */ { 0 },
94
+ /* 86 : V */ { 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, 85.302734375, 94.482421875, 85.302734375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90.771484375, 90.771484375, 0, 0, 0, 0, 0, 125.9765625, 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, 114.892578125, 0, 0, 0, 116.796875, 0, 0, 0, 87.109375, 0, 0, 0, 0, 0, 116.796875, 0, 0, 96.2890625, 0, 0, 118.603515625, 0, 0, 0, 112.98828125, 0, 0, 0, 0, 0 },
95
+ /* 87 : W */ { 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, 116.650390625, 125.87890625, 116.650390625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120.361328125, 120.361328125, 0, 0, 0, 0, 0, 157.373046875, 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, 146.2890625, 0, 0, 0, 148.193359375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148.193359375, 0, 0, 125.87890625, 0, 0, 148.193359375, 0, 0, 0, 143.505859375, 0, 0, 0, 0, 0 },
96
+ /* 88 : X */ { 0 },
97
+ /* 89 : Y */ { 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, 92.67578125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81.591796875, 90.8203125, 81.591796875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88.96484375, 87.98828125, 0, 0, 0, 0, 0, 125.9765625, 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, 114.892578125, 0, 0, 0, 113.134765625, 0, 0, 0, 85.205078125, 0, 0, 0, 0, 0, 113.134765625, 114.892578125, 113.134765625, 0, 0, 0, 116.796875, 111.181640625, 0, 0, 0, 0, 0, 0, 0, 0 },
98
+ /* 90 : Z */ { 0 },
99
+ /* 91 : [ */ { 0 },
100
+ /* 92 : \ */ { 0 },
101
+ /* 93 : ] */ { 0 },
102
+ /* 94 : ^ */ { 0 },
103
+ /* 95 : _ */ { 0 },
104
+ /* 96 : ` */ { 0 },
105
+ /* 97 : a */ { 0 },
106
+ /* 98 : b */ { 0 },
107
+ /* 99 : c */ { 0 },
108
+ /* 100 : d */ { 0 },
109
+ /* 101 : e */ { 0 },
110
+ /* 102 : f */ { 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, 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, 53.759765625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
111
+ /* 103 : g */ { 0 },
112
+ /* 104 : h */ { 0 },
113
+ /* 105 : i */ { 0 },
114
+ /* 106 : j */ { 0 },
115
+ /* 107 : k */ { 0 },
116
+ /* 108 : l */ { 0 },
117
+ /* 109 : m */ { 0 },
118
+ /* 110 : n */ { 0 },
119
+ /* 111 : o */ { 0 },
120
+ /* 112 : p */ { 0 },
121
+ /* 113 : q */ { 0 },
122
+ /* 114 : r */ { 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, 55.56640625, 0, 55.56640625, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
123
+ /* 115 : s */ { 0 },
124
+ /* 116 : t */ { 0 },
125
+ /* 117 : u */ { 0 },
126
+ /* 118 : v */ { 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, 70.361328125, 0, 70.361328125, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
127
+ /* 119 : w */ { 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, 94.482421875, 0, 94.482421875, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
128
+ /* 120 : x */ { 0 },
129
+ /* 121 : y */ { 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, 70.361328125, 0, 70.361328125, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
130
+ /* 122 : z */ { 0 },
131
+ /* 123 : { */ { 0 },
132
+ /* 124 : | */ { 0 },
133
+ /* 125 : } */ { 0 },
134
+ /* 126 : ~ */ { 0 },
135
+ };
136
+
137
+
138
+ static float CALIBRI_DEFAULT = 47.31959292763158;
139
+ static float CALIBRI_CHAR_WIDTH[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, 22.607421875, 32.568359375, 40.087890625, 49.8046875, 50.68359375, 71.484375, 68.212890625, 22.0703125, 30.322265625, 30.322265625, 49.8046875, 49.8046875, 24.951171875, 30.615234375, 25.244140625, 38.623046875, 50.68359375, 50.68359375, 50.68359375, 50.68359375, 50.68359375, 50.68359375, 50.68359375, 50.68359375, 50.68359375, 50.68359375, 26.7578125, 26.7578125, 49.8046875, 49.8046875, 49.8046875, 46.337890625, 89.404296875, 57.861328125, 54.39453125, 53.3203125, 61.5234375, 48.828125, 45.947265625, 63.0859375, 62.3046875, 25.1953125, 31.884765625, 51.953125, 42.041015625, 85.498046875, 64.55078125, 66.2109375, 51.66015625, 67.28515625, 54.296875, 45.947265625, 48.73046875, 64.16015625, 56.73828125, 88.96484375, 51.904296875, 48.73046875, 46.826171875, 30.6640625, 38.623046875, 30.6640625, 49.8046875, 49.8046875, 29.1015625, 47.900390625, 52.5390625, 42.28515625, 52.5390625, 49.755859375, 30.517578125, 47.0703125, 52.5390625, 22.94921875, 23.92578125, 45.458984375, 22.94921875, 79.8828125, 52.5390625, 52.734375, 52.5390625, 52.5390625, 34.86328125, 39.111328125, 33.49609375, 52.5390625, 45.166015625, 71.484375, 43.310546875, 45.263671875, 39.501953125, 31.4453125, 46.044921875, 31.4453125, 49.8046875};
140
+ static float CALIBRI_KERNING[127][127] = {
141
+ /* 0 : */ { 0 },
142
+ /* 1 : */ { 0 },
143
+ /* 2 : */ { 0 },
144
+ /* 3 : */ { 0 },
145
+ /* 4 : */ { 0 },
146
+ /* 5 : */ { 0 },
147
+ /* 6 : */ { 0 },
148
+ /* 7 : */ { 0 },
149
+ /* 8 : */ { 0 },
150
+ /* 9 : */ { 0 },
151
+ /* 10 : */ { 0 },
152
+ /* 11 : */ { 0 },
153
+ /* 12 : */ { 0 },
154
+ /* 13 : */ { 0 },
155
+ /* 14 : */ { 0 },
156
+ /* 15 : */ { 0 },
157
+ /* 16 : */ { 0 },
158
+ /* 17 : */ { 0 },
159
+ /* 18 : */ { 0 },
160
+ /* 19 : */ { 0 },
161
+ /* 20 : */ { 0 },
162
+ /* 21 : */ { 0 },
163
+ /* 22 : */ { 0 },
164
+ /* 23 : */ { 0 },
165
+ /* 24 : */ { 0 },
166
+ /* 25 : */ { 0 },
167
+ /* 26 : */ { 0 },
168
+ /* 27 : */ { 0 },
169
+ /* 28 : */ { 0 },
170
+ /* 29 : */ { 0 },
171
+ /* 30 : */ { 0 },
172
+ /* 31 : */ { 0 },
173
+ /* 32 : */ { 0 },
174
+ /* 33 : ! */ { 0 },
175
+ /* 34 : " */ { 0 },
176
+ /* 35 : # */ { 0 },
177
+ /* 36 : $ */ { 0 },
178
+ /* 37 : % */ { 0 },
179
+ /* 38 : & */ { 0 },
180
+ /* 39 : ' */ { 0 },
181
+ /* 40 : ( */ { 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, 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, 77.880859375, 0, 0, 57.32421875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
182
+ /* 41 : ) */ { 0 },
183
+ /* 42 : * */ { 0 },
184
+ /* 43 : + */ { 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, 100.341796875, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
185
+ /* 44 : , */ { 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, 83.642578125, 0, 0, 0, 0, 0, 0, 0, 0, 57.91015625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67.1875, 0, 74.90234375, 106.591796875, 77.34375, 66.50390625, 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, 56.34765625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
186
+ /* 45 : - */ { 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74.4140625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60.25390625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74.90234375, 0, 72.0703125, 74.90234375, 0, 0, 0, 0, 0 },
187
+ /* 46 : . */ { 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, 50.341796875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83.69140625, 0, 76.708984375, 0, 0, 0, 86.474609375, 0, 0, 58.056640625, 0, 0, 0, 0, 90.380859375, 0, 91.455078125, 0, 0, 66.50390625, 88.525390625, 74.609375, 107.177734375, 0, 64.794921875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53.80859375, 73.388671875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56.591796875, 0, 66.650390625, 93.408203125, 0, 66.748046875, 65.234375, 0, 0, 0, 0 },
188
+ /* 47 : / */ { 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, 93.017578125, 0, 0, 0, 0, 0, 0, 0, 0, 68.701171875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84.716796875, 0, 79.1015625, 0, 86.572265625, 0, 83.984375, 0, 0, 0, 0, 0, 0, 0, 89.6484375, 0, 0, 0, 75.830078125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
189
+ /* 48 : 0 */ { 0 },
190
+ /* 49 : 1 */ { 0 },
191
+ /* 50 : 2 */ { 0 },
192
+ /* 51 : 3 */ { 0 },
193
+ /* 52 : 4 */ { 0 },
194
+ /* 53 : 5 */ { 0 },
195
+ /* 54 : 6 */ { 0 },
196
+ /* 55 : 7 */ { 0 },
197
+ /* 56 : 8 */ { 0 },
198
+ /* 57 : 9 */ { 0 },
199
+ /* 58 : : */ { 0 },
200
+ /* 59 : ; */ { 0 },
201
+ /* 60 : < */ { 0 },
202
+ /* 61 : = */ { 0 },
203
+ /* 62 : > */ { 0 },
204
+ /* 63 : ? */ { 0 },
205
+ /* 64 : @ */ { 0 },
206
+ /* 65 : A */ { 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, 83.544921875, 87.744140625, 83.69140625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100.87890625, 0, 0, 0, 110.44921875, 0, 0, 0, 120.21484375, 0, 0, 90.869140625, 0, 0, 0, 0, 122.94921875, 0, 124.0234375, 0, 0, 98.779296875, 120.458984375, 110.25390625, 142.919921875, 0, 99.267578125, 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, 88.818359375, 0, 101.171875, 0, 0, 101.123046875, 0, 0, 0, 0, 0 },
207
+ /* 66 : B */ { 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, 77.978515625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111.279296875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100.78125, 0, 109.912109375, 142.1875, 104.150390625, 100.341796875, 100.244140625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83.935546875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86.9140625, 0, 98.583984375, 0, 96.97265625, 98.681640625, 0, 0, 0, 0, 0 },
208
+ /* 67 : C */ { 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, 77.83203125, 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, 115.52734375, 0, 0, 85.791015625, 0, 0, 0, 0, 118.65234375, 0, 119.7265625, 0, 0, 102.5390625, 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 },
209
+ /* 68 : D */ { 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, 83.7890625, 0, 84.423828125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117.919921875, 0, 0, 0, 0, 0, 0, 0, 0, 92.333984375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109.130859375, 0, 117.08984375, 149.8046875, 111.9140625, 108.349609375, 107.275390625, 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 },
210
+ /* 69 : E */ { 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, 78.125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105.615234375, 0, 100.9765625, 0, 0, 0, 110.7421875, 0, 0, 0, 0, 0, 0, 0, 113.4765625, 0, 114.55078125, 0, 93.798828125, 0, 0, 0, 0, 0, 0, 95.166015625, 0, 0, 0, 0, 0, 0, 95.068359375, 0, 89.74609375, 99.90234375, 96.77734375, 76.220703125, 0, 0, 0, 0, 0, 0, 0, 0, 99.755859375, 0, 99.90234375, 0, 0, 81.15234375, 0, 91.650390625, 118.65234375, 0, 91.748046875, 0, 0, 0, 0, 0 },
211
+ /* 70 : F */ { 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, 60.9375, 0, 61.767578125, 81.396484375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98.193359375, 0, 98.388671875, 0, 0, 0, 108.154296875, 0, 0, 72.509765625, 0, 0, 0, 0, 111.279296875, 0, 112.353515625, 0, 90.478515625, 0, 0, 0, 0, 96.77734375, 0, 92.236328125, 0, 0, 0, 0, 0, 0, 91.162109375, 0, 86.865234375, 97.509765625, 94.23828125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97.314453125, 0, 97.509765625, 0, 83.349609375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
212
+ /* 71 : G */ { 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111.328125, 0, 119.3359375, 151.611328125, 0, 110.3515625, 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, 106.8359375, 133.49609375, 105.712890625, 106.884765625, 0, 0, 0, 0, 0 },
213
+ /* 72 : H */ { 0 },
214
+ /* 73 : I */ { 0 },
215
+ /* 74 : J */ { 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, 55.517578125, 0, 56.25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88.037109375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82.8125, 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 },
216
+ /* 75 : K */ { 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, 80.908203125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101.46484375, 0, 0, 0, 111.1328125, 0, 0, 0, 0, 0, 0, 0, 113.427734375, 0, 114.501953125, 0, 97.021484375, 0, 114.697265625, 0, 139.2578125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98.193359375, 0, 92.28515625, 102.880859375, 99.90234375, 81.25, 0, 0, 0, 0, 0, 0, 130.2734375, 102.9296875, 102.880859375, 102.9296875, 102.880859375, 85.25390625, 90.185546875, 83.59375, 102.9296875, 92.1875, 118.798828125, 0, 93.06640625, 0, 0, 0, 0, 0 },
217
+ /* 76 : L */ { 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.822265625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94.287109375, 0, 0, 0, 102.83203125, 0, 0, 75.146484375, 0, 0, 0, 0, 106.0546875, 0, 107.12890625, 0, 0, 83.447265625, 104.052734375, 91.6015625, 125.244140625, 0, 82.6171875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71.435546875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73.681640625, 0, 83.3984375, 110.009765625, 0, 83.447265625, 0, 0, 0, 0, 0 },
218
+ /* 77 : M */ { 0 },
219
+ /* 78 : N */ { 0 },
220
+ /* 79 : O */ { 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, 88.818359375, 0, 89.990234375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122.94921875, 0, 0, 0, 0, 0, 0, 0, 0, 96.77734375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112.255859375, 0, 121.728515625, 154.1015625, 114.990234375, 112.255859375, 111.181640625, 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, 108.935546875, 0, 105.224609375, 0, 0, 0, 0 },
221
+ /* 80 : P */ { 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, 64.208984375, 79.296875, 64.16015625, 85.009765625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102.1484375, 0, 0, 0, 0, 0, 0, 0, 0, 76.708984375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99.951171875, 0, 107.91015625, 0, 101.85546875, 99.853515625, 97.0703125, 0, 0, 0, 0, 0, 0, 97.412109375, 0, 91.845703125, 102.5390625, 99.4140625, 82.763671875, 0, 0, 0, 0, 0, 0, 0, 0, 102.392578125, 0, 102.5390625, 0, 89.208984375, 85.7421875, 0, 0, 0, 0, 97.509765625, 0, 0, 0, 0, 0 },
222
+ /* 81 : Q */ { 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, 99.072265625, 0, 0, 97.36328125, 0, 0, 112.548828125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96.97265625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101.171875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113.720703125, 0, 122.802734375, 155.6640625, 119.775390625, 113.76953125, 0, 0, 0, 99.51171875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117.236328125, 0, 0, 95.068359375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112.109375, 0, 0, 0, 0, 100.1953125, 0 },
223
+ /* 82 : R */ { 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, 80.029296875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106.73828125, 0, 0, 0, 116.455078125, 0, 0, 0, 0, 0, 0, 0, 119.53125, 0, 120.60546875, 0, 98.92578125, 102.05078125, 0, 109.66796875, 142.3828125, 0, 101.5625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102.294921875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104.98046875, 0, 0, 0, 0, 0, 0, 98.193359375, 124.169921875, 0, 97.94921875, 0, 0, 0, 0, 0 },
224
+ /* 83 : S */ { 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, 76.123046875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103.076171875, 0, 0, 0, 0, 0, 0, 0, 0, 77.392578125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93.994140625, 0, 102.001953125, 134.1796875, 97.216796875, 93.701171875, 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, 89.990234375, 116.6015625, 0, 89.990234375, 0, 0, 0, 0, 0 },
225
+ /* 84 : T */ { 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, 63.427734375, 71.533203125, 64.0625, 82.12890625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68.9453125, 69.921875, 0, 0, 0, 0, 0, 98.779296875, 0, 100, 0, 0, 0, 108.935546875, 0, 0, 77.44140625, 0, 0, 0, 0, 112.109375, 0, 113.18359375, 0, 94.189453125, 98.828125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88.818359375, 0, 82.373046875, 94.091796875, 89.599609375, 0, 88.427734375, 0, 0, 0, 0, 0, 122.412109375, 95.068359375, 92.578125, 95.068359375, 94.091796875, 77.392578125, 80.37109375, 0, 95.068359375, 89.404296875, 116.015625, 87.646484375, 89.453125, 81.298828125, 0, 0, 0, 0 },
226
+ /* 85 : U */ { 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, 87.744140625, 0, 87.646484375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119.82421875, 0, 0, 0, 0, 0, 0, 0, 0, 94.091796875, 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 },
227
+ /* 86 : V */ { 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, 73.583984375, 82.421875, 71.97265625, 90.185546875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79.931640625, 78.22265625, 0, 0, 0, 0, 0, 109.912109375, 0, 109.1796875, 0, 0, 0, 118.603515625, 0, 0, 84.716796875, 0, 0, 0, 0, 121.630859375, 0, 122.705078125, 0, 102.099609375, 0, 0, 113.916015625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99.072265625, 0, 93.994140625, 105.029296875, 101.513671875, 0, 98.92578125, 0, 0, 0, 0, 0, 134.1796875, 106.8359375, 105.2734375, 106.8359375, 105.029296875, 89.16015625, 91.455078125, 0, 106.8359375, 0, 0, 0, 100.29296875, 92.236328125, 0, 0, 0, 0 },
228
+ /* 87 : W */ { 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, 103.369140625, 115.283203125, 104.150390625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108.10546875, 0, 0, 0, 0, 0, 142.28515625, 0, 141.2109375, 0, 0, 0, 150.9765625, 0, 0, 116.552734375, 0, 0, 0, 0, 154.1015625, 0, 155.17578125, 0, 134.423828125, 0, 0, 0, 0, 140.234375, 0, 0, 0, 0, 0, 0, 0, 0, 133.3984375, 0, 127.44140625, 137.98828125, 135.05859375, 0, 133.3984375, 0, 0, 0, 0, 0, 165.91796875, 138.57421875, 137.5, 138.57421875, 137.98828125, 120.8984375, 124.51171875, 0, 138.57421875, 132.470703125, 0, 0, 131.640625, 0, 0, 0, 0, 0 },
229
+ /* 88 : X */ { 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, 78.564453125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102.44140625, 0, 0, 0, 111.81640625, 0, 0, 0, 0, 0, 0, 0, 115.33203125, 0, 116.40625, 0, 96.875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102.294921875, 99.755859375, 0, 98.53515625, 0, 0, 0, 0, 0, 0, 0, 102.783203125, 0, 102.294921875, 0, 0, 83.88671875, 102.587890625, 94.384765625, 120.99609375, 0, 95.068359375, 0, 0, 0, 0, 0 },
230
+ /* 89 : Y */ { 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, 61.376953125, 73.6328125, 62.40234375, 81.25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67.96875, 68.75, 0, 0, 0, 0, 0, 99.169921875, 0, 98.779296875, 0, 0, 0, 108.544921875, 0, 0, 75.146484375, 0, 0, 0, 0, 111.71875, 0, 112.79296875, 0, 93.84765625, 0, 0, 0, 0, 0, 0, 95.068359375, 0, 0, 0, 0, 0, 0, 90.087890625, 0, 83.251953125, 94.873046875, 91.30859375, 76.220703125, 88.8671875, 0, 70.1171875, 70.263671875, 0, 0, 124.0234375, 96.6796875, 93.994140625, 96.6796875, 94.873046875, 79.00390625, 82.2265625, 80.078125, 96.6796875, 90.52734375, 117.1875, 88.623046875, 90.8203125, 83.349609375, 0, 0, 0, 0 },
231
+ /* 90 : Z */ { 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, 75.244140625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104.150390625, 0, 98.92578125, 0, 0, 0, 108.740234375, 0, 0, 0, 0, 0, 0, 0, 111.865234375, 0, 112.939453125, 0, 0, 0, 0, 0, 135.44921875, 0, 95.21484375, 0, 0, 0, 0, 0, 0, 0, 94.23828125, 0, 88.525390625, 98.486328125, 95.068359375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98.14453125, 0, 98.486328125, 0, 0, 0, 0, 89.794921875, 116.455078125, 0, 90.283203125, 0, 0, 0, 0, 0 },
232
+ /* 91 : [ */ { 0 },
233
+ /* 92 : \ */ { 0 },
234
+ /* 93 : ] */ { 0 },
235
+ /* 94 : ^ */ { 0 },
236
+ /* 95 : _ */ { 0 },
237
+ /* 96 : ` */ { 0 },
238
+ /* 97 : a */ { 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, 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, 77.83203125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80.46875, 0, 91.40625, 118.701171875, 90.283203125, 91.30859375, 0, 0, 0, 0, 0 },
239
+ /* 98 : b */ { 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, 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, 82.2265625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91.162109375, 85.595703125, 0, 97.216796875, 123.53515625, 93.84765625, 97.314453125, 90.673828125, 0, 0, 0, 0 },
240
+ /* 99 : c */ { 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, 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, 89.35546875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94.189453125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
241
+ /* 100 : d */ { 0 },
242
+ /* 101 : e */ { 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, 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, 79.39453125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82.71484375, 0, 94.43359375, 120.751953125, 91.552734375, 94.384765625, 88.28125, 0, 0, 0, 0 },
243
+ /* 102 : f */ { 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, 62.3046875, 0, 0, 49.31640625, 58.447265625, 49.12109375, 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, 76.46484375, 82.51953125, 70.60546875, 80.46875, 77.783203125, 58.349609375, 74.658203125, 82.568359375, 52.9296875, 52.9296875, 75.439453125, 52.9296875, 0, 0, 81.15234375, 0, 80.46875, 0, 68.310546875, 61.572265625, 0, 76.318359375, 102.294921875, 0, 76.26953125, 69.04296875, 0, 0, 0, 0 },
244
+ /* 103 : g */ { 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, 73.14453125, 0, 0, 89.2578125, 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, 93.115234375, 0, 88.76953125, 98.681640625, 95.99609375, 0, 95.068359375, 0, 0, 0, 0, 0, 0, 0, 99.12109375, 0, 98.681640625, 0, 0, 79.052734375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
245
+ /* 104 : h */ { 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, 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, 82.470703125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85.107421875, 0, 96.044921875, 123.33984375, 94.921875, 95.947265625, 0, 0, 0, 0, 0 },
246
+ /* 105 : i */ { 0 },
247
+ /* 106 : j */ { 0 },
248
+ /* 107 : k */ { 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, 72.314453125, 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, 91.650390625, 0, 85.400390625, 95.263671875, 91.9921875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94.82421875, 0, 95.263671875, 0, 83.642578125, 78.466796875, 96.728515625, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
249
+ /* 108 : l */ { 0 },
250
+ /* 109 : m */ { 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, 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, 109.814453125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112.451171875, 0, 123.388671875, 150.68359375, 122.265625, 123.291015625, 0, 0, 0, 0, 0 },
251
+ /* 110 : n */ { 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, 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, 82.470703125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85.107421875, 0, 96.044921875, 123.33984375, 94.921875, 95.947265625, 0, 0, 0, 0, 0 },
252
+ /* 111 : o */ { 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, 75.87890625, 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, 0, 0, 0, 0, 0, 0, 0, 0, 97.4609375, 123.828125, 94.091796875, 97.4609375, 90.91796875, 0, 0, 0, 0 },
253
+ /* 112 : p */ { 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, 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, 82.2265625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91.162109375, 85.595703125, 0, 97.216796875, 123.53515625, 93.84765625, 97.314453125, 90.673828125, 0, 0, 0, 0 },
254
+ /* 113 : q */ { 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, 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, 100.09765625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
255
+ /* 114 : r */ { 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, 51.220703125, 62.548828125, 50.048828125, 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, 80.712890625, 0, 75.68359375, 86.03515625, 83.30078125, 0, 80.56640625, 0, 0, 0, 0, 0, 0, 0, 85.986328125, 0, 86.03515625, 0, 72.265625, 0, 0, 80.95703125, 106.884765625, 0, 80.615234375, 0, 0, 0, 0, 0 },
256
+ /* 115 : s */ { 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, 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, 68.701171875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71.484375, 0, 82.763671875, 110.107421875, 81.34765625, 82.568359375, 77.734375, 0, 0, 0, 0 },
257
+ /* 116 : t */ { 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, 61.03515625, 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, 80.17578125, 0, 74.560546875, 84.912109375, 82.177734375, 61.23046875, 0, 0, 55.712890625, 0, 0, 0, 0, 0, 85.25390625, 0, 84.912109375, 0, 0, 63.427734375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
258
+ /* 117 : u */ { 0 },
259
+ /* 118 : v */ { 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, 62.353515625, 73.486328125, 62.20703125, 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, 91.6015625, 0, 86.23046875, 96.728515625, 93.9453125, 76.220703125, 90.869140625, 0, 0, 0, 0, 0, 0, 0, 96.97265625, 0, 96.728515625, 0, 83.837890625, 79.150390625, 0, 90.91796875, 117.236328125, 0, 91.015625, 83.3984375, 0, 0, 0, 0 },
260
+ /* 119 : w */ { 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, 87.841796875, 100, 90.33203125, 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, 118.26171875, 0, 112.79296875, 123.14453125, 120.361328125, 102.294921875, 117.67578125, 0, 0, 0, 0, 0, 0, 0, 123.291015625, 0, 123.14453125, 0, 109.716796875, 105.17578125, 0, 117.236328125, 143.359375, 0, 117.333984375, 110.15625, 0, 0, 0, 0 },
261
+ /* 120 : x */ { 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, 70.8984375, 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, 89.404296875, 0, 83.349609375, 93.701171875, 90.4296875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93.359375, 0, 93.701171875, 0, 81.8359375, 77.099609375, 94.873046875, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
262
+ /* 121 : y */ { 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, 63.0859375, 73.681640625, 63.916015625, 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, 91.650390625, 0, 86.279296875, 96.630859375, 93.798828125, 76.26953125, 91.064453125, 0, 0, 0, 0, 0, 0, 0, 96.826171875, 0, 96.630859375, 0, 83.447265625, 79.248046875, 0, 91.015625, 117.138671875, 0, 91.015625, 83.935546875, 0, 0, 0, 0 },
263
+ /* 122 : z */ { 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, 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, 85.7421875, 0, 79.58984375, 89.794921875, 87.01171875, 69.53125, 85.7421875, 0, 0, 0, 0, 0, 0, 0, 90.0390625, 0, 89.794921875, 0, 77.5390625, 0, 91.552734375, 83.7890625, 109.912109375, 0, 83.88671875, 0, 0, 0, 0, 0 },
264
+ /* 123 : { */ { 0 },
265
+ /* 124 : | */ { 0 },
266
+ /* 125 : } */ { 0 },
267
+ /* 126 : ~ */ { 0 },
268
+ };
269
+
270
+
271
+ static float TIMES_NEW_ROMAN_DEFAULT = 51.008943256578945;
272
+ static float TIMES_NEW_ROMAN_CHAR_WIDTH[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, 25, 33.30078125, 40.8203125, 50, 50, 83.30078125, 77.783203125, 18.017578125, 33.30078125, 33.30078125, 50, 56.396484375, 25, 33.30078125, 25, 27.783203125, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 27.783203125, 27.783203125, 56.396484375, 56.396484375, 56.396484375, 44.384765625, 92.08984375, 72.216796875, 66.69921875, 66.69921875, 72.216796875, 61.083984375, 55.615234375, 72.216796875, 72.216796875, 33.30078125, 38.916015625, 72.216796875, 61.083984375, 88.916015625, 72.216796875, 72.216796875, 55.615234375, 72.216796875, 66.69921875, 55.615234375, 61.083984375, 72.216796875, 72.216796875, 94.384765625, 72.216796875, 72.216796875, 61.083984375, 33.30078125, 27.783203125, 33.30078125, 46.923828125, 50, 33.30078125, 44.384765625, 50, 44.384765625, 50, 44.384765625, 33.30078125, 50, 50, 27.783203125, 27.783203125, 50, 27.783203125, 77.783203125, 50, 50, 50, 50, 33.30078125, 38.916015625, 27.783203125, 50, 50, 72.216796875, 50, 50, 44.384765625, 47.998046875, 20.01953125, 47.998046875, 54.1015625};
273
+ static float TIMES_NEW_ROMAN_KERNING[127][127] = {
274
+ /* 0 : */ { 0 },
275
+ /* 1 : */ { 0 },
276
+ /* 2 : */ { 0 },
277
+ /* 3 : */ { 0 },
278
+ /* 4 : */ { 0 },
279
+ /* 5 : */ { 0 },
280
+ /* 6 : */ { 0 },
281
+ /* 7 : */ { 0 },
282
+ /* 8 : */ { 0 },
283
+ /* 9 : */ { 0 },
284
+ /* 10 : */ { 0 },
285
+ /* 11 : */ { 0 },
286
+ /* 12 : */ { 0 },
287
+ /* 13 : */ { 0 },
288
+ /* 14 : */ { 0 },
289
+ /* 15 : */ { 0 },
290
+ /* 16 : */ { 0 },
291
+ /* 17 : */ { 0 },
292
+ /* 18 : */ { 0 },
293
+ /* 19 : */ { 0 },
294
+ /* 20 : */ { 0 },
295
+ /* 21 : */ { 0 },
296
+ /* 22 : */ { 0 },
297
+ /* 23 : */ { 0 },
298
+ /* 24 : */ { 0 },
299
+ /* 25 : */ { 0 },
300
+ /* 26 : */ { 0 },
301
+ /* 27 : */ { 0 },
302
+ /* 28 : */ { 0 },
303
+ /* 29 : */ { 0 },
304
+ /* 30 : */ { 0 },
305
+ /* 31 : */ { 0 },
306
+ /* 32 : */ { 0 },
307
+ /* 33 : ! */ { 0 },
308
+ /* 34 : " */ { 0 },
309
+ /* 35 : # */ { 0 },
310
+ /* 36 : $ */ { 0 },
311
+ /* 37 : % */ { 0 },
312
+ /* 38 : & */ { 0 },
313
+ /* 39 : ' */ { 0 },
314
+ /* 40 : ( */ { 0 },
315
+ /* 41 : ) */ { 0 },
316
+ /* 42 : * */ { 0 },
317
+ /* 43 : + */ { 0 },
318
+ /* 44 : , */ { 0 },
319
+ /* 45 : - */ { 0 },
320
+ /* 46 : . */ { 0 },
321
+ /* 47 : / */ { 0 },
322
+ /* 48 : 0 */ { 0 },
323
+ /* 49 : 1 */ { 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, 96.2890625, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
324
+ /* 50 : 2 */ { 0 },
325
+ /* 51 : 3 */ { 0 },
326
+ /* 52 : 4 */ { 0 },
327
+ /* 53 : 5 */ { 0 },
328
+ /* 54 : 6 */ { 0 },
329
+ /* 55 : 7 */ { 0 },
330
+ /* 56 : 8 */ { 0 },
331
+ /* 57 : 9 */ { 0 },
332
+ /* 58 : : */ { 0 },
333
+ /* 59 : ; */ { 0 },
334
+ /* 60 : < */ { 0 },
335
+ /* 61 : = */ { 0 },
336
+ /* 62 : > */ { 0 },
337
+ /* 63 : ? */ { 0 },
338
+ /* 64 : @ */ { 0 },
339
+ /* 65 : A */ { 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, 91.69921875, 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, 122.216796875, 0, 131.54296875, 158.59375, 0, 135.25390625, 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, 114.794921875, 135.25390625, 0, 113.037109375, 0, 0, 0, 0, 0 },
340
+ /* 66 : B */ { 0 },
341
+ /* 67 : C */ { 0 },
342
+ /* 68 : D */ { 0 },
343
+ /* 69 : E */ { 0 },
344
+ /* 70 : F */ { 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, 72.607421875, 0, 72.607421875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120.41015625, 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 },
345
+ /* 71 : G */ { 0 },
346
+ /* 72 : H */ { 0 },
347
+ /* 73 : I */ { 0 },
348
+ /* 74 : J */ { 0 },
349
+ /* 75 : K */ { 0 },
350
+ /* 76 : L */ { 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, 82.373046875, 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, 112.98828125, 0, 124.12109375, 148.046875, 0, 123.291015625, 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, 105.56640625, 0, 0, 0, 0, 0 },
351
+ /* 77 : M */ { 0 },
352
+ /* 78 : N */ { 0 },
353
+ /* 79 : O */ { 0 },
354
+ /* 80 : P */ { 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, 76.904296875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69.53125, 0, 69.53125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118.65234375, 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 },
355
+ /* 81 : Q */ { 0 },
356
+ /* 82 : R */ { 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121.77734375, 0, 130.908203125, 155.56640625, 0, 133.3984375, 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, 112.6953125, 0, 0, 0, 0, 0 },
357
+ /* 83 : S */ { 0 },
358
+ /* 84 : T */ { 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, 84.27734375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78.662109375, 85.205078125, 78.662109375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83.88671875, 83.349609375, 0, 0, 0, 0, 0, 125.29296875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131.494140625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98.486328125, 0, 98.486328125, 0, 98.486328125, 0, 0, 0, 85.3515625, 0, 0, 0, 0, 0, 104.1015625, 0, 0, 90.869140625, 93.017578125, 0, 107.568359375, 0, 126.318359375, 0, 104.1015625, 0, 0, 0, 0, 0 },
359
+ /* 85 : U */ { 0 },
360
+ /* 86 : V */ { 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, 95.41015625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84.326171875, 96.337890625, 84.326171875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92.578125, 92.578125, 0, 0, 0, 0, 0, 131.54296875, 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, 105.517578125, 0, 0, 0, 105.517578125, 0, 0, 0, 93.994140625, 0, 0, 0, 0, 0, 109.326171875, 0, 0, 99.51171875, 0, 0, 116.2109375, 0, 0, 0, 111.1328125, 0, 0, 0, 0, 0 },
361
+ /* 87 : W */ { 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.578125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110.205078125, 122.16796875, 110.205078125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118.45703125, 118.45703125, 0, 0, 0, 0, 0, 155.517578125, 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, 130.76171875, 0, 0, 0, 130.76171875, 0, 0, 0, 118.1640625, 0, 0, 0, 0, 0, 136.376953125, 0, 0, 123.681640625, 0, 0, 140.380859375, 0, 0, 0, 138.37890625, 0, 0, 0, 0, 0 },
362
+ /* 88 : X */ { 0 },
363
+ /* 89 : Y */ { 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, 93.505859375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84.326171875, 94.43359375, 84.326171875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90.8203125, 90.8203125, 0, 0, 0, 0, 0, 133.349609375, 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, 106.591796875, 0, 0, 0, 106.591796875, 0, 0, 0, 94.482421875, 0, 0, 0, 0, 0, 112.20703125, 113.037109375, 111.1328125, 0, 0, 0, 111.1328125, 112.20703125, 0, 0, 0, 0, 0, 0, 0, 0 },
364
+ /* 90 : Z */ { 0 },
365
+ /* 91 : [ */ { 0 },
366
+ /* 92 : \ */ { 0 },
367
+ /* 93 : ] */ { 0 },
368
+ /* 94 : ^ */ { 0 },
369
+ /* 95 : _ */ { 0 },
370
+ /* 96 : ` */ { 0 },
371
+ /* 97 : a */ { 0 },
372
+ /* 98 : b */ { 0 },
373
+ /* 99 : c */ { 0 },
374
+ /* 100 : d */ { 0 },
375
+ /* 101 : e */ { 0 },
376
+ /* 102 : f */ { 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, 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, 64.794921875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
377
+ /* 103 : g */ { 0 },
378
+ /* 104 : h */ { 0 },
379
+ /* 105 : i */ { 0 },
380
+ /* 106 : j */ { 0 },
381
+ /* 107 : k */ { 0 },
382
+ /* 108 : l */ { 0 },
383
+ /* 109 : m */ { 0 },
384
+ /* 110 : n */ { 0 },
385
+ /* 111 : o */ { 0 },
386
+ /* 112 : p */ { 0 },
387
+ /* 113 : q */ { 0 },
388
+ /* 114 : r */ { 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, 54.296875, 64.599609375, 52.783203125, 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, 81.494140625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
389
+ /* 115 : s */ { 0 },
390
+ /* 116 : t */ { 0 },
391
+ /* 117 : u */ { 0 },
392
+ /* 118 : v */ { 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, 68.505859375, 0, 68.505859375, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
393
+ /* 119 : w */ { 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, 90.72265625, 0, 90.72265625, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
394
+ /* 120 : x */ { 0 },
395
+ /* 121 : y */ { 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, 68.505859375, 0, 68.505859375, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
396
+ /* 122 : z */ { 0 },
397
+ /* 123 : { */ { 0 },
398
+ /* 124 : | */ { 0 },
399
+ /* 125 : } */ { 0 },
400
+ /* 126 : ~ */ { 0 },
401
+ };
402
+
403
+
404
+ static VALUE
405
+ rb_some_text_width(VALUE text, float default_width, float char_widths[127], float kernings[127][127]) {
406
+ char *text_value = StringValueCStr(text);
407
+
408
+ double max = 0;
409
+ double total = 0;
410
+ char ch = 0;
411
+ char nch = 0;
412
+ int i = 0;
413
+
414
+ for (i = 0; i < strlen(text_value); i++) {
415
+ ch = text_value[i];
416
+ nch = text_value[i + 1];
417
+
418
+ if (ch == 10) {
419
+ if (total > max) max = total;
420
+ total = 0;
421
+ }
422
+
423
+ if (ch < 32) continue;
424
+
425
+ if (ch > 126) {
426
+ total += default_width;
427
+ } else if (kernings[ch][nch]) {
428
+ total += kernings[ch][nch];
429
+ i++;
430
+ } else {
431
+ total += char_widths[ch];
432
+ }
433
+ }
434
+ if (total > max) max = total;
435
+
436
+ return DBL2NUM(max);
437
+ }
438
+
439
+ static VALUE
440
+ rb_arial_text_width(VALUE self, VALUE text) {
441
+ return rb_some_text_width(text, ARIAL_DEFAULT, ARIAL_CHAR_WIDTH, ARIAL_KERNING);
442
+ }
443
+
444
+ static VALUE
445
+ rb_calibri_text_width(VALUE self, VALUE text) {
446
+ return rb_some_text_width(text, CALIBRI_DEFAULT, CALIBRI_CHAR_WIDTH, CALIBRI_KERNING);
447
+ }
448
+
449
+ static VALUE
450
+ rb_times_new_roman_text_width(VALUE self, VALUE text) {
451
+ return rb_some_text_width(text, TIMES_NEW_ROMAN_DEFAULT, TIMES_NEW_ROMAN_CHAR_WIDTH, TIMES_NEW_ROMAN_KERNING);
452
+ }
453
+
454
+ void Init_text_width_ext()
455
+ {
456
+ VALUE fastExcel = rb_define_module("FastExcel");
457
+ rb_define_singleton_method(fastExcel, "arial_text_width", rb_arial_text_width, 1);
458
+ rb_define_singleton_method(fastExcel, "calibri_text_width", rb_calibri_text_width, 1);
459
+ rb_define_singleton_method(fastExcel, "times_new_roman_text_width", rb_times_new_roman_text_width, 1);
460
+ }