chunky_png 0.7.1 → 0.7.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.
- data/chunky_png.gemspec +2 -2
- data/lib/chunky_png.rb +27 -1
- data/lib/chunky_png/canvas.rb +1 -1
- data/lib/chunky_png/canvas/operations.rb +3 -3
- data/lib/chunky_png/canvas/png_decoding.rb +6 -6
- data/lib/chunky_png/canvas/png_encoding.rb +4 -4
- data/lib/chunky_png/chunk.rb +2 -2
- data/lib/chunky_png/color.rb +2 -2
- data/lib/chunky_png/datastream.rb +3 -1
- metadata +3 -3
data/chunky_png.gemspec
CHANGED
@@ -3,8 +3,8 @@ Gem::Specification.new do |s|
|
|
3
3
|
|
4
4
|
# Do not change the version and date fields by hand. This will be done
|
5
5
|
# automatically by the gem release script.
|
6
|
-
s.version = "0.7.
|
7
|
-
s.date = "2010-
|
6
|
+
s.version = "0.7.3"
|
7
|
+
s.date = "2010-04-29"
|
8
8
|
|
9
9
|
s.summary = "Pure ruby library for read/write, chunk-level access to PNG files"
|
10
10
|
s.description = <<-EOT
|
data/lib/chunky_png.rb
CHANGED
@@ -27,7 +27,7 @@ module ChunkyPNG
|
|
27
27
|
|
28
28
|
# The current version of ChunkyPNG. This value will be updated automatically
|
29
29
|
# by them gem:release rake task.
|
30
|
-
VERSION = "0.7.
|
30
|
+
VERSION = "0.7.3"
|
31
31
|
|
32
32
|
###################################################
|
33
33
|
# PNG international standard defined constants
|
@@ -51,4 +51,30 @@ module ChunkyPNG
|
|
51
51
|
FILTER_UP = 2
|
52
52
|
FILTER_AVERAGE = 3
|
53
53
|
FILTER_PAETH = 4
|
54
|
+
|
55
|
+
###################################################
|
56
|
+
# ChunkyPNG exception classes
|
57
|
+
###################################################
|
58
|
+
|
59
|
+
# Default exception class for ChunkyPNG
|
60
|
+
class Exception < ::StandardError
|
61
|
+
end
|
62
|
+
|
63
|
+
# Exception that is raised for an unsopported PNG image.
|
64
|
+
class NotSupported < ChunkyPNG::Exception
|
65
|
+
end
|
66
|
+
|
67
|
+
# Exception that is raised if the PNG signature is not encountered at the
|
68
|
+
# beginning of the file.
|
69
|
+
class SignatureMismatch < ChunkyPNG::Exception
|
70
|
+
end
|
71
|
+
|
72
|
+
# Exception that is raised if the CRC check for a block failes
|
73
|
+
class CRCMismatch < ChunkyPNG::Exception
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
# Exception that is raised if an expectation fails.
|
78
|
+
class ExpectationFailed < ChunkyPNG::Exception
|
79
|
+
end
|
54
80
|
end
|
data/lib/chunky_png/canvas.rb
CHANGED
@@ -64,7 +64,7 @@ module ChunkyPNG
|
|
64
64
|
elsif initial.kind_of?(Array) && initial.size == width * height
|
65
65
|
@pixels = initial
|
66
66
|
else
|
67
|
-
raise "Cannot use this value as initial canvas: #{initial.inspect}!"
|
67
|
+
raise ChunkyPNG::ExpectationFailed, "Cannot use this value as initial canvas: #{initial.inspect}!"
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
@@ -53,15 +53,15 @@ module ChunkyPNG
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def change_mask_color!(new_color)
|
56
|
-
raise "This is not a mask image!" if palette.opaque_palette.size != 1
|
56
|
+
raise ChunkyPNG::ExpectationFailed, "This is not a mask image!" if palette.opaque_palette.size != 1
|
57
57
|
pixels.map! { |pixel| (new_color & 0xffffff00) | ChunkyPNG::Color.a(pixel) }
|
58
58
|
end
|
59
59
|
|
60
60
|
protected
|
61
61
|
|
62
62
|
def check_size_constraints!(other, offset_x, offset_y)
|
63
|
-
raise "Background image width is too small!" if width < other.width + offset_x
|
64
|
-
raise "Background image height is too small!" if height < other.height + offset_y
|
63
|
+
raise ChunkyPNG::ExpectationFailed, "Background image width is too small!" if width < other.width + offset_x
|
64
|
+
raise ChunkyPNG::ExpectationFailed, "Background image height is too small!" if height < other.height + offset_y
|
65
65
|
end
|
66
66
|
end
|
67
67
|
end
|
@@ -61,7 +61,7 @@ module ChunkyPNG
|
|
61
61
|
# @param [ChunkyPNG::Datastream] ds The datastream to decode.
|
62
62
|
# @return [ChunkyPNG::Canvas] The canvas decoded from the PNG datastream.
|
63
63
|
def from_datastream(ds)
|
64
|
-
raise "Only 8-bit color depth is currently supported by ChunkyPNG!" unless ds.header_chunk.depth == 8
|
64
|
+
raise ChunkyPNG::NotSupported, "Only 8-bit color depth is currently supported by ChunkyPNG!" unless ds.header_chunk.depth == 8
|
65
65
|
|
66
66
|
width = ds.header_chunk.width
|
67
67
|
height = ds.header_chunk.height
|
@@ -83,12 +83,12 @@ module ChunkyPNG
|
|
83
83
|
# @param [Integer] interlace The interlace method of the encoded pixelstream.
|
84
84
|
# @return [ChunkyPNG::Canvas] The decoded Canvas instance.
|
85
85
|
def decode_png_pixelstream(stream, width, height, color_mode = ChunkyPNG::COLOR_TRUECOLOR, interlace = ChunkyPNG::INTERLACING_NONE)
|
86
|
-
raise "This palette is not suitable for decoding!" if decoding_palette && !decoding_palette.can_decode?
|
86
|
+
raise ChunkyPNG::ExpectationFailed, "This palette is not suitable for decoding!" if decoding_palette && !decoding_palette.can_decode?
|
87
87
|
|
88
88
|
return case interlace
|
89
89
|
when ChunkyPNG::INTERLACING_NONE then decode_png_without_interlacing(stream, width, height, color_mode)
|
90
90
|
when ChunkyPNG::INTERLACING_ADAM7 then decode_png_with_adam7_interlacing(stream, width, height, color_mode)
|
91
|
-
else raise "Don't know how the handle interlacing method #{interlace}!"
|
91
|
+
else raise ChunkyPNG::NotSupported, "Don't know how the handle interlacing method #{interlace}!"
|
92
92
|
end
|
93
93
|
end
|
94
94
|
|
@@ -146,13 +146,13 @@ module ChunkyPNG
|
|
146
146
|
when ChunkyPNG::COLOR_INDEXED then lambda { |bytes| decoding_palette[bytes.first] }
|
147
147
|
when ChunkyPNG::COLOR_GRAYSCALE then lambda { |bytes| ChunkyPNG::Color.grayscale(*bytes) }
|
148
148
|
when ChunkyPNG::COLOR_GRAYSCALE_ALPHA then lambda { |bytes| ChunkyPNG::Color.grayscale_alpha(*bytes) }
|
149
|
-
else raise "No suitable pixel decoder found for color mode #{color_mode}!"
|
149
|
+
else raise ChunkyPNG::NotSupported, "No suitable pixel decoder found for color mode #{color_mode}!"
|
150
150
|
end
|
151
151
|
|
152
152
|
pixels = []
|
153
153
|
if width > 0
|
154
154
|
|
155
|
-
raise "Invalid stream length!" unless stream.length - start_pos >= width * height * pixel_size + height
|
155
|
+
raise ChunkyPNG::ExpectationFailed, "Invalid stream length!" unless stream.length - start_pos >= width * height * pixel_size + height
|
156
156
|
|
157
157
|
decoded_bytes = Array.new(width * pixel_size, 0)
|
158
158
|
for line_no in 0...height do
|
@@ -193,7 +193,7 @@ module ChunkyPNG
|
|
193
193
|
when ChunkyPNG::FILTER_UP then decode_png_scanline_up( bytes, previous_bytes, pixelsize)
|
194
194
|
when ChunkyPNG::FILTER_AVERAGE then decode_png_scanline_average( bytes, previous_bytes, pixelsize)
|
195
195
|
when ChunkyPNG::FILTER_PAETH then decode_png_scanline_paeth( bytes, previous_bytes, pixelsize)
|
196
|
-
else raise "Unknown filter type"
|
196
|
+
else raise ChunkyPNG::NotSupported, "Unknown filter type: #{filter}!"
|
197
197
|
end
|
198
198
|
end
|
199
199
|
|
@@ -125,13 +125,13 @@ module ChunkyPNG
|
|
125
125
|
def encode_png_pixelstream(color_mode = ChunkyPNG::COLOR_TRUECOLOR, interlace = ChunkyPNG::INTERLACING_NONE, compression = ZLib::DEFAULT_COMPRESSION)
|
126
126
|
|
127
127
|
if color_mode == ChunkyPNG::COLOR_INDEXED && (encoding_palette.nil? || !encoding_palette.can_encode?)
|
128
|
-
raise "This palette is not suitable for encoding!"
|
128
|
+
raise ChunkyPNG::ExpectationFailed, "This palette is not suitable for encoding!"
|
129
129
|
end
|
130
130
|
|
131
131
|
case interlace
|
132
132
|
when ChunkyPNG::INTERLACING_NONE then encode_png_image_without_interlacing(color_mode, compression)
|
133
133
|
when ChunkyPNG::INTERLACING_ADAM7 then encode_png_image_with_interlacing(color_mode, compression)
|
134
|
-
else raise "Unknown interlacing method!"
|
134
|
+
else raise ChunkyPNG::NotSupported, "Unknown interlacing method: #{interlace}!"
|
135
135
|
end
|
136
136
|
end
|
137
137
|
|
@@ -188,7 +188,7 @@ module ChunkyPNG
|
|
188
188
|
when ChunkyPNG::COLOR_INDEXED then lambda { |color| [encoding_palette.index(color)] }
|
189
189
|
when ChunkyPNG::COLOR_GRAYSCALE then lambda { |color| Color.to_grayscale_bytes(color) }
|
190
190
|
when ChunkyPNG::COLOR_GRAYSCALE_ALPHA then lambda { |color| Color.to_grayscale_alpha_bytes(color) }
|
191
|
-
else raise "Cannot encode pixels for this mode: #{color_mode}!"
|
191
|
+
else raise ChunkyPNG::NotSupported, "Cannot encode pixels for this mode: #{color_mode}!"
|
192
192
|
end
|
193
193
|
|
194
194
|
previous_bytes = Array.new(pixel_size * width, 0)
|
@@ -223,7 +223,7 @@ module ChunkyPNG
|
|
223
223
|
when ChunkyPNG::FILTER_UP then encode_png_scanline_up( bytes, previous_bytes, pixelsize)
|
224
224
|
when ChunkyPNG::FILTER_AVERAGE then encode_png_scanline_average( bytes, previous_bytes, pixelsize)
|
225
225
|
when ChunkyPNG::FILTER_PAETH then encode_png_scanline_paeth( bytes, previous_bytes, pixelsize)
|
226
|
-
else raise "Unknown filter type"
|
226
|
+
else raise ChunkyPNG::NotSupported, "Unknown filter type: #{filter}!"
|
227
227
|
end
|
228
228
|
end
|
229
229
|
|
data/lib/chunky_png/chunk.rb
CHANGED
@@ -36,7 +36,7 @@ module ChunkyPNG
|
|
36
36
|
# is not equal to the expected CRC value.
|
37
37
|
def self.verify_crc!(type, content, found_crc)
|
38
38
|
expected_crc = Zlib.crc32(content, Zlib.crc32(type))
|
39
|
-
raise "Chuck CRC mismatch!" if found_crc != expected_crc
|
39
|
+
raise ChunkyPNG::CRCMismatch, "Chuck CRC mismatch!" if found_crc != expected_crc
|
40
40
|
end
|
41
41
|
|
42
42
|
# The base chunk class is the superclass for every chunk type. It contains
|
@@ -246,7 +246,7 @@ module ChunkyPNG
|
|
246
246
|
|
247
247
|
def self.read(type, content)
|
248
248
|
keyword, compression, value = content.unpack('Z*Ca*')
|
249
|
-
raise "Compression method #{compression.inspect} not supported!" unless compression == ChunkyPNG::COMPRESSION_DEFAULT
|
249
|
+
raise ChunkyPNG::NotSupported, "Compression method #{compression.inspect} not supported!" unless compression == ChunkyPNG::COMPRESSION_DEFAULT
|
250
250
|
new(keyword, Zlib::Inflate.inflate(value))
|
251
251
|
end
|
252
252
|
|
data/lib/chunky_png/color.rb
CHANGED
@@ -82,7 +82,7 @@ module ChunkyPNG
|
|
82
82
|
case str
|
83
83
|
when /^(?:#|0x)?([0-9a-f]{6})$/i then ($1.hex << 8) | 0xff
|
84
84
|
when /^(?:#|0x)?([0-9a-f]{8})$/i then $1.hex
|
85
|
-
else raise "Not a valid hex color notation: #{str.inspect}!"
|
85
|
+
else raise ChunkyPNG::ExpectationFailed, "Not a valid hex color notation: #{str.inspect}!"
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
@@ -396,7 +396,7 @@ module ChunkyPNG
|
|
396
396
|
when ChunkyPNG::COLOR_TRUECOLOR_ALPHA then 4
|
397
397
|
when ChunkyPNG::COLOR_GRAYSCALE then 1
|
398
398
|
when ChunkyPNG::COLOR_GRAYSCALE_ALPHA then 2
|
399
|
-
else raise "Don't know the bytesize of pixels in this colormode: #{color_mode}!"
|
399
|
+
else raise ChunkyPNG::NotSupported, "Don't know the bytesize of pixels in this colormode: #{color_mode}!"
|
400
400
|
end
|
401
401
|
end
|
402
402
|
end
|
@@ -98,7 +98,9 @@ module ChunkyPNG
|
|
98
98
|
# the beginning of the stream.
|
99
99
|
def verify_signature!(io)
|
100
100
|
signature = io.read(ChunkyPNG::Datastream::SIGNATURE.length)
|
101
|
-
|
101
|
+
unless signature == ChunkyPNG::Datastream::SIGNATURE
|
102
|
+
raise ChunkyPNG::SignatureMismatch, "PNG signature not found!"
|
103
|
+
end
|
102
104
|
end
|
103
105
|
end
|
104
106
|
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 7
|
8
|
-
-
|
9
|
-
version: 0.7.
|
8
|
+
- 3
|
9
|
+
version: 0.7.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Willem van Bergen
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-04-29 00:00:00 +02:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|