chunky_png 1.3.11 → 1.3.12
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 +5 -5
- data/.standard.yml +16 -0
- data/.travis.yml +5 -5
- data/.yardopts +1 -1
- data/CHANGELOG.rdoc +5 -1
- data/CONTRIBUTING.rdoc +17 -8
- data/Gemfile +3 -3
- data/LICENSE +1 -1
- data/README.md +6 -1
- data/Rakefile +3 -3
- data/benchmarks/decoding_benchmark.rb +17 -17
- data/benchmarks/encoding_benchmark.rb +22 -19
- data/benchmarks/filesize_benchmark.rb +6 -6
- data/bin/rake +29 -0
- data/bin/standardrb +29 -0
- data/chunky_png.gemspec +15 -15
- data/lib/chunky_png.rb +16 -25
- data/lib/chunky_png/canvas.rb +28 -27
- data/lib/chunky_png/canvas/adam7_interlacing.rb +14 -10
- data/lib/chunky_png/canvas/data_url_exporting.rb +1 -3
- data/lib/chunky_png/canvas/data_url_importing.rb +1 -3
- data/lib/chunky_png/canvas/drawing.rb +28 -43
- data/lib/chunky_png/canvas/masking.rb +12 -14
- data/lib/chunky_png/canvas/operations.rb +26 -24
- data/lib/chunky_png/canvas/png_decoding.rb +36 -32
- data/lib/chunky_png/canvas/png_encoding.rb +106 -100
- data/lib/chunky_png/canvas/resampling.rb +26 -33
- data/lib/chunky_png/canvas/stream_exporting.rb +6 -8
- data/lib/chunky_png/canvas/stream_importing.rb +6 -8
- data/lib/chunky_png/chunk.rb +69 -60
- data/lib/chunky_png/color.rb +211 -206
- data/lib/chunky_png/datastream.rb +20 -22
- data/lib/chunky_png/dimension.rb +16 -11
- data/lib/chunky_png/image.rb +9 -11
- data/lib/chunky_png/palette.rb +4 -9
- data/lib/chunky_png/point.rb +25 -26
- data/lib/chunky_png/rmagick.rb +8 -10
- data/lib/chunky_png/vector.rb +26 -29
- data/lib/chunky_png/version.rb +1 -1
- data/spec/chunky_png/canvas/adam7_interlacing_spec.rb +20 -21
- data/spec/chunky_png/canvas/data_url_exporting_spec.rb +8 -5
- data/spec/chunky_png/canvas/data_url_importing_spec.rb +5 -6
- data/spec/chunky_png/canvas/drawing_spec.rb +46 -38
- data/spec/chunky_png/canvas/masking_spec.rb +15 -16
- data/spec/chunky_png/canvas/operations_spec.rb +68 -67
- data/spec/chunky_png/canvas/png_decoding_spec.rb +37 -38
- data/spec/chunky_png/canvas/png_encoding_spec.rb +59 -50
- data/spec/chunky_png/canvas/resampling_spec.rb +19 -21
- data/spec/chunky_png/canvas/stream_exporting_spec.rb +47 -27
- data/spec/chunky_png/canvas/stream_importing_spec.rb +10 -11
- data/spec/chunky_png/canvas_spec.rb +57 -52
- data/spec/chunky_png/color_spec.rb +115 -114
- data/spec/chunky_png/datastream_spec.rb +49 -51
- data/spec/chunky_png/dimension_spec.rb +10 -10
- data/spec/chunky_png/image_spec.rb +11 -14
- data/spec/chunky_png/point_spec.rb +21 -23
- data/spec/chunky_png/rmagick_spec.rb +7 -8
- data/spec/chunky_png/vector_spec.rb +21 -17
- data/spec/chunky_png_spec.rb +2 -2
- data/spec/png_suite_spec.rb +35 -40
- data/spec/spec_helper.rb +6 -10
- data/tasks/benchmarks.rake +7 -8
- metadata +34 -5
- data/lib/chunky_png/compatibility.rb +0 -15
data/lib/chunky_png/vector.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
module ChunkyPNG
|
2
|
-
|
3
2
|
# Factory method for {ChunkyPNG::Vector} instances.
|
4
3
|
#
|
5
4
|
# @overload Vector(x0, y0, x1, y1, x2, y2, ...)
|
6
|
-
# Creates a vector by parsing two subsequent values in the argument list
|
5
|
+
# Creates a vector by parsing two subsequent values in the argument list
|
7
6
|
# as x- and y-coordinate of a point.
|
8
7
|
# @return [ChunkyPNG::Vector] The instantiated vector.
|
9
8
|
# @overload Vector(string)
|
@@ -17,27 +16,25 @@ module ChunkyPNG
|
|
17
16
|
# @raise [ArgumentError] If the given arguments could not be understood as a vector.
|
18
17
|
# @see ChunkyPNG::Vector
|
19
18
|
def self.Vector(*args)
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
return args.first if args.length == 1 && args.first.is_a?(ChunkyPNG::Vector)
|
20
|
+
|
23
21
|
if args.length == 1 && args.first.respond_to?(:scan)
|
24
22
|
ChunkyPNG::Vector.new(ChunkyPNG::Vector.multiple_from_string(args.first)) # e.g. ['1,1 2,2 3,3']
|
25
23
|
else
|
26
24
|
ChunkyPNG::Vector.new(ChunkyPNG::Vector.multiple_from_array(args)) # e.g. [[1,1], [2,2], [3,3]] or [1,1,2,2,3,3]
|
27
25
|
end
|
28
26
|
end
|
29
|
-
|
27
|
+
|
30
28
|
# Class that represents a vector of points, i.e. a list of {ChunkyPNG::Point} instances.
|
31
29
|
#
|
32
|
-
# Vectors can be created quite flexibly. See the {ChunkyPNG.Vector} factory methods for
|
30
|
+
# Vectors can be created quite flexibly. See the {ChunkyPNG.Vector} factory methods for
|
33
31
|
# more information on how to construct vectors.
|
34
32
|
class Vector
|
35
|
-
|
36
33
|
include Enumerable
|
37
|
-
|
34
|
+
|
38
35
|
# @return [Array<ChunkyPNG::Point>] The array that holds all the points in this vector.
|
39
36
|
attr_reader :points
|
40
|
-
|
37
|
+
|
41
38
|
# Initializes a vector based on a list of Point instances.
|
42
39
|
#
|
43
40
|
# You usually do not want to use this method directly, but call {ChunkyPNG.Vector} instead.
|
@@ -47,7 +44,7 @@ module ChunkyPNG
|
|
47
44
|
def initialize(points = [])
|
48
45
|
@points = points
|
49
46
|
end
|
50
|
-
|
47
|
+
|
51
48
|
# Iterates over all the edges in this vector.
|
52
49
|
#
|
53
50
|
# An edge is a combination of two subsequent points in the vector. Together, they will form
|
@@ -63,14 +60,14 @@ module ChunkyPNG
|
|
63
60
|
points.each_cons(2) { |a, b| yield(a, b) }
|
64
61
|
yield(points.last, points.first) if close
|
65
62
|
end
|
66
|
-
|
63
|
+
|
67
64
|
# Returns the point with the given indexof this vector.
|
68
65
|
# @param [Integer] index The 0-based index of the point in this vector.
|
69
|
-
# @
|
66
|
+
# @return [ChunkyPNG::Point] The point instance.
|
70
67
|
def [](index)
|
71
68
|
points[index]
|
72
69
|
end
|
73
|
-
|
70
|
+
|
74
71
|
# Returns an enumerator that will iterate over all the edges in this vector.
|
75
72
|
# @param (see #each_edge)
|
76
73
|
# @return [Enumerator] The enumerator that iterates over the edges.
|
@@ -79,28 +76,28 @@ module ChunkyPNG
|
|
79
76
|
def edges(close = true)
|
80
77
|
to_enum(:each_edge, close)
|
81
78
|
end
|
82
|
-
|
79
|
+
|
83
80
|
# Returns the number of points in this vector.
|
84
81
|
# @return [Integer] The length of the points array.
|
85
82
|
def length
|
86
83
|
points.length
|
87
84
|
end
|
88
|
-
|
85
|
+
|
89
86
|
# Iterates over all the points in this vector
|
90
87
|
# @yield [ChunkyPNG::Point] The points in the correct order.
|
91
88
|
# @return [void]
|
92
89
|
def each(&block)
|
93
90
|
points.each(&block)
|
94
91
|
end
|
95
|
-
|
92
|
+
|
96
93
|
# Comparison between two vectors for quality.
|
97
94
|
# @param [ChunkyPNG::Vector] other The vector to compare with.
|
98
95
|
# @return [true, false] true if the list of points are identical
|
99
96
|
def eql?(other)
|
100
97
|
other.points == points
|
101
98
|
end
|
102
|
-
|
103
|
-
|
99
|
+
|
100
|
+
alias == eql?
|
104
101
|
|
105
102
|
# Returns the range in x-coordinates for all the points in this vector.
|
106
103
|
# @return [Range] The (inclusive) range of x-coordinates.
|
@@ -113,13 +110,13 @@ module ChunkyPNG
|
|
113
110
|
def y_range
|
114
111
|
Range.new(*points.map { |p| p.y }.minmax)
|
115
112
|
end
|
116
|
-
|
113
|
+
|
117
114
|
# Finds the lowest x-coordinate in this vector.
|
118
115
|
# @return [Integer] The lowest x-coordinate of all the points in the vector.
|
119
116
|
def min_x
|
120
117
|
x_range.first
|
121
118
|
end
|
122
|
-
|
119
|
+
|
123
120
|
# Finds the highest x-coordinate in this vector.
|
124
121
|
# @return [Integer] The highest x-coordinate of all the points in the vector.
|
125
122
|
def max_x
|
@@ -131,13 +128,13 @@ module ChunkyPNG
|
|
131
128
|
def min_y
|
132
129
|
y_range.first
|
133
130
|
end
|
134
|
-
|
131
|
+
|
135
132
|
# Finds the highest y-coordinate in this vector.
|
136
133
|
# @return [Integer] The highest y-coordinate of all the points in the vector.
|
137
134
|
def max_y
|
138
135
|
y_range.last
|
139
136
|
end
|
140
|
-
|
137
|
+
|
141
138
|
# Returns the offset from (0,0) of the minimal bounding box of all the
|
142
139
|
# points in this vector
|
143
140
|
# @return [ChunkyPNG::Point] A point that describes the top left corner if a
|
@@ -145,7 +142,7 @@ module ChunkyPNG
|
|
145
142
|
def offset
|
146
143
|
ChunkyPNG::Point.new(min_x, min_y)
|
147
144
|
end
|
148
|
-
|
145
|
+
|
149
146
|
# Returns the width of the minimal bounding box of all the points in this vector.
|
150
147
|
# @return [Integer] The x-distance between the points that are farthest from each other.
|
151
148
|
def width
|
@@ -157,17 +154,17 @@ module ChunkyPNG
|
|
157
154
|
def height
|
158
155
|
1 + (max_y - min_y)
|
159
156
|
end
|
160
|
-
|
157
|
+
|
161
158
|
# Returns the dimension of the minimal bounding rectangle of the points in this vector.
|
162
|
-
# @return [ChunkyPNG::Dimension] The dimension instance with the width and height
|
159
|
+
# @return [ChunkyPNG::Dimension] The dimension instance with the width and height
|
163
160
|
def dimension
|
164
161
|
ChunkyPNG::Dimension.new(width, height)
|
165
162
|
end
|
166
|
-
|
163
|
+
|
167
164
|
# @return [Array<ChunkyPNG::Point>] The list of points interpreted from the input array.
|
168
165
|
def self.multiple_from_array(source)
|
169
166
|
return [] if source.empty?
|
170
|
-
if source.first.
|
167
|
+
if source.first.is_a?(Numeric) || source.first =~ /^\d+$/
|
171
168
|
raise ArgumentError, "The points array is expected to have an even number of items!" if source.length % 2 != 0
|
172
169
|
|
173
170
|
points = []
|
@@ -177,7 +174,7 @@ module ChunkyPNG
|
|
177
174
|
source.map { |p| ChunkyPNG::Point(p) }
|
178
175
|
end
|
179
176
|
end
|
180
|
-
|
177
|
+
|
181
178
|
# @return [Array<ChunkyPNG::Point>] The list of points parsed from the string.
|
182
179
|
def self.multiple_from_string(source_str)
|
183
180
|
multiple_from_array(source_str.scan(/[\(\[\{]?(\d+)\s*[,x]?\s*(\d+)[\)\]\}]?/))
|
data/lib/chunky_png/version.rb
CHANGED
@@ -1,48 +1,48 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe ChunkyPNG::Canvas::Adam7Interlacing do
|
4
4
|
include ChunkyPNG::Canvas::Adam7Interlacing
|
5
5
|
|
6
|
-
describe
|
6
|
+
describe "#adam7_pass_sizes" do
|
7
7
|
it "should get the pass sizes for a 8x8 image correctly" do
|
8
8
|
expect(adam7_pass_sizes(8, 8)).to eql [
|
9
|
-
|
10
|
-
|
9
|
+
[1, 1], [1, 1], [2, 1], [2, 2], [4, 2], [4, 4], [8, 4],
|
10
|
+
]
|
11
11
|
end
|
12
12
|
|
13
13
|
it "should get the pass sizes for a 12x12 image correctly" do
|
14
14
|
expect(adam7_pass_sizes(12, 12)).to eql [
|
15
|
-
|
16
|
-
|
15
|
+
[2, 2], [1, 2], [3, 1], [3, 3], [6, 3], [6, 6], [12, 6],
|
16
|
+
]
|
17
17
|
end
|
18
18
|
|
19
19
|
it "should get the pass sizes for a 33x47 image correctly" do
|
20
20
|
expect(adam7_pass_sizes(33, 47)).to eql [
|
21
|
-
|
22
|
-
|
21
|
+
[5, 6], [4, 6], [9, 6], [8, 12], [17, 12], [16, 24], [33, 23],
|
22
|
+
]
|
23
23
|
end
|
24
24
|
|
25
25
|
it "should get the pass sizes for a 1x1 image correctly" do
|
26
26
|
expect(adam7_pass_sizes(1, 1)).to eql [
|
27
|
-
|
28
|
-
|
27
|
+
[1, 1], [0, 1], [1, 0], [0, 1], [1, 0], [0, 1], [1, 0],
|
28
|
+
]
|
29
29
|
end
|
30
30
|
|
31
31
|
it "should get the pass sizes for a 0x0 image correctly" do
|
32
32
|
expect(adam7_pass_sizes(0, 0)).to eql [
|
33
|
-
|
34
|
-
|
33
|
+
[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0],
|
34
|
+
]
|
35
35
|
end
|
36
36
|
|
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
|
-
expect(pass_sizes.inject(0) { |sum, (w, h)| sum + (w*h) }).to eql width * height
|
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
|
-
describe
|
45
|
+
describe "#adam7_multiplier_offset" do
|
46
46
|
it "should get the multiplier and offset values for pass 1 correctly" do
|
47
47
|
expect(adam7_multiplier_offset(0)).to eql [3, 0, 3, 0]
|
48
48
|
end
|
@@ -72,7 +72,7 @@ describe ChunkyPNG::Canvas::Adam7Interlacing do
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
-
describe
|
75
|
+
describe "#adam7_merge_pass" do
|
76
76
|
it "should merge the submatrices correctly" do
|
77
77
|
submatrices = [
|
78
78
|
ChunkyPNG::Canvas.new(1, 1, 168430335), # r = 10
|
@@ -84,23 +84,22 @@ describe ChunkyPNG::Canvas::Adam7Interlacing do
|
|
84
84
|
ChunkyPNG::Canvas.new(8, 4, 1175063295), # r = 70
|
85
85
|
]
|
86
86
|
|
87
|
-
canvas = ChunkyPNG::Image.new(8,8)
|
87
|
+
canvas = ChunkyPNG::Image.new(8, 8)
|
88
88
|
submatrices.each_with_index { |m, pass| adam7_merge_pass(pass, canvas, m) }
|
89
|
-
expect(canvas).to eql reference_image(
|
89
|
+
expect(canvas).to eql reference_image("adam7")
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
93
|
-
describe
|
94
|
-
before(:each) { @canvas = reference_canvas(
|
93
|
+
describe "#adam7_extract_pass" do
|
94
|
+
before(:each) { @canvas = reference_canvas("adam7") }
|
95
95
|
|
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
99
|
expect(sm.pixels.length).to eql sm.width * sm.height
|
100
100
|
expect(sm.pixels.uniq.length).to eql 1
|
101
|
-
expect(ChunkyPNG::Color.r(sm[0,0])).to eql pass * 10
|
101
|
+
expect(ChunkyPNG::Color.r(sm[0, 0])).to eql pass * 10
|
102
102
|
end
|
103
103
|
end
|
104
104
|
end
|
105
|
-
|
106
105
|
end
|
@@ -1,11 +1,14 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe ChunkyPNG::Canvas do
|
4
|
-
|
5
|
-
describe '#to_data_url' do
|
4
|
+
describe "#to_data_url" do
|
6
5
|
it "should export a sample canvas to an RGBA stream correctly" do
|
7
|
-
canvas = ChunkyPNG::Canvas.new(2, 2, [
|
8
|
-
|
6
|
+
canvas = ChunkyPNG::Canvas.new(2, 2, [
|
7
|
+
ChunkyPNG::Color.rgba(1, 2, 3, 4),
|
8
|
+
ChunkyPNG::Color.rgba(5, 6, 7, 8),
|
9
|
+
ChunkyPNG::Color.rgba(4, 3, 2, 1),
|
10
|
+
ChunkyPNG::Color.rgba(8, 7, 6, 5),
|
11
|
+
])
|
9
12
|
|
10
13
|
expect(canvas.to_data_url).to eql "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACAgMAAAAP2OW3AAAADFBMVEUBAgMEAwIFBgcIBwazgAAdAAAABHRSTlMEAQgFhYDlfQAAAAxJREFUeJxjUmAKAAAAwAB1GNhIEwAAAABJRU5ErkJggg=="
|
11
14
|
end
|
@@ -1,15 +1,14 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe ChunkyPNG::Canvas do
|
4
|
-
|
5
|
-
describe '.from_data_url' do
|
4
|
+
describe ".from_data_url" do
|
6
5
|
it "should import an image from a data URL" do
|
7
|
-
data_url = reference_canvas(
|
8
|
-
expect(ChunkyPNG::Canvas.from_data_url(data_url)).to eql reference_canvas(
|
6
|
+
data_url = reference_canvas("operations").to_data_url
|
7
|
+
expect(ChunkyPNG::Canvas.from_data_url(data_url)).to eql reference_canvas("operations")
|
9
8
|
end
|
10
9
|
|
11
10
|
it "should raise an exception if the string is not a proper data URL" do
|
12
|
-
expect { ChunkyPNG::Canvas.from_data_url(
|
11
|
+
expect { ChunkyPNG::Canvas.from_data_url("whatever") }.to raise_error(ChunkyPNG::SignatureMismatch)
|
13
12
|
end
|
14
13
|
end
|
15
14
|
end
|
@@ -1,12 +1,11 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe ChunkyPNG::Canvas::Drawing do
|
4
|
-
|
5
|
-
describe '#compose_pixel' do
|
4
|
+
describe "#compose_pixel" do
|
6
5
|
subject { ChunkyPNG::Canvas.new(1, 1, ChunkyPNG::Color.rgb(200, 150, 100)) }
|
7
6
|
|
8
7
|
it "should compose colors correctly" do
|
9
|
-
subject.compose_pixel(0,0, ChunkyPNG::Color(100, 150, 200, 128))
|
8
|
+
subject.compose_pixel(0, 0, ChunkyPNG::Color(100, 150, 200, 128))
|
10
9
|
expect(subject[0, 0]).to eql ChunkyPNG::Color(150, 150, 150)
|
11
10
|
end
|
12
11
|
|
@@ -20,11 +19,11 @@ describe ChunkyPNG::Canvas::Drawing do
|
|
20
19
|
end
|
21
20
|
end
|
22
21
|
|
23
|
-
describe
|
22
|
+
describe "#line" do
|
24
23
|
it "should draw lines correctly with anti-aliasing" do
|
25
|
-
|
26
24
|
canvas = ChunkyPNG::Canvas.new(31, 31, ChunkyPNG::Color::WHITE)
|
27
25
|
|
26
|
+
# rubocop:disable Layout/SpaceInsideParens # for improved readability
|
28
27
|
canvas.line( 0, 0, 30, 30, ChunkyPNG::Color::BLACK)
|
29
28
|
canvas.line( 0, 30, 30, 0, ChunkyPNG::Color::BLACK)
|
30
29
|
canvas.line(15, 30, 15, 0, ChunkyPNG::Color.rgba(200, 0, 0, 128))
|
@@ -33,13 +32,14 @@ describe ChunkyPNG::Canvas::Drawing do
|
|
33
32
|
canvas.line( 0, 15, 30, 0, ChunkyPNG::Color.rgba( 0, 200, 0, 128))
|
34
33
|
canvas.line( 0, 30, 15, 0, ChunkyPNG::Color.rgba( 0, 0, 200, 128), false)
|
35
34
|
canvas.line(15, 0, 30, 30, ChunkyPNG::Color.rgba( 0, 0, 200, 128))
|
35
|
+
# rubocop:enable Layout/SpaceInsideParens
|
36
36
|
|
37
|
-
expect(canvas).to eql reference_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
|
-
canvas.line(-5, -5, 0, 0,
|
42
|
+
canvas.line(-5, -5, 0, 0, "#000000")
|
43
43
|
expect(canvas.pixels).to eql [ChunkyPNG::Color::BLACK, ChunkyPNG::Color::WHITE]
|
44
44
|
end
|
45
45
|
|
@@ -47,15 +47,23 @@ describe ChunkyPNG::Canvas::Drawing do
|
|
47
47
|
canvas = ChunkyPNG::Canvas.new(16, 16, ChunkyPNG::Color::WHITE)
|
48
48
|
expect(canvas.line(1, 1, 10, 10, :black)).to equal(canvas)
|
49
49
|
end
|
50
|
+
|
51
|
+
it "should draw a single pixel when the start and end point are the same" do
|
52
|
+
canvas = ChunkyPNG::Canvas.new(5, 5, ChunkyPNG::Color::WHITE)
|
53
|
+
canvas.line(2, 2, 2, 2, ChunkyPNG::Color::BLACK)
|
54
|
+
|
55
|
+
non_white_pixels = canvas.pixels.count { |pixel| pixel != ChunkyPNG::Color::WHITE }
|
56
|
+
expect(non_white_pixels).to eql 1
|
57
|
+
end
|
50
58
|
end
|
51
59
|
|
52
|
-
describe
|
53
|
-
subject { ChunkyPNG::Canvas.new(16, 16,
|
60
|
+
describe "#rect" do
|
61
|
+
subject { ChunkyPNG::Canvas.new(16, 16, "#ffffff") }
|
54
62
|
|
55
63
|
it "should draw a rectangle with the correct colors" do
|
56
|
-
subject.rect(1, 1, 10, 10, ChunkyPNG::Color.rgba(0, 255, 0,
|
64
|
+
subject.rect(1, 1, 10, 10, ChunkyPNG::Color.rgba(0, 255, 0, 80), ChunkyPNG::Color.rgba(255, 0, 0, 100))
|
57
65
|
subject.rect(5, 5, 14, 14, ChunkyPNG::Color.rgba(0, 0, 255, 160), ChunkyPNG::Color.rgba(255, 255, 0, 100))
|
58
|
-
expect(subject).to eql reference_canvas(
|
66
|
+
expect(subject).to eql reference_canvas("rect")
|
59
67
|
end
|
60
68
|
|
61
69
|
it "should return itself to allow chaining" do
|
@@ -73,19 +81,19 @@ describe ChunkyPNG::Canvas::Drawing do
|
|
73
81
|
end
|
74
82
|
end
|
75
83
|
|
76
|
-
describe
|
84
|
+
describe "#circle" do
|
77
85
|
subject { ChunkyPNG::Canvas.new(32, 32, ChunkyPNG::Color.rgba(0, 0, 255, 128)) }
|
78
86
|
|
79
87
|
it "should draw circles" do
|
80
|
-
subject.circle(11, 11, 10, ChunkyPNG::Color(
|
81
|
-
subject.circle(21, 21, 10, ChunkyPNG::Color(
|
82
|
-
expect(subject).to eql reference_canvas(
|
88
|
+
subject.circle(11, 11, 10, ChunkyPNG::Color("red @ 0.5"), ChunkyPNG::Color("white @ 0.2"))
|
89
|
+
subject.circle(21, 21, 10, ChunkyPNG::Color("green @ 0.5"))
|
90
|
+
expect(subject).to eql reference_canvas("circles")
|
83
91
|
end
|
84
92
|
|
85
93
|
it "should draw partial circles when going of the canvas bounds" do
|
86
94
|
subject.circle(0, 0, 10, ChunkyPNG::Color(:red))
|
87
95
|
subject.circle(31, 16, 10, ChunkyPNG::Color(:black), ChunkyPNG::Color(:white, 0xaa))
|
88
|
-
expect(subject).to eql reference_canvas(
|
96
|
+
expect(subject).to eql reference_canvas("partial_circles")
|
89
97
|
end
|
90
98
|
|
91
99
|
it "should return itself to allow chaining" do
|
@@ -93,78 +101,78 @@ describe ChunkyPNG::Canvas::Drawing do
|
|
93
101
|
end
|
94
102
|
end
|
95
103
|
|
96
|
-
describe
|
104
|
+
describe "#polygon" do
|
97
105
|
subject { ChunkyPNG::Canvas.new(22, 22) }
|
98
106
|
|
99
107
|
it "should draw an filled triangle when using 3 control points" do
|
100
|
-
subject.polygon(
|
101
|
-
expect(subject).to eql reference_canvas(
|
108
|
+
subject.polygon("(2,2) (20,5) (5,20)", ChunkyPNG::Color(:black, 0xaa), ChunkyPNG::Color(:red, 0x44))
|
109
|
+
expect(subject).to eql reference_canvas("polygon_triangle_filled")
|
102
110
|
end
|
103
111
|
|
104
112
|
it "should draw a unfilled polygon with 6 control points" do
|
105
|
-
subject.polygon(
|
106
|
-
expect(subject).to eql reference_canvas(
|
113
|
+
subject.polygon("(2,2) (12, 1) (20,5) (18,18) (5,20) (1,12)", ChunkyPNG::Color(:black))
|
114
|
+
expect(subject).to eql reference_canvas("polygon_unfilled")
|
107
115
|
end
|
108
116
|
|
109
117
|
it "should draw a vertically crossed filled polygon with 4 control points" do
|
110
|
-
subject.polygon(
|
111
|
-
expect(subject).to eql reference_canvas(
|
118
|
+
subject.polygon("(2,2) (21,2) (2,21) (21,21)", ChunkyPNG::Color(:black), ChunkyPNG::Color(:red))
|
119
|
+
expect(subject).to eql reference_canvas("polygon_filled_vertical")
|
112
120
|
end
|
113
121
|
|
114
122
|
it "should draw a vertically crossed filled polygon with 4 control points" do
|
115
|
-
subject.polygon(
|
116
|
-
expect(subject).to eql reference_canvas(
|
123
|
+
subject.polygon("(2,2) (2,21) (21,2) (21,21)", ChunkyPNG::Color(:black), ChunkyPNG::Color(:red))
|
124
|
+
expect(subject).to eql reference_canvas("polygon_filled_horizontal")
|
117
125
|
end
|
118
126
|
|
119
127
|
it "should return itself to allow chaining" do
|
120
|
-
expect(subject.polygon(
|
128
|
+
expect(subject.polygon("(2,2) (20,5) (5,20)")).to equal(subject)
|
121
129
|
end
|
122
130
|
end
|
123
131
|
|
124
|
-
describe
|
132
|
+
describe "#bezier_curve" do
|
125
133
|
subject { ChunkyPNG::Canvas.new(24, 24, ChunkyPNG::Color::WHITE) }
|
126
134
|
|
127
135
|
it "should draw a bezier curve starting at the first point" do
|
128
|
-
subject.bezier_curve(
|
136
|
+
subject.bezier_curve("3,20 10,10, 20,20")
|
129
137
|
expect(subject[3, 20]).to eql ChunkyPNG::Color::BLACK
|
130
138
|
end
|
131
139
|
|
132
140
|
it "should draw a bezier curve ending at the last point" do
|
133
|
-
subject.bezier_curve(
|
141
|
+
subject.bezier_curve("3,20 10,10, 20,20")
|
134
142
|
expect(subject[20, 20]).to eql ChunkyPNG::Color::BLACK
|
135
143
|
end
|
136
144
|
|
137
145
|
it "should draw a bezier curve with a color of green" do
|
138
|
-
subject.bezier_curve(
|
146
|
+
subject.bezier_curve("3,20 10,10, 20,20", :green)
|
139
147
|
expect(subject[3, 20]).to eql ChunkyPNG::Color(:green)
|
140
148
|
end
|
141
149
|
|
142
150
|
it "should draw a three point bezier curve" do
|
143
|
-
expect(subject.bezier_curve(
|
151
|
+
expect(subject.bezier_curve("1,23 12,10 23,23")).to eql reference_canvas("bezier_three_point")
|
144
152
|
end
|
145
153
|
|
146
154
|
it "should draw a three point bezier curve flipped" do
|
147
|
-
expect(subject.bezier_curve(
|
155
|
+
expect(subject.bezier_curve("1,1 12,15 23,1")).to eql reference_canvas("bezier_three_point_flipped")
|
148
156
|
end
|
149
157
|
|
150
158
|
it "should draw a four point bezier curve" do
|
151
|
-
expect(subject.bezier_curve(
|
159
|
+
expect(subject.bezier_curve("1,23 1,5 22,5 22,23")).to eql reference_canvas("bezier_four_point")
|
152
160
|
end
|
153
161
|
|
154
162
|
it "should draw a four point bezier curve flipped" do
|
155
|
-
expect(subject.bezier_curve(
|
163
|
+
expect(subject.bezier_curve("1,1 1,19 22,19 22,1")).to eql reference_canvas("bezier_four_point_flipped")
|
156
164
|
end
|
157
165
|
|
158
166
|
it "should draw a four point bezier curve with a shape of an s" do
|
159
|
-
expect(subject.bezier_curve(
|
167
|
+
expect(subject.bezier_curve("1,23 1,5 22,23 22,5")).to eql reference_canvas("bezier_four_point_s")
|
160
168
|
end
|
161
169
|
|
162
170
|
it "should draw a five point bezier curve" do
|
163
|
-
expect(subject.bezier_curve(
|
171
|
+
expect(subject.bezier_curve("10,23 1,10 12,5 23,10 14,23")).to eql reference_canvas("bezier_five_point")
|
164
172
|
end
|
165
173
|
|
166
174
|
it "should draw a six point bezier curve" do
|
167
|
-
expect(subject.bezier_curve(
|
175
|
+
expect(subject.bezier_curve("1,23 4,15 8,20 2,2 23,15 23,1")).to eql reference_canvas("bezier_six_point")
|
168
176
|
end
|
169
177
|
end
|
170
178
|
end
|