prawn-graph 0.0.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 (317) hide show
  1. data/README.markdown +3 -0
  2. data/Rakefile +34 -0
  3. data/examples/example_helper.rb +10 -0
  4. data/examples/graph/advanced_bar_chart.rb +22 -0
  5. data/examples/graph/bar_chart.rb +18 -0
  6. data/examples/graph/line_chart.rb +18 -0
  7. data/lib/prawn/graph.rb +94 -0
  8. data/lib/prawn/graph/bar.rb +172 -0
  9. data/lib/prawn/graph/chart.rb +4 -0
  10. data/lib/prawn/graph/errors.rb +6 -0
  11. data/lib/prawn/graph/grid.rb +43 -0
  12. data/lib/prawn/graph/line.rb +43 -0
  13. data/vendor/prawn-core/COPYING +340 -0
  14. data/vendor/prawn-core/HACKING +46 -0
  15. data/vendor/prawn-core/LICENSE +56 -0
  16. data/vendor/prawn-core/README +138 -0
  17. data/vendor/prawn-core/Rakefile +75 -0
  18. data/vendor/prawn-core/bench/afm_text_bench.rb +18 -0
  19. data/vendor/prawn-core/bench/png_type_6.rb +15 -0
  20. data/vendor/prawn-core/bench/ttf_text_bench.rb +19 -0
  21. data/vendor/prawn-core/bugs/indentation_across_pagebreaks.rb +15 -0
  22. data/vendor/prawn-core/bugs/resolved/canvas_sets_y_to_0.rb +15 -0
  23. data/vendor/prawn-core/bugs/resolved/png_barcode_issue.rb +11 -0
  24. data/vendor/prawn-core/bugs/resolved/transaction_page_number_issue_79.rb +21 -0
  25. data/vendor/prawn-core/bugs/resolved/ttf_fails_in_transactions.rb +24 -0
  26. data/vendor/prawn-core/data/encodings/win_ansi.txt +29 -0
  27. data/vendor/prawn-core/data/fonts/Action Man.dfont +0 -0
  28. data/vendor/prawn-core/data/fonts/Activa.ttf +0 -0
  29. data/vendor/prawn-core/data/fonts/Chalkboard.ttf +0 -0
  30. data/vendor/prawn-core/data/fonts/Courier-Bold.afm +342 -0
  31. data/vendor/prawn-core/data/fonts/Courier-BoldOblique.afm +342 -0
  32. data/vendor/prawn-core/data/fonts/Courier-Oblique.afm +342 -0
  33. data/vendor/prawn-core/data/fonts/Courier.afm +342 -0
  34. data/vendor/prawn-core/data/fonts/DejaVuSans.ttf +0 -0
  35. data/vendor/prawn-core/data/fonts/Dustismo_Roman.ttf +0 -0
  36. data/vendor/prawn-core/data/fonts/Helvetica-Bold.afm +2827 -0
  37. data/vendor/prawn-core/data/fonts/Helvetica-BoldOblique.afm +2827 -0
  38. data/vendor/prawn-core/data/fonts/Helvetica-Oblique.afm +3051 -0
  39. data/vendor/prawn-core/data/fonts/Helvetica.afm +3051 -0
  40. data/vendor/prawn-core/data/fonts/MustRead.html +19 -0
  41. data/vendor/prawn-core/data/fonts/Symbol.afm +213 -0
  42. data/vendor/prawn-core/data/fonts/Times-Bold.afm +2588 -0
  43. data/vendor/prawn-core/data/fonts/Times-BoldItalic.afm +2384 -0
  44. data/vendor/prawn-core/data/fonts/Times-Italic.afm +2667 -0
  45. data/vendor/prawn-core/data/fonts/Times-Roman.afm +2419 -0
  46. data/vendor/prawn-core/data/fonts/ZapfDingbats.afm +225 -0
  47. data/vendor/prawn-core/data/fonts/comicsans.ttf +0 -0
  48. data/vendor/prawn-core/data/fonts/gkai00mp.ttf +0 -0
  49. data/vendor/prawn-core/data/images/16bit.alpha +0 -0
  50. data/vendor/prawn-core/data/images/16bit.dat +0 -0
  51. data/vendor/prawn-core/data/images/16bit.png +0 -0
  52. data/vendor/prawn-core/data/images/arrow.png +0 -0
  53. data/vendor/prawn-core/data/images/arrow2.png +0 -0
  54. data/vendor/prawn-core/data/images/barcode_issue.png +0 -0
  55. data/vendor/prawn-core/data/images/dice.alpha +0 -0
  56. data/vendor/prawn-core/data/images/dice.dat +0 -0
  57. data/vendor/prawn-core/data/images/dice.png +0 -0
  58. data/vendor/prawn-core/data/images/dice_interlaced.png +0 -0
  59. data/vendor/prawn-core/data/images/fractal.jpg +0 -0
  60. data/vendor/prawn-core/data/images/letterhead.jpg +0 -0
  61. data/vendor/prawn-core/data/images/page_white_text.alpha +0 -0
  62. data/vendor/prawn-core/data/images/page_white_text.dat +0 -0
  63. data/vendor/prawn-core/data/images/page_white_text.png +0 -0
  64. data/vendor/prawn-core/data/images/pigs.jpg +0 -0
  65. data/vendor/prawn-core/data/images/rails.dat +0 -0
  66. data/vendor/prawn-core/data/images/rails.png +0 -0
  67. data/vendor/prawn-core/data/images/ruport.png +0 -0
  68. data/vendor/prawn-core/data/images/ruport_data.dat +0 -0
  69. data/vendor/prawn-core/data/images/ruport_transparent.png +0 -0
  70. data/vendor/prawn-core/data/images/ruport_type0.png +0 -0
  71. data/vendor/prawn-core/data/images/stef.jpg +0 -0
  72. data/vendor/prawn-core/data/images/tru256.bmp +0 -0
  73. data/vendor/prawn-core/data/images/web-links.dat +1 -0
  74. data/vendor/prawn-core/data/images/web-links.png +0 -0
  75. data/vendor/prawn-core/data/shift_jis_text.txt +1 -0
  76. data/vendor/prawn-core/examples/bounding_box/bounding_boxes.rb +43 -0
  77. data/vendor/prawn-core/examples/bounding_box/indentation.rb +34 -0
  78. data/vendor/prawn-core/examples/bounding_box/russian_boxes.rb +36 -0
  79. data/vendor/prawn-core/examples/bounding_box/stretched_nesting.rb +67 -0
  80. data/vendor/prawn-core/examples/column_box/column_box_example.rb +43 -0
  81. data/vendor/prawn-core/examples/example_helper.rb +3 -0
  82. data/vendor/prawn-core/examples/general/background.rb +23 -0
  83. data/vendor/prawn-core/examples/general/canvas.rb +15 -0
  84. data/vendor/prawn-core/examples/general/context_sensitive_headers.rb +37 -0
  85. data/vendor/prawn-core/examples/general/float.rb +11 -0
  86. data/vendor/prawn-core/examples/general/margin.rb +36 -0
  87. data/vendor/prawn-core/examples/general/measurement_units.rb +51 -0
  88. data/vendor/prawn-core/examples/general/metadata-info.rb +16 -0
  89. data/vendor/prawn-core/examples/general/multi_page_layout.rb +18 -0
  90. data/vendor/prawn-core/examples/general/outlines.rb +50 -0
  91. data/vendor/prawn-core/examples/general/page_geometry.rb +31 -0
  92. data/vendor/prawn-core/examples/general/page_numbering.rb +15 -0
  93. data/vendor/prawn-core/examples/general/repeaters.rb +47 -0
  94. data/vendor/prawn-core/examples/general/stamp.rb +41 -0
  95. data/vendor/prawn-core/examples/graphics/basic_images.rb +23 -0
  96. data/vendor/prawn-core/examples/graphics/cmyk.rb +12 -0
  97. data/vendor/prawn-core/examples/graphics/curves.rb +11 -0
  98. data/vendor/prawn-core/examples/graphics/hexagon.rb +13 -0
  99. data/vendor/prawn-core/examples/graphics/image_fit.rb +15 -0
  100. data/vendor/prawn-core/examples/graphics/image_flow.rb +37 -0
  101. data/vendor/prawn-core/examples/graphics/image_position.rb +17 -0
  102. data/vendor/prawn-core/examples/graphics/line.rb +32 -0
  103. data/vendor/prawn-core/examples/graphics/png_types.rb +22 -0
  104. data/vendor/prawn-core/examples/graphics/polygons.rb +16 -0
  105. data/vendor/prawn-core/examples/graphics/remote_images.rb +12 -0
  106. data/vendor/prawn-core/examples/graphics/rounded_polygons.rb +19 -0
  107. data/vendor/prawn-core/examples/graphics/rounded_rectangle.rb +20 -0
  108. data/vendor/prawn-core/examples/graphics/ruport_style_helpers.rb +19 -0
  109. data/vendor/prawn-core/examples/graphics/stroke_bounds.rb +20 -0
  110. data/vendor/prawn-core/examples/graphics/stroke_cap_and_join.rb +45 -0
  111. data/vendor/prawn-core/examples/graphics/stroke_dash.rb +42 -0
  112. data/vendor/prawn-core/examples/graphics/transformations.rb +52 -0
  113. data/vendor/prawn-core/examples/graphics/transparency.rb +26 -0
  114. data/vendor/prawn-core/examples/m17n/chinese_text_wrapping.rb +17 -0
  115. data/vendor/prawn-core/examples/m17n/euro.rb +15 -0
  116. data/vendor/prawn-core/examples/m17n/sjis.rb +28 -0
  117. data/vendor/prawn-core/examples/m17n/utf8.rb +13 -0
  118. data/vendor/prawn-core/examples/m17n/win_ansi_charset.rb +54 -0
  119. data/vendor/prawn-core/examples/text/alignment.rb +18 -0
  120. data/vendor/prawn-core/examples/text/dfont.rb +48 -0
  121. data/vendor/prawn-core/examples/text/family_based_styling.rb +24 -0
  122. data/vendor/prawn-core/examples/text/font_calculations.rb +91 -0
  123. data/vendor/prawn-core/examples/text/font_size.rb +33 -0
  124. data/vendor/prawn-core/examples/text/indent_paragraphs.rb +18 -0
  125. data/vendor/prawn-core/examples/text/kerning.rb +30 -0
  126. data/vendor/prawn-core/examples/text/rotated.rb +98 -0
  127. data/vendor/prawn-core/examples/text/simple_text.rb +17 -0
  128. data/vendor/prawn-core/examples/text/simple_text_ttf.rb +17 -0
  129. data/vendor/prawn-core/examples/text/span.rb +29 -0
  130. data/vendor/prawn-core/examples/text/text_box.rb +88 -0
  131. data/vendor/prawn-core/examples/text/text_box_returning_excess.rb +51 -0
  132. data/vendor/prawn-core/examples/text/text_flow.rb +67 -0
  133. data/vendor/prawn-core/lib/prawn/byte_string.rb +7 -0
  134. data/vendor/prawn-core/lib/prawn/compatibility.rb +51 -0
  135. data/vendor/prawn-core/lib/prawn/core.rb +87 -0
  136. data/vendor/prawn-core/lib/prawn/core/page.rb +88 -0
  137. data/vendor/prawn-core/lib/prawn/core/text.rb +65 -0
  138. data/vendor/prawn-core/lib/prawn/document.rb +596 -0
  139. data/vendor/prawn-core/lib/prawn/document/annotations.rb +65 -0
  140. data/vendor/prawn-core/lib/prawn/document/bounding_box.rb +402 -0
  141. data/vendor/prawn-core/lib/prawn/document/column_box.rb +113 -0
  142. data/vendor/prawn-core/lib/prawn/document/destinations.rb +92 -0
  143. data/vendor/prawn-core/lib/prawn/document/graphics_state.rb +49 -0
  144. data/vendor/prawn-core/lib/prawn/document/internals.rb +153 -0
  145. data/vendor/prawn-core/lib/prawn/document/page_geometry.rb +136 -0
  146. data/vendor/prawn-core/lib/prawn/document/snapshot.rb +80 -0
  147. data/vendor/prawn-core/lib/prawn/document/span.rb +55 -0
  148. data/vendor/prawn-core/lib/prawn/encoding.rb +121 -0
  149. data/vendor/prawn-core/lib/prawn/errors.rb +83 -0
  150. data/vendor/prawn-core/lib/prawn/font.rb +329 -0
  151. data/vendor/prawn-core/lib/prawn/font/afm.rb +217 -0
  152. data/vendor/prawn-core/lib/prawn/font/dfont.rb +34 -0
  153. data/vendor/prawn-core/lib/prawn/font/ttf.rb +341 -0
  154. data/vendor/prawn-core/lib/prawn/graphics.rb +321 -0
  155. data/vendor/prawn-core/lib/prawn/graphics/cap_style.rb +38 -0
  156. data/vendor/prawn-core/lib/prawn/graphics/color.rb +205 -0
  157. data/vendor/prawn-core/lib/prawn/graphics/dash.rb +71 -0
  158. data/vendor/prawn-core/lib/prawn/graphics/join_style.rb +38 -0
  159. data/vendor/prawn-core/lib/prawn/graphics/transformation.rb +157 -0
  160. data/vendor/prawn-core/lib/prawn/graphics/transparency.rb +99 -0
  161. data/vendor/prawn-core/lib/prawn/images.rb +337 -0
  162. data/vendor/prawn-core/lib/prawn/images/jpg.rb +46 -0
  163. data/vendor/prawn-core/lib/prawn/images/png.rb +219 -0
  164. data/vendor/prawn-core/lib/prawn/literal_string.rb +14 -0
  165. data/vendor/prawn-core/lib/prawn/measurement_extensions.rb +46 -0
  166. data/vendor/prawn-core/lib/prawn/measurements.rb +71 -0
  167. data/vendor/prawn-core/lib/prawn/name_tree.rb +166 -0
  168. data/vendor/prawn-core/lib/prawn/object_store.rb +93 -0
  169. data/vendor/prawn-core/lib/prawn/outline.rb +278 -0
  170. data/vendor/prawn-core/lib/prawn/pdf_object.rb +83 -0
  171. data/vendor/prawn-core/lib/prawn/reference.rb +92 -0
  172. data/vendor/prawn-core/lib/prawn/repeater.rb +129 -0
  173. data/vendor/prawn-core/lib/prawn/stamp.rb +128 -0
  174. data/vendor/prawn-core/lib/prawn/text.rb +271 -0
  175. data/vendor/prawn-core/lib/prawn/text/box.rb +414 -0
  176. data/vendor/prawn-core/meta/Rakefile +36 -0
  177. data/vendor/prawn-core/meta/lib/prawn.rb +2 -0
  178. data/vendor/prawn-core/reference_pdfs/alignment.pdf +229 -0
  179. data/vendor/prawn-core/reference_pdfs/background.pdf +0 -0
  180. data/vendor/prawn-core/reference_pdfs/basic_images.pdf +0 -0
  181. data/vendor/prawn-core/reference_pdfs/bounding_boxes.pdf +128 -0
  182. data/vendor/prawn-core/reference_pdfs/canvas.pdf +78 -0
  183. data/vendor/prawn-core/reference_pdfs/chinese_flow.pdf +0 -0
  184. data/vendor/prawn-core/reference_pdfs/cmyk.pdf +0 -0
  185. data/vendor/prawn-core/reference_pdfs/column_box.pdf +3671 -0
  186. data/vendor/prawn-core/reference_pdfs/context_sensitive_headers.pdf +2331 -0
  187. data/vendor/prawn-core/reference_pdfs/curves.pdf +62 -0
  188. data/vendor/prawn-core/reference_pdfs/dfont.pdf +0 -0
  189. data/vendor/prawn-core/reference_pdfs/euro.pdf +75 -0
  190. data/vendor/prawn-core/reference_pdfs/family_style.pdf +286 -0
  191. data/vendor/prawn-core/reference_pdfs/flow.pdf +964 -0
  192. data/vendor/prawn-core/reference_pdfs/font_calculations.pdf +0 -0
  193. data/vendor/prawn-core/reference_pdfs/font_size.pdf +142 -0
  194. data/vendor/prawn-core/reference_pdfs/hexagon.pdf +61 -0
  195. data/vendor/prawn-core/reference_pdfs/image-flow.pdf +0 -0
  196. data/vendor/prawn-core/reference_pdfs/image_fit.pdf +0 -0
  197. data/vendor/prawn-core/reference_pdfs/image_position.pdf +0 -0
  198. data/vendor/prawn-core/reference_pdfs/indentation.pdf +124 -0
  199. data/vendor/prawn-core/reference_pdfs/kerning.pdf +0 -0
  200. data/vendor/prawn-core/reference_pdfs/landscape_a4.pdf +52 -0
  201. data/vendor/prawn-core/reference_pdfs/landscape_legal.pdf +52 -0
  202. data/vendor/prawn-core/reference_pdfs/landscape_letter.pdf +52 -0
  203. data/vendor/prawn-core/reference_pdfs/lines.pdf +116 -0
  204. data/vendor/prawn-core/reference_pdfs/margin.pdf +3850 -0
  205. data/vendor/prawn-core/reference_pdfs/measurement_units.pdf +4667 -0
  206. data/vendor/prawn-core/reference_pdfs/metadata-info.pdf +88 -0
  207. data/vendor/prawn-core/reference_pdfs/multi-layout.pdf +209 -0
  208. data/vendor/prawn-core/reference_pdfs/page_with_numbering.pdf +156 -0
  209. data/vendor/prawn-core/reference_pdfs/png_types.pdf +0 -0
  210. data/vendor/prawn-core/reference_pdfs/portrait_a4.pdf +52 -0
  211. data/vendor/prawn-core/reference_pdfs/portrait_legal.pdf +52 -0
  212. data/vendor/prawn-core/reference_pdfs/portrait_letter.pdf +52 -0
  213. data/vendor/prawn-core/reference_pdfs/pretty_polygons.pdf +122 -0
  214. data/vendor/prawn-core/reference_pdfs/remote_images.pdf +0 -0
  215. data/vendor/prawn-core/reference_pdfs/ruport.pdf +101 -0
  216. data/vendor/prawn-core/reference_pdfs/russian_boxes.pdf +2780 -0
  217. data/vendor/prawn-core/reference_pdfs/simple_text.pdf +136 -0
  218. data/vendor/prawn-core/reference_pdfs/simple_text_ttf.pdf +0 -0
  219. data/vendor/prawn-core/reference_pdfs/sjis.pdf +0 -0
  220. data/vendor/prawn-core/reference_pdfs/span.pdf +1975 -0
  221. data/vendor/prawn-core/reference_pdfs/stamp.pdf +649 -0
  222. data/vendor/prawn-core/reference_pdfs/stretched_nesting.pdf +200 -0
  223. data/vendor/prawn-core/reference_pdfs/stroke_bounds.pdf +135 -0
  224. data/vendor/prawn-core/reference_pdfs/stroke_cap_and_join.pdf +80 -0
  225. data/vendor/prawn-core/reference_pdfs/stroke_dash.pdf +457 -0
  226. data/vendor/prawn-core/reference_pdfs/text_box.pdf +962 -0
  227. data/vendor/prawn-core/reference_pdfs/text_box_returning_excess.pdf +271 -0
  228. data/vendor/prawn-core/reference_pdfs/transparency.pdf +347 -0
  229. data/vendor/prawn-core/reference_pdfs/utf8.pdf +0 -0
  230. data/vendor/prawn-core/reference_pdfs/win-ansi.pdf +6172 -0
  231. data/vendor/prawn-core/spec/annotations_spec.rb +90 -0
  232. data/vendor/prawn-core/spec/bounding_box_spec.rb +185 -0
  233. data/vendor/prawn-core/spec/destinations_spec.rb +15 -0
  234. data/vendor/prawn-core/spec/document_spec.rb +408 -0
  235. data/vendor/prawn-core/spec/font_spec.rb +314 -0
  236. data/vendor/prawn-core/spec/graphics_spec.rb +438 -0
  237. data/vendor/prawn-core/spec/images_spec.rb +79 -0
  238. data/vendor/prawn-core/spec/jpg_spec.rb +25 -0
  239. data/vendor/prawn-core/spec/measurement_units_spec.rb +23 -0
  240. data/vendor/prawn-core/spec/name_tree_spec.rb +112 -0
  241. data/vendor/prawn-core/spec/object_store_spec.rb +75 -0
  242. data/vendor/prawn-core/spec/outline_spec.rb +229 -0
  243. data/vendor/prawn-core/spec/pdf_object_spec.rb +122 -0
  244. data/vendor/prawn-core/spec/png_spec.rb +236 -0
  245. data/vendor/prawn-core/spec/reference_spec.rb +82 -0
  246. data/vendor/prawn-core/spec/repeater_spec.rb +96 -0
  247. data/vendor/prawn-core/spec/snapshot_spec.rb +138 -0
  248. data/vendor/prawn-core/spec/span_spec.rb +49 -0
  249. data/vendor/prawn-core/spec/spec_helper.rb +24 -0
  250. data/vendor/prawn-core/spec/stamp_spec.rb +108 -0
  251. data/vendor/prawn-core/spec/stroke_styles_spec.rb +152 -0
  252. data/vendor/prawn-core/spec/text_at_spec.rb +119 -0
  253. data/vendor/prawn-core/spec/text_box_spec.rb +603 -0
  254. data/vendor/prawn-core/spec/text_spec.rb +308 -0
  255. data/vendor/prawn-core/spec/transparency_spec.rb +75 -0
  256. data/vendor/prawn-core/vendor/pdf-inspector/README +18 -0
  257. data/vendor/prawn-core/vendor/pdf-inspector/lib/pdf/inspector.rb +26 -0
  258. data/vendor/prawn-core/vendor/pdf-inspector/lib/pdf/inspector/extgstate.rb +18 -0
  259. data/vendor/prawn-core/vendor/pdf-inspector/lib/pdf/inspector/graphics.rb +131 -0
  260. data/vendor/prawn-core/vendor/pdf-inspector/lib/pdf/inspector/page.rb +25 -0
  261. data/vendor/prawn-core/vendor/pdf-inspector/lib/pdf/inspector/text.rb +31 -0
  262. data/vendor/prawn-core/vendor/pdf-inspector/lib/pdf/inspector/xobject.rb +19 -0
  263. data/vendor/prawn-core/vendor/ttfunk/data/fonts/DejaVuSans.ttf +0 -0
  264. data/vendor/prawn-core/vendor/ttfunk/data/fonts/comicsans.ttf +0 -0
  265. data/vendor/prawn-core/vendor/ttfunk/example.rb +45 -0
  266. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk.rb +102 -0
  267. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/directory.rb +17 -0
  268. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/encoding/mac_roman.rb +88 -0
  269. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/encoding/windows_1252.rb +69 -0
  270. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/reader.rb +44 -0
  271. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/resource_file.rb +78 -0
  272. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/subset.rb +18 -0
  273. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/subset/base.rb +141 -0
  274. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/subset/mac_roman.rb +46 -0
  275. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/subset/unicode.rb +48 -0
  276. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/subset/unicode_8bit.rb +63 -0
  277. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/subset/windows_1252.rb +51 -0
  278. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/subset_collection.rb +72 -0
  279. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table.rb +46 -0
  280. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/cmap.rb +34 -0
  281. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/cmap/format00.rb +54 -0
  282. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/cmap/format04.rb +126 -0
  283. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/cmap/subtable.rb +79 -0
  284. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/glyf.rb +64 -0
  285. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/glyf/compound.rb +81 -0
  286. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/glyf/simple.rb +37 -0
  287. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/head.rb +44 -0
  288. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/hhea.rb +41 -0
  289. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/hmtx.rb +47 -0
  290. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/kern.rb +79 -0
  291. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/kern/format0.rb +62 -0
  292. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/loca.rb +43 -0
  293. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/maxp.rb +40 -0
  294. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/name.rb +119 -0
  295. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/os2.rb +78 -0
  296. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/post.rb +91 -0
  297. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/post/format10.rb +43 -0
  298. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/post/format20.rb +35 -0
  299. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/post/format25.rb +23 -0
  300. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/post/format30.rb +17 -0
  301. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/post/format40.rb +17 -0
  302. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/simple.rb +14 -0
  303. data/vendor/prawn-core/www/index.html +196 -0
  304. data/vendor/prawn-core/www/media/bounding_boxes.pdf +146 -0
  305. data/vendor/prawn-core/www/media/bounding_boxes.png +0 -0
  306. data/vendor/prawn-core/www/media/bounding_boxes_out.png +0 -0
  307. data/vendor/prawn-core/www/media/fancy_table.pdf +350 -0
  308. data/vendor/prawn-core/www/media/image.pdf +0 -0
  309. data/vendor/prawn-core/www/media/images.png +0 -0
  310. data/vendor/prawn-core/www/media/prawn_logo.png +0 -0
  311. data/vendor/prawn-core/www/media/tables.png +0 -0
  312. data/vendor/prawn-core/www/media/utf8.pdf +0 -0
  313. data/vendor/prawn-core/www/media/utf8.png +0 -0
  314. data/vendor/prawn-core/www/prawn-Chinese.html +113 -0
  315. data/vendor/prawn-core/www/prawn.css +86 -0
  316. data/vendor/prawn-core/www/twilight.css +266 -0
  317. metadata +374 -0
@@ -0,0 +1,217 @@
1
+ require 'prawn/encoding'
2
+
3
+ module Prawn
4
+ class Font
5
+ class AFM < Font
6
+ BUILT_INS = %w[ Courier Helvetica Times-Roman Symbol ZapfDingbats
7
+ Courier-Bold Courier-Oblique Courier-BoldOblique
8
+ Times-Bold Times-Italic Times-BoldItalic
9
+ Helvetica-Bold Helvetica-Oblique Helvetica-BoldOblique ]
10
+
11
+ def unicode?
12
+ false
13
+ end
14
+
15
+ def self.metrics_path
16
+ if m = ENV['METRICS']
17
+ @metrics_path ||= m.split(':')
18
+ else
19
+ @metrics_path ||= [
20
+ ".", "/usr/lib/afm",
21
+ "/usr/local/lib/afm",
22
+ "/usr/openwin/lib/fonts/afm/",
23
+ Prawn::BASEDIR+'/data/fonts/']
24
+ end
25
+ end
26
+
27
+ attr_reader :attributes #:nodoc:
28
+
29
+ def initialize(document, name, options={}) #:nodoc:
30
+ unless BUILT_INS.include?(name)
31
+ raise Prawn::Errors::UnknownFont, "#{name} is not a known font."
32
+ end
33
+
34
+ super
35
+
36
+ @attributes = {}
37
+ @glyph_widths = {}
38
+ @bounding_boxes = {}
39
+ @kern_pairs = {}
40
+
41
+ file_name = @name.dup
42
+ file_name << ".afm" unless file_name =~ /\.afm$/
43
+ file_name = file_name[0] == ?/ ? file_name : find_font(file_name)
44
+
45
+ parse_afm(file_name)
46
+
47
+ @ascender = @attributes["ascender"].to_i
48
+ @descender = @attributes["descender"].to_i
49
+ @line_gap = Float(bbox[3] - bbox[1]) - (@ascender - @descender)
50
+ end
51
+
52
+ # The font bbox, as an array of integers
53
+ #
54
+ def bbox
55
+ @bbox ||= @attributes['fontbbox'].split(/\s+/).map { |e| Integer(e) }
56
+ end
57
+
58
+ # NOTE: String *must* be encoded as WinAnsi
59
+ def compute_width_of(string, options={}) #:nodoc:
60
+ scale = (options[:size] || size) / 1000.0
61
+
62
+ if options[:kerning]
63
+ strings, numbers = kern(string).partition { |e| e.is_a?(String) }
64
+ total_kerning_offset = numbers.inject(0.0) { |s,r| s + r }
65
+ (unscaled_width_of(strings.join) - total_kerning_offset) * scale
66
+ else
67
+ unscaled_width_of(string) * scale
68
+ end
69
+ end
70
+
71
+ # Returns true if the font has kerning data, false otherwise
72
+ #
73
+ def has_kerning_data?
74
+ @kern_pairs.any?
75
+ end
76
+
77
+ # built-in fonts only work with winansi encoding, so translate the
78
+ # string. Changes the encoding in-place, so the argument itself
79
+ # is replaced with a string in WinAnsi encoding.
80
+ #
81
+ def normalize_encoding(text)
82
+ enc = Prawn::Encoding::WinAnsi.new
83
+ text.unpack("U*").collect { |i| enc[i] }.pack("C*")
84
+ end
85
+
86
+ # Perform any changes to the string that need to happen
87
+ # before it is rendered to the canvas. Returns an array of
88
+ # subset "chunks", where each chunk is an array of two elements.
89
+ # The first element is the font subset number, and the second
90
+ # is either a string or an array (for kerned text).
91
+ #
92
+ # For Adobe fonts, there is only ever a single subset, so
93
+ # the first element of the array is "0", and the second is
94
+ # the string itself (or an array, if kerning is performed).
95
+ #
96
+ # The +text+ parameter must be in WinAnsi encoding (cp1252).
97
+ #
98
+ def encode_text(text, options={})
99
+ [[0, options[:kerning] ? kern(text) : text]]
100
+ end
101
+
102
+ private
103
+
104
+ def register(subset)
105
+ font_dict = {:Type => :Font,
106
+ :Subtype => :Type1,
107
+ :BaseFont => name.to_sym}
108
+
109
+ # Symbolic AFM fonts (Symbol, ZapfDingbats) have their own encodings
110
+ font_dict.merge!(:Encoding => :WinAnsiEncoding) unless symbolic?
111
+
112
+ @document.ref!(font_dict)
113
+ end
114
+
115
+ def symbolic?
116
+ attributes["characterset"] == "Special"
117
+ end
118
+
119
+ def find_font(file)
120
+ self.class.metrics_path.find { |f| File.exist? "#{f}/#{file}" } + "/#{file}"
121
+ rescue NoMethodError
122
+ raise Prawn::Errors::UnknownFont,
123
+ "Couldn't find the font: #{file} in any of:\n" +
124
+ self.class.metrics_path.join("\n")
125
+ end
126
+
127
+ def parse_afm(file_name)
128
+ section = []
129
+
130
+ File.foreach(file_name) do |line|
131
+ case line
132
+ when /^Start(\w+)/
133
+ section.push $1
134
+ next
135
+ when /^End(\w+)/
136
+ section.pop
137
+ next
138
+ end
139
+
140
+ case section
141
+ when ["FontMetrics", "CharMetrics"]
142
+ next unless line =~ /^CH?\s/
143
+
144
+ name = line[/\bN\s+(\.?\w+)\s*;/, 1]
145
+ @glyph_widths[name] = line[/\bWX\s+(\d+)\s*;/, 1].to_i
146
+ @bounding_boxes[name] = line[/\bB\s+([^;]+);/, 1].to_s.rstrip
147
+ when ["FontMetrics", "KernData", "KernPairs"]
148
+ next unless line =~ /^KPX\s+(\.?\w+)\s+(\.?\w+)\s+(-?\d+)/
149
+ @kern_pairs[[$1, $2]] = $3.to_i
150
+ when ["FontMetrics", "KernData", "TrackKern"],
151
+ ["FontMetrics", "Composites"]
152
+ next
153
+ else
154
+ parse_generic_afm_attribute(line)
155
+ end
156
+ end
157
+ end
158
+
159
+ def parse_generic_afm_attribute(line)
160
+ line =~ /(^\w+)\s+(.*)/
161
+ key, value = $1.to_s.downcase, $2
162
+
163
+ @attributes[key] = @attributes[key] ?
164
+ Array(@attributes[key]) << value : value
165
+ end
166
+
167
+ # converts a string into an array with spacing offsets
168
+ # bewteen characters that need to be kerned
169
+ #
170
+ # String *must* be encoded as WinAnsi
171
+ #
172
+ def kern(string)
173
+ kerned = [[]]
174
+ last_byte = nil
175
+
176
+ kern_pairs = latin_kern_pairs_table
177
+
178
+ string.unpack("C*").each do |byte|
179
+ if k = last_byte && kern_pairs[[last_byte, byte]]
180
+ kerned << -k << [byte]
181
+ else
182
+ kerned.last << byte
183
+ end
184
+ last_byte = byte
185
+ end
186
+
187
+ kerned.map { |e|
188
+ e = (Array === e ? e.pack("C*") : e)
189
+ e.respond_to?(:force_encoding) ? e.force_encoding("Windows-1252") : e
190
+ }
191
+ end
192
+
193
+ def latin_kern_pairs_table
194
+ @kern_pairs_table ||= @kern_pairs.inject({}) do |h,p|
195
+ h[p[0].map { |n| Encoding::WinAnsi::CHARACTERS.index(n) }] = p[1]
196
+ h
197
+ end
198
+ end
199
+
200
+ def latin_glyphs_table
201
+ @glyphs_table ||= (0..255).map do |i|
202
+ @glyph_widths[Encoding::WinAnsi::CHARACTERS[i]].to_i
203
+ end
204
+ end
205
+
206
+ private
207
+
208
+ def unscaled_width_of(string)
209
+ glyph_table = latin_glyphs_table
210
+
211
+ string.unpack("C*").inject(0) do |s,r|
212
+ s + glyph_table[r]
213
+ end
214
+ end
215
+ end
216
+ end
217
+ end
@@ -0,0 +1,34 @@
1
+ require 'prawn/font/ttf'
2
+
3
+ module Prawn
4
+ class Font
5
+ class DFont < TTF
6
+
7
+ # Returns a list of the names of all named fonts in the given dfont file.
8
+ # Note that fonts are not required to be named in a dfont file, so the
9
+ # list may be empty even if the file does contain fonts. Also, note that
10
+ # the list is returned in no particular order, so the first font in the
11
+ # list is not necessarily the font at index 0 in the file.
12
+ #
13
+ def self.named_fonts(file)
14
+ TTFunk::ResourceFile.open(file) do |f|
15
+ return f.resources_for("sfnt")
16
+ end
17
+ end
18
+
19
+ # Returns the number of fonts contained in the dfont file.
20
+ #
21
+ def self.font_count(file)
22
+ TTFunk::ResourceFile.open(file) do |f|
23
+ return f.map["sfnt"][:list].length
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def read_ttf_file
30
+ TTFunk::File.from_dfont(@name, @options[:font] || 0)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,341 @@
1
+ require 'ttfunk'
2
+ require 'ttfunk/subset_collection'
3
+
4
+ module Prawn
5
+ class Font
6
+ class TTF < Font
7
+ attr_reader :ttf, :subsets
8
+
9
+ def unicode?
10
+ true
11
+ end
12
+
13
+ def initialize(document, name, options={})
14
+ super
15
+
16
+ @ttf = read_ttf_file
17
+ @subsets = TTFunk::SubsetCollection.new(@ttf)
18
+
19
+ @attributes = {}
20
+ @bounding_boxes = {}
21
+ @char_widths = {}
22
+ @has_kerning_data = @ttf.kerning.exists? && @ttf.kerning.tables.any?
23
+
24
+ @ascender = Integer(@ttf.ascent * scale_factor)
25
+ @descender = Integer(@ttf.descent * scale_factor)
26
+ @line_gap = Integer(@ttf.line_gap * scale_factor)
27
+ end
28
+
29
+ # NOTE: +string+ must be UTF8-encoded.
30
+ def compute_width_of(string, options={}) #:nodoc:
31
+ scale = (options[:size] || size) / 1000.0
32
+ if options[:kerning]
33
+ kern(string).inject(0) do |s,r|
34
+ if r.is_a?(Numeric)
35
+ s - r
36
+ else
37
+ r.inject(s) { |s2, u| s2 + character_width_by_code(u) }
38
+ end
39
+ end * scale
40
+ else
41
+ string.unpack("U*").inject(0) do |s,r|
42
+ s + character_width_by_code(r)
43
+ end * scale
44
+ end
45
+ end
46
+
47
+ # The font bbox, as an array of integers
48
+ #
49
+ def bbox
50
+ @bbox ||= @ttf.bbox.map { |i| Integer(i * scale_factor) }
51
+ end
52
+
53
+ # Returns true if the font has kerning data, false otherwise
54
+ def has_kerning_data?
55
+ @has_kerning_data
56
+ end
57
+
58
+ # Perform any changes to the string that need to happen
59
+ # before it is rendered to the canvas. Returns an array of
60
+ # subset "chunks", where the even-numbered indices are the
61
+ # font subset number, and the following entry element is
62
+ # either a string or an array (for kerned text).
63
+ #
64
+ # The +text+ parameter must be UTF8-encoded.
65
+ #
66
+ def encode_text(text,options={})
67
+ text = text.chomp
68
+
69
+ if options[:kerning]
70
+ last_subset = nil
71
+ kern(text).inject([]) do |result, element|
72
+ if element.is_a?(Numeric)
73
+ result.last[1] = [result.last[1]] unless result.last[1].is_a?(Array)
74
+ result.last[1] << element
75
+ result
76
+ else
77
+ encoded = @subsets.encode(element)
78
+
79
+ if encoded.first[0] == last_subset
80
+ result.last[1] << encoded.first[1]
81
+ encoded.shift
82
+ end
83
+
84
+ if encoded.any?
85
+ last_subset = encoded.last[0]
86
+ result + encoded
87
+ else
88
+ result
89
+ end
90
+ end
91
+ end
92
+ else
93
+ @subsets.encode(text.unpack("U*"))
94
+ end
95
+ end
96
+
97
+ def basename
98
+ @basename ||= @ttf.name.postscript_name
99
+ end
100
+
101
+ # not sure how to compute this for true-type fonts...
102
+ def stemV
103
+ 0
104
+ end
105
+
106
+ def italic_angle
107
+ @italic_angle ||= if @ttf.postscript.exists?
108
+ raw = @ttf.postscript.italic_angle
109
+ hi, low = raw >> 16, raw & 0xFF
110
+ hi = -((hi ^ 0xFFFF) + 1) if hi & 0x8000 != 0
111
+ "#{hi}.#{low}".to_f
112
+ else
113
+ 0
114
+ end
115
+ end
116
+
117
+ def cap_height
118
+ @cap_height ||= begin
119
+ height = @ttf.os2.exists? && @ttf.os2.cap_height || 0
120
+ height == 0 ? ascender : height
121
+ end
122
+ end
123
+
124
+ def x_height
125
+ # FIXME: seems like if os2 table doesn't exist, we could
126
+ # just find the height of the lower-case 'x' glyph?
127
+ @ttf.os2.exists? && @ttf.os2.x_height || 0
128
+ end
129
+
130
+ def family_class
131
+ @family_class ||= (@ttf.os2.exists? && @ttf.os2.family_class || 0) >> 8
132
+ end
133
+
134
+ def serif?
135
+ @serif ||= [1,2,3,4,5,7].include?(family_class)
136
+ end
137
+
138
+ def script?
139
+ @script ||= family_class == 10
140
+ end
141
+
142
+ def pdf_flags
143
+ @flags ||= begin
144
+ flags = 0
145
+ flags |= 0x0001 if @ttf.postscript.fixed_pitch?
146
+ flags |= 0x0002 if serif?
147
+ flags |= 0x0008 if script?
148
+ flags |= 0x0040 if italic_angle != 0
149
+ flags |= 0x0004 # assume the font contains at least some non-latin characters
150
+ end
151
+ end
152
+
153
+ def normalize_encoding(text)
154
+ if text.respond_to?(:encode)
155
+ # if we're running under a M17n aware VM, ensure the string provided is
156
+ # UTF-8 (by converting it if necessary)
157
+ begin
158
+ text.encode("UTF-8")
159
+ rescue
160
+ raise Prawn::Errors::IncompatibleStringEncoding, "Encoding " +
161
+ "#{text.encoding} can not be transparently converted to UTF-8. " +
162
+ "Please ensure the encoding of the string you are attempting " +
163
+ "to use is set correctly"
164
+ end
165
+ else
166
+ # on a non M17N aware VM, use unpack as a hackish way to verify the
167
+ # string is valid utf-8. I thought it was better than loading iconv
168
+ # though.
169
+ begin
170
+ text.unpack("U*")
171
+ return text.dup
172
+ rescue
173
+ raise Prawn::Errors::IncompatibleStringEncoding, "The string you " +
174
+ "are attempting to render is not encoded in valid UTF-8."
175
+ end
176
+ end
177
+ end
178
+
179
+ private
180
+
181
+ def cmap
182
+ @cmap ||= @ttf.cmap.unicode.first or raise("no unicode cmap for font")
183
+ end
184
+
185
+ # +string+ must be UTF8-encoded.
186
+ #
187
+ # Returns an array. If an element is a numeric, it represents the
188
+ # kern amount to inject at that position. Otherwise, the element
189
+ # is an array of UTF-16 characters.
190
+ def kern(string)
191
+ a = []
192
+
193
+ string.unpack("U*").each do |r|
194
+ if a.empty?
195
+ a << [r]
196
+ elsif (kern = kern_pairs_table[[cmap[a.last.last], cmap[r]]])
197
+ kern *= scale_factor
198
+ a << -kern << [r]
199
+ else
200
+ a.last << r
201
+ end
202
+ end
203
+
204
+ a
205
+ end
206
+
207
+ def kern_pairs_table
208
+ @kerning_data ||= has_kerning_data? ? @ttf.kerning.tables.first.pairs : {}
209
+ end
210
+
211
+ def cid_to_gid_map
212
+ max = cmap.code_map.keys.max
213
+ (0..max).map { |cid| cmap[cid] }.pack("n*")
214
+ end
215
+
216
+ def hmtx
217
+ @hmtx ||= @ttf.horizontal_metrics
218
+ end
219
+
220
+ def character_width_by_code(code)
221
+ return 0 unless cmap[code]
222
+ @char_widths[code] ||= Integer(hmtx.widths[cmap[code]] * scale_factor)
223
+ end
224
+
225
+ def scale_factor
226
+ @scale ||= 1000.0 / @ttf.header.units_per_em
227
+ end
228
+
229
+ def register(subset)
230
+ temp_name = @ttf.name.postscript_name.gsub("\0","").to_sym
231
+ ref = @document.ref!(:Type => :Font, :BaseFont => temp_name)
232
+
233
+ # Embed the font metrics in the document after everything has been
234
+ # drawn, just before the document is emitted.
235
+ @document.before_render { |doc| embed(ref, subset) }
236
+
237
+ ref
238
+ end
239
+
240
+ def embed(reference, subset)
241
+ font_content = @subsets[subset].encode
242
+
243
+ # FIXME: we need postscript_name and glyph widths from the font
244
+ # subset. Perhaps this could be done by querying the subset,
245
+ # rather than by parsing the font that the subset produces?
246
+ font = TTFunk::File.new(font_content)
247
+
248
+ # empirically, it looks like Adobe Reader will not display fonts
249
+ # if their font name is more than 33 bytes long. Strange. But true.
250
+ basename = font.name.postscript_name[0, 33].gsub("\0","")
251
+
252
+ raise "Can't detect a postscript name for #{file}" if basename.nil?
253
+
254
+ compressed_font = Zlib::Deflate.deflate(font_content)
255
+
256
+ fontfile = @document.ref!(:Length => compressed_font.size,
257
+ :Length1 => font_content.size,
258
+ :Filter => :FlateDecode )
259
+ fontfile << compressed_font
260
+
261
+ descriptor = @document.ref!(:Type => :FontDescriptor,
262
+ :FontName => basename.to_sym,
263
+ :FontFile2 => fontfile,
264
+ :FontBBox => bbox,
265
+ :Flags => pdf_flags,
266
+ :StemV => stemV,
267
+ :ItalicAngle => italic_angle,
268
+ :Ascent => ascender,
269
+ :Descent => descender,
270
+ :CapHeight => cap_height,
271
+ :XHeight => x_height)
272
+
273
+ hmtx = font.horizontal_metrics
274
+ widths = font.cmap.tables.first.code_map.map { |gid|
275
+ Integer(hmtx.widths[gid] * scale_factor) }[32..-1]
276
+
277
+ # It would be nice to have Encoding set for the macroman subsets,
278
+ # and only do a ToUnicode cmap for non-encoded unicode subsets.
279
+ # However, apparently Adobe Reader won't render MacRoman encoded
280
+ # subsets if original font contains unicode characters. (It has to
281
+ # be some flag or something that ttfunk is simply copying over...
282
+ # but I can't figure out which flag that is.)
283
+ #
284
+ # For now, it's simplest to just create a unicode cmap for every font.
285
+ # It offends my inner purist, but it'll do.
286
+
287
+ map = @subsets[subset].to_unicode_map
288
+
289
+ ranges = [[]]
290
+ lines = map.keys.sort.inject("") do |s, code|
291
+ ranges << [] if ranges.last.length >= 100
292
+ unicode = map[code]
293
+ ranges.last << "<%02x><%04x>" % [code, unicode]
294
+ end
295
+
296
+ range_blocks = ranges.inject("") do |s, list|
297
+ s << "%d beginbfchar\n%s\nendbfchar\n" % [list.length, list.join("\n")]
298
+ end
299
+
300
+ to_unicode_cmap = UNICODE_CMAP_TEMPLATE % range_blocks.strip
301
+
302
+ cmap = @document.ref!({})
303
+ cmap << to_unicode_cmap
304
+ cmap.compress_stream
305
+
306
+ reference.data.update(:Subtype => :TrueType,
307
+ :BaseFont => basename.to_sym,
308
+ :FontDescriptor => descriptor,
309
+ :FirstChar => 32,
310
+ :LastChar => 255,
311
+ :Widths => @document.ref!(widths),
312
+ :ToUnicode => cmap)
313
+ end
314
+
315
+ UNICODE_CMAP_TEMPLATE = <<-STR.strip.gsub(/^\s*/, "")
316
+ /CIDInit /ProcSet findresource begin
317
+ 12 dict begin
318
+ begincmap
319
+ /CIDSystemInfo <<
320
+ /Registry (Adobe)
321
+ /Ordering (UCS)
322
+ /Supplement 0
323
+ >> def
324
+ /CMapName /Adobe-Identity-UCS def
325
+ /CMapType 2 def
326
+ 1 begincodespacerange
327
+ <00><ff>
328
+ endcodespacerange
329
+ %s
330
+ endcmap
331
+ CMapName currentdict /CMap defineresource pop
332
+ end
333
+ end
334
+ STR
335
+
336
+ def read_ttf_file
337
+ TTFunk::File.open(@name)
338
+ end
339
+ end
340
+ end
341
+ end