prawn 2.1.0 → 2.2.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 (278) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +2 -0
  3. data.tar.gz.sig +0 -0
  4. data/Gemfile +1 -9
  5. data/Rakefile +12 -22
  6. data/lib/prawn.rb +29 -48
  7. data/lib/prawn/document.rb +148 -123
  8. data/lib/prawn/document/bounding_box.rb +33 -26
  9. data/lib/prawn/document/column_box.rb +5 -7
  10. data/lib/prawn/document/internals.rb +6 -6
  11. data/lib/prawn/document/span.rb +20 -17
  12. data/lib/prawn/encoding.rb +65 -67
  13. data/lib/prawn/errors.rb +10 -7
  14. data/lib/prawn/font.rb +78 -62
  15. data/lib/prawn/font/afm.rb +93 -66
  16. data/lib/prawn/font/dfont.rb +2 -10
  17. data/lib/prawn/font/ttc.rb +34 -0
  18. data/lib/prawn/font/ttf.rb +73 -65
  19. data/lib/prawn/font_metric_cache.rb +9 -8
  20. data/lib/prawn/graphics.rb +110 -70
  21. data/lib/prawn/graphics/blend_mode.rb +7 -8
  22. data/lib/prawn/graphics/cap_style.rb +2 -4
  23. data/lib/prawn/graphics/color.rb +23 -26
  24. data/lib/prawn/graphics/dash.rb +22 -12
  25. data/lib/prawn/graphics/join_style.rb +8 -4
  26. data/lib/prawn/graphics/patterns.rb +185 -96
  27. data/lib/prawn/graphics/transformation.rb +11 -9
  28. data/lib/prawn/graphics/transparency.rb +15 -13
  29. data/lib/prawn/grid.rb +20 -20
  30. data/lib/prawn/image_handler.rb +4 -6
  31. data/lib/prawn/images.rb +22 -15
  32. data/lib/prawn/images/image.rb +0 -1
  33. data/lib/prawn/images/jpg.rb +26 -22
  34. data/lib/prawn/images/png.rb +60 -57
  35. data/lib/prawn/measurement_extensions.rb +8 -9
  36. data/lib/prawn/measurements.rb +14 -15
  37. data/lib/prawn/outline.rb +96 -78
  38. data/lib/prawn/repeater.rb +12 -10
  39. data/lib/prawn/security.rb +66 -48
  40. data/lib/prawn/security/arcfour.rb +1 -3
  41. data/lib/prawn/soft_mask.rb +23 -25
  42. data/lib/prawn/stamp.rb +16 -12
  43. data/lib/prawn/text.rb +59 -45
  44. data/lib/prawn/text/box.rb +9 -8
  45. data/lib/prawn/text/formatted.rb +4 -6
  46. data/lib/prawn/text/formatted/arranger.rb +51 -30
  47. data/lib/prawn/text/formatted/box.rb +112 -88
  48. data/lib/prawn/text/formatted/fragment.rb +10 -15
  49. data/lib/prawn/text/formatted/line_wrap.rb +118 -61
  50. data/lib/prawn/text/formatted/parser.rb +134 -110
  51. data/lib/prawn/text/formatted/wrap.rb +42 -32
  52. data/lib/prawn/transformation_stack.rb +3 -4
  53. data/lib/prawn/utilities.rb +6 -21
  54. data/lib/prawn/version.rb +1 -3
  55. data/lib/prawn/view.rb +4 -2
  56. data/manual/basic_concepts/adding_pages.rb +4 -7
  57. data/manual/basic_concepts/basic_concepts.rb +29 -22
  58. data/manual/basic_concepts/creation.rb +8 -11
  59. data/manual/basic_concepts/cursor.rb +2 -5
  60. data/manual/basic_concepts/measurement.rb +3 -6
  61. data/manual/basic_concepts/origin.rb +3 -6
  62. data/manual/basic_concepts/other_cursor_helpers.rb +9 -12
  63. data/manual/basic_concepts/view.rb +20 -16
  64. data/manual/bounding_box/bounding_box.rb +27 -24
  65. data/manual/bounding_box/bounds.rb +9 -12
  66. data/manual/bounding_box/canvas.rb +2 -5
  67. data/manual/bounding_box/creation.rb +4 -7
  68. data/manual/bounding_box/indentation.rb +12 -15
  69. data/manual/bounding_box/nesting.rb +22 -17
  70. data/manual/bounding_box/russian_boxes.rb +8 -9
  71. data/manual/bounding_box/stretchy.rb +10 -13
  72. data/manual/contents.rb +26 -22
  73. data/manual/cover.rb +22 -20
  74. data/manual/document_and_page_options/background.rb +9 -13
  75. data/manual/document_and_page_options/document_and_page_options.rb +23 -20
  76. data/manual/document_and_page_options/metadata.rb +16 -16
  77. data/manual/document_and_page_options/page_margins.rb +16 -20
  78. data/manual/document_and_page_options/page_size.rb +11 -12
  79. data/manual/document_and_page_options/print_scaling.rb +15 -15
  80. data/manual/example_helper.rb +2 -4
  81. data/manual/graphics/blend_mode.rb +10 -9
  82. data/manual/graphics/circle_and_ellipse.rb +2 -5
  83. data/manual/graphics/color.rb +5 -9
  84. data/manual/graphics/common_lines.rb +5 -8
  85. data/manual/graphics/fill_and_stroke.rb +2 -5
  86. data/manual/graphics/fill_rules.rb +7 -10
  87. data/manual/graphics/gradients.rb +25 -21
  88. data/manual/graphics/graphics.rb +49 -43
  89. data/manual/graphics/helper.rb +10 -9
  90. data/manual/graphics/line_width.rb +5 -7
  91. data/manual/graphics/lines_and_curves.rb +5 -8
  92. data/manual/graphics/polygon.rb +4 -8
  93. data/manual/graphics/rectangle.rb +2 -5
  94. data/manual/graphics/rotate.rb +4 -7
  95. data/manual/graphics/scale.rb +12 -15
  96. data/manual/graphics/soft_masks.rb +1 -4
  97. data/manual/graphics/stroke_cap.rb +3 -6
  98. data/manual/graphics/stroke_dash.rb +9 -12
  99. data/manual/graphics/stroke_join.rb +2 -5
  100. data/manual/graphics/translate.rb +7 -10
  101. data/manual/graphics/transparency.rb +5 -8
  102. data/manual/how_to_read_this_manual.rb +4 -6
  103. data/manual/images/absolute_position.rb +4 -7
  104. data/manual/images/fit.rb +5 -8
  105. data/manual/images/horizontal.rb +6 -9
  106. data/manual/images/images.rb +25 -23
  107. data/manual/images/plain_image.rb +3 -6
  108. data/manual/images/scale.rb +7 -10
  109. data/manual/images/vertical.rb +10 -13
  110. data/manual/images/width_and_height.rb +8 -11
  111. data/manual/layout/boxes.rb +3 -6
  112. data/manual/layout/content.rb +5 -8
  113. data/manual/layout/layout.rb +16 -16
  114. data/manual/layout/simple_grid.rb +4 -7
  115. data/manual/outline/add_subsection_to.rb +18 -21
  116. data/manual/outline/insert_section_after.rb +13 -16
  117. data/manual/outline/outline.rb +19 -17
  118. data/manual/outline/sections_and_pages.rb +15 -18
  119. data/manual/repeatable_content/alternate_page_numbering.rb +19 -17
  120. data/manual/repeatable_content/page_numbering.rb +15 -16
  121. data/manual/repeatable_content/repeatable_content.rb +23 -19
  122. data/manual/repeatable_content/repeater.rb +12 -15
  123. data/manual/repeatable_content/stamp.rb +12 -15
  124. data/manual/security/encryption.rb +7 -10
  125. data/manual/security/permissions.rb +17 -14
  126. data/manual/security/security.rb +17 -16
  127. data/manual/table.rb +2 -4
  128. data/manual/text/alignment.rb +14 -17
  129. data/manual/text/color.rb +10 -11
  130. data/manual/text/column_box.rb +5 -8
  131. data/manual/text/fallback_fonts.rb +23 -21
  132. data/manual/text/font.rb +9 -12
  133. data/manual/text/font_size.rb +11 -14
  134. data/manual/text/font_style.rb +4 -7
  135. data/manual/text/formatted_callbacks.rb +23 -21
  136. data/manual/text/formatted_text.rb +31 -25
  137. data/manual/text/free_flowing_text.rb +18 -21
  138. data/manual/text/inline.rb +16 -19
  139. data/manual/text/kerning_and_character_spacing.rb +12 -15
  140. data/manual/text/leading.rb +5 -8
  141. data/manual/text/line_wrapping.rb +33 -17
  142. data/manual/text/paragraph_indentation.rb +11 -14
  143. data/manual/text/positioned_text.rb +13 -16
  144. data/manual/text/registering_families.rb +16 -19
  145. data/manual/text/rendering_and_color.rb +7 -10
  146. data/manual/text/right_to_left_text.rb +24 -19
  147. data/manual/text/rotation.rb +26 -23
  148. data/manual/text/single_usage.rb +6 -9
  149. data/manual/text/text.rb +56 -52
  150. data/manual/text/text_box_excess.rb +18 -17
  151. data/manual/text/text_box_extensions.rb +16 -15
  152. data/manual/text/text_box_overflow.rb +15 -18
  153. data/manual/text/utf8.rb +9 -12
  154. data/manual/text/win_ansi_charset.rb +18 -19
  155. data/prawn.gemspec +37 -27
  156. data/spec/extensions/encoding_helpers.rb +0 -2
  157. data/spec/manual_spec.rb +33 -0
  158. data/spec/prawn/document/bounding_box_spec.rb +546 -0
  159. data/spec/prawn/document/column_box_spec.rb +73 -0
  160. data/spec/prawn/document/security_spec.rb +173 -0
  161. data/spec/prawn/document_annotations_spec.rb +74 -0
  162. data/spec/prawn/document_destinations_spec.rb +13 -0
  163. data/spec/prawn/document_grid_spec.rb +96 -0
  164. data/spec/prawn/document_reference_spec.rb +25 -0
  165. data/spec/prawn/document_span_spec.rb +34 -0
  166. data/spec/prawn/document_spec.rb +751 -0
  167. data/spec/prawn/font_metric_cache_spec.rb +52 -0
  168. data/spec/prawn/font_spec.rb +513 -0
  169. data/spec/prawn/graphics/blend_mode_spec.rb +61 -0
  170. data/spec/prawn/graphics/transparency_spec.rb +79 -0
  171. data/spec/prawn/graphics_spec.rb +817 -0
  172. data/spec/prawn/graphics_stroke_styles_spec.rb +227 -0
  173. data/spec/{image_handler_spec.rb → prawn/image_handler_spec.rb} +13 -15
  174. data/spec/prawn/images/jpg_spec.rb +18 -0
  175. data/spec/prawn/images/png_spec.rb +281 -0
  176. data/spec/prawn/images_spec.rb +170 -0
  177. data/spec/prawn/measurements_extensions_spec.rb +22 -0
  178. data/spec/prawn/outline_spec.rb +408 -0
  179. data/spec/prawn/repeater_spec.rb +163 -0
  180. data/spec/prawn/soft_mask_spec.rb +72 -0
  181. data/spec/prawn/stamp_spec.rb +168 -0
  182. data/spec/prawn/text/box_spec.rb +1113 -0
  183. data/spec/prawn/text/formatted/arranger_spec.rb +464 -0
  184. data/spec/prawn/text/formatted/box_spec.rb +825 -0
  185. data/spec/prawn/text/formatted/fragment_spec.rb +341 -0
  186. data/spec/prawn/text/formatted/line_wrap_spec.rb +491 -0
  187. data/spec/prawn/text/formatted/parser_spec.rb +667 -0
  188. data/spec/prawn/text_draw_text_spec.rb +147 -0
  189. data/spec/prawn/text_rendering_mode_spec.rb +42 -0
  190. data/spec/prawn/text_spacing_spec.rb +93 -0
  191. data/spec/prawn/text_spec.rb +601 -0
  192. data/spec/prawn/text_with_inline_formatting_spec.rb +33 -0
  193. data/spec/{transformation_stack_spec.rb → prawn/transformation_stack_spec.rb} +21 -20
  194. data/spec/prawn/view_spec.rb +45 -0
  195. data/spec/spec_helper.rb +16 -16
  196. metadata +96 -151
  197. metadata.gz.sig +1 -0
  198. data/data/images/16bit.alpha +0 -0
  199. data/data/images/16bit.color +0 -0
  200. data/data/images/16bit.png +0 -0
  201. data/data/images/arrow.png +0 -0
  202. data/data/images/arrow2.png +0 -0
  203. data/data/images/blend_modes_bottom_layer.jpg +0 -0
  204. data/data/images/blend_modes_top_layer.jpg +0 -0
  205. data/data/images/dice.alpha +0 -0
  206. data/data/images/dice.color +0 -0
  207. data/data/images/dice.png +0 -0
  208. data/data/images/dice_interlaced.png +0 -0
  209. data/data/images/fractal.jpg +0 -0
  210. data/data/images/indexed_color.dat +0 -0
  211. data/data/images/indexed_color.png +0 -0
  212. data/data/images/indexed_transparency.png +0 -0
  213. data/data/images/indexed_transparency_alpha.dat +0 -0
  214. data/data/images/indexed_transparency_color.dat +0 -0
  215. data/data/images/letterhead.jpg +0 -0
  216. data/data/images/license.md +0 -8
  217. data/data/images/page_white_text.alpha +0 -0
  218. data/data/images/page_white_text.color +0 -0
  219. data/data/images/page_white_text.png +0 -0
  220. data/data/images/pigs.jpg +0 -0
  221. data/data/images/prawn.png +0 -0
  222. data/data/images/ruport.png +0 -0
  223. data/data/images/ruport_data.dat +0 -0
  224. data/data/images/ruport_transparent.png +0 -0
  225. data/data/images/ruport_type0.png +0 -0
  226. data/data/images/stef.jpg +0 -0
  227. data/data/images/tru256.bmp +0 -0
  228. data/data/images/web-links.dat +0 -1
  229. data/data/images/web-links.png +0 -0
  230. data/data/pdfs/complex_template.pdf +0 -0
  231. data/data/pdfs/contains_ttf_font.pdf +0 -0
  232. data/data/pdfs/encrypted.pdf +0 -0
  233. data/data/pdfs/form.pdf +1 -819
  234. data/data/pdfs/hexagon.pdf +0 -61
  235. data/data/pdfs/indirect_reference.pdf +0 -86
  236. data/data/pdfs/multipage_template.pdf +0 -127
  237. data/data/pdfs/nested_pages.pdf +0 -118
  238. data/data/pdfs/page_without_mediabox.pdf +0 -193
  239. data/data/pdfs/resources_as_indirect_object.pdf +0 -83
  240. data/data/pdfs/two_hexagons.pdf +0 -90
  241. data/data/pdfs/version_1_6.pdf +0 -61
  242. data/data/shift_jis_text.txt +0 -1
  243. data/spec/acceptance/png_spec.rb +0 -35
  244. data/spec/annotations_spec.rb +0 -67
  245. data/spec/blend_mode_spec.rb +0 -71
  246. data/spec/bounding_box_spec.rb +0 -501
  247. data/spec/column_box_spec.rb +0 -59
  248. data/spec/destinations_spec.rb +0 -13
  249. data/spec/document_spec.rb +0 -738
  250. data/spec/font_metric_cache_spec.rb +0 -52
  251. data/spec/font_spec.rb +0 -475
  252. data/spec/formatted_text_arranger_spec.rb +0 -452
  253. data/spec/formatted_text_box_spec.rb +0 -716
  254. data/spec/formatted_text_fragment_spec.rb +0 -299
  255. data/spec/graphics_spec.rb +0 -705
  256. data/spec/grid_spec.rb +0 -95
  257. data/spec/images_spec.rb +0 -167
  258. data/spec/inline_formatted_text_parser_spec.rb +0 -568
  259. data/spec/jpg_spec.rb +0 -23
  260. data/spec/line_wrap_spec.rb +0 -366
  261. data/spec/measurement_units_spec.rb +0 -22
  262. data/spec/outline_spec.rb +0 -409
  263. data/spec/png_spec.rb +0 -257
  264. data/spec/reference_spec.rb +0 -25
  265. data/spec/repeater_spec.rb +0 -154
  266. data/spec/security_spec.rb +0 -151
  267. data/spec/soft_mask_spec.rb +0 -78
  268. data/spec/span_spec.rb +0 -43
  269. data/spec/stamp_spec.rb +0 -179
  270. data/spec/stroke_styles_spec.rb +0 -208
  271. data/spec/text_at_spec.rb +0 -142
  272. data/spec/text_box_spec.rb +0 -1042
  273. data/spec/text_rendering_mode_spec.rb +0 -45
  274. data/spec/text_spacing_spec.rb +0 -93
  275. data/spec/text_spec.rb +0 -543
  276. data/spec/text_with_inline_formatting_spec.rb +0 -35
  277. data/spec/transparency_spec.rb +0 -91
  278. data/spec/view_spec.rb +0 -42
@@ -1,52 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
- require 'pathname'
5
-
6
- describe "Font metrics caching" do
7
- let(:document) { Prawn::Document.new }
8
-
9
- subject { Prawn::FontMetricCache.new(document) }
10
-
11
- it "should start with an empty cache" do
12
- expect(subject.instance_variable_get(:@cache)).to be_empty
13
- end
14
-
15
- it "should cache the width of the provided string" do
16
- subject.width_of('M', {})
17
-
18
- expect(subject.instance_variable_get(:@cache).size).to eq(1)
19
- end
20
-
21
- it "should only cache a single copy of the same string" do
22
- subject.width_of('M', {})
23
- subject.width_of('M', {})
24
-
25
- expect(subject.instance_variable_get(:@cache).size).to eq(1)
26
- end
27
-
28
- it "should cache different copies for different strings" do
29
- subject.width_of('M', {})
30
- subject.width_of('W', {})
31
-
32
- expect(subject.instance_variable_get(:@cache).entries.size).to eq(2)
33
- end
34
-
35
- it "should cache different copies of the same string with different font sizes" do
36
- subject.width_of('M', {})
37
-
38
- document.font_size 24
39
- subject.width_of('M', {})
40
-
41
- expect(subject.instance_variable_get(:@cache).entries.size).to eq(2)
42
- end
43
-
44
- it "should cache different copies of the same string with different fonts" do
45
- subject.width_of('M', {})
46
-
47
- document.font 'Courier'
48
- subject.width_of('M', {})
49
-
50
- expect(subject.instance_variable_get(:@cache).entries.size).to eq(2)
51
- end
52
- end
@@ -1,475 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
- require 'pathname'
5
-
6
- describe "Font behavior" do
7
- it "should default to Helvetica if no font is specified" do
8
- @pdf = Prawn::Document.new
9
- expect(@pdf.font.name).to eq("Helvetica")
10
- end
11
- end
12
-
13
- describe "Font objects" do
14
- it "should be equal" do
15
- font1 = Prawn::Document.new.font
16
- font2 = Prawn::Document.new.font
17
-
18
- expect(font1).to eql(font2)
19
- end
20
-
21
- it "should always be the same key" do
22
- font1 = Prawn::Document.new.font
23
- font2 = Prawn::Document.new.font
24
-
25
- hash = {}
26
-
27
- hash[ font1 ] = "Original"
28
- hash[ font2 ] = "Overwritten"
29
-
30
- expect(hash.size).to eq(1)
31
-
32
- expect(hash[ font1 ]).to eq("Overwritten")
33
- expect(hash[ font2 ]).to eq("Overwritten")
34
- end
35
- end
36
-
37
- describe "#width_of" do
38
- it "should take character spacing into account" do
39
- create_pdf
40
- original_width = @pdf.width_of("hello world")
41
- @pdf.character_spacing(7) do
42
- expect(@pdf.width_of("hello world")).to eq(original_width + 11 * 7)
43
- end
44
- end
45
-
46
- it "should exclude newlines" do
47
- create_pdf
48
- # Use a TTF font that has a non-zero width for \n
49
- @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf")
50
-
51
- expect(@pdf.width_of("\nhello world\n")).to eq(
52
- @pdf.width_of("hello world")
53
- )
54
- end
55
-
56
- it "should take formatting into account" do
57
- create_pdf
58
-
59
- normal_hello = @pdf.width_of("hello")
60
- inline_bold_hello = @pdf.width_of("<b>hello</b>", :inline_format => true)
61
- @pdf.font("Helvetica", :style => :bold) {
62
- @bold_hello = @pdf.width_of("hello")
63
- }
64
-
65
- expect(inline_bold_hello).to be > normal_hello
66
- expect(inline_bold_hello).to eq(@bold_hello)
67
- end
68
-
69
- it "should accept :style as an argument" do
70
- create_pdf
71
-
72
- styled_bold_hello = @pdf.width_of("hello", :style => :bold)
73
- @pdf.font("Helvetica", :style => :bold) {
74
- @bold_hello = @pdf.width_of("hello")
75
- }
76
-
77
- expect(styled_bold_hello).to eq(@bold_hello)
78
- end
79
-
80
- it "should calculate styled widths correctly using TTFs" do
81
- create_pdf
82
-
83
- @pdf.font_families.update(
84
- 'DejaVu Sans' => {
85
- :normal => "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf",
86
- :bold => "#{Prawn::DATADIR}/fonts/DejaVuSans-Bold.ttf"
87
- }
88
- )
89
- @pdf.font("DejaVu Sans") {
90
- @styled_bold_hello = @pdf.width_of("hello", :style => :bold)
91
- }
92
- @pdf.font("DejaVu Sans", :style => :bold) {
93
- @bold_hello = @pdf.width_of("hello")
94
- }
95
-
96
- @pdf.font("DejaVu Sans") {
97
- @plain_hello = @pdf.width_of("hello")
98
- }
99
-
100
- expect(@plain_hello).not_to eq(@bold_hello)
101
-
102
- expect(@styled_bold_hello).to eq(@bold_hello)
103
- end
104
-
105
- it "should not treat minus as if it were a hyphen", :issue => 578 do
106
- create_pdf
107
-
108
- expect(@pdf.width_of("-0.75")).to be < @pdf.width_of("25.00")
109
- end
110
- end
111
-
112
- describe "#font_size" do
113
- it "should allow setting font size in DSL style" do
114
- create_pdf
115
- @pdf.font_size 20
116
- expect(@pdf.font_size).to eq(20)
117
- end
118
- end
119
-
120
- describe "font style support" do
121
- before(:each) { create_pdf }
122
-
123
- it "should complain if there is no @current_page" do
124
- pdf_without_page = Prawn::Document.new(:skip_page_creation => true)
125
-
126
- expect{ pdf_without_page.font "Helvetica" }.
127
- to raise_error(Prawn::Errors::NotOnPage)
128
- end
129
-
130
- it "should allow specifying font style by style name and font family" do
131
- @pdf.font "Courier", :style => :bold
132
- @pdf.text "In Courier bold"
133
-
134
- @pdf.font "Courier", :style => :bold_italic
135
- @pdf.text "In Courier bold-italic"
136
-
137
- @pdf.font "Courier", :style => :italic
138
- @pdf.text "In Courier italic"
139
-
140
- @pdf.font "Courier", :style => :normal
141
- @pdf.text "In Normal Courier"
142
-
143
- @pdf.font "Helvetica"
144
- @pdf.text "In Normal Helvetica"
145
-
146
- text = PDF::Inspector::Text.analyze(@pdf.render)
147
- expect(text.font_settings.map { |e| e[:name] }).to eq(
148
- [
149
- :"Courier-Bold", :"Courier-BoldOblique", :"Courier-Oblique",
150
- :Courier, :Helvetica
151
- ]
152
- )
153
- end
154
-
155
- it "should allow font familes to be defined in a single dfont" do
156
- file = "#{Prawn::DATADIR}/fonts/Panic+Sans.dfont"
157
- @pdf.font_families["Panic Sans"] = {
158
- :normal => { :file => file, :font => "PanicSans" },
159
- :italic => { :file => file, :font => "PanicSans-Italic" },
160
- :bold => { :file => file, :font => "PanicSans-Bold" },
161
- :bold_italic => { :file => file, :font => "PanicSans-BoldItalic" }
162
- }
163
-
164
- @pdf.font "Panic Sans", :style => :italic
165
- @pdf.text "In PanicSans-Italic"
166
-
167
- text = PDF::Inspector::Text.analyze(@pdf.render)
168
- name = text.font_settings.map { |e| e[:name] }.first.to_s
169
- name = name.sub(/\w+\+/, "subset+")
170
- expect(name).to eq("subset+PanicSans-Italic")
171
- end
172
-
173
- it "should accept Pathname objects for font files" do
174
- file = Pathname.new("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf")
175
- @pdf.font_families["DejaVu Sans"] = {
176
- :normal => file
177
- }
178
-
179
- @pdf.font "DejaVu Sans"
180
- @pdf.text "In DejaVu Sans"
181
-
182
- text = PDF::Inspector::Text.analyze(@pdf.render)
183
- name = text.font_settings.map { |e| e[:name] }.first.to_s
184
- name = name.sub(/\w+\+/, "subset+")
185
- expect(name).to eq("subset+DejaVuSans")
186
- end
187
-
188
- it "should accept IO objects for font files" do
189
- io = File.open "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf"
190
- @pdf.font_families["DejaVu Sans"] = {
191
- normal: Prawn::Font.load(@pdf, io)
192
- }
193
-
194
- @pdf.font "DejaVu Sans"
195
- @pdf.text "In DejaVu Sans"
196
-
197
- text = PDF::Inspector::Text.analyze(@pdf.render)
198
- name = text.font_settings.map { |e| e[:name] }.first.to_s
199
- name = name.sub(/\w+\+/, "subset+")
200
- expect(name).to eq("subset+DejaVuSans")
201
- end
202
- end
203
-
204
- describe "Transactional font handling" do
205
- before(:each) { create_pdf }
206
-
207
- it "should allow setting of size directly when font is created" do
208
- @pdf.font "Courier", :size => 16
209
- expect(@pdf.font_size).to eq(16)
210
- end
211
-
212
- it "should allow temporary setting of a new font using a transaction" do
213
- @pdf.font "Helvetica", :size => 12
214
-
215
- @pdf.font "Courier", :size => 16 do
216
- expect(@pdf.font.name).to eq("Courier")
217
- expect(@pdf.font_size).to eq(16)
218
- end
219
-
220
- expect(@pdf.font.name).to eq("Helvetica")
221
- expect(@pdf.font_size).to eq(12)
222
- end
223
-
224
- it "should mask font size when using a transacation" do
225
- @pdf.font "Courier", :size => 16 do
226
- expect(@pdf.font_size).to eq(16)
227
- end
228
-
229
- @pdf.font "Times-Roman"
230
- @pdf.font "Courier"
231
-
232
- expect(@pdf.font_size).to eq(12)
233
- end
234
- end
235
-
236
- describe "Document#page_fonts" do
237
- before(:each) { create_pdf }
238
-
239
- it "should register fonts properly by page" do
240
- @pdf.font "Courier"
241
- @pdf.text("hello")
242
-
243
- @pdf.font "Helvetica"
244
- @pdf.text("hello")
245
-
246
- @pdf.font "Times-Roman"
247
- @pdf.text("hello")
248
-
249
- ["Courier", "Helvetica", "Times-Roman"].each { |f|
250
- page_should_include_font(f)
251
- }
252
-
253
- @pdf.start_new_page
254
-
255
- @pdf.font "Helvetica"
256
- @pdf.text("hello")
257
-
258
- page_should_include_font("Helvetica")
259
- page_should_not_include_font("Courier")
260
- page_should_not_include_font("Times-Roman")
261
- end
262
-
263
- def page_includes_font?(font)
264
- @pdf.page.fonts.values.map { |e| e.data[:BaseFont] }.include?(font.to_sym)
265
- end
266
-
267
- def page_should_include_font(font)
268
- expect(page_includes_font?(font)).to eq true
269
- end
270
-
271
- def page_should_not_include_font(font)
272
- expect(page_includes_font?(font)).to eq false
273
- end
274
- end
275
-
276
- describe "AFM fonts" do
277
- before do
278
- create_pdf
279
- @times = @pdf.find_font "Times-Roman"
280
- end
281
-
282
- it "should calculate string width taking into account accented characters" do
283
- input = win1252_string("\xE9") # é in win-1252
284
- expect(@times.compute_width_of(input, :size => 12)).to eq(@times.compute_width_of("e", :size => 12))
285
- end
286
-
287
- it "should calculate string width taking into account kerning pairs" do
288
- expect(@times.compute_width_of(win1252_string("To"), :size => 12)).to eq(13.332)
289
- expect(@times.compute_width_of(win1252_string("To"), :size => 12, :kerning => true)).to eq(12.372)
290
-
291
- input = win1252_string("T\xF6") # Tö in win-1252
292
- expect(@times.compute_width_of(input, :size => 12, :kerning => true)).to eq(12.372)
293
- end
294
-
295
- it "should encode text without kerning by default" do
296
- expect(@times.encode_text(win1252_string("To"))).to eq([[0, "To"]])
297
- input = win1252_string("T\xE9l\xE9") # Télé in win-1252
298
- expect(@times.encode_text(input)).to eq([[0, input]])
299
- expect(@times.encode_text(win1252_string("Technology"))).to eq([[0, "Technology"]])
300
- expect(@times.encode_text(win1252_string("Technology..."))).to eq([[0, "Technology..."]])
301
- end
302
-
303
- it "should encode text with kerning if requested" do
304
- expect(@times.encode_text(win1252_string("To"), :kerning => true)).to eq([[0, ["T", 80, "o"]]])
305
- input = win1252_string("T\xE9l\xE9") # Télé in win-1252
306
- output = win1252_string("\xE9l\xE9") # élé in win-1252
307
- expect(@times.encode_text(input, :kerning => true)).to eq([[0, ["T", 70, output]]])
308
- expect(@times.encode_text(win1252_string("Technology"), :kerning => true)).to eq([[0, ["T", 70, "echnology"]]])
309
- expect(@times.encode_text(win1252_string("Technology..."), :kerning => true)).to eq([[0, ["T", 70, "echnology", 65, "..."]]])
310
- end
311
-
312
- describe "when normalizing encoding" do
313
- it "should not modify the original string when normalize_encoding() is used" do
314
- original = "Foo"
315
- normalized = @times.normalize_encoding(original)
316
- expect(original.equal?(normalized)).to eq false
317
- end
318
-
319
- it "should modify the original string when normalize_encoding!() is used" do
320
- original = "Foo"
321
- normalized = @times.normalize_encoding!(original)
322
- expect(original.equal?(normalized)).to eq true
323
- end
324
- end
325
-
326
- it "should omit /Encoding for symbolic fonts" do
327
- zapf = @pdf.find_font "ZapfDingbats"
328
- font_dict = zapf.send(:register, nil)
329
- expect(font_dict.data[:Encoding]).to be_nil
330
- end
331
- end
332
-
333
- describe "#glyph_present" do
334
- before(:each) { create_pdf }
335
-
336
- it "should return true when present in an AFM font" do
337
- font = @pdf.find_font("Helvetica")
338
- expect(font.glyph_present?("H")).to eq true
339
- end
340
-
341
- it "should return false when absent in an AFM font" do
342
- font = @pdf.find_font("Helvetica")
343
- expect(font.glyph_present?("再")).to eq false
344
- end
345
-
346
- it "should return true when present in a TTF font" do
347
- font = @pdf.find_font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf")
348
- expect(font.glyph_present?("H")).to eq true
349
- end
350
-
351
- it "should return false when absent in a TTF font" do
352
- font = @pdf.find_font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf")
353
- expect(font.glyph_present?("再")).to eq false
354
-
355
- font = @pdf.find_font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf")
356
- expect(font.glyph_present?("€")).to eq false
357
- end
358
- end
359
-
360
- describe "TTF fonts" do
361
- before do
362
- create_pdf
363
- @font = @pdf.find_font "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf"
364
- end
365
-
366
- it "should calculate string width taking into account accented characters" do
367
- expect(@font.compute_width_of("é", :size => 12)).to eq(@font.compute_width_of("e", :size => 12))
368
- end
369
-
370
- it "should calculate string width taking into account kerning pairs" do
371
- expect(@font.compute_width_of("To", :size => 12)).to be_within(0.01).of(14.65)
372
- expect(@font.compute_width_of("To", :size => 12, :kerning => true)).to be_within(0.01).of(12.61)
373
- end
374
-
375
- it "should encode text without kerning by default" do
376
- expect(@font.encode_text("To")).to eq([[0, "To"]])
377
-
378
- tele = "T\216l\216"
379
- result = @font.encode_text("Télé")
380
- expect(result.length).to eq(1)
381
- expect(result[0][0]).to eq(0)
382
- expect(result[0][1].bytes.to_a).to eq(tele.bytes.to_a)
383
-
384
- expect(@font.encode_text("Technology")).to eq([[0, "Technology"]])
385
- expect(@font.encode_text("Technology...")).to eq([[0, "Technology..."]])
386
- expect(@font.encode_text("Teχnology...")).to eq([[0, "Te"], [1, "!"], [0, "nology..."]])
387
- end
388
-
389
- it "should encode text with kerning if requested" do
390
- expect(@font.encode_text("To", :kerning => true)).to eq([[0, ["T", 169.921875, "o"]]])
391
- expect(@font.encode_text("Technology", :kerning => true)).to eq([[0, ["T", 169.921875, "echnology"]]])
392
- expect(@font.encode_text("Technology...", :kerning => true)).to eq([[0, ["T", 169.921875, "echnology", 142.578125, "..."]]])
393
- expect(@font.encode_text("Teχnology...", :kerning => true)).to eq([[0, ["T", 169.921875, "e"]], [1, "!"], [0, ["nology", 142.578125, "..."]]])
394
- end
395
-
396
- it "should use the ascender, descender, and cap height from the TTF verbatim" do
397
- # These metrics are relative to the font's own bbox. They should not be
398
- # scaled with font size.
399
- ref = @pdf.ref!({})
400
- @font.send :embed, ref, 0
401
-
402
- # Pull out the embedded font descriptor
403
- descriptor = ref.data[:FontDescriptor].data
404
- expect(descriptor[:Ascent]).to eq(759)
405
- expect(descriptor[:Descent]).to eq(-240)
406
- expect(descriptor[:CapHeight]).to eq(759)
407
- end
408
-
409
- describe "when normalizing encoding" do
410
- it "should not modify the original string when normalize_encoding() is used" do
411
- original = "Foo"
412
- normalized = @font.normalize_encoding(original)
413
- expect(original.equal?(normalized)).to eq false
414
- end
415
-
416
- it "should modify the original string when normalize_encoding!() is used" do
417
- original = "Foo"
418
- normalized = @font.normalize_encoding!(original)
419
- expect(original.equal?(normalized)).to eq true
420
- end
421
- end
422
- end
423
-
424
- describe "DFont fonts" do
425
- before do
426
- create_pdf
427
- @file = "#{Prawn::DATADIR}/fonts/Panic+Sans.dfont"
428
- end
429
-
430
- it "should list all named fonts" do
431
- list = Prawn::Font::DFont.named_fonts(@file)
432
- expect(list.sort).to eq(%w(PanicSans PanicSans-Italic PanicSans-Bold PanicSans-BoldItalic).sort)
433
- end
434
-
435
- it "should count the number of fonts in the file" do
436
- expect(Prawn::Font::DFont.font_count(@file)).to eq(4)
437
- end
438
-
439
- it "should default selected font to the first one if not specified" do
440
- font = @pdf.find_font(@file)
441
- expect(font.basename).to eq("PanicSans")
442
- end
443
-
444
- it "should allow font to be selected by index" do
445
- font = @pdf.find_font(@file, :font => 2)
446
- expect(font.basename).to eq("PanicSans-Italic")
447
- end
448
-
449
- it "should allow font to be selected by name" do
450
- font = @pdf.find_font(@file, :font => "PanicSans-BoldItalic")
451
- expect(font.basename).to eq("PanicSans-BoldItalic")
452
- end
453
-
454
- it "should cache font object based on selected font" do
455
- f1 = @pdf.find_font(@file, :font => "PanicSans")
456
- f2 = @pdf.find_font(@file, :font => "PanicSans-Bold")
457
- expect(f2.object_id).not_to eq(f1.object_id)
458
- expect(@pdf.find_font(@file, :font => "PanicSans").object_id).to eq(f1.object_id)
459
- expect(@pdf.find_font(@file, :font => "PanicSans-Bold").object_id).to eq(f2.object_id)
460
- end
461
- end
462
-
463
- describe "#character_count(text)" do
464
- it "should work on TTF fonts" do
465
- create_pdf
466
- @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf")
467
- expect(@pdf.font.character_count("こんにちは世界")).to eq(7)
468
- expect(@pdf.font.character_count("Hello, world!")).to eq(13)
469
- end
470
-
471
- it "should work on AFM fonts" do
472
- create_pdf
473
- expect(@pdf.font.character_count("Hello, world!")).to eq(13)
474
- end
475
- end