processing 0.5.31 → 0.5.32
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 +15 -0
- data/VERSION +1 -1
- data/lib/processing/font.rb +30 -3
- data/lib/processing/graphics.rb +0 -11
- data/lib/processing/graphics_context.rb +304 -55
- data/lib/processing/image.rb +38 -10
- data/lib/processing/shape.rb +138 -27
- data/processing.gemspec +3 -3
- data/test/helper.rb +2 -3
- data/test/p5.rb +5 -4
- data/test/test_font.rb +33 -2
- data/test/test_graphics_context.rb +220 -0
- data/test/test_image.rb +21 -0
- data/test/test_shape.rb +125 -0
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f96427cef5e2add31fe4baa3c6055a94bdff9d126d1ae194cd937c24066d4af4
|
4
|
+
data.tar.gz: a4a797bb6246dbb1de3450d6a802ec273553cdf4d5c4b8b2a87e82160f8a22b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8d39fcf7857c9ad1b10597811adcb23b04f96f1f78e128ff089b2cd7cd1fe4b851ba0ff235813f8946853d940383ec82568300d9a9914ce028fc9d3622d58b4a
|
7
|
+
data.tar.gz: 226f9d830533ae9f5836ad447bd84de2bb8939d8a5718d1b43c4f66dc073b776c67c7b5c5ccfa421e9271707a9511568b626a9124b6cfaf65dd61ba95fd88af5
|
data/ChangeLog.md
CHANGED
@@ -1,6 +1,21 @@
|
|
1
1
|
# processing ChangeLog
|
2
2
|
|
3
3
|
|
4
|
+
## [v0.5.32] - 2024-01-08
|
5
|
+
|
6
|
+
- Add requestImage()
|
7
|
+
- Add texture(), textureMode(), and textureWrap()
|
8
|
+
- Add loadPixels(), updatePixels(), and pixels()
|
9
|
+
- Add curveVertex(), bezierVertex(), and quadraticVertex()
|
10
|
+
- Add beginContour() and endContour()
|
11
|
+
- Add createFont(), loadFont(), and Font.list()
|
12
|
+
- Add Shape#setFill
|
13
|
+
|
14
|
+
- vertex() can teke UV parameters
|
15
|
+
- vertex() records the fill color
|
16
|
+
- Drawing shapes with texture is affected by tin() instead of the fill()
|
17
|
+
|
18
|
+
|
4
19
|
## [v0.5.31] - 2023-12-09
|
5
20
|
|
6
21
|
- Add Shape class
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.32
|
data/lib/processing/font.rb
CHANGED
@@ -7,7 +7,8 @@ module Processing
|
|
7
7
|
|
8
8
|
# @private
|
9
9
|
def initialize(font)
|
10
|
-
@font
|
10
|
+
@font = font or raise ArgumentError
|
11
|
+
@cachedSizes = {}
|
11
12
|
end
|
12
13
|
|
13
14
|
# Returns bounding box.
|
@@ -24,8 +25,8 @@ module Processing
|
|
24
25
|
# @return [TextBounds] bounding box for text
|
25
26
|
#
|
26
27
|
def textBounds(str, x = 0, y = 0, fontSize = nil)
|
27
|
-
|
28
|
-
TextBounds.new x, y, x +
|
28
|
+
font = getInternal__ fontSize
|
29
|
+
TextBounds.new x, y, x + font.width(str), y + font.height
|
29
30
|
end
|
30
31
|
|
31
32
|
# Returns a string containing a human-readable representation of object.
|
@@ -36,6 +37,32 @@ module Processing
|
|
36
37
|
"#<Processing::Font: name:'#{@font.name}' size:#{@font.size}>"
|
37
38
|
end
|
38
39
|
|
40
|
+
# Returns available font names
|
41
|
+
#
|
42
|
+
# @return [String] font names
|
43
|
+
#
|
44
|
+
# @see https://processing.org/reference/PFont_list_.html
|
45
|
+
#
|
46
|
+
def self.list()
|
47
|
+
Rays::Font.families.values.flatten
|
48
|
+
end
|
49
|
+
|
50
|
+
# @private
|
51
|
+
def getInternal__(size = nil)
|
52
|
+
if size
|
53
|
+
@cachedSizes[size.to_f] ||= @font.dup.tap {|font| font.size = size}
|
54
|
+
else
|
55
|
+
@font
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# @private
|
60
|
+
def setSize__(size)
|
61
|
+
return if size == @font.size
|
62
|
+
@cachedSizes[@font.size] = @font
|
63
|
+
@font = getInternal__ size
|
64
|
+
end
|
65
|
+
|
39
66
|
end# Font
|
40
67
|
|
41
68
|
|
data/lib/processing/graphics.rb
CHANGED
@@ -38,17 +38,6 @@ module Processing
|
|
38
38
|
endDraw__
|
39
39
|
end
|
40
40
|
|
41
|
-
# Saves image to file.
|
42
|
-
#
|
43
|
-
# @param filename [String] file name to save image
|
44
|
-
#
|
45
|
-
# @return [nil] nil
|
46
|
-
#
|
47
|
-
def save(filename)
|
48
|
-
@image__.save filename
|
49
|
-
nil
|
50
|
-
end
|
51
|
-
|
52
41
|
end# Graphics
|
53
42
|
|
54
43
|
|
@@ -129,6 +129,18 @@ module Processing
|
|
129
129
|
# Mode for textAlign().
|
130
130
|
BASELINE = :baseline
|
131
131
|
|
132
|
+
# Mode for textureMode().
|
133
|
+
IMAGE = :image
|
134
|
+
|
135
|
+
# Mode for textureMode().
|
136
|
+
NORMAL = :normal
|
137
|
+
|
138
|
+
# Mode for textureWrap().
|
139
|
+
CLAMP = :clamp
|
140
|
+
|
141
|
+
# Mode for textureWrap().
|
142
|
+
REPEAT = :repeat
|
143
|
+
|
132
144
|
# Filter type for filter()
|
133
145
|
THRESHOLD = :threshold
|
134
146
|
|
@@ -247,6 +259,12 @@ module Processing
|
|
247
259
|
# @private
|
248
260
|
RAD2DEG__ = 180.0 / Math::PI
|
249
261
|
|
262
|
+
# @private
|
263
|
+
FONT_SIZE_DEFAULT__ = 12
|
264
|
+
|
265
|
+
# @private
|
266
|
+
FONT_SIZE_MAX__ = 256
|
267
|
+
|
250
268
|
# @private
|
251
269
|
def init__(image, painter)
|
252
270
|
@drawing__ = false
|
@@ -262,11 +280,12 @@ module Processing
|
|
262
280
|
@blendMode__ = nil
|
263
281
|
@textAlignH__ = nil
|
264
282
|
@textAlignV__ = nil
|
283
|
+
@textFont__ = nil
|
265
284
|
@tint__ = nil
|
266
285
|
@filter__ = nil
|
286
|
+
@pixels__ = nil
|
267
287
|
@matrixStack__ = []
|
268
288
|
@styleStack__ = []
|
269
|
-
@fontCache__ = {}
|
270
289
|
|
271
290
|
updateCanvas__ image, painter
|
272
291
|
|
@@ -280,6 +299,9 @@ module Processing
|
|
280
299
|
strokeCap ROUND
|
281
300
|
strokeJoin MITER
|
282
301
|
textAlign LEFT
|
302
|
+
textFont createFont(nil, nil)
|
303
|
+
textureMode IMAGE
|
304
|
+
textureWrap CLAMP
|
283
305
|
|
284
306
|
fill 255
|
285
307
|
stroke 0
|
@@ -313,7 +335,7 @@ module Processing
|
|
313
335
|
# @return [Numeric] width
|
314
336
|
#
|
315
337
|
def width()
|
316
|
-
|
338
|
+
getInternal__.width
|
317
339
|
end
|
318
340
|
|
319
341
|
# Returns the height of the graphics object.
|
@@ -321,7 +343,7 @@ module Processing
|
|
321
343
|
# @return [Numeric] height
|
322
344
|
#
|
323
345
|
def height()
|
324
|
-
|
346
|
+
getInternal__.height
|
325
347
|
end
|
326
348
|
|
327
349
|
# Returns the width of the graphics object in pixels.
|
@@ -443,17 +465,21 @@ module Processing
|
|
443
465
|
|
444
466
|
# @private
|
445
467
|
private def toRGBA__(*args)
|
446
|
-
a, b
|
468
|
+
a, b = args
|
447
469
|
return parseColor__(a, b || alphaMax__) if a.kind_of?(String)
|
470
|
+
toRaysColor__(*args).to_a
|
471
|
+
end
|
448
472
|
|
473
|
+
# @private
|
474
|
+
def toRaysColor__(*args)
|
475
|
+
a, b, c, d = args
|
449
476
|
rgba = case args.size
|
450
477
|
when 1, 2 then [a, a, a, b || alphaMax__]
|
451
478
|
when 3, 4 then [a, b, c, d || alphaMax__]
|
452
479
|
else raise ArgumentError
|
453
480
|
end
|
454
|
-
rgba
|
455
|
-
|
456
|
-
color.to_a
|
481
|
+
rgba = rgba.map.with_index {|value, i| value / @colorMaxes__[i]}
|
482
|
+
@hsbColor__ ? Rays::Color.hsv(*rgba) : Rays::Color.new(*rgba)
|
457
483
|
end
|
458
484
|
|
459
485
|
# @private
|
@@ -618,6 +644,11 @@ module Processing
|
|
618
644
|
nil
|
619
645
|
end
|
620
646
|
|
647
|
+
# @private
|
648
|
+
def getFill__()
|
649
|
+
@painter__.fill
|
650
|
+
end
|
651
|
+
|
621
652
|
# Disables filling.
|
622
653
|
#
|
623
654
|
# @return [nil] nil
|
@@ -723,6 +754,11 @@ module Processing
|
|
723
754
|
@tint__ = nil
|
724
755
|
end
|
725
756
|
|
757
|
+
# @private
|
758
|
+
def getTint__()
|
759
|
+
@tint__ ? toRGBA__(*@tint__) : 1
|
760
|
+
end
|
761
|
+
|
726
762
|
# Limits the drawable rectangle.
|
727
763
|
#
|
728
764
|
# The parameters a, b, c, and d are determined by rectMode().
|
@@ -749,7 +785,9 @@ module Processing
|
|
749
785
|
nil
|
750
786
|
end
|
751
787
|
|
752
|
-
# Sets font.
|
788
|
+
# Sets text font.
|
789
|
+
#
|
790
|
+
# (Passing a font name as the first parameter is deprecated)
|
753
791
|
#
|
754
792
|
# @overload textFont(font)
|
755
793
|
# @overload textFont(name)
|
@@ -760,11 +798,18 @@ module Processing
|
|
760
798
|
# @param name [String] font name
|
761
799
|
# @param size [Numeric] font size (max 256)
|
762
800
|
#
|
763
|
-
# @return [
|
801
|
+
# @return [nil] nil
|
764
802
|
#
|
765
|
-
def textFont(font
|
766
|
-
|
767
|
-
|
803
|
+
def textFont(font, size = nil)
|
804
|
+
size = FONT_SIZE_MAX__ if size && size > FONT_SIZE_MAX__
|
805
|
+
if font.nil? || font.kind_of?(String)
|
806
|
+
font = createFont font, size
|
807
|
+
elsif size
|
808
|
+
font.setSize__ size
|
809
|
+
end
|
810
|
+
@textFont__ = font
|
811
|
+
@painter__.font = font.getInternal__
|
812
|
+
nil
|
768
813
|
end
|
769
814
|
|
770
815
|
# Sets text size.
|
@@ -774,8 +819,7 @@ module Processing
|
|
774
819
|
# @return [nil] nil
|
775
820
|
#
|
776
821
|
def textSize(size)
|
777
|
-
|
778
|
-
nil
|
822
|
+
textFont @textFont__, size
|
779
823
|
end
|
780
824
|
|
781
825
|
def textWidth(str)
|
@@ -795,16 +839,46 @@ module Processing
|
|
795
839
|
@textAlignV__ = vertical
|
796
840
|
end
|
797
841
|
|
842
|
+
def texture(image)
|
843
|
+
@painter__.texture image&.getInternal__
|
844
|
+
nil
|
845
|
+
end
|
846
|
+
|
798
847
|
# @private
|
799
|
-
def
|
800
|
-
|
801
|
-
|
802
|
-
|
803
|
-
|
804
|
-
|
805
|
-
|
806
|
-
|
807
|
-
|
848
|
+
def drawWithTexture__(&block)
|
849
|
+
if @painter__.texture
|
850
|
+
@painter__.push fill: getTint__, &block
|
851
|
+
else
|
852
|
+
block.call
|
853
|
+
end
|
854
|
+
end
|
855
|
+
|
856
|
+
# Sets the coordinate space for texture mapping.
|
857
|
+
#
|
858
|
+
# @param mode [IMAGE, NORMAL] image coordinate, or normalized coordinate
|
859
|
+
#
|
860
|
+
# @return [nil] nil
|
861
|
+
#
|
862
|
+
# @see https://processing.org/reference/textureMode_.html
|
863
|
+
# @see https://p5js.org/reference/#/p5/textureMode
|
864
|
+
#
|
865
|
+
def textureMode(mode)
|
866
|
+
@painter__.texcoord_mode = mode
|
867
|
+
nil
|
868
|
+
end
|
869
|
+
|
870
|
+
# Sets the texture wrapping mode.
|
871
|
+
#
|
872
|
+
# @param wrap [CLAMP, REPEAT] how texutres behave when go outside of the range
|
873
|
+
#
|
874
|
+
# @return [nil] nil
|
875
|
+
#
|
876
|
+
# @see https://processing.org/reference/textureWrap_.html
|
877
|
+
# @see https://p5js.org/reference/#/p5/textureWrap
|
878
|
+
#
|
879
|
+
def textureWrap(wrap)
|
880
|
+
@painter__.texcoord_wrap = wrap
|
881
|
+
nil
|
808
882
|
end
|
809
883
|
|
810
884
|
# Sets shader.
|
@@ -1156,8 +1230,7 @@ module Processing
|
|
1156
1230
|
def image(img, a, b, c = nil, d = nil)
|
1157
1231
|
assertDrawing__
|
1158
1232
|
x, y, w, h = toXYWH__ @imageMode__, a, b, c || img.width, d || img.height
|
1159
|
-
|
1160
|
-
img.drawImage__ @painter__, x, y, w, h, fill: tint, stroke: :none
|
1233
|
+
img.drawImage__ @painter__, x, y, w, h, fill: getTint__, stroke: :none
|
1161
1234
|
nil
|
1162
1235
|
end
|
1163
1236
|
|
@@ -1182,11 +1255,13 @@ module Processing
|
|
1182
1255
|
assertDrawing__
|
1183
1256
|
return nil unless shp.isVisible
|
1184
1257
|
|
1185
|
-
|
1186
|
-
|
1187
|
-
|
1188
|
-
|
1189
|
-
|
1258
|
+
drawWithTexture__ do |_|
|
1259
|
+
if c || d || @shapeMode__ != CORNER
|
1260
|
+
x, y, w, h = toXYWH__ @shapeMode__, a, b, c || shp.width, d || shp.height
|
1261
|
+
shp.draw__ @painter__, x, y, w, h
|
1262
|
+
else
|
1263
|
+
shp.draw__ @painter__, a, b
|
1264
|
+
end
|
1190
1265
|
end
|
1191
1266
|
nil
|
1192
1267
|
end
|
@@ -1195,7 +1270,7 @@ module Processing
|
|
1195
1270
|
|
1196
1271
|
# Begins drawing complex shapes.
|
1197
1272
|
#
|
1198
|
-
# @param
|
1273
|
+
# @param type [POINTS, LINES, TRIANGLES, TRIANGLE_FAN, TRIANGLE_STRIP, QUADS, QUAD_STRIP, TESS]
|
1199
1274
|
#
|
1200
1275
|
# @return [nil] nil
|
1201
1276
|
#
|
@@ -1217,9 +1292,10 @@ module Processing
|
|
1217
1292
|
#
|
1218
1293
|
# @see https://processing.org/reference/beginShape_.html
|
1219
1294
|
#
|
1220
|
-
def beginShape(
|
1221
|
-
|
1222
|
-
|
1295
|
+
def beginShape(type = nil)
|
1296
|
+
raise "beginShape() cannot be called twice" if @drawingShape__
|
1297
|
+
@drawingShape__ = createShape
|
1298
|
+
@drawingShape__.beginShape type
|
1223
1299
|
end
|
1224
1300
|
|
1225
1301
|
# Ends drawing complex shapes.
|
@@ -1234,25 +1310,114 @@ module Processing
|
|
1234
1310
|
# @see https://processing.org/reference/endShape_.html
|
1235
1311
|
#
|
1236
1312
|
def endShape(mode = nil)
|
1237
|
-
raise "endShape() must be called after beginShape()"
|
1238
|
-
|
1239
|
-
|
1240
|
-
@
|
1313
|
+
s = @drawingShape__ or raise "endShape() must be called after beginShape()"
|
1314
|
+
s.endShape mode
|
1315
|
+
shape s
|
1316
|
+
@drawingShape__ = nil
|
1241
1317
|
nil
|
1242
1318
|
end
|
1243
1319
|
|
1320
|
+
# Begins drawing a hole inside shape.
|
1321
|
+
#
|
1322
|
+
# @return [nil] nil
|
1323
|
+
#
|
1324
|
+
# @example
|
1325
|
+
# beginShape
|
1326
|
+
# vertex 10, 10
|
1327
|
+
# vertex 10, 50
|
1328
|
+
# vertex 50, 50
|
1329
|
+
# vertex 90, 10
|
1330
|
+
# beginContour
|
1331
|
+
# vertex 20, 20
|
1332
|
+
# vertex 30, 20
|
1333
|
+
# vertex 30, 30
|
1334
|
+
# vertex 20, 30
|
1335
|
+
# endContour
|
1336
|
+
# endShape CLOSE
|
1337
|
+
#
|
1338
|
+
# @see https://processing.org/reference/beginContour_.html
|
1339
|
+
# @see https://p5js.org/reference/#/p5/beginContour
|
1340
|
+
#
|
1341
|
+
def beginContour()
|
1342
|
+
(@drawingShape__ or raise "beginContour() must be called after beginShape()")
|
1343
|
+
.beginContour
|
1344
|
+
end
|
1345
|
+
|
1346
|
+
# Ends drawing a hole.
|
1347
|
+
#
|
1348
|
+
# @return [nil] nil
|
1349
|
+
#
|
1350
|
+
# @see https://processing.org/reference/endContour_.html
|
1351
|
+
# @see https://p5js.org/reference/#/p5/endContour
|
1352
|
+
#
|
1353
|
+
def endContour()
|
1354
|
+
(@drawingShape__ or raise "endContour() must be called after beginShape()")
|
1355
|
+
.endContour
|
1356
|
+
end
|
1357
|
+
|
1244
1358
|
# Append vertex for shape polygon.
|
1245
1359
|
#
|
1360
|
+
# @overload vertex(x, y)
|
1361
|
+
# @overload vertex(x, y, u, v)
|
1362
|
+
#
|
1246
1363
|
# @param x [Numeric] x position of vertex
|
1247
1364
|
# @param y [Numeric] y position of vertex
|
1365
|
+
# @param u [Numeric] u texture coordinate of vertex
|
1366
|
+
# @param v [Numeric] v texture coordinate of vertex
|
1248
1367
|
#
|
1249
1368
|
# @return [nil] nil
|
1250
1369
|
#
|
1251
1370
|
# @see https://processing.org/reference/vertex_.html
|
1371
|
+
# @see https://p5js.org/reference/#/p5/vertex
|
1372
|
+
#
|
1373
|
+
def vertex(x, y, u = nil, v = nil)
|
1374
|
+
(@drawingShape__ or raise "vertex() must be called after beginShape()")
|
1375
|
+
.vertex x, y, u, v
|
1376
|
+
end
|
1377
|
+
|
1378
|
+
# Append curve vertex for shape polygon.
|
1379
|
+
#
|
1380
|
+
# @param x [Numeric] x position of vertex
|
1381
|
+
# @param y [Numeric] y position of vertex
|
1382
|
+
#
|
1383
|
+
# @return [nil] nil
|
1384
|
+
#
|
1385
|
+
# @see https://processing.org/reference/curveVertex_.html
|
1386
|
+
# @see https://p5js.org/reference/#/p5/curveVertex
|
1387
|
+
#
|
1388
|
+
def curveVertex(x, y)
|
1389
|
+
(@drawingShape__ or raise "curveVertex() must be called after beginShape()")
|
1390
|
+
.curveVertex x, y
|
1391
|
+
end
|
1392
|
+
|
1393
|
+
# Append bezier vertex for shape polygon.
|
1394
|
+
#
|
1395
|
+
# @param x [Numeric] x position of vertex
|
1396
|
+
# @param y [Numeric] y position of vertex
|
1252
1397
|
#
|
1253
|
-
|
1254
|
-
|
1255
|
-
|
1398
|
+
# @return [nil] nil
|
1399
|
+
#
|
1400
|
+
# @see https://processing.org/reference/bezierVertex_.html
|
1401
|
+
# @see https://p5js.org/reference/#/p5/bezierVertex
|
1402
|
+
#
|
1403
|
+
def bezierVertex(x2, y2, x3, y3, x4, y4)
|
1404
|
+
(@drawingShape__ or raise "bezierVertex() must be called after beginShape()")
|
1405
|
+
.bezierVertex x2, y2, x3, y3, x4, y4
|
1406
|
+
end
|
1407
|
+
|
1408
|
+
# Append quadratic vertex for shape polygon.
|
1409
|
+
#
|
1410
|
+
# @param x [Numeric] x position of vertex
|
1411
|
+
# @param y [Numeric] y position of vertex
|
1412
|
+
#
|
1413
|
+
# @return [nil] nil
|
1414
|
+
#
|
1415
|
+
# @see https://processing.org/reference/quadraticVertex_.html
|
1416
|
+
# @see https://p5js.org/reference/#/p5/quadraticVertex
|
1417
|
+
#
|
1418
|
+
def quadraticVertex(cx, cy, x3, y3)
|
1419
|
+
(@drawingShape__ or raise "quadraticVertex() must be called after beginShape()")
|
1420
|
+
.quadraticVertex cx, cy, x3, y3
|
1256
1421
|
end
|
1257
1422
|
|
1258
1423
|
# Copies image.
|
@@ -1296,11 +1461,34 @@ module Processing
|
|
1296
1461
|
#
|
1297
1462
|
def blend(img = nil, sx, sy, sw, sh, dx, dy, dw, dh, mode)
|
1298
1463
|
assertDrawing__
|
1299
|
-
|
1300
|
-
img ||= self
|
1301
|
-
img.drawImage__(
|
1464
|
+
(img || self).drawImage__(
|
1302
1465
|
@painter__, sx, sy, sw, sh, dx, dy, dw, dh,
|
1303
|
-
fill:
|
1466
|
+
fill: getTint__, stroke: :none, blend_mode: mode)
|
1467
|
+
end
|
1468
|
+
|
1469
|
+
# Loads all pixels to the 'pixels' array.
|
1470
|
+
#
|
1471
|
+
# @return [nil] nil
|
1472
|
+
#
|
1473
|
+
def loadPixels()
|
1474
|
+
@pixels__ = getInternal__.pixels
|
1475
|
+
end
|
1476
|
+
|
1477
|
+
# Update the image pixels with the 'pixels' array.
|
1478
|
+
#
|
1479
|
+
# @return [nil] nil
|
1480
|
+
#
|
1481
|
+
def updatePixels()
|
1482
|
+
return unless @pixels__
|
1483
|
+
getInternal__.pixels = @pixels__
|
1484
|
+
@pixels__ = nil
|
1485
|
+
end
|
1486
|
+
|
1487
|
+
# An array of all pixels.
|
1488
|
+
# Call loadPixels() before accessing the array.
|
1489
|
+
#
|
1490
|
+
def pixels()
|
1491
|
+
@pixels__
|
1304
1492
|
end
|
1305
1493
|
|
1306
1494
|
# Saves screen image to file.
|
@@ -1310,7 +1498,7 @@ module Processing
|
|
1310
1498
|
# @return [nil] nil
|
1311
1499
|
#
|
1312
1500
|
def save(filename)
|
1313
|
-
|
1501
|
+
getInternal__.save filename
|
1314
1502
|
nil
|
1315
1503
|
end
|
1316
1504
|
|
@@ -1408,6 +1596,9 @@ module Processing
|
|
1408
1596
|
@painter__.clip,
|
1409
1597
|
@painter__.blend_mode,
|
1410
1598
|
@painter__.font,
|
1599
|
+
@painter__.texture,
|
1600
|
+
@painter__.texcoord_mode,
|
1601
|
+
@painter__.texcoord_wrap,
|
1411
1602
|
@painter__.shader,
|
1412
1603
|
@hsbColor__,
|
1413
1604
|
@colorMaxes__,
|
@@ -1418,6 +1609,7 @@ module Processing
|
|
1418
1609
|
@shapeMode__,
|
1419
1610
|
@textAlignH__,
|
1420
1611
|
@textAlignV__,
|
1612
|
+
@textFont__,
|
1421
1613
|
@tint__,
|
1422
1614
|
]
|
1423
1615
|
block.call if block
|
@@ -1440,6 +1632,9 @@ module Processing
|
|
1440
1632
|
@painter__.clip,
|
1441
1633
|
@painter__.blend_mode,
|
1442
1634
|
@painter__.font,
|
1635
|
+
@painter__.texture,
|
1636
|
+
@painter__.texcoord_mode,
|
1637
|
+
@painter__.texcoord_wrap,
|
1443
1638
|
@painter__.shader,
|
1444
1639
|
@hsbColor__,
|
1445
1640
|
@colorMaxes__,
|
@@ -1450,7 +1645,9 @@ module Processing
|
|
1450
1645
|
@shapeMode__,
|
1451
1646
|
@textAlignH__,
|
1452
1647
|
@textAlignV__,
|
1648
|
+
@textFont__,
|
1453
1649
|
@tint__ = @styleStack__.pop
|
1650
|
+
@textFont__.setSize__ @painter__.font.size
|
1454
1651
|
nil
|
1455
1652
|
end
|
1456
1653
|
|
@@ -1862,7 +2059,7 @@ module Processing
|
|
1862
2059
|
rand (low || 0).to_f...(high || 1).to_f
|
1863
2060
|
end
|
1864
2061
|
|
1865
|
-
# Creates a new vector.
|
2062
|
+
# Creates a new vector object.
|
1866
2063
|
#
|
1867
2064
|
# @overload createVector()
|
1868
2065
|
# @overload createVector(x, y)
|
@@ -1878,7 +2075,17 @@ module Processing
|
|
1878
2075
|
Vector.new(*args, context: self)
|
1879
2076
|
end
|
1880
2077
|
|
1881
|
-
# Creates a new
|
2078
|
+
# Creates a new font object.
|
2079
|
+
#
|
2080
|
+
# @param name [String] font name
|
2081
|
+
# @param size [Numeric] font size (max 256)
|
2082
|
+
#
|
2083
|
+
def createFont(name, size)
|
2084
|
+
size = FONT_SIZE_MAX__ if size && size > FONT_SIZE_MAX__
|
2085
|
+
Font.new Rays::Font.new(name, size || FONT_SIZE_DEFAULT__)
|
2086
|
+
end
|
2087
|
+
|
2088
|
+
# Creates a new image object.
|
1882
2089
|
#
|
1883
2090
|
# @overload createImage(w, h)
|
1884
2091
|
# @overload createImage(w, h, format)
|
@@ -1895,7 +2102,7 @@ module Processing
|
|
1895
2102
|
Image.new Rays::Image.new(w, h, colorspace).paint {background 0, 0}
|
1896
2103
|
end
|
1897
2104
|
|
1898
|
-
# Creates a new shape.
|
2105
|
+
# Creates a new shape object.
|
1899
2106
|
#
|
1900
2107
|
# @overload createShape()
|
1901
2108
|
# @overload createShape(LINE, x1, y1, x2, y2)
|
@@ -1924,7 +2131,7 @@ module Processing
|
|
1924
2131
|
|
1925
2132
|
# @private
|
1926
2133
|
private def createLineShape__(x1, y1, x2, y2)
|
1927
|
-
Shape.new Rays::Polygon.
|
2134
|
+
Shape.new Rays::Polygon.line(x1, y1, x2, y2), context: self
|
1928
2135
|
end
|
1929
2136
|
|
1930
2137
|
# @private
|
@@ -2014,6 +2221,23 @@ module Processing
|
|
2014
2221
|
Capture.new(*args)
|
2015
2222
|
end
|
2016
2223
|
|
2224
|
+
# Loads font from file.
|
2225
|
+
#
|
2226
|
+
# @param filename [String] file name to load font file
|
2227
|
+
#
|
2228
|
+
# @return [Font] loaded font object
|
2229
|
+
#
|
2230
|
+
# @see https://processing.org/reference/loadFont_.html
|
2231
|
+
# @see https://p5js.org/reference/#/p5/loadFont
|
2232
|
+
#
|
2233
|
+
def loadFont(filename)
|
2234
|
+
ext = File.extname filename
|
2235
|
+
raise "unsupported font type -- '#{ext}'" unless ext =~ /^\.?(ttf|otf)$/i
|
2236
|
+
|
2237
|
+
filename = httpGet__ filename, ext if filename =~ %r|^https?://|
|
2238
|
+
Font.new Rays::Font.load p filename
|
2239
|
+
end
|
2240
|
+
|
2017
2241
|
# Loads image.
|
2018
2242
|
#
|
2019
2243
|
# @param filename [String] file name to load image
|
@@ -2021,11 +2245,39 @@ module Processing
|
|
2021
2245
|
#
|
2022
2246
|
# @return [Image] loaded image object
|
2023
2247
|
#
|
2248
|
+
# @see https://processing.org/reference/loadImage_.html
|
2249
|
+
# @see https://p5js.org/reference/#/p5/loadImage
|
2250
|
+
#
|
2024
2251
|
def loadImage(filename, extension = nil)
|
2025
|
-
|
2252
|
+
ext = extension || File.extname(filename)
|
2253
|
+
raise "unsupported image type -- '#{ext}'" unless ext =~ /^\.?(png|jpg|gif)$/i
|
2254
|
+
|
2255
|
+
filename = httpGet__ filename, ext if filename =~ %r|^https?://|
|
2026
2256
|
Image.new Rays::Image.load filename
|
2027
2257
|
end
|
2028
2258
|
|
2259
|
+
# Loads image on a new thread.
|
2260
|
+
# When the image is loading, its width and height will be 0.
|
2261
|
+
# If an error occurs while loading the image, its width and height wil be -1.
|
2262
|
+
#
|
2263
|
+
# @param filename [String] file name to load image
|
2264
|
+
# @param extension [String] type of image to load (ex. 'png')
|
2265
|
+
#
|
2266
|
+
# @return [Image] loading image object
|
2267
|
+
#
|
2268
|
+
# @see https://processing.org/reference/requestImage_.html
|
2269
|
+
#
|
2270
|
+
def requestImage(filename, extension = nil)
|
2271
|
+
img = Image.new nil
|
2272
|
+
Thread.new filename, extension do |fn, ext|
|
2273
|
+
loaded = loadImage(fn, ext) or raise
|
2274
|
+
img.setInternal__ loaded.getInternal__
|
2275
|
+
rescue
|
2276
|
+
img.setInternal__ nil, true
|
2277
|
+
end
|
2278
|
+
img
|
2279
|
+
end
|
2280
|
+
|
2029
2281
|
# Loads shader file.
|
2030
2282
|
#
|
2031
2283
|
# @overload loadShader(fragPath)
|
@@ -2041,10 +2293,7 @@ module Processing
|
|
2041
2293
|
end
|
2042
2294
|
|
2043
2295
|
# @private
|
2044
|
-
private def
|
2045
|
-
ext ||= File.extname uri
|
2046
|
-
raise "unsupported image type -- #{ext}" unless ext =~ /^\.?(png|jpg|gif)$/i
|
2047
|
-
|
2296
|
+
private def httpGet__(uri, ext)
|
2048
2297
|
tmpdir = tmpdir__
|
2049
2298
|
path = tmpdir + Digest::SHA1.hexdigest(uri)
|
2050
2299
|
path = path.sub_ext ext
|