prawn 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (278) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +2 -0
  3. data.tar.gz.sig +0 -0
  4. data/Gemfile +1 -9
  5. data/Rakefile +12 -22
  6. data/lib/prawn.rb +29 -48
  7. data/lib/prawn/document.rb +148 -123
  8. data/lib/prawn/document/bounding_box.rb +33 -26
  9. data/lib/prawn/document/column_box.rb +5 -7
  10. data/lib/prawn/document/internals.rb +6 -6
  11. data/lib/prawn/document/span.rb +20 -17
  12. data/lib/prawn/encoding.rb +65 -67
  13. data/lib/prawn/errors.rb +10 -7
  14. data/lib/prawn/font.rb +78 -62
  15. data/lib/prawn/font/afm.rb +93 -66
  16. data/lib/prawn/font/dfont.rb +2 -10
  17. data/lib/prawn/font/ttc.rb +34 -0
  18. data/lib/prawn/font/ttf.rb +73 -65
  19. data/lib/prawn/font_metric_cache.rb +9 -8
  20. data/lib/prawn/graphics.rb +110 -70
  21. data/lib/prawn/graphics/blend_mode.rb +7 -8
  22. data/lib/prawn/graphics/cap_style.rb +2 -4
  23. data/lib/prawn/graphics/color.rb +23 -26
  24. data/lib/prawn/graphics/dash.rb +22 -12
  25. data/lib/prawn/graphics/join_style.rb +8 -4
  26. data/lib/prawn/graphics/patterns.rb +185 -96
  27. data/lib/prawn/graphics/transformation.rb +11 -9
  28. data/lib/prawn/graphics/transparency.rb +15 -13
  29. data/lib/prawn/grid.rb +20 -20
  30. data/lib/prawn/image_handler.rb +4 -6
  31. data/lib/prawn/images.rb +22 -15
  32. data/lib/prawn/images/image.rb +0 -1
  33. data/lib/prawn/images/jpg.rb +26 -22
  34. data/lib/prawn/images/png.rb +60 -57
  35. data/lib/prawn/measurement_extensions.rb +8 -9
  36. data/lib/prawn/measurements.rb +14 -15
  37. data/lib/prawn/outline.rb +96 -78
  38. data/lib/prawn/repeater.rb +12 -10
  39. data/lib/prawn/security.rb +66 -48
  40. data/lib/prawn/security/arcfour.rb +1 -3
  41. data/lib/prawn/soft_mask.rb +23 -25
  42. data/lib/prawn/stamp.rb +16 -12
  43. data/lib/prawn/text.rb +59 -45
  44. data/lib/prawn/text/box.rb +9 -8
  45. data/lib/prawn/text/formatted.rb +4 -6
  46. data/lib/prawn/text/formatted/arranger.rb +51 -30
  47. data/lib/prawn/text/formatted/box.rb +112 -88
  48. data/lib/prawn/text/formatted/fragment.rb +10 -15
  49. data/lib/prawn/text/formatted/line_wrap.rb +118 -61
  50. data/lib/prawn/text/formatted/parser.rb +134 -110
  51. data/lib/prawn/text/formatted/wrap.rb +42 -32
  52. data/lib/prawn/transformation_stack.rb +3 -4
  53. data/lib/prawn/utilities.rb +6 -21
  54. data/lib/prawn/version.rb +1 -3
  55. data/lib/prawn/view.rb +4 -2
  56. data/manual/basic_concepts/adding_pages.rb +4 -7
  57. data/manual/basic_concepts/basic_concepts.rb +29 -22
  58. data/manual/basic_concepts/creation.rb +8 -11
  59. data/manual/basic_concepts/cursor.rb +2 -5
  60. data/manual/basic_concepts/measurement.rb +3 -6
  61. data/manual/basic_concepts/origin.rb +3 -6
  62. data/manual/basic_concepts/other_cursor_helpers.rb +9 -12
  63. data/manual/basic_concepts/view.rb +20 -16
  64. data/manual/bounding_box/bounding_box.rb +27 -24
  65. data/manual/bounding_box/bounds.rb +9 -12
  66. data/manual/bounding_box/canvas.rb +2 -5
  67. data/manual/bounding_box/creation.rb +4 -7
  68. data/manual/bounding_box/indentation.rb +12 -15
  69. data/manual/bounding_box/nesting.rb +22 -17
  70. data/manual/bounding_box/russian_boxes.rb +8 -9
  71. data/manual/bounding_box/stretchy.rb +10 -13
  72. data/manual/contents.rb +26 -22
  73. data/manual/cover.rb +22 -20
  74. data/manual/document_and_page_options/background.rb +9 -13
  75. data/manual/document_and_page_options/document_and_page_options.rb +23 -20
  76. data/manual/document_and_page_options/metadata.rb +16 -16
  77. data/manual/document_and_page_options/page_margins.rb +16 -20
  78. data/manual/document_and_page_options/page_size.rb +11 -12
  79. data/manual/document_and_page_options/print_scaling.rb +15 -15
  80. data/manual/example_helper.rb +2 -4
  81. data/manual/graphics/blend_mode.rb +10 -9
  82. data/manual/graphics/circle_and_ellipse.rb +2 -5
  83. data/manual/graphics/color.rb +5 -9
  84. data/manual/graphics/common_lines.rb +5 -8
  85. data/manual/graphics/fill_and_stroke.rb +2 -5
  86. data/manual/graphics/fill_rules.rb +7 -10
  87. data/manual/graphics/gradients.rb +25 -21
  88. data/manual/graphics/graphics.rb +49 -43
  89. data/manual/graphics/helper.rb +10 -9
  90. data/manual/graphics/line_width.rb +5 -7
  91. data/manual/graphics/lines_and_curves.rb +5 -8
  92. data/manual/graphics/polygon.rb +4 -8
  93. data/manual/graphics/rectangle.rb +2 -5
  94. data/manual/graphics/rotate.rb +4 -7
  95. data/manual/graphics/scale.rb +12 -15
  96. data/manual/graphics/soft_masks.rb +1 -4
  97. data/manual/graphics/stroke_cap.rb +3 -6
  98. data/manual/graphics/stroke_dash.rb +9 -12
  99. data/manual/graphics/stroke_join.rb +2 -5
  100. data/manual/graphics/translate.rb +7 -10
  101. data/manual/graphics/transparency.rb +5 -8
  102. data/manual/how_to_read_this_manual.rb +4 -6
  103. data/manual/images/absolute_position.rb +4 -7
  104. data/manual/images/fit.rb +5 -8
  105. data/manual/images/horizontal.rb +6 -9
  106. data/manual/images/images.rb +25 -23
  107. data/manual/images/plain_image.rb +3 -6
  108. data/manual/images/scale.rb +7 -10
  109. data/manual/images/vertical.rb +10 -13
  110. data/manual/images/width_and_height.rb +8 -11
  111. data/manual/layout/boxes.rb +3 -6
  112. data/manual/layout/content.rb +5 -8
  113. data/manual/layout/layout.rb +16 -16
  114. data/manual/layout/simple_grid.rb +4 -7
  115. data/manual/outline/add_subsection_to.rb +18 -21
  116. data/manual/outline/insert_section_after.rb +13 -16
  117. data/manual/outline/outline.rb +19 -17
  118. data/manual/outline/sections_and_pages.rb +15 -18
  119. data/manual/repeatable_content/alternate_page_numbering.rb +19 -17
  120. data/manual/repeatable_content/page_numbering.rb +15 -16
  121. data/manual/repeatable_content/repeatable_content.rb +23 -19
  122. data/manual/repeatable_content/repeater.rb +12 -15
  123. data/manual/repeatable_content/stamp.rb +12 -15
  124. data/manual/security/encryption.rb +7 -10
  125. data/manual/security/permissions.rb +17 -14
  126. data/manual/security/security.rb +17 -16
  127. data/manual/table.rb +2 -4
  128. data/manual/text/alignment.rb +14 -17
  129. data/manual/text/color.rb +10 -11
  130. data/manual/text/column_box.rb +5 -8
  131. data/manual/text/fallback_fonts.rb +23 -21
  132. data/manual/text/font.rb +9 -12
  133. data/manual/text/font_size.rb +11 -14
  134. data/manual/text/font_style.rb +4 -7
  135. data/manual/text/formatted_callbacks.rb +23 -21
  136. data/manual/text/formatted_text.rb +31 -25
  137. data/manual/text/free_flowing_text.rb +18 -21
  138. data/manual/text/inline.rb +16 -19
  139. data/manual/text/kerning_and_character_spacing.rb +12 -15
  140. data/manual/text/leading.rb +5 -8
  141. data/manual/text/line_wrapping.rb +33 -17
  142. data/manual/text/paragraph_indentation.rb +11 -14
  143. data/manual/text/positioned_text.rb +13 -16
  144. data/manual/text/registering_families.rb +16 -19
  145. data/manual/text/rendering_and_color.rb +7 -10
  146. data/manual/text/right_to_left_text.rb +24 -19
  147. data/manual/text/rotation.rb +26 -23
  148. data/manual/text/single_usage.rb +6 -9
  149. data/manual/text/text.rb +56 -52
  150. data/manual/text/text_box_excess.rb +18 -17
  151. data/manual/text/text_box_extensions.rb +16 -15
  152. data/manual/text/text_box_overflow.rb +15 -18
  153. data/manual/text/utf8.rb +9 -12
  154. data/manual/text/win_ansi_charset.rb +18 -19
  155. data/prawn.gemspec +37 -27
  156. data/spec/extensions/encoding_helpers.rb +0 -2
  157. data/spec/manual_spec.rb +33 -0
  158. data/spec/prawn/document/bounding_box_spec.rb +546 -0
  159. data/spec/prawn/document/column_box_spec.rb +73 -0
  160. data/spec/prawn/document/security_spec.rb +173 -0
  161. data/spec/prawn/document_annotations_spec.rb +74 -0
  162. data/spec/prawn/document_destinations_spec.rb +13 -0
  163. data/spec/prawn/document_grid_spec.rb +96 -0
  164. data/spec/prawn/document_reference_spec.rb +25 -0
  165. data/spec/prawn/document_span_spec.rb +34 -0
  166. data/spec/prawn/document_spec.rb +751 -0
  167. data/spec/prawn/font_metric_cache_spec.rb +52 -0
  168. data/spec/prawn/font_spec.rb +513 -0
  169. data/spec/prawn/graphics/blend_mode_spec.rb +61 -0
  170. data/spec/prawn/graphics/transparency_spec.rb +79 -0
  171. data/spec/prawn/graphics_spec.rb +817 -0
  172. data/spec/prawn/graphics_stroke_styles_spec.rb +227 -0
  173. data/spec/{image_handler_spec.rb → prawn/image_handler_spec.rb} +13 -15
  174. data/spec/prawn/images/jpg_spec.rb +18 -0
  175. data/spec/prawn/images/png_spec.rb +281 -0
  176. data/spec/prawn/images_spec.rb +170 -0
  177. data/spec/prawn/measurements_extensions_spec.rb +22 -0
  178. data/spec/prawn/outline_spec.rb +408 -0
  179. data/spec/prawn/repeater_spec.rb +163 -0
  180. data/spec/prawn/soft_mask_spec.rb +72 -0
  181. data/spec/prawn/stamp_spec.rb +168 -0
  182. data/spec/prawn/text/box_spec.rb +1113 -0
  183. data/spec/prawn/text/formatted/arranger_spec.rb +464 -0
  184. data/spec/prawn/text/formatted/box_spec.rb +825 -0
  185. data/spec/prawn/text/formatted/fragment_spec.rb +341 -0
  186. data/spec/prawn/text/formatted/line_wrap_spec.rb +491 -0
  187. data/spec/prawn/text/formatted/parser_spec.rb +667 -0
  188. data/spec/prawn/text_draw_text_spec.rb +147 -0
  189. data/spec/prawn/text_rendering_mode_spec.rb +42 -0
  190. data/spec/prawn/text_spacing_spec.rb +93 -0
  191. data/spec/prawn/text_spec.rb +601 -0
  192. data/spec/prawn/text_with_inline_formatting_spec.rb +33 -0
  193. data/spec/{transformation_stack_spec.rb → prawn/transformation_stack_spec.rb} +21 -20
  194. data/spec/prawn/view_spec.rb +45 -0
  195. data/spec/spec_helper.rb +16 -16
  196. metadata +96 -151
  197. metadata.gz.sig +1 -0
  198. data/data/images/16bit.alpha +0 -0
  199. data/data/images/16bit.color +0 -0
  200. data/data/images/16bit.png +0 -0
  201. data/data/images/arrow.png +0 -0
  202. data/data/images/arrow2.png +0 -0
  203. data/data/images/blend_modes_bottom_layer.jpg +0 -0
  204. data/data/images/blend_modes_top_layer.jpg +0 -0
  205. data/data/images/dice.alpha +0 -0
  206. data/data/images/dice.color +0 -0
  207. data/data/images/dice.png +0 -0
  208. data/data/images/dice_interlaced.png +0 -0
  209. data/data/images/fractal.jpg +0 -0
  210. data/data/images/indexed_color.dat +0 -0
  211. data/data/images/indexed_color.png +0 -0
  212. data/data/images/indexed_transparency.png +0 -0
  213. data/data/images/indexed_transparency_alpha.dat +0 -0
  214. data/data/images/indexed_transparency_color.dat +0 -0
  215. data/data/images/letterhead.jpg +0 -0
  216. data/data/images/license.md +0 -8
  217. data/data/images/page_white_text.alpha +0 -0
  218. data/data/images/page_white_text.color +0 -0
  219. data/data/images/page_white_text.png +0 -0
  220. data/data/images/pigs.jpg +0 -0
  221. data/data/images/prawn.png +0 -0
  222. data/data/images/ruport.png +0 -0
  223. data/data/images/ruport_data.dat +0 -0
  224. data/data/images/ruport_transparent.png +0 -0
  225. data/data/images/ruport_type0.png +0 -0
  226. data/data/images/stef.jpg +0 -0
  227. data/data/images/tru256.bmp +0 -0
  228. data/data/images/web-links.dat +0 -1
  229. data/data/images/web-links.png +0 -0
  230. data/data/pdfs/complex_template.pdf +0 -0
  231. data/data/pdfs/contains_ttf_font.pdf +0 -0
  232. data/data/pdfs/encrypted.pdf +0 -0
  233. data/data/pdfs/form.pdf +1 -819
  234. data/data/pdfs/hexagon.pdf +0 -61
  235. data/data/pdfs/indirect_reference.pdf +0 -86
  236. data/data/pdfs/multipage_template.pdf +0 -127
  237. data/data/pdfs/nested_pages.pdf +0 -118
  238. data/data/pdfs/page_without_mediabox.pdf +0 -193
  239. data/data/pdfs/resources_as_indirect_object.pdf +0 -83
  240. data/data/pdfs/two_hexagons.pdf +0 -90
  241. data/data/pdfs/version_1_6.pdf +0 -61
  242. data/data/shift_jis_text.txt +0 -1
  243. data/spec/acceptance/png_spec.rb +0 -35
  244. data/spec/annotations_spec.rb +0 -67
  245. data/spec/blend_mode_spec.rb +0 -71
  246. data/spec/bounding_box_spec.rb +0 -501
  247. data/spec/column_box_spec.rb +0 -59
  248. data/spec/destinations_spec.rb +0 -13
  249. data/spec/document_spec.rb +0 -738
  250. data/spec/font_metric_cache_spec.rb +0 -52
  251. data/spec/font_spec.rb +0 -475
  252. data/spec/formatted_text_arranger_spec.rb +0 -452
  253. data/spec/formatted_text_box_spec.rb +0 -716
  254. data/spec/formatted_text_fragment_spec.rb +0 -299
  255. data/spec/graphics_spec.rb +0 -705
  256. data/spec/grid_spec.rb +0 -95
  257. data/spec/images_spec.rb +0 -167
  258. data/spec/inline_formatted_text_parser_spec.rb +0 -568
  259. data/spec/jpg_spec.rb +0 -23
  260. data/spec/line_wrap_spec.rb +0 -366
  261. data/spec/measurement_units_spec.rb +0 -22
  262. data/spec/outline_spec.rb +0 -409
  263. data/spec/png_spec.rb +0 -257
  264. data/spec/reference_spec.rb +0 -25
  265. data/spec/repeater_spec.rb +0 -154
  266. data/spec/security_spec.rb +0 -151
  267. data/spec/soft_mask_spec.rb +0 -78
  268. data/spec/span_spec.rb +0 -43
  269. data/spec/stamp_spec.rb +0 -179
  270. data/spec/stroke_styles_spec.rb +0 -208
  271. data/spec/text_at_spec.rb +0 -142
  272. data/spec/text_box_spec.rb +0 -1042
  273. data/spec/text_rendering_mode_spec.rb +0 -45
  274. data/spec/text_spacing_spec.rb +0 -93
  275. data/spec/text_spec.rb +0 -543
  276. data/spec/text_with_inline_formatting_spec.rb +0 -35
  277. data/spec/transparency_spec.rb +0 -91
  278. data/spec/view_spec.rb +0 -42
@@ -1,257 +0,0 @@
1
- # encoding: ASCII-8BIT
2
-
3
- # Spec'ing the PNG class. Not complete yet - still needs to check the
4
- # contents of palette and transparency to ensure they're correct.
5
- # Need to find files that have these sections first.
6
- #
7
- # see http://www.w3.org/TR/PNG/ for a detailed description of the PNG spec,
8
- # particuarly Table 11.1 for the different color types
9
-
10
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
11
-
12
- describe "When reading a greyscale PNG file (color type 0)" do
13
- before(:each) do
14
- @filename = "#{Prawn::DATADIR}/images/web-links.png"
15
- @data_filename = "#{Prawn::DATADIR}/images/web-links.dat"
16
- @img_data = File.binread(@filename)
17
- end
18
-
19
- it "should read the attributes from the header chunk correctly" do
20
- png = Prawn::Images::PNG.new(@img_data)
21
-
22
- expect(png.width).to eq(21)
23
- expect(png.height).to eq(14)
24
- expect(png.bits).to eq(8)
25
- expect(png.color_type).to eq(0)
26
- expect(png.compression_method).to eq(0)
27
- expect(png.filter_method).to eq(0)
28
- expect(png.interlace_method).to eq(0)
29
- end
30
-
31
- it "should read the image data chunk correctly" do
32
- png = Prawn::Images::PNG.new(@img_data)
33
- data = Zlib::Inflate.inflate(File.binread(@data_filename))
34
- expect(png.img_data).to eq(data)
35
- end
36
- end
37
-
38
- describe "When reading a greyscale PNG file with transparency (color type 0)" do
39
- before(:each) do
40
- @filename = "#{Prawn::DATADIR}/images/ruport_type0.png"
41
- @img_data = File.binread(@filename)
42
- end
43
-
44
- # In a greyscale type 0 PNG image, the tRNS chunk should contain a single value
45
- # that indicates the color that should be interpreted as transparent.
46
- #
47
- # http://www.w3.org/TR/PNG/#11tRNS
48
- it "should read the tRNS chunk correctly" do
49
- png = Prawn::Images::PNG.new(@img_data)
50
- expect(png.transparency[:grayscale]).to eq(255)
51
- end
52
- end
53
-
54
- describe "When reading an RGB PNG file (color type 2)" do
55
- before(:each) do
56
- @filename = "#{Prawn::DATADIR}/images/ruport.png"
57
- @data_filename = "#{Prawn::DATADIR}/images/ruport_data.dat"
58
- @img_data = File.binread(@filename)
59
- end
60
-
61
- it "should read the attributes from the header chunk correctly" do
62
- png = Prawn::Images::PNG.new(@img_data)
63
-
64
- expect(png.width).to eq(258)
65
- expect(png.height).to eq(105)
66
- expect(png.bits).to eq(8)
67
- expect(png.color_type).to eq(2)
68
- expect(png.compression_method).to eq(0)
69
- expect(png.filter_method).to eq(0)
70
- expect(png.interlace_method).to eq(0)
71
- end
72
-
73
- it "should read the image data chunk correctly" do
74
- png = Prawn::Images::PNG.new(@img_data)
75
- data = Zlib::Inflate.inflate(File.binread(@data_filename))
76
- expect(png.img_data).to eq(data)
77
- end
78
- end
79
-
80
- describe "When reading an RGB PNG file with transparency (color type 2)" do
81
- before(:each) do
82
- @filename = "#{Prawn::DATADIR}/images/arrow2.png"
83
- @img_data = File.binread(@filename)
84
- end
85
-
86
- # In a RGB type 2 PNG image, the tRNS chunk should contain a single RGB value
87
- # that indicates the color that should be interpreted as transparent. In this
88
- # case it's green.
89
- #
90
- # http://www.w3.org/TR/PNG/#11tRNS
91
- it "should read the tRNS chunk correctly" do
92
- png = Prawn::Images::PNG.new(@img_data)
93
- expect(png.transparency[:rgb]).to eq([0, 255, 0])
94
- end
95
- end
96
-
97
- describe "When reading an indexed color PNG file with transparency (color type 3)" do
98
- let(:filename) { "#{Prawn::DATADIR}/images/indexed_transparency.png" }
99
- let(:color_filename) { "#{Prawn::DATADIR}/images/indexed_transparency_color.dat" }
100
- let(:transparency_filename) { "#{Prawn::DATADIR}/images/indexed_transparency_alpha.dat" }
101
- let(:img_data) { File.binread(filename) }
102
- let(:png) { Prawn::Images::PNG.new(img_data) }
103
-
104
- it "reads the attributes from the header chunk correctly" do
105
- expect(png.width).to eq(200)
106
- expect(png.height).to eq(200)
107
- expect(png.bits).to eq(8)
108
- expect(png.color_type).to eq(3)
109
- expect(png.compression_method).to eq(0)
110
- expect(png.filter_method).to eq(0)
111
- expect(png.interlace_method).to eq(0)
112
- end
113
-
114
- it "reads the image data correctly" do
115
- data = Zlib::Inflate.inflate(File.binread(color_filename))
116
- expect(png.img_data).to eq(data)
117
- end
118
-
119
- it "reads the image transparency correctly" do
120
- png.split_alpha_channel!
121
-
122
- data = Zlib::Inflate.inflate(File.binread(transparency_filename))
123
- expect(png.alpha_channel).to eq(data)
124
- end
125
- end
126
-
127
- describe "When reading an indexed color PNG file (color type 3)" do
128
- before(:each) do
129
- @filename = "#{Prawn::DATADIR}/images/indexed_color.png"
130
- @data_filename = "#{Prawn::DATADIR}/images/indexed_color.dat"
131
- @img_data = File.binread(@filename)
132
- end
133
-
134
- it "should read the attributes from the header chunk correctly" do
135
- png = Prawn::Images::PNG.new(@img_data)
136
-
137
- expect(png.width).to eq(150)
138
- expect(png.height).to eq(200)
139
- expect(png.bits).to eq(8)
140
- expect(png.color_type).to eq(3)
141
- expect(png.compression_method).to eq(0)
142
- expect(png.filter_method).to eq(0)
143
- expect(png.interlace_method).to eq(0)
144
- end
145
-
146
- it "should read the image data chunk correctly" do
147
- png = Prawn::Images::PNG.new(@img_data)
148
- data = Zlib::Inflate.inflate(File.binread(@data_filename))
149
- expect(png.img_data).to eq(data)
150
- end
151
- end
152
-
153
- describe "When reading a greyscale+alpha PNG file (color type 4)" do
154
- before(:each) do
155
- @filename = "#{Prawn::DATADIR}/images/page_white_text.png"
156
- @color_data_filename = "#{Prawn::DATADIR}/images/page_white_text.color"
157
- @alpha_data_filename = "#{Prawn::DATADIR}/images/page_white_text.alpha"
158
- @img_data = File.binread(@filename)
159
- end
160
-
161
- it "should read the attributes from the header chunk correctly" do
162
- png = Prawn::Images::PNG.new(@img_data)
163
-
164
- expect(png.width).to eq(16)
165
- expect(png.height).to eq(16)
166
- expect(png.bits).to eq(8)
167
- expect(png.color_type).to eq(4)
168
- expect(png.compression_method).to eq(0)
169
- expect(png.filter_method).to eq(0)
170
- expect(png.interlace_method).to eq(0)
171
- end
172
-
173
- it "should correctly return the raw image data (with no alpha channel) from the image data chunk" do
174
- png = Prawn::Images::PNG.new(@img_data)
175
- png.split_alpha_channel!
176
- data = File.binread(@color_data_filename)
177
- expect(png.img_data).to eq(data)
178
- end
179
-
180
- it "should correctly extract the alpha channel data from the image data chunk" do
181
- png = Prawn::Images::PNG.new(@img_data)
182
- png.split_alpha_channel!
183
- data = File.binread(@alpha_data_filename)
184
- expect(png.alpha_channel).to eq(data)
185
- end
186
- end
187
-
188
- describe "When reading an RGB+alpha PNG file (color type 6)" do
189
- before(:each) do
190
- @filename = "#{Prawn::DATADIR}/images/dice.png"
191
- @color_data_filename = "#{Prawn::DATADIR}/images/dice.color"
192
- @alpha_data_filename = "#{Prawn::DATADIR}/images/dice.alpha"
193
- @img_data = File.binread(@filename)
194
- end
195
-
196
- it "should read the attributes from the header chunk correctly" do
197
- png = Prawn::Images::PNG.new(@img_data)
198
-
199
- expect(png.width).to eq(320)
200
- expect(png.height).to eq(240)
201
- expect(png.bits).to eq(8)
202
- expect(png.color_type).to eq(6)
203
- expect(png.compression_method).to eq(0)
204
- expect(png.filter_method).to eq(0)
205
- expect(png.interlace_method).to eq(0)
206
- end
207
-
208
- it "should correctly return the raw image data (with no alpha channel) from the image data chunk" do
209
- png = Prawn::Images::PNG.new(@img_data)
210
- png.split_alpha_channel!
211
- data = File.binread(@color_data_filename)
212
- expect(png.img_data).to eq(data)
213
- end
214
-
215
- it "should correctly extract the alpha channel data from the image data chunk" do
216
- png = Prawn::Images::PNG.new(@img_data)
217
- png.split_alpha_channel!
218
- data = File.binread(@alpha_data_filename)
219
- expect(png.alpha_channel).to eq(data)
220
- end
221
- end
222
-
223
- describe "When reading a 16bit RGB+alpha PNG file (color type 6)" do
224
- before(:each) do
225
- @filename = "#{Prawn::DATADIR}/images/16bit.png"
226
- @color_data_filename = "#{Prawn::DATADIR}/images/16bit.color"
227
- # alpha channel truncated to 8-bit
228
- @alpha_data_filename = "#{Prawn::DATADIR}/images/16bit.alpha"
229
- @img_data = File.binread(@filename)
230
- end
231
-
232
- it "should read the attributes from the header chunk correctly" do
233
- png = Prawn::Images::PNG.new(@img_data)
234
-
235
- expect(png.width).to eq(32)
236
- expect(png.height).to eq(32)
237
- expect(png.bits).to eq(16)
238
- expect(png.color_type).to eq(6)
239
- expect(png.compression_method).to eq(0)
240
- expect(png.filter_method).to eq(0)
241
- expect(png.interlace_method).to eq(0)
242
- end
243
-
244
- it "should correctly return the raw image data (with no alpha channel) from the image data chunk" do
245
- png = Prawn::Images::PNG.new(@img_data)
246
- png.split_alpha_channel!
247
- data = File.binread(@color_data_filename)
248
- expect(png.img_data).to eq(data)
249
- end
250
-
251
- it "should correctly extract the alpha channel data from the image data chunk" do
252
- png = Prawn::Images::PNG.new(@img_data)
253
- png.split_alpha_channel!
254
- data = File.binread(@alpha_data_filename)
255
- expect(png.alpha_channel).to eq(data)
256
- end
257
- end
@@ -1,25 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
-
5
- describe "A Reference object" do
6
- describe "generated via Prawn::Document" do
7
- it "should return a proper reference on ref!" do
8
- pdf = Prawn::Document.new
9
- expect(pdf.ref!({}).is_a?(PDF::Core::Reference)).to eq(true)
10
- end
11
-
12
- it "should return an identifier on ref" do
13
- pdf = Prawn::Document.new
14
- r = pdf.ref({})
15
- expect(r.is_a?(Integer)).to eq(true)
16
- end
17
-
18
- it "should have :Length of stream if it has one when compression disabled" do
19
- pdf = Prawn::Document.new :compress => false
20
- ref = pdf.ref!({})
21
- ref << 'Hello'
22
- expect(ref.stream.data[:Length]).to eq(5)
23
- end
24
- end
25
- end
@@ -1,154 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
-
5
- describe "Repeaters" do
6
- it "creates a stamp and increments Prawn::Repeater.count on initialize" do
7
- orig_count = Prawn::Repeater.count
8
-
9
- doc = sample_document
10
- expect(doc).to receive(:create_stamp).with("prawn_repeater(#{orig_count})")
11
-
12
- r = repeater(doc, :all) { :do_nothing }
13
-
14
- expect(Prawn::Repeater.count).to eq(orig_count + 1)
15
- end
16
-
17
- it "must provide an :all filter" do
18
- doc = sample_document
19
- r = repeater(doc, :all) { :do_nothing }
20
-
21
- expect((1..doc.page_count).all? { |i| r.match?(i) }).to eq true
22
- end
23
-
24
- it "must provide an :odd filter" do
25
- doc = sample_document
26
- r = repeater(doc, :odd) { :do_nothing }
27
-
28
- odd, even = (1..doc.page_count).partition(&:odd?)
29
-
30
- expect(odd.all? { |i| r.match?(i) }).to eq true
31
- expect(even.any? { |i| r.match?(i) }).to eq false
32
- end
33
-
34
- it "must be able to filter by an array of page numbers" do
35
- doc = sample_document
36
- r = repeater(doc, [1, 2, 7]) { :do_nothing }
37
-
38
- expect((1..10).select { |i| r.match?(i) }).to eq([1, 2, 7])
39
- end
40
-
41
- it "must be able to filter by a range of page numbers" do
42
- doc = sample_document
43
- r = repeater(doc, 2..4) { :do_nothing }
44
-
45
- expect((1..10).select { |i| r.match?(i) }).to eq([2, 3, 4])
46
- end
47
-
48
- it "must be able to filter by an arbitrary proc" do
49
- doc = sample_document
50
- r = repeater(doc, lambda { |x| x == 1 or x % 3 == 0 })
51
-
52
- expect((1..10).select { |i| r.match?(i) }).to eq([1, 3, 6, 9])
53
- end
54
-
55
- it "must try to run a stamp if the page number matches" do
56
- doc = sample_document
57
- expect(doc).to receive(:stamp)
58
-
59
- repeater(doc, :odd).run(3)
60
- end
61
-
62
- it "must not try to run a stamp unless the page number matches" do
63
- doc = sample_document
64
-
65
- expect(doc).to_not receive(:stamp)
66
- repeater(doc, :odd).run(2)
67
- end
68
-
69
- it "must not try to run a stamp if dynamic is selected" do
70
- doc = sample_document
71
-
72
- expect(doc).to_not receive(:stamp)
73
- (1..10).each { |p| repeater(doc, :all, true){ :do_nothing }.run(p) }
74
- end
75
-
76
- it "must try to run a block if the page number matches" do
77
- doc = sample_document
78
-
79
- expect(doc).to receive(:draw_text).twice
80
- (1..10).each { |p| repeater(doc, [1, 2], true){ doc.draw_text "foo" }.run(p) }
81
- end
82
-
83
- it "must not try to run a block unless the page number matches" do
84
- doc = sample_document
85
-
86
- expect(doc).to_not receive(:draw_text)
87
- repeater(doc, :odd, true){ doc.draw_text "foo" }.run(2)
88
- end
89
-
90
- it "must treat any block as a closure" do
91
- doc = sample_document
92
-
93
- @page = "Page" # ensure access to ivars
94
- doc.repeat(:all, :dynamic => true) do
95
- doc.draw_text "#@page #{doc.page_number}", :at => [500, 0]
96
- end
97
-
98
- text = PDF::Inspector::Text.analyze(doc.render)
99
- expect(text.strings).to eq((1..10).to_a.map{ |p| "Page #{p}" })
100
- end
101
-
102
- it "must treat any block as a closure (Document.new instance_eval form)" do
103
- doc = Prawn::Document.new(:skip_page_creation => true) do
104
- 10.times { start_new_page }
105
-
106
- @page = "Page"
107
- repeat(:all, :dynamic => true) do
108
- # ensure self is accessible here
109
- draw_text "#@page #{page_number}", :at => [500, 0]
110
- end
111
- end
112
-
113
- text = PDF::Inspector::Text.analyze(doc.render)
114
- expect(text.strings).to eq((1..10).to_a.map{ |p| "Page #{p}" })
115
- end
116
-
117
- def sample_document
118
- doc = Prawn::Document.new(:skip_page_creation => true)
119
- 10.times { |e| doc.start_new_page }
120
- doc
121
- end
122
-
123
- def repeater(*args, &b)
124
- Prawn::Repeater.new(*args, &b)
125
- end
126
-
127
- context "graphic state" do
128
- it "should not alter the graphic state stack color space" do
129
- create_pdf
130
- starting_color_space = @pdf.state.page.graphic_state.color_space.dup
131
- @pdf.repeat :all do
132
- @pdf.text "Testing", :size => 24, :style => :bold
133
- end
134
- expect(@pdf.state.page.graphic_state.color_space).to eq(starting_color_space)
135
- end
136
-
137
- context "dynamic repeaters" do
138
- it "should preserve the graphic state at creation time" do
139
- create_pdf
140
- @pdf.repeat :all, :dynamic => true do
141
- @pdf.text "fill_color: #{@pdf.graphic_state.fill_color}"
142
- @pdf.text "cap_style: #{@pdf.graphic_state.cap_style}"
143
- end
144
- @pdf.fill_color "666666"
145
- @pdf.cap_style :round
146
- text = PDF::Inspector::Text.analyze(@pdf.render)
147
- expect(text.strings.include?("fill_color: 666666")).to eq(false)
148
- expect(text.strings.include?("fill_color: 000000")).to eq(true)
149
- expect(text.strings.include?("cap_style: round")).to eq(false)
150
- expect(text.strings.include?("cap_style: butt")).to eq(true)
151
- end
152
- end
153
- end
154
- end
@@ -1,151 +0,0 @@
1
- # encoding: utf-8
2
- require "tempfile"
3
-
4
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
5
-
6
- describe "Document encryption" do
7
- describe "Password padding" do
8
- include Prawn::Document::Security
9
-
10
- it "should truncate long passwords" do
11
- pw = "Long long string" * 30
12
- padded = pad_password(pw)
13
- expect(padded.length).to eq(32)
14
- expect(padded).to eq(pw[0, 32])
15
- end
16
-
17
- it "should pad short passwords" do
18
- pw = "abcd"
19
- padded = pad_password(pw)
20
- expect(padded.length).to eq(32)
21
- expect(padded).to eq(pw + Prawn::Document::Security::PasswordPadding[0, 28])
22
- end
23
-
24
- it "should fully pad null passwords" do
25
- pw = ""
26
- padded = pad_password(pw)
27
- expect(padded.length).to eq(32)
28
- expect(padded).to eq(Prawn::Document::Security::PasswordPadding)
29
- end
30
- end
31
-
32
- describe "Setting permissions" do
33
- def doc_with_permissions(permissions)
34
- pdf = Prawn::Document.new
35
-
36
- class << pdf
37
- # Make things easier to test
38
- public :permissions_value
39
- end
40
-
41
- pdf.encrypt_document(:permissions => permissions)
42
- pdf
43
- end
44
-
45
- it "should default to full permissions" do
46
- expect(doc_with_permissions({}).permissions_value).to eq(0xFFFFFFFF)
47
- expect(doc_with_permissions(:print_document => true,
48
- :modify_contents => true,
49
- :copy_contents => true,
50
- :modify_annotations => true).permissions_value).
51
- to eq(0xFFFFFFFF)
52
- end
53
-
54
- it "should clear the appropriate bits for each permission flag" do
55
- expect(doc_with_permissions(:print_document => false).permissions_value).
56
- to eq(0b1111_1111_1111_1111_1111_1111_1111_1011)
57
- expect(doc_with_permissions(:modify_contents => false).permissions_value).
58
- to eq(0b1111_1111_1111_1111_1111_1111_1111_0111)
59
- expect(doc_with_permissions(:copy_contents => false).permissions_value).
60
- to eq(0b1111_1111_1111_1111_1111_1111_1110_1111)
61
- expect(doc_with_permissions(:modify_annotations => false).permissions_value).
62
- to eq(0b1111_1111_1111_1111_1111_1111_1101_1111)
63
- end
64
-
65
- it "should raise_error ArgumentError if invalid option is provided" do
66
- expect {
67
- doc_with_permissions(:modify_document => false)
68
- }.to raise_error(ArgumentError)
69
- end
70
- end
71
-
72
- describe "Encryption keys" do
73
- # Since PDF::Reader doesn't read encrypted PDF files, we just take the
74
- # roundabout method of verifying each step of the encryption. This works
75
- # fine because the encryption method is deterministic.
76
-
77
- before(:each) do
78
- @pdf = Prawn::Document.new
79
- class << @pdf
80
- public :owner_password_hash, :user_password_hash, :user_encryption_key
81
- end
82
- @pdf.encrypt_document :user_password => 'foo',
83
- :owner_password => 'bar',
84
- :permissions => { :print_document => false }
85
- end
86
-
87
- it "should calculate the correct owner hash" do
88
- expect(@pdf.owner_password_hash.unpack("H*").first).to match(/^61CA855012/i)
89
- end
90
-
91
- it "should calculate the correct user hash" do
92
- expect(@pdf.user_password_hash.unpack("H*").first).to match(/^6BC8C51031/i)
93
- end
94
-
95
- it "should calculate the correct user_encryption_key" do
96
- expect(@pdf.user_encryption_key.unpack("H*").first.upcase).to eq("B100AB6429")
97
- end
98
- end
99
-
100
- describe "EncryptedPdfObject" do
101
- it "should delegate to PdfObject for simple types" do
102
- expect(PDF::Core::EncryptedPdfObject(true, nil, nil, nil)).to eq("true")
103
- expect(PDF::Core::EncryptedPdfObject(42, nil, nil, nil)).to eq("42")
104
- end
105
-
106
- it "should encrypt strings properly" do
107
- expect(PDF::Core::EncryptedPdfObject("foo", "12345", 123, 0)).to eq("<4ad6e3>")
108
- end
109
-
110
- it "should encrypt literal strings properly" do
111
- expect(PDF::Core::EncryptedPdfObject(PDF::Core::LiteralString.new("foo"), "12345", 123, 0)).to eq(bin_string("(J\xD6\xE3)"))
112
- expect(PDF::Core::EncryptedPdfObject(PDF::Core::LiteralString.new("lhfbqg3do5u0satu3fjf"), nil, 123, 0)).to eq(bin_string("(\xF1\x8B\\(\b\xBB\xE18S\x130~4*#\\(%\x87\xE7\x8E\\\n)"))
113
- end
114
-
115
- it "should encrypt time properly" do
116
- expect(PDF::Core::EncryptedPdfObject(Time.utc(2050, 04, 26, 10, 17, 10), "12345", 123, 0)).to eq(bin_string("(h\x83\xBE\xDC\xEC\x99\x0F\xD7\\)%\x13\xD4$\xB8\xF0\x16\xB8\x80\xC5\xE91+\xCF)"))
117
- end
118
-
119
- it "should properly handle compound types" do
120
- expect(PDF::Core::EncryptedPdfObject({ :Bar => "foo" }, "12345", 123, 0)).to eq(
121
- "<< /Bar <4ad6e3>\n>>"
122
- )
123
- expect(PDF::Core::EncryptedPdfObject(["foo", "bar"], "12345", 123, 0)).to eq(
124
- "[<4ad6e3> <4ed8fe>]"
125
- )
126
- end
127
- end
128
-
129
- describe "Reference#encrypted_object" do
130
- it "should encrypt references properly" do
131
- ref = PDF::Core::Reference(1, ["foo"])
132
- expect(ref.encrypted_object(nil)).to eq("1 0 obj\n[<4fca3f>]\nendobj\n")
133
- end
134
-
135
- it "should encrypt references with streams properly" do
136
- ref = PDF::Core::Reference(1, {})
137
- ref << 'foo'
138
- result = bin_string("1 0 obj\n<< /Length 3\n>>\nstream\nO\xCA?\nendstream\nendobj\n")
139
- expect(ref.encrypted_object(nil)).to eq(result)
140
- end
141
- end
142
-
143
- describe "String#encrypted_object" do
144
- it "should encrypt stream properly" do
145
- stream = PDF::Core::Stream.new
146
- stream << "foo"
147
- result = bin_string("stream\nO\xCA?\nendstream\n")
148
- expect(stream.encrypted_object(nil, 1, 0)).to eq(result)
149
- end
150
- end
151
- end