rubysketch 0.3.7 → 0.3.12
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/ChangeLog.md +28 -0
- data/README.md +9 -1
- data/Rakefile +25 -0
- data/VERSION +1 -1
- data/examples/camera.rb +1 -1
- data/examples/delay_camera.rb +33 -0
- data/lib/rubysketch/processing.rb +125 -43
- data/lib/rubysketch/window.rb +50 -14
- data/test/helper.rb +0 -5
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb34f91483c8d24fb65c537455d808c3f0f9ac337eed9199440623ba564ef710
|
4
|
+
data.tar.gz: 2c7dd117d90a04210d256dd36185f599ca7527abbaad4dd48757cb83b49edfe8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50ef4e1473605388da623a0e252061c4cd611969d9665bd5cf2212ed9a7930dd313915f2fb27879939a9ef0bea4e1d84bcc70349c6757a931dbfcd7fb30fa240
|
7
|
+
data.tar.gz: 818c2ffc497f2f4f044832e702799ba005f826f03dcf626e8862dd1127b7061f6d1e4653dfe0ffcf07e3fc7a7b7579655387452a77f421a289de2660b2344a48
|
data/ChangeLog.md
CHANGED
@@ -1,6 +1,34 @@
|
|
1
1
|
# RubySketch ChangeLog
|
2
2
|
|
3
3
|
|
4
|
+
## [0.3.12] - 2020-12-10
|
5
|
+
|
6
|
+
- size() and createCanvas() take 'pixelDensity' parameter and default value is 1
|
7
|
+
|
8
|
+
|
9
|
+
## [0.3.11] - 2020-12-9
|
10
|
+
|
11
|
+
- add size(), createCanvas() and pixelDensity()
|
12
|
+
|
13
|
+
|
14
|
+
## [0.3.10] - 2020-12-1
|
15
|
+
|
16
|
+
- invert angle parameter value for arc() to fix compatibility to processing API
|
17
|
+
|
18
|
+
|
19
|
+
## [0.3.9] - 2020-11-30
|
20
|
+
|
21
|
+
- Graphics#beginDraw() can take block to call endDraw automatically
|
22
|
+
- Capture#start() always returns nil
|
23
|
+
- add delay_camera.rb
|
24
|
+
|
25
|
+
|
26
|
+
## [0.3.8] - 2020-11-27
|
27
|
+
|
28
|
+
- Capture#initialize() can take requestWidth, requestHeight and cameraName
|
29
|
+
- add Capture#width and Capture#height
|
30
|
+
|
31
|
+
|
4
32
|
## [0.3.7] - 2020-11-18
|
5
33
|
|
6
34
|
- add Capture class
|
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -23,3 +23,28 @@ generate_documents
|
|
23
23
|
build_ruby_gem
|
24
24
|
|
25
25
|
task :default => :test
|
26
|
+
|
27
|
+
|
28
|
+
namespace :version do
|
29
|
+
|
30
|
+
namespace :bump do
|
31
|
+
|
32
|
+
task :major do
|
33
|
+
update_and_tag_version 0
|
34
|
+
end
|
35
|
+
|
36
|
+
task :minor do
|
37
|
+
update_and_tag_version 1
|
38
|
+
end
|
39
|
+
|
40
|
+
task :patch do
|
41
|
+
update_and_tag_version 2
|
42
|
+
end
|
43
|
+
|
44
|
+
task :build do
|
45
|
+
update_and_tag_version 3
|
46
|
+
end
|
47
|
+
|
48
|
+
end# bump
|
49
|
+
|
50
|
+
end# version
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.12
|
data/examples/camera.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
%w[xot rays reflex rubysketch]
|
2
|
+
.map {|s| File.expand_path "../../#{s}/lib", __dir__}
|
3
|
+
.each {|s| $:.unshift s if !$:.include?(s) && File.directory?(s)}
|
4
|
+
|
5
|
+
require 'rubysketch-processing'
|
6
|
+
|
7
|
+
|
8
|
+
w, h = width, height
|
9
|
+
|
10
|
+
cam = Capture.new w, h, Capture.list.last
|
11
|
+
cam.start
|
12
|
+
|
13
|
+
images = 60.times.map {
|
14
|
+
Graphics.new w, h
|
15
|
+
}
|
16
|
+
|
17
|
+
draw do
|
18
|
+
if frameCount % 2 == 0
|
19
|
+
images.unshift images.pop
|
20
|
+
images.first.tap do |image|
|
21
|
+
image.beginDraw {
|
22
|
+
image.image cam, 0, 0
|
23
|
+
}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
background 0
|
28
|
+
segment_h= h / images.size
|
29
|
+
images.each.with_index do |image, i|
|
30
|
+
y = i * segment_h
|
31
|
+
copy image, 0, y, w, segment_h, 0, y, w, segment_h
|
32
|
+
end
|
33
|
+
end
|
@@ -737,22 +737,41 @@ module RubySketch
|
|
737
737
|
# @return [Array] device name list
|
738
738
|
#
|
739
739
|
def self.list ()
|
740
|
-
|
740
|
+
Rays::Camera.device_names
|
741
741
|
end
|
742
742
|
|
743
743
|
# Initialize camera object.
|
744
744
|
#
|
745
|
-
|
746
|
-
|
745
|
+
# @overload Capture.new()
|
746
|
+
# @overload Capture.new(cameraName)
|
747
|
+
# @overload Capture.new(requestWidth, requestHeight)
|
748
|
+
# @overload Capture.new(requestWidth, requestHeight, cameraName)
|
749
|
+
#
|
750
|
+
# @param requestWidth [Integer] captured image width
|
751
|
+
# @param requestHeight [Integer] captured image height
|
752
|
+
# @param cameraName [String] camera device name
|
753
|
+
#
|
754
|
+
def initialize (*args)
|
755
|
+
width, height, name =
|
756
|
+
if args.empty?
|
757
|
+
[-1, -1, nil]
|
758
|
+
elsif args[0].kind_of?(String)
|
759
|
+
[-1, -1, args[0]]
|
760
|
+
elsif args[0].kind_of?(Numeric) && args[1].kind_of?(Numeric)
|
761
|
+
[args[0], args[1], args[2]]
|
762
|
+
else
|
763
|
+
raise ArgumentError
|
764
|
+
end
|
765
|
+
@camera = Rays::Camera.new width, height, device_name: name
|
747
766
|
end
|
748
767
|
|
749
768
|
# Start capturing.
|
750
769
|
#
|
751
|
-
# @return [
|
770
|
+
# @return [nil] nil
|
752
771
|
#
|
753
772
|
def start ()
|
754
773
|
raise "Failed to start capture" unless @camera.start
|
755
|
-
|
774
|
+
nil
|
756
775
|
end
|
757
776
|
|
758
777
|
# Stop capturing.
|
@@ -778,6 +797,22 @@ module RubySketch
|
|
778
797
|
@camera.image
|
779
798
|
end
|
780
799
|
|
800
|
+
# Returns the width of captured image
|
801
|
+
#
|
802
|
+
# @return [Numeric] the width of captured image
|
803
|
+
#
|
804
|
+
def width ()
|
805
|
+
@camera.image&.width || 0
|
806
|
+
end
|
807
|
+
|
808
|
+
# Returns the height of captured image
|
809
|
+
#
|
810
|
+
# @return [Numeric] the height of captured image
|
811
|
+
#
|
812
|
+
def height ()
|
813
|
+
@camera.image&.height || 0
|
814
|
+
end
|
815
|
+
|
781
816
|
# @private
|
782
817
|
def getInternal__ ()
|
783
818
|
@camera.image || dummyImage__
|
@@ -878,10 +913,7 @@ module RubySketch
|
|
878
913
|
#
|
879
914
|
SQUARE = :square
|
880
915
|
|
881
|
-
def
|
882
|
-
@painter__ = painter
|
883
|
-
@painter__.miter_limit = 10
|
884
|
-
|
916
|
+
def init__ (image, painter)
|
885
917
|
@drawing__ = false
|
886
918
|
@hsbColor__ = false
|
887
919
|
@colorMaxes__ = [1.0] * 4
|
@@ -894,6 +926,8 @@ module RubySketch
|
|
894
926
|
@matrixStack__ = []
|
895
927
|
@styleStack__ = []
|
896
928
|
|
929
|
+
updateCanvas__ image, painter
|
930
|
+
|
897
931
|
colorMode RGB, 255
|
898
932
|
angleMode RADIANS
|
899
933
|
rectMode CORNER
|
@@ -905,13 +939,19 @@ module RubySketch
|
|
905
939
|
stroke 0
|
906
940
|
end
|
907
941
|
|
908
|
-
def
|
942
|
+
def updateCanvas__ (image, painter)
|
943
|
+
@image__, @painter__ = image, painter
|
944
|
+
end
|
945
|
+
|
946
|
+
# @private
|
947
|
+
def beginDraw__ ()
|
909
948
|
@matrixStack__.clear
|
910
949
|
@styleStack__.clear
|
911
950
|
@drawing__ = true
|
912
951
|
end
|
913
952
|
|
914
|
-
|
953
|
+
# @private
|
954
|
+
def endDraw__ ()
|
915
955
|
@drawing__ = false
|
916
956
|
end
|
917
957
|
|
@@ -1332,8 +1372,8 @@ module RubySketch
|
|
1332
1372
|
def arc (a, b, c, d, start, stop)
|
1333
1373
|
assertDrawing__
|
1334
1374
|
x, y, w, h = toXYWH__ @ellipseMode__, a, b, c, d
|
1335
|
-
start = toAngle__ start
|
1336
|
-
stop = toAngle__ stop
|
1375
|
+
start = toAngle__ -start
|
1376
|
+
stop = toAngle__ -stop
|
1337
1377
|
@painter__.ellipse x, y, w, h, from: start, to: stop
|
1338
1378
|
nil
|
1339
1379
|
end
|
@@ -1675,23 +1715,27 @@ module RubySketch
|
|
1675
1715
|
# Initialize graphics object.
|
1676
1716
|
#
|
1677
1717
|
def initialize (width, height)
|
1678
|
-
|
1679
|
-
|
1718
|
+
image = Rays::Image.new width, height
|
1719
|
+
init__ image, image.painter
|
1680
1720
|
end
|
1681
1721
|
|
1682
1722
|
# Start drawing.
|
1683
1723
|
#
|
1684
|
-
def beginDraw ()
|
1724
|
+
def beginDraw (&block)
|
1685
1725
|
@painter__.__send__ :begin_paint
|
1686
|
-
|
1726
|
+
beginDraw__
|
1687
1727
|
push
|
1728
|
+
if block
|
1729
|
+
block.call
|
1730
|
+
endDraw
|
1731
|
+
end
|
1688
1732
|
end
|
1689
1733
|
|
1690
1734
|
# End drawing.
|
1691
1735
|
#
|
1692
1736
|
def endDraw ()
|
1693
1737
|
pop
|
1694
|
-
|
1738
|
+
endDraw__
|
1695
1739
|
@painter__.__send__ :end_paint
|
1696
1740
|
end
|
1697
1741
|
|
@@ -1708,8 +1752,10 @@ module RubySketch
|
|
1708
1752
|
Capture = Processing::Capture
|
1709
1753
|
Graphics = Processing::Graphics
|
1710
1754
|
|
1755
|
+
# @private
|
1711
1756
|
@@context__ = nil
|
1712
1757
|
|
1758
|
+
# @private
|
1713
1759
|
def self.context__ ()
|
1714
1760
|
@@context__
|
1715
1761
|
end
|
@@ -1719,23 +1765,21 @@ module RubySketch
|
|
1719
1765
|
@@context__ = self
|
1720
1766
|
|
1721
1767
|
@window__ = window
|
1722
|
-
@
|
1723
|
-
setup__ @window__.canvas_painter.paint {background 0.8}
|
1768
|
+
init__ @window__.canvas, @window__.canvas_painter.paint {background 0.8}
|
1724
1769
|
|
1725
1770
|
@loop__ = true
|
1726
1771
|
@redraw__ = false
|
1727
1772
|
@frameCount__ = 0
|
1728
1773
|
@mousePos__ =
|
1729
|
-
@mousePrevPos__ =
|
1774
|
+
@mousePrevPos__ = [0, 0]
|
1730
1775
|
@mousePressed__ = false
|
1731
1776
|
@touches__ = []
|
1732
1777
|
|
1733
|
-
@window__.before_draw = proc {
|
1734
|
-
@window__.after_draw = proc {
|
1778
|
+
@window__.before_draw = proc {beginDraw__}
|
1779
|
+
@window__.after_draw = proc {endDraw__}
|
1735
1780
|
|
1736
1781
|
drawFrame = -> {
|
1737
|
-
@
|
1738
|
-
@painter__ = @window__.canvas_painter
|
1782
|
+
updateCanvas__ @window__.canvas, @window__.canvas_painter
|
1739
1783
|
begin
|
1740
1784
|
push
|
1741
1785
|
@drawBlock__.call if @drawBlock__
|
@@ -1754,9 +1798,11 @@ module RubySketch
|
|
1754
1798
|
end
|
1755
1799
|
|
1756
1800
|
updatePointerStates = -> event, pressed = nil {
|
1757
|
-
@mousePos__ = event.pos
|
1801
|
+
@mousePos__ = @window__.to_canvas_coord event.pos.x, event.pos.y
|
1758
1802
|
@mousePressed__ = pressed if pressed != nil
|
1759
|
-
@touches__ = event.positions.map {|pos|
|
1803
|
+
@touches__ = event.positions.map {|pos|
|
1804
|
+
Touch.new *@window__.to_canvas_coord(pos.x, pos.y)
|
1805
|
+
}
|
1760
1806
|
}
|
1761
1807
|
|
1762
1808
|
@window__.pointer_down = proc do |e|
|
@@ -1834,15 +1880,59 @@ module RubySketch
|
|
1834
1880
|
nil
|
1835
1881
|
end
|
1836
1882
|
|
1883
|
+
# Changes canvas size.
|
1884
|
+
#
|
1885
|
+
# @param width [Integer] new width
|
1886
|
+
# @param height [Integer] new height
|
1887
|
+
#
|
1888
|
+
# @return [nil] nil
|
1889
|
+
#
|
1890
|
+
def size (width, height, pixelDensity: 1)
|
1891
|
+
resizeCanvas__ :size, width, height, pixelDensity
|
1892
|
+
nil
|
1893
|
+
end
|
1894
|
+
|
1895
|
+
# Changes canvas size.
|
1896
|
+
#
|
1897
|
+
# @param width [Integer] new width
|
1898
|
+
# @param height [Integer] new height
|
1899
|
+
#
|
1900
|
+
# @return [nil] nil
|
1901
|
+
#
|
1902
|
+
def createCanvas (width, height, pixelDensity: 1)
|
1903
|
+
resizeCanvas__ :createCanvas, width, height, pixelDensity
|
1904
|
+
nil
|
1905
|
+
end
|
1906
|
+
|
1907
|
+
# Changes and returns canvas pixel density.
|
1908
|
+
#
|
1909
|
+
# @param density [Numeric] new pixel density
|
1910
|
+
#
|
1911
|
+
# @return [Numeric] current pixel density
|
1912
|
+
#
|
1913
|
+
def pixelDensity (density = nil)
|
1914
|
+
resizeCanvas__ :pixelDensity, width, height, density if density
|
1915
|
+
@painter__.pixel_density
|
1916
|
+
end
|
1917
|
+
|
1837
1918
|
# @private
|
1838
|
-
|
1839
|
-
raise '
|
1919
|
+
def resizeCanvas__ (name, width, height, pixelDensity)
|
1920
|
+
raise '#{name}() must be called on startup or setup block' if @started__
|
1840
1921
|
|
1841
1922
|
@painter__.__send__ :end_paint
|
1842
|
-
@window__.__send__ :
|
1923
|
+
@window__.__send__ :resize_canvas, width, height, pixelDensity
|
1924
|
+
updateCanvas__ @window__.canvas, @window__.canvas_painter
|
1843
1925
|
@painter__.__send__ :begin_paint
|
1844
1926
|
|
1845
|
-
@
|
1927
|
+
@window__.auto_resize = false
|
1928
|
+
end
|
1929
|
+
|
1930
|
+
# Returns pixel density of display.
|
1931
|
+
#
|
1932
|
+
# @return [Numeric] pixel density
|
1933
|
+
#
|
1934
|
+
def displayDensity ()
|
1935
|
+
@window__.painter.pixel_density
|
1846
1936
|
end
|
1847
1937
|
|
1848
1938
|
def windowWidth ()
|
@@ -1869,20 +1959,12 @@ module RubySketch
|
|
1869
1959
|
@window__.event.fps
|
1870
1960
|
end
|
1871
1961
|
|
1872
|
-
# Returns pixel density
|
1873
|
-
#
|
1874
|
-
# @return [Numeric] pixel density
|
1875
|
-
#
|
1876
|
-
def displayDensity ()
|
1877
|
-
@painter__.pixel_density
|
1878
|
-
end
|
1879
|
-
|
1880
1962
|
# Returns mouse x position
|
1881
1963
|
#
|
1882
1964
|
# @return [Numeric] horizontal position of mouse
|
1883
1965
|
#
|
1884
1966
|
def mouseX ()
|
1885
|
-
@mousePos__
|
1967
|
+
@mousePos__[0]
|
1886
1968
|
end
|
1887
1969
|
|
1888
1970
|
# Returns mouse y position
|
@@ -1890,7 +1972,7 @@ module RubySketch
|
|
1890
1972
|
# @return [Numeric] vertical position of mouse
|
1891
1973
|
#
|
1892
1974
|
def mouseY ()
|
1893
|
-
@mousePos__
|
1975
|
+
@mousePos__[1]
|
1894
1976
|
end
|
1895
1977
|
|
1896
1978
|
# Returns mouse x position in previous frame
|
@@ -1898,7 +1980,7 @@ module RubySketch
|
|
1898
1980
|
# @return [Numeric] horizontal position of mouse
|
1899
1981
|
#
|
1900
1982
|
def pmouseX ()
|
1901
|
-
@mousePrevPos__
|
1983
|
+
@mousePrevPos__[0]
|
1902
1984
|
end
|
1903
1985
|
|
1904
1986
|
# Returns mouse y position in previous frame
|
@@ -1906,7 +1988,7 @@ module RubySketch
|
|
1906
1988
|
# @return [Numeric] vertical position of mouse
|
1907
1989
|
#
|
1908
1990
|
def pmouseY ()
|
1909
|
-
@mousePrevPos__
|
1991
|
+
@mousePrevPos__[1]
|
1910
1992
|
end
|
1911
1993
|
|
1912
1994
|
# Returns array of touches
|
data/lib/rubysketch/window.rb
CHANGED
@@ -16,7 +16,8 @@ module RubySketch
|
|
16
16
|
@auto_resize = true
|
17
17
|
@error = nil
|
18
18
|
|
19
|
-
|
19
|
+
painter.miter_limit = 10
|
20
|
+
resize_canvas 1, 1
|
20
21
|
|
21
22
|
super *args, size: [width, height], &block
|
22
23
|
end
|
@@ -43,7 +44,9 @@ module RubySketch
|
|
43
44
|
|
44
45
|
def on_draw (e)
|
45
46
|
draw_canvas {call_block @draw, e} if @draw
|
46
|
-
|
47
|
+
|
48
|
+
x, y, w, h = coord_converter
|
49
|
+
e.painter.image @canvas, x, y, @canvas.width * w, @canvas.height * h
|
47
50
|
end
|
48
51
|
|
49
52
|
def on_key (e)
|
@@ -64,27 +67,45 @@ module RubySketch
|
|
64
67
|
end
|
65
68
|
|
66
69
|
def on_resize (e)
|
67
|
-
|
70
|
+
resize_canvas e.width, e.height if @auto_resize
|
68
71
|
draw_canvas {call_block @resize, e} if @resize
|
69
72
|
end
|
70
73
|
|
74
|
+
def to_canvas_coord (x, y)
|
75
|
+
xx, yy, ww, hh = coord_converter
|
76
|
+
return (x - xx) / ww, (y - yy) / hh
|
77
|
+
end
|
78
|
+
|
71
79
|
private
|
72
80
|
|
73
|
-
def
|
74
|
-
return if width * height == 0
|
75
|
-
return if width == @canvas&.width && height == @canvas&.height
|
81
|
+
def resize_canvas (width, height, pixel_density = nil)
|
82
|
+
return nil if width * height == 0
|
76
83
|
|
77
|
-
|
78
|
-
|
84
|
+
unless width == @canvas&.width &&
|
85
|
+
height == @canvas&.height &&
|
86
|
+
pixel_density == @canvas_painter&.pixel_density
|
79
87
|
|
80
|
-
|
81
|
-
|
82
|
-
@canvas_painter = @canvas.painter
|
88
|
+
old_canvas = @canvas
|
89
|
+
old_painter = @canvas_painter
|
83
90
|
|
84
|
-
|
85
|
-
|
86
|
-
|
91
|
+
cs = old_canvas&.color_space || Rays::RGBA
|
92
|
+
pd = pixel_density || painter.pixel_density
|
93
|
+
@canvas = Rays::Image.new width, height, cs, pd
|
94
|
+
@canvas_painter = @canvas.painter
|
95
|
+
|
96
|
+
if old_canvas
|
97
|
+
@canvas_painter.paint {image old_canvas}
|
98
|
+
copy_painter_attributes old_painter, @canvas_painter
|
99
|
+
end
|
100
|
+
|
101
|
+
resize_window width, height
|
87
102
|
end
|
103
|
+
|
104
|
+
@canvas_painter
|
105
|
+
end
|
106
|
+
|
107
|
+
def resize_window (width, height)
|
108
|
+
size width, height
|
88
109
|
end
|
89
110
|
|
90
111
|
def copy_painter_attributes (from, to)
|
@@ -97,6 +118,21 @@ module RubySketch
|
|
97
118
|
to.font = from.font
|
98
119
|
end
|
99
120
|
|
121
|
+
def coord_converter ()
|
122
|
+
ww, wh = width.to_f, height.to_f
|
123
|
+
cw, ch = @canvas.width.to_f, @canvas.height.to_f
|
124
|
+
return [0, 0, 1, 1] if ww == 0 || wh == 0 || cw == 0 || ch == 0
|
125
|
+
|
126
|
+
wratio, cratio = ww / wh, cw / ch
|
127
|
+
if wratio >= cratio
|
128
|
+
scaled_w = wh * cratio
|
129
|
+
return (ww - scaled_w) / 2, 0, scaled_w / cw, wh / ch
|
130
|
+
else
|
131
|
+
scaled_h = ww / cratio
|
132
|
+
return 0, (wh - scaled_h) / 2, ww / cw, scaled_h / ch
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
100
136
|
def draw_canvas (&block)
|
101
137
|
begin_draw
|
102
138
|
block.call
|
data/test/helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubysketch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- xordog
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: reflexion
|
@@ -43,6 +43,7 @@ files:
|
|
43
43
|
- examples/breakout.rb
|
44
44
|
- examples/camera.rb
|
45
45
|
- examples/clock.rb
|
46
|
+
- examples/delay_camera.rb
|
46
47
|
- examples/glsl.rb
|
47
48
|
- examples/hello.rb
|
48
49
|
- examples/image.rb
|