pnm 0.2.0 → 0.2.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d185b233565cd87cea47d7a47fa8cd53cbd3120d
4
- data.tar.gz: 65754714716d6b399cc8950e0ff90584cb42485a
3
+ metadata.gz: 309f7c8934e624de40581059644cbda2d9ae575e
4
+ data.tar.gz: 36cb4969d02048d04064962091b2df86f8a24491
5
5
  SHA512:
6
- metadata.gz: 0737d6700d5ce343d0e326006213640eebe097181a47e3d99a70610a4f4aed95765a2fc1ccbee7b767177a9279224ef5814ee4fd53891a9de9b1eb0b9ca8a131
7
- data.tar.gz: 2633bcdac0cf6fae08e3c36a9a81a6af985712273a9dc5361824794713c778300f12fa5ebee86eff5a34a7bf8bc4f38b4287f4e97887f3ca5685ea447c4d607f
6
+ metadata.gz: 1d30ee950e419b1d83165f3e000ccb0769b6f9a50a223f94f6d50af048c8c8fcce9f3cb7799c0c7b74bcafddd1accbeae2fd78e6acef3b844ae1ec03b8208935
7
+ data.tar.gz: 561aaf230c4b41044bcaeb3ee62204963b032e9cbad3ea96c39e17510cd2608ef43e3334e4e6d9aba7b425f2eb1e65f80a73eb97e4030d2771428e50c672d812
data/README.md CHANGED
@@ -82,7 +82,7 @@ Requirements
82
82
 
83
83
  - Ruby 2.0.0 on Linux and on Windows,
84
84
  - Ruby 1.9.3,
85
- - JRuby 1.7.8,
85
+ - JRuby 1.7.9,
86
86
  - Rubinius 2.2.1.
87
87
 
88
88
  Documentation
@@ -52,7 +52,7 @@ class ConverterBenchmark
52
52
  Benchmark.bm(18) do |bm|
53
53
  bm.report("#{type_string} / ascii2array") {
54
54
  @repetitions.times do
55
- PNM::Converter.ascii2array(type, ascii)
55
+ PNM::Converter.ascii2array(type, width, height, ascii)
56
56
  end
57
57
  }
58
58
 
data/lib/pnm.rb CHANGED
@@ -139,7 +139,7 @@ module PNM
139
139
  height = content[:height].to_i
140
140
  maxgray = content[:maxgray].to_i
141
141
  pixels = if encoding == :ascii
142
- Converter.ascii2array(type, content[:data])
142
+ Converter.ascii2array(type, width, height, content[:data])
143
143
  else
144
144
  Converter.binary2array(type, width, height, content[:data])
145
145
  end
data/lib/pnm/converter.rb CHANGED
@@ -19,17 +19,21 @@ module PNM
19
19
  # Converts from ASCII format to an array of pixel values.
20
20
  #
21
21
  # +type+:: +:pbm+, +:pgm+, or +:ppm+.
22
+ # +width+, +height+:: The image dimensions in pixels.
22
23
  # +data+:: A string containing the raw pixel data in ASCII format.
23
24
  #
24
25
  # Returns a two-dimensional array of bilevel, gray, or RGB values.
25
- def self.ascii2array(type, data)
26
- pixels = data.split("\n").map do |row|
27
- row.split(/ +/).map {|value| value.to_i }
28
- end
26
+ def self.ascii2array(type, width, height, data)
27
+ values = data.gsub(/\A[ \t\r\n]+/, '').split(/[ \t\r\n]+/).map {|value| value.to_i }
29
28
 
30
- pixels.map! {|row| row.each_slice(3).to_a } if type == :ppm
29
+ case type
30
+ when :pbm, :pgm
31
+ pixel_matrix = values.each_slice(width).to_a
32
+ when :ppm
33
+ pixel_matrix = values.each_slice(3 * width).map {|row| row.each_slice(3).to_a }
34
+ end
31
35
 
32
- pixels
36
+ pixel_matrix
33
37
  end
34
38
 
35
39
  # Converts from binary format to an array of pixel values.
@@ -42,7 +46,7 @@ module PNM
42
46
  def self.binary2array(type, width, height, data)
43
47
  bytes_per_row = byte_width(type, width)
44
48
 
45
- if data.size == bytes_per_row * height + 1 && data[-1] =~ /[ \n\t\r]/
49
+ if data.size == bytes_per_row * height + 1 && data[-1] =~ /[ \t\r\n]/
46
50
  data.slice!(-1)
47
51
  end
48
52
 
@@ -52,15 +56,15 @@ module PNM
52
56
 
53
57
  case type
54
58
  when :pbm
55
- pixels = data.scan(/.{#{bytes_per_row}}/m)
56
- pixels.map! {|row| row.unpack('B*').first[0, width].each_char.map {|char| char.to_i } }
59
+ rows = data.scan(/.{#{bytes_per_row}}/m)
60
+ pixel_matrix = rows.map {|row| row.unpack('B*').first[0, width].each_char.map {|char| char.to_i } }
57
61
  when :pgm
58
- pixels = data.each_byte.each_slice(bytes_per_row).to_a
62
+ pixel_matrix = data.each_byte.each_slice(bytes_per_row).to_a
59
63
  when :ppm
60
- pixels = data.each_byte.each_slice(bytes_per_row).map {|row| row.each_slice(3).to_a }
64
+ pixel_matrix = data.each_byte.each_slice(bytes_per_row).map {|row| row.each_slice(3).to_a }
61
65
  end
62
66
 
63
- pixels
67
+ pixel_matrix
64
68
  end
65
69
 
66
70
  # Converts a two-dimensional array of pixel values to an ASCII format string.
@@ -71,12 +75,12 @@ module PNM
71
75
  def self.array2ascii(data)
72
76
  case data.first.first
73
77
  when Array
74
- output = data.map {|row| row.flatten.join(' ') }.join("\n")
78
+ data_string = data.map {|row| row.flatten.join(' ') }.join("\n")
75
79
  else
76
- output = data.map {|row| row.join(' ') }.join("\n")
80
+ data_string = data.map {|row| row.join(' ') }.join("\n")
77
81
  end
78
82
 
79
- output << "\n"
83
+ data_string << "\n"
80
84
  end
81
85
 
82
86
  # Converts a two-dimensional array of pixel values to a binary format string.
data/lib/pnm/image.rb CHANGED
@@ -55,7 +55,7 @@ module PNM
55
55
  @height = pixels.size
56
56
  @maxgray = options[:maxgray]
57
57
  @comment = (options[:comment] || '').chomp
58
- @pixels = pixels
58
+ @pixels = pixels.dup
59
59
 
60
60
  @type ||= detect_type(@pixels, @maxgray)
61
61
 
@@ -66,7 +66,7 @@ module PNM
66
66
  end
67
67
 
68
68
  if type == :ppm && !pixels.first.first.kind_of?(Array)
69
- @pixels = pixels.map {|row| row.map {|pixel| gray_to_rgb(pixel) } }
69
+ @pixels.map! {|row| row.map {|pixel| gray_to_rgb(pixel) } }
70
70
  end
71
71
  end
72
72
 
data/lib/pnm/parser.rb CHANGED
@@ -23,9 +23,9 @@ module PNM
23
23
  comments = []
24
24
 
25
25
  until magic_number
26
- token = get_next_token!(content)
26
+ token = next_token!(content)
27
27
 
28
- if token[0] == '#'
28
+ if token.start_with?('#')
29
29
  comments << token.gsub(/# */, '')
30
30
  else
31
31
  magic_number = token
@@ -36,8 +36,9 @@ module PNM
36
36
 
37
37
  while tokens.size < token_number[magic_number]
38
38
  content.gsub!(/\A[ \t\r\n]+/, '')
39
- token = get_next_token!(content)
40
- if token[0] == '#'
39
+ token = next_token!(content)
40
+
41
+ if token.start_with?('#')
41
42
  comments << token.gsub(/# */, '')
42
43
  else
43
44
  tokens << token
@@ -69,13 +70,15 @@ module PNM
69
70
  }
70
71
  end
71
72
 
72
- def self.get_next_token!(content) # :nodoc:
73
- if content[0] == '#'
74
- token, rest = content.split("\n", 2)
75
- else
76
- token, rest = content.split(/[ \t\r\n]|(?=#)/, 2)
77
- end
78
- content.clear << rest
73
+ def self.next_token!(content) # :nodoc:
74
+ delimiter = if content.start_with?('#')
75
+ "\n"
76
+ else
77
+ %r{[ \t\r\n]|(?=#)}
78
+ end
79
+
80
+ token, rest = content.split(delimiter, 2)
81
+ content.replace(rest)
79
82
 
80
83
  token
81
84
  end
data/lib/pnm/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module PNM
2
- VERSION = '0.2.0' # :nodoc:
3
- DATE = '2013-12-01' # :nodoc:
2
+ VERSION = '0.2.1' # :nodoc:
3
+ DATE = '2013-12-17' # :nodoc:
4
4
  end
@@ -49,24 +49,39 @@ describe PNM::Converter do
49
49
  end
50
50
 
51
51
  it 'can convert from ASCII encoded PBM data' do
52
+ width = @pbm[:width]
53
+ height = @pbm[:height]
52
54
  data = @pbm[:ascii]
53
55
  expected = @pbm[:array]
54
56
 
55
- @converter.ascii2array(:pbm, data).must_equal expected
57
+ @converter.ascii2array(:pbm, width, height, data).must_equal expected
56
58
  end
57
59
 
58
60
  it 'can convert from ASCII encoded PGM data' do
61
+ width = @pgm[:width]
62
+ height = @pgm[:height]
59
63
  data = @pgm[:ascii]
60
64
  expected = @pgm[:array]
61
65
 
62
- @converter.ascii2array(:pgm, data).must_equal expected
66
+ @converter.ascii2array(:pgm, width, height, data).must_equal expected
63
67
  end
64
68
 
65
69
  it 'can convert from ASCII encoded PPM data' do
70
+ width = @ppm[:width]
71
+ height = @ppm[:height]
66
72
  data = @ppm[:ascii]
67
73
  expected = @ppm[:array]
68
74
 
69
- @converter.ascii2array(:ppm, data).must_equal expected
75
+ @converter.ascii2array(:ppm, width, height, data).must_equal expected
76
+ end
77
+
78
+ it 'accepts ASCII encoded PGM data with arbitrary whitespace' do
79
+ width = 4
80
+ height = 3
81
+ data = " \n 10 90\t170\r250\n90 \t170 250 \t\r\n\t 10\n\n\n170\n250\n10\n90\n"
82
+ expected = [[10, 90, 170, 250], [90, 170, 250, 10], [170, 250, 10, 90]]
83
+
84
+ @converter.ascii2array(:pgm, width, height, data).must_equal expected
70
85
  end
71
86
 
72
87
  it 'can convert from binary encoded PBM data (width 6)' do
data/test/test_image.rb CHANGED
@@ -103,6 +103,12 @@ describe PNM::Image do
103
103
  image.pixels.must_equal [[[0,0,0], [3,3,3], [6,6,6]], [[3,3,3], [6,6,6], [9,9,9]]]
104
104
  end
105
105
 
106
+ it 'does not modify the input data for color images created from gray values' do
107
+ data = [[0,3,6], [3,6,9]]
108
+ PNM::Image.new(data, {:type => :ppm})
109
+ data.must_equal [[0,3,6], [3,6,9]]
110
+ end
111
+
106
112
  it 'can write a bilevel image to an ASCII encoded file' do
107
113
  @bilevel.write(@temp_path, :ascii)
108
114
  File.binread(@temp_path).must_equal File.binread("#{@srcpath}/bilevel_ascii.pbm")
data/test/test_parser.rb CHANGED
@@ -97,11 +97,11 @@ describe PNM::Parser do
97
97
  it 'can parse comments' do
98
98
  content =<<-EOF.chomp.gsub(/^ */, '')
99
99
  # Comment 1
100
- P1 # Comment 2
101
- 6
102
- #Comment 3
100
+ P1 # Comment 2
101
+ 6# Comment 3
102
+ #Comment 4
103
103
  #
104
- \r \t# Comment 5
104
+ \r \t# Comment 6
105
105
  2
106
106
  0 1 0 0 1 1
107
107
  0 0 0 1 1 1
@@ -110,7 +110,7 @@ describe PNM::Parser do
110
110
  :magic_number => 'P1',
111
111
  :width => '6',
112
112
  :height => '2',
113
- :comments => ['Comment 1', 'Comment 2', 'Comment 3', '', 'Comment 5'],
113
+ :comments => ['Comment 1', 'Comment 2', 'Comment 3', 'Comment 4', '', 'Comment 6'],
114
114
  :data => "0 1 0 0 1 1\n0 0 0 1 1 1"
115
115
  }
116
116
 
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.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marcus Stollsteimer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-01 00:00:00.000000000 Z
11
+ date: 2013-12-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake