pixelflow_canvas 0.7.2 → 0.7.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 +4 -4
- data/lib/pixelflow_canvas/version.rb +1 -1
- data/lib/pixelflow_canvas.rb +132 -9
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 41a7011e19eb27f8dfa28ad15746219181b319916b7e96282cd4d2e4e6763f78
|
4
|
+
data.tar.gz: 243ea9344e2497cbd997dc22e7fa9bec85bd8b4b20bc304ecd12b96788431352
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e1a230c46f83f1a526bcf3c52bd30ce54a95576234a1c24f9c6bd6556cb1855186769f788f2a23f7a64146c464473fe7590a09d23bc270714ac484ea27d6ff5e
|
7
|
+
data.tar.gz: 122f9cc6306a6a510ddcdfb6922e33a98d0efe71fcf0ae37fff06ef85aa64b416a28dc46f9c85e37e23af6916590739484fccd4622ae19f9ab3623e638e496be
|
data/lib/pixelflow_canvas.rb
CHANGED
@@ -39,6 +39,7 @@ module Pixelflow
|
|
39
39
|
@r = color_mode == :palette ? 15 : 255
|
40
40
|
@g = color_mode == :palette ? 0 : 255
|
41
41
|
@b = color_mode == :palette ? 0 : 255
|
42
|
+
@mask = nil
|
42
43
|
@color_mode = :rgb
|
43
44
|
@advance_mode = :right
|
44
45
|
@draw_mode = :direct
|
@@ -53,7 +54,7 @@ module Pixelflow
|
|
53
54
|
end
|
54
55
|
end
|
55
56
|
|
56
|
-
attr_reader :width, :height
|
57
|
+
attr_reader :width, :height, :color_mode
|
57
58
|
|
58
59
|
def run(&block)
|
59
60
|
instance_eval(&block)
|
@@ -159,6 +160,42 @@ module Pixelflow
|
|
159
160
|
end
|
160
161
|
end
|
161
162
|
|
163
|
+
class MaskGenerator
|
164
|
+
def initialize(canvas)
|
165
|
+
@canvas = canvas
|
166
|
+
@mask = [false] * canvas.width * canvas.height
|
167
|
+
end
|
168
|
+
|
169
|
+
attr_reader :mask
|
170
|
+
|
171
|
+
def add_color(r = nil, g = nil, b = nil)
|
172
|
+
offset = 0
|
173
|
+
(0...@canvas.height).each do |y|
|
174
|
+
(0...@canvas.width).each do |x|
|
175
|
+
if @canvas.color_mode == :rgb
|
176
|
+
if @canvas.get_pixel(x, y) == [r, g, b]
|
177
|
+
@mask[offset] = true
|
178
|
+
end
|
179
|
+
else
|
180
|
+
if @canvas.get_pixel(x, y) == r
|
181
|
+
@mask[offset] = true
|
182
|
+
end
|
183
|
+
end
|
184
|
+
offset += 1
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
def set_mask(&block)
|
191
|
+
@mask = MaskGenerator.new(self)
|
192
|
+
@mask.instance_eval(&block)
|
193
|
+
end
|
194
|
+
|
195
|
+
def remove_mask()
|
196
|
+
@mask = nil
|
197
|
+
end
|
198
|
+
|
162
199
|
def set_color(r, g = 0, b = 0)
|
163
200
|
@r = r
|
164
201
|
@g = g
|
@@ -218,14 +255,15 @@ module Pixelflow
|
|
218
255
|
r ||= @r
|
219
256
|
g ||= @g
|
220
257
|
b ||= @b
|
221
|
-
|
222
|
-
|
223
|
-
x1 = x1.to_i
|
224
|
-
y1 = y1.to_i
|
258
|
+
x = x.to_i
|
259
|
+
y = y.to_i
|
225
260
|
return if x < 0 || x >= @width || y < 0 || y >= @height
|
226
261
|
unless x == @x && y == @y
|
227
262
|
move_to(x, y)
|
228
263
|
end
|
264
|
+
if @mask
|
265
|
+
return unless @mask.mask[y * @width + x]
|
266
|
+
end
|
229
267
|
if @color_mode == :rgb
|
230
268
|
offset = (@y * @width + @x) * 3
|
231
269
|
if @compose_mode == :add
|
@@ -267,10 +305,8 @@ module Pixelflow
|
|
267
305
|
end
|
268
306
|
|
269
307
|
def get_pixel(x, y)
|
270
|
-
|
271
|
-
|
272
|
-
x1 = x1.to_i
|
273
|
-
y1 = y1.to_i
|
308
|
+
x = x.to_i
|
309
|
+
y = y.to_i
|
274
310
|
return 0 if x < 0 || x >= @width || y < 0 || y >= @height
|
275
311
|
if @color_mode == :rgb
|
276
312
|
return @screen[(y * @width + x) * 3, 3]
|
@@ -480,6 +516,54 @@ module Pixelflow
|
|
480
516
|
end
|
481
517
|
end
|
482
518
|
|
519
|
+
def draw_arc(x, y, r, a0, a1, close_path = false)
|
520
|
+
# x = x.to_i
|
521
|
+
# y = y.to_i
|
522
|
+
# r = r.to_i
|
523
|
+
a0 = a0.to_f
|
524
|
+
a1 = a1.to_f
|
525
|
+
a0 = a0 * Math::PI / 180.0
|
526
|
+
a1 = a1 * Math::PI / 180.0
|
527
|
+
da = 1.0 / r
|
528
|
+
a = a0
|
529
|
+
while a < a1
|
530
|
+
x0 = x + r * Math.cos(a)
|
531
|
+
y0 = y + r * Math.sin(a)
|
532
|
+
a += da
|
533
|
+
x1 = x + r * Math.cos(a)
|
534
|
+
y1 = y + r * Math.sin(a)
|
535
|
+
draw_line(x0, y0, x1, y1)
|
536
|
+
end
|
537
|
+
if close_path
|
538
|
+
x0 = x + r * Math.cos(a0)
|
539
|
+
y0 = y + r * Math.sin(a0)
|
540
|
+
draw_line(x, y, x0, y0)
|
541
|
+
x0 = x + r * Math.cos(a1)
|
542
|
+
y0 = y + r * Math.sin(a1)
|
543
|
+
draw_line(x, y, x0, y0)
|
544
|
+
end
|
545
|
+
end
|
546
|
+
|
547
|
+
def fill_arc(x, y, r, a0, a1)
|
548
|
+
# x = x.to_i
|
549
|
+
# y = y.to_i
|
550
|
+
# r = r.to_i
|
551
|
+
a0 = a0.to_f
|
552
|
+
a1 = a1.to_f
|
553
|
+
a0 = a0 * Math::PI / 180.0
|
554
|
+
a1 = a1 * Math::PI / 180.0
|
555
|
+
da = 1.0 / r
|
556
|
+
a = a0
|
557
|
+
while a < a1
|
558
|
+
x0 = x + r * Math.cos(a)
|
559
|
+
y0 = y + r * Math.sin(a)
|
560
|
+
a += da
|
561
|
+
x1 = x + r * Math.cos(a)
|
562
|
+
y1 = y + r * Math.sin(a)
|
563
|
+
fill_triangle(x, y, x0, y0, x1, y1)
|
564
|
+
end
|
565
|
+
end
|
566
|
+
|
483
567
|
def draw_quadratic_bezier(x0, y0, x1, y1, x2, y2, steps = 100)
|
484
568
|
steps = steps.to_i
|
485
569
|
xp = nil
|
@@ -518,6 +602,45 @@ module Pixelflow
|
|
518
602
|
draw_line(x2, y2, x0, y0)
|
519
603
|
end
|
520
604
|
|
605
|
+
def fill_triangle(x0, y0, x1, y1, x2, y2)
|
606
|
+
x0 = x0.to_i
|
607
|
+
y0 = y0.to_i
|
608
|
+
x1 = x1.to_i
|
609
|
+
y1 = y1.to_i
|
610
|
+
x2 = x2.to_i
|
611
|
+
y2 = y2.to_i
|
612
|
+
if y0 > y1
|
613
|
+
x0, x1 = x1, x0
|
614
|
+
y0, y1 = y1, y0
|
615
|
+
end
|
616
|
+
if y1 > y2
|
617
|
+
x1, x2 = x2, x1
|
618
|
+
y1, y2 = y2, y1
|
619
|
+
end
|
620
|
+
if y0 > y1
|
621
|
+
x0, x1 = x1, x0
|
622
|
+
y0, y1 = y1, y0
|
623
|
+
end
|
624
|
+
total_height = y2 - y0
|
625
|
+
(0...total_height).each do |i|
|
626
|
+
second_half = i > y1 - y0 || y1 == y0
|
627
|
+
segment_height = second_half ? y2 - y1 : y1 - y0
|
628
|
+
alpha = i.to_f / total_height
|
629
|
+
beta = (i - (second_half ? y1 - y0 : 0)).to_f / segment_height
|
630
|
+
ax = x0 + (x2 - x0) * alpha
|
631
|
+
ay = y0 + (y2 - y0) * alpha
|
632
|
+
bx = second_half ? x1 + (x2 - x1) * beta : x0 + (x1 - x0) * beta
|
633
|
+
by = second_half ? y1 + (y2 - y1) * beta : y0 + (y1 - y0) * beta
|
634
|
+
if ax > bx
|
635
|
+
ax, bx = bx, ax
|
636
|
+
ay, by = by, ay
|
637
|
+
end
|
638
|
+
(ax.to_i..bx.to_i).each do |j|
|
639
|
+
set_pixel(j, y0 + i)
|
640
|
+
end
|
641
|
+
end
|
642
|
+
end
|
643
|
+
|
521
644
|
def flood_fill(x, y, r = nil, g = nil, b = nil)
|
522
645
|
x = x.to_i
|
523
646
|
y = y.to_i
|