pnm 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: dc9dad70777226b16da4d7039a1321372519e048
4
- data.tar.gz: 0e7d6f07393f439bc0a644aa8fb54e147142ec2c
2
+ SHA256:
3
+ metadata.gz: 66de49354358fed31c8299381599bb8b16d87d2143e2102ca61da00e6b8b2927
4
+ data.tar.gz: 2bd7e0d7491be12b5562c3a1de19ee7e538d95c3535fc9bb92723726b5e5787c
5
5
  SHA512:
6
- metadata.gz: 3445e084ae5d392516e8a169e1b5f2340537447fce806969cf5e1c3ff882b9c140b0bb592a57106fd277e289e3f3bbba40b8f13868637b6cd73e3d42f39440dc
7
- data.tar.gz: 051ead6ff5724ce49cc21bf66c9087cc5a60c10a94edac62907a700b29f13829f92b1d3a3413c78c8dbfc03b3e63c0deb17b20165b988ed959f2573dee384709
6
+ metadata.gz: bd83d15feb8b65b28b43f64cd48ab23a5e3f710a991f781c43d6d74bc9ea9a02cb905d61bae70af1fe2476c551ece310050eccd0210acb5701d87efb40d61173
7
+ data.tar.gz: 574e62b56e1ac1fea7a9110f1c01c805f373bfafd50210bb2145fca4086054d7d1ace113d1e46eadfe0b5c9314b3ca221168cdc2dba2e7168742615a7462e728
data/README.md CHANGED
@@ -27,7 +27,7 @@ pixels = [[ 0, 10, 20],
27
27
  [10, 20, 30]]
28
28
 
29
29
  # optional settings
30
- options = {:maxgray => 30, :comment => "Test Image"}
30
+ options = { maxgray: 30, comment: "Test Image" }
31
31
 
32
32
  # create the image object
33
33
  image = PNM.create(pixels, options)
@@ -71,7 +71,7 @@ image.pixels # => [[0, 10, 20], [10, 20, 30]]
71
71
  Force an image type:
72
72
 
73
73
  ``` ruby
74
- color_image = PNM.create([[0, 1],[1, 0]], :type => :ppm)
74
+ color_image = PNM.create([[0, 1],[1, 0]], type: :ppm)
75
75
  color_image.info # => "PPM 2x2 Color"
76
76
  ```
77
77
 
@@ -98,10 +98,7 @@ Requirements
98
98
 
99
99
  - PNM has been tested with
100
100
 
101
- - Ruby 2.4,
102
- - Ruby 2.3,
103
- - Ruby 2.2,
104
- - Ruby 2.1,
101
+ - Ruby 2.6, 2.5, 2.4, 2.3, 2.2, 2.1,
105
102
  - Ruby 2.0.0,
106
103
  - Ruby 1.9.3,
107
104
  - JRuby 1.7.19,
@@ -121,7 +118,7 @@ Report bugs on the PNM home page: <https://github.com/stomar/pnm/>
121
118
  License
122
119
  -------
123
120
 
124
- Copyright &copy; 2013-2016 Marcus Stollsteimer
121
+ Copyright &copy; 2013-2019 Marcus Stollsteimer
125
122
 
126
123
  `PNM` is free software: you can redistribute it and/or modify
127
124
  it under the terms of the GNU General Public License version 3 or later (GPLv3+),
data/Rakefile CHANGED
@@ -1,34 +1,35 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # rakefile for the PNM library.
2
4
  #
3
- # Copyright (C) 2013-2016 Marcus Stollsteimer
5
+ # Copyright (C) 2013-2019 Marcus Stollsteimer
4
6
 
5
- require 'rake/testtask'
7
+ require "rake/testtask"
6
8
 
7
- require_relative 'lib/pnm'
9
+ require_relative "lib/pnm"
8
10
 
9
11
 
10
12
  def gemspec_file
11
- 'pnm.gemspec'
13
+ "pnm.gemspec"
12
14
  end
13
15
 
14
16
 
15
- task :default => [:test]
17
+ task default: :test
16
18
 
17
19
  Rake::TestTask.new do |t|
18
- t.pattern = 'test/**/test_*.rb'
19
- t.ruby_opts << '-rubygems'
20
+ t.pattern = "test/**/test_*.rb"
20
21
  t.verbose = true
21
22
  t.warning = true
22
23
  end
23
24
 
24
25
 
25
- desc 'Run benchmarks'
26
+ desc "Run benchmarks"
26
27
  task :benchmark do
27
- Dir['benchmark/**/bm_*.rb'].each {|f| require_relative f }
28
+ Dir["benchmark/**/bm_*.rb"].each {|f| require_relative f }
28
29
  end
29
30
 
30
31
 
31
- desc 'Build gem'
32
+ desc "Build gem"
32
33
  task :build do
33
34
  sh "gem build #{gemspec_file}"
34
35
  end
@@ -1,11 +1,14 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
2
4
  # bm_converter.rb: Benchmarks for the PNM library.
3
5
  #
4
- # Copyright (C) 2013-2016 Marcus Stollsteimer
6
+ # Copyright (C) 2013-2019 Marcus Stollsteimer
5
7
 
6
- require 'benchmark'
7
- require_relative '../lib/pnm'
8
+ require "benchmark"
9
+ require_relative "../lib/pnm"
8
10
 
11
+ # Benchmarks for PNM::Converter.
9
12
  class ConverterBenchmark
10
13
 
11
14
  def initialize
@@ -14,7 +17,7 @@ class ConverterBenchmark
14
17
 
15
18
  @srcpath = File.dirname(__FILE__)
16
19
 
17
- print 'Initializing test data...'
20
+ print "Initializing test data..."
18
21
  @pbm_image = PNM.read(File.expand_path("#{@srcpath}/random_image.pbm"))
19
22
  @pgm_image = PNM.read(File.expand_path("#{@srcpath}/random_image.pgm"))
20
23
  @ppm_image = PNM.read(File.expand_path("#{@srcpath}/random_image.ppm"))
@@ -32,7 +35,7 @@ class ConverterBenchmark
32
35
  run_benchmark(@pgm_image)
33
36
  run_benchmark(@ppm_image)
34
37
 
35
- puts "\nTotal: " <<
38
+ puts "\nTotal: ".dup <<
36
39
  @user.round(2).to_s.ljust(11) <<
37
40
  @system.round(2).to_s.ljust(11) <<
38
41
  @total.round(2).to_s
@@ -40,43 +43,44 @@ class ConverterBenchmark
40
43
 
41
44
  def run_benchmark(image)
42
45
  type = image.type
43
- type_string = type.upcase
44
46
  width = image.width
45
47
  height = image.height
46
48
  array = image.pixels
47
49
  ascii = PNM::Converter.array2ascii(array)
48
50
  binary = PNM::Converter.array2binary(type, array)
51
+ type_string = type.upcase
49
52
 
50
53
  puts
51
54
 
52
55
  Benchmark.bm(18) do |bm|
53
- bm.report("#{type_string} / ascii2array") {
56
+
57
+ bm.report("#{type_string} / ascii2array") do
54
58
  @repetitions.times do
55
59
  PNM::Converter.ascii2array(type, width, height, ascii)
56
60
  end
57
- }
61
+ end
58
62
 
59
- bm.report("#{type_string} / array2ascii") {
63
+ bm.report("#{type_string} / array2ascii") do
60
64
  @repetitions.times do
61
65
  PNM::Converter.array2ascii(array)
62
66
  end
63
- }
67
+ end
64
68
 
65
- bm.report("#{type_string} / binary2array") {
69
+ bm.report("#{type_string} / binary2array") do
66
70
  @repetitions.times do
67
71
  PNM::Converter.binary2array(type, width, height, binary)
68
72
  end
69
- }
73
+ end
70
74
 
71
- bm.report("#{type_string} / array2binary") {
75
+ bm.report("#{type_string} / array2binary") do
72
76
  @repetitions.times do
73
77
  PNM::Converter.array2binary(type, array)
74
78
  end
75
- }
79
+ end
76
80
 
77
- @user += bm.list.map {|tms| tms.utime }.reduce(:+)
78
- @system += bm.list.map {|tms| tms.stime }.reduce(:+)
79
- @total += bm.list.map {|tms| tms.total }.reduce(:+)
81
+ @user += bm.list.map(&:utime).reduce(:+)
82
+ @system += bm.list.map(&:stime).reduce(:+)
83
+ @total += bm.list.map(&:total).reduce(:+)
80
84
  end
81
85
  end
82
86
  end
data/lib/pnm.rb CHANGED
@@ -1,12 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # = pnm.rb - create/read/write PNM image files (PBM, PGM, PPM)
2
4
  #
3
5
  # See PNM module for documentation.
4
6
 
5
- require_relative 'pnm/version'
6
- require_relative 'pnm/image'
7
- require_relative 'pnm/parser'
8
- require_relative 'pnm/converter'
9
- require_relative 'pnm/exceptions'
7
+ require_relative "pnm/version"
8
+ require_relative "pnm/image"
9
+ require_relative "pnm/parser"
10
+ require_relative "pnm/converter"
11
+ require_relative "pnm/exceptions"
10
12
 
11
13
 
12
14
  # PNM is a pure Ruby library for creating, reading,
@@ -33,7 +35,7 @@ require_relative 'pnm/exceptions'
33
35
  # [10, 20, 30]]
34
36
  #
35
37
  # # optional settings
36
- # options = {:maxgray => 30, :comment => "Test Image"}
38
+ # options = { maxgray: 30, comment: "Test Image" }
37
39
  #
38
40
  # # create the image object
39
41
  # image = PNM.create(pixels, options)
@@ -71,7 +73,7 @@ require_relative 'pnm/exceptions'
71
73
  #
72
74
  # Force an image type:
73
75
  #
74
- # color_image = PNM.create([[0, 1],[1, 0]], :type => :ppm)
76
+ # color_image = PNM.create([[0, 1],[1, 0]], type: :ppm)
75
77
  # color_image.info # => "PPM 2x2 Color"
76
78
  #
77
79
  # Check equality of two images:
@@ -85,28 +87,28 @@ require_relative 'pnm/exceptions'
85
87
  #
86
88
  # == Author
87
89
  #
88
- # Copyright (C) 2013-2016 Marcus Stollsteimer
90
+ # Copyright (C) 2013-2019 Marcus Stollsteimer
89
91
  #
90
92
  # License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
91
93
  #
92
94
  module PNM
93
95
 
94
- LIBNAME = 'pnm'
95
- HOMEPAGE = 'https://github.com/stomar/pnm'
96
- TAGLINE = 'create/read/write PNM image files (PBM, PGM, PPM)'
96
+ LIBNAME = "pnm"
97
+ HOMEPAGE = "https://github.com/stomar/pnm"
98
+ TAGLINE = "create/read/write PNM image files (PBM, PGM, PPM)"
97
99
 
98
- COPYRIGHT = <<-copyright.gsub(/^ +/, '')
99
- Copyright (C) 2013-2016 Marcus Stollsteimer.
100
+ COPYRIGHT = <<-TEXT.gsub(/^ +/, "")
101
+ Copyright (C) 2013-2019 Marcus Stollsteimer.
100
102
  License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
101
103
  This is free software: you are free to change and redistribute it.
102
104
  There is NO WARRANTY, to the extent permitted by law.
103
- copyright
105
+ TEXT
104
106
 
105
107
  # Reads an image from +file+ (a filename or an IO object).
106
108
  #
107
109
  # Returns a PNM::Image object.
108
110
  def self.read(file)
109
- if file.kind_of?(String)
111
+ if file.is_a?(String)
110
112
  raw_data = File.binread(file)
111
113
  elsif file.respond_to?(:binmode)
112
114
  file.binmode
@@ -117,26 +119,20 @@ module PNM
117
119
 
118
120
  content = Parser.parse(raw_data)
119
121
 
120
- case content[:magic_number]
121
- when 'P1'
122
- type = :pbm
123
- encoding = :ascii
124
- when 'P2'
125
- type = :pgm
126
- encoding = :ascii
127
- when 'P3'
128
- type = :ppm
129
- encoding = :ascii
130
- when 'P4'
131
- type = :pbm
132
- encoding = :binary
133
- when 'P5'
134
- type = :pgm
135
- encoding = :binary
136
- when 'P6'
137
- type = :ppm
138
- encoding = :binary
139
- end
122
+ type, encoding = case content[:magic_number]
123
+ when "P1"
124
+ [:pbm, :ascii]
125
+ when "P2"
126
+ [:pgm, :ascii]
127
+ when "P3"
128
+ [:ppm, :ascii]
129
+ when "P4"
130
+ [:pbm, :binary]
131
+ when "P5"
132
+ [:pgm, :binary]
133
+ when "P6"
134
+ [:ppm, :binary]
135
+ end
140
136
 
141
137
  width = content[:width]
142
138
  height = content[:height]
@@ -147,7 +143,7 @@ module PNM
147
143
  Converter.binary2array(type, width, height, content[:data])
148
144
  end
149
145
 
150
- options = {:type => type, :maxgray => maxgray}
146
+ options = { type: type, maxgray: maxgray }
151
147
  options[:comment] = content[:comments].join("\n") if content[:comments]
152
148
 
153
149
  create(pixels, options)
@@ -191,9 +187,9 @@ module PNM
191
187
  # @private
192
188
  def self.magic_number # :nodoc:
193
189
  {
194
- :pbm => {:ascii => 'P1', :binary => 'P4'},
195
- :pgm => {:ascii => 'P2', :binary => 'P5'},
196
- :ppm => {:ascii => 'P3', :binary => 'P6'}
190
+ pbm: { ascii: "P1", binary: "P4" },
191
+ pgm: { ascii: "P2", binary: "P5" },
192
+ ppm: { ascii: "P3", binary: "P6" }
197
193
  }
198
194
  end
199
195
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PNM
2
4
 
3
5
  # @private
@@ -30,12 +32,12 @@ module PNM
30
32
  values = convert_to_integers(data, type)
31
33
  assert_data_size(values.size, values_per_row * height)
32
34
 
33
- case type
34
- when :pbm, :pgm
35
- pixel_matrix = values.each_slice(width).to_a
36
- when :ppm
37
- pixel_matrix = values.each_slice(3 * width).map {|row| row.each_slice(3).to_a }
38
- end
35
+ pixel_matrix = case type
36
+ when :pbm, :pgm
37
+ values.each_slice(width).to_a
38
+ when :ppm
39
+ values.each_slice(3 * width).map {|row| row.each_slice(3).to_a }
40
+ end
39
41
 
40
42
  pixel_matrix
41
43
  end
@@ -49,22 +51,21 @@ module PNM
49
51
  # Returns a two-dimensional array of bilevel, gray, or RGB values.
50
52
  def self.binary2array(type, width, height, data)
51
53
  bytes_per_row = byte_width(type, width)
54
+ expected_size = bytes_per_row * height
52
55
 
53
- if data.size == bytes_per_row * height + 1 && data[-1] =~ /[ \t\r\n]/
54
- data.slice!(-1)
55
- end
56
+ data.slice!(-1) if data.size == expected_size + 1 && data[-1] =~ /[ \t\r\n]/
56
57
 
57
- assert_data_size(data.size, bytes_per_row * height)
58
+ assert_data_size(data.size, expected_size)
58
59
 
59
- case type
60
- when :pbm
61
- rows = data.scan(/.{#{bytes_per_row}}/m)
62
- pixel_matrix = rows.map {|row| row.unpack('B*').first[0, width].each_char.map {|char| char.to_i } }
63
- when :pgm
64
- pixel_matrix = data.each_byte.each_slice(bytes_per_row).to_a
65
- when :ppm
66
- pixel_matrix = data.each_byte.each_slice(bytes_per_row).map {|row| row.each_slice(3).to_a }
67
- end
60
+ pixel_matrix = case type
61
+ when :pbm
62
+ rows = data.scan(/.{#{bytes_per_row}}/m)
63
+ rows.map {|row| row.unpack("B*").first[0, width].each_char.map(&:to_i) }
64
+ when :pgm
65
+ data.each_byte.each_slice(bytes_per_row).to_a
66
+ when :ppm
67
+ data.each_byte.each_slice(bytes_per_row).map {|row| row.each_slice(3).to_a }
68
+ end
68
69
 
69
70
  pixel_matrix
70
71
  end
@@ -75,12 +76,12 @@ module PNM
75
76
  #
76
77
  # Returns a string containing the pixel data in ASCII format.
77
78
  def self.array2ascii(data)
78
- case data.first.first
79
- when Array
80
- data_string = data.map {|row| row.flatten.join(' ') }.join("\n")
81
- else
82
- data_string = data.map {|row| row.join(' ') }.join("\n")
83
- end
79
+ data_string = case data.first.first
80
+ when Array
81
+ data.map {|row| row.flatten.join(" ") }.join("\n")
82
+ else
83
+ data.map {|row| row.join(" ") }.join("\n")
84
+ end
84
85
 
85
86
  data_string << "\n"
86
87
  end
@@ -94,38 +95,34 @@ module PNM
94
95
  def self.array2binary(type, data)
95
96
  height = data.size
96
97
 
97
- if type == :pbm
98
- binary_rows = data.map {|row| row.join }
99
- data_string = binary_rows.pack('B*' * height)
100
- else
101
- data_string = data.flatten.pack('C*')
102
- end
98
+ data_string = if type == :pbm
99
+ binary_rows = data.map(&:join)
100
+ binary_rows.pack("B*" * height)
101
+ else
102
+ data.flatten.pack("C*")
103
+ end
103
104
 
104
105
  data_string
105
106
  end
106
107
 
107
108
  def self.convert_to_integers(data, type)
108
- if type == :pbm
109
- values_as_string = data.gsub(/[ \t\r\n]+/, '').split('')
110
- else
111
- values_as_string = data.gsub(/\A[ \t\r\n]+/, '').split(/[ \t\r\n]+/)
112
- end
109
+ values_as_string = if type == :pbm
110
+ data.gsub(/[ \t\r\n]+/, "").split("")
111
+ else
112
+ data.gsub(/\A[ \t\r\n]+/, "").split(/[ \t\r\n]+/)
113
+ end
113
114
 
114
- values_as_string.map do |value|
115
- Integer(value)
116
- end
117
- rescue ::ArgumentError => e
118
- if e.message.start_with?('invalid value for Integer')
119
- raise PNM::DataError, "invalid pixel value: Integer expected"
120
- else
121
- raise
122
- end
115
+ values_as_string.map {|value| Integer(value) }
116
+ rescue ::ArgumentError => error
117
+ raise unless error.message.start_with?("invalid value for Integer")
118
+
119
+ raise PNM::DataError, "invalid pixel value: Integer expected"
123
120
  end
124
121
 
125
122
  def self.assert_data_size(actual, expected)
126
- unless actual == expected
127
- raise PNM::DataSizeError, 'data size does not match expected size'
128
- end
123
+ return if actual == expected
124
+
125
+ raise PNM::DataSizeError, "data size does not match expected size"
129
126
  end
130
127
  end
131
128
  end