piglop-prawn 0.10.2.1

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 (276) hide show
  1. data/COPYING +340 -0
  2. data/HACKING +49 -0
  3. data/LICENSE +56 -0
  4. data/README +140 -0
  5. data/Rakefile +52 -0
  6. data/data/encodings/win_ansi.txt +29 -0
  7. data/data/fonts/Action Man.dfont +0 -0
  8. data/data/fonts/Activa.ttf +0 -0
  9. data/data/fonts/Chalkboard.ttf +0 -0
  10. data/data/fonts/Courier-Bold.afm +342 -0
  11. data/data/fonts/Courier-BoldOblique.afm +342 -0
  12. data/data/fonts/Courier-Oblique.afm +342 -0
  13. data/data/fonts/Courier.afm +342 -0
  14. data/data/fonts/DejaVuSans.ttf +0 -0
  15. data/data/fonts/Dustismo_Roman.ttf +0 -0
  16. data/data/fonts/Helvetica-Bold.afm +2827 -0
  17. data/data/fonts/Helvetica-BoldOblique.afm +2827 -0
  18. data/data/fonts/Helvetica-Oblique.afm +3051 -0
  19. data/data/fonts/Helvetica.afm +3051 -0
  20. data/data/fonts/MustRead.html +19 -0
  21. data/data/fonts/Symbol.afm +213 -0
  22. data/data/fonts/Times-Bold.afm +2588 -0
  23. data/data/fonts/Times-BoldItalic.afm +2384 -0
  24. data/data/fonts/Times-Italic.afm +2667 -0
  25. data/data/fonts/Times-Roman.afm +2419 -0
  26. data/data/fonts/ZapfDingbats.afm +225 -0
  27. data/data/fonts/comicsans.ttf +0 -0
  28. data/data/fonts/gkai00mp.ttf +0 -0
  29. data/data/images/16bit.alpha +0 -0
  30. data/data/images/16bit.dat +0 -0
  31. data/data/images/16bit.png +0 -0
  32. data/data/images/arrow.png +0 -0
  33. data/data/images/arrow2.png +0 -0
  34. data/data/images/barcode_issue.png +0 -0
  35. data/data/images/dice.alpha +0 -0
  36. data/data/images/dice.dat +0 -0
  37. data/data/images/dice.png +0 -0
  38. data/data/images/dice_interlaced.png +0 -0
  39. data/data/images/fractal.jpg +0 -0
  40. data/data/images/letterhead.jpg +0 -0
  41. data/data/images/page_white_text.alpha +0 -0
  42. data/data/images/page_white_text.dat +0 -0
  43. data/data/images/page_white_text.png +0 -0
  44. data/data/images/pigs.jpg +0 -0
  45. data/data/images/rails.dat +0 -0
  46. data/data/images/rails.png +0 -0
  47. data/data/images/ruport.png +0 -0
  48. data/data/images/ruport_data.dat +0 -0
  49. data/data/images/ruport_transparent.png +0 -0
  50. data/data/images/ruport_type0.png +0 -0
  51. data/data/images/stef.jpg +0 -0
  52. data/data/images/tru256.bmp +0 -0
  53. data/data/images/web-links.dat +1 -0
  54. data/data/images/web-links.png +0 -0
  55. data/data/pdfs/complex_template.pdf +0 -0
  56. data/data/pdfs/contains_ttf_font.pdf +0 -0
  57. data/data/pdfs/encrypted.pdf +0 -0
  58. data/data/pdfs/hexagon.pdf +61 -0
  59. data/data/pdfs/indirect_reference.pdf +86 -0
  60. data/data/pdfs/nested_pages.pdf +118 -0
  61. data/data/pdfs/resources_as_indirect_object.pdf +83 -0
  62. data/data/pdfs/two_hexagons.pdf +90 -0
  63. data/data/pdfs/version_1_6.pdf +61 -0
  64. data/data/shift_jis_text.txt +1 -0
  65. data/examples/bounding_box/bounding_boxes.rb +43 -0
  66. data/examples/bounding_box/indentation.rb +34 -0
  67. data/examples/bounding_box/russian_boxes.rb +36 -0
  68. data/examples/bounding_box/stretched_nesting.rb +67 -0
  69. data/examples/example_helper.rb +4 -0
  70. data/examples/general/background.rb +23 -0
  71. data/examples/general/canvas.rb +15 -0
  72. data/examples/general/context_sensitive_headers.rb +37 -0
  73. data/examples/general/float.rb +11 -0
  74. data/examples/general/margin.rb +36 -0
  75. data/examples/general/measurement_units.rb +51 -0
  76. data/examples/general/metadata-info.rb +16 -0
  77. data/examples/general/multi_page_layout.rb +18 -0
  78. data/examples/general/outlines.rb +50 -0
  79. data/examples/general/page_geometry.rb +31 -0
  80. data/examples/general/page_numbering.rb +15 -0
  81. data/examples/general/repeaters.rb +47 -0
  82. data/examples/general/stamp.rb +41 -0
  83. data/examples/general/templates.rb +13 -0
  84. data/examples/graphics/basic_images.rb +23 -0
  85. data/examples/graphics/cmyk.rb +12 -0
  86. data/examples/graphics/curves.rb +11 -0
  87. data/examples/graphics/hexagon.rb +13 -0
  88. data/examples/graphics/image_fit.rb +15 -0
  89. data/examples/graphics/image_flow.rb +37 -0
  90. data/examples/graphics/image_position.rb +17 -0
  91. data/examples/graphics/line.rb +32 -0
  92. data/examples/graphics/png_types.rb +22 -0
  93. data/examples/graphics/polygons.rb +16 -0
  94. data/examples/graphics/remote_images.rb +12 -0
  95. data/examples/graphics/rounded_polygons.rb +19 -0
  96. data/examples/graphics/rounded_rectangle.rb +20 -0
  97. data/examples/graphics/ruport_style_helpers.rb +19 -0
  98. data/examples/graphics/stroke_bounds.rb +20 -0
  99. data/examples/graphics/stroke_cap_and_join.rb +45 -0
  100. data/examples/graphics/stroke_dash.rb +42 -0
  101. data/examples/graphics/transformations.rb +52 -0
  102. data/examples/graphics/transparency.rb +26 -0
  103. data/examples/m17n/chinese_text_wrapping.rb +17 -0
  104. data/examples/m17n/euro.rb +15 -0
  105. data/examples/m17n/sjis.rb +28 -0
  106. data/examples/m17n/utf8.rb +13 -0
  107. data/examples/m17n/win_ansi_charset.rb +54 -0
  108. data/examples/security/hello_foo.rb +8 -0
  109. data/examples/table/bill.rb +53 -0
  110. data/examples/table/cell.rb +12 -0
  111. data/examples/table/checkerboard.rb +22 -0
  112. data/examples/table/header.rb +14 -0
  113. data/examples/table/inline_format_table.rb +12 -0
  114. data/examples/table/multi_page_table.rb +9 -0
  115. data/examples/table/simple_table.rb +24 -0
  116. data/examples/table/subtable.rb +12 -0
  117. data/examples/table/widths.rb +20 -0
  118. data/examples/text/alignment.rb +18 -0
  119. data/examples/text/dfont.rb +48 -0
  120. data/examples/text/family_based_styling.rb +24 -0
  121. data/examples/text/font_calculations.rb +91 -0
  122. data/examples/text/font_size.rb +33 -0
  123. data/examples/text/hyphenation.rb +45 -0
  124. data/examples/text/indent_paragraphs.rb +18 -0
  125. data/examples/text/inline_format.rb +72 -0
  126. data/examples/text/kerning.rb +30 -0
  127. data/examples/text/rotated.rb +98 -0
  128. data/examples/text/shaped_text_box.rb +31 -0
  129. data/examples/text/simple_text.rb +17 -0
  130. data/examples/text/simple_text_ttf.rb +17 -0
  131. data/examples/text/text_box.rb +88 -0
  132. data/examples/text/text_box_returning_excess.rb +51 -0
  133. data/examples/text/text_flow.rb +67 -0
  134. data/lib/prawn/compatibility.rb +51 -0
  135. data/lib/prawn/core/annotations.rb +61 -0
  136. data/lib/prawn/core/byte_string.rb +9 -0
  137. data/lib/prawn/core/destinations.rb +90 -0
  138. data/lib/prawn/core/document_state.rb +84 -0
  139. data/lib/prawn/core/literal_string.rb +16 -0
  140. data/lib/prawn/core/name_tree.rb +165 -0
  141. data/lib/prawn/core/object_store.rb +219 -0
  142. data/lib/prawn/core/page.rb +179 -0
  143. data/lib/prawn/core/pdf_object.rb +83 -0
  144. data/lib/prawn/core/reference.rb +112 -0
  145. data/lib/prawn/core/text/formatted/arranger.rb +260 -0
  146. data/lib/prawn/core/text/formatted/line_wrap.rb +127 -0
  147. data/lib/prawn/core/text/formatted/wrap.rb +113 -0
  148. data/lib/prawn/core/text/line_wrap.rb +198 -0
  149. data/lib/prawn/core/text/wrap.rb +80 -0
  150. data/lib/prawn/core/text.rb +115 -0
  151. data/lib/prawn/core.rb +89 -0
  152. data/lib/prawn/document/bounding_box.rb +425 -0
  153. data/lib/prawn/document/graphics_state.rb +48 -0
  154. data/lib/prawn/document/internals.rb +176 -0
  155. data/lib/prawn/document/page_geometry.rb +136 -0
  156. data/lib/prawn/document/snapshot.rb +87 -0
  157. data/lib/prawn/document.rb +573 -0
  158. data/lib/prawn/encoding.rb +121 -0
  159. data/lib/prawn/errors.rb +94 -0
  160. data/lib/prawn/font/afm.rb +225 -0
  161. data/lib/prawn/font/dfont.rb +42 -0
  162. data/lib/prawn/font/ttf.rb +350 -0
  163. data/lib/prawn/font.rb +342 -0
  164. data/lib/prawn/graphics/cap_style.rb +38 -0
  165. data/lib/prawn/graphics/color.rb +205 -0
  166. data/lib/prawn/graphics/dash.rb +71 -0
  167. data/lib/prawn/graphics/join_style.rb +38 -0
  168. data/lib/prawn/graphics/transformation.rb +156 -0
  169. data/lib/prawn/graphics/transparency.rb +99 -0
  170. data/lib/prawn/graphics.rb +321 -0
  171. data/lib/prawn/images/jpg.rb +46 -0
  172. data/lib/prawn/images/png.rb +226 -0
  173. data/lib/prawn/images.rb +348 -0
  174. data/lib/prawn/measurement_extensions.rb +46 -0
  175. data/lib/prawn/measurements.rb +71 -0
  176. data/lib/prawn/outline.rb +278 -0
  177. data/lib/prawn/repeater.rb +129 -0
  178. data/lib/prawn/security/arcfour.rb +51 -0
  179. data/lib/prawn/security.rb +262 -0
  180. data/lib/prawn/stamp.rb +126 -0
  181. data/lib/prawn/table/accessors.rb +180 -0
  182. data/lib/prawn/table/cell/in_table.rb +27 -0
  183. data/lib/prawn/table/cell/subtable.rb +65 -0
  184. data/lib/prawn/table/cell/text.rb +128 -0
  185. data/lib/prawn/table/cell.rb +330 -0
  186. data/lib/prawn/table.rb +421 -0
  187. data/lib/prawn/text/box.rb +380 -0
  188. data/lib/prawn/text/formatted/box.rb +215 -0
  189. data/lib/prawn/text/formatted/fragment.rb +127 -0
  190. data/lib/prawn/text/formatted/parser.rb +202 -0
  191. data/lib/prawn/text/formatted.rb +4 -0
  192. data/lib/prawn/text.rb +442 -0
  193. data/lib/prawn.rb +25 -0
  194. data/spec/annotations_spec.rb +90 -0
  195. data/spec/bounding_box_spec.rb +190 -0
  196. data/spec/cell_spec.rb +337 -0
  197. data/spec/destinations_spec.rb +15 -0
  198. data/spec/document_spec.rb +461 -0
  199. data/spec/font_spec.rb +314 -0
  200. data/spec/formatted_text_arranger_spec.rb +400 -0
  201. data/spec/formatted_text_box_spec.rb +659 -0
  202. data/spec/formatted_text_fragment_spec.rb +211 -0
  203. data/spec/graphics_spec.rb +446 -0
  204. data/spec/images_spec.rb +96 -0
  205. data/spec/inline_formatted_text_parser_spec.rb +446 -0
  206. data/spec/jpg_spec.rb +25 -0
  207. data/spec/line_wrap_spec.rb +341 -0
  208. data/spec/measurement_units_spec.rb +23 -0
  209. data/spec/name_tree_spec.rb +112 -0
  210. data/spec/object_store_spec.rb +160 -0
  211. data/spec/outline_spec.rb +229 -0
  212. data/spec/pdf_object_spec.rb +127 -0
  213. data/spec/png_spec.rb +237 -0
  214. data/spec/reference_spec.rb +82 -0
  215. data/spec/repeater_spec.rb +96 -0
  216. data/spec/security_spec.rb +120 -0
  217. data/spec/snapshot_spec.rb +138 -0
  218. data/spec/spec_helper.rb +26 -0
  219. data/spec/stamp_spec.rb +108 -0
  220. data/spec/stroke_styles_spec.rb +163 -0
  221. data/spec/table_spec.rb +583 -0
  222. data/spec/template_spec.rb +158 -0
  223. data/spec/text_at_spec.rb +119 -0
  224. data/spec/text_box_spec.rb +675 -0
  225. data/spec/text_spacing_spec.rb +57 -0
  226. data/spec/text_spec.rb +328 -0
  227. data/spec/text_with_inline_formatting_spec.rb +193 -0
  228. data/spec/transparency_spec.rb +75 -0
  229. data/vendor/pdf-inspector/README +18 -0
  230. data/vendor/pdf-inspector/lib/pdf/inspector/extgstate.rb +18 -0
  231. data/vendor/pdf-inspector/lib/pdf/inspector/graphics.rb +131 -0
  232. data/vendor/pdf-inspector/lib/pdf/inspector/page.rb +25 -0
  233. data/vendor/pdf-inspector/lib/pdf/inspector/text.rb +46 -0
  234. data/vendor/pdf-inspector/lib/pdf/inspector/xobject.rb +19 -0
  235. data/vendor/pdf-inspector/lib/pdf/inspector.rb +26 -0
  236. data/vendor/ttfunk/data/fonts/DejaVuSans.ttf +0 -0
  237. data/vendor/ttfunk/data/fonts/comicsans.ttf +0 -0
  238. data/vendor/ttfunk/example.rb +45 -0
  239. data/vendor/ttfunk/lib/ttfunk/directory.rb +17 -0
  240. data/vendor/ttfunk/lib/ttfunk/encoding/mac_roman.rb +88 -0
  241. data/vendor/ttfunk/lib/ttfunk/encoding/windows_1252.rb +69 -0
  242. data/vendor/ttfunk/lib/ttfunk/reader.rb +44 -0
  243. data/vendor/ttfunk/lib/ttfunk/resource_file.rb +78 -0
  244. data/vendor/ttfunk/lib/ttfunk/subset/base.rb +141 -0
  245. data/vendor/ttfunk/lib/ttfunk/subset/mac_roman.rb +50 -0
  246. data/vendor/ttfunk/lib/ttfunk/subset/unicode.rb +48 -0
  247. data/vendor/ttfunk/lib/ttfunk/subset/unicode_8bit.rb +63 -0
  248. data/vendor/ttfunk/lib/ttfunk/subset/windows_1252.rb +55 -0
  249. data/vendor/ttfunk/lib/ttfunk/subset.rb +18 -0
  250. data/vendor/ttfunk/lib/ttfunk/subset_collection.rb +72 -0
  251. data/vendor/ttfunk/lib/ttfunk/table/cmap/format00.rb +54 -0
  252. data/vendor/ttfunk/lib/ttfunk/table/cmap/format04.rb +126 -0
  253. data/vendor/ttfunk/lib/ttfunk/table/cmap/subtable.rb +79 -0
  254. data/vendor/ttfunk/lib/ttfunk/table/cmap.rb +34 -0
  255. data/vendor/ttfunk/lib/ttfunk/table/glyf/compound.rb +81 -0
  256. data/vendor/ttfunk/lib/ttfunk/table/glyf/simple.rb +37 -0
  257. data/vendor/ttfunk/lib/ttfunk/table/glyf.rb +64 -0
  258. data/vendor/ttfunk/lib/ttfunk/table/head.rb +44 -0
  259. data/vendor/ttfunk/lib/ttfunk/table/hhea.rb +41 -0
  260. data/vendor/ttfunk/lib/ttfunk/table/hmtx.rb +47 -0
  261. data/vendor/ttfunk/lib/ttfunk/table/kern/format0.rb +62 -0
  262. data/vendor/ttfunk/lib/ttfunk/table/kern.rb +79 -0
  263. data/vendor/ttfunk/lib/ttfunk/table/loca.rb +43 -0
  264. data/vendor/ttfunk/lib/ttfunk/table/maxp.rb +40 -0
  265. data/vendor/ttfunk/lib/ttfunk/table/name.rb +125 -0
  266. data/vendor/ttfunk/lib/ttfunk/table/os2.rb +78 -0
  267. data/vendor/ttfunk/lib/ttfunk/table/post/format10.rb +43 -0
  268. data/vendor/ttfunk/lib/ttfunk/table/post/format20.rb +35 -0
  269. data/vendor/ttfunk/lib/ttfunk/table/post/format25.rb +23 -0
  270. data/vendor/ttfunk/lib/ttfunk/table/post/format30.rb +17 -0
  271. data/vendor/ttfunk/lib/ttfunk/table/post/format40.rb +17 -0
  272. data/vendor/ttfunk/lib/ttfunk/table/post.rb +91 -0
  273. data/vendor/ttfunk/lib/ttfunk/table/simple.rb +14 -0
  274. data/vendor/ttfunk/lib/ttfunk/table.rb +46 -0
  275. data/vendor/ttfunk/lib/ttfunk.rb +102 -0
  276. metadata +364 -0
data/spec/font_spec.rb ADDED
@@ -0,0 +1,314 @@
1
+ # encoding: utf-8
2
+
3
+ require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
+ require 'iconv'
5
+
6
+ describe "Font behavior" do
7
+
8
+ it "should default to Helvetica if no font is specified" do
9
+ @pdf = Prawn::Document.new
10
+ @pdf.font.name.should == "Helvetica"
11
+ end
12
+
13
+ end
14
+
15
+ describe "#font_size" do
16
+ it "should allow setting font size in DSL style" do
17
+ create_pdf
18
+ @pdf.font_size 20
19
+ @pdf.font_size.should == 20
20
+ end
21
+ end
22
+
23
+ describe "font style support" do
24
+ before(:each) { create_pdf }
25
+
26
+ it "should complain if there is no @current_page" do
27
+ pdf_without_page = Prawn::Document.new(:skip_page_creation => true)
28
+
29
+ lambda{ pdf_without_page.font "Helvetica" }.
30
+ should.raise(Prawn::Errors::NotOnPage)
31
+ end
32
+
33
+ it "should allow specifying font style by style name and font family" do
34
+ @pdf.font "Courier", :style => :bold
35
+ @pdf.text "In Courier bold"
36
+
37
+ @pdf.font "Courier", :style => :bold_italic
38
+ @pdf.text "In Courier bold-italic"
39
+
40
+ @pdf.font "Courier", :style => :italic
41
+ @pdf.text "In Courier italic"
42
+
43
+ @pdf.font "Courier", :style => :normal
44
+ @pdf.text "In Normal Courier"
45
+
46
+ @pdf.font "Helvetica"
47
+ @pdf.text "In Normal Helvetica"
48
+
49
+ text = PDF::Inspector::Text.analyze(@pdf.render)
50
+ text.font_settings.map { |e| e[:name] }.should ==
51
+ [:"Courier-Bold", :"Courier-BoldOblique", :"Courier-Oblique",
52
+ :Courier, :Helvetica]
53
+ end
54
+
55
+ it "should allow font familes to be defined in a single dfont" do
56
+ file = "#{Prawn::BASEDIR}/data/fonts/Action Man.dfont"
57
+ @pdf.font_families["Action Man"] = {
58
+ :normal => { :file => file, :font => "ActionMan" },
59
+ :italic => { :file => file, :font => "ActionMan-Italic" },
60
+ :bold => { :file => file, :font => "ActionMan-Bold" },
61
+ :bold_italic => { :file => file, :font => "ActionMan-BoldItalic" }
62
+ }
63
+
64
+ @pdf.font "Action Man", :style => :italic
65
+ @pdf.text "In ActionMan-Italic"
66
+
67
+ text = PDF::Inspector::Text.analyze(@pdf.render)
68
+ name = text.font_settings.map { |e| e[:name] }.first.to_s
69
+ name = name.sub(/\w+\+/, "subset+")
70
+ name.should == "subset+ActionMan-Italic"
71
+ end
72
+ end
73
+
74
+ describe "Transactional font handling" do
75
+ before(:each) { create_pdf }
76
+
77
+ it "should allow setting of size directly when font is created" do
78
+ @pdf.font "Courier", :size => 16
79
+ @pdf.font_size.should == 16
80
+ end
81
+
82
+ it "should allow temporary setting of a new font using a transaction" do
83
+ @pdf.font "Helvetica", :size => 12
84
+
85
+ @pdf.font "Courier", :size => 16 do
86
+ @pdf.font.name.should == "Courier"
87
+ @pdf.font_size.should == 16
88
+ end
89
+
90
+ @pdf.font.name.should == "Helvetica"
91
+ @pdf.font_size.should == 12
92
+ end
93
+
94
+ it "should mask font size when using a transacation" do
95
+ @pdf.font "Courier", :size => 16 do
96
+ @pdf.font_size.should == 16
97
+ end
98
+
99
+ @pdf.font "Times-Roman"
100
+ @pdf.font "Courier"
101
+
102
+ @pdf.font_size.should == 12
103
+ end
104
+
105
+ end
106
+
107
+ describe "Document#page_fonts" do
108
+ before(:each) { create_pdf }
109
+
110
+ it "should register fonts properly by page" do
111
+ @pdf.font "Courier"; @pdf.text("hello")
112
+ @pdf.font "Helvetica"; @pdf.text("hello")
113
+ @pdf.font "Times-Roman"; @pdf.text("hello")
114
+ ["Courier","Helvetica","Times-Roman"].each { |f|
115
+ page_should_include_font(f)
116
+ }
117
+
118
+ @pdf.start_new_page
119
+ @pdf.font "Helvetica"; @pdf.text("hello")
120
+ page_should_include_font("Helvetica")
121
+ page_should_not_include_font("Courier")
122
+ page_should_not_include_font("Times-Roman")
123
+ end
124
+
125
+ def page_includes_font?(font)
126
+ @pdf.page.fonts.values.map { |e| e.data[:BaseFont] }.include?(font.to_sym)
127
+ end
128
+
129
+ def page_should_include_font(font)
130
+ assert_block("Expected page to include font: #{font}") do
131
+ page_includes_font?(font)
132
+ end
133
+ end
134
+
135
+ def page_should_not_include_font(font)
136
+ assert_block("Did not expect page to include font: #{font}") do
137
+ not page_includes_font?(font)
138
+ end
139
+ end
140
+
141
+ end
142
+
143
+ describe "AFM fonts" do
144
+
145
+ setup do
146
+ create_pdf
147
+ @times = @pdf.find_font "Times-Roman"
148
+ @iconv = ::Iconv.new('Windows-1252', 'utf-8')
149
+ end
150
+
151
+ it "should calculate string width taking into account accented characters" do
152
+ @times.compute_width_of(@iconv.iconv("é"), :size => 12).should == @times.compute_width_of("e", :size => 12)
153
+ end
154
+
155
+ it "should calculate string width taking into account kerning pairs" do
156
+ @times.compute_width_of(@iconv.iconv("To"), :size => 12).should == 13.332
157
+ @times.compute_width_of(@iconv.iconv("To"), :size => 12, :kerning => true).should == 12.372
158
+ @times.compute_width_of(@iconv.iconv("Tö"), :size => 12, :kerning => true).should == 12.372
159
+ end
160
+
161
+ it "should encode text without kerning by default" do
162
+ @times.encode_text(@iconv.iconv("To")).should == [[0, "To"]]
163
+ @times.encode_text(@iconv.iconv("Télé")).should == [[0, @iconv.iconv("Télé")]]
164
+ @times.encode_text(@iconv.iconv("Technology")).should == [[0, "Technology"]]
165
+ @times.encode_text(@iconv.iconv("Technology...")).should == [[0, "Technology..."]]
166
+ end
167
+
168
+ it "should encode text with kerning if requested" do
169
+ @times.encode_text(@iconv.iconv("To"), :kerning => true).should == [[0, ["T", 80, "o"]]]
170
+ @times.encode_text(@iconv.iconv("Télé"), :kerning => true).should == [[0, ["T", 70, @iconv.iconv("élé")]]]
171
+ @times.encode_text(@iconv.iconv("Technology"), :kerning => true).should == [[0, ["T", 70, "echnology"]]]
172
+ @times.encode_text(@iconv.iconv("Technology..."), :kerning => true).should == [[0, ["T", 70, "echnology", 65, "..."]]]
173
+ end
174
+
175
+ describe "when normalizing encoding" do
176
+
177
+ it "should not modify the original string when normalize_encoding() is used" do
178
+ original = "Foo"
179
+ normalized = @times.normalize_encoding(original)
180
+ assert ! original.equal?(normalized)
181
+ end
182
+
183
+ it "should modify the original string when normalize_encoding!() is used" do
184
+ original = "Foo"
185
+ normalized = @times.normalize_encoding!(original)
186
+ assert original.equal?(normalized)
187
+ end
188
+
189
+ end
190
+
191
+ it "should omit /Encoding for symbolic fonts" do
192
+ zapf = @pdf.find_font "ZapfDingbats"
193
+ font_dict = zapf.send(:register, nil)
194
+ font_dict.data[:Encoding].should == nil
195
+ end
196
+
197
+ end
198
+
199
+ describe "TTF fonts" do
200
+
201
+ setup do
202
+ create_pdf
203
+ @activa = @pdf.find_font "#{Prawn::BASEDIR}/data/fonts/Activa.ttf"
204
+ end
205
+
206
+ it "should calculate string width taking into account accented characters" do
207
+ @activa.compute_width_of("é", :size => 12).should == @activa.compute_width_of("e", :size => 12)
208
+ end
209
+
210
+ it "should calculate string width taking into account kerning pairs" do
211
+ @activa.compute_width_of("To", :size => 12).should == 15.228
212
+ @activa.compute_width_of("To", :size => 12, :kerning => true).should == 12.996
213
+ end
214
+
215
+ it "should encode text without kerning by default" do
216
+ @activa.encode_text("To").should == [[0, "To"]]
217
+ @activa.encode_text("Télé").should == [[0, "T\216l\216"]]
218
+ @activa.encode_text("Technology").should == [[0, "Technology"]]
219
+ @activa.encode_text("Technology...").should == [[0, "Technology..."]]
220
+ @activa.encode_text("Teχnology...").should == [[0, "Te"], [1, "!"], [0, "nology..."]]
221
+ end
222
+
223
+ it "should encode text with kerning if requested" do
224
+ @activa.encode_text("To", :kerning => true).should == [[0, ["T", 186.0, "o"]]]
225
+ @activa.encode_text("To", :kerning => true).should == [[0, ["T", 186.0, "o"]]]
226
+ @activa.encode_text("Technology", :kerning => true).should == [[0, ["T", 186.0, "echnology"]]]
227
+ @activa.encode_text("Technology...", :kerning => true).should == [[0, ["T", 186.0, "echnology", 88.0, "..."]]]
228
+ @activa.encode_text("Teχnology...", :kerning => true).should == [[0, ["T", 186.0, "e"]], [1, "!"], [0, ["nology", 88.0, "..."]]]
229
+ end
230
+
231
+ describe "when normalizing encoding" do
232
+
233
+ it "should not modify the original string when normalize_encoding() is used" do
234
+ original = "Foo"
235
+ normalized = @activa.normalize_encoding(original)
236
+ assert ! original.equal?(normalized)
237
+ end
238
+
239
+ it "should modify the original string when normalize_encoding!() is used" do
240
+ original = "Foo"
241
+ normalized = @activa.normalize_encoding!(original)
242
+ assert original.equal?(normalized)
243
+ end
244
+
245
+ end
246
+
247
+ describe "when used with snapshots or transactions" do
248
+
249
+ it "should allow TTF fonts to be used alongside document transactions" do
250
+ lambda {
251
+ Prawn::Document.new do
252
+ font "#{Prawn::BASEDIR}/data/fonts/DejaVuSans.ttf"
253
+ text "Hi there"
254
+ transaction { text "Nice, thank you" }
255
+ end
256
+ }.should.not.raise
257
+ end
258
+
259
+ it "should allow TTF fonts to be used inside transactions" do
260
+ pdf = Prawn::Document.new do
261
+ transaction do
262
+ font "#{Prawn::BASEDIR}/data/fonts/DejaVuSans.ttf"
263
+ text "Hi there"
264
+ end
265
+ end
266
+
267
+ text = PDF::Inspector::Text.analyze(pdf.render)
268
+ name = text.font_settings.map { |e| e[:name] }.first.to_s
269
+ name = name.sub(/\w+\+/, "subset+")
270
+ name.should == "subset+DejaVuSans"
271
+ end
272
+
273
+ end
274
+
275
+ end
276
+
277
+ describe "DFont fonts" do
278
+ setup do
279
+ create_pdf
280
+ @file = "#{Prawn::BASEDIR}/data/fonts/Action Man.dfont"
281
+ end
282
+
283
+ it "should list all named fonts" do
284
+ list = Prawn::Font::DFont.named_fonts(@file)
285
+ list.sort.should == %w(ActionMan ActionMan-Italic ActionMan-Bold ActionMan-BoldItalic).sort
286
+ end
287
+
288
+ it "should count the number of fonts in the file" do
289
+ Prawn::Font::DFont.font_count(@file).should == 4
290
+ end
291
+
292
+ it "should default selected font to the first one if not specified" do
293
+ font = @pdf.find_font(@file)
294
+ font.basename.should == "ActionMan"
295
+ end
296
+
297
+ it "should allow font to be selected by index" do
298
+ font = @pdf.find_font(@file, :font => 2)
299
+ font.basename.should == "ActionMan-Italic"
300
+ end
301
+
302
+ it "should allow font to be selected by name" do
303
+ font = @pdf.find_font(@file, :font => "ActionMan-BoldItalic")
304
+ font.basename.should == "ActionMan-BoldItalic"
305
+ end
306
+
307
+ it "should cache font object based on selected font" do
308
+ f1 = @pdf.find_font(@file, :font => "ActionMan")
309
+ f2 = @pdf.find_font(@file, :font => "ActionMan-Bold")
310
+ assert_not_equal f1.object_id, f2.object_id
311
+ assert_equal f1.object_id, @pdf.find_font(@file, :font => "ActionMan").object_id
312
+ assert_equal f2.object_id, @pdf.find_font(@file, :font => "ActionMan-Bold").object_id
313
+ end
314
+ end