hexapdf 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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