chunky_png 0.12.0 → 1.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/README.rdoc +2 -2
- data/Rakefile +0 -5
- data/benchmarks/decoding_benchmark.rb +1 -3
- data/benchmarks/encoding_benchmark.rb +1 -3
- data/benchmarks/filesize_benchmark.rb +1 -3
- data/chunky_png.gemspec +3 -3
- data/lib/chunky_png.rb +1 -1
- data/lib/chunky_png/canvas/png_encoding.rb +63 -25
- data/lib/chunky_png/palette.rb +23 -14
- data/spec/chunky_png/canvas/png_encoding_spec.rb +56 -55
- data/spec/spec_helper.rb +5 -6
- data/tasks/github-gem.rake +18 -14
- metadata +12 -12
- data/Gemfile.lock +0 -31
data/.gitignore
CHANGED
data/README.rdoc
CHANGED
@@ -5,7 +5,7 @@ maximum portability. Let me rephrase: it does NOT require RMagick or any other
|
|
5
5
|
memory leaking image library.
|
6
6
|
|
7
7
|
Source code:: http://github.com/wvanbergen/chunky_png/tree
|
8
|
-
RDoc:: http://rdoc.info/
|
8
|
+
RDoc:: http://rdoc.info/gems/chunky_png/frames
|
9
9
|
Wiki:: http://github.com/wvanbergen/chunky_png/wiki
|
10
10
|
Issue tracker:: http://github.com/wvanbergen/chunky_png/issues
|
11
11
|
|
@@ -55,7 +55,7 @@ provides a massive speed boost to encoding and decoding.
|
|
55
55
|
png_stream.each_chunk { |chunk| p chunk.type }
|
56
56
|
|
57
57
|
For more information, see the project wiki on http://github.com/wvanbergen/chunky_png/wiki
|
58
|
-
or the RDOC documentation on http://rdoc.info/
|
58
|
+
or the RDOC documentation on http://rdoc.info/gems/chunky_png/frames
|
59
59
|
|
60
60
|
== About
|
61
61
|
|
data/Rakefile
CHANGED
data/chunky_png.gemspec
CHANGED
@@ -3,8 +3,8 @@ Gem::Specification.new do |s|
|
|
3
3
|
|
4
4
|
# Do not change the version and date fields by hand. This will be done
|
5
5
|
# automatically by the gem release script.
|
6
|
-
s.version = "0.
|
7
|
-
s.date = "
|
6
|
+
s.version = "1.0.0.beta1"
|
7
|
+
s.date = "2011-01-24"
|
8
8
|
|
9
9
|
s.summary = "Pure ruby library for read/write, chunk-level access to PNG files"
|
10
10
|
s.description = <<-EOT
|
@@ -38,6 +38,6 @@ Gem::Specification.new do |s|
|
|
38
38
|
|
39
39
|
# Do not change the files and test_files fields by hand. This will be done
|
40
40
|
# automatically by the gem release script.
|
41
|
-
s.files = %w(.gitignore .infinity_test BENCHMARKS.rdoc Gemfile Gemfile.lock LICENSE README.rdoc Rakefile benchmarks/decoding_benchmark.rb benchmarks/encoding_benchmark.rb benchmarks/filesize_benchmark.rb chunky_png.gemspec lib/chunky_png.rb lib/chunky_png/canvas.rb lib/chunky_png/canvas/adam7_interlacing.rb lib/chunky_png/canvas/drawing.rb lib/chunky_png/canvas/operations.rb lib/chunky_png/canvas/png_decoding.rb lib/chunky_png/canvas/png_encoding.rb lib/chunky_png/canvas/stream_exporting.rb lib/chunky_png/canvas/stream_importing.rb lib/chunky_png/chunk.rb lib/chunky_png/color.rb lib/chunky_png/compatibility.rb lib/chunky_png/datastream.rb lib/chunky_png/image.rb lib/chunky_png/palette.rb lib/chunky_png/rmagick.rb spec/chunky_png/canvas/adam7_interlacing_spec.rb spec/chunky_png/canvas/drawing_spec.rb spec/chunky_png/canvas/operations_spec.rb spec/chunky_png/canvas/png_decoding_spec.rb spec/chunky_png/canvas/png_encoding_spec.rb spec/chunky_png/canvas_spec.rb spec/chunky_png/color_spec.rb spec/chunky_png/datastream_spec.rb spec/chunky_png/image_spec.rb spec/chunky_png/rmagick_spec.rb spec/chunky_png_spec.rb spec/png_suite/background_chunks/bgai4a08.png spec/png_suite/background_chunks/bgai4a16.png spec/png_suite/background_chunks/bgan6a08.png spec/png_suite/background_chunks/bgan6a16.png spec/png_suite/background_chunks/bgbn4a08.png spec/png_suite/background_chunks/bggn4a16.png spec/png_suite/background_chunks/bgwn6a08.png spec/png_suite/background_chunks/bgyn6a16.png spec/png_suite/basic/basi0g01.png spec/png_suite/basic/basi0g01.rgba spec/png_suite/basic/basi0g02.png spec/png_suite/basic/basi0g02.rgba spec/png_suite/basic/basi0g04.png spec/png_suite/basic/basi0g04.rgba spec/png_suite/basic/basi0g08.png spec/png_suite/basic/basi0g08.rgba spec/png_suite/basic/basi0g16.png spec/png_suite/basic/basi0g16.rgba spec/png_suite/basic/basi2c08.png spec/png_suite/basic/basi2c08.rgba spec/png_suite/basic/basi2c16.png spec/png_suite/basic/basi2c16.rgba spec/png_suite/basic/basi3p01.png spec/png_suite/basic/basi3p01.rgba spec/png_suite/basic/basi3p02.png spec/png_suite/basic/basi3p02.rgba spec/png_suite/basic/basi3p04.png spec/png_suite/basic/basi3p04.rgba spec/png_suite/basic/basi3p08.png spec/png_suite/basic/basi3p08.rgba spec/png_suite/basic/basi4a08.png spec/png_suite/basic/basi4a08.rgba spec/png_suite/basic/basi4a16.png spec/png_suite/basic/basi4a16.rgba spec/png_suite/basic/basi6a08.png spec/png_suite/basic/basi6a08.rgba spec/png_suite/basic/basi6a16.png spec/png_suite/basic/basi6a16.rgba spec/png_suite/basic/basn0g01.png spec/png_suite/basic/basn0g01.rgba spec/png_suite/basic/basn0g02.png spec/png_suite/basic/basn0g02.rgba spec/png_suite/basic/basn0g04.png spec/png_suite/basic/basn0g04.rgba spec/png_suite/basic/basn0g08.png spec/png_suite/basic/basn0g08.rgba spec/png_suite/basic/basn0g16.png spec/png_suite/basic/basn0g16.rgba spec/png_suite/basic/basn2c08.png spec/png_suite/basic/basn2c08.rgba spec/png_suite/basic/basn2c16.png spec/png_suite/basic/basn2c16.rgba spec/png_suite/basic/basn3p01.png spec/png_suite/basic/basn3p01.rgba spec/png_suite/basic/basn3p02.png spec/png_suite/basic/basn3p02.rgba spec/png_suite/basic/basn3p04.png spec/png_suite/basic/basn3p04.rgba spec/png_suite/basic/basn3p08.png spec/png_suite/basic/basn3p08.rgba spec/png_suite/basic/basn4a08.png spec/png_suite/basic/basn4a08.rgba spec/png_suite/basic/basn4a16.png spec/png_suite/basic/basn4a16.rgba spec/png_suite/basic/basn6a08.png spec/png_suite/basic/basn6a08.rgba spec/png_suite/basic/basn6a16.png spec/png_suite/basic/basn6a16.rgba spec/png_suite/broken/x00n0g01.png spec/png_suite/broken/xcrn0g04.png spec/png_suite/broken/xlfn0g04.png spec/png_suite/chunk_ordering/oi1n0g16.png spec/png_suite/chunk_ordering/oi1n2c16.png spec/png_suite/chunk_ordering/oi2n0g16.png spec/png_suite/chunk_ordering/oi2n2c16.png spec/png_suite/chunk_ordering/oi4n0g16.png spec/png_suite/chunk_ordering/oi4n2c16.png spec/png_suite/chunk_ordering/oi9n0g16.png spec/png_suite/chunk_ordering/oi9n2c16.png spec/png_suite/compression_levels/z00n2c08.png spec/png_suite/compression_levels/z03n2c08.png spec/png_suite/compression_levels/z06n2c08.png spec/png_suite/compression_levels/z09n2c08.png spec/png_suite/filtering/f00n0g08.png spec/png_suite/filtering/f00n0g08.rgba spec/png_suite/filtering/f00n0g08_reference.png spec/png_suite/filtering/f00n0g08_reference.rgba spec/png_suite/filtering/f00n2c08.png spec/png_suite/filtering/f00n2c08.rgba spec/png_suite/filtering/f00n2c08_reference.png spec/png_suite/filtering/f00n2c08_reference.rgba spec/png_suite/filtering/f01n0g08.png spec/png_suite/filtering/f01n0g08.rgba spec/png_suite/filtering/f01n0g08_reference.png spec/png_suite/filtering/f01n0g08_reference.rgba spec/png_suite/filtering/f01n2c08.png spec/png_suite/filtering/f01n2c08.rgba spec/png_suite/filtering/f01n2c08_reference.png spec/png_suite/filtering/f01n2c08_reference.rgba spec/png_suite/filtering/f02n0g08.png spec/png_suite/filtering/f02n0g08.rgba spec/png_suite/filtering/f02n0g08_reference.png spec/png_suite/filtering/f02n0g08_reference.rgba spec/png_suite/filtering/f02n2c08.png spec/png_suite/filtering/f02n2c08.rgba spec/png_suite/filtering/f02n2c08_reference.png spec/png_suite/filtering/f02n2c08_reference.rgba spec/png_suite/filtering/f03n0g08.png spec/png_suite/filtering/f03n0g08.rgba spec/png_suite/filtering/f03n0g08_reference.png spec/png_suite/filtering/f03n0g08_reference.rgba spec/png_suite/filtering/f03n2c08.png spec/png_suite/filtering/f03n2c08.rgba spec/png_suite/filtering/f03n2c08_reference.png spec/png_suite/filtering/f03n2c08_reference.rgba spec/png_suite/filtering/f04n0g08.png spec/png_suite/filtering/f04n0g08.rgba spec/png_suite/filtering/f04n0g08_reference.png spec/png_suite/filtering/f04n0g08_reference.rgba spec/png_suite/filtering/f04n2c08.png spec/png_suite/filtering/f04n2c08.rgba spec/png_suite/filtering/f04n2c08_reference.png spec/png_suite/filtering/f04n2c08_reference.rgba spec/png_suite/gamma/g03n0g16.png spec/png_suite/gamma/g03n2c08.png spec/png_suite/gamma/g03n3p04.png spec/png_suite/gamma/g04n0g16.png spec/png_suite/gamma/g04n2c08.png spec/png_suite/gamma/g04n3p04.png spec/png_suite/gamma/g05n0g16.png spec/png_suite/gamma/g05n2c08.png spec/png_suite/gamma/g05n3p04.png spec/png_suite/gamma/g07n0g16.png spec/png_suite/gamma/g07n2c08.png spec/png_suite/gamma/g07n3p04.png spec/png_suite/gamma/g10n0g16.png spec/png_suite/gamma/g10n2c08.png spec/png_suite/gamma/g10n3p04.png spec/png_suite/gamma/g25n0g16.png spec/png_suite/gamma/g25n2c08.png spec/png_suite/gamma/g25n3p04.png spec/png_suite/metadata/cm0n0g04.png spec/png_suite/metadata/cm7n0g04.png spec/png_suite/metadata/cm9n0g04.png spec/png_suite/other/ccwn2c08.png spec/png_suite/other/ccwn3p08.png spec/png_suite/other/cdfn2c08.png spec/png_suite/other/cdhn2c08.png spec/png_suite/other/cdsn2c08.png spec/png_suite/other/cdun2c08.png spec/png_suite/other/ch1n3p04.png spec/png_suite/other/ch2n3p08.png spec/png_suite/other/cs3n2c16.png spec/png_suite/other/cs3n3p08.png spec/png_suite/other/cs5n2c08.png spec/png_suite/other/cs5n3p08.png spec/png_suite/other/cs8n2c08.png spec/png_suite/other/cs8n3p08.png spec/png_suite/other/ct0n0g04.png spec/png_suite/other/ct1n0g04.png spec/png_suite/other/ctzn0g04.png spec/png_suite/other/pp0n2c16.png spec/png_suite/other/pp0n6a08.png spec/png_suite/other/ps1n0g08.png spec/png_suite/other/ps1n2c16.png spec/png_suite/other/ps2n0g08.png spec/png_suite/other/ps2n2c16.png spec/png_suite/sizes/s01i3p01.png spec/png_suite/sizes/s01n3p01.png spec/png_suite/sizes/s02i3p01.png spec/png_suite/sizes/s02n3p01.png spec/png_suite/sizes/s03i3p01.png spec/png_suite/sizes/s03n3p01.png spec/png_suite/sizes/s04i3p01.png spec/png_suite/sizes/s04n3p01.png spec/png_suite/sizes/s05i3p02.png spec/png_suite/sizes/s05n3p02.png spec/png_suite/sizes/s06i3p02.png spec/png_suite/sizes/s06n3p02.png spec/png_suite/sizes/s07i3p02.png spec/png_suite/sizes/s07n3p02.png spec/png_suite/sizes/s08i3p02.png spec/png_suite/sizes/s08n3p02.png spec/png_suite/sizes/s09i3p02.png spec/png_suite/sizes/s09n3p02.png spec/png_suite/sizes/s32i3p04.png spec/png_suite/sizes/s32n3p04.png spec/png_suite/sizes/s33i3p04.png spec/png_suite/sizes/s33n3p04.png spec/png_suite/sizes/s34i3p04.png spec/png_suite/sizes/s34n3p04.png spec/png_suite/sizes/s35i3p04.png spec/png_suite/sizes/s35n3p04.png spec/png_suite/sizes/s36i3p04.png spec/png_suite/sizes/s36n3p04.png spec/png_suite/sizes/s37i3p04.png spec/png_suite/sizes/s37n3p04.png spec/png_suite/sizes/s38i3p04.png spec/png_suite/sizes/s38n3p04.png spec/png_suite/sizes/s39i3p04.png spec/png_suite/sizes/s39n3p04.png spec/png_suite/sizes/s40i3p04.png spec/png_suite/sizes/s40n3p04.png spec/png_suite/transparency/tbbn1g04.png spec/png_suite/transparency/tbbn2c16.png spec/png_suite/transparency/tbbn3p08.png spec/png_suite/transparency/tbgn2c16.png spec/png_suite/transparency/tbgn3p08.png spec/png_suite/transparency/tbrn2c08.png spec/png_suite/transparency/tbwn1g16.png spec/png_suite/transparency/tbwn3p08.png spec/png_suite/transparency/tbyn3p08.png spec/png_suite/transparency/tp0n1g08.png spec/png_suite/transparency/tp0n2c08.png spec/png_suite/transparency/tp0n3p08.png spec/png_suite/transparency/tp1n3p08.png spec/png_suite_spec.rb spec/resources/adam7.png spec/resources/clock.png spec/resources/clock_base.png spec/resources/clock_flip_horizontally.png spec/resources/clock_flip_vertically.png spec/resources/clock_mask.png spec/resources/clock_mask_updated.png spec/resources/clock_rotate_180.png spec/resources/clock_rotate_left.png spec/resources/clock_rotate_right.png spec/resources/clock_stubbed.png spec/resources/clock_updated.png spec/resources/composited.png spec/resources/cropped.png spec/resources/damaged_chunk.png spec/resources/damaged_signature.png spec/resources/lines.png spec/resources/operations.png spec/resources/pixelstream.rgb spec/resources/pixelstream.rgba spec/resources/pixelstream_best_compression.png spec/resources/pixelstream_fast_rgba.png spec/resources/pixelstream_reference.png spec/resources/rect.png spec/resources/replaced.png spec/resources/text_chunk.png spec/resources/ztxt_chunk.png spec/spec_helper.rb tasks/benchmarks.rake tasks/github-gem.rake)
|
41
|
+
s.files = %w(.gitignore .infinity_test BENCHMARKS.rdoc Gemfile LICENSE README.rdoc Rakefile benchmarks/decoding_benchmark.rb benchmarks/encoding_benchmark.rb benchmarks/filesize_benchmark.rb chunky_png.gemspec lib/chunky_png.rb lib/chunky_png/canvas.rb lib/chunky_png/canvas/adam7_interlacing.rb lib/chunky_png/canvas/drawing.rb lib/chunky_png/canvas/operations.rb lib/chunky_png/canvas/png_decoding.rb lib/chunky_png/canvas/png_encoding.rb lib/chunky_png/canvas/stream_exporting.rb lib/chunky_png/canvas/stream_importing.rb lib/chunky_png/chunk.rb lib/chunky_png/color.rb lib/chunky_png/compatibility.rb lib/chunky_png/datastream.rb lib/chunky_png/image.rb lib/chunky_png/palette.rb lib/chunky_png/rmagick.rb spec/chunky_png/canvas/adam7_interlacing_spec.rb spec/chunky_png/canvas/drawing_spec.rb spec/chunky_png/canvas/operations_spec.rb spec/chunky_png/canvas/png_decoding_spec.rb spec/chunky_png/canvas/png_encoding_spec.rb spec/chunky_png/canvas_spec.rb spec/chunky_png/color_spec.rb spec/chunky_png/datastream_spec.rb spec/chunky_png/image_spec.rb spec/chunky_png/rmagick_spec.rb spec/chunky_png_spec.rb spec/png_suite/background_chunks/bgai4a08.png spec/png_suite/background_chunks/bgai4a16.png spec/png_suite/background_chunks/bgan6a08.png spec/png_suite/background_chunks/bgan6a16.png spec/png_suite/background_chunks/bgbn4a08.png spec/png_suite/background_chunks/bggn4a16.png spec/png_suite/background_chunks/bgwn6a08.png spec/png_suite/background_chunks/bgyn6a16.png spec/png_suite/basic/basi0g01.png spec/png_suite/basic/basi0g01.rgba spec/png_suite/basic/basi0g02.png spec/png_suite/basic/basi0g02.rgba spec/png_suite/basic/basi0g04.png spec/png_suite/basic/basi0g04.rgba spec/png_suite/basic/basi0g08.png spec/png_suite/basic/basi0g08.rgba spec/png_suite/basic/basi0g16.png spec/png_suite/basic/basi0g16.rgba spec/png_suite/basic/basi2c08.png spec/png_suite/basic/basi2c08.rgba spec/png_suite/basic/basi2c16.png spec/png_suite/basic/basi2c16.rgba spec/png_suite/basic/basi3p01.png spec/png_suite/basic/basi3p01.rgba spec/png_suite/basic/basi3p02.png spec/png_suite/basic/basi3p02.rgba spec/png_suite/basic/basi3p04.png spec/png_suite/basic/basi3p04.rgba spec/png_suite/basic/basi3p08.png spec/png_suite/basic/basi3p08.rgba spec/png_suite/basic/basi4a08.png spec/png_suite/basic/basi4a08.rgba spec/png_suite/basic/basi4a16.png spec/png_suite/basic/basi4a16.rgba spec/png_suite/basic/basi6a08.png spec/png_suite/basic/basi6a08.rgba spec/png_suite/basic/basi6a16.png spec/png_suite/basic/basi6a16.rgba spec/png_suite/basic/basn0g01.png spec/png_suite/basic/basn0g01.rgba spec/png_suite/basic/basn0g02.png spec/png_suite/basic/basn0g02.rgba spec/png_suite/basic/basn0g04.png spec/png_suite/basic/basn0g04.rgba spec/png_suite/basic/basn0g08.png spec/png_suite/basic/basn0g08.rgba spec/png_suite/basic/basn0g16.png spec/png_suite/basic/basn0g16.rgba spec/png_suite/basic/basn2c08.png spec/png_suite/basic/basn2c08.rgba spec/png_suite/basic/basn2c16.png spec/png_suite/basic/basn2c16.rgba spec/png_suite/basic/basn3p01.png spec/png_suite/basic/basn3p01.rgba spec/png_suite/basic/basn3p02.png spec/png_suite/basic/basn3p02.rgba spec/png_suite/basic/basn3p04.png spec/png_suite/basic/basn3p04.rgba spec/png_suite/basic/basn3p08.png spec/png_suite/basic/basn3p08.rgba spec/png_suite/basic/basn4a08.png spec/png_suite/basic/basn4a08.rgba spec/png_suite/basic/basn4a16.png spec/png_suite/basic/basn4a16.rgba spec/png_suite/basic/basn6a08.png spec/png_suite/basic/basn6a08.rgba spec/png_suite/basic/basn6a16.png spec/png_suite/basic/basn6a16.rgba spec/png_suite/broken/x00n0g01.png spec/png_suite/broken/xcrn0g04.png spec/png_suite/broken/xlfn0g04.png spec/png_suite/chunk_ordering/oi1n0g16.png spec/png_suite/chunk_ordering/oi1n2c16.png spec/png_suite/chunk_ordering/oi2n0g16.png spec/png_suite/chunk_ordering/oi2n2c16.png spec/png_suite/chunk_ordering/oi4n0g16.png spec/png_suite/chunk_ordering/oi4n2c16.png spec/png_suite/chunk_ordering/oi9n0g16.png spec/png_suite/chunk_ordering/oi9n2c16.png spec/png_suite/compression_levels/z00n2c08.png spec/png_suite/compression_levels/z03n2c08.png spec/png_suite/compression_levels/z06n2c08.png spec/png_suite/compression_levels/z09n2c08.png spec/png_suite/filtering/f00n0g08.png spec/png_suite/filtering/f00n0g08.rgba spec/png_suite/filtering/f00n0g08_reference.png spec/png_suite/filtering/f00n0g08_reference.rgba spec/png_suite/filtering/f00n2c08.png spec/png_suite/filtering/f00n2c08.rgba spec/png_suite/filtering/f00n2c08_reference.png spec/png_suite/filtering/f00n2c08_reference.rgba spec/png_suite/filtering/f01n0g08.png spec/png_suite/filtering/f01n0g08.rgba spec/png_suite/filtering/f01n0g08_reference.png spec/png_suite/filtering/f01n0g08_reference.rgba spec/png_suite/filtering/f01n2c08.png spec/png_suite/filtering/f01n2c08.rgba spec/png_suite/filtering/f01n2c08_reference.png spec/png_suite/filtering/f01n2c08_reference.rgba spec/png_suite/filtering/f02n0g08.png spec/png_suite/filtering/f02n0g08.rgba spec/png_suite/filtering/f02n0g08_reference.png spec/png_suite/filtering/f02n0g08_reference.rgba spec/png_suite/filtering/f02n2c08.png spec/png_suite/filtering/f02n2c08.rgba spec/png_suite/filtering/f02n2c08_reference.png spec/png_suite/filtering/f02n2c08_reference.rgba spec/png_suite/filtering/f03n0g08.png spec/png_suite/filtering/f03n0g08.rgba spec/png_suite/filtering/f03n0g08_reference.png spec/png_suite/filtering/f03n0g08_reference.rgba spec/png_suite/filtering/f03n2c08.png spec/png_suite/filtering/f03n2c08.rgba spec/png_suite/filtering/f03n2c08_reference.png spec/png_suite/filtering/f03n2c08_reference.rgba spec/png_suite/filtering/f04n0g08.png spec/png_suite/filtering/f04n0g08.rgba spec/png_suite/filtering/f04n0g08_reference.png spec/png_suite/filtering/f04n0g08_reference.rgba spec/png_suite/filtering/f04n2c08.png spec/png_suite/filtering/f04n2c08.rgba spec/png_suite/filtering/f04n2c08_reference.png spec/png_suite/filtering/f04n2c08_reference.rgba spec/png_suite/gamma/g03n0g16.png spec/png_suite/gamma/g03n2c08.png spec/png_suite/gamma/g03n3p04.png spec/png_suite/gamma/g04n0g16.png spec/png_suite/gamma/g04n2c08.png spec/png_suite/gamma/g04n3p04.png spec/png_suite/gamma/g05n0g16.png spec/png_suite/gamma/g05n2c08.png spec/png_suite/gamma/g05n3p04.png spec/png_suite/gamma/g07n0g16.png spec/png_suite/gamma/g07n2c08.png spec/png_suite/gamma/g07n3p04.png spec/png_suite/gamma/g10n0g16.png spec/png_suite/gamma/g10n2c08.png spec/png_suite/gamma/g10n3p04.png spec/png_suite/gamma/g25n0g16.png spec/png_suite/gamma/g25n2c08.png spec/png_suite/gamma/g25n3p04.png spec/png_suite/metadata/cm0n0g04.png spec/png_suite/metadata/cm7n0g04.png spec/png_suite/metadata/cm9n0g04.png spec/png_suite/other/ccwn2c08.png spec/png_suite/other/ccwn3p08.png spec/png_suite/other/cdfn2c08.png spec/png_suite/other/cdhn2c08.png spec/png_suite/other/cdsn2c08.png spec/png_suite/other/cdun2c08.png spec/png_suite/other/ch1n3p04.png spec/png_suite/other/ch2n3p08.png spec/png_suite/other/cs3n2c16.png spec/png_suite/other/cs3n3p08.png spec/png_suite/other/cs5n2c08.png spec/png_suite/other/cs5n3p08.png spec/png_suite/other/cs8n2c08.png spec/png_suite/other/cs8n3p08.png spec/png_suite/other/ct0n0g04.png spec/png_suite/other/ct1n0g04.png spec/png_suite/other/ctzn0g04.png spec/png_suite/other/pp0n2c16.png spec/png_suite/other/pp0n6a08.png spec/png_suite/other/ps1n0g08.png spec/png_suite/other/ps1n2c16.png spec/png_suite/other/ps2n0g08.png spec/png_suite/other/ps2n2c16.png spec/png_suite/sizes/s01i3p01.png spec/png_suite/sizes/s01n3p01.png spec/png_suite/sizes/s02i3p01.png spec/png_suite/sizes/s02n3p01.png spec/png_suite/sizes/s03i3p01.png spec/png_suite/sizes/s03n3p01.png spec/png_suite/sizes/s04i3p01.png spec/png_suite/sizes/s04n3p01.png spec/png_suite/sizes/s05i3p02.png spec/png_suite/sizes/s05n3p02.png spec/png_suite/sizes/s06i3p02.png spec/png_suite/sizes/s06n3p02.png spec/png_suite/sizes/s07i3p02.png spec/png_suite/sizes/s07n3p02.png spec/png_suite/sizes/s08i3p02.png spec/png_suite/sizes/s08n3p02.png spec/png_suite/sizes/s09i3p02.png spec/png_suite/sizes/s09n3p02.png spec/png_suite/sizes/s32i3p04.png spec/png_suite/sizes/s32n3p04.png spec/png_suite/sizes/s33i3p04.png spec/png_suite/sizes/s33n3p04.png spec/png_suite/sizes/s34i3p04.png spec/png_suite/sizes/s34n3p04.png spec/png_suite/sizes/s35i3p04.png spec/png_suite/sizes/s35n3p04.png spec/png_suite/sizes/s36i3p04.png spec/png_suite/sizes/s36n3p04.png spec/png_suite/sizes/s37i3p04.png spec/png_suite/sizes/s37n3p04.png spec/png_suite/sizes/s38i3p04.png spec/png_suite/sizes/s38n3p04.png spec/png_suite/sizes/s39i3p04.png spec/png_suite/sizes/s39n3p04.png spec/png_suite/sizes/s40i3p04.png spec/png_suite/sizes/s40n3p04.png spec/png_suite/transparency/tbbn1g04.png spec/png_suite/transparency/tbbn2c16.png spec/png_suite/transparency/tbbn3p08.png spec/png_suite/transparency/tbgn2c16.png spec/png_suite/transparency/tbgn3p08.png spec/png_suite/transparency/tbrn2c08.png spec/png_suite/transparency/tbwn1g16.png spec/png_suite/transparency/tbwn3p08.png spec/png_suite/transparency/tbyn3p08.png spec/png_suite/transparency/tp0n1g08.png spec/png_suite/transparency/tp0n2c08.png spec/png_suite/transparency/tp0n3p08.png spec/png_suite/transparency/tp1n3p08.png spec/png_suite_spec.rb spec/resources/adam7.png spec/resources/clock.png spec/resources/clock_base.png spec/resources/clock_flip_horizontally.png spec/resources/clock_flip_vertically.png spec/resources/clock_mask.png spec/resources/clock_mask_updated.png spec/resources/clock_rotate_180.png spec/resources/clock_rotate_left.png spec/resources/clock_rotate_right.png spec/resources/clock_stubbed.png spec/resources/clock_updated.png spec/resources/composited.png spec/resources/cropped.png spec/resources/damaged_chunk.png spec/resources/damaged_signature.png spec/resources/lines.png spec/resources/operations.png spec/resources/pixelstream.rgb spec/resources/pixelstream.rgba spec/resources/pixelstream_best_compression.png spec/resources/pixelstream_fast_rgba.png spec/resources/pixelstream_reference.png spec/resources/rect.png spec/resources/replaced.png spec/resources/text_chunk.png spec/resources/ztxt_chunk.png spec/spec_helper.rb tasks/benchmarks.rake tasks/github-gem.rake)
|
42
42
|
s.test_files = %w(spec/chunky_png/canvas/adam7_interlacing_spec.rb spec/chunky_png/canvas/drawing_spec.rb spec/chunky_png/canvas/operations_spec.rb spec/chunky_png/canvas/png_decoding_spec.rb spec/chunky_png/canvas/png_encoding_spec.rb spec/chunky_png/canvas_spec.rb spec/chunky_png/color_spec.rb spec/chunky_png/datastream_spec.rb spec/chunky_png/image_spec.rb spec/chunky_png/rmagick_spec.rb spec/chunky_png_spec.rb spec/png_suite_spec.rb)
|
43
43
|
end
|
data/lib/chunky_png.rb
CHANGED
@@ -28,7 +28,7 @@ module ChunkyPNG
|
|
28
28
|
|
29
29
|
# The current version of ChunkyPNG. This value will be updated automatically
|
30
30
|
# by them gem:release rake task.
|
31
|
-
VERSION = "0.
|
31
|
+
VERSION = "1.0.0.beta1"
|
32
32
|
|
33
33
|
###################################################
|
34
34
|
# PNG international standard defined constants
|
@@ -99,36 +99,30 @@ module ChunkyPNG
|
|
99
99
|
# @return [Hash] A hash with encoding options for {ChunkyPNG::Canvas::PNGEncoding#to_datastream}
|
100
100
|
def determine_png_encoding(constraints = {})
|
101
101
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
encoding = { :compression => Zlib::NO_COMPRESSION }
|
112
|
-
else
|
113
|
-
encoding = constraints
|
102
|
+
encoding = case constraints
|
103
|
+
when :fast_rgb; { :color_mode => ChunkyPNG::COLOR_TRUECOLOR, :compression => Zlib::BEST_SPEED }
|
104
|
+
when :fast_rgba; { :color_mode => ChunkyPNG::COLOR_TRUECOLOR_ALPHA, :compression => Zlib::BEST_SPEED }
|
105
|
+
when :best_compression; { :compression => Zlib::BEST_COMPRESSION, :filtering => ChunkyPNG::FILTER_PAETH }
|
106
|
+
when :good_compression; { :compression => Zlib::BEST_COMPRESSION, :filtering => ChunkyPNG::FILTER_NONE }
|
107
|
+
when :no_compression; { :compression => Zlib::NO_COMPRESSION }
|
108
|
+
when :black_and_white; { :color_mode => ChunkyPNG::COLOR_GRAYSCALE, :bit_depth => 1 }
|
109
|
+
when Hash; constraints
|
110
|
+
else raise ChunkyPNG::Exception, "Unknown encoding preset: #{constraints.inspect}"
|
114
111
|
end
|
115
112
|
|
116
113
|
# Do not create a pallete when the encoding is given and does not require a palette.
|
117
114
|
if encoding[:color_mode]
|
118
115
|
if encoding[:color_mode] == ChunkyPNG::COLOR_INDEXED
|
119
|
-
self.encoding_palette = self.palette
|
116
|
+
self.encoding_palette = self.palette
|
117
|
+
encoding[:bit_depth] ||= self.encoding_palette.determine_bit_depth
|
118
|
+
else
|
119
|
+
encoding[:bit_depth] ||= 8
|
120
120
|
end
|
121
121
|
else
|
122
122
|
self.encoding_palette = self.palette
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
# Set the number of bits per color channel. This will always be 8 except for
|
127
|
-
# indexed image, which may also use lower bit depths
|
128
|
-
if encoding[:color_mode] == ChunkyPNG::COLOR_INDEXED
|
129
|
-
encoding[:bit_depth] = [encoding_palette.determine_bit_depth, encoding[:bit_depth] || 1].max
|
130
|
-
else
|
131
|
-
encoding[:bit_depth] = 8
|
123
|
+
suggested_color_mode, suggested_bit_depth = encoding_palette.best_color_settings
|
124
|
+
encoding[:color_mode] ||= suggested_color_mode
|
125
|
+
encoding[:bit_depth] ||= suggested_bit_depth
|
132
126
|
end
|
133
127
|
|
134
128
|
# Use Zlib's default for compression unless otherwise provided.
|
@@ -156,8 +150,9 @@ module ChunkyPNG
|
|
156
150
|
# @return [String] The PNG encoded canvas as string.
|
157
151
|
def encode_png_pixelstream(color_mode = ChunkyPNG::COLOR_TRUECOLOR, bit_depth = 8, interlace = ChunkyPNG::INTERLACING_NONE, filtering = ChunkyPNG::FILTER_NONE)
|
158
152
|
|
159
|
-
if color_mode == ChunkyPNG::COLOR_INDEXED
|
160
|
-
raise ChunkyPNG::ExpectationFailed, "This palette is not suitable for encoding!"
|
153
|
+
if color_mode == ChunkyPNG::COLOR_INDEXED
|
154
|
+
raise ChunkyPNG::ExpectationFailed, "This palette is not suitable for encoding!" if encoding_palette.nil? || !encoding_palette.can_encode?
|
155
|
+
raise ChunkyPNG::ExpectationFailed, "This palette has too many colors!" if encoding_palette.size > (1 << bit_depth)
|
161
156
|
end
|
162
157
|
|
163
158
|
case interlace
|
@@ -267,7 +262,7 @@ module ChunkyPNG
|
|
267
262
|
|
268
263
|
# Encodes a line of pixels using 2-bit indexed mode.
|
269
264
|
# @param [Array<Integer>] pixels A row of pixels of the original image.
|
270
|
-
# @return [String] The encoded scanline as binary string
|
265
|
+
# @return [String] The encoded scanline as binary string
|
271
266
|
def encode_png_pixels_to_scanline_indexed_2bit(pixels)
|
272
267
|
chars = []
|
273
268
|
pixels.each_slice(4) do |p1, p2, p3, p4|
|
@@ -297,6 +292,49 @@ module ChunkyPNG
|
|
297
292
|
pixels.map { |p| encoding_palette.index(p) }.pack("xC#{width}")
|
298
293
|
end
|
299
294
|
|
295
|
+
# Encodes a line of pixels using 1-bit grayscale mode.
|
296
|
+
# @param [Array<Integer>] pixels A row of pixels of the original image.
|
297
|
+
# @return [String] The encoded scanline as binary string
|
298
|
+
def encode_png_pixels_to_scanline_grayscale_1bit(pixels)
|
299
|
+
chars = []
|
300
|
+
pixels.each_slice(8) do |p1, p2, p3, p4, p5, p6, p7, p8|
|
301
|
+
chars << ((p1.nil? ? 0 : (p1 & 0x0000ffff) >> 15 << 7) |
|
302
|
+
(p2.nil? ? 0 : (p2 & 0x0000ffff) >> 15 << 6) |
|
303
|
+
(p3.nil? ? 0 : (p3 & 0x0000ffff) >> 15 << 5) |
|
304
|
+
(p4.nil? ? 0 : (p4 & 0x0000ffff) >> 15 << 4) |
|
305
|
+
(p5.nil? ? 0 : (p5 & 0x0000ffff) >> 15 << 3) |
|
306
|
+
(p6.nil? ? 0 : (p6 & 0x0000ffff) >> 15 << 2) |
|
307
|
+
(p7.nil? ? 0 : (p7 & 0x0000ffff) >> 15 << 1) |
|
308
|
+
(p8.nil? ? 0 : (p8 & 0x0000ffff) >> 15))
|
309
|
+
end
|
310
|
+
chars.pack('xC*')
|
311
|
+
end
|
312
|
+
|
313
|
+
# Encodes a line of pixels using 2-bit grayscale mode.
|
314
|
+
# @param [Array<Integer>] pixels A row of pixels of the original image.
|
315
|
+
# @return [String] The encoded scanline as binary string
|
316
|
+
def encode_png_pixels_to_scanline_grayscale_2bit(pixels)
|
317
|
+
chars = []
|
318
|
+
pixels.each_slice(4) do |p1, p2, p3, p4|
|
319
|
+
chars << ((p1.nil? ? 0 : (p1 & 0x0000ffff) >> 14 << 6) |
|
320
|
+
(p2.nil? ? 0 : (p2 & 0x0000ffff) >> 14 << 4) |
|
321
|
+
(p3.nil? ? 0 : (p3 & 0x0000ffff) >> 14 << 2) |
|
322
|
+
(p4.nil? ? 0 : (p4 & 0x0000ffff) >> 14))
|
323
|
+
end
|
324
|
+
chars.pack('xC*')
|
325
|
+
end
|
326
|
+
|
327
|
+
# Encodes a line of pixels using 2-bit grayscale mode.
|
328
|
+
# @param [Array<Integer>] pixels A row of pixels of the original image.
|
329
|
+
# @return [String] The encoded scanline as binary string
|
330
|
+
def encode_png_pixels_to_scanline_grayscale_4bit(pixels)
|
331
|
+
chars = []
|
332
|
+
pixels.each_slice(2) do |p1, p2|
|
333
|
+
chars << ((p1.nil? ? 0 : ((p1 & 0x0000ffff) >> 12) << 4) | (p2.nil? ? 0 : ((p2 & 0x0000ffff) >> 12)))
|
334
|
+
end
|
335
|
+
chars.pack('xC*')
|
336
|
+
end
|
337
|
+
|
300
338
|
# Encodes a line of pixels using 8-bit grayscale mode.
|
301
339
|
# @param [Array<Integer>] pixels A row of pixels of the original image.
|
302
340
|
# @return [String] The encoded scanline as binary string
|
data/lib/chunky_png/palette.rb
CHANGED
@@ -76,19 +76,26 @@ module ChunkyPNG
|
|
76
76
|
size <= 256
|
77
77
|
end
|
78
78
|
|
79
|
-
# Check whether this
|
79
|
+
# Check whether this palette only contains opaque colors.
|
80
80
|
# @return [true, false] True if all colors in this palette are opaque.
|
81
81
|
# @see ChunkyPNG::Color#opaque?
|
82
82
|
def opaque?
|
83
83
|
all? { |color| Color.opaque?(color) }
|
84
84
|
end
|
85
85
|
|
86
|
-
# Check whether this
|
86
|
+
# Check whether this palette only contains grayscale colors.
|
87
87
|
# @return [true, false] True if all colors in this palette are grayscale teints.
|
88
88
|
# @see ChunkyPNG::Color#grayscale??
|
89
89
|
def grayscale?
|
90
90
|
all? { |color| Color.grayscale?(color) }
|
91
91
|
end
|
92
|
+
|
93
|
+
# Check whether this palette only contains bacl and white.
|
94
|
+
# @return [true, false] True if all colors in this palette are grayscale teints.
|
95
|
+
# @see ChunkyPNG::Color#grayscale??
|
96
|
+
def black_and_white?
|
97
|
+
entries == [ChunkyPNG::Color::BLACK, ChunkyPNG::Color::WHITE]
|
98
|
+
end
|
92
99
|
|
93
100
|
# Returns a palette with all the opaque variants of the colors in this palette.
|
94
101
|
# @return [ChunkyPNG::Palette] A new Palette instance with only opaque colors.
|
@@ -168,19 +175,21 @@ module ChunkyPNG
|
|
168
175
|
# Determines the most suitable colormode for this palette.
|
169
176
|
# @return [Integer] The colormode which would create the smalles possible
|
170
177
|
# file for images that use this exact palette.
|
171
|
-
def
|
172
|
-
if
|
178
|
+
def best_color_settings
|
179
|
+
if black_and_white?
|
180
|
+
[ChunkyPNG::COLOR_GRAYSCALE, 1]
|
181
|
+
elsif grayscale?
|
173
182
|
if opaque?
|
174
|
-
ChunkyPNG::COLOR_GRAYSCALE
|
183
|
+
[ChunkyPNG::COLOR_GRAYSCALE, 8]
|
175
184
|
else
|
176
|
-
ChunkyPNG::COLOR_GRAYSCALE_ALPHA
|
185
|
+
[ChunkyPNG::COLOR_GRAYSCALE_ALPHA, 8]
|
177
186
|
end
|
178
187
|
elsif indexable?
|
179
|
-
ChunkyPNG::COLOR_INDEXED
|
188
|
+
[ChunkyPNG::COLOR_INDEXED, determine_bit_depth]
|
180
189
|
elsif opaque?
|
181
|
-
ChunkyPNG::COLOR_TRUECOLOR
|
190
|
+
[ChunkyPNG::COLOR_TRUECOLOR, 8]
|
182
191
|
else
|
183
|
-
ChunkyPNG::COLOR_TRUECOLOR_ALPHA
|
192
|
+
[ChunkyPNG::COLOR_TRUECOLOR_ALPHA, 8]
|
184
193
|
end
|
185
194
|
end
|
186
195
|
|
@@ -189,11 +198,11 @@ module ChunkyPNG
|
|
189
198
|
# image cannot be saved as an indexed image.
|
190
199
|
def determine_bit_depth
|
191
200
|
case size
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
201
|
+
when 1..2; 1
|
202
|
+
when 3..4; 2
|
203
|
+
when 5..16; 4
|
204
|
+
when 17..256; 8
|
205
|
+
else nil
|
197
206
|
end
|
198
207
|
end
|
199
208
|
end
|
@@ -3,19 +3,16 @@ require 'spec_helper'
|
|
3
3
|
describe ChunkyPNG::Canvas::PNGEncoding do
|
4
4
|
include ChunkyPNG::Canvas::PNGEncoding
|
5
5
|
|
6
|
-
|
6
|
+
context 'determining encoding options' do
|
7
7
|
[:indexed, :grayscale, :grayscale_alpha, :truecolor, :truecolor_alpha].each do |color_mode_name|
|
8
8
|
it "should encode an image with color mode #{color_mode_name} correctly" do
|
9
|
-
filename = resource_file("_tmp_#{color_mode_name}.png")
|
10
9
|
canvas = ChunkyPNG::Canvas.new(10, 10, ChunkyPNG::Color.rgb(100, 100, 100))
|
11
10
|
color_mode = ChunkyPNG.const_get("COLOR_#{color_mode_name.to_s.upcase}")
|
12
|
-
canvas.
|
11
|
+
blob = canvas.to_blob(:color_mode => color_mode)
|
13
12
|
|
14
|
-
ds = ChunkyPNG::Datastream.
|
13
|
+
ds = ChunkyPNG::Datastream.from_blob(blob)
|
15
14
|
ds.header_chunk.color.should == color_mode
|
16
15
|
ChunkyPNG::Canvas.from_datastream(ds).should == ChunkyPNG::Canvas.new(10, 10, ChunkyPNG::Color.rgb(100, 100, 100))
|
17
|
-
|
18
|
-
File.unlink(filename)
|
19
16
|
end
|
20
17
|
end
|
21
18
|
|
@@ -61,14 +58,11 @@ describe ChunkyPNG::Canvas::PNGEncoding do
|
|
61
58
|
|
62
59
|
it "should encode an image with interlacing correctly" do
|
63
60
|
input_canvas = ChunkyPNG::Canvas.from_file(resource_file('operations.png'))
|
64
|
-
|
65
|
-
input_canvas.save(filename, :interlace => true)
|
61
|
+
blob = input_canvas.to_blob(:interlace => true)
|
66
62
|
|
67
|
-
ds = ChunkyPNG::Datastream.
|
63
|
+
ds = ChunkyPNG::Datastream.from_blob(blob)
|
68
64
|
ds.header_chunk.interlace.should == ChunkyPNG::INTERLACING_ADAM7
|
69
65
|
ChunkyPNG::Canvas.from_datastream(ds).should == input_canvas
|
70
|
-
|
71
|
-
File.unlink(filename)
|
72
66
|
end
|
73
67
|
|
74
68
|
it "should save an image using the normal routine correctly" do
|
@@ -105,73 +99,80 @@ describe ChunkyPNG::Canvas::PNGEncoding do
|
|
105
99
|
Zlib::Deflate.should_receive(:deflate).with(anything, Zlib::BEST_COMPRESSION).and_return('')
|
106
100
|
canvas.to_blob(:best_compression)
|
107
101
|
end
|
102
|
+
|
103
|
+
it "should save an image with black and white only if requested" do
|
104
|
+
ds = ChunkyPNG::Datastream.from_blob(reference_canvas('lines').to_blob(:black_and_white))
|
105
|
+
ds.header_chunk.color.should == ChunkyPNG::COLOR_GRAYSCALE
|
106
|
+
ds.header_chunk.depth.should == 1
|
107
|
+
end
|
108
108
|
end
|
109
109
|
|
110
|
-
describe '
|
110
|
+
describe 'different color modes and bit depths' do
|
111
111
|
before do
|
112
|
-
@canvas = ChunkyPNG::Canvas.new(2, 2
|
113
|
-
|
114
|
-
@
|
115
|
-
@
|
112
|
+
@canvas = ChunkyPNG::Canvas.new(2, 2)
|
113
|
+
|
114
|
+
@canvas[0, 0] = ChunkyPNG::Color.rgba( 1, 2, 3, 4)
|
115
|
+
@canvas[1, 0] = ChunkyPNG::Color.rgba(252, 253, 254, 255)
|
116
|
+
@canvas[0, 1] = ChunkyPNG::Color.rgba(255, 254, 253, 252)
|
117
|
+
@canvas[1, 1] = ChunkyPNG::Color.rgba( 4, 3, 2, 1)
|
118
|
+
|
119
|
+
@canvas.encoding_palette = @canvas.palette
|
120
|
+
@canvas.encoding_palette.to_plte_chunk
|
116
121
|
end
|
117
122
|
|
118
|
-
it "should encode using RGBA
|
119
|
-
|
120
|
-
stream.should == "\0\
|
123
|
+
it "should encode using 8-bit RGBA mode correctly" do
|
124
|
+
stream = @canvas.encode_png_pixelstream(ChunkyPNG::COLOR_TRUECOLOR_ALPHA, 8, ChunkyPNG::INTERLACING_NONE, ChunkyPNG::FILTER_NONE)
|
125
|
+
stream.should == "\0\x01\x02\x03\x04\xFC\xFD\xFE\xFF\0\xFF\xFE\xFD\xFC\x04\x03\x02\x01"
|
121
126
|
end
|
122
127
|
|
123
|
-
it "should encode using
|
124
|
-
|
125
|
-
stream.should == "\
|
128
|
+
it "should encode using 8 bit RGB mode correctly" do
|
129
|
+
stream = @canvas.encode_png_pixelstream(ChunkyPNG::COLOR_TRUECOLOR, 8, ChunkyPNG::INTERLACING_NONE, ChunkyPNG::FILTER_NONE)
|
130
|
+
stream.should == "\0\x01\x02\x03\xFC\xFD\xFE\0\xFF\xFE\xFD\x04\x03\x02"
|
126
131
|
end
|
127
132
|
|
128
|
-
it "should encode using
|
129
|
-
@canvas.
|
130
|
-
stream.should == "\
|
133
|
+
it "should encode using 1-bit grayscale mode correctly" do
|
134
|
+
stream = @canvas.encode_png_pixelstream(ChunkyPNG::COLOR_GRAYSCALE, 1, ChunkyPNG::INTERLACING_NONE, ChunkyPNG::FILTER_NONE)
|
135
|
+
stream.should == "\0\x40\0\x80" # Using the B byte of the pixel == 3, assuming R == G == B for grayscale images
|
131
136
|
end
|
132
137
|
|
133
|
-
it "should encode using
|
134
|
-
@canvas.
|
135
|
-
stream.should == "\
|
138
|
+
it "should encode using 2-bit grayscale mode correctly" do
|
139
|
+
stream = @canvas.encode_png_pixelstream(ChunkyPNG::COLOR_GRAYSCALE, 2, ChunkyPNG::INTERLACING_NONE, ChunkyPNG::FILTER_NONE)
|
140
|
+
stream.should == "\0\x30\0\xC0" # Using the B byte of the pixel == 3, assuming R == G == B for grayscale images
|
136
141
|
end
|
137
142
|
|
138
|
-
it "should encode using
|
139
|
-
@canvas.
|
140
|
-
stream.should == "\0\
|
143
|
+
it "should encode using 4-bit grayscale mode correctly" do
|
144
|
+
stream = @canvas.encode_png_pixelstream(ChunkyPNG::COLOR_GRAYSCALE, 4, ChunkyPNG::INTERLACING_NONE, ChunkyPNG::FILTER_NONE)
|
145
|
+
stream.should == "\0\x0F\0\xF0" # Using the B byte of the pixel == 3, assuming R == G == B for grayscale images
|
141
146
|
end
|
142
147
|
|
143
|
-
it "should encode using
|
144
|
-
@canvas.
|
145
|
-
|
146
|
-
stream.should == "\0\1\1\0\1\1"
|
148
|
+
it "should encode using 8-bit grayscale mode correctly" do
|
149
|
+
stream = @canvas.encode_png_pixelstream(ChunkyPNG::COLOR_GRAYSCALE, 8, ChunkyPNG::INTERLACING_NONE, ChunkyPNG::FILTER_NONE)
|
150
|
+
stream.should == "\0\x03\xFE\0\xFD\x02" # Using the B byte of the pixel == 3, assuming R == G == B for grayscale images
|
147
151
|
end
|
148
|
-
|
149
|
-
it "should encode using 1-bit indexed
|
150
|
-
|
151
|
-
|
152
|
-
|
152
|
+
|
153
|
+
it "should not encode using 1-bit indexed mode because the image has too many colors" do
|
154
|
+
lambda {
|
155
|
+
@canvas.encode_png_pixelstream(ChunkyPNG::COLOR_INDEXED, 1, ChunkyPNG::INTERLACING_NONE, ChunkyPNG::FILTER_NONE)
|
156
|
+
}.should raise_error(ChunkyPNG::ExpectationFailed)
|
153
157
|
end
|
154
158
|
|
155
|
-
it "should encode using 2-bit indexed
|
156
|
-
@canvas.
|
157
|
-
|
158
|
-
stream.should == "\x00\x50\x00\x50"
|
159
|
+
it "should encode using 2-bit indexed mode correctly" do
|
160
|
+
stream = @canvas.encode_png_pixelstream(ChunkyPNG::COLOR_INDEXED, 2, ChunkyPNG::INTERLACING_NONE, ChunkyPNG::FILTER_NONE)
|
161
|
+
stream.should == "\0\x20\0\xD0"
|
159
162
|
end
|
160
163
|
|
161
|
-
it "should encode using 4-bit indexed
|
162
|
-
@canvas.
|
163
|
-
|
164
|
-
stream.should == "\0\x11\0\x11"
|
164
|
+
it "should encode using 4-bit indexed mode correctly" do
|
165
|
+
stream = @canvas.encode_png_pixelstream(ChunkyPNG::COLOR_INDEXED, 4, ChunkyPNG::INTERLACING_NONE, ChunkyPNG::FILTER_NONE)
|
166
|
+
stream.should == "\0\x02\0\x31"
|
165
167
|
end
|
166
|
-
|
167
|
-
it "should encode using indexed
|
168
|
-
@canvas.
|
169
|
-
|
170
|
-
stream.should == "\4\1\0\4\0\0"
|
168
|
+
|
169
|
+
it "should encode using 8-bit indexed mode correctly" do
|
170
|
+
stream = @canvas.encode_png_pixelstream(ChunkyPNG::COLOR_INDEXED, 8, ChunkyPNG::INTERLACING_NONE, ChunkyPNG::FILTER_NONE)
|
171
|
+
stream.should == "\0\x00\x02\0\x03\x01"
|
171
172
|
end
|
172
173
|
end
|
173
|
-
|
174
|
-
describe '
|
174
|
+
|
175
|
+
describe 'different filter methods' do
|
175
176
|
|
176
177
|
it "should encode a scanline without filtering correctly" do
|
177
178
|
stream = [ChunkyPNG::FILTER_NONE, 0, 0, 0, 1, 1, 1, 2, 2, 2].pack('C*')
|
data/spec/spec_helper.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require 'bundler'
|
3
|
-
|
4
|
-
Bundler.require(:default, :development)
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'chunky_png'
|
5
4
|
|
6
5
|
module PNGSuite
|
7
6
|
|
@@ -33,11 +32,11 @@ module ResourceFileHelper
|
|
33
32
|
ChunkyPNG::Image.from_file(resource_file("#{name}.png"))
|
34
33
|
end
|
35
34
|
|
36
|
-
def display(
|
35
|
+
def display(png)
|
37
36
|
filename = resource_file('_tmp.png')
|
38
|
-
|
37
|
+
png.save(filename)
|
39
38
|
`open #{filename}`
|
40
|
-
end
|
39
|
+
end
|
41
40
|
end
|
42
41
|
|
43
42
|
RSpec.configure do |config|
|
data/tasks/github-gem.rake
CHANGED
@@ -220,7 +220,7 @@ module GithubGem
|
|
220
220
|
|
221
221
|
def check_version_task
|
222
222
|
raise "#{ENV['VERSION']} is not a valid version number!" if ENV['VERSION'] && !Gem::Version.correct?(ENV['VERSION'])
|
223
|
-
proposed_version = Gem::Version.new(ENV['VERSION']
|
223
|
+
proposed_version = Gem::Version.new((ENV['VERSION'] || gemspec.version).dup)
|
224
224
|
raise "This version (#{proposed_version}) is not higher than the highest tagged version (#{newest_version})" if newest_version >= proposed_version
|
225
225
|
end
|
226
226
|
|
@@ -339,22 +339,26 @@ module GithubGem
|
|
339
339
|
|
340
340
|
# Updates the tasks file using the latest file found on Github
|
341
341
|
def update_tasks_task
|
342
|
-
require 'net/
|
343
|
-
|
344
|
-
|
345
|
-
|
342
|
+
require 'net/https'
|
343
|
+
require 'uri'
|
344
|
+
|
345
|
+
uri = URI.parse('https://github.com/wvanbergen/github-gem/raw/master/tasks/github-gem.rake')
|
346
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
347
|
+
http.use_ssl = true
|
348
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
349
|
+
response = http.request(Net::HTTP::Get.new(uri.path))
|
346
350
|
|
347
|
-
Net::
|
348
|
-
response = http.get(path)
|
351
|
+
if Net::HTTPSuccess === response
|
349
352
|
open(__FILE__, "w") { |file| file.write(response.body) }
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
353
|
+
relative_file = File.expand_path(__FILE__).sub(%r[^#{@root_dir}/], '')
|
354
|
+
if `#{git} ls-files -m #{relative_file}`.split("\n").any?
|
355
|
+
sh git, 'add', relative_file
|
356
|
+
sh git, 'commit', '-m', "Updated to latest gem release management tasks."
|
357
|
+
else
|
358
|
+
puts "Release managament tasks already are at the latest version."
|
359
|
+
end
|
356
360
|
else
|
357
|
-
|
361
|
+
raise "Download failed with HTTP status #{response.code}!"
|
358
362
|
end
|
359
363
|
end
|
360
364
|
end
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chunky_png
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
4
|
+
prerelease: true
|
5
5
|
segments:
|
6
|
+
- 1
|
6
7
|
- 0
|
7
|
-
- 12
|
8
8
|
- 0
|
9
|
-
|
9
|
+
- beta1
|
10
|
+
version: 1.0.0.beta1
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Willem van Bergen
|
@@ -14,11 +15,12 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date:
|
18
|
+
date: 2011-01-24 00:00:00 -05:00
|
18
19
|
default_executable:
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
21
22
|
name: rake
|
23
|
+
prerelease: false
|
22
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
23
25
|
none: false
|
24
26
|
requirements:
|
@@ -28,10 +30,10 @@ dependencies:
|
|
28
30
|
- 0
|
29
31
|
version: "0"
|
30
32
|
type: :development
|
31
|
-
prerelease: false
|
32
33
|
version_requirements: *id001
|
33
34
|
- !ruby/object:Gem::Dependency
|
34
35
|
name: rspec
|
36
|
+
prerelease: false
|
35
37
|
requirement: &id002 !ruby/object:Gem::Requirement
|
36
38
|
none: false
|
37
39
|
requirements:
|
@@ -42,7 +44,6 @@ dependencies:
|
|
42
44
|
- 2
|
43
45
|
version: "2.2"
|
44
46
|
type: :development
|
45
|
-
prerelease: false
|
46
47
|
version_requirements: *id002
|
47
48
|
description: " This pure Ruby library can read and write PNG images without depending on an external \n image library, like RMagick. It tries to be memory efficient and reasonably fast.\n \n It supports reading and writing all PNG variants that are defined in the specification, \n with one limitation: only 8-bit color depth is supported. It supports all transparency, \n interlacing and filtering options the PNG specifications allows. It can also read and \n write textual metadata from PNG files. Low-level read/write access to PNG chunks is\n also possible.\n \n This library supports simple drawing on the image canvas and simple operations like\n alpha composition and cropping. Finally, it can import from and export to RMagick for \n interoperability.\n \n Also, have a look at OilyPNG at http://github.com/wvanbergen/oily_png. OilyPNG is a \n drop in mixin module that implements some of the ChunkyPNG algorithms in C, which \n provides a massive speed boost to encoding and decoding.\n"
|
48
49
|
email:
|
@@ -59,7 +60,6 @@ files:
|
|
59
60
|
- .infinity_test
|
60
61
|
- BENCHMARKS.rdoc
|
61
62
|
- Gemfile
|
62
|
-
- Gemfile.lock
|
63
63
|
- LICENSE
|
64
64
|
- README.rdoc
|
65
65
|
- Rakefile
|
@@ -360,19 +360,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
360
360
|
requirements:
|
361
361
|
- - ">="
|
362
362
|
- !ruby/object:Gem::Version
|
363
|
-
hash: 1966366750719945677
|
364
363
|
segments:
|
365
364
|
- 0
|
366
365
|
version: "0"
|
367
366
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
368
367
|
none: false
|
369
368
|
requirements:
|
370
|
-
- - "
|
369
|
+
- - ">"
|
371
370
|
- !ruby/object:Gem::Version
|
372
|
-
hash: 1966366750719945677
|
373
371
|
segments:
|
374
|
-
-
|
375
|
-
|
372
|
+
- 1
|
373
|
+
- 3
|
374
|
+
- 1
|
375
|
+
version: 1.3.1
|
376
376
|
requirements: []
|
377
377
|
|
378
378
|
rubyforge_project:
|
data/Gemfile.lock
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
chunky_png (0.12.0)
|
5
|
-
|
6
|
-
GEM
|
7
|
-
remote: http://rubygems.org/
|
8
|
-
specs:
|
9
|
-
bouncy-castle-java (1.5.0145.2)
|
10
|
-
diff-lcs (1.1.2)
|
11
|
-
jruby-openssl (0.7.2)
|
12
|
-
bouncy-castle-java
|
13
|
-
rake (0.8.7)
|
14
|
-
rspec (2.2.0)
|
15
|
-
rspec-core (~> 2.2)
|
16
|
-
rspec-expectations (~> 2.2)
|
17
|
-
rspec-mocks (~> 2.2)
|
18
|
-
rspec-core (2.2.1)
|
19
|
-
rspec-expectations (2.2.0)
|
20
|
-
diff-lcs (~> 1.1.2)
|
21
|
-
rspec-mocks (2.2.0)
|
22
|
-
|
23
|
-
PLATFORMS
|
24
|
-
java
|
25
|
-
ruby
|
26
|
-
|
27
|
-
DEPENDENCIES
|
28
|
-
chunky_png!
|
29
|
-
jruby-openssl
|
30
|
-
rake
|
31
|
-
rspec (~> 2.2)
|