bench9000 0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE.txt +7 -0
- data/benchmarks/chunky_png/chunky-canvas-resampling-bilinear.rb +69 -0
- data/benchmarks/chunky_png/chunky-canvas-resampling-nearest-neighbor.rb +68 -0
- data/benchmarks/chunky_png/chunky-canvas-resampling-steps-residues.rb +37 -0
- data/benchmarks/chunky_png/chunky-canvas-resampling-steps.rb +37 -0
- data/benchmarks/chunky_png/chunky-color-a.rb +39 -0
- data/benchmarks/chunky_png/chunky-color-b.rb +39 -0
- data/benchmarks/chunky_png/chunky-color-compose-quick.rb +39 -0
- data/benchmarks/chunky_png/chunky-color-g.rb +39 -0
- data/benchmarks/chunky_png/chunky-color-r.rb +39 -0
- data/benchmarks/chunky_png/chunky-decode-png-image-pass.rb +74 -0
- data/benchmarks/chunky_png/chunky-encode-png-image-pass-to-stream.rb +84 -0
- data/benchmarks/chunky_png/chunky-operations-compose.rb +70 -0
- data/benchmarks/chunky_png/chunky-operations-replace.rb +69 -0
- data/benchmarks/chunky_png/chunky_png.patch +22 -0
- data/benchmarks/chunky_png/version.txt +2 -0
- data/benchmarks/classic/binary-trees.rb +100 -0
- data/benchmarks/classic/deltablue.rb +732 -0
- data/benchmarks/classic/fannkuch-redux.rb +111 -0
- data/benchmarks/classic/fasta-string.rb +71 -0
- data/benchmarks/classic/mandelbrot.rb +112 -0
- data/benchmarks/classic/matrix-multiply.rb +78 -0
- data/benchmarks/classic/n-body.rb +188 -0
- data/benchmarks/classic/pidigits.rb +88 -0
- data/benchmarks/classic/red-black.rb +363 -0
- data/benchmarks/classic/richards-kwargs.rb +403 -0
- data/benchmarks/classic/richards.rb +403 -0
- data/benchmarks/classic/spectral-norm.rb +95 -0
- data/benchmarks/default.config.rb +206 -0
- data/benchmarks/graph/connected.rb +62 -0
- data/benchmarks/literature/acid.rb +46 -0
- data/benchmarks/micro/pack-big-U-loop.rb +24 -0
- data/benchmarks/micro/pack-big-xLX-repeat.rb +22 -0
- data/benchmarks/micro/pack-small-mixture.rb +17 -0
- data/benchmarks/micro/string-equal.rb +28 -0
- data/benchmarks/octane/deltablue.rb +981 -0
- data/benchmarks/psd.rb/mock-logger.rb +23 -0
- data/benchmarks/psd.rb/psd-color-cmyk-to-rgb.rb +46 -0
- data/benchmarks/psd.rb/psd-compose-color-burn.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-color-dodge.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-darken.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-difference.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-exclusion.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-hard-light.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-hard-mix.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-lighten.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-linear-burn.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-linear-dodge.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-linear-light.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-multiply.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-normal.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-overlay.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-pin-light.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-screen.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-soft-light.rb +43 -0
- data/benchmarks/psd.rb/psd-compose-vivid-light.rb +43 -0
- data/benchmarks/psd.rb/psd-imageformat-layerraw-parse-raw.rb +70 -0
- data/benchmarks/psd.rb/psd-imageformat-rle-decode-rle-channel.rb +87 -0
- data/benchmarks/psd.rb/psd-imagemode-cmyk-combine-cmyk-channel.rb +65 -0
- data/benchmarks/psd.rb/psd-imagemode-greyscale-combine-greyscale-channel.rb +68 -0
- data/benchmarks/psd.rb/psd-imagemode-rgb-combine-rgb-channel.rb +65 -0
- data/benchmarks/psd.rb/psd-renderer-blender-compose.rb +113 -0
- data/benchmarks/psd.rb/psd-renderer-clippingmask-apply.rb +129 -0
- data/benchmarks/psd.rb/psd-renderer-mask-apply.rb +137 -0
- data/benchmarks/psd.rb/psd-util-clamp.rb +42 -0
- data/benchmarks/psd.rb/psd-util-pad2.rb +42 -0
- data/benchmarks/psd.rb/psd-util-pad4.rb +42 -0
- data/benchmarks/psd.rb/psd_native.patch +99 -0
- data/benchmarks/psd.rb/version.txt +2 -0
- data/benchmarks/topaz/neural-net.rb +208 -0
- data/benchmarks/vm/codeload.rb +35 -0
- data/benchmarks/vm/fixtures/codeload/LICENSE.txt +25 -0
- data/benchmarks/vm/fixtures/codeload/lexer.rb +21493 -0
- data/bin/bench9000 +13 -0
- data/example/report.data +945 -0
- data/example/report.html +59178 -0
- data/lib/bench9000.rb +27 -0
- data/lib/bench9000/benchmark.rb +29 -0
- data/lib/bench9000/commands/command.rb +30 -0
- data/lib/bench9000/commands/compare-reference.rb +70 -0
- data/lib/bench9000/commands/compare.rb +43 -0
- data/lib/bench9000/commands/detail.rb +51 -0
- data/lib/bench9000/commands/list-benchmarks.rb +29 -0
- data/lib/bench9000/commands/list-implementations.rb +29 -0
- data/lib/bench9000/commands/reference.rb +46 -0
- data/lib/bench9000/commands/remove.rb +41 -0
- data/lib/bench9000/commands/report.rb +71 -0
- data/lib/bench9000/commands/score.rb +27 -0
- data/lib/bench9000/config.rb +88 -0
- data/lib/bench9000/group.rb +23 -0
- data/lib/bench9000/harness.rb +68 -0
- data/lib/bench9000/implementation.rb +134 -0
- data/lib/bench9000/json-formatter.rb +50 -0
- data/lib/bench9000/main.rb +268 -0
- data/lib/bench9000/measurement.rb +75 -0
- data/lib/bench9000/micro-harness.rb +39 -0
- data/lib/bench9000/options.rb +31 -0
- data/lib/bench9000/report/bootstrap-theme.css +5 -0
- data/lib/bench9000/report/bootstrap.css +5 -0
- data/lib/bench9000/report/bootstrap.js +6 -0
- data/lib/bench9000/report/chart.js +3432 -0
- data/lib/bench9000/report/chartjs.patch +91 -0
- data/lib/bench9000/report/jquery.js +4 -0
- data/lib/bench9000/report/report.html +177 -0
- data/lib/bench9000/report/report.js +547 -0
- data/lib/bench9000/stats.rb +41 -0
- data/readme.md +205 -0
- data/vendor/chunky_png/BENCHMARKS.rdoc +31 -0
- data/vendor/chunky_png/Gemfile +10 -0
- data/vendor/chunky_png/LICENSE +20 -0
- data/vendor/chunky_png/README.rdoc +84 -0
- data/vendor/chunky_png/Rakefile +11 -0
- data/vendor/chunky_png/benchmarks/decoding_benchmark.rb +36 -0
- data/vendor/chunky_png/benchmarks/encoding_benchmark.rb +40 -0
- data/vendor/chunky_png/benchmarks/filesize_benchmark.rb +28 -0
- data/vendor/chunky_png/chunky_png.gemspec +47 -0
- data/vendor/chunky_png/lib/chunky_png.rb +160 -0
- data/vendor/chunky_png/lib/chunky_png/canvas.rb +372 -0
- data/vendor/chunky_png/lib/chunky_png/canvas/adam7_interlacing.rb +72 -0
- data/vendor/chunky_png/lib/chunky_png/canvas/data_url_exporting.rb +15 -0
- data/vendor/chunky_png/lib/chunky_png/canvas/data_url_importing.rb +21 -0
- data/vendor/chunky_png/lib/chunky_png/canvas/drawing.rb +338 -0
- data/vendor/chunky_png/lib/chunky_png/canvas/masking.rb +91 -0
- data/vendor/chunky_png/lib/chunky_png/canvas/operations.rb +395 -0
- data/vendor/chunky_png/lib/chunky_png/canvas/png_decoding.rb +492 -0
- data/vendor/chunky_png/lib/chunky_png/canvas/png_encoding.rb +442 -0
- data/vendor/chunky_png/lib/chunky_png/canvas/resampling.rb +147 -0
- data/vendor/chunky_png/lib/chunky_png/canvas/stream_exporting.rb +58 -0
- data/vendor/chunky_png/lib/chunky_png/canvas/stream_importing.rb +77 -0
- data/vendor/chunky_png/lib/chunky_png/chunk.rb +328 -0
- data/vendor/chunky_png/lib/chunky_png/color.rb +780 -0
- data/vendor/chunky_png/lib/chunky_png/compatibility.rb +15 -0
- data/vendor/chunky_png/lib/chunky_png/datastream.rb +185 -0
- data/vendor/chunky_png/lib/chunky_png/dimension.rb +113 -0
- data/vendor/chunky_png/lib/chunky_png/image.rb +79 -0
- data/vendor/chunky_png/lib/chunky_png/palette.rb +209 -0
- data/vendor/chunky_png/lib/chunky_png/point.rb +115 -0
- data/vendor/chunky_png/lib/chunky_png/rmagick.rb +43 -0
- data/vendor/chunky_png/lib/chunky_png/vector.rb +186 -0
- data/vendor/chunky_png/lib/chunky_png/version.rb +5 -0
- data/vendor/chunky_png/spec/chunky_png/canvas/adam7_interlacing_spec.rb +106 -0
- data/vendor/chunky_png/spec/chunky_png/canvas/data_url_exporting_spec.rb +13 -0
- data/vendor/chunky_png/spec/chunky_png/canvas/data_url_importing_spec.rb +15 -0
- data/vendor/chunky_png/spec/chunky_png/canvas/drawing_spec.rb +170 -0
- data/vendor/chunky_png/spec/chunky_png/canvas/masking_spec.rb +51 -0
- data/vendor/chunky_png/spec/chunky_png/canvas/operations_spec.rb +388 -0
- data/vendor/chunky_png/spec/chunky_png/canvas/png_decoding_spec.rb +97 -0
- data/vendor/chunky_png/spec/chunky_png/canvas/png_encoding_spec.rb +235 -0
- data/vendor/chunky_png/spec/chunky_png/canvas/resampling_spec.rb +121 -0
- data/vendor/chunky_png/spec/chunky_png/canvas/stream_exporting_spec.rb +59 -0
- data/vendor/chunky_png/spec/chunky_png/canvas/stream_importing_spec.rb +31 -0
- data/vendor/chunky_png/spec/chunky_png/canvas_spec.rb +226 -0
- data/vendor/chunky_png/spec/chunky_png/color_spec.rb +251 -0
- data/vendor/chunky_png/spec/chunky_png/datastream_spec.rb +32 -0
- data/vendor/chunky_png/spec/chunky_png/dimension_spec.rb +48 -0
- data/vendor/chunky_png/spec/chunky_png/image_spec.rb +25 -0
- data/vendor/chunky_png/spec/chunky_png/point_spec.rb +76 -0
- data/vendor/chunky_png/spec/chunky_png/rmagick_spec.rb +23 -0
- data/vendor/chunky_png/spec/chunky_png/vector_spec.rb +104 -0
- data/vendor/chunky_png/spec/chunky_png_spec.rb +8 -0
- data/vendor/chunky_png/spec/png_suite/background_chunks/bgai4a08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/background_chunks/bgai4a16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/background_chunks/bgan6a08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/background_chunks/bgan6a16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/background_chunks/bgbn4a08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/background_chunks/bggn4a16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/background_chunks/bgwn6a08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/background_chunks/bgyn6a16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi0g01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi0g01.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi0g02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi0g02.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi0g04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi0g04.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi0g08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi0g08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi0g16.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi2c08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi2c16.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi3p01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi3p01.rgba +1 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi3p02.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi3p04.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi3p08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi4a08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi4a08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi4a16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi4a16.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi6a08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi6a08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi6a16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basi6a16.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn0g01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn0g01.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn0g02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn0g02.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn0g04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn0g04.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn0g08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn0g08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn0g16.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn2c08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn2c16.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn3p01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn3p01.rgba +1 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn3p02.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn3p04.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn3p08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn4a08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn4a08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn4a16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn4a16.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn6a08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn6a08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn6a16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/basic/basn6a16.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/broken/x00n0g01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/broken/xcrn0g04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/broken/xlfn0g04.png +13 -0
- data/vendor/chunky_png/spec/png_suite/chunk_ordering/oi1n0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/chunk_ordering/oi1n2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/chunk_ordering/oi2n0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/chunk_ordering/oi2n2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/chunk_ordering/oi4n0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/chunk_ordering/oi4n2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/chunk_ordering/oi9n0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/chunk_ordering/oi9n2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/compression_levels/z00n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/compression_levels/z03n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/compression_levels/z06n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/compression_levels/z09n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f00n0g08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f00n0g08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f00n0g08_reference.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f00n0g08_reference.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f00n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f00n2c08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f00n2c08_reference.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f00n2c08_reference.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f01n0g08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f01n0g08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f01n0g08_reference.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f01n0g08_reference.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f01n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f01n2c08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f01n2c08_reference.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f01n2c08_reference.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f02n0g08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f02n0g08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f02n0g08_reference.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f02n0g08_reference.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f02n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f02n2c08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f02n2c08_reference.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f02n2c08_reference.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f03n0g08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f03n0g08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f03n0g08_reference.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f03n0g08_reference.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f03n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f03n2c08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f03n2c08_reference.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f03n2c08_reference.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f04n0g08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f04n0g08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f04n0g08_reference.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f04n0g08_reference.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f04n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f04n2c08.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f04n2c08_reference.png +0 -0
- data/vendor/chunky_png/spec/png_suite/filtering/f04n2c08_reference.rgba +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g03n0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g03n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g03n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g04n0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g04n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g04n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g05n0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g05n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g05n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g07n0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g07n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g07n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g10n0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g10n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g10n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g25n0g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g25n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/gamma/g25n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/metadata/cm0n0g04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/metadata/cm7n0g04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/metadata/cm9n0g04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/ccwn2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/ccwn3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/cdfn2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/cdhn2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/cdsn2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/cdun2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/ch1n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/ch2n3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/cs3n2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/cs3n3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/cs5n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/cs5n3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/cs8n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/cs8n3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/ct0n0g04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/ct1n0g04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/ctzn0g04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/pp0n2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/pp0n6a08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/ps1n0g08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/ps1n2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/ps2n0g08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/other/ps2n2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s01i3p01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s01n3p01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s02i3p01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s02n3p01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s03i3p01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s03n3p01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s04i3p01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s04n3p01.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s05i3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s05n3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s06i3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s06n3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s07i3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s07n3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s08i3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s08n3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s09i3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s09n3p02.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s32i3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s32n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s33i3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s33n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s34i3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s34n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s35i3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s35n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s36i3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s36n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s37i3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s37n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s38i3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s38n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s39i3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s39n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s40i3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/sizes/s40n3p04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tbbn1g04.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tbbn2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tbbn3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tbgn2c16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tbgn3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tbrn2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tbwn1g16.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tbwn3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tbyn3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tp0n1g08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tp0n2c08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tp0n3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite/transparency/tp1n3p08.png +0 -0
- data/vendor/chunky_png/spec/png_suite_spec.rb +121 -0
- data/vendor/chunky_png/spec/resources/adam7.png +0 -0
- data/vendor/chunky_png/spec/resources/bezier_five_point.png +0 -0
- data/vendor/chunky_png/spec/resources/bezier_four_point.png +0 -0
- data/vendor/chunky_png/spec/resources/bezier_four_point_flipped.png +0 -0
- data/vendor/chunky_png/spec/resources/bezier_four_point_s.png +0 -0
- data/vendor/chunky_png/spec/resources/bezier_six_point.png +0 -0
- data/vendor/chunky_png/spec/resources/bezier_three_point.png +0 -0
- data/vendor/chunky_png/spec/resources/bezier_three_point_flipped.png +0 -0
- data/vendor/chunky_png/spec/resources/circles.png +0 -0
- data/vendor/chunky_png/spec/resources/clock.png +0 -0
- data/vendor/chunky_png/spec/resources/clock_base.png +0 -0
- data/vendor/chunky_png/spec/resources/clock_bl_xdown_ydown.png +0 -0
- data/vendor/chunky_png/spec/resources/clock_bl_xdown_yup.png +0 -0
- data/vendor/chunky_png/spec/resources/clock_bl_xup_yup.png +0 -0
- data/vendor/chunky_png/spec/resources/clock_mask.png +0 -0
- data/vendor/chunky_png/spec/resources/clock_mask_updated.png +0 -0
- data/vendor/chunky_png/spec/resources/clock_nn_xdown_ydown.png +0 -0
- data/vendor/chunky_png/spec/resources/clock_nn_xdown_yup.png +0 -0
- data/vendor/chunky_png/spec/resources/clock_nn_xup_yup.png +0 -0
- data/vendor/chunky_png/spec/resources/clock_updated.png +0 -0
- data/vendor/chunky_png/spec/resources/composited.png +0 -0
- data/vendor/chunky_png/spec/resources/cropped.png +0 -0
- data/vendor/chunky_png/spec/resources/damaged_chunk.png +0 -0
- data/vendor/chunky_png/spec/resources/damaged_signature.png +13 -0
- data/vendor/chunky_png/spec/resources/lines.png +0 -0
- data/vendor/chunky_png/spec/resources/operations.png +0 -0
- data/vendor/chunky_png/spec/resources/operations_border.png +0 -0
- data/vendor/chunky_png/spec/resources/operations_grayscale.png +0 -0
- data/vendor/chunky_png/spec/resources/partial_circles.png +0 -0
- data/vendor/chunky_png/spec/resources/pixelstream.bgr +67 -0
- data/vendor/chunky_png/spec/resources/pixelstream.rgb +67 -1
- data/vendor/chunky_png/spec/resources/pixelstream.rgba +67 -0
- data/vendor/chunky_png/spec/resources/pixelstream_best_compression.png +0 -0
- data/vendor/chunky_png/spec/resources/pixelstream_fast_rgba.png +0 -0
- data/vendor/chunky_png/spec/resources/pixelstream_reference.png +0 -0
- data/vendor/chunky_png/spec/resources/polygon_filled_horizontal.png +0 -0
- data/vendor/chunky_png/spec/resources/polygon_filled_vertical.png +0 -0
- data/vendor/chunky_png/spec/resources/polygon_triangle_filled.png +0 -0
- data/vendor/chunky_png/spec/resources/polygon_unfilled.png +0 -0
- data/vendor/chunky_png/spec/resources/rect.png +0 -0
- data/vendor/chunky_png/spec/resources/replaced.png +0 -0
- data/vendor/chunky_png/spec/resources/text_chunk.png +0 -0
- data/vendor/chunky_png/spec/resources/ztxt_chunk.png +0 -0
- data/vendor/chunky_png/spec/spec_helper.rb +52 -0
- data/vendor/chunky_png/tasks/benchmarks.rake +26 -0
- data/vendor/oily_png/Gemfile +4 -0
- data/vendor/oily_png/LICENSE +20 -0
- data/vendor/oily_png/README.rdoc +26 -0
- data/vendor/oily_png/Rakefile +19 -0
- data/vendor/oily_png/ext/oily_png/color.c +58 -0
- data/vendor/oily_png/ext/oily_png/color.h +29 -0
- data/vendor/oily_png/ext/oily_png/extconf.rb +3 -0
- data/vendor/oily_png/ext/oily_png/oily_png_ext.c +59 -0
- data/vendor/oily_png/ext/oily_png/oily_png_ext.h +72 -0
- data/vendor/oily_png/ext/oily_png/operations.c +122 -0
- data/vendor/oily_png/ext/oily_png/operations.h +36 -0
- data/vendor/oily_png/ext/oily_png/png_decoding.c +374 -0
- data/vendor/oily_png/ext/oily_png/png_decoding.h +27 -0
- data/vendor/oily_png/ext/oily_png/png_encoding.c +302 -0
- data/vendor/oily_png/ext/oily_png/png_encoding.h +19 -0
- data/vendor/oily_png/ext/oily_png/resampling.c +213 -0
- data/vendor/oily_png/ext/oily_png/resampling.h +25 -0
- data/vendor/oily_png/lib/oily_png.rb +21 -0
- data/vendor/oily_png/lib/oily_png/canvas.rb +15 -0
- data/vendor/oily_png/lib/oily_png/version.rb +3 -0
- data/vendor/oily_png/oily_png.gemspec +39 -0
- data/vendor/oily_png/spec/color_spec.rb +38 -0
- data/vendor/oily_png/spec/decoding_spec.rb +51 -0
- data/vendor/oily_png/spec/encoding_spec.rb +135 -0
- data/vendor/oily_png/spec/operations_spec.rb +52 -0
- data/vendor/oily_png/spec/resampling_spec.rb +51 -0
- data/vendor/oily_png/spec/resources/basi0g01.png +0 -0
- data/vendor/oily_png/spec/resources/basi0g02.png +0 -0
- data/vendor/oily_png/spec/resources/basi0g04.png +0 -0
- data/vendor/oily_png/spec/resources/basi0g08.png +0 -0
- data/vendor/oily_png/spec/resources/basi0g16.png +0 -0
- data/vendor/oily_png/spec/resources/basi2c08.png +0 -0
- data/vendor/oily_png/spec/resources/basi2c16.png +0 -0
- data/vendor/oily_png/spec/resources/basi3p01.png +0 -0
- data/vendor/oily_png/spec/resources/basi3p02.png +0 -0
- data/vendor/oily_png/spec/resources/basi3p04.png +0 -0
- data/vendor/oily_png/spec/resources/basi3p08.png +0 -0
- data/vendor/oily_png/spec/resources/basi4a08.png +0 -0
- data/vendor/oily_png/spec/resources/basi4a16.png +0 -0
- data/vendor/oily_png/spec/resources/basi6a08.png +0 -0
- data/vendor/oily_png/spec/resources/basi6a16.png +0 -0
- data/vendor/oily_png/spec/resources/basn0g01.png +0 -0
- data/vendor/oily_png/spec/resources/basn0g02.png +0 -0
- data/vendor/oily_png/spec/resources/basn0g04.png +0 -0
- data/vendor/oily_png/spec/resources/basn0g08.png +0 -0
- data/vendor/oily_png/spec/resources/basn0g16.png +0 -0
- data/vendor/oily_png/spec/resources/basn2c08.png +0 -0
- data/vendor/oily_png/spec/resources/basn2c16.png +0 -0
- data/vendor/oily_png/spec/resources/basn3p01.png +0 -0
- data/vendor/oily_png/spec/resources/basn3p02.png +0 -0
- data/vendor/oily_png/spec/resources/basn3p04.png +0 -0
- data/vendor/oily_png/spec/resources/basn3p08.png +0 -0
- data/vendor/oily_png/spec/resources/basn4a08.png +0 -0
- data/vendor/oily_png/spec/resources/basn4a16.png +0 -0
- data/vendor/oily_png/spec/resources/basn6a08.png +0 -0
- data/vendor/oily_png/spec/resources/basn6a16.png +0 -0
- data/vendor/oily_png/spec/resources/composited.png +0 -0
- data/vendor/oily_png/spec/resources/gray.png +0 -0
- data/vendor/oily_png/spec/resources/interlaced.png +0 -0
- data/vendor/oily_png/spec/resources/nonsquare.png +0 -0
- data/vendor/oily_png/spec/resources/operations.png +0 -0
- data/vendor/oily_png/spec/resources/replaced.png +0 -0
- data/vendor/oily_png/spec/resources/s01i3p01.png +0 -0
- data/vendor/oily_png/spec/resources/s01n3p01.png +0 -0
- data/vendor/oily_png/spec/resources/s02i3p01.png +0 -0
- data/vendor/oily_png/spec/resources/s02n3p01.png +0 -0
- data/vendor/oily_png/spec/resources/s03i3p01.png +0 -0
- data/vendor/oily_png/spec/resources/s03n3p01.png +0 -0
- data/vendor/oily_png/spec/resources/s04i3p01.png +0 -0
- data/vendor/oily_png/spec/resources/s04n3p01.png +0 -0
- data/vendor/oily_png/spec/resources/s05i3p02.png +0 -0
- data/vendor/oily_png/spec/resources/s05n3p02.png +0 -0
- data/vendor/oily_png/spec/resources/s06i3p02.png +0 -0
- data/vendor/oily_png/spec/resources/s06n3p02.png +0 -0
- data/vendor/oily_png/spec/resources/s07i3p02.png +0 -0
- data/vendor/oily_png/spec/resources/s07n3p02.png +0 -0
- data/vendor/oily_png/spec/resources/s08i3p02.png +0 -0
- data/vendor/oily_png/spec/resources/s08n3p02.png +0 -0
- data/vendor/oily_png/spec/resources/s09i3p02.png +0 -0
- data/vendor/oily_png/spec/resources/s09n3p02.png +0 -0
- data/vendor/oily_png/spec/resources/s32i3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s32n3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s33i3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s33n3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s34i3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s34n3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s35i3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s35n3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s36i3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s36n3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s37i3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s37n3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s38i3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s38n3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s39i3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s39n3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s40i3p04.png +0 -0
- data/vendor/oily_png/spec/resources/s40n3p04.png +0 -0
- data/vendor/oily_png/spec/resources/square.png +0 -0
- data/vendor/oily_png/spec/resources/tbbn1g04.png +0 -0
- data/vendor/oily_png/spec/resources/tbbn2c16.png +0 -0
- data/vendor/oily_png/spec/resources/tbbn3p08.png +0 -0
- data/vendor/oily_png/spec/resources/tbgn2c16.png +0 -0
- data/vendor/oily_png/spec/resources/tbgn3p08.png +0 -0
- data/vendor/oily_png/spec/resources/tbrn2c08.png +0 -0
- data/vendor/oily_png/spec/resources/tbwn1g16.png +0 -0
- data/vendor/oily_png/spec/resources/tbwn3p08.png +0 -0
- data/vendor/oily_png/spec/resources/tbyn3p08.png +0 -0
- data/vendor/oily_png/spec/resources/tp0n1g08.png +0 -0
- data/vendor/oily_png/spec/resources/tp0n2c08.png +0 -0
- data/vendor/oily_png/spec/resources/tp0n3p08.png +0 -0
- data/vendor/oily_png/spec/resources/tp1n3p08.png +0 -0
- data/vendor/oily_png/spec/spec_helper.rb +40 -0
- data/vendor/oily_png/tasks/testing.rake +49 -0
- data/vendor/psd.rb/CONTRIBUTING.md +7 -0
- data/vendor/psd.rb/Gemfile +2 -0
- data/vendor/psd.rb/Guardfile +8 -0
- data/vendor/psd.rb/LICENSE.txt +22 -0
- data/vendor/psd.rb/README.md +235 -0
- data/vendor/psd.rb/Rakefile +6 -0
- data/vendor/psd.rb/circle.yml +6 -0
- data/vendor/psd.rb/examples/build_image.rb +16 -0
- data/vendor/psd.rb/examples/export_image.rb +12 -0
- data/vendor/psd.rb/examples/export_layer_images.rb +19 -0
- data/vendor/psd.rb/examples/export_node.rb +7 -0
- data/vendor/psd.rb/examples/export_text_data.rb +13 -0
- data/vendor/psd.rb/examples/guides.rb +17 -0
- data/vendor/psd.rb/examples/images/comp-example.psd +0 -0
- data/vendor/psd.rb/examples/images/example-cmyk.psd +0 -0
- data/vendor/psd.rb/examples/images/example-greyscale.psd +0 -0
- data/vendor/psd.rb/examples/images/example-nocompat.psd +0 -0
- data/vendor/psd.rb/examples/images/example.psd +0 -0
- data/vendor/psd.rb/examples/images/example16.psd +0 -0
- data/vendor/psd.rb/examples/images/guides.psd +0 -0
- data/vendor/psd.rb/examples/layer_comps.rb +20 -0
- data/vendor/psd.rb/examples/parse.rb +36 -0
- data/vendor/psd.rb/examples/path.rb +7 -0
- data/vendor/psd.rb/examples/profile.rb +15 -0
- data/vendor/psd.rb/examples/slices.rb +17 -0
- data/vendor/psd.rb/examples/tree.rb +8 -0
- data/vendor/psd.rb/examples/unimplemented_info.rb +9 -0
- data/vendor/psd.rb/lib/psd.rb +173 -0
- data/vendor/psd.rb/lib/psd/blend_mode.rb +80 -0
- data/vendor/psd.rb/lib/psd/channel_image.rb +115 -0
- data/vendor/psd.rb/lib/psd/color.rb +125 -0
- data/vendor/psd.rb/lib/psd/descriptor.rb +200 -0
- data/vendor/psd.rb/lib/psd/file.rb +104 -0
- data/vendor/psd.rb/lib/psd/header.rb +69 -0
- data/vendor/psd.rb/lib/psd/helpers.rb +51 -0
- data/vendor/psd.rb/lib/psd/image.rb +123 -0
- data/vendor/psd.rb/lib/psd/image_exports/png.rb +31 -0
- data/vendor/psd.rb/lib/psd/image_formats/layer_raw.rb +21 -0
- data/vendor/psd.rb/lib/psd/image_formats/layer_rle.rb +24 -0
- data/vendor/psd.rb/lib/psd/image_formats/raw.rb +12 -0
- data/vendor/psd.rb/lib/psd/image_formats/rle.rb +63 -0
- data/vendor/psd.rb/lib/psd/image_modes/cmyk.rb +31 -0
- data/vendor/psd.rb/lib/psd/image_modes/greyscale.rb +22 -0
- data/vendor/psd.rb/lib/psd/image_modes/rgb.rb +32 -0
- data/vendor/psd.rb/lib/psd/layer.rb +77 -0
- data/vendor/psd.rb/lib/psd/layer/blend_modes.rb +30 -0
- data/vendor/psd.rb/lib/psd/layer/blending_ranges.rb +62 -0
- data/vendor/psd.rb/lib/psd/layer/channel_image.rb +15 -0
- data/vendor/psd.rb/lib/psd/layer/exporting.rb +28 -0
- data/vendor/psd.rb/lib/psd/layer/helpers.rb +77 -0
- data/vendor/psd.rb/lib/psd/layer/info.rb +74 -0
- data/vendor/psd.rb/lib/psd/layer/mask.rb +19 -0
- data/vendor/psd.rb/lib/psd/layer/name.rb +33 -0
- data/vendor/psd.rb/lib/psd/layer/path_components.rb +22 -0
- data/vendor/psd.rb/lib/psd/layer/position_and_channels.rb +47 -0
- data/vendor/psd.rb/lib/psd/layer_info.rb +27 -0
- data/vendor/psd.rb/lib/psd/layer_info/blend_clipping_elements.rb +13 -0
- data/vendor/psd.rb/lib/psd/layer_info/blend_interior_elements.rb +13 -0
- data/vendor/psd.rb/lib/psd/layer_info/fill_opacity.rb +13 -0
- data/vendor/psd.rb/lib/psd/layer_info/layer_group.rb +30 -0
- data/vendor/psd.rb/lib/psd/layer_info/layer_id.rb +13 -0
- data/vendor/psd.rb/lib/psd/layer_info/layer_name_source.rb +14 -0
- data/vendor/psd.rb/lib/psd/layer_info/layer_section_divider.rb +48 -0
- data/vendor/psd.rb/lib/psd/layer_info/legacy_typetool.rb +88 -0
- data/vendor/psd.rb/lib/psd/layer_info/locked.rb +19 -0
- data/vendor/psd.rb/lib/psd/layer_info/metadata_setting.rb +35 -0
- data/vendor/psd.rb/lib/psd/layer_info/object_effects.rb +16 -0
- data/vendor/psd.rb/lib/psd/layer_info/placed_layer.rb +13 -0
- data/vendor/psd.rb/lib/psd/layer_info/reference_point.rb +16 -0
- data/vendor/psd.rb/lib/psd/layer_info/typetool.rb +165 -0
- data/vendor/psd.rb/lib/psd/layer_info/unicode_name.rb +17 -0
- data/vendor/psd.rb/lib/psd/layer_info/vector_mask.rb +25 -0
- data/vendor/psd.rb/lib/psd/layer_info/vector_mask_2.rb +10 -0
- data/vendor/psd.rb/lib/psd/layer_info/vector_stroke.rb +12 -0
- data/vendor/psd.rb/lib/psd/layer_info/vector_stroke_content.rb +15 -0
- data/vendor/psd.rb/lib/psd/layer_mask.rb +129 -0
- data/vendor/psd.rb/lib/psd/lazy_execute.rb +60 -0
- data/vendor/psd.rb/lib/psd/logger.rb +40 -0
- data/vendor/psd.rb/lib/psd/mask.rb +74 -0
- data/vendor/psd.rb/lib/psd/node.rb +70 -0
- data/vendor/psd.rb/lib/psd/node_exporting.rb +20 -0
- data/vendor/psd.rb/lib/psd/node_group.rb +86 -0
- data/vendor/psd.rb/lib/psd/node_layer.rb +81 -0
- data/vendor/psd.rb/lib/psd/node_root.rb +93 -0
- data/vendor/psd.rb/lib/psd/nodes/ancestry.rb +98 -0
- data/vendor/psd.rb/lib/psd/nodes/build_preview.rb +17 -0
- data/vendor/psd.rb/lib/psd/nodes/has_children.rb +13 -0
- data/vendor/psd.rb/lib/psd/nodes/lock_to_origin.rb +7 -0
- data/vendor/psd.rb/lib/psd/nodes/parse_layers.rb +18 -0
- data/vendor/psd.rb/lib/psd/nodes/search.rb +91 -0
- data/vendor/psd.rb/lib/psd/path_record.rb +180 -0
- data/vendor/psd.rb/lib/psd/renderer.rb +91 -0
- data/vendor/psd.rb/lib/psd/renderer/blender.rb +53 -0
- data/vendor/psd.rb/lib/psd/renderer/canvas.rb +95 -0
- data/vendor/psd.rb/lib/psd/renderer/canvas_management.rb +26 -0
- data/vendor/psd.rb/lib/psd/renderer/clipping_mask.rb +41 -0
- data/vendor/psd.rb/lib/psd/renderer/compose.rb +361 -0
- data/vendor/psd.rb/lib/psd/renderer/layer_styles.rb +56 -0
- data/vendor/psd.rb/lib/psd/renderer/layer_styles/color_overlay.rb +65 -0
- data/vendor/psd.rb/lib/psd/renderer/layer_styles/drop_shadow.rb +75 -0
- data/vendor/psd.rb/lib/psd/renderer/mask.rb +46 -0
- data/vendor/psd.rb/lib/psd/resource.rb +26 -0
- data/vendor/psd.rb/lib/psd/resource_section.rb +22 -0
- data/vendor/psd.rb/lib/psd/resources.rb +69 -0
- data/vendor/psd.rb/lib/psd/resources/guides.rb +35 -0
- data/vendor/psd.rb/lib/psd/resources/layer_comps.rb +42 -0
- data/vendor/psd.rb/lib/psd/resources/slices.rb +132 -0
- data/vendor/psd.rb/lib/psd/section.rb +26 -0
- data/vendor/psd.rb/lib/psd/util.rb +18 -0
- data/vendor/psd.rb/lib/psd/version.rb +3 -0
- data/vendor/psd.rb/psd.gemspec +32 -0
- data/vendor/psd.rb/spec/files/blendmodes.psd +0 -0
- data/vendor/psd.rb/spec/files/empty-layer-subgroups.psd +0 -0
- data/vendor/psd.rb/spec/files/empty-layer.psd +0 -0
- data/vendor/psd.rb/spec/files/example.psd +0 -0
- data/vendor/psd.rb/spec/files/guides.psd +0 -0
- data/vendor/psd.rb/spec/files/locked.psd +0 -0
- data/vendor/psd.rb/spec/files/one_layer.psd +0 -0
- data/vendor/psd.rb/spec/files/path.psd +0 -0
- data/vendor/psd.rb/spec/files/pixel.psd +0 -0
- data/vendor/psd.rb/spec/files/simplest.psd +0 -0
- data/vendor/psd.rb/spec/files/slices.psd +0 -0
- data/vendor/psd.rb/spec/files/text.psd +0 -0
- data/vendor/psd.rb/spec/guides_spec.rb +34 -0
- data/vendor/psd.rb/spec/hierarchy_spec.rb +152 -0
- data/vendor/psd.rb/spec/image_spec.rb +86 -0
- data/vendor/psd.rb/spec/lazy_execute_spec.rb +20 -0
- data/vendor/psd.rb/spec/locked_spec.rb +78 -0
- data/vendor/psd.rb/spec/parsing_spec.rb +163 -0
- data/vendor/psd.rb/spec/psd_spec.rb +37 -0
- data/vendor/psd.rb/spec/slices_spec.rb +57 -0
- data/vendor/psd.rb/spec/spec_helper.rb +13 -0
- data/vendor/psd.rb/spec/text_spec.rb +27 -0
- data/vendor/psd_native/Gemfile +4 -0
- data/vendor/psd_native/Guardfile +6 -0
- data/vendor/psd_native/LICENSE.txt +22 -0
- data/vendor/psd_native/README.md +48 -0
- data/vendor/psd_native/Rakefile +13 -0
- data/vendor/psd_native/ext/psd_native/blender.c +57 -0
- data/vendor/psd_native/ext/psd_native/blender.h +6 -0
- data/vendor/psd_native/ext/psd_native/canvas.c +9 -0
- data/vendor/psd_native/ext/psd_native/canvas.h +6 -0
- data/vendor/psd_native/ext/psd_native/clipping_mask.c +57 -0
- data/vendor/psd_native/ext/psd_native/clipping_mask.h +6 -0
- data/vendor/psd_native/ext/psd_native/color.c +20 -0
- data/vendor/psd_native/ext/psd_native/color.h +18 -0
- data/vendor/psd_native/ext/psd_native/compose.c +394 -0
- data/vendor/psd_native/ext/psd_native/compose.h +43 -0
- data/vendor/psd_native/ext/psd_native/extconf.rb +3 -0
- data/vendor/psd_native/ext/psd_native/file.c +20 -0
- data/vendor/psd_native/ext/psd_native/file.h +9 -0
- data/vendor/psd_native/ext/psd_native/image_mode_cmyk.c +64 -0
- data/vendor/psd_native/ext/psd_native/image_mode_cmyk.h +6 -0
- data/vendor/psd_native/ext/psd_native/image_mode_greyscale.c +27 -0
- data/vendor/psd_native/ext/psd_native/image_mode_greyscale.h +6 -0
- data/vendor/psd_native/ext/psd_native/image_mode_rgb.c +49 -0
- data/vendor/psd_native/ext/psd_native/image_mode_rgb.h +6 -0
- data/vendor/psd_native/ext/psd_native/layer_raw.c +20 -0
- data/vendor/psd_native/ext/psd_native/layer_raw.h +6 -0
- data/vendor/psd_native/ext/psd_native/mask.c +52 -0
- data/vendor/psd_native/ext/psd_native/mask.h +6 -0
- data/vendor/psd_native/ext/psd_native/psd_native_ext.c +87 -0
- data/vendor/psd_native/ext/psd_native/psd_native_ext.h +31 -0
- data/vendor/psd_native/ext/psd_native/rle_decoding.c +53 -0
- data/vendor/psd_native/ext/psd_native/rle_decoding.h +6 -0
- data/vendor/psd_native/ext/psd_native/util.c +17 -0
- data/vendor/psd_native/ext/psd_native/util.h +8 -0
- data/vendor/psd_native/lib/psd_native.rb +35 -0
- data/vendor/psd_native/lib/psd_native/compose.rb +19 -0
- data/vendor/psd_native/lib/psd_native/version.rb +3 -0
- data/vendor/psd_native/psd_native.gemspec +35 -0
- data/vendor/psd_native/spec/files/example.psd +0 -0
- data/vendor/psd_native/spec/files/one_layer.psd +0 -0
- data/vendor/psd_native/spec/files/path.psd +0 -0
- data/vendor/psd_native/spec/files/pixel.psd +0 -0
- data/vendor/psd_native/spec/files/simplest.psd +0 -0
- data/vendor/psd_native/spec/files/text.psd +0 -0
- data/vendor/psd_native/spec/image_spec.rb +86 -0
- data/vendor/psd_native/spec/psd_spec.rb +37 -0
- data/vendor/psd_native/spec/spec_helper.rb +13 -0
- data/vendor/psd_native/spec/util_spec.rb +15 -0
- metadata +767 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
module ChunkyPNG
|
|
2
|
+
class Canvas
|
|
3
|
+
|
|
4
|
+
# Methods for decoding and encoding Adam7 interlacing.
|
|
5
|
+
#
|
|
6
|
+
# Adam7 interlacing extracts 7 pass images out of a single image, that can be encoded to a
|
|
7
|
+
# stream separately so the image can be built up progressively. The module is included into
|
|
8
|
+
# ChunkyPNG canvas and is used to extract the pass images from the original image, or to
|
|
9
|
+
# reconstruct an original image from separate pass images.
|
|
10
|
+
module Adam7Interlacing
|
|
11
|
+
|
|
12
|
+
# Returns an array with the x-shift, x-offset, y-shift and y-offset for the requested pass.
|
|
13
|
+
# @param [Integer] pass The pass number, should be in 0..6.
|
|
14
|
+
def adam7_multiplier_offset(pass)
|
|
15
|
+
[3 - (pass >> 1), (pass & 1 == 0) ? 0 : 8 >> ((pass + 1) >> 1),
|
|
16
|
+
pass == 0 ? 3 : 3 - ((pass - 1) >> 1), (pass == 0 || pass & 1 == 1) ? 0 : 8 >> (pass >> 1)]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Returns the pixel dimensions of the requested pass.
|
|
20
|
+
# @param [Integer] pass The pass number, should be in 0..6.
|
|
21
|
+
# @param [Integer] original_width The width of the original image.
|
|
22
|
+
# @param [Integer] original_height The height of the original image.
|
|
23
|
+
def adam7_pass_size(pass, original_width, original_height)
|
|
24
|
+
x_shift, x_offset, y_shift, y_offset = adam7_multiplier_offset(pass)
|
|
25
|
+
[ (original_width - x_offset + (1 << x_shift) - 1) >> x_shift,
|
|
26
|
+
(original_height - y_offset + (1 << y_shift) - 1) >> y_shift]
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Returns an array of the dimension of all the pass images.
|
|
30
|
+
# @param [Integer] original_width The width of the original image.
|
|
31
|
+
# @param [Integer] original_height The height of the original image.
|
|
32
|
+
# @return [Array<Array<Integer>>] Returns an array with 7 pairs of dimensions.
|
|
33
|
+
# @see #adam7_pass_size
|
|
34
|
+
def adam7_pass_sizes(original_width, original_height)
|
|
35
|
+
(0...7).map { |pass| adam7_pass_size(pass, original_width, original_height) }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Merges a pass image into a total image that is being constructed.
|
|
39
|
+
# @param [Integer] pass The pass number, should be in 0..6.
|
|
40
|
+
# @param [ChunkyPNG::Canvas] canvas The image that is being constructed.
|
|
41
|
+
# @param [ChunkyPNG::Canvas] subcanvas The pass image that should be merged
|
|
42
|
+
def adam7_merge_pass(pass, canvas, subcanvas)
|
|
43
|
+
x_shift, x_offset, y_shift, y_offset = adam7_multiplier_offset(pass)
|
|
44
|
+
for y in 0...subcanvas.height do
|
|
45
|
+
for x in 0...subcanvas.width do
|
|
46
|
+
new_x = (x << x_shift) | x_offset
|
|
47
|
+
new_y = (y << y_shift) | y_offset
|
|
48
|
+
canvas[new_x, new_y] = subcanvas[x, y]
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Extracts a pass from a complete image
|
|
54
|
+
# @param [Integer] pass The pass number, should be in 0..6.
|
|
55
|
+
# @param [ChunkyPNG::Canvas] canvas The image that is being deconstructed.
|
|
56
|
+
# @return [ChunkyPNG::Canvas] The extracted pass image.
|
|
57
|
+
def adam7_extract_pass(pass, canvas)
|
|
58
|
+
x_shift, x_offset, y_shift, y_offset = adam7_multiplier_offset(pass)
|
|
59
|
+
sm_pixels = []
|
|
60
|
+
|
|
61
|
+
y_offset.step(canvas.height - 1, 1 << y_shift) do |y|
|
|
62
|
+
x_offset.step(canvas.width - 1, 1 << x_shift) do |x|
|
|
63
|
+
sm_pixels << canvas[x, y]
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
new_canvas_args = adam7_pass_size(pass, canvas.width, canvas.height) + [sm_pixels]
|
|
68
|
+
ChunkyPNG::Canvas.new(*new_canvas_args)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module ChunkyPNG
|
|
2
|
+
class Canvas
|
|
3
|
+
|
|
4
|
+
# Methods to export a canvas to a PNG data URL.
|
|
5
|
+
module DataUrlExporting
|
|
6
|
+
|
|
7
|
+
# Exports the canvas as a data url (e.g. data:image/png;base64,<data>) that can
|
|
8
|
+
# easily be used inline in CSS or HTML.
|
|
9
|
+
# @return [String] The canvas formatted as a data URL string.
|
|
10
|
+
def to_data_url
|
|
11
|
+
['data:image/png;base64,', to_blob].pack('A*m').gsub(/\n/, '')
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module ChunkyPNG
|
|
2
|
+
class Canvas
|
|
3
|
+
|
|
4
|
+
# Methods to import a canvas from a PNG data URL.
|
|
5
|
+
module DataUrlImporting
|
|
6
|
+
|
|
7
|
+
# Imports a canvas from a PNG data URL.
|
|
8
|
+
# @param [String] string The data URL string to load from.
|
|
9
|
+
# @return [Canvas] The imported canvas.
|
|
10
|
+
# @raise ChunkyPNG::SignatureMismatch if the provides string is not a properly
|
|
11
|
+
# formatted PNG data URL (i.e. it should start with "data:image/png;base64,")
|
|
12
|
+
def from_data_url(string)
|
|
13
|
+
if string =~ %r[^data:image/png;base64,((?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?)$]
|
|
14
|
+
from_blob($1.unpack('m').first)
|
|
15
|
+
else
|
|
16
|
+
raise SignatureMismatch, "The string was not a properly formatted data URL for a PNG image."
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
module ChunkyPNG
|
|
2
|
+
class Canvas
|
|
3
|
+
|
|
4
|
+
# Module that adds some primitive drawing methods to {ChunkyPNG::Canvas}.
|
|
5
|
+
#
|
|
6
|
+
# All of these methods change the current canvas instance and do not create
|
|
7
|
+
# a new one, even though the method names do not end with a bang.
|
|
8
|
+
#
|
|
9
|
+
# @note Drawing operations will not fail when something is drawn outside of
|
|
10
|
+
# the bounds of the canvas; these pixels will simply be ignored.
|
|
11
|
+
# @see ChunkyPNG::Canvas
|
|
12
|
+
module Drawing
|
|
13
|
+
|
|
14
|
+
# Composes a pixel on the canvas by alpha blending a color with its
|
|
15
|
+
# background color.
|
|
16
|
+
#
|
|
17
|
+
# @param [Integer] x The x-coordinate of the pixel to blend.
|
|
18
|
+
# @param [Integer] y The y-coordinate of the pixel to blend.
|
|
19
|
+
# @param [Integer] color The foreground color to blend with
|
|
20
|
+
# @return [Integer] The composed color.
|
|
21
|
+
def compose_pixel(x, y, color)
|
|
22
|
+
return unless include_xy?(x, y)
|
|
23
|
+
compose_pixel_unsafe(x, y, ChunkyPNG::Color.parse(color))
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Composes a pixel on the canvas by alpha blending a color with its
|
|
27
|
+
# background color, without bounds checking.
|
|
28
|
+
#
|
|
29
|
+
# @param (see #compose_pixel)
|
|
30
|
+
# @return [Integer] The composed color.
|
|
31
|
+
def compose_pixel_unsafe(x, y, color)
|
|
32
|
+
set_pixel(x, y, ChunkyPNG::Color.compose(color, get_pixel(x, y)))
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Draws a Bezier curve
|
|
36
|
+
# @param [Array, Point] A collection of control points
|
|
37
|
+
# @return [Chunky:PNG::Canvas] Itself, with the curve drawn
|
|
38
|
+
def bezier_curve(points, stroke_color = ChunkyPNG::Color::BLACK)
|
|
39
|
+
points = ChunkyPNG::Vector(*points)
|
|
40
|
+
case points.length
|
|
41
|
+
when 0, 1; return self
|
|
42
|
+
when 2; return line(points[0].x, points[0].y, points[1].x, points[1].y, stroke_color)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
curve_points = Array.new
|
|
46
|
+
|
|
47
|
+
t = 0
|
|
48
|
+
n = points.length - 1
|
|
49
|
+
bicof = 0
|
|
50
|
+
|
|
51
|
+
while t <= 100
|
|
52
|
+
cur_p = ChunkyPNG::Point.new(0,0)
|
|
53
|
+
|
|
54
|
+
# Generate a float of t.
|
|
55
|
+
t_f = t / 100.00
|
|
56
|
+
|
|
57
|
+
cur_p.x += ((1 - t_f) ** n) * points[0].x
|
|
58
|
+
cur_p.y += ((1 - t_f) ** n) * points[0].y
|
|
59
|
+
|
|
60
|
+
for i in 1...points.length - 1
|
|
61
|
+
bicof = binomial_coefficient(n , i)
|
|
62
|
+
|
|
63
|
+
cur_p.x += (bicof * (1 - t_f) ** (n - i)) * (t_f ** i) * points[i].x
|
|
64
|
+
cur_p.y += (bicof * (1 - t_f) ** (n - i)) * (t_f ** i) * points[i].y
|
|
65
|
+
i += 1
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
cur_p.x += (t_f ** n) * points[n].x
|
|
69
|
+
cur_p.y += (t_f ** n) * points[n].y
|
|
70
|
+
|
|
71
|
+
curve_points << cur_p
|
|
72
|
+
|
|
73
|
+
bicof = 0
|
|
74
|
+
t += 1
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
curve_points.each_cons(2) do |p1, p2|
|
|
78
|
+
line_xiaolin_wu(p1.x.round, p1.y.round, p2.x.round, p2.y.round, stroke_color)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
self
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Draws an anti-aliased line using Xiaolin Wu's algorithm.
|
|
85
|
+
#
|
|
86
|
+
# @param [Integer] x0 The x-coordinate of the first control point.
|
|
87
|
+
# @param [Integer] y0 The y-coordinate of the first control point.
|
|
88
|
+
# @param [Integer] x1 The x-coordinate of the second control point.
|
|
89
|
+
# @param [Integer] y1 The y-coordinate of the second control point.
|
|
90
|
+
# @param [Integer] stroke_color The color to use for this line.
|
|
91
|
+
# @param [true, false] inclusive Whether to draw the last pixel. Set to
|
|
92
|
+
# false when drawing multiple lines in a path.
|
|
93
|
+
# @return [ChunkyPNG::Canvas] Itself, with the line drawn.
|
|
94
|
+
def line_xiaolin_wu(x0, y0, x1, y1, stroke_color, inclusive = true)
|
|
95
|
+
stroke_color = ChunkyPNG::Color.parse(stroke_color)
|
|
96
|
+
|
|
97
|
+
dx = x1 - x0
|
|
98
|
+
sx = dx < 0 ? -1 : 1
|
|
99
|
+
dx *= sx
|
|
100
|
+
dy = y1 - y0
|
|
101
|
+
sy = dy < 0 ? -1 : 1
|
|
102
|
+
dy *= sy
|
|
103
|
+
|
|
104
|
+
if dy == 0 # vertical line
|
|
105
|
+
x0.step(inclusive ? x1 : x1 - sx, sx) do |x|
|
|
106
|
+
compose_pixel(x, y0, stroke_color)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
elsif dx == 0 # horizontal line
|
|
110
|
+
y0.step(inclusive ? y1 : y1 - sy, sy) do |y|
|
|
111
|
+
compose_pixel(x0, y, stroke_color)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
elsif dx == dy # diagonal
|
|
115
|
+
x0.step(inclusive ? x1 : x1 - sx, sx) do |x|
|
|
116
|
+
compose_pixel(x, y0, stroke_color)
|
|
117
|
+
y0 += sy
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
elsif dy > dx # vertical displacement
|
|
121
|
+
compose_pixel(x0, y0, stroke_color)
|
|
122
|
+
e_acc = 0
|
|
123
|
+
e = ((dx << 16) / dy.to_f).round
|
|
124
|
+
(dy - 1).downto(0) do |i|
|
|
125
|
+
e_acc_temp, e_acc = e_acc, (e_acc + e) & 0xffff
|
|
126
|
+
x0 += sx if e_acc <= e_acc_temp
|
|
127
|
+
w = 0xff - (e_acc >> 8)
|
|
128
|
+
compose_pixel(x0, y0, ChunkyPNG::Color.fade(stroke_color, w))
|
|
129
|
+
if inclusive || i > 0
|
|
130
|
+
compose_pixel(x0 + sx,
|
|
131
|
+
y0 + sy,
|
|
132
|
+
ChunkyPNG::Color.fade(stroke_color, 0xff - w))
|
|
133
|
+
end
|
|
134
|
+
y0 += sy
|
|
135
|
+
end
|
|
136
|
+
compose_pixel(x1, y1, stroke_color) if inclusive
|
|
137
|
+
|
|
138
|
+
else # horizontal displacement
|
|
139
|
+
compose_pixel(x0, y0, stroke_color)
|
|
140
|
+
e_acc = 0
|
|
141
|
+
e = ((dy << 16) / dx.to_f).round
|
|
142
|
+
(dx - 1).downto(0) do |i|
|
|
143
|
+
e_acc_temp, e_acc = e_acc, (e_acc + e) & 0xffff
|
|
144
|
+
y0 += sy if e_acc <= e_acc_temp
|
|
145
|
+
w = 0xff - (e_acc >> 8)
|
|
146
|
+
compose_pixel(x0, y0, ChunkyPNG::Color.fade(stroke_color, w))
|
|
147
|
+
if inclusive || i > 0
|
|
148
|
+
compose_pixel(x0 + sx,
|
|
149
|
+
y0 + sy,
|
|
150
|
+
ChunkyPNG::Color.fade(stroke_color, 0xff - w))
|
|
151
|
+
end
|
|
152
|
+
x0 += sx
|
|
153
|
+
end
|
|
154
|
+
compose_pixel(x1, y1, stroke_color) if inclusive
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
self
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
alias_method :line, :line_xiaolin_wu
|
|
161
|
+
|
|
162
|
+
# Draws a polygon on the canvas using the stroke_color, filled using the
|
|
163
|
+
# fill_color if any.
|
|
164
|
+
#
|
|
165
|
+
# @param [Array, String] The control point vector. Accepts everything
|
|
166
|
+
# {ChunkyPNG.Vector} accepts.
|
|
167
|
+
# @param [Integer] stroke_color The stroke color to use for this polygon.
|
|
168
|
+
# @param [Integer] fill_color The fill color to use for this polygon.
|
|
169
|
+
# @return [ChunkyPNG::Canvas] Itself, with the polygon drawn.
|
|
170
|
+
def polygon(path,
|
|
171
|
+
stroke_color = ChunkyPNG::Color::BLACK,
|
|
172
|
+
fill_color = ChunkyPNG::Color::TRANSPARENT)
|
|
173
|
+
|
|
174
|
+
vector = ChunkyPNG::Vector(*path)
|
|
175
|
+
if path.length < 3
|
|
176
|
+
raise ArgumentError, 'A polygon requires at least 3 points'
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
stroke_color = ChunkyPNG::Color.parse(stroke_color)
|
|
180
|
+
fill_color = ChunkyPNG::Color.parse(fill_color)
|
|
181
|
+
|
|
182
|
+
# Fill
|
|
183
|
+
unless fill_color == ChunkyPNG::Color::TRANSPARENT
|
|
184
|
+
vector.y_range.each do |y|
|
|
185
|
+
intersections = []
|
|
186
|
+
vector.edges.each do |p1, p2|
|
|
187
|
+
if (p1.y < y && p2.y >= y) || (p2.y < y && p1.y >= y)
|
|
188
|
+
intersections << (p1.x + (y - p1.y).to_f / (p2.y - p1.y) * (p2.x - p1.x)).round
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
intersections.sort!
|
|
193
|
+
0.step(intersections.length - 1, 2) do |i|
|
|
194
|
+
intersections[i].upto(intersections[i + 1]) do |x|
|
|
195
|
+
compose_pixel(x, y, fill_color)
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
# Stroke
|
|
202
|
+
vector.each_edge do |(from_x, from_y), (to_x, to_y)|
|
|
203
|
+
line(from_x, from_y, to_x, to_y, stroke_color, false)
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
self
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
# Draws a rectangle on the canvas, using two control points.
|
|
210
|
+
#
|
|
211
|
+
# @param [Integer] x0 The x-coordinate of the first control point.
|
|
212
|
+
# @param [Integer] y0 The y-coordinate of the first control point.
|
|
213
|
+
# @param [Integer] x1 The x-coordinate of the second control point.
|
|
214
|
+
# @param [Integer] y1 The y-coordinate of the second control point.
|
|
215
|
+
# @param [Integer] stroke_color The line color to use for this rectangle.
|
|
216
|
+
# @param [Integer] fill_color The fill color to use for this rectangle.
|
|
217
|
+
# @return [ChunkyPNG::Canvas] Itself, with the rectangle drawn.
|
|
218
|
+
def rect(x0, y0, x1, y1,
|
|
219
|
+
stroke_color = ChunkyPNG::Color::BLACK,
|
|
220
|
+
fill_color = ChunkyPNG::Color::TRANSPARENT)
|
|
221
|
+
|
|
222
|
+
stroke_color = ChunkyPNG::Color.parse(stroke_color)
|
|
223
|
+
fill_color = ChunkyPNG::Color.parse(fill_color)
|
|
224
|
+
|
|
225
|
+
# Fill
|
|
226
|
+
unless fill_color == ChunkyPNG::Color::TRANSPARENT
|
|
227
|
+
[x0, x1].min.upto([x0, x1].max) do |x|
|
|
228
|
+
[y0, y1].min.upto([y0, y1].max) do |y|
|
|
229
|
+
compose_pixel(x, y, fill_color)
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
# Stroke
|
|
235
|
+
line(x0, y0, x0, y1, stroke_color, false)
|
|
236
|
+
line(x0, y1, x1, y1, stroke_color, false)
|
|
237
|
+
line(x1, y1, x1, y0, stroke_color, false)
|
|
238
|
+
line(x1, y0, x0, y0, stroke_color, false)
|
|
239
|
+
|
|
240
|
+
self
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
# Draws a circle on the canvas.
|
|
244
|
+
#
|
|
245
|
+
# @param [Integer] x0 The x-coordinate of the center of the circle.
|
|
246
|
+
# @param [Integer] y0 The y-coordinate of the center of the circle.
|
|
247
|
+
# @param [Integer] radius The radius of the circle from the center point.
|
|
248
|
+
# @param [Integer] stroke_color The color to use for the line.
|
|
249
|
+
# @param [Integer] fill_color The color to use that fills the circle.
|
|
250
|
+
# @return [ChunkyPNG::Canvas] Itself, with the circle drawn.
|
|
251
|
+
def circle(x0, y0, radius,
|
|
252
|
+
stroke_color = ChunkyPNG::Color::BLACK,
|
|
253
|
+
fill_color = ChunkyPNG::Color::TRANSPARENT)
|
|
254
|
+
|
|
255
|
+
stroke_color = ChunkyPNG::Color.parse(stroke_color)
|
|
256
|
+
fill_color = ChunkyPNG::Color.parse(fill_color)
|
|
257
|
+
|
|
258
|
+
f = 1 - radius
|
|
259
|
+
ddF_x = 1
|
|
260
|
+
ddF_y = -2 * radius
|
|
261
|
+
x = 0
|
|
262
|
+
y = radius
|
|
263
|
+
|
|
264
|
+
compose_pixel(x0, y0 + radius, stroke_color)
|
|
265
|
+
compose_pixel(x0, y0 - radius, stroke_color)
|
|
266
|
+
compose_pixel(x0 + radius, y0, stroke_color)
|
|
267
|
+
compose_pixel(x0 - radius, y0, stroke_color)
|
|
268
|
+
|
|
269
|
+
lines = [radius - 1] unless fill_color == ChunkyPNG::Color::TRANSPARENT
|
|
270
|
+
|
|
271
|
+
while x < y
|
|
272
|
+
|
|
273
|
+
if f >= 0
|
|
274
|
+
y -= 1
|
|
275
|
+
ddF_y += 2
|
|
276
|
+
f += ddF_y
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
x += 1
|
|
280
|
+
ddF_x += 2
|
|
281
|
+
f += ddF_x
|
|
282
|
+
|
|
283
|
+
unless fill_color == ChunkyPNG::Color::TRANSPARENT
|
|
284
|
+
lines[y] = lines[y] ? [lines[y], x - 1].min : x - 1
|
|
285
|
+
lines[x] = lines[x] ? [lines[x], y - 1].min : y - 1
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
compose_pixel(x0 + x, y0 + y, stroke_color)
|
|
289
|
+
compose_pixel(x0 - x, y0 + y, stroke_color)
|
|
290
|
+
compose_pixel(x0 + x, y0 - y, stroke_color)
|
|
291
|
+
compose_pixel(x0 - x, y0 - y, stroke_color)
|
|
292
|
+
|
|
293
|
+
unless x == y
|
|
294
|
+
compose_pixel(x0 + y, y0 + x, stroke_color)
|
|
295
|
+
compose_pixel(x0 - y, y0 + x, stroke_color)
|
|
296
|
+
compose_pixel(x0 + y, y0 - x, stroke_color)
|
|
297
|
+
compose_pixel(x0 - y, y0 - x, stroke_color)
|
|
298
|
+
end
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
unless fill_color == ChunkyPNG::Color::TRANSPARENT
|
|
302
|
+
lines.each_with_index do |length, y|
|
|
303
|
+
if length > 0
|
|
304
|
+
line(x0 - length, y0 - y, x0 + length, y0 - y, fill_color)
|
|
305
|
+
end
|
|
306
|
+
if length > 0 && y > 0
|
|
307
|
+
line(x0 - length, y0 + y, x0 + length, y0 + y, fill_color)
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
self
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
private
|
|
316
|
+
|
|
317
|
+
# Calculates the binomial coefficient for n over k.
|
|
318
|
+
#
|
|
319
|
+
# @param [Integer] n first parameter in coeffient (the number on top when
|
|
320
|
+
# looking at the mathematic formula)
|
|
321
|
+
# @param [Integer] k k-element, second parameter in coeffient (the number
|
|
322
|
+
# on the bottom when looking at the mathematic formula)
|
|
323
|
+
# @return [Integer] The binomial coeffcient of (n,k)
|
|
324
|
+
def binomial_coefficient(n, k)
|
|
325
|
+
return 1 if n == k || k == 0
|
|
326
|
+
return n if k == 1
|
|
327
|
+
return -1 if n < k
|
|
328
|
+
|
|
329
|
+
# calculate factorials
|
|
330
|
+
fact_n = (2..n).inject(1) { |carry, i| carry * i }
|
|
331
|
+
fact_k = (2..k).inject(1) { |carry, i| carry * i }
|
|
332
|
+
fact_n_sub_k = (2..(n - k)).inject(1) { |carry, i| carry * i }
|
|
333
|
+
|
|
334
|
+
fact_n / (fact_k * fact_n_sub_k)
|
|
335
|
+
end
|
|
336
|
+
end
|
|
337
|
+
end
|
|
338
|
+
end
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
module ChunkyPNG
|
|
2
|
+
class Canvas
|
|
3
|
+
|
|
4
|
+
# The ChunkyPNG::Canvas::Masking module defines methods to perform masking
|
|
5
|
+
# and theming operations on a {ChunkyPNG::Canvas}. The module is included into the Canvas class so all
|
|
6
|
+
# these methods are available on every canvas.
|
|
7
|
+
#
|
|
8
|
+
# @see ChunkyPNG::Canvas
|
|
9
|
+
module Masking
|
|
10
|
+
|
|
11
|
+
# Creates a new image, based on the current image but with a new theme color.
|
|
12
|
+
#
|
|
13
|
+
# This method will replace one color in an image with another image. This is done by
|
|
14
|
+
# first extracting the pixels with a color close to the original theme color as a mask
|
|
15
|
+
# image, changing the color of this mask image and then apply it on the original image.
|
|
16
|
+
#
|
|
17
|
+
# Mask extraction works best when the theme colored pixels are clearly distinguishable
|
|
18
|
+
# from a background color (preferably white). You can set a tolerance level to influence
|
|
19
|
+
# the extraction process.
|
|
20
|
+
#
|
|
21
|
+
# @param [Integer] old_theme_color The original theme color in this image.
|
|
22
|
+
# @param [Integer] new_theme_color The color to replace the old theme color with.
|
|
23
|
+
# @param [Integer] bg_color The background color on which the theme colored pixels are placed.
|
|
24
|
+
# @param [Integer] tolerance The tolerance level to use when extracting the mask image. Five is
|
|
25
|
+
# the default; increase this if the masked image does not extract all the required pixels,
|
|
26
|
+
# decrease it if too many pixels get extracted.
|
|
27
|
+
# @return [ChunkyPNG::Canvas] Returns itself, but with the theme colored pixels changed.
|
|
28
|
+
# @see #change_theme_color!
|
|
29
|
+
# @see #change_mask_color!
|
|
30
|
+
def change_theme_color!(old_theme_color, new_theme_color, bg_color = ChunkyPNG::Color::WHITE, tolerance = 5)
|
|
31
|
+
base, mask = extract_mask(old_theme_color, bg_color, tolerance)
|
|
32
|
+
mask.change_mask_color!(new_theme_color)
|
|
33
|
+
self.replace!(base.compose!(mask))
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Creates a base image and a mask image from an original image that has a particular theme color.
|
|
37
|
+
# This can be used to easily change a theme color in an image.
|
|
38
|
+
#
|
|
39
|
+
# It will extract all the pixels that look like the theme color (with a tolerance level) and put
|
|
40
|
+
# these in a mask image. All the other pixels will be stored in a base image. Both images will be
|
|
41
|
+
# of the exact same size as the original image. The original image will be left untouched.
|
|
42
|
+
#
|
|
43
|
+
# The color of the mask image can be changed with {#change_mask_color!}. This new mask image can
|
|
44
|
+
# then be composed upon the base image to create an image with a new theme color. A call to
|
|
45
|
+
# {#change_theme_color!} will perform this in one go.
|
|
46
|
+
#
|
|
47
|
+
# @param [Integer] mask_color The current theme color.
|
|
48
|
+
# @param [Integer] bg_color The background color on which the theme colored pixels are applied.
|
|
49
|
+
# @param [Integer] tolerance The tolerance level to use when extracting the mask image. Five is
|
|
50
|
+
# the default; increase this if the masked image does not extract all the required pixels,
|
|
51
|
+
# decrease it if too many pixels get extracted.
|
|
52
|
+
# @return [Array<ChunkyPNG::Canvas, ChunkyPNG::Canvas>] An array with the base canvas and the mask
|
|
53
|
+
# canvas as elements.
|
|
54
|
+
# @see #change_theme_color!
|
|
55
|
+
# @see #change_mask_color!
|
|
56
|
+
def extract_mask(mask_color, bg_color = ChunkyPNG::Color::WHITE, tolerance = 5)
|
|
57
|
+
base_pixels = []
|
|
58
|
+
mask_pixels = []
|
|
59
|
+
|
|
60
|
+
pixels.each do |pixel|
|
|
61
|
+
if ChunkyPNG::Color.alpha_decomposable?(pixel, mask_color, bg_color, tolerance)
|
|
62
|
+
mask_pixels << ChunkyPNG::Color.decompose_color(pixel, mask_color, bg_color, tolerance)
|
|
63
|
+
base_pixels << bg_color
|
|
64
|
+
else
|
|
65
|
+
mask_pixels << (mask_color & 0xffffff00)
|
|
66
|
+
base_pixels << pixel
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
[ self.class.new(width, height, base_pixels), self.class.new(width, height, mask_pixels) ]
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Changes the color of a mask image.
|
|
74
|
+
#
|
|
75
|
+
# This method works on a canvas extracted out of another image using the {#extract_mask} method.
|
|
76
|
+
# It can then be applied on the extracted base image. See {#change_theme_color!} to perform
|
|
77
|
+
# these operations in one go.
|
|
78
|
+
#
|
|
79
|
+
# @param [Integer] new_color The color to replace the original mask color with.
|
|
80
|
+
# @raise [ChunkyPNG::ExpectationFailed] when this canvas is not a mask image, i.e. its palette
|
|
81
|
+
# has more than once color, disregarding transparency.
|
|
82
|
+
# @see #change_theme_color!
|
|
83
|
+
# @see #extract_mask
|
|
84
|
+
def change_mask_color!(new_color)
|
|
85
|
+
raise ChunkyPNG::ExpectationFailed, "This is not a mask image!" if palette.opaque_palette.size != 1
|
|
86
|
+
pixels.map! { |pixel| (new_color & 0xffffff00) | ChunkyPNG::Color.a(pixel) }
|
|
87
|
+
self
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|