imagewriter 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +5 -5
  2. data/bin/imagewriter +46 -83
  3. metadata +4 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: f9cc11fca615fa5553ed388686b6d88150bb7385
4
- data.tar.gz: ea380b30ae49e7238c6e20bc1dcd880d938858b9
2
+ SHA256:
3
+ metadata.gz: 445301d5910befd2d411decc7ca6acc868d12d32098d88a32b60a7f9627c0dc2
4
+ data.tar.gz: 530dbfe53de7beebd221487c819238074d17c244861eab0a14a17c37d1266857
5
5
  SHA512:
6
- metadata.gz: 59a6e33c951000f9be772c61b06f00c6c5da4dbba5af5ad36e0c0033f15031d757b530748b1146c296b0f443801c64dda94bf0688ab3d6758d0bfa85459e9039
7
- data.tar.gz: e1622a9dbb2032360d73b63b79df3d5b1b901ab0b1df512d2e25ab02217902d360405910af5cb4caf1012c8707092db1c70f9689fd5496e87d1ef3ee38b0dc06
6
+ metadata.gz: 4f9d9e6169dd80b4cc1a21c2c06f72bcdb077d9c4fd7913a49455cea7811d090e1026d3888681a6b0b76beba59f73fb41add2d1ed3220d24223f7a6b55a42d4a
7
+ data.tar.gz: 46c97c004144add6edf0b38284e1275fcccef2a3423f7b73bf97e97ec60b3b60ff8fb988f660cdea733043952b2c7c638de5250e46351949f1b5e220a78d53b4
@@ -26,15 +26,43 @@ class ImageWriter
26
26
  end
27
27
  end
28
28
 
29
+ ## Prints an image at double vertical resolution (144 dpi) by
30
+ ## writing interleaved rows in a back-and-forth "double pass".
29
31
  def print!
30
32
  init_printer!
31
33
 
32
- if @quality == "regular"
33
- do_print!(16, 0, :b1_v144_regular, :b2_v144_regular, 1, 15)
34
- elsif @quality == "enhanced"
35
- do_print!(12, -4, :b1_v144_enhanced, :b2_v144_enhanced, 1, 11)
36
- elsif @quality == "best"
37
- do_print!(4, 0, :b1_v144_best, :b2_v144_best, 1, 3)
34
+ ## Higher quality is achieved by printing fewer lines at a time,
35
+ ## and dovetailing these lines with the adjacent double-passes
36
+ dovetail = 2 * (@quality-1)
37
+ lines_per_double_pass = 16 - dovetail
38
+
39
+ ## Make bitmasks for first- and second-pass bytes
40
+ half_dovetail = (dovetail / 2).to_i
41
+ dovemask1 = 0xff >> half_dovetail
42
+ dovemask2 = 0xff << half_dovetail
43
+
44
+ width = [@hdpi * 8, @img.width].min
45
+
46
+ y = -16 # start here to provide any necessary margin for dovetailing
47
+
48
+ while (y <= @img.height) do
49
+ bytes1 = 0.upto(width).map{|x| b1(x, y) & dovemask1}
50
+ bytes2 = 0.upto(width).map{|x| b2(x, y) & dovemask2}
51
+
52
+ printf "\eG%.4d", bytes1.length
53
+ bytes1.each{|b| print b.chr}
54
+ printf "\r"
55
+
56
+ printf "\x1F1" # one line feed
57
+
58
+ printf "\eG%.4d", bytes2.length
59
+ bytes2.each{|b| print b.chr}
60
+ printf "\r"
61
+
62
+ printf "\x1F%s", LINE_FEEDS[lines_per_double_pass - 1]
63
+
64
+ sleep @sleep
65
+ y += lines_per_double_pass
38
66
  end
39
67
  end
40
68
 
@@ -71,26 +99,24 @@ class ImageWriter
71
99
  15 => "?"
72
100
  }
73
101
 
74
- QUALITY = ["regular", "enhanced", "best"]
75
-
76
102
  def parse_argv!(argv)
77
103
  options = {
78
104
  hdpi: 144,
79
- quality: "regular",
105
+ quality: 1,
80
106
  sleep: 0.75
81
107
  }
82
108
 
83
109
  help = nil
84
110
  OptionParser.new do |parser|
85
111
  parser.banner = <<-EOT
86
- Usage: imagewriter [options] filename.png"
112
+ Usage: imagewriter [options] filename.png
87
113
  Vertical resolution is 144 dpi; horizontal resolution is adjustable.
88
114
  Max printable width is 8 inches, or 8 * horizontal DPI pixels.
89
115
  Options:
90
116
  EOT
91
117
 
92
118
  dpis = HORIZ_DPI_CODE.keys.join(", ")
93
- parser.on('-H', '--horizontal DPI', Integer, "Horizontal DPI (one of: #{dpis}; default #{options[:hdpi]})") do |n|
119
+ parser.on('-H', '--horizontal DPI', Integer, "Horizontal DPI. One of: #{dpis}; default #{options[:hdpi]}") do |n|
94
120
  if HORIZ_DPI_CODE[n]
95
121
  options[:hdpi] = n
96
122
  else
@@ -100,17 +126,17 @@ Options:
100
126
  end
101
127
  end
102
128
 
103
- parser.on("-q", "--quality QUALITY", "Print quality (one of: #{QUALITY.join(", ")}; default #{options[:quality]})") do |n|
104
- if QUALITY.include?(n)
129
+ parser.on("-q", "--quality QUALITY", Integer, "Print quality. 1 (fastest) to 8 (best); default #{options[:quality]}") do |n|
130
+ if n > 0 && n < 9
105
131
  options[:quality] = n
106
132
  else
107
- STDERR.puts "Bad quality setting #{n} (must be one of: #{QUALITY.join(", ")})\n"
133
+ STDERR.puts "Bad quality setting #{n} (must be 1-8)"
108
134
  STDERR.puts parser
109
135
  exit 1
110
136
  end
111
137
  end
112
138
 
113
- parser.on("-s", "--sleep", Float, "Sleep this many seconds between passes (default #{options[:sleep]})") do |n|
139
+ parser.on("-s", "--sleep", Float, "Sleep this many seconds between passes. Default #{options[:sleep]}") do |n|
114
140
  options[:sleep] = n
115
141
  end
116
142
 
@@ -134,34 +160,8 @@ Options:
134
160
  end
135
161
  end
136
162
 
137
- def do_print!(lines_per_double_pass, y0, b1_fun, b2_fun, lf1, lf2)
138
- double_passes = (@img.height / lines_per_double_pass).ceil + 1
139
- y = y0
140
- width = [@hdpi * 8, @img.width].min
141
-
142
- 0.upto(double_passes) do
143
- bytes1 = 0.upto(width).map{|x| self.send(b1_fun, x, y)}
144
- bytes2 = 0.upto(width).map{|x| self.send(b2_fun, x, y)}
145
-
146
- printf "\eG%.4d", width
147
- bytes1.each{|b| print b.chr}
148
- printf "\r"
149
-
150
- printf "\x1F%s", LINE_FEEDS[lf1]
151
-
152
- printf "\eG%.4d", width
153
- bytes2.each{|b| print b.chr}
154
- printf "\r"
155
-
156
- printf "\x1F%s", LINE_FEEDS[lf2]
157
-
158
- sleep @sleep
159
- y += lines_per_double_pass
160
- end
161
- end
162
-
163
- ### Regular quality: 16 lines per double-pass
164
- def b1_v144_regular(x, y)
163
+ ## Returns data byte for first-pass lines
164
+ def b1(x, y)
165
165
  0 +
166
166
  0b00000001 * get(x, y) +
167
167
  0b00000010 * get(x, y+2) +
@@ -173,7 +173,8 @@ Options:
173
173
  0b10000000 * get(x, y+14)
174
174
  end
175
175
 
176
- def b2_v144_regular(x, y)
176
+ ## Returns data byte for second-pass lines
177
+ def b2(x, y)
177
178
  0 +
178
179
  0b00000001 * get(x, y+1) +
179
180
  0b00000010 * get(x, y+3) +
@@ -185,47 +186,9 @@ Options:
185
186
  0b10000000 * get(x, y+15)
186
187
  end
187
188
 
188
- ### Enhanced quality: 12 lines per double-pass, 4 dots dovetailed
189
- def b1_v144_enhanced(x, y)
190
- 0 +
191
- 0b00000001 * get(x, y) +
192
- 0b00000010 * get(x, y+2) +
193
- 0b00000100 * get(x, y+4) +
194
- 0b00001000 * get(x, y+6) +
195
- 0b00010000 * get(x, y+8) +
196
- 0b00100000 * get(x, y+10)
197
- #0b01000000 * get(x, y+12) +
198
- #0b10000000 * get(x, y+14)
199
- end
200
-
201
- def b2_v144_enhanced(x, y)
202
- 0 +
203
- #0b00000001 * get(x, y+1) +
204
- #0b00000010 * get(x, y+3) +
205
- 0b00000100 * get(x, y+5) +
206
- 0b00001000 * get(x, y+7) +
207
- 0b00010000 * get(x, y+9) +
208
- 0b00100000 * get(x, y+11) +
209
- 0b01000000 * get(x, y+13) +
210
- 0b10000000 * get(x, y+15)
211
- end
212
-
213
- ### Best quality: 4 lines per double-pass
214
- def b1_v144_best(x, y)
215
- 0 +
216
- 0b00000001 * get(x, y) +
217
- 0b00000010 * get(x, y+2)
218
- end
219
-
220
- def b2_v144_best(x, y)
221
- 0 +
222
- 0b00000001 * get(x, y+1) +
223
- 0b00000010 * get(x, y+3)
224
- end
225
-
226
189
  ## Returns 0 for black pixels that exist, 1 otherwise
227
190
  def get(x, y)
228
- x = @img[x, y] & 0xffffff00
191
+ x = @img[x, y] & 0xffffff00 # strip alpha channel
229
192
  return 0 if x > 0
230
193
  1
231
194
  rescue
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: imagewriter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - pete gamache
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-29 00:00:00.000000000 Z
11
+ date: 2020-11-30 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: pete@gamache.org
@@ -37,10 +37,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
37
37
  - !ruby/object:Gem::Version
38
38
  version: '0'
39
39
  requirements: []
40
- rubyforge_project:
41
- rubygems_version: 2.5.2.3
40
+ rubygems_version: 3.1.2
42
41
  signing_key:
43
42
  specification_version: 4
44
- summary: writes PNG images onto paper using an Apple Imagewriter or ImageWriter II
45
- printer
43
+ summary: Prints B&W PNG images on an Apple Imagewriter or ImageWriter II printer
46
44
  test_files: []