chunky_png 1.0.1 → 1.1.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.
@@ -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 = "1.0.1"
7
- s.date = "2011-03-08"
6
+ s.version = "1.1.0"
7
+ s.date = "2011-03-19"
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 .yardopts 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/masking.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/resampling.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/dimension.rb lib/chunky_png/image.rb lib/chunky_png/palette.rb lib/chunky_png/point.rb lib/chunky_png/rmagick.rb lib/chunky_png/vector.rb spec/chunky_png/canvas/adam7_interlacing_spec.rb spec/chunky_png/canvas/drawing_spec.rb spec/chunky_png/canvas/masking_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/resampling_spec.rb spec/chunky_png/canvas/stream_exporting_spec.rb spec/chunky_png/canvas/stream_importing_spec.rb spec/chunky_png/canvas_spec.rb spec/chunky_png/color_spec.rb spec/chunky_png/datastream_spec.rb spec/chunky_png/dimension_spec.rb spec/chunky_png/image_spec.rb spec/chunky_png/point_spec.rb spec/chunky_png/rmagick_spec.rb spec/chunky_png/vector_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/circles.png spec/resources/clock.png spec/resources/clock_base.png spec/resources/clock_mask.png spec/resources/clock_mask_updated.png spec/resources/clock_nn_xdown_ydown.png spec/resources/clock_nn_xdown_yup.png spec/resources/clock_nn_xup_yup.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/partial_circles.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/polygon_filled_horizontal.png spec/resources/polygon_filled_vertical.png spec/resources/polygon_triangle_filled.png spec/resources/polygon_unfilled.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 .yardopts 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/masking.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/resampling.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/dimension.rb lib/chunky_png/image.rb lib/chunky_png/palette.rb lib/chunky_png/point.rb lib/chunky_png/rmagick.rb lib/chunky_png/vector.rb spec/chunky_png/canvas/adam7_interlacing_spec.rb spec/chunky_png/canvas/drawing_spec.rb spec/chunky_png/canvas/masking_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/resampling_spec.rb spec/chunky_png/canvas/stream_exporting_spec.rb spec/chunky_png/canvas/stream_importing_spec.rb spec/chunky_png/canvas_spec.rb spec/chunky_png/color_spec.rb spec/chunky_png/datastream_spec.rb spec/chunky_png/dimension_spec.rb spec/chunky_png/image_spec.rb spec/chunky_png/point_spec.rb spec/chunky_png/rmagick_spec.rb spec/chunky_png/vector_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/bezier_five_point.png spec/resources/bezier_four_point.png spec/resources/bezier_four_point_flipped.png spec/resources/bezier_four_point_s.png spec/resources/bezier_six_point.png spec/resources/bezier_three_point.png spec/resources/bezier_three_point_flipped.png spec/resources/circles.png spec/resources/clock.png spec/resources/clock_base.png spec/resources/clock_mask.png spec/resources/clock_mask_updated.png spec/resources/clock_nn_xdown_ydown.png spec/resources/clock_nn_xdown_yup.png spec/resources/clock_nn_xup_yup.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/partial_circles.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/polygon_filled_horizontal.png spec/resources/polygon_filled_vertical.png spec/resources/polygon_triangle_filled.png spec/resources/polygon_unfilled.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/masking_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/resampling_spec.rb spec/chunky_png/canvas/stream_exporting_spec.rb spec/chunky_png/canvas/stream_importing_spec.rb spec/chunky_png/canvas_spec.rb spec/chunky_png/color_spec.rb spec/chunky_png/datastream_spec.rb spec/chunky_png/dimension_spec.rb spec/chunky_png/image_spec.rb spec/chunky_png/point_spec.rb spec/chunky_png/rmagick_spec.rb spec/chunky_png/vector_spec.rb spec/chunky_png_spec.rb spec/png_suite_spec.rb)
43
43
  end
@@ -25,7 +25,7 @@ module ChunkyPNG
25
25
 
26
26
  # The current version of ChunkyPNG. This value will be updated
27
27
  # automatically by them <tt>gem:release</tt> rake task.
28
- VERSION = "1.0.1"
28
+ VERSION = "1.1.0"
29
29
 
30
30
  ###################################################
31
31
  # PNG international standard defined constants
@@ -104,7 +104,7 @@ module ChunkyPNG
104
104
  class Exception < ::StandardError
105
105
  end
106
106
 
107
- # Exception that is raised for an unsopported PNG image.
107
+ # Exception that is raised for an unsupported PNG image.
108
108
  class NotSupported < ChunkyPNG::Exception
109
109
  end
110
110
 
@@ -113,7 +113,7 @@ module ChunkyPNG
113
113
  class SignatureMismatch < ChunkyPNG::Exception
114
114
  end
115
115
 
116
- # Exception that is raised if the CRC check for a block failes
116
+ # Exception that is raised if the CRC check for a block fails
117
117
  class CRCMismatch < ChunkyPNG::Exception
118
118
  end
119
119
 
@@ -10,7 +10,7 @@ require 'chunky_png/canvas/masking'
10
10
 
11
11
  module ChunkyPNG
12
12
 
13
- # The ChunkPNG::Canvas class represents a raster image as a matrix of
13
+ # The ChunkyPNG::Canvas class represents a raster image as a matrix of
14
14
  # pixels.
15
15
  #
16
16
  # This class supports loading a Canvas from a PNG datastream, and creating a
@@ -58,20 +58,25 @@ module ChunkyPNG
58
58
  # CONSTRUCTORS
59
59
  #################################################################
60
60
 
61
- # Initializes a new Canvas instance
62
- # @param [Integer] width The width in pixels of this canvas
63
- # @param [Integer] width The height in pixels of this canvas
64
- # @param [ChunkyPNG::Pixel, Array<ChunkyPNG::Color>] initial The initial value of te pixels:
61
+ # Initializes a new Canvas instance.
65
62
  #
66
- # * If a color is passed to this parameter, this color will be used as background color.
63
+ # @overload initialize(width, height, background_color)
64
+ # @param [Integer] width The width in pixels of this canvas
65
+ # @param [Integer] height The height in pixels of this canvas
66
+ # @param [Integer, ...] background_color The initial background color of this canvas.
67
+ # This can be a color value or any value that {ChunkyPNG::Color.parse} can handle.
67
68
  #
68
- # * If an array of pixels is provided, these pixels will be used as initial value. Note
69
- # that the amount of pixels in this array should equal +width * height+.
69
+ # @overload initialize(width, height, initial)
70
+ # @param [Integer] width The width in pixels of this canvas
71
+ # @param [Integer] height The height in pixels of this canvas
72
+ # @param [Array<Integer>] initial The initial pizel values. Must be an array with
73
+ # <tt>width * height</tt> elements.
70
74
  def initialize(width, height, initial = ChunkyPNG::Color::TRANSPARENT)
71
75
 
72
76
  @width, @height = width, height
73
77
 
74
- if initial.kind_of?(Array) && initial.length == width * height
78
+ if initial.kind_of?(Array)
79
+ raise ArgumentError, "The initial array should have #{width}x#{height} = #{width*height} elements!" unless initial.length == width * height
75
80
  @pixels = initial
76
81
  else
77
82
  @pixels = Array.new(width * height, ChunkyPNG::Color.parse(initial))
@@ -100,7 +105,7 @@ module ChunkyPNG
100
105
  #################################################################
101
106
 
102
107
  # Returns the dimension (width x height) for this canvas.
103
- # @return [ChunkyPNG::Dimension] A dimension instante with the width and height set for this canvas.
108
+ # @return [ChunkyPNG::Dimension] A dimension instance with the width and height set for this canvas.
104
109
  def dimension
105
110
  ChunkyPNG::Dimension.new(width, height)
106
111
  end
@@ -112,20 +117,10 @@ module ChunkyPNG
112
117
  end
113
118
 
114
119
  # Replaces a single pixel in this canvas.
115
- #
116
- # @overload []=(x, y, color)
117
- # Sets the color value of a pixel given a x- and y-coordinate
118
- # @param [Integer] x The x-coordinate of the pixel (column)
119
- # @param [Integer] y The y-coordinate of the pixel (row)
120
- # @param [Integer] color The new color for the provided coordinates.
121
- # @return [Integer] The new color value for this pixel, i.e. <tt>color</tt>.
122
- #
123
- # @overload []=(point, color)
124
- # Sets the color value of a pixel given point-like value.
125
- # @param [ChunkyPNG::Point, ...] point The point on the canvas to replace.
126
- # @param [Integer] color The new color for the provided coordinates.
127
- # @return [Integer] The new color value for this pixel, i.e. <tt>color</tt>.
128
- #
120
+ # @param [Integer] x The x-coordinate of the pixel (column)
121
+ # @param [Integer] y The y-coordinate of the pixel (row)
122
+ # @param [Integer] color The new color for the provided coordinates.
123
+ # @return [Integer] The new color value for this pixel, i.e. <tt>color</tt>.
129
124
  # @raise [ChunkyPNG::OutOfBounds] when the coordinates are outside of the image's dimensions.
130
125
  # @see #set_pixel
131
126
  def []=(x, y, color)
@@ -140,7 +135,7 @@ module ChunkyPNG
140
135
  #
141
136
  # @param [Integer] x The x-coordinate of the pixel (column)
142
137
  # @param [Integer] y The y-coordinate of the pixel (row)
143
- # @param [Inteer] pixel The new color for the provided coordinates.
138
+ # @param [Integer] pixel The new color for the provided coordinates.
144
139
  # @return [Integer] The new color value for this pixel, i.e. <tt>color</tt>.
145
140
  def set_pixel(x, y, color)
146
141
  @pixels[y * width + x] = color
@@ -151,7 +146,7 @@ module ChunkyPNG
151
146
  #
152
147
  # @param [Integer] x The x-coordinate of the pixel (column)
153
148
  # @param [Integer] y The y-coordinate of the pixel (row)
154
- # @param [CInteger] pixel The new color value for the provided coordinates.
149
+ # @param [Integer] pixel The new color value for the provided coordinates.
155
150
  # @return [Integer] The new color value for this pixel, i.e. <tt>color</tt>, or
156
151
  # <tt>nil</tt> if the coordinates are out of bounds.
157
152
  def set_pixel_if_within_bounds(x, y, color)
@@ -160,18 +155,9 @@ module ChunkyPNG
160
155
  end
161
156
 
162
157
  # Returns a single pixel's color value from this canvas.
163
- #
164
- # @overload [](point)
165
- # Returns the color value given a point-like value.
166
- # @param [ChunkyPNG::Point, ...] point The coordinates of the pixel as point.
167
- # @return [Integer] The current color value at the provided coordinates.
168
- #
169
- # @overload [](x, y)
170
- # Returns the color value given a x- and y-coordinate.
171
- # @param [Integer] x The x-coordinate of the pixel (column)
172
- # @param [Integer] y The y-coordinate of the pixel (row)
173
- # @return [Integer] The current color value at the provided coordinates.
174
- #
158
+ # @param [Integer] x The x-coordinate of the pixel (column)
159
+ # @param [Integer] y The y-coordinate of the pixel (row)
160
+ # @return [Integer] The current color value at the provided coordinates.
175
161
  # @raise [ChunkyPNG::OutOfBounds] when the coordinates are outside of the image's dimensions.
176
162
  # @see #get_pixel
177
163
  def [](x, y)
@@ -257,7 +243,7 @@ module ChunkyPNG
257
243
  end
258
244
 
259
245
  # Returns the palette used for this canvas.
260
- # @return [ChunkyPNG::Palette] A pallete which contains all the colors that are
246
+ # @return [ChunkyPNG::Palette] A palette which contains all the colors that are
261
247
  # being used for this image.
262
248
  def palette
263
249
  ChunkyPNG::Palette.from_canvas(self)
@@ -3,7 +3,7 @@ module ChunkyPNG
3
3
 
4
4
  # Methods for decoding and encoding Adam7 interlacing.
5
5
  #
6
- # Adam7 interlacing extractg 7 pass images out of a single image, that can be encoded to a
6
+ # Adam7 interlacing extracts 7 pass images out of a single image, that can be encoded to a
7
7
  # stream separately so the image can be built up progressively. The module is included into
8
8
  # ChunkyPNG canvas and is used to extract the pass images from the original image, or to
9
9
  # reconstruct an original image from separate pass images.
@@ -29,6 +29,57 @@ module ChunkyPNG
29
29
  set_pixel(x, y, ChunkyPNG::Color.compose(color, get_pixel(x, y)))
30
30
  end
31
31
 
32
+ # Draws a Bezier curve
33
+ # @param [Array, Point] A collection of control points
34
+ # @return [Chunky:PNG::Canvas] Itself, with the curve drawn
35
+ def bezier_curve(points, stroke_color = ChunkyPNG::Color::BLACK)
36
+
37
+ points = ChunkyPNG::Vector(*points)
38
+ case points.length
39
+ when 0, 1; return self
40
+ when 2; return line(points[0].x, points[0].y, points[1].x, points[1].y, stroke_color)
41
+ end
42
+
43
+ curve_points = Array.new
44
+
45
+ t = 0
46
+ n = points.length - 1
47
+ bicof = 0
48
+
49
+ while t <= 100
50
+ cur_p = ChunkyPNG::Point.new(0,0)
51
+
52
+ # Generate a float of t.
53
+ t_f = t / 100.00
54
+
55
+ cur_p.x += ((1 - t_f) ** n) * points[0].x
56
+ cur_p.y += ((1 - t_f) ** n) * points[0].y
57
+
58
+ for i in 1...points.length - 1
59
+ bicof = binomial_coefficient(n , i)
60
+
61
+ cur_p.x += (bicof * (1 - t_f) ** (n - i)) * (t_f ** i) * points[i].x
62
+ cur_p.y += (bicof * (1 - t_f) ** (n - i)) * (t_f ** i) * points[i].y
63
+ i += 1
64
+ end
65
+
66
+ cur_p.x += (t_f ** n) * points[n].x
67
+ cur_p.y += (t_f ** n) * points[n].y
68
+
69
+ curve_points << cur_p
70
+
71
+ bicof = 0
72
+ t += 1
73
+ end
74
+
75
+ curve_points.each_cons(2) do |p1, p2|
76
+ line_xiaolin_wu(p1.x.round, p1.y.round, p2.x.round, p2.y.round, stroke_color)
77
+ end
78
+
79
+ return self
80
+ end
81
+
82
+
32
83
  # Draws an anti-aliased line using Xiaolin Wu's algorithm.
33
84
  #
34
85
  # @param [Integer] x0 The x-coordinate of the first control point.
@@ -37,7 +88,7 @@ module ChunkyPNG
37
88
  # @param [Integer] y1 The y-coordinate of the second control point.
38
89
  # @param [Integer] stroke_color The color to use for this line.
39
90
  # @param [true, false] inclusive Whether to draw the last pixel.
40
- # Set to false when drawing multiplelines in a path.
91
+ # Set to false when drawing multiple lines in a path.
41
92
  # @return [ChunkyPNG::Canvas] Itself, with the line drawn.
42
93
  def line_xiaolin_wu(x0, y0, x1, y1, stroke_color, inclusive = true)
43
94
 
@@ -239,6 +290,26 @@ module ChunkyPNG
239
290
 
240
291
  return self
241
292
  end
293
+
294
+ private
295
+
296
+ # Calculates the binomial coefficient for n over k.
297
+ #
298
+ # @param [Integer] n first parameter in coeffient (the number on top when looking at the mathematic formula)
299
+ # @param [Integer] k k-element, second parameter in coeffient (the number on the bottom when looking at the mathematic formula)
300
+ # @return [Integer] The binomial coeffcient of (n,k)
301
+ def binomial_coefficient(n, k)
302
+ return 1 if n == k || k == 0
303
+ return n if k == 1
304
+ return -1 if n < k
305
+
306
+ # calculate factorials
307
+ fact_n = (2..n).inject(1) { |carry, i| carry * i }
308
+ fact_k = (2..k).inject(1) { |carry, i| carry * i }
309
+ fact_n_sub_k = (2..(n - k)).inject(1) { |carry, i| carry * i }
310
+
311
+ fact_n / (fact_k * fact_n_sub_k)
312
+ end
242
313
  end
243
314
  end
244
315
  end
@@ -2,7 +2,7 @@ module ChunkyPNG
2
2
  class Canvas
3
3
 
4
4
  # The ChunkyPNG::Canvas::Masking module defines methods to perform masking
5
- # and theming oeprations on a {ChunkyPNG::Canvas}. The module is included into the Canvas class so all
5
+ # and theming operations on a {ChunkyPNG::Canvas}. The module is included into the Canvas class so all
6
6
  # these methods are available on every canvas.
7
7
  #
8
8
  # @see ChunkyPNG::Canvas
@@ -20,7 +20,7 @@ module ChunkyPNG
20
20
  #
21
21
  # @param [Integer] old_theme_color The original theme color in this image.
22
22
  # @param [Integer] new_theme_color The color to replace the old theme color with.
23
- # @param [Integer] The backrgound color opn which the theme colored pixels are placed.
23
+ # @param [Integer] The background color on which the theme colored pixels are placed.
24
24
  # @param [Integer] tolerance The tolerance level to use when extracting the mask image. Five is
25
25
  # the default; increase this if the masked image does not extract all the required pixels,
26
26
  # decrease it if too many pixels get extracted.
@@ -45,7 +45,7 @@ module ChunkyPNG
45
45
  # {#change_theme_color!} will perform this in one go.
46
46
  #
47
47
  # @param [Integer] mask_color The current theme color.
48
- # @param [Integer] bg_color The background color on which the theme colored pxiels are applied.
48
+ # @param [Integer] bg_color The background color on which the theme colored pixels are applied.
49
49
  # @param [Integer] tolerance The tolerance level to use when extracting the mask image. Five is
50
50
  # the default; increase this if the masked image does not extract all the required pixels,
51
51
  # decrease it if too many pixels get extracted.
@@ -72,7 +72,7 @@ module ChunkyPNG
72
72
 
73
73
  # Changes the color of a mask image.
74
74
  #
75
- # This method works on acanavs extracte out of another image using the {#extract_mask} method.
75
+ # This method works on a canvas extracted out of another image using the {#extract_mask} method.
76
76
  # It can then be applied on the extracted base image. See {#change_theme_color!} to perform
77
77
  # these operations in one go.
78
78
  #
@@ -19,8 +19,8 @@ module ChunkyPNG
19
19
  #
20
20
  # @param [ChunkyPNG::Canvas] other The foreground canvas to compose on the
21
21
  # current canvas, using alpha compositing.
22
- # @param [Integer] offset_x The x-offset to apply the new forgeround on.
23
- # @param [Integer] offset_y The y-offset to apply the new forgeround on.
22
+ # @param [Integer] offset_x The x-offset to apply the new foreground on.
23
+ # @param [Integer] offset_y The y-offset to apply the new foreground on.
24
24
  # @return [ChunkyPNG::Canvas] Returns itself, but with the other canvas composed onto it.
25
25
  # @raise [ChunkyPNG::OutOfBounds] when the other canvas doesn't fit on this one,
26
26
  # given the offset and size of the other canvas.
@@ -63,8 +63,8 @@ module ChunkyPNG
63
63
  # them with semi-transparent pixels from the foreground image, see {#compose!}.
64
64
  #
65
65
  # @param [ChunkyPNG::Canvas] other The foreground canvas to get the pixels from.
66
- # @param [Integer] offset_x The x-offset to apply the new forgeround on.
67
- # @param [Integer] offset_y The y-offset to apply the new forgeround on.
66
+ # @param [Integer] offset_x The x-offset to apply the new foreground on.
67
+ # @param [Integer] offset_y The y-offset to apply the new foreground on.
68
68
  # @return [ChunkyPNG::Canvas] Returns itself, but with the other canvas placed onto it.
69
69
  # @raise [ChunkyPNG::OutOfBounds] when the other canvas doesn't fit on this one,
70
70
  # given the offset and size of the other canvas.
@@ -170,7 +170,7 @@ module ChunkyPNG
170
170
  alias_method :flip!, :flip_horizontally!
171
171
  alias_method :flip, :flip_horizontally
172
172
 
173
- # Flips the image vertically, leaving the orginial intact.
173
+ # Flips the image vertically, leaving the original intact.
174
174
  #
175
175
  # This will flip the image on its vertical axis, e.g. pixels on the left will now
176
176
  # be pixels on the right. Chaining this method twice will return the original canvas.
@@ -239,7 +239,7 @@ module ChunkyPNG
239
239
  # Rotates the image 90 degrees counter-clockwise in place.
240
240
  #
241
241
  # This method will change the original canvas. See {#rotate_left} for a
242
- # version that leaves the canvas intact and returns a new rototed canvas
242
+ # version that leaves the canvas intact and returns a new rotated canvas
243
243
  # instead.
244
244
  #
245
245
  # @return [ChunkyPNG::Canvas] Itself, but rotated.
@@ -149,7 +149,7 @@ module ChunkyPNG
149
149
  end
150
150
 
151
151
  # Extract a bit from a byte on a given index.
152
- # @param [Integer] byte The byte (0..255) value to extract a a bit from.
152
+ # @param [Integer] byte The byte (0..255) value to extract a bit from.
153
153
  # @param [Integer] index The index within the byte. This should be 0..7;
154
154
  # the value will be modded by 8 to enforce this.
155
155
  # @return [Integer] Either 1 or 0.
@@ -203,7 +203,7 @@ module ChunkyPNG
203
203
 
204
204
  # Decodes a scanline of a 1-bit, indexed image into a row of pixels.
205
205
  # @param [String] stream The stream to decode from.
206
- # @param [Integer] pos The position in the stream on qhich the scanline starts (including the filter byte).
206
+ # @param [Integer] pos The position in the stream on which the scanline starts (including the filter byte).
207
207
  # @param [Integer] width The width in pixels of the scanline.
208
208
  # @return [Array<Integer>] An array of decoded pixels.
209
209
  def decode_png_pixels_from_scanline_indexed_1bit(stream, pos, width)
@@ -428,8 +428,8 @@ module ChunkyPNG
428
428
  # noop - this method shouldn't get called.
429
429
  end
430
430
 
431
- # Decodes a scanline in a pxielstream that was encoded using SUB filtering.
432
- # This will chnage the pixelstream to have unfiltered values.
431
+ # Decodes a scanline in a pixelstream that was encoded using SUB filtering.
432
+ # This will change the pixelstream to have unfiltered values.
433
433
  # @params (see #decode_png_str_scanline)
434
434
  # @return [void]
435
435
  def decode_png_str_scanline_sub(stream, pos, prev_pos, line_length, pixel_size)
@@ -438,8 +438,8 @@ module ChunkyPNG
438
438
  end
439
439
  end
440
440
 
441
- # Decodes a scanline in a pxielstream that was encoded using UP filtering.
442
- # This will chnage the pixelstream to have unfiltered values.
441
+ # Decodes a scanline in a pixelstream that was encoded using UP filtering.
442
+ # This will change the pixelstream to have unfiltered values.
443
443
  # @params (see #decode_png_str_scanline)
444
444
  # @return [void]
445
445
  def decode_png_str_scanline_up(stream, pos, prev_pos, line_length, pixel_size)
@@ -449,8 +449,8 @@ module ChunkyPNG
449
449
  end
450
450
  end
451
451
 
452
- # Decodes a scanline in a pxielstream that was encoded using AVERAGE filtering.
453
- # This will chnage the pixelstream to have unfiltered values.
452
+ # Decodes a scanline in a pixelstream that was encoded using AVERAGE filtering.
453
+ # This will change the pixelstream to have unfiltered values.
454
454
  # @params (see #decode_png_str_scanline)
455
455
  # @return [void]
456
456
  def decode_png_str_scanline_average(stream, pos, prev_pos, line_length, pixel_size)
@@ -461,8 +461,8 @@ module ChunkyPNG
461
461
  end
462
462
  end
463
463
 
464
- # Decodes a scanline in a pxielstream that was encoded using PAETH filtering.
465
- # This will chnage the pixelstream to have unfiltered values.
464
+ # Decodes a scanline in a pixelstream that was encoded using PAETH filtering.
465
+ # This will change the pixelstream to have unfiltered values.
466
466
  # @params (see #decode_png_str_scanline)
467
467
  # @return [void]
468
468
  def decode_png_str_scanline_paeth(stream, pos, prev_pos, line_length, pixel_size)
@@ -15,7 +15,7 @@ module ChunkyPNG
15
15
  # IEND chunk and possibly a PLTE chunk.
16
16
  #
17
17
  # For interlaced images, the initial image is first split into 7 subimages.
18
- # These images get encoded exectly as above, and the result gets combined
18
+ # These images get encoded exactly as above, and the result gets combined
19
19
  # before the compression step.
20
20
  #
21
21
  # @see ChunkyPNG::Canvas::PNGDecoding
@@ -36,7 +36,7 @@ module ChunkyPNG
36
36
  end
37
37
 
38
38
  # Writes the canvas to a file, encoded as a PNG image.
39
- # @param [String] filname The file to save the PNG image to.
39
+ # @param [String] filename The file to save the PNG image to.
40
40
  # @param constraints (see ChunkyPNG::Canvas::PNGEncoding#to_datastream)
41
41
  # @return [void]
42
42
  def save(filename, constraints = {})
@@ -112,7 +112,7 @@ module ChunkyPNG
112
112
  else raise ChunkyPNG::Exception, "Unknown encoding preset: #{constraints.inspect}"
113
113
  end
114
114
 
115
- # Do not create a pallete when the encoding is given and does not require a palette.
115
+ # Do not create a palette when the encoding is given and does not require a palette.
116
116
  if encoding[:color_mode]
117
117
  if encoding[:color_mode] == ChunkyPNG::COLOR_INDEXED
118
118
  self.encoding_palette = self.palette
@@ -178,7 +178,7 @@ module ChunkyPNG
178
178
  # Encodes the canvas according to the PNG format specification with a given color
179
179
  # mode and Adam7 interlacing.
180
180
  #
181
- # This method will split the original canva in 7 smaller canvases and encode them
181
+ # This method will split the original canvas in 7 smaller canvases and encode them
182
182
  # one by one, concatenating the resulting strings.
183
183
  #
184
184
  # @param [Integer] color_mode The color mode to use for encoding.
@@ -11,9 +11,9 @@ module ChunkyPNG
11
11
  module Resampling
12
12
 
13
13
  # Resamples the canvas.
14
- # @param [Integer] new_width The width of the resamples canvas.
15
- # @param [Integer] new_height The height of the resamples canvas.
16
- # @param [ChunkyPNG::Canvas] A new canvas instance with the resamples pixels.
14
+ # @param [Integer] new_width The width of the resampled canvas.
15
+ # @param [Integer] new_height The height of the resampled canvas.
16
+ # @return [ChunkyPNG::Canvas] A new canvas instance with the resampled pixels.
17
17
  def resample_nearest_neighbor!(new_width, new_height)
18
18
 
19
19
  resampled_image = self.class.new(new_width.to_i, new_height.to_i)
@@ -1,7 +1,7 @@
1
1
  module ChunkyPNG
2
2
  class Canvas
3
3
 
4
- # Methods to quikcly load a canvas from a stream, encoded in RGB, RGBA, BGR or ABGR format.
4
+ # Methods to quickly load a canvas from a stream, encoded in RGB, RGBA, BGR or ABGR format.
5
5
  module StreamImporting
6
6
 
7
7
  # Creates a canvas by reading pixels from an RGB formatted stream with a
@@ -4,7 +4,7 @@ module ChunkyPNG
4
4
  # contained within, help with handling these chunks. It supports both
5
5
  # reading and writing chunks.
6
6
  #
7
- # All chunck types are instances of the {ChunkyPNG::Chunk::Base} class. For
7
+ # All chunk types are instances of the {ChunkyPNG::Chunk::Base} class. For
8
8
  # some chunk types a specialized class is available, e.g. the IHDR chunk is
9
9
  # represented by the {ChunkyPNG::Chunk::Header} class. These specialized
10
10
  # classes help accessing the content of the chunk. All other chunks are
@@ -72,7 +72,7 @@ module ChunkyPNG
72
72
 
73
73
  # Writes the chunk to the IO stream.
74
74
  #
75
- # It will call te +content+ method to get the content for this chunk,
75
+ # It will call the +content+ method to get the content for this chunk,
76
76
  # and will calculate and append the checksum automatically.
77
77
  # @param [IO] io The IO stream to write to.
78
78
  def write(io)
@@ -40,7 +40,7 @@ module ChunkyPNG
40
40
  # library, the concepts of pixels and colors are both used, and they are
41
41
  # both represented by a Integer.
42
42
  #
43
- # Pixels/colors are represented in RGBA componetns. Each of the four
43
+ # Pixels/colors are represented in RGBA components. Each of the four
44
44
  # components is stored with a depth of 8 bits (maximum value = 255 =
45
45
  # {ChunkyPNG::Color::MAX}). Together, these components are stored in a 4-byte
46
46
  # Integer.
@@ -208,7 +208,7 @@ module ChunkyPNG
208
208
 
209
209
  # Returns the opaque value of this color by removing the alpha channel.
210
210
  # @param [Integer] value The color to transform.
211
- # @return [Integer] The opauq color
211
+ # @return [Integer] The opaque color
212
212
  def opaque!(value)
213
213
  value | 0x000000ff
214
214
  end
@@ -320,7 +320,7 @@ module ChunkyPNG
320
320
  # operation if alpha composition.
321
321
  #
322
322
  # If the color cannot be decomposed, this method will return the fully
323
- # transparentvariant of the mask color.
323
+ # transparent variant of the mask color.
324
324
  #
325
325
  # @param [Integer] color The color that was the result of compositing.
326
326
  # @param [Integer] mask The opaque variant of the color that was being composed
@@ -341,7 +341,7 @@ module ChunkyPNG
341
341
  # all of which should be opaque.
342
342
  #
343
343
  # @param [Integer] color The color that was the result of compositing.
344
- # @param [Integer] mask The opauqe variant of the color that was being composed
344
+ # @param [Integer] mask The opaque variant of the color that was being composed
345
345
  # @param [Integer] bg The background color on which the color was composed.
346
346
  # @param [Integer] tolerance The decomposition tolerance level, a value between 0 and 255.
347
347
  # @return [Boolean] True if the alpha component can be decomposed successfully.
@@ -361,7 +361,7 @@ module ChunkyPNG
361
361
  # value of this method is undefined.
362
362
  #
363
363
  # @param [Integer] color The color that was the result of compositing.
364
- # @param [Integer] mask The opauqe variant of the color that was being composed
364
+ # @param [Integer] mask The opaque variant of the color that was being composed
365
365
  # @param [Integer] bg The background color on which the color was composed.
366
366
  # @return [Integer] The best fitting alpha channel, a value between 0 and 255.
367
367
  # @see #alpha_decomposable?
@@ -373,7 +373,7 @@ module ChunkyPNG
373
373
  # Decomposes an alpha channel for either the r, g or b color channel.
374
374
  # @param [:r, :g, :b] channel The channel to decompose the alpha channel from.
375
375
  # @param [Integer] color The color that was the result of compositing.
376
- # @param [Integer] mask The opaqe variant of the color that was being composed
376
+ # @param [Integer] mask The opaque variant of the color that was being composed
377
377
  # @param [Integer] bg The background color on which the color was composed.
378
378
  # @return [Integer] The decomposed alpha value for the channel.
379
379
  def decompose_alpha_component(channel, color, mask, bg)
@@ -383,7 +383,7 @@ module ChunkyPNG
383
383
 
384
384
  # Decomposes the alpha channels for the r, g and b color channel.
385
385
  # @param [Integer] color The color that was the result of compositing.
386
- # @param [Integer] mask The opauqe variant of the color that was being composed
386
+ # @param [Integer] mask The opaque variant of the color that was being composed
387
387
  # @param [Integer] bg The background color on which the color was composed.
388
388
  # @return [Array<Integer>] The decomposed alpha values for the r, g and b channels.
389
389
  def decompose_alpha_components(color, mask, bg)
@@ -449,7 +449,7 @@ module ChunkyPNG
449
449
  # COLOR CONSTANTS
450
450
  ####################################################################
451
451
 
452
- # @return [Hash<Symbol, Integer>] All the prefined color names in HTML.
452
+ # @return [Hash<Symbol, Integer>] All the predefined color names in HTML.
453
453
  PREDEFINED_COLORS = {
454
454
  :aliceblue => 0xf0f8ff00,
455
455
  :antiquewhite => 0xfaebd700,
@@ -607,7 +607,7 @@ module ChunkyPNG
607
607
  # all return the same color value.
608
608
  #
609
609
  # You can include a opacity level in the color name (e.g. <tt>'red @ 0.5'</tt>) or give
610
- # an explit opacity value as second argument. If no opacity value is given, the color
610
+ # an explicit opacity value as second argument. If no opacity value is given, the color
611
611
  # will be fully opaque.
612
612
  #
613
613
  # @param [Symbol, String] color_name The color name. It may include an opacity specifier
@@ -622,7 +622,7 @@ module ChunkyPNG
622
622
  base_color_name = $1.gsub(/[^a-z]+/i, '').downcase.to_sym
623
623
  return PREDEFINED_COLORS[base_color_name] | opacity if PREDEFINED_COLORS.has_key?(base_color_name)
624
624
  end
625
- raise ChunkyPNG::Exception, "Unknown color name #{color_name}!"
625
+ raise ArgumentError, "Unknown color name #{color_name}!"
626
626
  end
627
627
 
628
628
  # @return [Integer] Black pixel/color
@@ -1,7 +1,7 @@
1
1
  module ChunkyPNG
2
2
 
3
3
  # The Datastream class represents a PNG formatted datastream. It supports
4
- # both reading from and writing to strings, stremas and files.
4
+ # both reading from and writing to strings, streams and files.
5
5
  #
6
6
  # A PNG datastream begins with the PNG signature, and than contains multiple
7
7
  # chunks, starting with a header (IHDR) chunk and finishing with an end
@@ -113,7 +113,7 @@ module ChunkyPNG
113
113
  # This will iterate over the chunks using the order in which the chunks
114
114
  # should appear in the PNG file.
115
115
  #
116
- # @yield [chunk] Yields the chunks in this datastrean, one by one in the correct order.
116
+ # @yield [chunk] Yields the chunks in this datastream, one by one in the correct order.
117
117
  # @yieldparam [ChunkyPNG::Chunk::Base] chunk A chunk in this datastream.
118
118
  # @see ChunkyPNG::Datastream#chunks
119
119
  def each_chunk
@@ -57,15 +57,15 @@ module ChunkyPNG
57
57
  # @private
58
58
  DIMENSION_REGEXP = /^[\(\[\{]?(\d+)\s*[x,]?\s*(\d+)[\)\]\}]?$/
59
59
 
60
- # @return [Integer] The width-compontent of this dimension.
60
+ # @return [Integer] The width-component of this dimension.
61
61
  attr_accessor :width
62
62
 
63
- # @return [Integer] The height-compontent of this dimension.
63
+ # @return [Integer] The height-component of this dimension.
64
64
  attr_accessor :height
65
65
 
66
66
  # Initializes a new dimension instance.
67
- # @param [Integer] width The width-compontent of the new dimension.
68
- # @param [Integer] height The height-compontent of the new dimension.
67
+ # @param [Integer] width The width-component of the new dimension.
68
+ # @param [Integer] height The height-component of the new dimension.
69
69
  def initialize(width, height)
70
70
  @width, @height = width.to_i, height.to_i
71
71
  end
@@ -78,7 +78,7 @@ module ChunkyPNG
78
78
 
79
79
  # Checks whether a point is within bounds of this dimension.
80
80
  # @param [ChunkyPNG::Point, ...] A point-like to bounds-check.
81
- # @return [true, false] True iff the the x and y coordinate fall in this dimension.
81
+ # @return [true, false] True iff the x and y coordinate fall in this dimension.
82
82
  # @see ChunkyPNG.Point
83
83
  def include?(*point_like)
84
84
  point = ChunkyPNG::Point(*point_like)
@@ -110,4 +110,4 @@ module ChunkyPNG
110
110
 
111
111
  alias_method :to_ary, :to_a
112
112
  end
113
- end
113
+ end
@@ -6,7 +6,7 @@ module ChunkyPNG
6
6
  # @see ChunkyPNG::Canvas
7
7
  class Image < Canvas
8
8
 
9
- # The minimumsize of bytes the value of a metadata field should be before compression
9
+ # The minimum size of bytes the value of a metadata field should be before compression
10
10
  # is enabled for the chunk.
11
11
  METADATA_COMPRESSION_TRESHOLD = 300
12
12
 
@@ -64,7 +64,7 @@ module ChunkyPNG
64
64
  return ds
65
65
  end
66
66
 
67
- # Reads a ChunkyPNG::Image intance from a data stream.
67
+ # Reads a ChunkyPNG::Image instance from a data stream.
68
68
  #
69
69
  # Besides decoding the canvas, this will also read the metadata fields
70
70
  # from the datastream.
@@ -15,8 +15,8 @@ module ChunkyPNG
15
15
 
16
16
  # Builds a new palette given a set (Enumerable instance) of colors.
17
17
  #
18
- # @param [Enumerbale<Integer>] enum The set of colors to include in this palette.
19
- # This Enumerbale can contains duplicates.
18
+ # @param [Enumerable<Integer>] enum The set of colors to include in this palette.
19
+ # This Enumerable can contains duplicates.
20
20
  # @param [Array] decoding_map An array of colors in the exact order at which
21
21
  # they appeared in the palette chunk, so that this array can be used for decoding.
22
22
  def initialize(enum, decoding_map = nil)
@@ -173,7 +173,7 @@ module ChunkyPNG
173
173
  end
174
174
 
175
175
  # Determines the most suitable colormode for this palette.
176
- # @return [Integer] The colormode which would create the smalles possible
176
+ # @return [Integer] The colormode which would create the smallest possible
177
177
  # file for images that use this exact palette.
178
178
  def best_color_settings
179
179
  if black_and_white?
@@ -3,7 +3,7 @@ module ChunkyPNG
3
3
  # Factory method to create {ChunkyPNG::Point} instances.
4
4
  #
5
5
  # This method tries to be as flexible as possible with regards to the given input: besides
6
- # explit coordinates, this method also accepts arrays, hashes, strings, {ChunkyPNG::Dimension}
6
+ # explicit coordinates, this method also accepts arrays, hashes, strings, {ChunkyPNG::Dimension}
7
7
  # instances and anything that responds to <tt>:x</tt> and <tt>:y</tt>.
8
8
  #
9
9
  # @overload Point(x, y)
@@ -81,11 +81,11 @@ module ChunkyPNG
81
81
 
82
82
  alias_method :==, :eql?
83
83
 
84
- # Comparses 2 points.
84
+ # Compares 2 points.
85
85
  #
86
86
  # It will first compare the y coordinate, and it only takes the x-coordinate into
87
87
  # account if the y-coordinates of the points are identical. This way, an array of
88
- # points will be sorted into the order in which thet would occur in the pixels
88
+ # points will be sorted into the order in which they would occur in the pixels
89
89
  # array returned by {ChunkyPNG::Canvas#pixels}.
90
90
  #
91
91
  # @param [ChunkyPNG::Point] other The point to compare this point with.
@@ -40,7 +40,7 @@ module ChunkyPNG
40
40
 
41
41
  # Initializes a vector based on a list of Point instances.
42
42
  #
43
- # You usually do not want to use this method directy, but call {ChunkyPNG.Vector} instead.
43
+ # You usually do not want to use this method directly, but call {ChunkyPNG.Vector} instead.
44
44
  #
45
45
  # @param [Array<ChunkyPNG::Point>] points
46
46
  # @see ChunkyPNG.Vector
@@ -64,6 +64,13 @@ module ChunkyPNG
64
64
  yield(points.last, points.first) if close
65
65
  end
66
66
 
67
+ # Returns the point with the given indexof this vector.
68
+ # @param [Integer] index The 0-based index of the point in this vector.
69
+ # @param [ChunkyPNG::Point] The point instance.
70
+ def [](index)
71
+ points[index]
72
+ end
73
+
67
74
  # Returns an enumerator that will iterate over all the edges in this vector.
68
75
  # @param (see #each_edge)
69
76
  # @return [Enumerator] The enumerator that iterates over the edges.
@@ -120,4 +120,51 @@ describe ChunkyPNG::Canvas::Drawing do
120
120
  subject.polygon('(2,2) (20,5) (5,20)').should equal(subject)
121
121
  end
122
122
  end
123
+
124
+ describe '#bezier_curve' do
125
+ subject { ChunkyPNG::Canvas.new(24, 24, ChunkyPNG::Color::WHITE) }
126
+
127
+ it "should draw a bezier curve starting at the first point" do
128
+ subject.bezier_curve('3,20 10,10, 20,20')
129
+ subject[3, 20].should == ChunkyPNG::Color::BLACK
130
+ end
131
+
132
+ it "should draw a bezier curve ending at the last point" do
133
+ subject.bezier_curve('3,20 10,10, 20,20')
134
+ subject[20, 20].should == ChunkyPNG::Color::BLACK
135
+ end
136
+
137
+ it "should draw a bezier curve with a color of green" do
138
+ subject.bezier_curve('3,20 10,10, 20,20', :green)
139
+ subject[3, 20].should == ChunkyPNG::Color(:green)
140
+ end
141
+
142
+ it "should draw a three point bezier curve" do
143
+ subject.bezier_curve('1,23 12,10 23,23').should == reference_canvas('bezier_three_point')
144
+ end
145
+
146
+ it "should draw a three point bezier curve flipped" do
147
+ subject.bezier_curve('1,1 12,15 23,1').should == reference_canvas('bezier_three_point_flipped')
148
+ end
149
+
150
+ it "should draw a four point bezier curve" do
151
+ subject.bezier_curve('1,23 1,5 22,5 22,23').should == reference_canvas('bezier_four_point')
152
+ end
153
+
154
+ it "should draw a four point bezier curve flipped" do
155
+ subject.bezier_curve('1,1 1,19 22,19 22,1').should == reference_canvas('bezier_four_point_flipped')
156
+ end
157
+
158
+ it "should draw a four point bezier curve with a shape of an s" do
159
+ subject.bezier_curve('1,23 1,5 22,23 22,5').should == reference_canvas('bezier_four_point_s')
160
+ end
161
+
162
+ it "should draw a five point bezier curve" do
163
+ subject.bezier_curve('10,23 1,10 12,5 23,10 14,23').should == reference_canvas('bezier_five_point')
164
+ end
165
+
166
+ it "should draw a six point bezier curve" do
167
+ subject.bezier_curve('1,23 4,15 8,20 2,2 23,15 23,1').should == reference_canvas('bezier_six_point')
168
+ end
169
+ end
123
170
  end
@@ -8,6 +8,35 @@ describe ChunkyPNG::Canvas do
8
8
  it { should respond_to(:height) }
9
9
  it { should respond_to(:pixels) }
10
10
 
11
+ describe '#initialize' do
12
+ it "should accept a single color value as background color" do
13
+ canvas = ChunkyPNG::Canvas.new(2, 2, 'red @ 0.8')
14
+ canvas[1, 0].should == ChunkyPNG::Color.parse('red @ 0.8')
15
+ end
16
+
17
+ it "should raise an error if the color value is not understood" do
18
+ lambda { ChunkyPNG::Canvas.new(2, 2, :nonsense) }.should raise_error(ArgumentError)
19
+ end
20
+
21
+ it "should accept an array as initial pixel values" do
22
+ canvas = ChunkyPNG::Canvas.new(2, 2, [1,2,3,4])
23
+ canvas[0, 0].should == 1
24
+ canvas[1, 0].should == 2
25
+ canvas[0, 1].should == 3
26
+ canvas[1, 1].should == 4
27
+ end
28
+
29
+ it "should raise an ArgumentError if the initial array does not have the correct number of elements" do
30
+ lambda { ChunkyPNG::Canvas.new(2, 2, [1,2,3]) }.should raise_error(ArgumentError)
31
+ lambda { ChunkyPNG::Canvas.new(2, 2, [1,2,3,4,5]) }.should raise_error(ArgumentError)
32
+ end
33
+
34
+ it "should use a transparent background by default" do
35
+ canvas = ChunkyPNG::Canvas.new(1, 1)
36
+ canvas[0,0].should == ChunkyPNG::Color::TRANSPARENT
37
+ end
38
+ end
39
+
11
40
  describe '#dimension' do
12
41
  it "should return the dimensions as a Dimension instance" do
13
42
  subject.dimension.should == ChunkyPNG::Dimension('1x1')
@@ -126,7 +126,7 @@ describe ChunkyPNG::Color do
126
126
  end
127
127
 
128
128
  it "should raise for an unkown color name" do
129
- lambda { html_color(:nonsense) }.should raise_error(ChunkyPNG::Exception)
129
+ lambda { html_color(:nonsense) }.should raise_error(ArgumentError)
130
130
  end
131
131
  end
132
132
 
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 1
7
- - 0
8
7
  - 1
9
- version: 1.0.1
8
+ - 0
9
+ version: 1.1.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Willem van Bergen
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-03-08 00:00:00 -05:00
17
+ date: 2011-03-19 00:00:00 -04:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -324,6 +324,13 @@ files:
324
324
  - spec/png_suite/transparency/tp1n3p08.png
325
325
  - spec/png_suite_spec.rb
326
326
  - spec/resources/adam7.png
327
+ - spec/resources/bezier_five_point.png
328
+ - spec/resources/bezier_four_point.png
329
+ - spec/resources/bezier_four_point_flipped.png
330
+ - spec/resources/bezier_four_point_s.png
331
+ - spec/resources/bezier_six_point.png
332
+ - spec/resources/bezier_three_point.png
333
+ - spec/resources/bezier_three_point_flipped.png
327
334
  - spec/resources/circles.png
328
335
  - spec/resources/clock.png
329
336
  - spec/resources/clock_base.png