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
@@ -1,30 +1,30 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe ChunkyPNG::Canvas::Drawing do
|
4
|
-
|
4
|
+
|
5
5
|
describe '#compose_pixel' do
|
6
6
|
subject { ChunkyPNG::Canvas.new(1, 1, ChunkyPNG::Color.rgb(200, 150, 100)) }
|
7
|
-
|
7
|
+
|
8
8
|
it "should compose colors correctly" do
|
9
9
|
subject.compose_pixel(0,0, ChunkyPNG::Color(100, 150, 200, 128))
|
10
|
-
subject[0, 0].
|
10
|
+
expect(subject[0, 0]).to eql ChunkyPNG::Color(150, 150, 150)
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
it "should return the composed color" do
|
14
|
-
subject.compose_pixel(0, 0, ChunkyPNG::Color.rgba(100, 150, 200, 128)).
|
14
|
+
expect(subject.compose_pixel(0, 0, ChunkyPNG::Color.rgba(100, 150, 200, 128))).to eql ChunkyPNG::Color.rgb(150, 150, 150)
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
it "should do nothing when the coordinates are out of bounds" do
|
18
|
-
subject.compose_pixel(1, -1, :black).
|
19
|
-
|
18
|
+
expect(subject.compose_pixel(1, -1, :black)).to be_nil
|
19
|
+
expect { subject.compose_pixel(1, -1, :black) }.to_not change { subject[0, 0] }
|
20
20
|
end
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
describe '#line' do
|
24
24
|
it "should draw lines correctly with anti-aliasing" do
|
25
|
-
|
25
|
+
|
26
26
|
canvas = ChunkyPNG::Canvas.new(31, 31, ChunkyPNG::Color::WHITE)
|
27
|
-
|
27
|
+
|
28
28
|
canvas.line( 0, 0, 30, 30, ChunkyPNG::Color::BLACK)
|
29
29
|
canvas.line( 0, 30, 30, 0, ChunkyPNG::Color::BLACK)
|
30
30
|
canvas.line(15, 30, 15, 0, ChunkyPNG::Color.rgba(200, 0, 0, 128))
|
@@ -34,137 +34,137 @@ describe ChunkyPNG::Canvas::Drawing do
|
|
34
34
|
canvas.line( 0, 30, 15, 0, ChunkyPNG::Color.rgba( 0, 0, 200, 128), false)
|
35
35
|
canvas.line(15, 0, 30, 30, ChunkyPNG::Color.rgba( 0, 0, 200, 128))
|
36
36
|
|
37
|
-
canvas.
|
37
|
+
expect(canvas).to eql reference_canvas('lines')
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
it "should draw partial lines if the coordinates are partially out of bounds" do
|
41
41
|
canvas = ChunkyPNG::Canvas.new(1, 2, ChunkyPNG::Color::WHITE)
|
42
42
|
canvas.line(-5, -5, 0, 0, '#000000')
|
43
|
-
canvas.pixels.
|
43
|
+
expect(canvas.pixels).to eql [ChunkyPNG::Color::BLACK, ChunkyPNG::Color::WHITE]
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
it "should return itself to allow chaining" do
|
47
47
|
canvas = ChunkyPNG::Canvas.new(16, 16, ChunkyPNG::Color::WHITE)
|
48
|
-
canvas.line(1, 1, 10, 10, :black).
|
48
|
+
expect(canvas.line(1, 1, 10, 10, :black)).to equal(canvas)
|
49
49
|
end
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
describe '#rect' do
|
53
53
|
subject { ChunkyPNG::Canvas.new(16, 16, '#ffffff') }
|
54
|
-
|
54
|
+
|
55
55
|
it "should draw a rectangle with the correct colors" do
|
56
56
|
subject.rect(1, 1, 10, 10, ChunkyPNG::Color.rgba(0, 255, 0, 80), ChunkyPNG::Color.rgba(255, 0, 0, 100))
|
57
57
|
subject.rect(5, 5, 14, 14, ChunkyPNG::Color.rgba(0, 0, 255, 160), ChunkyPNG::Color.rgba(255, 255, 0, 100))
|
58
|
-
subject.
|
58
|
+
expect(subject).to eql reference_canvas('rect')
|
59
59
|
end
|
60
|
-
|
60
|
+
|
61
61
|
it "should return itself to allow chaining" do
|
62
|
-
subject.rect(1, 1, 10, 10).
|
62
|
+
expect(subject.rect(1, 1, 10, 10)).to equal(subject)
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
it "should draw partial rectangles if the coordinates are partially out of bounds" do
|
66
66
|
subject.rect(0, 0, 20, 20, :black, :white)
|
67
|
-
subject[0, 0].
|
67
|
+
expect(subject[0, 0]).to eql ChunkyPNG::Color::BLACK
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
it "should draw the rectangle fill only if the coordinates are fully out of bounds" do
|
71
71
|
subject.rect(-1, -1, 20, 20, :black, :white)
|
72
|
-
subject[0, 0].
|
72
|
+
expect(subject[0, 0]).to eql ChunkyPNG::Color::WHITE
|
73
73
|
end
|
74
74
|
end
|
75
|
-
|
75
|
+
|
76
76
|
describe '#circle' do
|
77
|
-
subject { ChunkyPNG::Canvas.new(32, 32, ChunkyPNG::Color.rgba(0, 0, 255, 128)) }
|
78
|
-
|
77
|
+
subject { ChunkyPNG::Canvas.new(32, 32, ChunkyPNG::Color.rgba(0, 0, 255, 128)) }
|
78
|
+
|
79
79
|
it "should draw circles" do
|
80
80
|
subject.circle(11, 11, 10, ChunkyPNG::Color('red @ 0.5'), ChunkyPNG::Color('white @ 0.2'))
|
81
81
|
subject.circle(21, 21, 10, ChunkyPNG::Color('green @ 0.5'))
|
82
|
-
subject.
|
82
|
+
expect(subject).to eql reference_canvas('circles')
|
83
83
|
end
|
84
|
-
|
84
|
+
|
85
85
|
it "should draw partial circles when going of the canvas bounds" do
|
86
86
|
subject.circle(0, 0, 10, ChunkyPNG::Color(:red))
|
87
87
|
subject.circle(31, 16, 10, ChunkyPNG::Color(:black), ChunkyPNG::Color(:white, 0xaa))
|
88
|
-
subject.
|
88
|
+
expect(subject).to eql reference_canvas('partial_circles')
|
89
89
|
end
|
90
90
|
|
91
91
|
it "should return itself to allow chaining" do
|
92
|
-
subject.circle(10, 10, 5, :red).
|
92
|
+
expect(subject.circle(10, 10, 5, :red)).to equal(subject)
|
93
93
|
end
|
94
94
|
end
|
95
|
-
|
95
|
+
|
96
96
|
describe '#polygon' do
|
97
97
|
subject { ChunkyPNG::Canvas.new(22, 22) }
|
98
98
|
|
99
99
|
it "should draw an filled triangle when using 3 control points" do
|
100
100
|
subject.polygon('(2,2) (20,5) (5,20)', ChunkyPNG::Color(:black, 0xaa), ChunkyPNG::Color(:red, 0x44))
|
101
|
-
subject.
|
101
|
+
expect(subject).to eql reference_canvas('polygon_triangle_filled')
|
102
102
|
end
|
103
103
|
|
104
104
|
it "should draw a unfilled polygon with 6 control points" do
|
105
105
|
subject.polygon('(2,2) (12, 1) (20,5) (18,18) (5,20) (1,12)', ChunkyPNG::Color(:black))
|
106
|
-
subject.
|
106
|
+
expect(subject).to eql reference_canvas('polygon_unfilled')
|
107
107
|
end
|
108
|
-
|
108
|
+
|
109
109
|
it "should draw a vertically crossed filled polygon with 4 control points" do
|
110
110
|
subject.polygon('(2,2) (21,2) (2,21) (21,21)', ChunkyPNG::Color(:black), ChunkyPNG::Color(:red))
|
111
|
-
subject.
|
111
|
+
expect(subject).to eql reference_canvas('polygon_filled_vertical')
|
112
112
|
end
|
113
113
|
|
114
114
|
it "should draw a vertically crossed filled polygon with 4 control points" do
|
115
115
|
subject.polygon('(2,2) (2,21) (21,2) (21,21)', ChunkyPNG::Color(:black), ChunkyPNG::Color(:red))
|
116
|
-
subject.
|
116
|
+
expect(subject).to eql reference_canvas('polygon_filled_horizontal')
|
117
117
|
end
|
118
118
|
|
119
119
|
it "should return itself to allow chaining" do
|
120
|
-
subject.polygon('(2,2) (20,5) (5,20)').
|
120
|
+
expect(subject.polygon('(2,2) (20,5) (5,20)')).to equal(subject)
|
121
121
|
end
|
122
122
|
end
|
123
|
-
|
123
|
+
|
124
124
|
describe '#bezier_curve' do
|
125
125
|
subject { ChunkyPNG::Canvas.new(24, 24, ChunkyPNG::Color::WHITE) }
|
126
|
-
|
126
|
+
|
127
127
|
it "should draw a bezier curve starting at the first point" do
|
128
128
|
subject.bezier_curve('3,20 10,10, 20,20')
|
129
|
-
subject[3, 20].
|
129
|
+
expect(subject[3, 20]).to eql ChunkyPNG::Color::BLACK
|
130
130
|
end
|
131
|
-
|
131
|
+
|
132
132
|
it "should draw a bezier curve ending at the last point" do
|
133
133
|
subject.bezier_curve('3,20 10,10, 20,20')
|
134
|
-
subject[20, 20].
|
134
|
+
expect(subject[20, 20]).to eql ChunkyPNG::Color::BLACK
|
135
135
|
end
|
136
|
-
|
136
|
+
|
137
137
|
it "should draw a bezier curve with a color of green" do
|
138
138
|
subject.bezier_curve('3,20 10,10, 20,20', :green)
|
139
|
-
subject[3, 20].
|
139
|
+
expect(subject[3, 20]).to eql ChunkyPNG::Color(:green)
|
140
140
|
end
|
141
|
-
|
141
|
+
|
142
142
|
it "should draw a three point bezier curve" do
|
143
|
-
subject.bezier_curve('1,23 12,10 23,23').
|
143
|
+
expect(subject.bezier_curve('1,23 12,10 23,23')).to eql reference_canvas('bezier_three_point')
|
144
144
|
end
|
145
|
-
|
145
|
+
|
146
146
|
it "should draw a three point bezier curve flipped" do
|
147
|
-
subject.bezier_curve('1,1 12,15 23,1').
|
147
|
+
expect(subject.bezier_curve('1,1 12,15 23,1')).to eql reference_canvas('bezier_three_point_flipped')
|
148
148
|
end
|
149
|
-
|
149
|
+
|
150
150
|
it "should draw a four point bezier curve" do
|
151
|
-
subject.bezier_curve('1,23 1,5 22,5 22,23').
|
151
|
+
expect(subject.bezier_curve('1,23 1,5 22,5 22,23')).to eql reference_canvas('bezier_four_point')
|
152
152
|
end
|
153
|
-
|
153
|
+
|
154
154
|
it "should draw a four point bezier curve flipped" do
|
155
|
-
subject.bezier_curve('1,1 1,19 22,19 22,1').
|
155
|
+
expect(subject.bezier_curve('1,1 1,19 22,19 22,1')).to eql reference_canvas('bezier_four_point_flipped')
|
156
156
|
end
|
157
|
-
|
157
|
+
|
158
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').
|
159
|
+
expect(subject.bezier_curve('1,23 1,5 22,23 22,5')).to eql reference_canvas('bezier_four_point_s')
|
160
160
|
end
|
161
|
-
|
161
|
+
|
162
162
|
it "should draw a five point bezier curve" do
|
163
|
-
subject.bezier_curve('10,23 1,10 12,5 23,10 14,23').
|
163
|
+
expect(subject.bezier_curve('10,23 1,10 12,5 23,10 14,23')).to eql reference_canvas('bezier_five_point')
|
164
164
|
end
|
165
|
-
|
165
|
+
|
166
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').
|
167
|
+
expect(subject.bezier_curve('1,23 4,15 8,20 2,2 23,15 23,1')).to eql reference_canvas('bezier_six_point')
|
168
168
|
end
|
169
169
|
end
|
170
170
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe ChunkyPNG::Canvas::Masking do
|
4
|
-
|
4
|
+
|
5
5
|
subject { reference_canvas('clock') }
|
6
6
|
|
7
7
|
before(:all) do
|
@@ -9,43 +9,43 @@ describe ChunkyPNG::Canvas::Masking do
|
|
9
9
|
@new_color = ChunkyPNG::Color('#ff0000')
|
10
10
|
@background_color = ChunkyPNG::Color('white')
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
describe '#change_theme_color!' do
|
14
14
|
it "should change the theme color correctly" do
|
15
15
|
subject.change_theme_color!(@theme_color, @new_color)
|
16
|
-
subject.
|
16
|
+
expect(subject).to eql reference_canvas('clock_updated')
|
17
17
|
end
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
describe '#extract_mask' do
|
21
21
|
it "should create the correct base and mask image" do
|
22
22
|
base, mask = subject.extract_mask(@theme_color, @background_color)
|
23
|
-
base.
|
24
|
-
mask.
|
23
|
+
expect(base).to eql reference_canvas('clock_base')
|
24
|
+
expect(mask).to eql reference_canvas('clock_mask')
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
it "should create a mask image with only one opaque color" do
|
28
28
|
base, mask = subject.extract_mask(@theme_color, @background_color)
|
29
|
-
mask.palette.opaque_palette.size.
|
29
|
+
expect(mask.palette.opaque_palette.size).to eql 1
|
30
30
|
end
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
describe '#change_mask_color!' do
|
34
34
|
before { @mask = reference_canvas('clock_mask') }
|
35
|
-
|
35
|
+
|
36
36
|
it "should replace the mask color correctly" do
|
37
37
|
@mask.change_mask_color!(@new_color)
|
38
|
-
@mask.
|
38
|
+
expect(@mask).to eql reference_canvas('clock_mask_updated')
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
it "should still only have one opaque color" do
|
42
42
|
@mask.change_mask_color!(@new_color)
|
43
|
-
@mask.palette.opaque_palette.size.
|
43
|
+
expect(@mask.palette.opaque_palette.size).to eql 1
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
it "should raise an exception when the mask image has more than once color" do
|
47
47
|
not_a_mask = reference_canvas('operations')
|
48
|
-
|
48
|
+
expect { not_a_mask.change_mask_color!(@new_color) }.to raise_error(ChunkyPNG::ExpectationFailed)
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
@@ -10,28 +10,28 @@ describe ChunkyPNG::Canvas::Operations do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
it "should convert the image correctly" do
|
13
|
-
subject.grayscale.
|
13
|
+
expect(subject.grayscale).to eql reference_canvas('operations_grayscale')
|
14
14
|
end
|
15
15
|
|
16
16
|
it "should not adjust the current image" do
|
17
|
-
|
17
|
+
expect { subject.grayscale }.to_not change { subject.pixels }
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
21
|
describe '#grayscale!' do
|
22
22
|
it "should return itself" do
|
23
|
-
subject.grayscale
|
23
|
+
expect(subject.grayscale!).to equal(subject)
|
24
24
|
end
|
25
25
|
|
26
26
|
it "should convert the image correctly" do
|
27
27
|
subject.grayscale!
|
28
|
-
subject.
|
28
|
+
expect(subject).to eql reference_canvas('operations_grayscale')
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
32
|
describe '#crop' do
|
33
33
|
it "should crop the right pixels from the original canvas" do
|
34
|
-
subject.crop(10, 5, 4, 8).
|
34
|
+
expect(subject.crop(10, 5, 4, 8)).to eql reference_canvas('cropped')
|
35
35
|
end
|
36
36
|
|
37
37
|
it "should not return itself" do
|
@@ -39,44 +39,43 @@ describe ChunkyPNG::Canvas::Operations do
|
|
39
39
|
end
|
40
40
|
|
41
41
|
it "should not adjust the current image" do
|
42
|
-
|
42
|
+
expect { subject.crop(10, 5, 4, 8) }.to_not change { subject.pixels }
|
43
43
|
end
|
44
44
|
|
45
45
|
it "should raise an exception when the cropped image falls outside the oiginal image" do
|
46
|
-
|
46
|
+
expect { subject.crop(16, 16, 2, 2) }.to raise_error(ChunkyPNG::OutOfBounds)
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
50
|
describe '#crop!' do
|
51
51
|
it "should crop the right pixels from the original canvas" do
|
52
52
|
subject.crop!(10, 5, 4, 8)
|
53
|
-
subject.
|
53
|
+
expect(subject).to eql reference_canvas('cropped')
|
54
54
|
end
|
55
55
|
|
56
56
|
it "should have a new width and height" do
|
57
|
-
|
58
|
-
from(ChunkyPNG::Dimension('16x16')).
|
59
|
-
to(ChunkyPNG::Dimension('4x8'))
|
57
|
+
expect { subject.crop!(10, 5, 4, 8) }.to change { subject.dimension }.
|
58
|
+
from(ChunkyPNG::Dimension('16x16')).to(ChunkyPNG::Dimension('4x8'))
|
60
59
|
end
|
61
60
|
|
62
61
|
it "should raise an exception when the cropped image falls outside the oiginal image" do
|
63
|
-
|
62
|
+
expect { subject.crop!(16, 16, 2, 2) }.to raise_error(ChunkyPNG::OutOfBounds)
|
64
63
|
end
|
65
64
|
|
66
65
|
it "should return itself" do
|
67
|
-
subject.crop!(10, 5, 4, 8).
|
66
|
+
expect(subject.crop!(10, 5, 4, 8)).to equal(subject)
|
68
67
|
end
|
69
68
|
end
|
70
69
|
|
71
70
|
describe '#compose' do
|
72
71
|
it "should compose pixels correctly" do
|
73
72
|
subcanvas = ChunkyPNG::Canvas.new(4, 8, ChunkyPNG::Color.rgba(0, 0, 0, 75))
|
74
|
-
subject.compose(subcanvas, 8, 4).
|
73
|
+
expect(subject.compose(subcanvas, 8, 4)).to eql reference_canvas('composited')
|
75
74
|
end
|
76
75
|
|
77
76
|
it "should leave the original intact" do
|
78
77
|
subject.compose(ChunkyPNG::Canvas.new(1,1))
|
79
|
-
subject.
|
78
|
+
expect(subject).to eql reference_canvas('operations')
|
80
79
|
end
|
81
80
|
|
82
81
|
it "should not return itself" do
|
@@ -84,7 +83,7 @@ describe ChunkyPNG::Canvas::Operations do
|
|
84
83
|
end
|
85
84
|
|
86
85
|
it "should raise an exception when the pixels to compose fall outside the image" do
|
87
|
-
|
86
|
+
expect { subject.compose(ChunkyPNG::Canvas.new(1,1), 16, 16) }.to raise_error(ChunkyPNG::OutOfBounds)
|
88
87
|
end
|
89
88
|
end
|
90
89
|
|
@@ -92,29 +91,29 @@ describe ChunkyPNG::Canvas::Operations do
|
|
92
91
|
it "should compose pixels correctly" do
|
93
92
|
subcanvas = ChunkyPNG::Canvas.new(4, 8, ChunkyPNG::Color.rgba(0, 0, 0, 75))
|
94
93
|
subject.compose!(subcanvas, 8, 4)
|
95
|
-
subject.
|
94
|
+
expect(subject).to eql reference_canvas('composited')
|
96
95
|
end
|
97
96
|
|
98
97
|
it "should return itself" do
|
99
|
-
subject.compose!(ChunkyPNG::Canvas.new(1,1)).
|
98
|
+
expect(subject.compose!(ChunkyPNG::Canvas.new(1,1))).to equal(subject)
|
100
99
|
end
|
101
100
|
|
102
101
|
it "should compose a base image and mask correctly" do
|
103
102
|
base = reference_canvas('clock_base')
|
104
103
|
mask = reference_canvas('clock_mask_updated')
|
105
104
|
base.compose!(mask)
|
106
|
-
base.
|
105
|
+
expect(base).to eql reference_canvas('clock_updated')
|
107
106
|
end
|
108
107
|
|
109
108
|
it "should raise an exception when the pixels to compose fall outside the image" do
|
110
|
-
|
109
|
+
expect { subject.compose!(ChunkyPNG::Canvas.new(1,1), 16, 16) }.to raise_error(ChunkyPNG::OutOfBounds)
|
111
110
|
end
|
112
111
|
end
|
113
112
|
|
114
113
|
describe '#replace' do
|
115
114
|
it "should replace the correct pixels" do
|
116
115
|
subcanvas = ChunkyPNG::Canvas.new(3, 2, ChunkyPNG::Color.rgb(200, 255, 0))
|
117
|
-
subject.replace(subcanvas, 5, 4).
|
116
|
+
expect(subject.replace(subcanvas, 5, 4)).to eql reference_canvas('replaced')
|
118
117
|
end
|
119
118
|
|
120
119
|
it "should not return itself" do
|
@@ -123,11 +122,11 @@ describe ChunkyPNG::Canvas::Operations do
|
|
123
122
|
|
124
123
|
it "should leave the original intact" do
|
125
124
|
subject.replace(ChunkyPNG::Canvas.new(1,1))
|
126
|
-
subject.
|
125
|
+
expect(subject).to eql reference_canvas('operations')
|
127
126
|
end
|
128
127
|
|
129
128
|
it "should raise an exception when the pixels to replace fall outside the image" do
|
130
|
-
|
129
|
+
expect { subject.replace(ChunkyPNG::Canvas.new(1,1), 16, 16) }.to raise_error(ChunkyPNG::OutOfBounds)
|
131
130
|
end
|
132
131
|
end
|
133
132
|
|
@@ -135,15 +134,15 @@ describe ChunkyPNG::Canvas::Operations do
|
|
135
134
|
it "should replace the correct pixels" do
|
136
135
|
subcanvas = ChunkyPNG::Canvas.new(3, 2, ChunkyPNG::Color.rgb(200, 255, 0))
|
137
136
|
subject.replace!(subcanvas, 5, 4)
|
138
|
-
subject.
|
137
|
+
expect(subject).to eql reference_canvas('replaced')
|
139
138
|
end
|
140
139
|
|
141
140
|
it "should return itself" do
|
142
|
-
subject.replace!(ChunkyPNG::Canvas.new(1,1)).
|
141
|
+
expect(subject.replace!(ChunkyPNG::Canvas.new(1,1))).to equal(subject)
|
143
142
|
end
|
144
143
|
|
145
144
|
it "should raise an exception when the pixels to replace fall outside the image" do
|
146
|
-
|
145
|
+
expect { subject.replace!(ChunkyPNG::Canvas.new(1,1), 16, 16) }.to raise_error(ChunkyPNG::OutOfBounds)
|
147
146
|
end
|
148
147
|
end
|
149
148
|
end
|
@@ -155,17 +154,17 @@ describe ChunkyPNG::Canvas::Operations do
|
|
155
154
|
describe '#flip_horizontally!' do
|
156
155
|
it "should flip the pixels horizontally in place" do
|
157
156
|
subject.flip_horizontally!
|
158
|
-
subject.
|
157
|
+
expect(subject).to eql ChunkyPNG::Canvas.new(2, 3, [5, 6, 3, 4, 1, 2])
|
159
158
|
end
|
160
159
|
|
161
160
|
it "should return itself" do
|
162
|
-
subject.flip_horizontally
|
161
|
+
expect(subject.flip_horizontally!).to equal(subject)
|
163
162
|
end
|
164
163
|
end
|
165
164
|
|
166
165
|
describe '#flip_horizontally' do
|
167
166
|
it "should flip the pixels horizontally" do
|
168
|
-
subject.flip_horizontally.
|
167
|
+
expect(subject.flip_horizontally).to eql ChunkyPNG::Canvas.new(2, 3, [5, 6, 3, 4, 1, 2])
|
169
168
|
end
|
170
169
|
|
171
170
|
it "should not return itself" do
|
@@ -173,24 +172,24 @@ describe ChunkyPNG::Canvas::Operations do
|
|
173
172
|
end
|
174
173
|
|
175
174
|
it "should return a copy of itself when applied twice" do
|
176
|
-
subject.flip_horizontally.flip_horizontally.
|
175
|
+
expect(subject.flip_horizontally.flip_horizontally).to eql subject
|
177
176
|
end
|
178
177
|
end
|
179
178
|
|
180
179
|
describe '#flip_vertically!' do
|
181
180
|
it "should flip the pixels vertically" do
|
182
181
|
subject.flip_vertically!
|
183
|
-
subject.
|
182
|
+
expect(subject).to eql ChunkyPNG::Canvas.new(2, 3, [2, 1, 4, 3, 6, 5])
|
184
183
|
end
|
185
184
|
|
186
185
|
it "should return itself" do
|
187
|
-
subject.flip_horizontally
|
186
|
+
expect(subject.flip_horizontally!).to equal(subject)
|
188
187
|
end
|
189
188
|
end
|
190
189
|
|
191
190
|
describe '#flip_vertically' do
|
192
191
|
it "should flip the pixels vertically" do
|
193
|
-
subject.flip_vertically.
|
192
|
+
expect(subject.flip_vertically).to eql ChunkyPNG::Canvas.new(2, 3, [2, 1, 4, 3, 6, 5])
|
194
193
|
end
|
195
194
|
|
196
195
|
it "should not return itself" do
|
@@ -198,13 +197,13 @@ describe ChunkyPNG::Canvas::Operations do
|
|
198
197
|
end
|
199
198
|
|
200
199
|
it "should return a copy of itself when applied twice" do
|
201
|
-
subject.flip_vertically.flip_vertically.
|
200
|
+
expect(subject.flip_vertically.flip_vertically).to eql subject
|
202
201
|
end
|
203
202
|
end
|
204
203
|
|
205
204
|
describe '#rotate_left' do
|
206
205
|
it "should rotate the pixels 90 degrees counter-clockwise" do
|
207
|
-
subject.rotate_left.
|
206
|
+
expect(subject.rotate_left).to eql ChunkyPNG::Canvas.new(3, 2, [2, 4, 6, 1, 3, 5] )
|
208
207
|
end
|
209
208
|
|
210
209
|
it "should not return itself" do
|
@@ -212,40 +211,41 @@ describe ChunkyPNG::Canvas::Operations do
|
|
212
211
|
end
|
213
212
|
|
214
213
|
it "should not change the image dimensions" do
|
215
|
-
|
214
|
+
expect { subject.rotate_left }.to_not change { subject.dimension }
|
216
215
|
end
|
217
216
|
|
218
217
|
it "it should rotate 180 degrees when applied twice" do
|
219
|
-
subject.rotate_left.rotate_left.
|
218
|
+
expect(subject.rotate_left.rotate_left).to eql subject.rotate_180
|
220
219
|
end
|
221
220
|
|
222
221
|
it "it should rotate right when applied three times" do
|
223
|
-
subject.rotate_left.rotate_left.rotate_left.
|
222
|
+
expect(subject.rotate_left.rotate_left.rotate_left).to eql subject.rotate_right
|
224
223
|
end
|
225
224
|
|
226
225
|
it "should return itself when applied four times" do
|
227
|
-
subject.rotate_left.rotate_left.rotate_left.rotate_left.
|
226
|
+
expect(subject.rotate_left.rotate_left.rotate_left.rotate_left).to eql subject
|
228
227
|
end
|
229
228
|
end
|
230
229
|
|
231
230
|
describe '#rotate_left!' do
|
232
231
|
it "should rotate the pixels 90 degrees clockwise" do
|
233
232
|
subject.rotate_left!
|
234
|
-
subject.
|
233
|
+
expect(subject).to eql ChunkyPNG::Canvas.new(3, 2, [2, 4, 6, 1, 3, 5] )
|
235
234
|
end
|
236
235
|
|
237
236
|
it "should return itself" do
|
238
|
-
subject.rotate_left
|
237
|
+
expect(subject.rotate_left!).to equal(subject)
|
239
238
|
end
|
240
239
|
|
241
240
|
it "should change the image dimensions" do
|
242
|
-
|
241
|
+
expect { subject.rotate_left! }.to change { subject.dimension }.
|
242
|
+
from(ChunkyPNG::Dimension('2x3')).to(ChunkyPNG::Dimension('3x2'))
|
243
243
|
end
|
244
244
|
end
|
245
245
|
|
246
246
|
describe '#rotate_right' do
|
247
247
|
it "should rotate the pixels 90 degrees clockwise" do
|
248
|
-
subject.rotate_right.
|
248
|
+
expect(subject.rotate_right).to eql ChunkyPNG::Canvas.new(3, 2, [5, 3, 1, 6, 4, 2] )
|
249
249
|
end
|
250
250
|
|
251
251
|
it "should not return itself" do
|
@@ -253,40 +253,41 @@ describe ChunkyPNG::Canvas::Operations do
|
|
253
253
|
end
|
254
254
|
|
255
255
|
it "should not change the image dimensions" do
|
256
|
-
|
256
|
+
expect { subject.rotate_right }.to_not change { subject.dimension }
|
257
257
|
end
|
258
258
|
|
259
259
|
it "it should rotate 180 degrees when applied twice" do
|
260
|
-
subject.rotate_right.rotate_right.
|
260
|
+
expect(subject.rotate_right.rotate_right).to eql subject.rotate_180
|
261
261
|
end
|
262
262
|
|
263
263
|
it "it should rotate left when applied three times" do
|
264
|
-
subject.rotate_right.rotate_right.rotate_right.
|
264
|
+
expect(subject.rotate_right.rotate_right.rotate_right).to eql subject.rotate_left
|
265
265
|
end
|
266
266
|
|
267
267
|
it "should return itself when applied four times" do
|
268
|
-
subject.rotate_right.rotate_right.rotate_right.rotate_right.
|
268
|
+
expect(subject.rotate_right.rotate_right.rotate_right.rotate_right).to eql subject
|
269
269
|
end
|
270
270
|
end
|
271
271
|
|
272
272
|
describe '#rotate_right!' do
|
273
273
|
it "should rotate the pixels 90 degrees clockwise" do
|
274
274
|
subject.rotate_right!
|
275
|
-
subject.
|
275
|
+
expect(subject).to eql ChunkyPNG::Canvas.new(3, 2, [5, 3, 1, 6, 4, 2] )
|
276
276
|
end
|
277
277
|
|
278
278
|
it "should return itself" do
|
279
|
-
subject.rotate_right
|
279
|
+
expect(subject.rotate_right!).to equal(subject)
|
280
280
|
end
|
281
281
|
|
282
282
|
it "should change the image dimensions" do
|
283
|
-
|
283
|
+
expect { subject.rotate_right! }.to change { subject.dimension }.
|
284
|
+
from(ChunkyPNG::Dimension('2x3')).to(ChunkyPNG::Dimension('3x2'))
|
284
285
|
end
|
285
286
|
end
|
286
287
|
|
287
288
|
describe '#rotate_180' do
|
288
289
|
it "should rotate the pixels 180 degrees" do
|
289
|
-
subject.rotate_180.
|
290
|
+
expect(subject.rotate_180).to eql ChunkyPNG::Canvas.new(2, 3, [6, 5, 4, 3, 2, 1])
|
290
291
|
end
|
291
292
|
|
292
293
|
it "should return not itself" do
|
@@ -294,18 +295,18 @@ describe ChunkyPNG::Canvas::Operations do
|
|
294
295
|
end
|
295
296
|
|
296
297
|
it "should return a copy of itself when applied twice" do
|
297
|
-
subject.rotate_180.rotate_180.
|
298
|
+
expect(subject.rotate_180.rotate_180).to eql subject
|
298
299
|
end
|
299
300
|
end
|
300
301
|
|
301
302
|
describe '#rotate_180!' do
|
302
303
|
it "should rotate the pixels 180 degrees" do
|
303
304
|
subject.rotate_180!
|
304
|
-
subject.
|
305
|
+
expect(subject).to eql ChunkyPNG::Canvas.new(2, 3, [6, 5, 4, 3, 2, 1])
|
305
306
|
end
|
306
307
|
|
307
308
|
it "should return itself" do
|
308
|
-
subject.rotate_180
|
309
|
+
expect(subject.rotate_180!).to equal(subject)
|
309
310
|
end
|
310
311
|
end
|
311
312
|
end
|
@@ -316,7 +317,7 @@ describe ChunkyPNG::Canvas::Operations do
|
|
316
317
|
|
317
318
|
describe "#trim" do
|
318
319
|
it "should trim the border" do
|
319
|
-
subject.trim.
|
320
|
+
expect(subject.trim).to eql ChunkyPNG::Canvas.new(2, 2, 255)
|
320
321
|
end
|
321
322
|
|
322
323
|
it "should not return itself" do
|
@@ -324,26 +325,27 @@ describe ChunkyPNG::Canvas::Operations do
|
|
324
325
|
end
|
325
326
|
|
326
327
|
it "should be able to fail to trim a specified color" do
|
327
|
-
|
328
|
+
expect { subject.trim(ChunkyPNG::Color::BLACK) }.to_not change { subject.pixels }
|
328
329
|
end
|
329
330
|
|
330
331
|
it "should be the same after trimming an added border" do
|
331
|
-
subject.border(2).trim.
|
332
|
+
expect(subject.border(2).trim).to eql subject
|
332
333
|
end
|
333
334
|
end
|
334
335
|
|
335
336
|
describe "#trim!" do
|
336
337
|
it "should trim the border" do
|
337
338
|
subject.trim!
|
338
|
-
subject.
|
339
|
+
expect(subject).to eql ChunkyPNG::Canvas.new(2, 2, 255)
|
339
340
|
end
|
340
341
|
|
341
342
|
it "should return itself" do
|
342
|
-
subject.trim
|
343
|
+
expect(subject.trim!).to equal(subject)
|
343
344
|
end
|
344
345
|
|
345
346
|
it "should change the image dimensions" do
|
346
|
-
|
347
|
+
expect { subject.trim! }.to change { subject.dimension }.
|
348
|
+
from(ChunkyPNG::Dimension('4x4')).to(ChunkyPNG::Dimension('2x2'))
|
347
349
|
end
|
348
350
|
end
|
349
351
|
end
|
@@ -354,7 +356,7 @@ describe ChunkyPNG::Canvas::Operations do
|
|
354
356
|
|
355
357
|
describe "#border" do
|
356
358
|
it "should add the border" do
|
357
|
-
subject.border(2).
|
359
|
+
expect(subject.border(2)).to eql reference_canvas('operations_border')
|
358
360
|
end
|
359
361
|
|
360
362
|
it "should not return itself" do
|
@@ -362,27 +364,28 @@ describe ChunkyPNG::Canvas::Operations do
|
|
362
364
|
end
|
363
365
|
|
364
366
|
it "should retain transparency" do
|
365
|
-
ChunkyPNG::Canvas.new(1, 1).border(1).pixels.
|
367
|
+
expect(ChunkyPNG::Canvas.new(1, 1).border(1).pixels).to include(0)
|
366
368
|
end
|
367
369
|
end
|
368
370
|
|
369
371
|
describe "#border!" do
|
370
372
|
it "should add the border" do
|
371
373
|
subject.border!(2)
|
372
|
-
subject.
|
374
|
+
expect(subject).to eql reference_canvas('operations_border')
|
373
375
|
end
|
374
376
|
|
375
377
|
it "should return itself" do
|
376
|
-
subject.border!(1).
|
378
|
+
expect(subject.border!(1)).to equal(subject)
|
377
379
|
end
|
378
380
|
|
379
381
|
it "should retain transparency" do
|
380
382
|
subject.border!(1)
|
381
|
-
subject.pixels.
|
383
|
+
expect(subject.pixels).to include(0)
|
382
384
|
end
|
383
385
|
|
384
386
|
it "should change the image dimensions" do
|
385
|
-
|
387
|
+
expect { subject.border!(1) }.to change { subject.dimension }.
|
388
|
+
from(ChunkyPNG::Dimension('4x4')).to(ChunkyPNG::Dimension('6x6'))
|
386
389
|
end
|
387
390
|
end
|
388
391
|
end
|