pixelflow_canvas 0.4.1 → 0.4.2
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 +4 -4
- data/lib/pixelflow_canvas/version.rb +1 -1
- data/lib/pixelflow_canvas.rb +186 -111
- data/test-anaglyph.rb +13 -0
- data/test-draw.rb +26 -0
- data/test-sirds.rb +36 -0
- data/test-turtle.rb +14 -0
- data/test.rb +36 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5ca8e55731e1b45c39343e18a6f7d2c5726d4a856824ff826aca5dc502c2a0d4
|
4
|
+
data.tar.gz: 5ad774dabd0ad2de3b32f180e000eb6bc42ed10f28b974cd1466bcf3451f0fb2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c4e30f5c0a236957f8fa13b69f9d479e22eb51febe7f6c1969eb93024cef0179506618ef876742312783f4c7e52d7ad927302ad66f6381374f7b80ae1f326a16
|
7
|
+
data.tar.gz: 6c7b2ba6efe13bc6b0ef3cd9327025b092b3d14997d33b32dba6eaff9cb3864879690b108280d98e647a02a44c7edbea402c39ecb0af955759adcd04c40b367f
|
data/lib/pixelflow_canvas.rb
CHANGED
@@ -18,14 +18,27 @@ module Pixelflow
|
|
18
18
|
:direct => 0,
|
19
19
|
:buffered => 1
|
20
20
|
}
|
21
|
+
COMPOSE_MODES = {
|
22
|
+
:over => 0,
|
23
|
+
:add => 1,
|
24
|
+
:subtract => 2
|
25
|
+
}
|
26
|
+
INTERPOLATION_MODES = {
|
27
|
+
:nearest => 0,
|
28
|
+
:bilinear => 1,
|
29
|
+
}
|
21
30
|
def initialize(width, height, color_mode = nil)
|
22
31
|
@width = 320
|
23
32
|
@height = 180
|
24
33
|
@x = 0
|
25
34
|
@y = 0
|
35
|
+
@r = color_mode == :palette ? 15 : 255
|
36
|
+
@g = color_mode == :palette ? 0 : 255
|
37
|
+
@b = color_mode == :palette ? 0 : 255
|
26
38
|
@color_mode = :rgb
|
27
39
|
@advance_mode = :right
|
28
40
|
@draw_mode = :direct
|
41
|
+
@compose_mode = :over
|
29
42
|
@palette = [0] * 768
|
30
43
|
@socket = TCPSocket.new('127.0.0.1', 19223)
|
31
44
|
set_size(width, height)
|
@@ -33,21 +46,7 @@ module Pixelflow
|
|
33
46
|
@last_timestamp = Time.now.to_f
|
34
47
|
end
|
35
48
|
|
36
|
-
|
37
|
-
yield(self)
|
38
|
-
end
|
39
|
-
|
40
|
-
def recreate_screen()
|
41
|
-
@screen = [0] * @width * @height * (@color_mode == :rgb ? 3 : 1)
|
42
|
-
end
|
43
|
-
|
44
|
-
def set_draw_mode(mode)
|
45
|
-
unless DRAW_MODES.keys.include?(mode)
|
46
|
-
raise "Invalid draw mode: #{mode}"
|
47
|
-
end
|
48
|
-
@draw_mode = mode
|
49
|
-
recreate_screen()
|
50
|
-
end
|
49
|
+
attr_reader :width, :height
|
51
50
|
|
52
51
|
def set_size(width, height)
|
53
52
|
@x = 0
|
@@ -59,6 +58,10 @@ module Pixelflow
|
|
59
58
|
@socket.flush
|
60
59
|
end
|
61
60
|
|
61
|
+
def recreate_screen()
|
62
|
+
@screen = [0] * @width * @height * (@color_mode == :rgb ? 3 : 1)
|
63
|
+
end
|
64
|
+
|
62
65
|
def set_color_mode(mode)
|
63
66
|
unless COLOR_MODES.keys.include?(mode)
|
64
67
|
raise "Invalid color mode: #{mode}"
|
@@ -69,15 +72,7 @@ module Pixelflow
|
|
69
72
|
@socket.flush
|
70
73
|
end
|
71
74
|
|
72
|
-
def
|
73
|
-
i = i % 256
|
74
|
-
r = (r % 256) << 2
|
75
|
-
g = (g % 256) << 2
|
76
|
-
b = (b % 256) << 2
|
77
|
-
@socket.write([3, i, r, g, b].pack('CCCCC'))
|
78
|
-
end
|
79
|
-
|
80
|
-
def set_advance(mode)
|
75
|
+
def set_advance_mode(mode)
|
81
76
|
unless ADVANCE_MODES.keys.include?(mode)
|
82
77
|
raise "Invalid advance mode: #{mode}"
|
83
78
|
end
|
@@ -86,11 +81,64 @@ module Pixelflow
|
|
86
81
|
@socket.flush
|
87
82
|
end
|
88
83
|
|
84
|
+
def set_draw_mode(mode)
|
85
|
+
unless DRAW_MODES.keys.include?(mode)
|
86
|
+
raise "Invalid draw mode: #{mode}"
|
87
|
+
end
|
88
|
+
@draw_mode = mode
|
89
|
+
end
|
90
|
+
|
91
|
+
def set_compose_mode(mode)
|
92
|
+
unless COMPOSE_MODES.keys.include?(mode)
|
93
|
+
raise "Invalid compose mode: #{mode}"
|
94
|
+
end
|
95
|
+
if mode != :over && @color_mode != :rgb
|
96
|
+
raise "Cannot switch compose mode to #{mode} in palette color mode!"
|
97
|
+
end
|
98
|
+
@compose_mode = mode
|
99
|
+
end
|
100
|
+
|
101
|
+
def set_interpolation_mode(mode)
|
102
|
+
unless INTERPOLATION_MODES.keys.include?(mode)
|
103
|
+
raise "Invalid interpolation mode: #{mode}"
|
104
|
+
end
|
105
|
+
@socket.write([8, INTERPOLATION_MODES[mode]].pack('CC'))
|
106
|
+
@socket.flush
|
107
|
+
end
|
108
|
+
|
109
|
+
def flip()
|
110
|
+
if @draw_mode == :buffered
|
111
|
+
@socket.write([7].pack('C'))
|
112
|
+
@socket.write(@screen.pack('C*'))
|
113
|
+
@socket.flush
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def ensure_max_fps(fps)
|
118
|
+
fps1 = 1.0 / fps
|
119
|
+
t = Time.now.to_f
|
120
|
+
dt = t - @last_timestamp
|
121
|
+
sleep(fps1 - dt) if dt < fps1
|
122
|
+
@last_timestamp = t
|
123
|
+
end
|
124
|
+
|
125
|
+
def set_color(r, g = 0, b = 0)
|
126
|
+
@r = r
|
127
|
+
@g = g
|
128
|
+
@b = b
|
129
|
+
end
|
130
|
+
|
131
|
+
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
|
136
|
+
@socket.write([3, i, r, g, b].pack('CCCCC'))
|
137
|
+
end
|
138
|
+
|
89
139
|
def move_to(x, y)
|
90
|
-
|
91
|
-
|
92
|
-
x1 = x1.to_i
|
93
|
-
y1 = y1.to_i
|
140
|
+
x = x.to_i
|
141
|
+
y = y.to_i
|
94
142
|
return if x < 0 || x >= @width || y < 0 || y >= @height
|
95
143
|
@x = x
|
96
144
|
@y = y
|
@@ -101,7 +149,10 @@ module Pixelflow
|
|
101
149
|
@socket.flush
|
102
150
|
end
|
103
151
|
|
104
|
-
def set_pixel(x, y, r, g =
|
152
|
+
def set_pixel(x, y, r = nil, g = nil, b = nil)
|
153
|
+
r ||= @r
|
154
|
+
g ||= @g
|
155
|
+
b ||= @b
|
105
156
|
x0 = x0.to_i
|
106
157
|
y0 = y0.to_i
|
107
158
|
x1 = x1.to_i
|
@@ -112,6 +163,14 @@ module Pixelflow
|
|
112
163
|
end
|
113
164
|
if @color_mode == :rgb
|
114
165
|
offset = (@y * @width + @x) * 3
|
166
|
+
if @compose_mode == :add
|
167
|
+
r += @screen[offset + 0]
|
168
|
+
g += @screen[offset + 1]
|
169
|
+
b += @screen[offset + 2]
|
170
|
+
r = 255 if r > 255
|
171
|
+
g = 255 if g > 255
|
172
|
+
b = 255 if b > 255
|
173
|
+
end
|
115
174
|
@screen[offset + 0] = r
|
116
175
|
@screen[offset + 1] = g
|
117
176
|
@screen[offset + 2] = b
|
@@ -155,52 +214,36 @@ module Pixelflow
|
|
155
214
|
end
|
156
215
|
end
|
157
216
|
|
158
|
-
def
|
159
|
-
if @draw_mode == :buffered
|
160
|
-
@socket.write([7].pack('C'))
|
161
|
-
@socket.write(@screen.pack('C*'))
|
162
|
-
@socket.flush
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
def ensure_max_fps(fps)
|
167
|
-
fps1 = 1.0 / fps
|
168
|
-
t = Time.now.to_f
|
169
|
-
dt = t - @last_timestamp
|
170
|
-
sleep(fps1 - dt) if dt < fps1
|
171
|
-
@last_timestamp = t
|
172
|
-
end
|
173
|
-
|
174
|
-
def draw_rect(x0, y0, x1, y1, color)
|
217
|
+
def draw_rect(x0, y0, x1, y1)
|
175
218
|
x0 = x0.to_i
|
176
219
|
y0 = y0.to_i
|
177
220
|
x1 = x1.to_i
|
178
221
|
y1 = y1.to_i
|
179
222
|
(x0..x1).each do |x|
|
180
|
-
set_pixel(x, y0
|
223
|
+
set_pixel(x, y0)
|
181
224
|
end
|
182
225
|
(x0..x1).each do |x|
|
183
|
-
set_pixel(x, y1
|
226
|
+
set_pixel(x, y1)
|
184
227
|
end
|
185
228
|
(y0+1..y1-1).each do |y|
|
186
|
-
set_pixel(x0, y
|
187
|
-
set_pixel(x1, y
|
229
|
+
set_pixel(x0, y)
|
230
|
+
set_pixel(x1, y)
|
188
231
|
end
|
189
232
|
end
|
190
233
|
|
191
|
-
def fill_rect(x0, y0, x1, y1
|
234
|
+
def fill_rect(x0, y0, x1, y1)
|
192
235
|
x0 = x0.to_i
|
193
236
|
y0 = y0.to_i
|
194
237
|
x1 = x1.to_i
|
195
238
|
y1 = y1.to_i
|
196
239
|
(y0..y1).each do |y|
|
197
240
|
(x0..x1).each do |x|
|
198
|
-
set_pixel(x, y
|
241
|
+
set_pixel(x, y)
|
199
242
|
end
|
200
243
|
end
|
201
244
|
end
|
202
245
|
|
203
|
-
def draw_line(x0, y0, x1, y1
|
246
|
+
def draw_line(x0, y0, x1, y1)
|
204
247
|
x0 = x0.to_i
|
205
248
|
y0 = y0.to_i
|
206
249
|
x1 = x1.to_i
|
@@ -211,7 +254,7 @@ module Pixelflow
|
|
211
254
|
sy = y0 < y1 ? 1 : -1
|
212
255
|
err = dx - dy
|
213
256
|
loop do
|
214
|
-
set_pixel(x0, y0
|
257
|
+
set_pixel(x0, y0)
|
215
258
|
break if x0 == x1 && y0 == y1
|
216
259
|
e2 = 2 * err
|
217
260
|
if e2 > -dy
|
@@ -225,19 +268,19 @@ module Pixelflow
|
|
225
268
|
end
|
226
269
|
end
|
227
270
|
|
228
|
-
def draw_circle(x, y,
|
271
|
+
def draw_circle(x, y, r)
|
229
272
|
x = x.to_i
|
230
273
|
y = y.to_i
|
231
|
-
|
232
|
-
f = 1 -
|
274
|
+
r = r.to_i
|
275
|
+
f = 1 - r
|
233
276
|
ddF_x = 1
|
234
|
-
ddF_y = -2 *
|
277
|
+
ddF_y = -2 * r
|
235
278
|
xx = 0
|
236
|
-
yy =
|
237
|
-
set_pixel(x, y +
|
238
|
-
set_pixel(x, y -
|
239
|
-
set_pixel(x +
|
240
|
-
set_pixel(x -
|
279
|
+
yy = r
|
280
|
+
set_pixel(x, y + r)
|
281
|
+
set_pixel(x, y - r)
|
282
|
+
set_pixel(x + r, y)
|
283
|
+
set_pixel(x - r, y)
|
241
284
|
while xx < yy
|
242
285
|
if f >= 0
|
243
286
|
yy -= 1
|
@@ -247,18 +290,18 @@ module Pixelflow
|
|
247
290
|
xx += 1
|
248
291
|
ddF_x += 2
|
249
292
|
f += ddF_x
|
250
|
-
set_pixel(x + xx, y + yy
|
251
|
-
set_pixel(x - xx, y + yy
|
252
|
-
set_pixel(x + xx, y - yy
|
253
|
-
set_pixel(x - xx, y - yy
|
254
|
-
set_pixel(x + yy, y + xx
|
255
|
-
set_pixel(x - yy, y + xx
|
256
|
-
set_pixel(x + yy, y - xx
|
257
|
-
set_pixel(x - yy, y - xx
|
293
|
+
set_pixel(x + xx, y + yy)
|
294
|
+
set_pixel(x - xx, y + yy)
|
295
|
+
set_pixel(x + xx, y - yy)
|
296
|
+
set_pixel(x - xx, y - yy)
|
297
|
+
set_pixel(x + yy, y + xx)
|
298
|
+
set_pixel(x - yy, y + xx)
|
299
|
+
set_pixel(x + yy, y - xx)
|
300
|
+
set_pixel(x - yy, y - xx)
|
258
301
|
end
|
259
302
|
end
|
260
303
|
|
261
|
-
def fill_circle(x, y, r
|
304
|
+
def fill_circle(x, y, r)
|
262
305
|
x = x.to_i
|
263
306
|
y = y.to_i
|
264
307
|
r = r.to_i
|
@@ -268,7 +311,7 @@ module Pixelflow
|
|
268
311
|
xx = 0
|
269
312
|
yy = r
|
270
313
|
(y - r..y + r).each do |i|
|
271
|
-
set_pixel(x, i
|
314
|
+
set_pixel(x, i)
|
272
315
|
end
|
273
316
|
while xx < yy
|
274
317
|
if f >= 0
|
@@ -280,33 +323,33 @@ module Pixelflow
|
|
280
323
|
ddF_x += 2
|
281
324
|
f += ddF_x
|
282
325
|
(y - yy..y + yy).each do |i|
|
283
|
-
set_pixel(x + xx, i
|
284
|
-
set_pixel(x - xx, i
|
326
|
+
set_pixel(x + xx, i)
|
327
|
+
set_pixel(x - xx, i)
|
285
328
|
end
|
286
329
|
(y - xx..y + xx).each do |i|
|
287
|
-
set_pixel(x + yy, i
|
288
|
-
set_pixel(x - yy, i
|
330
|
+
set_pixel(x + yy, i)
|
331
|
+
set_pixel(x - yy, i)
|
289
332
|
end
|
290
333
|
end
|
291
334
|
end
|
292
335
|
|
293
|
-
def draw_ellipse(x, y,
|
336
|
+
def draw_ellipse(x, y, ra, rb)
|
294
337
|
x = x.to_i
|
295
338
|
y = y.to_i
|
296
|
-
|
297
|
-
|
298
|
-
a2 =
|
299
|
-
b2 =
|
339
|
+
ra = ra.to_i
|
340
|
+
rb = rb.to_i
|
341
|
+
a2 = ra * ra
|
342
|
+
b2 = rb * rb
|
300
343
|
fa2 = 4 * a2
|
301
344
|
fb2 = 4 * b2
|
302
345
|
x0 = 0
|
303
346
|
y0 = b
|
304
|
-
sigma = 2 * b2 + a2 * (1 - 2 *
|
347
|
+
sigma = 2 * b2 + a2 * (1 - 2 * rb)
|
305
348
|
while b2 * x0 <= a2 * y0
|
306
|
-
set_pixel(x + x0, y + y0
|
307
|
-
set_pixel(x - x0, y + y0
|
308
|
-
set_pixel(x + x0, y - y0
|
309
|
-
set_pixel(x - x0, y - y0
|
349
|
+
set_pixel(x + x0, y + y0)
|
350
|
+
set_pixel(x - x0, y + y0)
|
351
|
+
set_pixel(x + x0, y - y0)
|
352
|
+
set_pixel(x - x0, y - y0)
|
310
353
|
if sigma >= 0
|
311
354
|
sigma += fa2 * (1 - y0)
|
312
355
|
y0 -= 1
|
@@ -316,12 +359,12 @@ module Pixelflow
|
|
316
359
|
end
|
317
360
|
x0 = a
|
318
361
|
y0 = 0
|
319
|
-
sigma = 2 * a2 + b2 * (1 - 2 *
|
362
|
+
sigma = 2 * a2 + b2 * (1 - 2 * ra)
|
320
363
|
while a2 * y0 <= b2 * x0
|
321
|
-
set_pixel(x + x0, y + y0
|
322
|
-
set_pixel(x - x0, y + y0
|
323
|
-
set_pixel(x + x0, y - y0
|
324
|
-
set_pixel(x - x0, y - y0
|
364
|
+
set_pixel(x + x0, y + y0)
|
365
|
+
set_pixel(x - x0, y + y0)
|
366
|
+
set_pixel(x + x0, y - y0)
|
367
|
+
set_pixel(x - x0, y - y0)
|
325
368
|
if sigma >= 0
|
326
369
|
sigma += fb2 * (1 - x0)
|
327
370
|
x0 -= 1
|
@@ -331,22 +374,22 @@ module Pixelflow
|
|
331
374
|
end
|
332
375
|
end
|
333
376
|
|
334
|
-
def fill_ellipse(x, y,
|
377
|
+
def fill_ellipse(x, y, ra, rb)
|
335
378
|
x = x.to_i
|
336
379
|
y = y.to_i
|
337
|
-
|
338
|
-
|
339
|
-
a2 =
|
340
|
-
b2 =
|
380
|
+
ra = ra.to_i
|
381
|
+
rb = rb.to_i
|
382
|
+
a2 = ra * ra
|
383
|
+
b2 = rb * rb
|
341
384
|
fa2 = 4 * a2
|
342
385
|
fb2 = 4 * b2
|
343
386
|
x0 = 0
|
344
387
|
y0 = b
|
345
|
-
sigma = 2 * b2 + a2 * (1 - 2 *
|
388
|
+
sigma = 2 * b2 + a2 * (1 - 2 * rb)
|
346
389
|
while b2 * x0 <= a2 * y0
|
347
390
|
(x - x0..x + x0).each do |i|
|
348
|
-
set_pixel(i, y + y0
|
349
|
-
set_pixel(i, y - y0
|
391
|
+
set_pixel(i, y + y0)
|
392
|
+
set_pixel(i, y - y0)
|
350
393
|
end
|
351
394
|
if sigma >= 0
|
352
395
|
sigma += fa2 * (1 - y0)
|
@@ -357,11 +400,11 @@ module Pixelflow
|
|
357
400
|
end
|
358
401
|
x0 = a
|
359
402
|
y0 = 0
|
360
|
-
sigma = 2 * a2 + b2 * (1 - 2 *
|
403
|
+
sigma = 2 * a2 + b2 * (1 - 2 * ra)
|
361
404
|
while a2 * y0 <= b2 * x0
|
362
405
|
(x - x0..x + x0).each do |i|
|
363
|
-
set_pixel(i, y + y0
|
364
|
-
set_pixel(i, y - y0
|
406
|
+
set_pixel(i, y + y0)
|
407
|
+
set_pixel(i, y - y0)
|
365
408
|
end
|
366
409
|
if sigma >= 0
|
367
410
|
sigma += fb2 * (1 - x0)
|
@@ -372,7 +415,7 @@ module Pixelflow
|
|
372
415
|
end
|
373
416
|
end
|
374
417
|
|
375
|
-
def draw_quadratic_bezier(x0, y0, x1, y1, x2, y2,
|
418
|
+
def draw_quadratic_bezier(x0, y0, x1, y1, x2, y2, steps = 100)
|
376
419
|
steps = steps.to_i
|
377
420
|
xp = nil
|
378
421
|
yp = nil
|
@@ -381,14 +424,14 @@ module Pixelflow
|
|
381
424
|
x = (1 - t) ** 2 * x0 + 2 * (1 - t) * t * x1 + t ** 2 * x2
|
382
425
|
y = (1 - t) ** 2 * y0 + 2 * (1 - t) * t * y1 + t ** 2 * y2
|
383
426
|
if xp && yp
|
384
|
-
draw_line(xp.to_i, yp.to_i, x.to_i, y.to_i
|
427
|
+
draw_line(xp.to_i, yp.to_i, x.to_i, y.to_i)
|
385
428
|
end
|
386
429
|
xp = x
|
387
430
|
yp = y
|
388
431
|
end
|
389
432
|
end
|
390
433
|
|
391
|
-
def draw_cubic_bezier(x0, y0, x1, y1, x2, y2, x3, y3,
|
434
|
+
def draw_cubic_bezier(x0, y0, x1, y1, x2, y2, x3, y3, steps = 100)
|
392
435
|
steps = steps.to_i
|
393
436
|
xp = nil
|
394
437
|
yp = nil
|
@@ -397,17 +440,49 @@ module Pixelflow
|
|
397
440
|
x = (1 - t) ** 3 * x0 + 3 * (1 - t) ** 2 * t * x1 + 3 * (1 - t) * t ** 2 * x2 + t ** 3 * x3
|
398
441
|
y = (1 - t) ** 3 * y0 + 3 * (1 - t) ** 2 * t * y1 + 3 * (1 - t) * t ** 2 * y2 + t ** 3 * y3
|
399
442
|
if xp && yp
|
400
|
-
draw_line(xp.to_i, yp.to_i, x.to_i, y.to_i
|
443
|
+
draw_line(xp.to_i, yp.to_i, x.to_i, y.to_i)
|
401
444
|
end
|
402
445
|
xp = x
|
403
446
|
yp = y
|
404
447
|
end
|
405
448
|
end
|
406
449
|
|
407
|
-
def draw_triangle(x0, y0, x1, y1, x2, y2
|
408
|
-
draw_line(x0, y0, x1, y1
|
409
|
-
draw_line(x1, y1, x2, y2
|
410
|
-
draw_line(x2, y2, x0, y0
|
450
|
+
def draw_triangle(x0, y0, x1, y1, x2, y2)
|
451
|
+
draw_line(x0, y0, x1, y1)
|
452
|
+
draw_line(x1, y1, x2, y2)
|
453
|
+
draw_line(x2, y2, x0, y0)
|
454
|
+
end
|
455
|
+
end
|
456
|
+
|
457
|
+
class Turtle
|
458
|
+
def initialize(canvas)
|
459
|
+
@canvas = canvas
|
460
|
+
@x = canvas.width / 2.0
|
461
|
+
@y = canvas.height / 2.0
|
462
|
+
@phi = 270.0
|
463
|
+
@pen_down = true
|
464
|
+
end
|
465
|
+
|
466
|
+
attr_accessor :x, :y, :phi, :color, :pen_down
|
467
|
+
|
468
|
+
def forward(l)
|
469
|
+
nx = @x + Math.cos(@phi * Math::PI / 180.0) * l
|
470
|
+
ny = @y + Math.sin(@phi * Math::PI / 180.0) * l
|
471
|
+
@canvas.draw_line(@x, @y, nx, ny) if @pen_down
|
472
|
+
@x = nx
|
473
|
+
@y = ny
|
474
|
+
end
|
475
|
+
|
476
|
+
def set_color(r = 0, g = nil, b = nil)
|
477
|
+
@canvas.set_color(r, g, b)
|
478
|
+
end
|
479
|
+
|
480
|
+
def turn_left(phi)
|
481
|
+
@phi -= phi
|
482
|
+
end
|
483
|
+
|
484
|
+
def turn_right(phi)
|
485
|
+
@phi += phi
|
411
486
|
end
|
412
487
|
end
|
413
488
|
end
|
data/test-anaglyph.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require './lib/pixelflow_canvas.rb'
|
2
|
+
|
3
|
+
width = 256
|
4
|
+
height = 256
|
5
|
+
|
6
|
+
canvas = Pixelflow::Canvas.new(width, height, :rgb)
|
7
|
+
canvas.set_compose_mode(:add)
|
8
|
+
|
9
|
+
canvas.set_color(255, 0, 0)
|
10
|
+
canvas.draw_line(10, 10, 100, 200)
|
11
|
+
|
12
|
+
canvas.set_color(0, 255, 0)
|
13
|
+
canvas.draw_line(20, 10, 90, 200)
|
data/test-draw.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require './lib/pixelflow_canvas.rb'
|
2
|
+
|
3
|
+
width = 256
|
4
|
+
height = 256
|
5
|
+
|
6
|
+
canvas = Pixelflow::Canvas.new(width, height, :palette)
|
7
|
+
canvas.set_interpolation_mode(:bilinear)
|
8
|
+
turtle = Pixelflow::Turtle.new(canvas)
|
9
|
+
turtle.set_color(13)
|
10
|
+
|
11
|
+
def draw(canvas, x0, y0, x1, y1, x2, y2, level)
|
12
|
+
canvas.draw_triangle(x0, y0, x1, y1, x2, y2)
|
13
|
+
mx0 = (x0 + x1) / 2
|
14
|
+
my0 = (y0 + y1) / 2
|
15
|
+
mx1 = (x1 + x2) / 2
|
16
|
+
my1 = (y1 + y2) / 2
|
17
|
+
mx2 = (x2 + x0) / 2
|
18
|
+
my2 = (y2 + y0) / 2
|
19
|
+
if level > 0
|
20
|
+
draw(canvas, x0, y0, mx0, my0, mx2, my2, level - 1)
|
21
|
+
draw(canvas, x1, y1, mx1, my1, mx0, my0, level - 1)
|
22
|
+
draw(canvas, x2, y2, mx2, my2, mx1, my1, level - 1)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
draw(canvas, 128, 10, 10, 186, 246, 246, 5)
|
data/test-sirds.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require './lib/pixelflow_canvas.rb'
|
2
|
+
|
3
|
+
def depth(x, y)
|
4
|
+
r = (x - 128) ** 2 + (y - 128) ** 2
|
5
|
+
return 10 if r < 5000
|
6
|
+
r * 0.001
|
7
|
+
end
|
8
|
+
|
9
|
+
width = 256
|
10
|
+
height = 256
|
11
|
+
|
12
|
+
canvas = Pixelflow::Canvas.new(width, height, :palette)
|
13
|
+
(0...64).each { |i| canvas.set_palette(i, i, i, i) }
|
14
|
+
(0...height).each do |y|
|
15
|
+
(0...48).each do |x|
|
16
|
+
canvas.set_pixel(x, y, rand(64))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
(0...height).each do |y|
|
20
|
+
sx = 0
|
21
|
+
dx = 48
|
22
|
+
while dx < width
|
23
|
+
c = canvas.get_pixel(sx, y)
|
24
|
+
canvas.set_pixel(dx, y, c)
|
25
|
+
dx += 1
|
26
|
+
sx = dx - 48 + depth(dx - 24, y)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# (0...height).each do |y|
|
31
|
+
# (0...width).each do |x|
|
32
|
+
# d = depth(x, y)
|
33
|
+
# canvas.set_pixel(x, y, d)
|
34
|
+
# end
|
35
|
+
# end
|
36
|
+
|
data/test-turtle.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require './lib/pixelflow_canvas.rb'
|
2
|
+
|
3
|
+
width = 256
|
4
|
+
height = 256
|
5
|
+
|
6
|
+
canvas = Pixelflow::Canvas.new(width, height, :palette)
|
7
|
+
turtle = Pixelflow::Turtle.new(canvas)
|
8
|
+
turtle.set_color(13)
|
9
|
+
|
10
|
+
turtle.forward(10)
|
11
|
+
turtle.turn_right(90)
|
12
|
+
turtle.forward(10)
|
13
|
+
turtle.turn_right(90)
|
14
|
+
turtle.forward(10)
|
data/test.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require './lib/pixelflow_canvas.rb'
|
2
|
+
|
3
|
+
def depth(x, y)
|
4
|
+
r = (x - 128) ** 2 + (y - 128) ** 2
|
5
|
+
return 10 if r < 5000
|
6
|
+
r * 0.001
|
7
|
+
end
|
8
|
+
|
9
|
+
width = 256
|
10
|
+
height = 256
|
11
|
+
|
12
|
+
canvas = Pixelflow::Canvas.new(width, height, :palette)
|
13
|
+
(0...64).each { |i| canvas.set_palette(i, i, i, i) }
|
14
|
+
(0...height).each do |y|
|
15
|
+
(0...48).each do |x|
|
16
|
+
canvas.set_pixel(x, y, rand(64))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
(0...height).each do |y|
|
20
|
+
sx = 0
|
21
|
+
dx = 48
|
22
|
+
while dx < width
|
23
|
+
c = canvas.get_pixel(sx, y)
|
24
|
+
canvas.set_pixel(dx, y, c)
|
25
|
+
dx += 1
|
26
|
+
sx = dx - 48 + depth(dx - 24, y)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# (0...height).each do |y|
|
31
|
+
# (0...width).each do |x|
|
32
|
+
# d = depth(x, y)
|
33
|
+
# canvas.set_pixel(x, y, d)
|
34
|
+
# end
|
35
|
+
# end
|
36
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pixelflow_canvas
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
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-
|
11
|
+
date: 2024-10-27 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Use a virtual CRT for old school graphics programming, in VS Code, from
|
14
14
|
Ruby.
|
@@ -24,6 +24,11 @@ files:
|
|
24
24
|
- lib/pixelflow_canvas.rb
|
25
25
|
- lib/pixelflow_canvas/version.rb
|
26
26
|
- sig/pixelflow_canvas.rbs
|
27
|
+
- test-anaglyph.rb
|
28
|
+
- test-draw.rb
|
29
|
+
- test-sirds.rb
|
30
|
+
- test-turtle.rb
|
31
|
+
- test.rb
|
27
32
|
homepage: https://github.com/specht/pixelflow_canvas_ruby
|
28
33
|
licenses:
|
29
34
|
- GPL-3.0-only
|