pnm 0.3.2 → 0.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/.yardopts +1 -0
- data/README.md +1 -0
- data/lib/pnm.rb +6 -19
- data/lib/pnm/converter.rb +5 -4
- data/lib/pnm/image.rb +24 -15
- data/lib/pnm/parser.rb +7 -6
- data/lib/pnm/version.rb +2 -2
- data/pnm.gemspec +1 -0
- data/test/test_image.rb +6 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d7322d852ff78a5d37b2b0b15dcecc9780cec7ed
|
4
|
+
data.tar.gz: 0583fe925b357baed8eb99f57d3a202340f839fe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf955fa0db64c7b42676f332a37f65b72cc6049fb28d7cba270a08fbf1c62a234508cd9ee8e01bd0bfb27d937235dd54b83c1d7b3ed9bad5f98387abde622fc2
|
7
|
+
data.tar.gz: b603ee0e3e53392553af4e121ff1cd62160116600fc037ad7016effbcab0c4a4c8635daf71dfb67de2840babab9005a7caf30904a71f682b941b1aaacbaa4284
|
data/.yardopts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--no-private
|
data/README.md
CHANGED
data/lib/pnm.rb
CHANGED
@@ -40,6 +40,7 @@ require_relative 'pnm/exceptions'
|
|
40
40
|
#
|
41
41
|
# # retrieve some image properties
|
42
42
|
# image.info # => "PGM 3x2 Grayscale"
|
43
|
+
# image.type # => :pgm
|
43
44
|
# image.width # => 3
|
44
45
|
# image.height # => 2
|
45
46
|
#
|
@@ -83,28 +84,13 @@ require_relative 'pnm/exceptions'
|
|
83
84
|
#
|
84
85
|
# License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
|
85
86
|
#
|
86
|
-
#--
|
87
|
-
#
|
88
|
-
# == PNM magic numbers
|
89
|
-
#
|
90
|
-
# Magic Number Type Encoding
|
91
|
-
# ------------ ---------------- -------
|
92
|
-
# P1 Portable bitmap ASCII
|
93
|
-
# P2 Portable graymap ASCII
|
94
|
-
# P3 Portable pixmap ASCII
|
95
|
-
# P4 Portable bitmap Binary
|
96
|
-
# P5 Portable graymap Binary
|
97
|
-
# P6 Portable pixmap Binary
|
98
|
-
#
|
99
|
-
#++
|
100
|
-
#
|
101
87
|
module PNM
|
102
88
|
|
103
|
-
LIBNAME = 'pnm'
|
104
|
-
HOMEPAGE = 'https://github.com/stomar/pnm'
|
105
|
-
TAGLINE = 'create/read/write PNM image files (PBM, PGM, PPM)'
|
89
|
+
LIBNAME = 'pnm'
|
90
|
+
HOMEPAGE = 'https://github.com/stomar/pnm'
|
91
|
+
TAGLINE = 'create/read/write PNM image files (PBM, PGM, PPM)'
|
106
92
|
|
107
|
-
COPYRIGHT = <<-copyright.gsub(/^ +/, '')
|
93
|
+
COPYRIGHT = <<-copyright.gsub(/^ +/, '')
|
108
94
|
Copyright (C) 2013-2014 Marcus Stollsteimer.
|
109
95
|
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
|
110
96
|
This is free software: you are free to change and redistribute it.
|
@@ -162,6 +148,7 @@ module PNM
|
|
162
148
|
Image.new(pixels, options)
|
163
149
|
end
|
164
150
|
|
151
|
+
# @private
|
165
152
|
def self.magic_number # :nodoc:
|
166
153
|
{
|
167
154
|
:pbm => {:ascii => 'P1', :binary => 'P4'},
|
data/lib/pnm/converter.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
module PNM
|
2
2
|
|
3
|
+
# @private
|
3
4
|
# Converter for pixel data. Only for internal usage.
|
4
|
-
class Converter
|
5
|
+
class Converter # :nodoc:
|
5
6
|
|
6
7
|
# Returns the number of bytes needed for one row of pixels
|
7
8
|
# (in binary encoding).
|
8
|
-
def self.byte_width(type, width)
|
9
|
+
def self.byte_width(type, width)
|
9
10
|
case type
|
10
11
|
when :pbm
|
11
12
|
(width - 1) / 8 + 1
|
@@ -103,7 +104,7 @@ module PNM
|
|
103
104
|
data_string
|
104
105
|
end
|
105
106
|
|
106
|
-
def self.convert_to_integers(data, type)
|
107
|
+
def self.convert_to_integers(data, type)
|
107
108
|
if type == :pbm
|
108
109
|
values_as_string = data.gsub(/[ \t\r\n]+/, '').split('')
|
109
110
|
else
|
@@ -121,7 +122,7 @@ module PNM
|
|
121
122
|
end
|
122
123
|
end
|
123
124
|
|
124
|
-
def self.assert_data_size(actual, expected)
|
125
|
+
def self.assert_data_size(actual, expected)
|
125
126
|
unless actual == expected
|
126
127
|
raise PNM::DataSizeError, 'data size does not match expected size'
|
127
128
|
end
|
data/lib/pnm/image.rb
CHANGED
@@ -113,9 +113,18 @@ module PNM
|
|
113
113
|
|
114
114
|
alias :to_s :info
|
115
115
|
|
116
|
+
# Returns a string representation for debugging.
|
117
|
+
def inspect
|
118
|
+
if type == :pbm
|
119
|
+
"#<%s:0x%x %s>" % [self.class.name, object_id, info]
|
120
|
+
else
|
121
|
+
"#<%s:0x%x %s, maxgray=%d>" % [self.class.name, object_id, info, maxgray]
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
116
125
|
private
|
117
126
|
|
118
|
-
def type_string
|
127
|
+
def type_string
|
119
128
|
case type
|
120
129
|
when :pbm
|
121
130
|
'Bilevel'
|
@@ -126,7 +135,7 @@ module PNM
|
|
126
135
|
end
|
127
136
|
end
|
128
137
|
|
129
|
-
def detect_type(pixels, maxgray)
|
138
|
+
def detect_type(pixels, maxgray)
|
130
139
|
if pixels.first.first.kind_of?(Array)
|
131
140
|
:ppm
|
132
141
|
elsif (maxgray && maxgray > 1) || pixels.flatten.max > 1
|
@@ -136,7 +145,7 @@ module PNM
|
|
136
145
|
end
|
137
146
|
end
|
138
147
|
|
139
|
-
def assert_valid_array
|
148
|
+
def assert_valid_array
|
140
149
|
msg = "invalid pixel data: Array expected"
|
141
150
|
raise PNM::ArgumentError, msg unless Array === pixels
|
142
151
|
|
@@ -157,14 +166,14 @@ module PNM
|
|
157
166
|
end
|
158
167
|
end
|
159
168
|
|
160
|
-
def assert_valid_pixel(pixel)
|
169
|
+
def assert_valid_pixel(pixel)
|
161
170
|
unless Fixnum === pixel
|
162
171
|
msg = "invalid pixel value: Fixnum expected - #{pixel.inspect}"
|
163
172
|
raise PNM::DataError, msg
|
164
173
|
end
|
165
174
|
end
|
166
175
|
|
167
|
-
def assert_valid_color_pixel(pixel)
|
176
|
+
def assert_valid_color_pixel(pixel)
|
168
177
|
unless Array === pixel && pixel.map(&:class) == [Fixnum, Fixnum, Fixnum]
|
169
178
|
msg = "invalid pixel value: "
|
170
179
|
msg << "Array of 3 Fixnums expected - #{pixel.inspect}"
|
@@ -173,33 +182,33 @@ module PNM
|
|
173
182
|
end
|
174
183
|
end
|
175
184
|
|
176
|
-
def assert_valid_type
|
185
|
+
def assert_valid_type
|
177
186
|
unless [:pbm, :pgm, :ppm].include?(type)
|
178
187
|
msg = "invalid image type - #{type.inspect}"
|
179
188
|
raise PNM::ArgumentError, msg
|
180
189
|
end
|
181
190
|
end
|
182
191
|
|
183
|
-
def assert_matching_type_and_data
|
192
|
+
def assert_matching_type_and_data
|
184
193
|
if Array === pixels.first.first && [:pbm, :pgm].include?(type)
|
185
194
|
msg = "specified type does not match data - #{type.inspect}"
|
186
195
|
raise PNM::DataError, msg
|
187
196
|
end
|
188
197
|
end
|
189
198
|
|
190
|
-
def assert_valid_maxgray
|
199
|
+
def assert_valid_maxgray
|
191
200
|
unless Fixnum === maxgray && maxgray > 0 && maxgray <= 255
|
192
201
|
raise PNM::ArgumentError, "invalid maxgray value - #{maxgray.inspect}"
|
193
202
|
end
|
194
203
|
end
|
195
204
|
|
196
|
-
def assert_valid_comment
|
205
|
+
def assert_valid_comment
|
197
206
|
unless String === comment
|
198
207
|
raise PNM::ArgumentError, "invalid comment value - #{comment.inspect}"
|
199
208
|
end
|
200
209
|
end
|
201
210
|
|
202
|
-
def assert_valid_pixel_values
|
211
|
+
def assert_valid_pixel_values
|
203
212
|
unless pixels.flatten.max <= maxgray
|
204
213
|
raise PNM::DataError, "invalid data: value(s) greater than maxgray"
|
205
214
|
end
|
@@ -208,7 +217,7 @@ module PNM
|
|
208
217
|
end
|
209
218
|
end
|
210
219
|
|
211
|
-
def header(encoding)
|
220
|
+
def header(encoding)
|
212
221
|
header = "#{PNM.magic_number[type][encoding]}\n"
|
213
222
|
comment_lines.each do |line|
|
214
223
|
header << (line.empty? ? "#\n" : "# #{line}\n")
|
@@ -219,7 +228,7 @@ module PNM
|
|
219
228
|
header
|
220
229
|
end
|
221
230
|
|
222
|
-
def comment_lines
|
231
|
+
def comment_lines
|
223
232
|
return [] unless comment
|
224
233
|
return [''] if comment.empty?
|
225
234
|
|
@@ -227,19 +236,19 @@ module PNM
|
|
227
236
|
comment.split(/\n/, keep_trailing_null_fields)
|
228
237
|
end
|
229
238
|
|
230
|
-
def to_ascii
|
239
|
+
def to_ascii
|
231
240
|
data_string = Converter.array2ascii(pixels)
|
232
241
|
|
233
242
|
header(:ascii) << data_string
|
234
243
|
end
|
235
244
|
|
236
|
-
def to_binary
|
245
|
+
def to_binary
|
237
246
|
data_string = Converter.array2binary(type, pixels)
|
238
247
|
|
239
248
|
header(:binary) << data_string
|
240
249
|
end
|
241
250
|
|
242
|
-
def gray_to_rgb(gray_value)
|
251
|
+
def gray_to_rgb(gray_value)
|
243
252
|
Array.new(3, gray_value)
|
244
253
|
end
|
245
254
|
end
|
data/lib/pnm/parser.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
module PNM
|
2
2
|
|
3
|
+
# @private
|
3
4
|
# Parser for PNM image files. Only for internal usage.
|
4
|
-
class Parser
|
5
|
+
class Parser # :nodoc:
|
5
6
|
|
6
7
|
# Parses PNM image data.
|
7
8
|
#
|
@@ -71,7 +72,7 @@ module PNM
|
|
71
72
|
result
|
72
73
|
end
|
73
74
|
|
74
|
-
def self.token_number
|
75
|
+
def self.token_number
|
75
76
|
{
|
76
77
|
'P1' => 2,
|
77
78
|
'P2' => 3,
|
@@ -82,7 +83,7 @@ module PNM
|
|
82
83
|
}
|
83
84
|
end
|
84
85
|
|
85
|
-
def self.next_token!(content)
|
86
|
+
def self.next_token!(content)
|
86
87
|
delimiter = if content.start_with?('#')
|
87
88
|
"\n"
|
88
89
|
else
|
@@ -97,21 +98,21 @@ module PNM
|
|
97
98
|
token
|
98
99
|
end
|
99
100
|
|
100
|
-
def self.assert_valid_magic_number(magic_number)
|
101
|
+
def self.assert_valid_magic_number(magic_number)
|
101
102
|
unless %w{P1 P2 P3 P4 P5 P6}.include?(magic_number)
|
102
103
|
msg = "unknown magic number - `#{magic_number}'"
|
103
104
|
raise PNM::ParserError, msg
|
104
105
|
end
|
105
106
|
end
|
106
107
|
|
107
|
-
def self.assert_integer(value_string, value_name)
|
108
|
+
def self.assert_integer(value_string, value_name)
|
108
109
|
unless /\A[0-9]+\Z/ === value_string
|
109
110
|
msg = "#{value_name} must be an integer - `#{value_string}'"
|
110
111
|
raise PNM::ParserError, msg
|
111
112
|
end
|
112
113
|
end
|
113
114
|
|
114
|
-
def self.assert_value(value, name)
|
115
|
+
def self.assert_value(value, name)
|
115
116
|
unless yield(value)
|
116
117
|
msg = "invalid #{name} value - `#{value}'"
|
117
118
|
raise PNM::ParserError, msg
|
data/lib/pnm/version.rb
CHANGED
data/pnm.gemspec
CHANGED
data/test/test_image.rb
CHANGED
@@ -162,6 +162,12 @@ describe PNM::Image do
|
|
162
162
|
@color.info.must_equal 'PPM 5x3 Color'
|
163
163
|
end
|
164
164
|
|
165
|
+
it 'can return meaningful debugging information' do
|
166
|
+
@bilevel.inspect.must_match %r{^#<PNM::Image:0x\h+ PBM 5x6 Bilevel>$}
|
167
|
+
@grayscale.inspect.must_match %r{^#<PNM::Image:0x\h+ PGM 4x3 Grayscale, maxgray=250>$}
|
168
|
+
@color.inspect.must_match %r{^#<PNM::Image:0x\h+ PPM 5x3 Color, maxgray=6>$}
|
169
|
+
end
|
170
|
+
|
165
171
|
it 'can write binary data containing CRLF' do
|
166
172
|
@grayscale_crlf.write(@temp_path, :binary)
|
167
173
|
File.binread(@temp_path).must_equal File.binread("#{@srcpath}/grayscale_binary_crlf.pgm")
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pnm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marcus Stollsteimer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-11-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -32,6 +32,7 @@ executables: []
|
|
32
32
|
extensions: []
|
33
33
|
extra_rdoc_files: []
|
34
34
|
files:
|
35
|
+
- ".yardopts"
|
35
36
|
- README.md
|
36
37
|
- Rakefile
|
37
38
|
- benchmark/bm_converter.rb
|
@@ -79,7 +80,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
79
80
|
version: '0'
|
80
81
|
requirements: []
|
81
82
|
rubyforge_project:
|
82
|
-
rubygems_version: 2.
|
83
|
+
rubygems_version: 2.4.4
|
83
84
|
signing_key:
|
84
85
|
specification_version: 4
|
85
86
|
summary: PNM - create/read/write PNM image files (PBM, PGM, PPM)
|
@@ -89,3 +90,4 @@ test_files:
|
|
89
90
|
- test/test_parser.rb
|
90
91
|
- test/test_converter.rb
|
91
92
|
- test/test_pnm.rb
|
93
|
+
has_rdoc:
|