chunky_png 0.10.5 → 0.11.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 (245) hide show
  1. data/Gemfile.lock +1 -1
  2. data/benchmarks/filesize_benchmark.rb +1 -1
  3. data/chunky_png.gemspec +4 -4
  4. data/lib/chunky_png.rb +4 -11
  5. data/lib/chunky_png/canvas.rb +7 -8
  6. data/lib/chunky_png/canvas/adam7_interlacing.rb +36 -18
  7. data/lib/chunky_png/canvas/png_decoding.rb +258 -36
  8. data/lib/chunky_png/canvas/png_encoding.rb +1 -1
  9. data/lib/chunky_png/color.rb +41 -5
  10. data/lib/chunky_png/compatibility.rb +15 -0
  11. data/lib/chunky_png/datastream.rb +6 -0
  12. data/spec/chunky_png/canvas/adam7_interlacing_spec.rb +7 -7
  13. data/spec/chunky_png/canvas/png_decoding_spec.rb +33 -20
  14. data/spec/chunky_png/canvas/png_encoding_spec.rb +2 -3
  15. data/spec/chunky_png/color_spec.rb +29 -0
  16. data/spec/chunky_png/datastream_spec.rb +0 -5
  17. data/spec/chunky_png/rmagick_spec.rb +3 -3
  18. data/spec/png_suite/background_chunks/bgai4a08.png +0 -0
  19. data/spec/png_suite/background_chunks/bgai4a16.png +0 -0
  20. data/spec/png_suite/background_chunks/bgan6a08.png +0 -0
  21. data/spec/png_suite/background_chunks/bgan6a16.png +0 -0
  22. data/spec/png_suite/background_chunks/bgbn4a08.png +0 -0
  23. data/spec/png_suite/background_chunks/bggn4a16.png +0 -0
  24. data/spec/png_suite/background_chunks/bgwn6a08.png +0 -0
  25. data/spec/png_suite/background_chunks/bgyn6a16.png +0 -0
  26. data/spec/png_suite/basic/basi0g01.png +0 -0
  27. data/spec/png_suite/basic/basi0g01.rgba +0 -0
  28. data/spec/png_suite/basic/basi0g02.png +0 -0
  29. data/spec/png_suite/basic/basi0g02.rgba +0 -0
  30. data/spec/png_suite/basic/basi0g04.png +0 -0
  31. data/spec/png_suite/basic/basi0g04.rgba +0 -0
  32. data/spec/png_suite/basic/basi0g08.png +0 -0
  33. data/spec/png_suite/basic/basi0g08.rgba +0 -0
  34. data/spec/png_suite/basic/basi0g16.png +0 -0
  35. data/spec/png_suite/basic/basi0g16.rgba +0 -0
  36. data/spec/png_suite/basic/basi2c08.png +0 -0
  37. data/spec/png_suite/basic/basi2c08.rgba +0 -0
  38. data/spec/png_suite/basic/basi2c16.png +0 -0
  39. data/spec/png_suite/basic/basi2c16.rgba +0 -0
  40. data/spec/png_suite/basic/basi3p01.png +0 -0
  41. data/spec/png_suite/basic/basi3p01.rgba +1 -0
  42. data/spec/png_suite/basic/basi3p02.png +0 -0
  43. data/spec/png_suite/basic/basi3p02.rgba +0 -0
  44. data/spec/png_suite/basic/basi3p04.png +0 -0
  45. data/spec/png_suite/basic/basi3p04.rgba +0 -0
  46. data/spec/png_suite/basic/basi3p08.png +0 -0
  47. data/spec/png_suite/basic/basi3p08.rgba +0 -0
  48. data/spec/png_suite/basic/basi4a08.png +0 -0
  49. data/spec/png_suite/basic/basi4a08.rgba +0 -0
  50. data/spec/png_suite/basic/basi4a16.png +0 -0
  51. data/spec/png_suite/basic/basi4a16.rgba +0 -0
  52. data/spec/png_suite/basic/basi6a08.png +0 -0
  53. data/spec/png_suite/basic/basi6a08.rgba +0 -0
  54. data/spec/png_suite/basic/basi6a16.png +0 -0
  55. data/spec/png_suite/basic/basi6a16.rgba +0 -0
  56. data/spec/png_suite/basic/basn0g01.png +0 -0
  57. data/spec/png_suite/basic/basn0g01.rgba +0 -0
  58. data/spec/png_suite/basic/basn0g02.png +0 -0
  59. data/spec/png_suite/basic/basn0g02.rgba +0 -0
  60. data/spec/png_suite/basic/basn0g04.png +0 -0
  61. data/spec/png_suite/basic/basn0g04.rgba +0 -0
  62. data/spec/png_suite/basic/basn0g08.png +0 -0
  63. data/spec/png_suite/basic/basn0g08.rgba +0 -0
  64. data/spec/png_suite/basic/basn0g16.png +0 -0
  65. data/spec/png_suite/basic/basn0g16.rgba +0 -0
  66. data/spec/png_suite/basic/basn2c08.png +0 -0
  67. data/spec/png_suite/basic/basn2c08.rgba +0 -0
  68. data/spec/png_suite/basic/basn2c16.png +0 -0
  69. data/spec/png_suite/basic/basn2c16.rgba +0 -0
  70. data/spec/png_suite/basic/basn3p01.png +0 -0
  71. data/spec/png_suite/basic/basn3p01.rgba +1 -0
  72. data/spec/png_suite/basic/basn3p02.png +0 -0
  73. data/spec/png_suite/basic/basn3p02.rgba +0 -0
  74. data/spec/{resources/indexed_4bit.png → png_suite/basic/basn3p04.png} +0 -0
  75. data/spec/png_suite/basic/basn3p04.rgba +0 -0
  76. data/spec/png_suite/basic/basn3p08.png +0 -0
  77. data/spec/png_suite/basic/basn3p08.rgba +0 -0
  78. data/spec/png_suite/basic/basn4a08.png +0 -0
  79. data/spec/png_suite/basic/basn4a08.rgba +0 -0
  80. data/spec/png_suite/basic/basn4a16.png +0 -0
  81. data/spec/png_suite/basic/basn4a16.rgba +0 -0
  82. data/spec/png_suite/basic/basn6a08.png +0 -0
  83. data/spec/png_suite/basic/basn6a08.rgba +0 -0
  84. data/spec/png_suite/basic/basn6a16.png +0 -0
  85. data/spec/png_suite/basic/basn6a16.rgba +0 -0
  86. data/spec/png_suite/broken/x00n0g01.png +0 -0
  87. data/spec/png_suite/broken/xcrn0g04.png +0 -0
  88. data/spec/png_suite/broken/xlfn0g04.png +13 -0
  89. data/spec/png_suite/chunk_ordering/oi1n0g16.png +0 -0
  90. data/spec/png_suite/chunk_ordering/oi1n2c16.png +0 -0
  91. data/spec/png_suite/chunk_ordering/oi2n0g16.png +0 -0
  92. data/spec/png_suite/chunk_ordering/oi2n2c16.png +0 -0
  93. data/spec/png_suite/chunk_ordering/oi4n0g16.png +0 -0
  94. data/spec/png_suite/chunk_ordering/oi4n2c16.png +0 -0
  95. data/spec/png_suite/chunk_ordering/oi9n0g16.png +0 -0
  96. data/spec/png_suite/chunk_ordering/oi9n2c16.png +0 -0
  97. data/spec/png_suite/compression_levels/z00n2c08.png +0 -0
  98. data/spec/png_suite/compression_levels/z03n2c08.png +0 -0
  99. data/spec/png_suite/compression_levels/z06n2c08.png +0 -0
  100. data/spec/png_suite/compression_levels/z09n2c08.png +0 -0
  101. data/spec/png_suite/filtering/f00n0g08.png +0 -0
  102. data/spec/png_suite/filtering/f00n0g08.rgba +0 -0
  103. data/spec/png_suite/filtering/f00n0g08_reference.png +0 -0
  104. data/spec/png_suite/filtering/f00n0g08_reference.rgba +0 -0
  105. data/spec/png_suite/filtering/f00n2c08.png +0 -0
  106. data/spec/png_suite/filtering/f00n2c08.rgba +0 -0
  107. data/spec/png_suite/filtering/f00n2c08_reference.png +0 -0
  108. data/spec/png_suite/filtering/f00n2c08_reference.rgba +0 -0
  109. data/spec/png_suite/filtering/f01n0g08.png +0 -0
  110. data/spec/png_suite/filtering/f01n0g08.rgba +0 -0
  111. data/spec/png_suite/filtering/f01n0g08_reference.png +0 -0
  112. data/spec/png_suite/filtering/f01n0g08_reference.rgba +0 -0
  113. data/spec/png_suite/filtering/f01n2c08.png +0 -0
  114. data/spec/png_suite/filtering/f01n2c08.rgba +0 -0
  115. data/spec/png_suite/filtering/f01n2c08_reference.png +0 -0
  116. data/spec/png_suite/filtering/f01n2c08_reference.rgba +0 -0
  117. data/spec/png_suite/filtering/f02n0g08.png +0 -0
  118. data/spec/png_suite/filtering/f02n0g08.rgba +0 -0
  119. data/spec/png_suite/filtering/f02n0g08_reference.png +0 -0
  120. data/spec/png_suite/filtering/f02n0g08_reference.rgba +0 -0
  121. data/spec/png_suite/filtering/f02n2c08.png +0 -0
  122. data/spec/png_suite/filtering/f02n2c08.rgba +0 -0
  123. data/spec/png_suite/filtering/f02n2c08_reference.png +0 -0
  124. data/spec/png_suite/filtering/f02n2c08_reference.rgba +0 -0
  125. data/spec/png_suite/filtering/f03n0g08.png +0 -0
  126. data/spec/png_suite/filtering/f03n0g08.rgba +0 -0
  127. data/spec/png_suite/filtering/f03n0g08_reference.png +0 -0
  128. data/spec/png_suite/filtering/f03n0g08_reference.rgba +0 -0
  129. data/spec/png_suite/filtering/f03n2c08.png +0 -0
  130. data/spec/png_suite/filtering/f03n2c08.rgba +0 -0
  131. data/spec/png_suite/filtering/f03n2c08_reference.png +0 -0
  132. data/spec/png_suite/filtering/f03n2c08_reference.rgba +0 -0
  133. data/spec/png_suite/filtering/f04n0g08.png +0 -0
  134. data/spec/png_suite/filtering/f04n0g08.rgba +0 -0
  135. data/spec/png_suite/filtering/f04n0g08_reference.png +0 -0
  136. data/spec/png_suite/filtering/f04n0g08_reference.rgba +0 -0
  137. data/spec/png_suite/filtering/f04n2c08.png +0 -0
  138. data/spec/png_suite/filtering/f04n2c08.rgba +0 -0
  139. data/spec/png_suite/filtering/f04n2c08_reference.png +0 -0
  140. data/spec/png_suite/filtering/f04n2c08_reference.rgba +0 -0
  141. data/spec/png_suite/gamma/g03n0g16.png +0 -0
  142. data/spec/png_suite/gamma/g03n2c08.png +0 -0
  143. data/spec/png_suite/gamma/g03n3p04.png +0 -0
  144. data/spec/png_suite/gamma/g04n0g16.png +0 -0
  145. data/spec/png_suite/gamma/g04n2c08.png +0 -0
  146. data/spec/png_suite/gamma/g04n3p04.png +0 -0
  147. data/spec/png_suite/gamma/g05n0g16.png +0 -0
  148. data/spec/png_suite/gamma/g05n2c08.png +0 -0
  149. data/spec/png_suite/gamma/g05n3p04.png +0 -0
  150. data/spec/png_suite/gamma/g07n0g16.png +0 -0
  151. data/spec/png_suite/gamma/g07n2c08.png +0 -0
  152. data/spec/png_suite/gamma/g07n3p04.png +0 -0
  153. data/spec/png_suite/gamma/g10n0g16.png +0 -0
  154. data/spec/png_suite/gamma/g10n2c08.png +0 -0
  155. data/spec/png_suite/gamma/g10n3p04.png +0 -0
  156. data/spec/png_suite/gamma/g25n0g16.png +0 -0
  157. data/spec/png_suite/gamma/g25n2c08.png +0 -0
  158. data/spec/png_suite/gamma/g25n3p04.png +0 -0
  159. data/spec/png_suite/metadata/cm0n0g04.png +0 -0
  160. data/spec/png_suite/metadata/cm7n0g04.png +0 -0
  161. data/spec/png_suite/metadata/cm9n0g04.png +0 -0
  162. data/spec/png_suite/other/ccwn2c08.png +0 -0
  163. data/spec/png_suite/other/ccwn3p08.png +0 -0
  164. data/spec/png_suite/other/cdfn2c08.png +0 -0
  165. data/spec/png_suite/other/cdhn2c08.png +0 -0
  166. data/spec/png_suite/other/cdsn2c08.png +0 -0
  167. data/spec/png_suite/other/cdun2c08.png +0 -0
  168. data/spec/png_suite/other/ch1n3p04.png +0 -0
  169. data/spec/png_suite/other/ch2n3p08.png +0 -0
  170. data/spec/png_suite/other/cs3n2c16.png +0 -0
  171. data/spec/png_suite/other/cs3n3p08.png +0 -0
  172. data/spec/png_suite/other/cs5n2c08.png +0 -0
  173. data/spec/png_suite/other/cs5n3p08.png +0 -0
  174. data/spec/png_suite/other/cs8n2c08.png +0 -0
  175. data/spec/png_suite/other/cs8n3p08.png +0 -0
  176. data/spec/png_suite/other/ct0n0g04.png +0 -0
  177. data/spec/png_suite/other/ct1n0g04.png +0 -0
  178. data/spec/png_suite/other/ctzn0g04.png +0 -0
  179. data/spec/png_suite/other/pp0n2c16.png +0 -0
  180. data/spec/png_suite/other/pp0n6a08.png +0 -0
  181. data/spec/png_suite/other/ps1n0g08.png +0 -0
  182. data/spec/png_suite/other/ps1n2c16.png +0 -0
  183. data/spec/png_suite/other/ps2n0g08.png +0 -0
  184. data/spec/png_suite/other/ps2n2c16.png +0 -0
  185. data/spec/png_suite/sizes/s01i3p01.png +0 -0
  186. data/spec/png_suite/sizes/s01n3p01.png +0 -0
  187. data/spec/png_suite/sizes/s02i3p01.png +0 -0
  188. data/spec/png_suite/sizes/s02n3p01.png +0 -0
  189. data/spec/png_suite/sizes/s03i3p01.png +0 -0
  190. data/spec/png_suite/sizes/s03n3p01.png +0 -0
  191. data/spec/png_suite/sizes/s04i3p01.png +0 -0
  192. data/spec/png_suite/sizes/s04n3p01.png +0 -0
  193. data/spec/png_suite/sizes/s05i3p02.png +0 -0
  194. data/spec/png_suite/sizes/s05n3p02.png +0 -0
  195. data/spec/png_suite/sizes/s06i3p02.png +0 -0
  196. data/spec/png_suite/sizes/s06n3p02.png +0 -0
  197. data/spec/png_suite/sizes/s07i3p02.png +0 -0
  198. data/spec/png_suite/sizes/s07n3p02.png +0 -0
  199. data/spec/png_suite/sizes/s08i3p02.png +0 -0
  200. data/spec/png_suite/sizes/s08n3p02.png +0 -0
  201. data/spec/png_suite/sizes/s09i3p02.png +0 -0
  202. data/spec/png_suite/sizes/s09n3p02.png +0 -0
  203. data/spec/png_suite/sizes/s32i3p04.png +0 -0
  204. data/spec/png_suite/sizes/s32n3p04.png +0 -0
  205. data/spec/png_suite/sizes/s33i3p04.png +0 -0
  206. data/spec/png_suite/sizes/s33n3p04.png +0 -0
  207. data/spec/png_suite/sizes/s34i3p04.png +0 -0
  208. data/spec/png_suite/sizes/s34n3p04.png +0 -0
  209. data/spec/png_suite/sizes/s35i3p04.png +0 -0
  210. data/spec/png_suite/sizes/s35n3p04.png +0 -0
  211. data/spec/png_suite/sizes/s36i3p04.png +0 -0
  212. data/spec/png_suite/sizes/s36n3p04.png +0 -0
  213. data/spec/png_suite/sizes/s37i3p04.png +0 -0
  214. data/spec/png_suite/sizes/s37n3p04.png +0 -0
  215. data/spec/png_suite/sizes/s38i3p04.png +0 -0
  216. data/spec/png_suite/sizes/s38n3p04.png +0 -0
  217. data/spec/png_suite/sizes/s39i3p04.png +0 -0
  218. data/spec/png_suite/sizes/s39n3p04.png +0 -0
  219. data/spec/png_suite/sizes/s40i3p04.png +0 -0
  220. data/spec/png_suite/sizes/s40n3p04.png +0 -0
  221. data/spec/png_suite/transparency/tbbn1g04.png +0 -0
  222. data/spec/png_suite/transparency/tbbn2c16.png +0 -0
  223. data/spec/png_suite/transparency/tbbn3p08.png +0 -0
  224. data/spec/png_suite/transparency/tbgn2c16.png +0 -0
  225. data/spec/png_suite/transparency/tbgn3p08.png +0 -0
  226. data/spec/png_suite/transparency/tbrn2c08.png +0 -0
  227. data/spec/png_suite/transparency/tbwn1g16.png +0 -0
  228. data/spec/png_suite/transparency/tbwn3p08.png +0 -0
  229. data/spec/png_suite/transparency/tbyn3p08.png +0 -0
  230. data/spec/png_suite/transparency/tp0n1g08.png +0 -0
  231. data/spec/png_suite/transparency/tp0n2c08.png +0 -0
  232. data/spec/png_suite/transparency/tp0n3p08.png +0 -0
  233. data/spec/png_suite/transparency/tp1n3p08.png +0 -0
  234. data/spec/png_suite_spec.rb +119 -0
  235. data/spec/spec_helper.rb +26 -16
  236. metadata +240 -25
  237. data/spec/resources/16x16_interlaced.png +0 -0
  238. data/spec/resources/16x16_non_interlaced.png +0 -0
  239. data/spec/resources/gray_10x10.png +0 -0
  240. data/spec/resources/gray_10x10_grayscale.png +0 -0
  241. data/spec/resources/gray_10x10_grayscale_alpha.png +0 -0
  242. data/spec/resources/gray_10x10_indexed.png +0 -0
  243. data/spec/resources/gray_10x10_truecolor.png +0 -0
  244. data/spec/resources/gray_10x10_truecolor_alpha.png +0 -0
  245. data/spec/resources/transparent_gray_10x10.png +0 -0
@@ -0,0 +1,119 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'PNG testuite' do
4
+
5
+ context 'Decoding broken images' do
6
+ png_suite_files(:broken).each do |file|
7
+ it "should report #{File.basename(file)} as broken" do
8
+ lambda { ChunkyPNG::Image.from_file(file) }.should raise_error
9
+ end
10
+
11
+ it "should not report #{File.basename(file)} as unsupported" do
12
+ lambda { ChunkyPNG::Image.from_file(file) }.should_not raise_error(ChunkyPNG::NotSupported)
13
+ end
14
+ end
15
+ end
16
+
17
+ context 'Decoding unsupported images' do
18
+
19
+ # TODO: we eventually want to support these!
20
+
21
+ png_suite_files(:basic_not_supported).each do |file|
22
+ color_mode = file.match(/[in](\d)[apgc](\d\d)\.png$/)[1].to_i
23
+ bit_depth = file.match(/[in](\d)[apgc](\d\d)\.png$/)[2].to_i
24
+
25
+ it "should report #{File.basename(file)} (color mode: #{color_mode}, bit depth: #{bit_depth}) as unsupported" do
26
+ lambda { ChunkyPNG::Image.from_file(file) }.should raise_error(ChunkyPNG::NotSupported)
27
+ end
28
+ end
29
+ end
30
+
31
+ context 'Decoding supported images' do
32
+ png_suite_files(:basic, '*.png').each do |file|
33
+
34
+ reference = file.sub(/\.png$/, '.rgba')
35
+ color_mode = file.match(/[in](\d)[apgc](\d\d)\.png$/)[1].to_i
36
+ bit_depth = file.match(/[in](\d)[apgc](\d\d)\.png$/)[2].to_i
37
+
38
+ it "should decode #{File.basename(file)} (color mode: #{color_mode}, bit depth: #{bit_depth}) exactly the same as the reference image" do
39
+ decoded = ChunkyPNG::Canvas.from_file(file)
40
+ File.open(reference, 'rb:binary') { |f| decoded.to_rgba_stream.should == f.read }
41
+ end
42
+ end
43
+ end
44
+
45
+ context 'Decoding text chunks' do
46
+
47
+ it "should not find metadata in a file without text chunks" do
48
+ image = ChunkyPNG::Image.from_file(png_suite_file(:metadata, 'cm0n0g04.png'))
49
+ image.metadata.should be_empty
50
+ end
51
+
52
+ # it "should find metadata in a file with uncompressed text chunks" do
53
+ # image = ChunkyPNG::Image.from_file(png_suite_file(:metadata, 'cm7n0g04.png'))
54
+ # image.metadata.should_not be_empty
55
+ # end
56
+ #
57
+ # it "should find metadata in a file with compressed text chunks" do
58
+ # image = ChunkyPNG::Image.from_file(png_suite_file(:metadata, 'cm9n0g04.png'))
59
+ # image.metadata.should_not be_empty
60
+ # end
61
+ end
62
+
63
+ context 'Decoding filter methods' do
64
+ png_suite_files(:filtering, '*_reference.png').each do |reference_file|
65
+
66
+ file = reference_file.sub(/_reference\.png$/, '.png')
67
+ filter_method = file.match(/f(\d\d)[a-z0-9]+\.png/)[1].to_i
68
+
69
+ it "should decode #{File.basename(file)} (filter method: #{filter_method}) exactly the same as the reference image" do
70
+ decoded = ChunkyPNG::Canvas.from_file(file)
71
+ reference = ChunkyPNG::Canvas.from_file(reference_file)
72
+ decoded.should == reference
73
+ end
74
+ end
75
+ end
76
+
77
+ context 'Decoding different chunk splits' do
78
+ it "should decode grayscale images successfully regardless of the data chunk ordering and splitting" do
79
+ reference = ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi1n0g16.png')).imagedata
80
+ ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi2n0g16.png')).imagedata.should == reference
81
+ ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi4n0g16.png')).imagedata.should == reference
82
+ ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi9n0g16.png')).imagedata.should == reference
83
+ end
84
+
85
+ it "should decode color images successfully regardless of the data chunk ordering and splitting" do
86
+ reference = ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi1n2c16.png')).imagedata
87
+ ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi2n2c16.png')).imagedata.should == reference
88
+ ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi4n2c16.png')).imagedata.should == reference
89
+ ChunkyPNG::Datastream.from_file(png_suite_file(:chunk_ordering, 'oi9n2c16.png')).imagedata.should == reference
90
+ end
91
+ end
92
+
93
+ context 'Decoding different compression levels' do
94
+ it "should decode the image successfully regardless of the compression level" do
95
+ reference = ChunkyPNG::Datastream.from_file(png_suite_file(:compression_levels, 'z00n2c08.png')).imagedata
96
+ ChunkyPNG::Datastream.from_file(png_suite_file(:compression_levels, 'z03n2c08.png')).imagedata.should == reference
97
+ ChunkyPNG::Datastream.from_file(png_suite_file(:compression_levels, 'z06n2c08.png')).imagedata.should == reference
98
+ ChunkyPNG::Datastream.from_file(png_suite_file(:compression_levels, 'z09n2c08.png')).imagedata.should == reference
99
+ end
100
+ end
101
+
102
+ context 'Decoding different sizes' do
103
+
104
+ png_suite_files(:sizes, '*n*.png').each do |file|
105
+ dimension = file.match(/s(\d\d)n\dp\d\d/)[1].to_i
106
+
107
+ it "should create a canvas with a #{dimension}x#{dimension} size" do
108
+ canvas = ChunkyPNG::Image.from_file(file)
109
+ canvas.width.should == dimension
110
+ canvas.height.should == dimension
111
+ end
112
+
113
+ it "should decode the #{dimension}x#{dimension} interlaced image exactly the same the non-interlaced version" do
114
+ interlaced_file = file.sub(/n3p(\d\d)\.png$/, 'i3p\\1.png')
115
+ ChunkyPNG::Image.from_file(interlaced_file).should == ChunkyPNG::Image.from_file(file)
116
+ end
117
+ end
118
+ end
119
+ end
@@ -1,26 +1,29 @@
1
- $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
-
3
1
  require 'rubygems'
4
2
  require 'bundler'
5
3
 
6
- Bundler.setup
7
-
8
- require 'rspec'
9
- require 'chunky_png'
4
+ Bundler.require(:default, :development)
10
5
 
11
- module ResourceFileHelper
12
- def resource_file(name)
13
- File.expand_path("./resources/#{name}", File.dirname(__FILE__))
6
+ module PNGSuite
7
+
8
+ def png_suite_file(kind, file)
9
+ File.join(png_suite_dir(kind), file)
10
+ end
11
+
12
+ def png_suite_dir(kind)
13
+ File.expand_path("./png_suite/#{kind}", File.dirname(__FILE__))
14
+ end
15
+
16
+ def png_suite_files(kind, pattern = '*.png')
17
+ Dir[File.join(png_suite_dir(kind), pattern)]
14
18
  end
15
19
  end
16
20
 
17
21
 
18
- module MatrixSpecHelper
19
- def display(canvas)
20
- filename = resource_file('_tmp.png')
21
- canvas.to_datastream.save(filename)
22
- `open #{filename}`
23
- end
22
+ module ResourceFileHelper
23
+
24
+ def resource_file(name)
25
+ File.expand_path("./resources/#{name}", File.dirname(__FILE__))
26
+ end
24
27
 
25
28
  def reference_canvas(name)
26
29
  ChunkyPNG::Canvas.from_file(resource_file("#{name}.png"))
@@ -29,9 +32,16 @@ module MatrixSpecHelper
29
32
  def reference_image(name)
30
33
  ChunkyPNG::Image.from_file(resource_file("#{name}.png"))
31
34
  end
35
+
36
+ def display(canvas)
37
+ filename = resource_file('_tmp.png')
38
+ canvas.to_datastream.save(filename)
39
+ `open #{filename}`
40
+ end
32
41
  end
33
42
 
34
43
  RSpec.configure do |config|
44
+ config.extend PNGSuite
45
+ config.include PNGSuite
35
46
  config.include ResourceFileHelper
36
- config.include MatrixSpecHelper
37
47
  end