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,71 @@
1
+ # encoding: utf-8
2
+
3
+ # dash.rb : Implements stroke dashing
4
+ #
5
+ # Contributed by Daniel Nelson. October, 2009
6
+ #
7
+ # This is free software. Please see the LICENSE and COPYING files for details.
8
+ #
9
+ module Prawn
10
+ module Graphics
11
+ module Dash
12
+
13
+ # Sets the dash pattern for stroked lines and curves
14
+ #
15
+ # length is the length of the dash. If options is not present,
16
+ # or options[:space] is nil, then length is also the length of
17
+ # the space between dashes
18
+ #
19
+ # options may contain :space and :phase
20
+ # :space is the space between the dashes
21
+ # :phase is where in the cycle to begin dashing. For
22
+ # example, a phase of 0 starts at the beginning of
23
+ # the dash; whereas, if the phase is equal to the
24
+ # length of the dash, then stroking will begin at
25
+ # the beginning of the space. Default is 0
26
+ #
27
+ # integers or floats may be used for length and the options
28
+ #
29
+ # dash units are in PDF points ( 1/72 in )
30
+ #
31
+ def dash(length=nil, options={})
32
+ return @dash || undash_hash if length.nil?
33
+
34
+ @dash = { :dash => length,
35
+ :space => options[:space] || length,
36
+ :phase => options[:phase] || 0 }
37
+
38
+ write_stroke_dash
39
+ end
40
+
41
+ alias_method :dash=, :dash
42
+
43
+ # Stops dashing, restoring solid stroked lines and curves
44
+ #
45
+ def undash
46
+ @dash = undash_hash
47
+ write_stroke_dash
48
+ end
49
+
50
+ # Returns when stroke is dashed, false otherwise
51
+ #
52
+ def dashed?
53
+ dash != undash_hash
54
+ end
55
+
56
+ private
57
+
58
+ def undash_hash
59
+ { :dash => nil, :space => nil, :phase => 0 }
60
+ end
61
+
62
+ def write_stroke_dash
63
+ if @dash[:dash].nil?
64
+ add_content "[] 0 d"
65
+ return
66
+ end
67
+ add_content "[#{@dash[:dash]} #{@dash[:space]}] #{@dash[:phase]} d"
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,38 @@
1
+ # encoding: utf-8
2
+
3
+ # join_style.rb : Implements stroke join styling
4
+ #
5
+ # Contributed by Daniel Nelson. October, 2009
6
+ #
7
+ # This is free software. Please see the LICENSE and COPYING files for details.
8
+ #
9
+ module Prawn
10
+ module Graphics
11
+ module JoinStyle
12
+ JOIN_STYLES = { :miter => 0, :round => 1, :bevel => 2 }
13
+
14
+ # Sets the join style for stroked lines and curves
15
+ #
16
+ # style is one of :miter, :round, or :bevel
17
+ #
18
+ # NOTE: if this method is never called, :miter will be used for join style
19
+ # throughout the document
20
+ #
21
+ def join_style(style=nil)
22
+ return @join_style || :miter if style.nil?
23
+
24
+ @join_style = style
25
+
26
+ write_stroke_join_style
27
+ end
28
+
29
+ alias_method :join_style=, :join_style
30
+
31
+ private
32
+
33
+ def write_stroke_join_style
34
+ add_content "#{JOIN_STYLES[@join_style]} j"
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,157 @@
1
+ # encoding: utf-8
2
+ #
3
+ # transformation.rb: Implements rotate, translate, skew, scale and a generic
4
+ # transformation_matrix
5
+ #
6
+ # Copyright January 2010, Michael Witrant. All Rights Reserved.
7
+ #
8
+ # This is free software. Please see the LICENSE and COPYING files for details.
9
+ #
10
+
11
+ module Prawn
12
+ module Graphics
13
+ module Transformation
14
+
15
+ # Rotate the user space. If a block is not provided, then you must save
16
+ # and restore the graphics state yourself.
17
+ #
18
+ # == Options
19
+ # <tt>:origin</tt>:: <tt>[number, number]</tt>. The point around which to
20
+ # rotate. A block must be provided if using the :origin
21
+ #
22
+ # raises <tt>Prawn::Errors::BlockRequired</tt> if an :origin option is
23
+ # provided, but no block is given
24
+ #
25
+ # Example without a block:
26
+ #
27
+ # save_graphics_state
28
+ # rotate 30
29
+ # text "rotated text"
30
+ # restore_graphics_state
31
+ #
32
+ # Example with a block: rotating a rectangle around its upper-left corner
33
+ #
34
+ # x = 300
35
+ # y = 300
36
+ # width = 150
37
+ # height = 200
38
+ # angle = 30
39
+ # pdf.rotate(angle, :origin => [x, y]) do
40
+ # pdf.stroke_rectangle([x, y], width, height)
41
+ # end
42
+ #
43
+ def rotate(angle, options={}, &block)
44
+ Prawn.verify_options(:origin, options)
45
+ rad = degree_to_rad(angle)
46
+ cos = Math.cos(rad)
47
+ sin = Math.sin(rad)
48
+ if options[:origin].nil?
49
+ transformation_matrix(cos, sin, -sin, cos, 0, 0, &block)
50
+ else
51
+ raise Prawn::Errors::BlockRequired unless block_given?
52
+ x = options[:origin][0] + bounds.absolute_left
53
+ y = options[:origin][1] + bounds.absolute_bottom
54
+ x_prime = x * cos - y * sin
55
+ y_prime = x * sin + y * cos
56
+ translate(x - x_prime, y - y_prime) do
57
+ transformation_matrix(cos, sin, -sin, cos, 0, 0, &block)
58
+ end
59
+ end
60
+ end
61
+
62
+ # Translate the user space. If a block is not provided, then you must save
63
+ # and restore the graphics state yourself.
64
+ #
65
+ # Example without a block: move the text up and over 10
66
+ #
67
+ # save_graphics_state
68
+ # translate(10, 10)
69
+ # text "scaled text"
70
+ # restore_graphics_state
71
+ #
72
+ # Example with a block: draw a rectangle with its upper-left corner at
73
+ # x + 10, y + 10
74
+ #
75
+ # x = 300
76
+ # y = 300
77
+ # width = 150
78
+ # height = 200
79
+ # pdf.translate(10, 10) do
80
+ # pdf.stroke_rectangle([x, y], width, height)
81
+ # end
82
+ #
83
+ def translate(x, y, &block)
84
+ transformation_matrix(1, 0, 0, 1, x, y, &block)
85
+ end
86
+
87
+ # Scale the user space. If a block is not provided, then you must save
88
+ # and restore the graphics state yourself.
89
+ #
90
+ # == Options
91
+ # <tt>:origin</tt>:: <tt>[number, number]</tt>. The point from which to
92
+ # scale. A block must be provided if using the :origin
93
+ #
94
+ # raises <tt>Prawn::Errors::BlockRequired</tt> if an :origin option is
95
+ # provided, but no block is given
96
+ #
97
+ # Example without a block:
98
+ #
99
+ # save_graphics_state
100
+ # scale 1.5
101
+ # text "scaled text"
102
+ # restore_graphics_state
103
+ #
104
+ # Example with a block: scale a rectangle from its upper-left corner
105
+ #
106
+ # x = 300
107
+ # y = 300
108
+ # width = 150
109
+ # height = 200
110
+ # factor = 1.5
111
+ # pdf.scale(angle, :origin => [x, y]) do
112
+ # pdf.stroke_rectangle([x, y], width, height)
113
+ # end
114
+ #
115
+ def scale(factor, options={}, &block)
116
+ Prawn.verify_options(:origin, options)
117
+ if options[:origin].nil?
118
+ transformation_matrix(factor, 0, 0, factor, 0, 0, &block)
119
+ else
120
+ raise Prawn::Errors::BlockRequired unless block_given?
121
+ x = options[:origin][0] + bounds.absolute_left
122
+ y = options[:origin][1] + bounds.absolute_bottom
123
+ x_prime = factor * x
124
+ y_prime = factor * y
125
+ translate(x - x_prime, y - y_prime) do
126
+ transformation_matrix(factor, 0, 0, factor, 0, 0, &block)
127
+ end
128
+ end
129
+ end
130
+
131
+ # The following definition of skew would only work in a clearly
132
+ # predicatable manner when if the document had no margin. don't provide
133
+ # this shortcut until it behaves in a clearly understood manner
134
+ #
135
+ # def skew(a, b, &block)
136
+ # transformation_matrix(1,
137
+ # Math.tan(degree_to_rad(a)),
138
+ # Math.tan(degree_to_rad(b)),
139
+ # 1, 0, 0, &block)
140
+ # end
141
+
142
+ # Transform the user space (see notes for rotate regarding graphics state)
143
+ # Generally, one would use the rotate, scale, translate, and skew
144
+ # convenience methods instead of calling transformation_matrix directly
145
+ def transformation_matrix(a, b, c, d, e, f)
146
+ values = [a, b, c, d, e, f].map { |x| "%.5f" % x }.join(" ")
147
+ save_graphics_state if block_given?
148
+ add_content "#{values} cm"
149
+ if block_given?
150
+ yield
151
+ restore_graphics_state
152
+ end
153
+ end
154
+
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,99 @@
1
+ # encoding: utf-8
2
+ #
3
+ # transparency.rb : Implements transparency
4
+ #
5
+ # Copyright October 2009, Daniel Nelson. All Rights Reserved.
6
+ #
7
+ # This is free software. Please see the LICENSE and COPYING files for details.
8
+ #
9
+
10
+ module Prawn
11
+ module Graphics
12
+
13
+ # The Prawn::Transparency module is used to place transparent
14
+ # content on the page. It has the capacity for separate
15
+ # transparency values for stroked content and all other content.
16
+ #
17
+ # Example:
18
+ # # both the fill and stroke will be at 50% opacity
19
+ # pdf.transparent(0.5) do
20
+ # pdf.text("hello world")
21
+ # pdf.fill_and_stroke_circle_at([x, y], :radius => 25)
22
+ # end
23
+ #
24
+ # # the fill will be at 50% opacity, but the stroke will
25
+ # # be at 75% opacity
26
+ # pdf.transparent(0.5, 0.75) do
27
+ # pdf.text("hello world")
28
+ # pdf.fill_and_stroke_circle_at([x, y], :radius => 25)
29
+ # end
30
+ #
31
+ module Transparency
32
+
33
+ # Sets the <tt>opacity</tt> and <tt>stroke_opacity</tt> for all
34
+ # the content within the <tt>block</tt>
35
+ # If <tt>stroke_opacity</tt> is not provided, then it takes on
36
+ # the same value as <tt>opacity</tt>
37
+ #
38
+ # Valid ranges for both paramters are 0.0 to 1.0
39
+ #
40
+ # Example:
41
+ # # both the fill and stroke will be at 50% opacity
42
+ # pdf.transparent(0.5) do
43
+ # pdf.text("hello world")
44
+ # pdf.fill_and_stroke_circle_at([x, y], :radius => 25)
45
+ # end
46
+ #
47
+ # # the fill will be at 50% opacity, but the stroke will
48
+ # # be at 75% opacity
49
+ # pdf.transparent(0.5, 0.75) do
50
+ # pdf.text("hello world")
51
+ # pdf.fill_and_stroke_circle_at([x, y], :radius => 25)
52
+ # end
53
+ #
54
+ def transparent(opacity, stroke_opacity=opacity, &block)
55
+ min_version(1.4)
56
+
57
+ opacity = [[opacity, 0.0].max, 1.0].min
58
+ stroke_opacity = [[stroke_opacity, 0.0].max, 1.0].min
59
+
60
+ save_graphics_state
61
+ add_content "/#{opacity_dictionary_name(opacity, stroke_opacity)} gs"
62
+ yield if block_given?
63
+ restore_graphics_state
64
+ end
65
+
66
+ private
67
+
68
+ def opacity_dictionary_registry
69
+ @opacity_dictionary_registry ||= {}
70
+ end
71
+
72
+ def next_opacity_dictionary_id
73
+ opacity_dictionary_registry.length + 1
74
+ end
75
+
76
+ def opacity_dictionary_name(opacity, stroke_opacity)
77
+ key = "#{opacity}_#{stroke_opacity}"
78
+
79
+ if opacity_dictionary_registry[key]
80
+ dictionary = opacity_dictionary_registry[key][:obj]
81
+ dictionary_name = opacity_dictionary_registry[key][:name]
82
+ else
83
+ dictionary = ref!(:Type => :ExtGState,
84
+ :CA => stroke_opacity,
85
+ :ca => opacity
86
+ )
87
+
88
+ dictionary_name = "Tr#{next_opacity_dictionary_id}"
89
+ opacity_dictionary_registry[key] = { :name => dictionary_name,
90
+ :obj => dictionary }
91
+ end
92
+
93
+ page.ext_gstates.merge!(dictionary_name => dictionary)
94
+ dictionary_name
95
+ end
96
+
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,337 @@
1
+ # encoding: ASCII-8BIT
2
+ # images.rb : Implements PDF image embedding
3
+ #
4
+ # Copyright April 2008, James Healy, Gregory Brown. All Rights Reserved.
5
+ #
6
+ # This is free software. Please see the LICENSE and COPYING files for details.
7
+
8
+ require 'digest/sha1'
9
+
10
+ module Prawn
11
+
12
+ module Images
13
+
14
+ # Add the image at filename to the current page. Currently only
15
+ # JPG and PNG files are supported.
16
+ #
17
+ # Arguments:
18
+ # <tt>file</tt>:: path to file or an object that responds to #read
19
+ #
20
+ # Options:
21
+ # <tt>:at</tt>:: an array [x,y] with the location of the top left corner of the image.
22
+ # <tt>:position</tt>:: One of (:left, :center, :right) or an x-offset
23
+ # <tt>:vposition</tt>:: One of (:top, :center, :center) or an y-offset
24
+ # <tt>:height</tt>:: the height of the image [actual height of the image]
25
+ # <tt>:width</tt>:: the width of the image [actual width of the image]
26
+ # <tt>:scale</tt>:: scale the dimensions of the image proportionally
27
+ # <tt>:fit</tt>:: scale the dimensions of the image proportionally to fit inside [width,height]
28
+ #
29
+ # Prawn::Document.generate("image2.pdf", :page_layout => :landscape) do
30
+ # pigs = "#{Prawn::BASEDIR}/data/images/pigs.jpg"
31
+ # image pigs, :at => [50,450], :width => 450
32
+ #
33
+ # dice = "#{Prawn::BASEDIR}/data/images/dice.png"
34
+ # image dice, :at => [50, 450], :scale => 0.75
35
+ # end
36
+ #
37
+ # If only one of :width / :height are provided, the image will be scaled
38
+ # proportionally. When both are provided, the image will be stretched to
39
+ # fit the dimensions without maintaining the aspect ratio.
40
+ #
41
+ #
42
+ # If :at is provided, the image will be place in the current page but
43
+ # the text position will not be changed.
44
+ #
45
+ #
46
+ # If instead of an explicit filename, an object with a read method is
47
+ # passed as +file+, you can embed images from IO objects and things
48
+ # that act like them (including Tempfiles and open-uri objects).
49
+ #
50
+ # require "open-uri"
51
+ #
52
+ # Prawn::Document.generate("remote_images.pdf") do
53
+ # image open("http://prawn.majesticseacreature.com/media/prawn_logo.png")
54
+ # end
55
+ #
56
+ # This method returns an image info object which can be used to check the
57
+ # dimensions of an image object if needed.
58
+ # (See also: Prawn::Images::PNG , Prawn::Images::JPG)
59
+ #
60
+ def image(file, options={})
61
+ Prawn.verify_options [:at, :position, :vposition, :height,
62
+ :width, :scale, :fit], options
63
+
64
+ if file.respond_to?(:read)
65
+ image_content = file.read
66
+ else
67
+ raise ArgumentError, "#{file} not found" unless File.file?(file)
68
+ image_content = File.binread(file)
69
+ end
70
+
71
+ image_sha1 = Digest::SHA1.hexdigest(image_content)
72
+
73
+ # if this image has already been embedded, just reuse it
74
+ if image_registry[image_sha1]
75
+ info = image_registry[image_sha1][:info]
76
+ image_obj = image_registry[image_sha1][:obj]
77
+ else
78
+ # build the image object and embed the raw data
79
+ image_obj = case detect_image_format(image_content)
80
+ when :jpg then
81
+ info = Prawn::Images::JPG.new(image_content)
82
+ build_jpg_object(image_content, info)
83
+ when :png then
84
+ info = Prawn::Images::PNG.new(image_content)
85
+ build_png_object(image_content, info)
86
+ end
87
+ image_registry[image_sha1] = {:obj => image_obj, :info => info}
88
+ end
89
+
90
+ # find where the image will be placed and how big it will be
91
+ w,h = calc_image_dimensions(info, options)
92
+
93
+ if options[:at]
94
+ x,y = map_to_absolute(options[:at])
95
+ else
96
+ x,y = image_position(w,h,options)
97
+ move_text_position h
98
+ end
99
+
100
+ # add a reference to the image object to the current page
101
+ # resource list and give it a label
102
+ label = "I#{next_image_id}"
103
+ page.xobjects.merge!( label => image_obj )
104
+
105
+ # add the image to the current page
106
+ instruct = "\nq\n%.3f 0 0 %.3f %.3f %.3f cm\n/%s Do\nQ"
107
+ add_content instruct % [ w, h, x, y - h, label ]
108
+
109
+ return info
110
+ end
111
+
112
+ private
113
+
114
+ def image_position(w,h,options)
115
+ options[:position] ||= :left
116
+
117
+ x = case options[:position]
118
+ when :left
119
+ bounds.absolute_left
120
+ when :center
121
+ bounds.absolute_left + (bounds.width - w) / 2.0
122
+ when :right
123
+ bounds.absolute_right - w
124
+ when Numeric
125
+ options[:position] + bounds.absolute_left
126
+ end
127
+
128
+ y = case options[:vposition]
129
+ when :top
130
+ bounds.absolute_top
131
+ when :center
132
+ bounds.absolute_top - (bounds.height - h) / 2.0
133
+ when :bottom
134
+ bounds.absolute_bottom + h
135
+ when Numeric
136
+ bounds.absolute_top - options[:vposition]
137
+ else
138
+ self.y
139
+ end
140
+ return [x,y]
141
+ end
142
+
143
+ def build_jpg_object(data, jpg)
144
+ color_space = case jpg.channels
145
+ when 1
146
+ :DeviceGray
147
+ when 3
148
+ :DeviceRGB
149
+ when 4
150
+ :DeviceCMYK
151
+ else
152
+ raise ArgumentError, 'JPG uses an unsupported number of channels'
153
+ end
154
+ obj = ref!(:Type => :XObject,
155
+ :Subtype => :Image,
156
+ :Filter => :DCTDecode,
157
+ :ColorSpace => color_space,
158
+ :BitsPerComponent => jpg.bits,
159
+ :Width => jpg.width,
160
+ :Height => jpg.height,
161
+ :Length => data.size )
162
+
163
+ # add extra decode params for CMYK images. By swapping the
164
+ # min and max values from the default, we invert the colours. See
165
+ # section 4.8.4 of the spec.
166
+ if color_space == :DeviceCMYK
167
+ obj.data[:Decode] = [ 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0 ]
168
+ end
169
+
170
+ obj << data
171
+ return obj
172
+ end
173
+
174
+ def build_png_object(data, png)
175
+
176
+ if png.compression_method != 0
177
+ raise Errors::UnsupportedImageType, 'PNG uses an unsupported compression method'
178
+ end
179
+
180
+ if png.filter_method != 0
181
+ raise Errors::UnsupportedImageType, 'PNG uses an unsupported filter method'
182
+ end
183
+
184
+ if png.interlace_method != 0
185
+ raise Errors::UnsupportedImageType, 'PNG uses unsupported interlace method'
186
+ end
187
+
188
+ # some PNG types store the colour and alpha channel data together,
189
+ # which the PDF spec doesn't like, so split it out.
190
+ png.split_alpha_channel!
191
+
192
+ case png.colors
193
+ when 1
194
+ color = :DeviceGray
195
+ when 3
196
+ color = :DeviceRGB
197
+ else
198
+ raise Errors::UnsupportedImageType, "PNG uses an unsupported number of colors (#{png.colors})"
199
+ end
200
+
201
+ # build the image dict
202
+ obj = ref!(:Type => :XObject,
203
+ :Subtype => :Image,
204
+ :Height => png.height,
205
+ :Width => png.width,
206
+ :BitsPerComponent => png.bits,
207
+ :Length => png.img_data.size,
208
+ :Filter => :FlateDecode
209
+ )
210
+
211
+ unless png.alpha_channel
212
+ obj.data[:DecodeParms] = {:Predictor => 15,
213
+ :Colors => png.colors,
214
+ :BitsPerComponent => png.bits,
215
+ :Columns => png.width}
216
+ end
217
+
218
+ # append the actual image data to the object as a stream
219
+ obj << png.img_data
220
+
221
+ # sort out the colours of the image
222
+ if png.palette.empty?
223
+ obj.data[:ColorSpace] = color
224
+ else
225
+ # embed the colour palette in the PDF as a object stream
226
+ palette_obj = ref!(:Length => png.palette.size)
227
+ palette_obj << png.palette
228
+
229
+ # build the color space array for the image
230
+ obj.data[:ColorSpace] = [:Indexed,
231
+ :DeviceRGB,
232
+ (png.palette.size / 3) -1,
233
+ palette_obj]
234
+ end
235
+
236
+ # *************************************
237
+ # add transparency data if necessary
238
+ # *************************************
239
+
240
+ # For PNG color types 0, 2 and 3, the transparency data is stored in
241
+ # a dedicated PNG chunk, and is exposed via the transparency attribute
242
+ # of the PNG class.
243
+ if png.transparency[:grayscale]
244
+ # Use Color Key Masking (spec section 4.8.5)
245
+ # - An array with N elements, where N is two times the number of color
246
+ # components.
247
+ val = png.transparency[:grayscale]
248
+ obj.data[:Mask] = [val, val]
249
+ elsif png.transparency[:rgb]
250
+ # Use Color Key Masking (spec section 4.8.5)
251
+ # - An array with N elements, where N is two times the number of color
252
+ # components.
253
+ rgb = png.transparency[:rgb]
254
+ obj.data[:Mask] = rgb.collect { |x| [x,x] }.flatten
255
+ elsif png.transparency[:indexed]
256
+ # TODO: broken. I was attempting to us Color Key Masking, but I think
257
+ # we need to construct an SMask i think. Maybe do it inside
258
+ # the PNG class, and store it in alpha_channel
259
+ #obj.data[:Mask] = png.transparency[:indexed]
260
+ end
261
+
262
+ # For PNG color types 4 and 6, the transparency data is stored as a alpha
263
+ # channel mixed in with the main image data. The PNG class seperates
264
+ # it out for us and makes it available via the alpha_channel attribute
265
+ if png.alpha_channel
266
+ min_version 1.4
267
+ smask_obj = ref!(:Type => :XObject,
268
+ :Subtype => :Image,
269
+ :Height => png.height,
270
+ :Width => png.width,
271
+ :BitsPerComponent => png.bits,
272
+ :Length => png.alpha_channel.size,
273
+ :Filter => :FlateDecode,
274
+ :ColorSpace => :DeviceGray,
275
+ :Decode => [0, 1]
276
+ )
277
+ smask_obj << png.alpha_channel
278
+ obj.data[:SMask] = smask_obj
279
+ end
280
+
281
+ return obj
282
+ end
283
+
284
+ def calc_image_dimensions(info, options)
285
+ w = options[:width] || info.width
286
+ h = options[:height] || info.height
287
+
288
+ if options[:width] && !options[:height]
289
+ wp = w / info.width.to_f
290
+ w = info.width * wp
291
+ h = info.height * wp
292
+ elsif options[:height] && !options[:width]
293
+ hp = h / info.height.to_f
294
+ w = info.width * hp
295
+ h = info.height * hp
296
+ elsif options[:scale]
297
+ w = info.width * options[:scale]
298
+ h = info.height * options[:scale]
299
+ elsif options[:fit]
300
+ bw, bh = options[:fit]
301
+ bp = bw / bh.to_f
302
+ ip = info.width / info.height.to_f
303
+ if ip > bp
304
+ w = bw
305
+ h = bw / ip
306
+ else
307
+ h = bh
308
+ w = bh * ip
309
+ end
310
+ end
311
+ info.scaled_width = w
312
+ info.scaled_height = h
313
+ [w,h]
314
+ end
315
+
316
+ def detect_image_format(content)
317
+ top = content[0,128]
318
+
319
+ if top[0, 3] == "\xff\xd8\xff"
320
+ return :jpg
321
+ elsif top[0, 8] == "\x89PNG\x0d\x0a\x1a\x0a"
322
+ return :png
323
+ else
324
+ raise Errors::UnsupportedImageType, "image file is an unrecognised format"
325
+ end
326
+ end
327
+
328
+ def image_registry
329
+ @image_registry ||= {}
330
+ end
331
+
332
+ def next_image_id
333
+ @image_counter ||= 0
334
+ @image_counter += 1
335
+ end
336
+ end
337
+ end