pixelflut 0.1.2 → 0.1.3

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
2
  SHA256:
3
- metadata.gz: b29b8ce88df1c1d08de27f9c87fae728d58d25759cbfc88c2f0c62865492f054
4
- data.tar.gz: 55311c23772975543c15e74741a5bbb452e4a48eb0e4af4d351d28e9ed5cbfa3
3
+ metadata.gz: 2e00558ad6f4afeeda5a86d00ee8fcbfffc09bf3978aa02b7997c69541b4ec71
4
+ data.tar.gz: fb2ec338298452be18a2a9c5352b49100628efb5234b94ee0d25f2f57e759607
5
5
  SHA512:
6
- metadata.gz: c078c2eb4b3dfe4c4faf5d0c3b9bc652c90d3b602c0166b89bcc5f6ccfe8c01e02e9ade0098d5b951f82beab9ef165a8e0bb9363542ebf93264f73d45985ef7e
7
- data.tar.gz: 244d2e819a90182daf2883c49a73454e0367dc098a3ed3f50748846efec8605e14f34dff346f347f7df453d977de9e5b1bc1b9bf2eefbaf4bd36a24aea52d094
6
+ metadata.gz: aa654604990a4af74b65d074a65635ba04d302b4974b37d68fe1a2d155a9dbc4495e62c5422b2c1ce55b9dfbd63b0ca208111ddbe26cf3426ffaf26a55d03573
7
+ data.tar.gz: '099c5c9b3d013d26eb19616e0cef6a7fb2a1a391ddd4bae4e5ce77d263eee1ffcf5cb0311a868a7ab7656eb3cbb621ba7ab02d9e83cc19b3722ca16da9ec6b7c'
data/bin/pxf CHANGED
@@ -13,8 +13,8 @@ def err(msg, code = 1)
13
13
  end
14
14
 
15
15
  OPTS = Struct
16
- .new(:host, :port, :count, :x, :y, :scale, :image)
17
- .new('127.0.0.1', 1234, 4, 0, 0)
16
+ .new(:host, :port, :count, :x, :y, :mode, :scale, :image)
17
+ .new('127.0.0.1', 1234, 4, 0, 0, :rgbx)
18
18
 
19
19
  def parse(args)
20
20
  OptionParser.new do |parser|
@@ -40,6 +40,11 @@ def parse(args)
40
40
  parser.on(
41
41
  '-s', '--scale FACTOR', OptionParser::DecimalNumeric, 'scale image by FACTOR'
42
42
  ){ |v| OPTS.scale = v }
43
+ parser.on(
44
+ '-m', '--pixel MODE',
45
+ {'RGBX' => :rgbx, 'RGBA' => :rgba, 'RGB' => :rgb},
46
+ 'select pixel coding (RGBX | RGBA | RGB)'
47
+ ){ |v| OPTS.mode = v }
43
48
  parser.separator(nil)
44
49
  parser.on('-h', '--help', 'print this help') do
45
50
  exit(!puts(parser))
@@ -63,15 +68,16 @@ begin
63
68
  count: OPTS.count,
64
69
  x: OPTS.x,
65
70
  y: OPTS.y,
66
- scale: OPTS.scale
71
+ scale: OPTS.scale,
72
+ mode: OPTS.mode
67
73
  )
68
74
  slices.size.times do |i|
69
75
  next unless fork
70
76
  Process.setproctitle($name = format('pxf-%02d', i + 1))
71
77
  sender = Pixelflut::Sender.new(addr, slices[i].join)
72
78
  slices.clear
73
- puts "#{$name}: run"
74
- sender.run
79
+ puts("#{$name}: run - #{sender.size} bytes")
80
+ sender.run{ puts("#{$name}: sent partly") }
75
81
  end
76
82
  rescue SocketError => e
77
83
  err(e, 3)
data/bin/pxf-info ADDED
@@ -0,0 +1,32 @@
1
+ #! /bin/sh
2
+
3
+ set -e
4
+
5
+ if [ "$1" = '--help' ]
6
+ then
7
+ echo "Usage: ${0##*/} [-p|--port PORT] ADDRESS
8
+
9
+ Requests screen size of Pixelflut server at ADDRESS.
10
+ "
11
+ exit 0
12
+ fi
13
+
14
+ PORT="1234"
15
+ ADDRESS=""
16
+
17
+ while [ $# -gt 0 ]
18
+ do
19
+ key="$1"
20
+ case $key in
21
+ -p|--port)
22
+ PORT="$2"
23
+ shift; shift
24
+ ;;
25
+ *)
26
+ ADDRESS="$key"
27
+ shift
28
+ ;;
29
+ esac
30
+ done
31
+
32
+ echo "SIZE\nQUIT\n" | nc "$ADDRESS" "$PORT"
data/lib/pixelflut.rb CHANGED
@@ -11,9 +11,9 @@ module Pixelflut
11
11
  Convert.each_line(image, x, y)
12
12
  end
13
13
 
14
- def self.as_slices(source:, count: 4, x: 0, y: 0, scale: nil)
14
+ def self.as_slices(source:, count: 4, x: 0, y: 0, scale: nil, mode: :rgbx)
15
15
  image = Image.new(source)
16
16
  image.scale(scale) if scale
17
- Convert.as_slices(image, x, y, count)
17
+ Convert.as_slices(image, x, y, mode, count)
18
18
  end
19
19
  end
@@ -1,28 +1,41 @@
1
+ require 'rmagick'
2
+
1
3
  module Pixelflut
2
4
  module Convert
3
- def self.each_line0(image)
4
- return to_enum(__method__, image) unless block_given?
5
- image.each_pixel do |x, y, px|
6
- px = px.to_color(Magick::AllCompliance, true, 8, true)[
7
- 1, 255 == px.alpha ? 6 : 8
8
- ]
9
- yield("PX #{x} #{y} #{px}\n")
5
+ MODE = {
6
+ rgb: lambda do |pixel|
7
+ pixel.to_color(Magick::AllCompliance, false, 8, true)[1, 6]
8
+ end,
9
+ rgba: lambda do |pixel|
10
+ pixel.to_color(Magick::AllCompliance, true, 8, true)[1, 8]
11
+ end,
12
+ rgbx: lambda do |pixel|
13
+ if pixel.alpha >= 65535
14
+ pixel.to_color(Magick::AllCompliance, false, 8, true)[1, 6]
15
+ else
16
+ pixel.to_color(Magick::AllCompliance, true, 8, true)[1, 8]
17
+ end
10
18
  end
11
- end
19
+ }.freeze
12
20
 
13
- def self.each_line(image, dx, dy)
14
- return to_enum(__method__, image, dx, dy) unless block_given?
21
+ def self.each_line(image, dx, dy, mode)
22
+ return to_enum(__method__, image, dx, dy, mode) unless block_given?
23
+ mode = MODE.fetch(mode) if Symbol === mode
15
24
  image.each_pixel do |x, y, px|
16
- px = px.to_color(Magick::AllCompliance, true, 8, true)[
17
- 1, 255 == px.alpha ? 6 : 8
18
- ]
19
- yield("PX #{x + dx} #{y + dy} #{px}\n")
25
+ yield("PX #{x + dx} #{y + dy} #{mode.call(px)}\n")
20
26
  end
21
27
  end
22
28
 
23
- def self.as_slices(image, dx, dy, count)
24
- ret = each_line(image, dx, dy).to_a.shuffle!
25
- ret.each_slice(ret.size / count).to_a
29
+ def self.as_slices(image, dx, dy, mode, count)
30
+ ret = each_line(image, dx, dy, mode).to_a.shuffle!
31
+ ret = ret.each_slice(ret.size / (count + 1)).to_a
32
+ rest = ret.pop
33
+ i = 0
34
+ rest.each do |line|
35
+ ret[i] << line
36
+ i = 0 if (i+= 1) == ret.size
37
+ end
38
+ ret
26
39
  end
27
40
  end
28
41
  end
@@ -12,34 +12,29 @@ module Pixelflut
12
12
  @socket = configure(Socket.new(address.ipv6? ? :INET6 : :INET, :STREAM))
13
13
  end
14
14
 
15
- def run
16
- connect
17
- send(@socket, @data)
15
+ def size
16
+ @data.bytesize
17
+ end
18
+
19
+ def run(&block)
20
+ @socket.connect(@addr)
21
+ send(@socket, @data, @data.bytesize, &block)
18
22
  @socket.close
19
23
  end
20
24
 
21
25
  private
22
26
 
23
- def send(socket, data)
24
- curr = String.new(data)
27
+ def send(socket, data, bytesize)
28
+ index, curr, size = 0, data, bytesize
25
29
  loop do
26
30
  written = socket.write(curr)
27
- curr =
28
- if (size = curr.bytesize - written) > 0
29
- curr.byteslice(written, size)
30
- else
31
- String.new(data)
32
- end
33
- end
34
- end
35
-
36
- def connect
37
- loop do
38
- (
39
- :wait_writable == @socket.connect_nonblock(@addr, exception: false)
40
- ) and break
31
+ if (size -= written) > 0
32
+ yield(self) if block_given?
33
+ curr = data.byteslice(index += written, size)
34
+ else
35
+ index, curr, size = 0, data, bytesize
36
+ end
41
37
  end
42
- loop{ @socket.wait_writable(10) and break }
43
38
  end
44
39
 
45
40
  def configure(socket)
@@ -1,3 +1,3 @@
1
1
  module Pixelflut
2
- VERSION = '0.1.2'.freeze
2
+ VERSION = '0.1.3'.freeze
3
3
  end
data/pixelflut.gemspec CHANGED
@@ -29,10 +29,7 @@ GemSpec = Gem::Specification.new do |spec|
29
29
 
30
30
  spec.require_paths = %w[lib]
31
31
  spec.bindir = 'bin'
32
- spec.executables =
33
- Dir
34
- .glob(File.expand_path('../bin/*', __FILE__))
35
- .map!{ |fn| File.basename(fn) }
32
+ spec.executables = %w[pxf pxf-info]
36
33
 
37
34
  all_files = %x(git ls-files -z).split(0.chr)
38
35
  spec.test_files = all_files.grep(%r{^(spec|test)/})
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pixelflut
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Blumtritt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-11-24 00:00:00.000000000 Z
11
+ date: 2019-11-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rmagick
@@ -58,6 +58,7 @@ description: |
58
58
  email: mike.blumtritt@pm.me
59
59
  executables:
60
60
  - pxf
61
+ - pxf-info
61
62
  extensions: []
62
63
  extra_rdoc_files:
63
64
  - README.md
@@ -65,6 +66,7 @@ files:
65
66
  - ".gitignore"
66
67
  - README.md
67
68
  - bin/pxf
69
+ - bin/pxf-info
68
70
  - gems.rb
69
71
  - lib/pixelflut.rb
70
72
  - lib/pixelflut/convert.rb