pixelflow_canvas 0.4.2 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5ca8e55731e1b45c39343e18a6f7d2c5726d4a856824ff826aca5dc502c2a0d4
4
- data.tar.gz: 5ad774dabd0ad2de3b32f180e000eb6bc42ed10f28b974cd1466bcf3451f0fb2
3
+ metadata.gz: 03bac01ad660c83aac3bb58e8b9dc009f07d99d773ebf3e4c9c77106c9016a08
4
+ data.tar.gz: 810c59ec0266aec7f5b4b20b7b411fe5e7c4383db0dd0c1614e0fc1446ae5ffc
5
5
  SHA512:
6
- metadata.gz: c4e30f5c0a236957f8fa13b69f9d479e22eb51febe7f6c1969eb93024cef0179506618ef876742312783f4c7e52d7ad927302ad66f6381374f7b80ae1f326a16
7
- data.tar.gz: 6c7b2ba6efe13bc6b0ef3cd9327025b092b3d14997d33b32dba6eaff9cb3864879690b108280d98e647a02a44c7edbea402c39ecb0af955759adcd04c40b367f
6
+ metadata.gz: 1f4d69987a229d3c369acaab172efb8d39a189ed739b0e21f5078de233b612eff4b8daaf9d85eea46a8b9c5020aafdc528fd3e6cca2f5618ca3d87e5328f1b41
7
+ data.tar.gz: 921f5a582cd70c7024e502feae11dbd2eed01eb59fa6487bc9534913b859125d8d0fe6a13665bf389184137a6f9f2b563be266832002e5fa88c772b5e5476b6f
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PixelflowCanvas
4
- VERSION = "0.4.2"
4
+ VERSION = "0.4.3"
5
5
  end
@@ -0,0 +1,50 @@
1
+ VGA_PALETTE = [
2
+ 0x00,0x00,0x00,0x00,0x00,0xaa,0x00,0xaa,0x00,0x00,0xaa,0xaa,0xaa,0x00,0x00,0xaa,
3
+ 0x00,0xaa,0xaa,0x55,0x00,0xaa,0xaa,0xaa,0x55,0x55,0x55,0x55,0x55,0xff,0x55,0xff,
4
+ 0x55,0x55,0xff,0xff,0xff,0x55,0x55,0xff,0x55,0xff,0xff,0xff,0x55,0xff,0xff,0xff,
5
+ 0x00,0x00,0x00,0x14,0x14,0x14,0x20,0x20,0x20,0x2c,0x2c,0x2c,0x38,0x38,0x38,0x45,
6
+ 0x45,0x45,0x51,0x51,0x51,0x61,0x61,0x61,0x71,0x71,0x71,0x82,0x82,0x82,0x92,0x92,
7
+ 0x92,0xa2,0xa2,0xa2,0xb6,0xb6,0xb6,0xcb,0xcb,0xcb,0xe3,0xe3,0xe3,0xff,0xff,0xff,
8
+ 0x00,0x00,0xff,0x41,0x00,0xff,0x7d,0x00,0xff,0xbe,0x00,0xff,0xff,0x00,0xff,0xff,
9
+ 0x00,0xbe,0xff,0x00,0x7d,0xff,0x00,0x41,0xff,0x00,0x00,0xff,0x41,0x00,0xff,0x7d,
10
+ 0x00,0xff,0xbe,0x00,0xff,0xff,0x00,0xbe,0xff,0x00,0x7d,0xff,0x00,0x41,0xff,0x00,
11
+ 0x00,0xff,0x00,0x00,0xff,0x41,0x00,0xff,0x7d,0x00,0xff,0xbe,0x00,0xff,0xff,0x00,
12
+ 0xbe,0xff,0x00,0x7d,0xff,0x00,0x41,0xff,0x7d,0x7d,0xff,0x9e,0x7d,0xff,0xbe,0x7d,
13
+ 0xff,0xdf,0x7d,0xff,0xff,0x7d,0xff,0xff,0x7d,0xdf,0xff,0x7d,0xbe,0xff,0x7d,0x9e,
14
+ 0xff,0x7d,0x7d,0xff,0x9e,0x7d,0xff,0xbe,0x7d,0xff,0xdf,0x7d,0xff,0xff,0x7d,0xdf,
15
+ 0xff,0x7d,0xbe,0xff,0x7d,0x9e,0xff,0x7d,0x7d,0xff,0x7d,0x7d,0xff,0x9e,0x7d,0xff,
16
+ 0xbe,0x7d,0xff,0xdf,0x7d,0xff,0xff,0x7d,0xdf,0xff,0x7d,0xbe,0xff,0x7d,0x9e,0xff,
17
+ 0xb6,0xb6,0xff,0xc7,0xb6,0xff,0xdb,0xb6,0xff,0xeb,0xb6,0xff,0xff,0xb6,0xff,0xff,
18
+ 0xb6,0xeb,0xff,0xb6,0xdb,0xff,0xb6,0xc7,0xff,0xb6,0xb6,0xff,0xc7,0xb6,0xff,0xdb,
19
+ 0xb6,0xff,0xeb,0xb6,0xff,0xff,0xb6,0xeb,0xff,0xb6,0xdb,0xff,0xb6,0xc7,0xff,0xb6,
20
+ 0xb6,0xff,0xb6,0xb6,0xff,0xc7,0xb6,0xff,0xdb,0xb6,0xff,0xeb,0xb6,0xff,0xff,0xb6,
21
+ 0xeb,0xff,0xb6,0xdb,0xff,0xb6,0xc7,0xff,0x00,0x00,0x71,0x1c,0x00,0x71,0x38,0x00,
22
+ 0x71,0x55,0x00,0x71,0x71,0x00,0x71,0x71,0x00,0x55,0x71,0x00,0x38,0x71,0x00,0x1c,
23
+ 0x71,0x00,0x00,0x71,0x1c,0x00,0x71,0x38,0x00,0x71,0x55,0x00,0x71,0x71,0x00,0x55,
24
+ 0x71,0x00,0x38,0x71,0x00,0x1c,0x71,0x00,0x00,0x71,0x00,0x00,0x71,0x1c,0x00,0x71,
25
+ 0x38,0x00,0x71,0x55,0x00,0x71,0x71,0x00,0x55,0x71,0x00,0x38,0x71,0x00,0x1c,0x71,
26
+ 0x38,0x38,0x71,0x45,0x38,0x71,0x55,0x38,0x71,0x61,0x38,0x71,0x71,0x38,0x71,0x71,
27
+ 0x38,0x61,0x71,0x38,0x55,0x71,0x38,0x45,0x71,0x38,0x38,0x71,0x45,0x38,0x71,0x55,
28
+ 0x38,0x71,0x61,0x38,0x71,0x71,0x38,0x61,0x71,0x38,0x55,0x71,0x38,0x45,0x71,0x38,
29
+ 0x38,0x71,0x38,0x38,0x71,0x45,0x38,0x71,0x55,0x38,0x71,0x61,0x38,0x71,0x71,0x38,
30
+ 0x61,0x71,0x38,0x55,0x71,0x38,0x45,0x71,0x51,0x51,0x71,0x59,0x51,0x71,0x61,0x51,
31
+ 0x71,0x69,0x51,0x71,0x71,0x51,0x71,0x71,0x51,0x69,0x71,0x51,0x61,0x71,0x51,0x59,
32
+ 0x71,0x51,0x51,0x71,0x59,0x51,0x71,0x61,0x51,0x71,0x69,0x51,0x71,0x71,0x51,0x69,
33
+ 0x71,0x51,0x61,0x71,0x51,0x59,0x71,0x51,0x51,0x71,0x51,0x51,0x71,0x59,0x51,0x71,
34
+ 0x61,0x51,0x71,0x69,0x51,0x71,0x71,0x51,0x69,0x71,0x51,0x61,0x71,0x51,0x59,0x71,
35
+ 0x00,0x00,0x41,0x10,0x00,0x41,0x20,0x00,0x41,0x30,0x00,0x41,0x41,0x00,0x41,0x41,
36
+ 0x00,0x30,0x41,0x00,0x20,0x41,0x00,0x10,0x41,0x00,0x00,0x41,0x10,0x00,0x41,0x20,
37
+ 0x00,0x41,0x30,0x00,0x41,0x41,0x00,0x30,0x41,0x00,0x20,0x41,0x00,0x10,0x41,0x00,
38
+ 0x00,0x41,0x00,0x00,0x41,0x10,0x00,0x41,0x20,0x00,0x41,0x30,0x00,0x41,0x41,0x00,
39
+ 0x30,0x41,0x00,0x20,0x41,0x00,0x10,0x41,0x20,0x20,0x41,0x28,0x20,0x41,0x30,0x20,
40
+ 0x41,0x38,0x20,0x41,0x41,0x20,0x41,0x41,0x20,0x38,0x41,0x20,0x30,0x41,0x20,0x28,
41
+ 0x41,0x20,0x20,0x41,0x28,0x20,0x41,0x30,0x20,0x41,0x38,0x20,0x41,0x41,0x20,0x38,
42
+ 0x41,0x20,0x30,0x41,0x20,0x28,0x41,0x20,0x20,0x41,0x20,0x20,0x41,0x28,0x20,0x41,
43
+ 0x30,0x20,0x41,0x38,0x20,0x41,0x41,0x20,0x38,0x41,0x20,0x30,0x41,0x20,0x28,0x41,
44
+ 0x2c,0x2c,0x41,0x30,0x2c,0x41,0x34,0x2c,0x41,0x3c,0x2c,0x41,0x41,0x2c,0x41,0x41,
45
+ 0x2c,0x3c,0x41,0x2c,0x34,0x41,0x2c,0x30,0x41,0x2c,0x2c,0x41,0x30,0x2c,0x41,0x34,
46
+ 0x2c,0x41,0x3c,0x2c,0x41,0x41,0x2c,0x3c,0x41,0x2c,0x34,0x41,0x2c,0x30,0x41,0x2c,
47
+ 0x2c,0x41,0x2c,0x2c,0x41,0x30,0x2c,0x41,0x34,0x2c,0x41,0x3c,0x2c,0x41,0x41,0x2c,
48
+ 0x3c,0x41,0x2c,0x34,0x41,0x2c,0x30,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
49
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
50
+ ]
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "pixelflow_canvas/version"
4
+ require_relative "pixelflow_canvas/vga_palette.rb"
5
+ require 'chunky_png'
4
6
  require 'socket'
5
7
  require 'time'
6
8
 
@@ -39,7 +41,7 @@ module Pixelflow
39
41
  @advance_mode = :right
40
42
  @draw_mode = :direct
41
43
  @compose_mode = :over
42
- @palette = [0] * 768
44
+ @palette = VGA_PALETTE.dup
43
45
  @socket = TCPSocket.new('127.0.0.1', 19223)
44
46
  set_size(width, height)
45
47
  set_color_mode(color_mode) if color_mode
@@ -67,6 +69,9 @@ module Pixelflow
67
69
  raise "Invalid color mode: #{mode}"
68
70
  end
69
71
  @color_mode = mode
72
+ if mode == :palette
73
+ @palette = VGA_PALETTE.dup
74
+ end
70
75
  recreate_screen()
71
76
  @socket.write([2, COLOR_MODES[@color_mode]].pack('CC'))
72
77
  @socket.flush
@@ -122,6 +127,29 @@ module Pixelflow
122
127
  @last_timestamp = t
123
128
  end
124
129
 
130
+ def save_as_png(path)
131
+ if @color_mode == :rgb
132
+ image = ChunkyPNG::Image.from_rgb_stream(@width, @height, @screen.pack('C*'))
133
+ image.save(path)
134
+ else
135
+ buffer = [0] * @width * @height * 3
136
+ offset = 0
137
+ source = 0
138
+ (0...@height).each do |y|
139
+ (0...@width).each do |x|
140
+ i = @screen[source]
141
+ buffer[offset + 0] = @palette[i + 0]
142
+ buffer[offset + 1] = @palette[i + 1]
143
+ buffer[offset + 2] = @palette[i + 2]
144
+ source += 1
145
+ offset += 3
146
+ end
147
+ end
148
+ image = ChunkyPNG::Image.from_rgb_stream(@width, @height, buffer.pack('C*'))
149
+ image.save(path)
150
+ end
151
+ end
152
+
125
153
  def set_color(r, g = 0, b = 0)
126
154
  @r = r
127
155
  @g = g
@@ -129,11 +157,15 @@ module Pixelflow
129
157
  end
130
158
 
131
159
  def set_palette(i, r, g, b)
132
- i = i % 256
133
- r = (r % 256) << 2
134
- g = (g % 256) << 2
135
- b = (b % 256) << 2
160
+ i = i.to_i.clamp(0, 255)
161
+ r = r.to_i.clamp(0, 255)
162
+ g = g.to_i.clamp(0, 255)
163
+ b = b.to_i.clamp(0, 255)
164
+ @palette[i * 3 + 0] = r
165
+ @palette[i * 3 + 1] = g
166
+ @palette[i * 3 + 2] = b
136
167
  @socket.write([3, i, r, g, b].pack('CCCCC'))
168
+ @socket.flush
137
169
  end
138
170
 
139
171
  def move_to(x, y)
data/test-anaglyph.rb CHANGED
@@ -10,4 +10,6 @@ canvas.set_color(255, 0, 0)
10
10
  canvas.draw_line(10, 10, 100, 200)
11
11
 
12
12
  canvas.set_color(0, 255, 0)
13
- canvas.draw_line(20, 10, 90, 200)
13
+ canvas.draw_line(20, 10, 90, 200)
14
+
15
+ canvas.save_as_png('anaglyph.png')
data/test-sirds.rb CHANGED
@@ -10,7 +10,7 @@ width = 256
10
10
  height = 256
11
11
 
12
12
  canvas = Pixelflow::Canvas.new(width, height, :palette)
13
- (0...64).each { |i| canvas.set_palette(i, i, i, i) }
13
+ (0...64).each { |i| canvas.set_palette(i, i * 4, i * 4, i * 4) }
14
14
  (0...height).each do |y|
15
15
  (0...48).each do |x|
16
16
  canvas.set_pixel(x, y, rand(64))
@@ -34,3 +34,4 @@ end
34
34
  # end
35
35
  # end
36
36
 
37
+ canvas.save_as_png('sirds.png')
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pixelflow_canvas
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Specht
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-10-27 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2024-10-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: chunky_png
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.4.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.4.0
13
27
  description: Use a virtual CRT for old school graphics programming, in VS Code, from
14
28
  Ruby.
15
29
  email:
@@ -23,6 +37,7 @@ files:
23
37
  - Rakefile
24
38
  - lib/pixelflow_canvas.rb
25
39
  - lib/pixelflow_canvas/version.rb
40
+ - lib/pixelflow_canvas/vga_palette.rb
26
41
  - sig/pixelflow_canvas.rbs
27
42
  - test-anaglyph.rb
28
43
  - test-draw.rb