chunky_png 1.3.2 → 1.3.3
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 +4 -4
- data/BENCHMARKING.md +38 -0
- data/CONTRIBUTING.md +50 -0
- data/LICENSE +1 -1
- data/chunky_png.gemspec +12 -12
- data/lib/chunky_png/canvas/operations.rb +1 -1
- data/lib/chunky_png/color.rb +7 -7
- data/lib/chunky_png/dimension.rb +16 -15
- data/lib/chunky_png/version.rb +1 -1
- data/spec/chunky_png/canvas/adam7_interlacing_spec.rb +24 -24
- data/spec/chunky_png/canvas/data_url_exporting_spec.rb +2 -2
- data/spec/chunky_png/canvas/data_url_importing_spec.rb +4 -4
- data/spec/chunky_png/canvas/drawing_spec.rb +60 -60
- data/spec/chunky_png/canvas/masking_spec.rb +15 -15
- data/spec/chunky_png/canvas/operations_spec.rb +69 -66
- data/spec/chunky_png/canvas/png_decoding_spec.rb +26 -26
- data/spec/chunky_png/canvas/png_encoding_spec.rb +74 -74
- data/spec/chunky_png/canvas/resampling_spec.rb +47 -47
- data/spec/chunky_png/canvas/stream_exporting_spec.rb +20 -20
- data/spec/chunky_png/canvas/stream_importing_spec.rb +3 -3
- data/spec/chunky_png/canvas_spec.rb +95 -92
- data/spec/chunky_png/color_spec.rb +151 -151
- data/spec/chunky_png/datastream_spec.rb +6 -6
- data/spec/chunky_png/dimension_spec.rb +15 -15
- data/spec/chunky_png/image_spec.rb +4 -4
- data/spec/chunky_png/point_spec.rb +25 -25
- data/spec/chunky_png/rmagick_spec.rb +4 -4
- data/spec/chunky_png/vector_spec.rb +39 -34
- data/spec/chunky_png_spec.rb +1 -2
- data/spec/png_suite_spec.rb +38 -38
- data/spec/spec_helper.rb +14 -10
- metadata +37 -33
- data/BENCHMARKS.rdoc +0 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dba372d700355f7ad31ef72fc4615c6425ffbfeb
|
4
|
+
data.tar.gz: 090bfa0d2238e1568fffd5b21cc0d12f0c69106a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b8fb329422a0509b8707321d15ef5c5a7cd6e3082e2cbdee61b490825b1bc1902cdbb8b484e1003c2dc5990435a935c391b76f86addb587f57424651e145b3a8
|
7
|
+
data.tar.gz: a2e0bbfc3a15c46e0f2d43ea1724d3821936ccc79c4957acf4f27f31f090e9902b33bae5a9cb6a72008d3ccae09aef6fb695498c5a55b1ecb03d6b8e954ca26e
|
data/BENCHMARKING.md
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# ChunkyPNG benchmark suite
|
2
|
+
|
3
|
+
I would like the performance of this library as good as possible, and I will
|
4
|
+
gladly accept changes to this library that improves performance.
|
5
|
+
|
6
|
+
The library comes with a basic benchmark suite is intended to test the speed
|
7
|
+
of PNG decoding and encoding against different ruby interpreters. Execute them
|
8
|
+
using rake. You can set the number of runs by passing the N environment variable.
|
9
|
+
|
10
|
+
bundle exec rake benchmark:encoding
|
11
|
+
bundle exec rake benchmark:decoding
|
12
|
+
|
13
|
+
bundle exec rake benchmark N=10 # Run all of them with 10 iterations
|
14
|
+
|
15
|
+
You can use rvm to run the benchmarks against different interpreters. Of course,
|
16
|
+
make sure that the chunky_png is installed for all your interpreters.
|
17
|
+
|
18
|
+
rvm 1.8.7,1.9.3,rbx bundle exec rake benchmark N=10
|
19
|
+
|
20
|
+
## Results
|
21
|
+
|
22
|
+
What is a speed improvement on one interpreter doesn't necessarily mean the
|
23
|
+
performance will be better on other interpreters as well. Please make sure to
|
24
|
+
benchamrk different RUby interpreters. When it comes to different Ruby
|
25
|
+
interpreters, the priority is the performance on recent MRI versions.
|
26
|
+
|
27
|
+
Some very old benchmark result (using N=50) on my 2007 iMac can be found in
|
28
|
+
[this gist](https://gist.github.com/wvanbergen/495323).
|
29
|
+
|
30
|
+
## Why is this relevant?
|
31
|
+
|
32
|
+
ChunkyPNG is a pure Ruby library to handle PNG files. Decoding a PNG requires
|
33
|
+
a lot of integer math and bitwise operations, and moderate use of the unpack
|
34
|
+
method to read binary data. Encoding is a good test for `Array#pack`, and
|
35
|
+
depending on the encoding options, also requires a lot of calculations.
|
36
|
+
Therefore, the library is a good benchmark candidate for these methods and
|
37
|
+
algorithms. It has been used to improve the `Array#pack` and `String#unpack`
|
38
|
+
methods in Rubinius.
|
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# Contributing to ChunkyPNG
|
2
|
+
|
3
|
+
I will gladly accept any contributions from anybody to improve this library. However, I like to keep
|
4
|
+
the scope and complexity of this project relatively small. This way, with the limited amount of time I
|
5
|
+
dedicate to this project, this library remains a solid piece of software that many people rely on in
|
6
|
+
their workflow.
|
7
|
+
|
8
|
+
## Scope
|
9
|
+
|
10
|
+
The scope of this library is defined as:
|
11
|
+
|
12
|
+
1. Reading and writing any PNG image that conforms to the spec, with proper handling of images that do not.
|
13
|
+
2. Basic canvas drawing and compositing operations to create new or edit existing images.
|
14
|
+
3. Remain compatible with Ruby versions that are widely used.
|
15
|
+
|
16
|
+
I will close issues and pull requests that go beyond this scope. If you want to work on something,
|
17
|
+
but are not sure if it will be in scope, feel free to reach out to me!
|
18
|
+
|
19
|
+
## Reporting bugs
|
20
|
+
|
21
|
+
- First, see if somebody else has reported the problem already.
|
22
|
+
- Try to include as much relevant information as possible, so I can recreate the problem.
|
23
|
+
- If possible, include the PNG image that is causing the issue.
|
24
|
+
- If possible, include a code snippet that exposes the problem.
|
25
|
+
|
26
|
+
## Pull requests
|
27
|
+
|
28
|
+
Title and description:
|
29
|
+
|
30
|
+
- If you are not yet done, please include `[WIP]` in the title of your pull request.
|
31
|
+
- Explain why your changes are relevant in the description of your pull request.
|
32
|
+
- If your changes improve performance, include benchmark methodology and results in the PR.
|
33
|
+
See BENCHMARKING.md for more information.
|
34
|
+
|
35
|
+
Code:
|
36
|
+
|
37
|
+
- Don't break backwards compatibility.
|
38
|
+
- Follow code conventions. They are not defined, so look at the code around you.
|
39
|
+
- Add Yardoc comments as documentation.
|
40
|
+
|
41
|
+
Specs:
|
42
|
+
|
43
|
+
- Always include specs that test your changes, to prevent me from breaking your code later.
|
44
|
+
- If your specs use PNG files, try to keep them as small as possible to keep the test suite snappy.
|
45
|
+
- Make sure that the specs are passing for all Rubies on [Travis CI](https://travis-ci.org/wvanbergen/chunky_png/).
|
46
|
+
|
47
|
+
Misc:
|
48
|
+
|
49
|
+
- Add an entry to CHANGELOG.md.
|
50
|
+
- Do not change `ChunkyPNG::VERSION`
|
data/LICENSE
CHANGED
data/chunky_png.gemspec
CHANGED
@@ -13,21 +13,21 @@ Gem::Specification.new do |s|
|
|
13
13
|
|
14
14
|
s.summary = "Pure ruby library for read/write, chunk-level access to PNG files"
|
15
15
|
s.description = <<-EOT
|
16
|
-
This pure Ruby library can read and write PNG images without depending on an external
|
16
|
+
This pure Ruby library can read and write PNG images without depending on an external
|
17
17
|
image library, like RMagick. It tries to be memory efficient and reasonably fast.
|
18
|
-
|
19
|
-
It supports reading and writing all PNG variants that are defined in the specification,
|
20
|
-
with one limitation: only 8-bit color depth is supported. It supports all transparency,
|
21
|
-
interlacing and filtering options the PNG specifications allows. It can also read and
|
18
|
+
|
19
|
+
It supports reading and writing all PNG variants that are defined in the specification,
|
20
|
+
with one limitation: only 8-bit color depth is supported. It supports all transparency,
|
21
|
+
interlacing and filtering options the PNG specifications allows. It can also read and
|
22
22
|
write textual metadata from PNG files. Low-level read/write access to PNG chunks is
|
23
23
|
also possible.
|
24
|
-
|
24
|
+
|
25
25
|
This library supports simple drawing on the image canvas and simple operations like
|
26
|
-
alpha composition and cropping. Finally, it can import from and export to RMagick for
|
26
|
+
alpha composition and cropping. Finally, it can import from and export to RMagick for
|
27
27
|
interoperability.
|
28
|
-
|
29
|
-
Also, have a look at OilyPNG at http://github.com/wvanbergen/oily_png. OilyPNG is a
|
30
|
-
drop in mixin module that implements some of the ChunkyPNG algorithms in C, which
|
28
|
+
|
29
|
+
Also, have a look at OilyPNG at http://github.com/wvanbergen/oily_png. OilyPNG is a
|
30
|
+
drop in mixin module that implements some of the ChunkyPNG algorithms in C, which
|
31
31
|
provides a massive speed boost to encoding and decoding.
|
32
32
|
EOT
|
33
33
|
|
@@ -37,10 +37,10 @@ Gem::Specification.new do |s|
|
|
37
37
|
s.license = 'MIT'
|
38
38
|
|
39
39
|
s.add_development_dependency('rake')
|
40
|
-
s.add_development_dependency('rspec', '~>
|
40
|
+
s.add_development_dependency('rspec', '~> 3')
|
41
41
|
|
42
42
|
s.rdoc_options << '--title' << s.name << '--main' << 'README.rdoc' << '--line-numbers' << '--inline-source'
|
43
|
-
s.extra_rdoc_files = ['README.rdoc'
|
43
|
+
s.extra_rdoc_files = ['README.rdoc']
|
44
44
|
|
45
45
|
s.files = `git ls-files`.split($/)
|
46
46
|
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
@@ -177,7 +177,7 @@ module ChunkyPNG
|
|
177
177
|
|
178
178
|
new_pixels = []
|
179
179
|
for cy in 0...crop_height do
|
180
|
-
new_pixels
|
180
|
+
new_pixels.concat pixels.slice((cy + y) * width + x, crop_width)
|
181
181
|
end
|
182
182
|
replace_canvas!(crop_width, crop_height, new_pixels)
|
183
183
|
end
|
data/lib/chunky_png/color.rb
CHANGED
@@ -582,16 +582,16 @@ module ChunkyPNG
|
|
582
582
|
# @param [Integer] color The ChunkyPNG color to convert.
|
583
583
|
# @param [Boolean] include_alpha Flag indicates whether a fourth element
|
584
584
|
# representing alpha channel should be included in the returned array.
|
585
|
-
# @return [Array
|
586
|
-
# @return [Array
|
587
|
-
# @return [Array
|
588
|
-
# @return [Array
|
585
|
+
# @return [Array[0]] The hue of the color (0-360)
|
586
|
+
# @return [Array[1]] The saturation of the color (0-1)
|
587
|
+
# @return [Array[2]] The value of the color (0-1)
|
588
|
+
# @return [Array[3]] Optional fourth element for alpha, included if
|
589
589
|
# include_alpha=true (0-255)
|
590
590
|
# @see http://en.wikipedia.org/wiki/HSL_and_HSV
|
591
591
|
def to_hsv(color, include_alpha = false)
|
592
592
|
hue, chroma, max, min = hue_and_chroma(color)
|
593
593
|
value = max
|
594
|
-
saturation = chroma.zero? ? 0 : chroma.fdiv(value)
|
594
|
+
saturation = chroma.zero? ? 0.0 : chroma.fdiv(value)
|
595
595
|
|
596
596
|
include_alpha ? [hue, saturation, value, a(color)] :
|
597
597
|
[hue, saturation, value]
|
@@ -619,7 +619,7 @@ module ChunkyPNG
|
|
619
619
|
def to_hsl(color, include_alpha = false)
|
620
620
|
hue, chroma, max, min = hue_and_chroma(color)
|
621
621
|
lightness = 0.5 * (max + min)
|
622
|
-
saturation = chroma.zero? ? 0 : chroma.fdiv(1 - (2*lightness-1).abs)
|
622
|
+
saturation = chroma.zero? ? 0.0 : chroma.fdiv(1 - (2 * lightness - 1).abs)
|
623
623
|
|
624
624
|
include_alpha ? [hue, saturation, lightness, a(color)] :
|
625
625
|
[hue, saturation, lightness]
|
@@ -650,7 +650,7 @@ module ChunkyPNG
|
|
650
650
|
end
|
651
651
|
hue = 60 * hue_prime
|
652
652
|
|
653
|
-
return hue, chroma, max, min
|
653
|
+
return hue.round, chroma, max, min
|
654
654
|
end
|
655
655
|
private :hue_and_chroma
|
656
656
|
|
data/lib/chunky_png/dimension.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
module ChunkyPNG
|
2
|
-
|
3
|
-
# Creates a {ChunkyPNG::Dimension} instance using arguments that can be interpreted
|
2
|
+
|
3
|
+
# Creates a {ChunkyPNG::Dimension} instance using arguments that can be interpreted
|
4
4
|
# as width and height.
|
5
|
-
#
|
5
|
+
#
|
6
6
|
# @overload Dimension(width, height)
|
7
7
|
# @param [Integer] width The width-component of the dimension.
|
8
8
|
# @param [Integer] height The height-component of the dimension.
|
@@ -15,7 +15,7 @@ module ChunkyPNG
|
|
15
15
|
#
|
16
16
|
# @overload Dimension(ary)
|
17
17
|
# @param [Array] ary An array with the desired width as first element and the
|
18
|
-
# desired height as second element, e.g. <tt>[10, 20]</tt>.
|
18
|
+
# desired height as second element, e.g. <tt>[10, 20]</tt>.
|
19
19
|
# @return [ChunkyPNG::Dimension] The instantiated dimension.
|
20
20
|
#
|
21
21
|
# @overload Dimension(hash)
|
@@ -31,7 +31,7 @@ module ChunkyPNG
|
|
31
31
|
case args.length
|
32
32
|
when 2; ChunkyPNG::Dimension.new(*args)
|
33
33
|
when 1; build_dimension_from_object(args.first)
|
34
|
-
else raise ArgumentError,
|
34
|
+
else raise ArgumentError,
|
35
35
|
"Don't know how to construct a dimension from #{args.inspect}"
|
36
36
|
end
|
37
37
|
end
|
@@ -59,7 +59,7 @@ module ChunkyPNG
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
private_class_method :build_dimension_from_object
|
62
|
-
|
62
|
+
|
63
63
|
# Class that represents the dimension of something, e.g. a {ChunkyPNG::Canvas}.
|
64
64
|
#
|
65
65
|
# This class contains some methods to simplify performing dimension related checks.
|
@@ -71,23 +71,23 @@ module ChunkyPNG
|
|
71
71
|
|
72
72
|
# @return [Integer] The width-component of this dimension.
|
73
73
|
attr_accessor :width
|
74
|
-
|
74
|
+
|
75
75
|
# @return [Integer] The height-component of this dimension.
|
76
76
|
attr_accessor :height
|
77
|
-
|
77
|
+
|
78
78
|
# Initializes a new dimension instance.
|
79
79
|
# @param [Integer] width The width-component of the new dimension.
|
80
80
|
# @param [Integer] height The height-component of the new dimension.
|
81
81
|
def initialize(width, height)
|
82
82
|
@width, @height = width.to_i, height.to_i
|
83
83
|
end
|
84
|
-
|
84
|
+
|
85
85
|
# Returns the area of this dimension.
|
86
86
|
# @return [Integer] The area in number of pixels.
|
87
87
|
def area
|
88
88
|
width * height
|
89
89
|
end
|
90
|
-
|
90
|
+
|
91
91
|
# Checks whether a point is within bounds of this dimension.
|
92
92
|
# @param [ChunkyPNG::Point, ...] A point-like to bounds-check.
|
93
93
|
# @return [true, false] True iff the x and y coordinate fall in this dimension.
|
@@ -96,16 +96,17 @@ module ChunkyPNG
|
|
96
96
|
point = ChunkyPNG::Point(*point_like)
|
97
97
|
point.x >= 0 && point.x < width && point.y >= 0 && point.y < height
|
98
98
|
end
|
99
|
-
|
99
|
+
|
100
100
|
# Checks whether 2 dimensions are identical.
|
101
101
|
# @param [ChunkyPNG::Dimension] The dimension to compare with.
|
102
102
|
# @return [true, false] <tt>true</tt> iff width and height match.
|
103
103
|
def eql?(other)
|
104
|
+
return false unless other.respond_to?(:width) && other.respond_to?(:height)
|
104
105
|
other.width == width && other.height == height
|
105
106
|
end
|
106
|
-
|
107
|
+
|
107
108
|
alias_method :==, :eql?
|
108
|
-
|
109
|
+
|
109
110
|
# Compares the size of 2 dimensions.
|
110
111
|
# @param [ChunkyPNG::Dimension] The dimension to compare with.
|
111
112
|
# @return [-1, 0, 1] -1 if the other dimension has a larger area, 1 of this
|
@@ -113,13 +114,13 @@ module ChunkyPNG
|
|
113
114
|
def <=>(other)
|
114
115
|
other.area <=> area
|
115
116
|
end
|
116
|
-
|
117
|
+
|
117
118
|
# Casts this dimension into an array.
|
118
119
|
# @return [Array<Integer>] <tt>[width, height]</tt> for this dimension.
|
119
120
|
def to_a
|
120
121
|
[width, height]
|
121
122
|
end
|
122
|
-
|
123
|
+
|
123
124
|
alias_method :to_ary, :to_a
|
124
125
|
end
|
125
126
|
end
|
data/lib/chunky_png/version.rb
CHANGED
@@ -5,31 +5,31 @@ describe ChunkyPNG::Canvas::Adam7Interlacing do
|
|
5
5
|
|
6
6
|
describe '#adam7_pass_sizes' do
|
7
7
|
it "should get the pass sizes for a 8x8 image correctly" do
|
8
|
-
adam7_pass_sizes(8, 8).
|
8
|
+
expect(adam7_pass_sizes(8, 8)).to eql [
|
9
9
|
[1, 1], [1, 1], [2, 1], [2, 2], [4, 2], [4, 4], [8, 4]
|
10
10
|
]
|
11
11
|
end
|
12
12
|
|
13
13
|
it "should get the pass sizes for a 12x12 image correctly" do
|
14
|
-
adam7_pass_sizes(12, 12).
|
14
|
+
expect(adam7_pass_sizes(12, 12)).to eql [
|
15
15
|
[2, 2], [1, 2], [3, 1], [3, 3], [6, 3], [6, 6], [12, 6]
|
16
16
|
]
|
17
17
|
end
|
18
18
|
|
19
19
|
it "should get the pass sizes for a 33x47 image correctly" do
|
20
|
-
adam7_pass_sizes(33, 47).
|
20
|
+
expect(adam7_pass_sizes(33, 47)).to eql [
|
21
21
|
[5, 6], [4, 6], [9, 6], [8, 12], [17, 12], [16, 24], [33, 23]
|
22
22
|
]
|
23
23
|
end
|
24
24
|
|
25
25
|
it "should get the pass sizes for a 1x1 image correctly" do
|
26
|
-
adam7_pass_sizes(1, 1).
|
26
|
+
expect(adam7_pass_sizes(1, 1)).to eql [
|
27
27
|
[1, 1], [0, 1], [1, 0], [0, 1], [1, 0], [0, 1], [1, 0]
|
28
28
|
]
|
29
29
|
end
|
30
30
|
|
31
31
|
it "should get the pass sizes for a 0x0 image correctly" do
|
32
|
-
adam7_pass_sizes(0, 0).
|
32
|
+
expect(adam7_pass_sizes(0, 0)).to eql [
|
33
33
|
[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]
|
34
34
|
]
|
35
35
|
end
|
@@ -37,38 +37,38 @@ describe ChunkyPNG::Canvas::Adam7Interlacing do
|
|
37
37
|
it "should always maintain the same amount of pixels in total" do
|
38
38
|
[[8, 8], [12, 12], [33, 47], [1, 1], [0, 0]].each do |(width, height)|
|
39
39
|
pass_sizes = adam7_pass_sizes(width, height)
|
40
|
-
pass_sizes.inject(0) { |sum, (w, h)| sum + (w*h) }.
|
40
|
+
expect(pass_sizes.inject(0) { |sum, (w, h)| sum + (w*h) }).to eql width * height
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
45
|
describe '#adam7_multiplier_offset' do
|
46
46
|
it "should get the multiplier and offset values for pass 1 correctly" do
|
47
|
-
adam7_multiplier_offset(0).
|
47
|
+
expect(adam7_multiplier_offset(0)).to eql [3, 0, 3, 0]
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
it "should get the multiplier and offset values for pass 2 correctly" do
|
51
|
-
adam7_multiplier_offset(1).
|
51
|
+
expect(adam7_multiplier_offset(1)).to eql [3, 4, 3, 0]
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
it "should get the multiplier and offset values for pass 3 correctly" do
|
55
|
-
adam7_multiplier_offset(2).
|
55
|
+
expect(adam7_multiplier_offset(2)).to eql [2, 0, 3, 4]
|
56
56
|
end
|
57
|
-
|
57
|
+
|
58
58
|
it "should get the multiplier and offset values for pass 4 correctly" do
|
59
|
-
adam7_multiplier_offset(3).
|
59
|
+
expect(adam7_multiplier_offset(3)).to eql [2, 2, 2, 0]
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
it "should get the multiplier and offset values for pass 5 correctly" do
|
63
|
-
adam7_multiplier_offset(4).
|
63
|
+
expect(adam7_multiplier_offset(4)).to eql [1, 0, 2, 2]
|
64
64
|
end
|
65
65
|
|
66
66
|
it "should get the multiplier and offset values for pass 6 correctly" do
|
67
|
-
adam7_multiplier_offset(5).
|
67
|
+
expect(adam7_multiplier_offset(5)).to eql [1, 1, 1, 0]
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
it "should get the multiplier and offset values for pass 7 correctly" do
|
71
|
-
adam7_multiplier_offset(6).
|
71
|
+
expect(adam7_multiplier_offset(6)).to eql [0, 0, 1, 1]
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
@@ -83,10 +83,10 @@ describe ChunkyPNG::Canvas::Adam7Interlacing do
|
|
83
83
|
ChunkyPNG::Canvas.new(4, 4, 1023344895), # r = 60
|
84
84
|
ChunkyPNG::Canvas.new(8, 4, 1175063295), # r = 70
|
85
85
|
]
|
86
|
-
|
86
|
+
|
87
87
|
canvas = ChunkyPNG::Image.new(8,8)
|
88
88
|
submatrices.each_with_index { |m, pass| adam7_merge_pass(pass, canvas, m) }
|
89
|
-
canvas.
|
89
|
+
expect(canvas).to eql reference_image('adam7')
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
@@ -96,11 +96,11 @@ describe ChunkyPNG::Canvas::Adam7Interlacing do
|
|
96
96
|
1.upto(7) do |pass|
|
97
97
|
it "should extract pass #{pass} correctly" do
|
98
98
|
sm = adam7_extract_pass(pass - 1, @canvas)
|
99
|
-
sm.pixels.length.
|
100
|
-
sm.pixels.uniq.length.
|
101
|
-
ChunkyPNG::Color.r(sm[0,0]).
|
99
|
+
expect(sm.pixels.length).to eql sm.width * sm.height
|
100
|
+
expect(sm.pixels.uniq.length).to eql 1
|
101
|
+
expect(ChunkyPNG::Color.r(sm[0,0])).to eql pass * 10
|
102
102
|
end
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
106
|
-
end
|
106
|
+
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe ChunkyPNG::Canvas do
|
4
|
-
|
4
|
+
|
5
5
|
describe '#to_data_url' do
|
6
6
|
it "should export a sample canvas to an RGBA stream correctly" do
|
7
7
|
canvas = ChunkyPNG::Canvas.new(2, 2, [ChunkyPNG::Color.rgba(1,2,3,4), ChunkyPNG::Color.rgba(5,6,7,8),
|
8
8
|
ChunkyPNG::Color.rgba(4,3,2,1), ChunkyPNG::Color.rgba(8,7,6,5)])
|
9
9
|
|
10
|
-
canvas.to_data_url.
|
10
|
+
expect(canvas.to_data_url).to eql "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACAgMAAAAP2OW3AAAADFBMVEUBAgMEAwIFBgcIBwazgAAdAAAABHRSTlMEAQgFhYDlfQAAAAxJREFUeJxjUmAKAAAAwAB1GNhIEwAAAABJRU5ErkJggg=="
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe ChunkyPNG::Canvas do
|
4
|
-
|
4
|
+
|
5
5
|
describe '.from_data_url' do
|
6
6
|
it "should import an image from a data URL" do
|
7
7
|
data_url = reference_canvas('operations').to_data_url
|
8
|
-
ChunkyPNG::Canvas.from_data_url(data_url).
|
8
|
+
expect(ChunkyPNG::Canvas.from_data_url(data_url)).to eql reference_canvas('operations')
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
it "should raise an exception if the string is not a proper data URL" do
|
12
|
-
|
12
|
+
expect { ChunkyPNG::Canvas.from_data_url('whatever') }.to raise_error(ChunkyPNG::SignatureMismatch)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|