processing 0.5.33 → 1.0.1
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 +25 -1
- data/Gemfile +1 -0
- data/Gemfile.lock +2 -0
- data/Rakefile +5 -5
- data/VERSION +1 -1
- data/lib/processing/all.rb +4 -1
- data/lib/processing/context.rb +128 -0
- data/lib/processing/font.rb +5 -0
- data/lib/processing/graphics.rb +9 -0
- data/lib/processing/graphics_context.rb +640 -42
- data/lib/processing/image.rb +86 -0
- data/lib/processing/shader.rb +29 -16
- data/lib/processing/shape.rb +369 -28
- data/lib/processing/svg.rb +248 -0
- data/lib/processing/vector.rb +126 -0
- data/lib/processing/window.rb +2 -0
- data/processing.gemspec +4 -4
- data/test/{p5.rb → browser.rb} +37 -3
- data/test/helper.rb +40 -7
- data/test/test_color.rb +94 -0
- data/test/test_graphics_context.rb +26 -59
- data/test/test_shape.rb +129 -6
- data/test/test_svg.rb +257 -0
- metadata +17 -12
data/lib/processing/image.rb
CHANGED
@@ -3,6 +3,9 @@ module Processing
|
|
3
3
|
|
4
4
|
# Image object.
|
5
5
|
#
|
6
|
+
# @see https://processing.org/reference/PImage.html
|
7
|
+
# @see https://p5js.org/reference/#/p5.Image
|
8
|
+
#
|
6
9
|
class Image
|
7
10
|
|
8
11
|
include Xot::Inspectable
|
@@ -17,6 +20,9 @@ module Processing
|
|
17
20
|
#
|
18
21
|
# @return [Numeric] width of image
|
19
22
|
#
|
23
|
+
# @see https://processing.org/reference/PImage_width.html
|
24
|
+
# @see https://p5js.org/reference/#/p5.Image/width
|
25
|
+
#
|
20
26
|
def width()
|
21
27
|
@image&.width || (@error ? -1 : 0)
|
22
28
|
end
|
@@ -25,6 +31,9 @@ module Processing
|
|
25
31
|
#
|
26
32
|
# @return [Numeric] height of image
|
27
33
|
#
|
34
|
+
# @see https://processing.org/reference/PImage_height.html
|
35
|
+
# @see https://p5js.org/reference/#/p5.Image/height
|
36
|
+
#
|
28
37
|
def height()
|
29
38
|
@image&.height || (@error ? -1 : 0)
|
30
39
|
end
|
@@ -48,6 +57,9 @@ module Processing
|
|
48
57
|
#
|
49
58
|
# @return [nil] nil
|
50
59
|
#
|
60
|
+
# @see https://processing.org/reference/PImage_set_.html
|
61
|
+
# @see https://p5js.org/reference/#/p5.Image/set
|
62
|
+
#
|
51
63
|
def set(x, y, c)
|
52
64
|
getInternal__.bitmap(true)[x, y] = self.class.fromColor__(c).map {|n| n / 255.0}
|
53
65
|
nil
|
@@ -57,6 +69,9 @@ module Processing
|
|
57
69
|
#
|
58
70
|
# @return [Integer] color value (0xAARRGGBB)
|
59
71
|
#
|
72
|
+
# @see https://processing.org/reference/PImage_get_.html
|
73
|
+
# @see https://p5js.org/reference/#/p5.Image/get
|
74
|
+
#
|
60
75
|
def get(x, y)
|
61
76
|
getInternal__.bitmap[x, y]
|
62
77
|
.map {|n| (n * 255).to_i.clamp 0, 255}
|
@@ -67,6 +82,9 @@ module Processing
|
|
67
82
|
#
|
68
83
|
# @return [nil] nil
|
69
84
|
#
|
85
|
+
# @see https://processing.org/reference/PImage_loadPixels_.html
|
86
|
+
# @see https://p5js.org/reference/#/p5.Image/loadPixels
|
87
|
+
#
|
70
88
|
def loadPixels()
|
71
89
|
@pixels = getInternal__.pixels
|
72
90
|
end
|
@@ -75,6 +93,9 @@ module Processing
|
|
75
93
|
#
|
76
94
|
# @return [nil] nil
|
77
95
|
#
|
96
|
+
# @see https://processing.org/reference/PImage_updatePixels_.html
|
97
|
+
# @see https://p5js.org/reference/#/p5.Image/updatePixels
|
98
|
+
#
|
78
99
|
def updatePixels()
|
79
100
|
return unless @pixels
|
80
101
|
getInternal__.pixels = @pixels
|
@@ -84,6 +105,11 @@ module Processing
|
|
84
105
|
# An array of all pixels.
|
85
106
|
# Call loadPixels() before accessing the array.
|
86
107
|
#
|
108
|
+
# @return [Array] color array
|
109
|
+
#
|
110
|
+
# @see https://processing.org/reference/PImage_pixels.html
|
111
|
+
# @see https://p5js.org/reference/#/p5.Image/pixels
|
112
|
+
#
|
87
113
|
attr_reader :pixels
|
88
114
|
|
89
115
|
# Applies an image filter.
|
@@ -96,6 +122,9 @@ module Processing
|
|
96
122
|
# @param type [THRESHOLD, GRAY, INVERT, BLUR] filter type
|
97
123
|
# @param param [Numeric] a parameter for each filter
|
98
124
|
#
|
125
|
+
# @see https://processing.org/reference/PImage_filter_.html
|
126
|
+
# @see https://p5js.org/reference/#/p5.Image/filter
|
127
|
+
#
|
99
128
|
def filter(*args)
|
100
129
|
@filter = Shader.createFilter__(*args)
|
101
130
|
end
|
@@ -107,6 +136,9 @@ module Processing
|
|
107
136
|
#
|
108
137
|
# @return [nil] nil
|
109
138
|
#
|
139
|
+
# @see https://processing.org/reference/PImage_resize_.html
|
140
|
+
# @see https://p5js.org/reference/#/p5.Image/resize
|
141
|
+
#
|
110
142
|
def resize(width, height)
|
111
143
|
@image = Rays::Image.new(width, height).paint do |painter|
|
112
144
|
painter.image getInternal__, 0, 0, width, height
|
@@ -131,10 +163,18 @@ module Processing
|
|
131
163
|
#
|
132
164
|
# @return [nil] nil
|
133
165
|
#
|
166
|
+
# @see https://processing.org/reference/PImage_copy_.html
|
167
|
+
# @see https://p5js.org/reference/#/p5.Image/copy
|
168
|
+
#
|
134
169
|
def copy(img = nil, sx, sy, sw, sh, dx, dy, dw, dh)
|
135
170
|
blend img, sx, sy, sw, sh, dx, dy, dw, dh, :normal
|
136
171
|
end
|
137
172
|
|
173
|
+
# @private
|
174
|
+
def mask__()
|
175
|
+
raise NotImplementedError
|
176
|
+
end
|
177
|
+
|
138
178
|
# Blends image.
|
139
179
|
#
|
140
180
|
# @overload blend(sx, sy, sw, sh, dx, dy, dw, dh, mode)
|
@@ -153,6 +193,9 @@ module Processing
|
|
153
193
|
#
|
154
194
|
# @return [nil] nil
|
155
195
|
#
|
196
|
+
# @see https://processing.org/reference/PImage_blend_.html
|
197
|
+
# @see https://p5js.org/reference/#/p5.Image/blend
|
198
|
+
#
|
156
199
|
def blend(img = nil, sx, sy, sw, sh, dx, dy, dw, dh, mode)
|
157
200
|
img ||= self
|
158
201
|
getInternal__.paint do |painter|
|
@@ -161,12 +204,55 @@ module Processing
|
|
161
204
|
nil
|
162
205
|
end
|
163
206
|
|
207
|
+
# @private
|
208
|
+
def blendColor__()
|
209
|
+
raise NotImplementedError
|
210
|
+
end
|
211
|
+
|
212
|
+
# @private
|
213
|
+
def reset__()
|
214
|
+
raise NotImplementedError
|
215
|
+
end
|
216
|
+
|
217
|
+
# @private
|
218
|
+
def getCurrentFrame__()
|
219
|
+
raise NotImplementedError
|
220
|
+
end
|
221
|
+
|
222
|
+
# @private
|
223
|
+
def setFrame__()
|
224
|
+
raise NotImplementedError
|
225
|
+
end
|
226
|
+
|
227
|
+
# @private
|
228
|
+
def numFrames__()
|
229
|
+
raise NotImplementedError
|
230
|
+
end
|
231
|
+
|
232
|
+
# @private
|
233
|
+
def play__()
|
234
|
+
raise NotImplementedError
|
235
|
+
end
|
236
|
+
|
237
|
+
# @private
|
238
|
+
def pause__()
|
239
|
+
raise NotImplementedError
|
240
|
+
end
|
241
|
+
|
242
|
+
# @private
|
243
|
+
def delay__()
|
244
|
+
raise NotImplementedError
|
245
|
+
end
|
246
|
+
|
164
247
|
# Saves image to file.
|
165
248
|
#
|
166
249
|
# @param filename [String] file name to save image
|
167
250
|
#
|
168
251
|
# @return [nil] nil
|
169
252
|
#
|
253
|
+
# @see https://processing.org/reference/PImage_save_.html
|
254
|
+
# @see https://p5js.org/reference/#/p5.Image/save
|
255
|
+
#
|
170
256
|
def save(filename)
|
171
257
|
getInternal__.save filename
|
172
258
|
nil
|
data/lib/processing/shader.rb
CHANGED
@@ -3,6 +3,9 @@ module Processing
|
|
3
3
|
|
4
4
|
# Shader object.
|
5
5
|
#
|
6
|
+
# @see https://processing.org/reference/PShader.html
|
7
|
+
# @see https://p5js.org/reference/#/p5.Shader
|
8
|
+
#
|
6
9
|
class Shader
|
7
10
|
|
8
11
|
include Xot::Inspectable
|
@@ -13,7 +16,7 @@ module Processing
|
|
13
16
|
# @param fragSrc [String] fragment shader source
|
14
17
|
#
|
15
18
|
def initialize(vertSrc, fragSrc)
|
16
|
-
@shader = Rays::Shader.new
|
19
|
+
@shader = Rays::Shader.new modifyFragSource__(fragSrc), vertSrc, ENV__
|
17
20
|
end
|
18
21
|
|
19
22
|
# Sets uniform variables.
|
@@ -37,7 +40,10 @@ module Processing
|
|
37
40
|
# @param ncoords [Integer] number of coordinates, max 4
|
38
41
|
# @param tex [Image] texture image
|
39
42
|
#
|
40
|
-
|
43
|
+
# @see https://processing.org/reference/PShader_set_.html
|
44
|
+
# @see https://p5js.org/reference/#/p5.Shader/setUniform
|
45
|
+
#
|
46
|
+
def set(name, *args)
|
41
47
|
arg = args.first
|
42
48
|
case
|
43
49
|
when Array === arg
|
@@ -54,7 +60,7 @@ module Processing
|
|
54
60
|
end
|
55
61
|
end
|
56
62
|
|
57
|
-
alias set
|
63
|
+
alias setUniform set
|
58
64
|
|
59
65
|
# @private
|
60
66
|
def getInternal__()
|
@@ -83,13 +89,13 @@ module Processing
|
|
83
89
|
when Shader
|
84
90
|
arg
|
85
91
|
when :threshold
|
86
|
-
self.new(nil,
|
92
|
+
self.new(nil, THRESHOLD_SOURCE__).tap {|sh| sh.set :threshold, (args.shift || 0.5)}
|
87
93
|
when :gray
|
88
|
-
self.new nil,
|
94
|
+
self.new nil, GRAY_SOURCE__
|
89
95
|
when :invert
|
90
|
-
self.new nil,
|
96
|
+
self.new nil, INVERT_SOURCE__
|
91
97
|
when :blur
|
92
|
-
self.new(nil,
|
98
|
+
self.new(nil, BLUR_SOURCE__).tap {|sh| sh.set :radius, (args.shift || 1).to_f}
|
93
99
|
else
|
94
100
|
nil
|
95
101
|
end
|
@@ -97,7 +103,8 @@ module Processing
|
|
97
103
|
|
98
104
|
private
|
99
105
|
|
100
|
-
|
106
|
+
# @private
|
107
|
+
THRESHOLD_SOURCE__ = <<~END
|
101
108
|
uniform float threshold;
|
102
109
|
uniform sampler2D texMap;
|
103
110
|
varying vec4 vertTexCoord;
|
@@ -109,7 +116,8 @@ module Processing
|
|
109
116
|
}
|
110
117
|
END
|
111
118
|
|
112
|
-
|
119
|
+
# @private
|
120
|
+
GRAY_SOURCE__ = <<~END
|
113
121
|
uniform sampler2D texMap;
|
114
122
|
varying vec4 vertTexCoord;
|
115
123
|
varying vec4 vertColor;
|
@@ -120,7 +128,8 @@ module Processing
|
|
120
128
|
}
|
121
129
|
END
|
122
130
|
|
123
|
-
|
131
|
+
# @private
|
132
|
+
INVERT_SOURCE__ = <<~END
|
124
133
|
uniform sampler2D texMap;
|
125
134
|
varying vec4 vertTexCoord;
|
126
135
|
varying vec4 vertColor;
|
@@ -130,7 +139,8 @@ module Processing
|
|
130
139
|
}
|
131
140
|
END
|
132
141
|
|
133
|
-
|
142
|
+
# @private
|
143
|
+
BLUR_SOURCE__ = <<~END
|
134
144
|
#define PI 3.1415926538
|
135
145
|
uniform float radius;
|
136
146
|
uniform sampler2D texMap;
|
@@ -163,9 +173,10 @@ module Processing
|
|
163
173
|
}
|
164
174
|
END
|
165
175
|
|
166
|
-
|
176
|
+
# @private
|
177
|
+
def modifyFragSource__(source)
|
167
178
|
return nil unless source
|
168
|
-
if
|
179
|
+
if hasShadertoyMainImage__?(source) && source !~ /void\s+main\s*\(/
|
169
180
|
source += <<~END
|
170
181
|
varying vec4 vertTexCoord;
|
171
182
|
void main() {
|
@@ -178,7 +189,7 @@ module Processing
|
|
178
189
|
iResolution: :vec2,
|
179
190
|
iMouse: :vec2
|
180
191
|
}.each do |uniformName, type|
|
181
|
-
if
|
192
|
+
if needsUniformDeclaration__ type, uniformName, source
|
182
193
|
source = <<~END + source
|
183
194
|
uniform #{type} #{uniformName};
|
184
195
|
END
|
@@ -187,11 +198,13 @@ module Processing
|
|
187
198
|
source
|
188
199
|
end
|
189
200
|
|
190
|
-
|
201
|
+
# @private
|
202
|
+
def hasShadertoyMainImage__?(source)
|
191
203
|
source =~ /void\s+mainImage\s*\(\s*out\s+vec4\s+\w+\s*,\s*in\s+vec2\s+\w+\s*\)/
|
192
204
|
end
|
193
205
|
|
194
|
-
|
206
|
+
# @private
|
207
|
+
def needsUniformDeclaration__(type, uniformName, source)
|
195
208
|
source.include?(uniformName.to_s) &&
|
196
209
|
source !~ /uniform\s+#{type}\s+#{uniformName}/
|
197
210
|
end
|