hexapdf 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +46 -0
  3. data/CONTRIBUTERS +1 -1
  4. data/README.md +5 -5
  5. data/VERSION +1 -1
  6. data/examples/emoji-smile.png +0 -0
  7. data/examples/emoji-wink.png +0 -0
  8. data/examples/graphics.rb +9 -8
  9. data/examples/standard_pdf_fonts.rb +2 -1
  10. data/examples/text_box_alignment.rb +47 -0
  11. data/examples/text_box_inline_boxes.rb +56 -0
  12. data/examples/text_box_line_wrapping.rb +57 -0
  13. data/examples/text_box_shapes.rb +166 -0
  14. data/examples/text_box_styling.rb +72 -0
  15. data/examples/truetype.rb +3 -4
  16. data/lib/hexapdf/cli/optimize.rb +2 -2
  17. data/lib/hexapdf/configuration.rb +8 -6
  18. data/lib/hexapdf/content/canvas.rb +8 -5
  19. data/lib/hexapdf/content/parser.rb +3 -2
  20. data/lib/hexapdf/content/processor.rb +14 -3
  21. data/lib/hexapdf/document.rb +1 -0
  22. data/lib/hexapdf/document/fonts.rb +2 -1
  23. data/lib/hexapdf/document/pages.rb +23 -0
  24. data/lib/hexapdf/font/invalid_glyph.rb +78 -0
  25. data/lib/hexapdf/font/true_type/font.rb +14 -3
  26. data/lib/hexapdf/font/true_type/table.rb +1 -0
  27. data/lib/hexapdf/font/true_type/table/cmap.rb +1 -1
  28. data/lib/hexapdf/font/true_type/table/cmap_subtable.rb +1 -0
  29. data/lib/hexapdf/font/true_type/table/glyf.rb +4 -0
  30. data/lib/hexapdf/font/true_type/table/kern.rb +170 -0
  31. data/lib/hexapdf/font/true_type/table/post.rb +5 -1
  32. data/lib/hexapdf/font/true_type_wrapper.rb +71 -24
  33. data/lib/hexapdf/font/type1/afm_parser.rb +3 -2
  34. data/lib/hexapdf/font/type1/character_metrics.rb +0 -9
  35. data/lib/hexapdf/font/type1/font.rb +11 -0
  36. data/lib/hexapdf/font/type1/font_metrics.rb +6 -1
  37. data/lib/hexapdf/font/type1_wrapper.rb +51 -7
  38. data/lib/hexapdf/font_loader/standard14.rb +1 -1
  39. data/lib/hexapdf/layout.rb +51 -0
  40. data/lib/hexapdf/layout/inline_box.rb +95 -0
  41. data/lib/hexapdf/layout/line_fragment.rb +333 -0
  42. data/lib/hexapdf/layout/numeric_refinements.rb +56 -0
  43. data/lib/hexapdf/layout/style.rb +365 -0
  44. data/lib/hexapdf/layout/text_box.rb +727 -0
  45. data/lib/hexapdf/layout/text_fragment.rb +206 -0
  46. data/lib/hexapdf/layout/text_shaper.rb +155 -0
  47. data/lib/hexapdf/task.rb +0 -1
  48. data/lib/hexapdf/task/dereference.rb +1 -1
  49. data/lib/hexapdf/tokenizer.rb +3 -2
  50. data/lib/hexapdf/type/font_descriptor.rb +2 -1
  51. data/lib/hexapdf/type/font_type0.rb +3 -1
  52. data/lib/hexapdf/type/form.rb +12 -4
  53. data/lib/hexapdf/version.rb +1 -1
  54. data/test/hexapdf/common_tokenizer_tests.rb +7 -0
  55. data/test/hexapdf/content/common.rb +8 -0
  56. data/test/hexapdf/content/test_canvas.rb +10 -22
  57. data/test/hexapdf/content/test_processor.rb +4 -1
  58. data/test/hexapdf/document/test_pages.rb +16 -0
  59. data/test/hexapdf/font/test_invalid_glyph.rb +34 -0
  60. data/test/hexapdf/font/test_true_type_wrapper.rb +25 -11
  61. data/test/hexapdf/font/test_type1_wrapper.rb +26 -10
  62. data/test/hexapdf/font/true_type/table/common.rb +27 -0
  63. data/test/hexapdf/font/true_type/table/test_cmap.rb +14 -20
  64. data/test/hexapdf/font/true_type/table/test_cmap_subtable.rb +7 -0
  65. data/test/hexapdf/font/true_type/table/test_glyf.rb +8 -6
  66. data/test/hexapdf/font/true_type/table/test_head.rb +9 -13
  67. data/test/hexapdf/font/true_type/table/test_hhea.rb +16 -23
  68. data/test/hexapdf/font/true_type/table/test_hmtx.rb +4 -7
  69. data/test/hexapdf/font/true_type/table/test_kern.rb +61 -0
  70. data/test/hexapdf/font/true_type/table/test_loca.rb +7 -13
  71. data/test/hexapdf/font/true_type/table/test_maxp.rb +4 -9
  72. data/test/hexapdf/font/true_type/table/test_name.rb +14 -17
  73. data/test/hexapdf/font/true_type/table/test_os2.rb +3 -5
  74. data/test/hexapdf/font/true_type/table/test_post.rb +21 -19
  75. data/test/hexapdf/font/true_type/test_font.rb +4 -0
  76. data/test/hexapdf/font/type1/common.rb +6 -0
  77. data/test/hexapdf/font/type1/test_afm_parser.rb +9 -0
  78. data/test/hexapdf/font/type1/test_font.rb +6 -0
  79. data/test/hexapdf/layout/test_inline_box.rb +40 -0
  80. data/test/hexapdf/layout/test_line_fragment.rb +206 -0
  81. data/test/hexapdf/layout/test_style.rb +143 -0
  82. data/test/hexapdf/layout/test_text_box.rb +640 -0
  83. data/test/hexapdf/layout/test_text_fragment.rb +208 -0
  84. data/test/hexapdf/layout/test_text_shaper.rb +64 -0
  85. data/test/hexapdf/task/test_dereference.rb +1 -0
  86. data/test/hexapdf/test_writer.rb +2 -2
  87. data/test/hexapdf/type/test_font_descriptor.rb +4 -2
  88. data/test/hexapdf/type/test_font_type0.rb +7 -0
  89. data/test/hexapdf/type/test_form.rb +12 -0
  90. metadata +29 -2
@@ -0,0 +1,208 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'test_helper'
4
+ require_relative '../content/common'
5
+ require 'hexapdf/document'
6
+ require 'hexapdf/layout/text_fragment'
7
+
8
+ # Numeric values were manually calculated using the information from the AFM file.
9
+ describe HexaPDF::Layout::TextFragment do
10
+ before do
11
+ @doc = HexaPDF::Document.new
12
+ @font = @doc.fonts.load("Times", custom_encoding: true)
13
+ end
14
+
15
+ def setup_fragment(items, text_rise = 0)
16
+ style = HexaPDF::Layout::Style.new(font: @font, font_size: 20,
17
+ horizontal_scaling: 200, character_spacing: 1,
18
+ word_spacing: 2, text_rise: text_rise)
19
+ @fragment = HexaPDF::Layout::TextFragment.new(items: items, style: style)
20
+ end
21
+
22
+ it "creates a TextFragment from text and options" do
23
+ frag = HexaPDF::Layout::TextFragment.create("Tom", font: @font, font_size: 20,
24
+ font_features: {kern: true})
25
+ assert_equal(4, frag.items.length)
26
+ assert_equal(36.18, frag.width)
27
+ assert_equal(13.66 + 4.34, frag.height)
28
+ end
29
+
30
+ it "returns :text for valign" do
31
+ assert_equal(:text, setup_fragment([]).valign)
32
+ end
33
+
34
+ it "draws the text onto the canvas" do
35
+ setup_fragment(@font.decode_utf8('H'), 2)
36
+ canvas = @doc.pages.add.canvas
37
+ @fragment.draw(canvas, 10, 15)
38
+ assert_operators(canvas.contents,
39
+ [[:begin_text],
40
+ [:set_text_matrix, [1, 0, 0, 1, 10, 15]],
41
+ [:set_font_and_size, [:F1, 20]],
42
+ [:set_leading, [24.0]],
43
+ [:set_horizontal_scaling, [200]],
44
+ [:set_character_spacing, [1]],
45
+ [:set_word_spacing, [2]],
46
+ [:set_text_rise, [2]],
47
+ [:show_text_with_positioning, [['!']]]])
48
+ end
49
+
50
+ describe "empty fragment" do
51
+ before do
52
+ setup_fragment([])
53
+ end
54
+
55
+ it "calculates the x_min" do
56
+ assert_equal(0, @fragment.x_min)
57
+ end
58
+
59
+ it "calculates the x_max" do
60
+ assert_equal(0, @fragment.x_max)
61
+ end
62
+
63
+ it "calculates the y_min" do
64
+ assert_equal(-4.34, @fragment.y_min)
65
+ end
66
+
67
+ it "calculates the y_max" do
68
+ assert_equal(13.66, @fragment.y_max)
69
+ end
70
+
71
+ it "calculates the width" do
72
+ assert_equal(0, @fragment.width)
73
+ end
74
+
75
+ it "calculates the height" do
76
+ assert_equal(13.66 + 4.34, @fragment.height)
77
+ end
78
+ end
79
+
80
+ describe "normal text" do
81
+ before do
82
+ setup_fragment(@font.decode_utf8("Hal lo").insert(2, -35).insert(1, -10))
83
+ end
84
+
85
+ it "calculates the x_min" do
86
+ assert_in_delta(0.76, @fragment.x_min)
87
+ end
88
+
89
+ it "calculates the x_max" do
90
+ assert_in_delta(116.68 - 1.2 - 2, @fragment.x_max)
91
+ end
92
+
93
+ it "calculates the exact y_min" do
94
+ assert_in_delta(-0.2, @fragment.exact_y_min)
95
+ end
96
+
97
+ it "calculates the exact y_max" do
98
+ assert_in_delta(13.66, @fragment.exact_y_max)
99
+ end
100
+
101
+ it "calculates the y_min" do
102
+ assert_in_delta(-4.34, @fragment.y_min)
103
+ end
104
+
105
+ it "calculates the y_max" do
106
+ assert_in_delta(13.66, @fragment.y_max)
107
+ end
108
+
109
+ it "calculates the width" do
110
+ assert_in_delta(116.68, @fragment.width)
111
+ end
112
+
113
+ it "calculates the height" do
114
+ assert_in_delta(13.66 + 4.34, @fragment.height)
115
+ end
116
+ end
117
+
118
+ describe "with a positive text rise" do
119
+ before do
120
+ setup_fragment(@font.decode_utf8("l,"), 4)
121
+ end
122
+
123
+ it "calculates the y_min" do
124
+ assert_in_delta(-4.34 + 4, @fragment.y_min)
125
+ end
126
+
127
+ it "calculates the y_max" do
128
+ assert_in_delta(13.66 + 4, @fragment.y_max)
129
+ end
130
+
131
+ it "calculates the height" do
132
+ assert_in_delta(13.66 + 4 + 0.34, @fragment.height)
133
+ end
134
+ end
135
+
136
+ describe "with a negative text rise" do
137
+ before do
138
+ setup_fragment(@font.decode_utf8("l,"), -15)
139
+ end
140
+
141
+ it "calculates the y_min" do
142
+ assert_in_delta(-4.34 - 15, @fragment.y_min)
143
+ end
144
+
145
+ it "calculates the y_max" do
146
+ assert_in_delta(13.66 - 15, @fragment.y_max)
147
+ end
148
+
149
+ it "calculates the height" do
150
+ assert_in_delta(4.34 + 15, @fragment.height)
151
+ end
152
+ end
153
+
154
+ describe "with a glyph without outline as last item" do
155
+ before do
156
+ setup_fragment(@font.decode_utf8("H "))
157
+ end
158
+
159
+ it "calculates the x_max" do
160
+ assert_in_delta(46.88 - 2 - 4, @fragment.x_max)
161
+ end
162
+
163
+ it "calculates the width" do
164
+ assert_in_delta(46.88, @fragment.width)
165
+ end
166
+ end
167
+
168
+ describe "with a glyph with x_min < 0 and x_max > width as first and last item" do
169
+ before do
170
+ setup_fragment(@font.decode_utf8("\u{2044}o\u{2044}".unicode_normalize(:nfd)))
171
+ end
172
+
173
+ it "calculates the x_min" do
174
+ assert_in_delta(-6.72, @fragment.x_min)
175
+ end
176
+
177
+ it "calculates the x_max" do
178
+ assert_in_delta(39.36 + 6.56 - 2, @fragment.x_max)
179
+ end
180
+
181
+ it "calculates the width" do
182
+ assert_in_delta(39.36, @fragment.width)
183
+ end
184
+ end
185
+
186
+ describe "with positive kerning values as first and last items" do
187
+ before do
188
+ setup_fragment([100, 100] + @font.decode_utf8("Hallo") + [100, 100])
189
+ end
190
+
191
+ it "calculates the x_min" do
192
+ assert_in_delta(-7.24, @fragment.x_min)
193
+ end
194
+
195
+ it "calculates the x_max" do
196
+ assert_in_delta(82.88 - 1.2 - 2 - -4 - -4, @fragment.x_max)
197
+ end
198
+
199
+ it "calculates the width" do
200
+ assert_in_delta(82.88, @fragment.width)
201
+ end
202
+ end
203
+
204
+ it "can be inspected" do
205
+ frag = setup_fragment(@font.decode_utf8("H"))
206
+ assert_match(/:H/, frag.inspect)
207
+ end
208
+ end
@@ -0,0 +1,64 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'test_helper'
4
+ require_relative '../font/true_type/table/common'
5
+ require 'hexapdf/document'
6
+ require 'hexapdf/font/true_type_wrapper'
7
+ require 'hexapdf/layout/text_shaper'
8
+
9
+ using HexaPDF::Layout::NumericRefinements
10
+
11
+ describe HexaPDF::Layout::TextShaper do
12
+ before do
13
+ @doc = HexaPDF::Document.new
14
+ @shaper = HexaPDF::Layout::TextShaper.new
15
+ end
16
+
17
+ def setup_fragment(items, **options)
18
+ style = HexaPDF::Layout::Style.new(font: @font, font_size: 20, font_features: options)
19
+ HexaPDF::Layout::TextFragment.new(items: items, style: style)
20
+ end
21
+
22
+ describe "Type1 font features" do
23
+ before do
24
+ @font = @doc.fonts.load("Times", custom_encoding: true)
25
+ end
26
+
27
+ it "handles ligatures" do
28
+ fragment = setup_fragment(@font.decode_utf8('fish fish fi').insert(1, 100).
29
+ insert(0, 100), liga: true)
30
+ @shaper.shape_text(fragment)
31
+ assert_equal([100, :fi, :s, :h, :space, :fi, :s, :h, :space, :fi],
32
+ fragment.items.map {|item| item.kind_of?(Numeric) ? item : item.id})
33
+ end
34
+
35
+ it "handles kerning" do
36
+ fragment = setup_fragment(@font.decode_utf8('fish fish wow').insert(1, 100), kern: true)
37
+ @shaper.shape_text(fragment)
38
+ assert_equal([:f, 100, :i, :s, :h, :space, :f, 20, :i, :s, :h, :space, :w, 10, :o, 25, :w],
39
+ fragment.items.map {|item| item.kind_of?(Numeric) ? item : item.id})
40
+ end
41
+ end
42
+
43
+ describe "TrueType font features" do
44
+ before do
45
+ font_file = File.join(TEST_DATA_DIR, "fonts", "Ubuntu-Title.ttf")
46
+ @wrapped_font = HexaPDF::Font::TrueType::Font.new(File.open(font_file))
47
+ @font = HexaPDF::Font::TrueTypeWrapper.new(@doc, @wrapped_font)
48
+ end
49
+
50
+ it "handles kerning" do
51
+ data = [0, 1].pack('n2') << \
52
+ [0, 6 + 8 + 12, 0x1].pack('n3') << \
53
+ [2, 0, 0, 0, 53, 80, -20, 80, 81, -10].pack('n4n2s>n2s>')
54
+ table = create_table(:Kern, data, standalone: true)
55
+ @wrapped_font.instance_eval { @tables[:kern] = table }
56
+ fragment = setup_fragment(@font.decode_utf8('Top Top').insert(1, 100), kern: true)
57
+ @shaper.shape_text(fragment)
58
+ assert_equal([53, [100], 80, [10], 81, 3, 53, [20], 80, [10], 81],
59
+ fragment.items.map {|item| item.kind_of?(Numeric) ? [item] : item.id})
60
+ end
61
+ end
62
+ end
63
+
64
+
@@ -17,6 +17,7 @@ describe HexaPDF::Task::Dereference do
17
17
  pages = @doc.wrap(Type: :Pages)
18
18
  pages.add_page(@doc.wrap(Type: :Page))
19
19
  @doc.trailer[:Test2] = pages
20
+ @doc.trailer[:InvalidRef] = HexaPDF::Reference.new(5000, 2)
20
21
 
21
22
  checker = lambda do |val, done = {}|
22
23
  case val
@@ -40,7 +40,7 @@ startxref
40
40
  219
41
41
  %%EOF
42
42
  3 0 obj
43
- <</Producer(HexaPDF version 0.4.0)>>
43
+ <</Producer(HexaPDF version 0.5.0)>>
44
44
  endobj
45
45
  xref
46
46
  3 1
@@ -72,7 +72,7 @@ startxref
72
72
  141
73
73
  %%EOF
74
74
  6 0 obj
75
- <</Producer(HexaPDF version 0.4.0)>>
75
+ <</Producer(HexaPDF version 0.5.0)>>
76
76
  endobj
77
77
  2 0 obj
78
78
  <</Length 10>>stream
@@ -43,9 +43,11 @@ describe HexaPDF::Type::FontDescriptor do
43
43
  refute(@font_desc.validate)
44
44
  end
45
45
 
46
- it "fails if /Descent is not a negative number" do
46
+ it "updates the /Descent value if it is not a negative number" do
47
47
  @font_desc[:Descent] = 5
48
- refute(@font_desc.validate)
48
+ refute(@font_desc.validate(auto_correct: false))
49
+ assert(@font_desc.validate)
50
+ assert_equal(-5, @font_desc[:Descent])
49
51
  end
50
52
  end
51
53
  end
@@ -19,6 +19,13 @@ describe HexaPDF::Type::FontType0 do
19
19
  assert_equal(:vertical, font.writing_mode)
20
20
  end
21
21
 
22
+ it "resolves the descendant font object correctly" do
23
+ assert_equal(@cid_font, @font.descendant_font)
24
+ @doc.clear_cache
25
+ @font[:DescendantFonts] = [@cid_font.value]
26
+ assert_equal(@cid_font.value, @font.descendant_font.value)
27
+ end
28
+
22
29
  it "uses the descendant font for getting the width of a code point" do
23
30
  assert_equal(100, @font.width(0x2121))
24
31
  end
@@ -55,6 +55,18 @@ describe HexaPDF::Type::Form do
55
55
  processor = TestHelper::OperatorRecorder.new
56
56
  @form.process_contents(processor)
57
57
  assert_equal([[:set_line_width, [10]]], processor.recorded_ops)
58
+ assert_nil(@form[:Resources])
59
+
60
+ resources = @form.resources
61
+ @form.process_contents(processor)
62
+ assert_same(resources, processor.resources)
63
+ end
64
+
65
+ it "uses the provided resources if it has no resources itself" do
66
+ resources = @doc.wrap({}, type: :XXResources)
67
+ processor = TestHelper::OperatorRecorder.new
68
+ @form.process_contents(processor, original_resources: resources)
69
+ assert_same(resources, processor.resources)
58
70
  end
59
71
  end
60
72
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hexapdf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Leitner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-19 00:00:00.000000000 Z
11
+ date: 2017-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cmdparse
@@ -155,6 +155,8 @@ files:
155
155
  - data/hexapdf/encoding/glyphlist.txt
156
156
  - data/hexapdf/encoding/zapfdingbats.txt
157
157
  - examples/arc.rb
158
+ - examples/emoji-smile.png
159
+ - examples/emoji-wink.png
158
160
  - examples/graphics.rb
159
161
  - examples/hello_world.rb
160
162
  - examples/machupicchu.jpg
@@ -162,6 +164,11 @@ files:
162
164
  - examples/optimizing.rb
163
165
  - examples/show_char_bboxes.rb
164
166
  - examples/standard_pdf_fonts.rb
167
+ - examples/text_box_alignment.rb
168
+ - examples/text_box_inline_boxes.rb
169
+ - examples/text_box_line_wrapping.rb
170
+ - examples/text_box_shapes.rb
171
+ - examples/text_box_styling.rb
165
172
  - examples/truetype.rb
166
173
  - lib/hexapdf.rb
167
174
  - lib/hexapdf/cli.rb
@@ -229,6 +236,7 @@ files:
229
236
  - lib/hexapdf/font/encoding/symbol_encoding.rb
230
237
  - lib/hexapdf/font/encoding/win_ansi_encoding.rb
231
238
  - lib/hexapdf/font/encoding/zapf_dingbats_encoding.rb
239
+ - lib/hexapdf/font/invalid_glyph.rb
232
240
  - lib/hexapdf/font/true_type.rb
233
241
  - lib/hexapdf/font/true_type/builder.rb
234
242
  - lib/hexapdf/font/true_type/font.rb
@@ -242,6 +250,7 @@ files:
242
250
  - lib/hexapdf/font/true_type/table/head.rb
243
251
  - lib/hexapdf/font/true_type/table/hhea.rb
244
252
  - lib/hexapdf/font/true_type/table/hmtx.rb
253
+ - lib/hexapdf/font/true_type/table/kern.rb
245
254
  - lib/hexapdf/font/true_type/table/loca.rb
246
255
  - lib/hexapdf/font/true_type/table/maxp.rb
247
256
  - lib/hexapdf/font/true_type/table/name.rb
@@ -263,6 +272,14 @@ files:
263
272
  - lib/hexapdf/image_loader/pdf.rb
264
273
  - lib/hexapdf/image_loader/png.rb
265
274
  - lib/hexapdf/importer.rb
275
+ - lib/hexapdf/layout.rb
276
+ - lib/hexapdf/layout/inline_box.rb
277
+ - lib/hexapdf/layout/line_fragment.rb
278
+ - lib/hexapdf/layout/numeric_refinements.rb
279
+ - lib/hexapdf/layout/style.rb
280
+ - lib/hexapdf/layout/text_box.rb
281
+ - lib/hexapdf/layout/text_fragment.rb
282
+ - lib/hexapdf/layout/text_shaper.rb
266
283
  - lib/hexapdf/name_tree_node.rb
267
284
  - lib/hexapdf/number_tree_node.rb
268
285
  - lib/hexapdf/object.rb
@@ -423,9 +440,11 @@ files:
423
440
  - test/hexapdf/font/encoding/test_zapf_dingbats_encoding.rb
424
441
  - test/hexapdf/font/test_cmap.rb
425
442
  - test/hexapdf/font/test_encoding.rb
443
+ - test/hexapdf/font/test_invalid_glyph.rb
426
444
  - test/hexapdf/font/test_true_type_wrapper.rb
427
445
  - test/hexapdf/font/test_type1_wrapper.rb
428
446
  - test/hexapdf/font/true_type/common.rb
447
+ - test/hexapdf/font/true_type/table/common.rb
429
448
  - test/hexapdf/font/true_type/table/test_cmap.rb
430
449
  - test/hexapdf/font/true_type/table/test_cmap_subtable.rb
431
450
  - test/hexapdf/font/true_type/table/test_directory.rb
@@ -433,6 +452,7 @@ files:
433
452
  - test/hexapdf/font/true_type/table/test_head.rb
434
453
  - test/hexapdf/font/true_type/table/test_hhea.rb
435
454
  - test/hexapdf/font/true_type/table/test_hmtx.rb
455
+ - test/hexapdf/font/true_type/table/test_kern.rb
436
456
  - test/hexapdf/font/true_type/table/test_loca.rb
437
457
  - test/hexapdf/font/true_type/table/test_maxp.rb
438
458
  - test/hexapdf/font/true_type/table/test_name.rb
@@ -443,6 +463,7 @@ files:
443
463
  - test/hexapdf/font/true_type/test_optimizer.rb
444
464
  - test/hexapdf/font/true_type/test_subsetter.rb
445
465
  - test/hexapdf/font/true_type/test_table.rb
466
+ - test/hexapdf/font/type1/common.rb
446
467
  - test/hexapdf/font/type1/test_afm_parser.rb
447
468
  - test/hexapdf/font/type1/test_font.rb
448
469
  - test/hexapdf/font/type1/test_font_metrics.rb
@@ -452,6 +473,12 @@ files:
452
473
  - test/hexapdf/image_loader/test_jpeg.rb
453
474
  - test/hexapdf/image_loader/test_pdf.rb
454
475
  - test/hexapdf/image_loader/test_png.rb
476
+ - test/hexapdf/layout/test_inline_box.rb
477
+ - test/hexapdf/layout/test_line_fragment.rb
478
+ - test/hexapdf/layout/test_style.rb
479
+ - test/hexapdf/layout/test_text_box.rb
480
+ - test/hexapdf/layout/test_text_fragment.rb
481
+ - test/hexapdf/layout/test_text_shaper.rb
455
482
  - test/hexapdf/task/test_dereference.rb
456
483
  - test/hexapdf/task/test_optimize.rb
457
484
  - test/hexapdf/test_configuration.rb