processing 0.5.29 → 0.5.31

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 43c304fcb0736f53301de6d1dcdea69d62c0f2cce027c6f5557102c8e92372b7
4
- data.tar.gz: a75abc1fec6ddbb3ee785ae444304dcd0a36ef1f67d5957779eb1926cc096fdd
3
+ metadata.gz: f74daae97a7e307834facbc6eb147a08dbdc731afdb738674161db47eccd04ef
4
+ data.tar.gz: 41324b1b967f4e3e5c11392ecf1a36beb82f9bbd4a2bb97dbc6d297b572bbe16
5
5
  SHA512:
6
- metadata.gz: 35a3a70db26dd8ff031675de548fb5593af891ca2699c6bf57a9fb2beccddada68e8ff2bd59ec8556edd625654d626fbe1c1aa82177253bcce884c3cec878ca7
7
- data.tar.gz: 74ee44f9aad045d7c7646afbe51f0952a40929aac202a92080e469f1693d21f56e9381aa5c57a81d5a6ae5aa7607313297ee48ad550695eafd9633275494a4c7
6
+ metadata.gz: dace99fcdae4a94a38942d40327fe0e27251e4ea0cb5ba1c1b19683c45a92690124449b61fd47980389730350e8ccda180076e29cf99678a03a2a8408d0be03e
7
+ data.tar.gz: a60cd201501e210f71ef6c163e0493877e6aed90ecae82c344d6f3e62238fa6091e3d1a17755098a3b7722b56f812fa6aa4ca1aa78de02560264f2fa30c41003
@@ -17,19 +17,19 @@ jobs:
17
17
  - name: checkout
18
18
  uses: actions/checkout@v2
19
19
 
20
+ - name: setup gems
21
+ run: bundle install
22
+
20
23
  - name: setup dependencies
21
24
  run: "ruby -I.github/workflows -rutils -e 'setup_dependencies'"
22
25
 
23
- - name: install gems
24
- run: gem install yard
25
-
26
26
  - name: test
27
- run: rake quiet test
27
+ run: bundle exec rake quiet test
28
28
 
29
29
  - name: create gem
30
30
  id: gem
31
31
  run: |
32
- rake gem
32
+ bundle exec rake gem
33
33
  echo path=$(ruby -e 'print Dir.glob("*.gem").first') >> $GITHUB_OUTPUT
34
34
 
35
35
  - name: create github release
@@ -59,4 +59,4 @@ jobs:
59
59
  touch $HOME/.gem/credentials
60
60
  chmod 0600 $HOME/.gem/credentials
61
61
  printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
62
- rake upload
62
+ bundle exec rake upload
@@ -0,0 +1,33 @@
1
+ name: Test Draw
2
+
3
+ on:
4
+ push:
5
+ branches: [master]
6
+ pull_request:
7
+
8
+ jobs:
9
+ test:
10
+ runs-on: macos-latest
11
+
12
+ steps:
13
+ - name: ruby 3.2
14
+ uses: ruby/setup-ruby@v1
15
+ with:
16
+ ruby-version: 3.2
17
+
18
+ - name: checkout
19
+ uses: actions/checkout@v2
20
+
21
+ - name: setup gems
22
+ run: bundle install
23
+
24
+ - name: setup dependencies
25
+ run: "ruby -I.github/workflows -rutils -e 'setup_dependencies'"
26
+
27
+ - name: setup chrome
28
+ uses: browser-actions/setup-chrome@latest
29
+ with:
30
+ chrome-version: stable
31
+
32
+ - name: test
33
+ run: rake test:draw
@@ -4,7 +4,6 @@ on:
4
4
  push:
5
5
  branches: [master]
6
6
  pull_request:
7
- branches: [master]
8
7
 
9
8
  jobs:
10
9
  test:
@@ -19,8 +18,11 @@ jobs:
19
18
  - name: checkout
20
19
  uses: actions/checkout@v2
21
20
 
21
+ - name: setup gems
22
+ run: bundle install
23
+
22
24
  - name: setup dependencies
23
25
  run: "ruby -I.github/workflows -rutils -e 'setup_dependencies'"
24
26
 
25
27
  - name: test
26
- run: rake test
28
+ run: bundle exec rake test
data/ChangeLog.md CHANGED
@@ -1,6 +1,24 @@
1
1
  # processing ChangeLog
2
2
 
3
3
 
4
+ ## [v0.5.31] - 2023-12-09
5
+
6
+ - Add Shape class
7
+ - Add createShape(), shape(), shapeMode()
8
+ - Add beginShape(), endShape(), and vertex(x, y)
9
+ - Test with p5.rb
10
+ - GraphicsContext#rotate() can take z parameter
11
+ - Set default miter_limit to 10
12
+ - Trigger github actions on all pull_request
13
+
14
+
15
+ ## [v0.5.30] - 2023-11-09
16
+
17
+ - Test drawing methods with p5.rb
18
+ - Add .github/workflows/test-draw.yml
19
+ - Use Gemfile to install gems for development instead of add_development_dependency in gemspec
20
+
21
+
4
22
  ## [v0.5.29] - 2023-10-29
5
23
 
6
24
  - Update dependencies
data/Gemfile CHANGED
@@ -1,3 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gemspec
3
+ gem 'rake'
4
+ gem 'test-unit'
5
+ gem 'yard'
6
+ gem 'ferrum'
data/Gemfile.lock ADDED
@@ -0,0 +1,35 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ addressable (2.8.5)
5
+ public_suffix (>= 2.0.2, < 6.0)
6
+ concurrent-ruby (1.2.2)
7
+ ferrum (0.14)
8
+ addressable (~> 2.5)
9
+ concurrent-ruby (~> 1.1)
10
+ webrick (~> 1.7)
11
+ websocket-driver (>= 0.6, < 0.8)
12
+ power_assert (2.0.3)
13
+ public_suffix (5.0.3)
14
+ rake (13.1.0)
15
+ test-unit (3.6.1)
16
+ power_assert
17
+ webrick (1.7.0)
18
+ websocket-driver (0.7.6)
19
+ websocket-extensions (>= 0.1.0)
20
+ websocket-extensions (0.1.5)
21
+ yard (0.9.34)
22
+
23
+ PLATFORMS
24
+ arm64-darwin-20
25
+ arm64-darwin-21
26
+ x86_64-darwin-20
27
+
28
+ DEPENDENCIES
29
+ ferrum
30
+ rake
31
+ test-unit
32
+ yard
33
+
34
+ BUNDLED WITH
35
+ 2.3.3
data/Rakefile CHANGED
@@ -14,11 +14,34 @@ require 'reflex/extension'
14
14
  require 'processing/extension'
15
15
 
16
16
 
17
+ def test_with_p5()
18
+ ENV['TEST_WITH_P5'] = '1'
19
+ end
20
+
17
21
  EXTENSIONS = [Xot, Rucy, Rays, Reflex, Processing]
18
22
 
19
23
  ENV['RDOC'] = 'yardoc --no-private'
20
24
 
25
+ #test_with_p5 if ci?
26
+
21
27
  default_tasks
28
+ use_bundler
22
29
  test_ruby_extension
23
30
  generate_documents
24
31
  build_ruby_gem
32
+
33
+ task :clean => 'test:clean'
34
+
35
+ namespace :test do
36
+ task :clean do
37
+ sh %( rm -rf test/.png/*.png )
38
+ end
39
+
40
+ task :with_p5 do
41
+ test_with_p5
42
+ end
43
+
44
+ ::Rake::TestTask.new :draw do |t|
45
+ t.test_files = FileList['test/test_*.rb']
46
+ end
47
+ end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.29
1
+ 0.5.31
@@ -14,6 +14,7 @@ require 'processing/vector'
14
14
  require 'processing/image'
15
15
  require 'processing/font'
16
16
  require 'processing/touch'
17
+ require 'processing/shape'
17
18
  require 'processing/shader'
18
19
  require 'processing/capture'
19
20
  require 'processing/graphics_context'
@@ -45,15 +45,16 @@ module Processing
45
45
  #
46
46
  DEGREES = :degrees
47
47
 
48
- # Mode for rectMode(), ellipseMode() and imageMode().
48
+ # Mode for rectMode(), ellipseMode(), imageMode(), and shapeMode().
49
49
  #
50
50
  CORNER = :corner
51
51
 
52
- # Mode for rectMode(), ellipseMode() and imageMode().
52
+ # Mode for rectMode(), ellipseMode(), imageMode(), and shapeMode().
53
53
  #
54
54
  CORNERS = :corners
55
55
 
56
- # Mode for rectMode(), ellipseMode(), imageMode() and textAlign().
56
+ # Mode for rectMode(), ellipseMode(), imageMode(), shapeMode(),
57
+ # and textAlign().
57
58
  #
58
59
  CENTER = :center
59
60
 
@@ -140,6 +141,57 @@ module Processing
140
141
  # Filter type for filter()
141
142
  BLUR = :blur
142
143
 
144
+ # Shape mode for createShape()
145
+ LINE = :line
146
+
147
+ # Shape mode for createShape()
148
+ RECT = :rect
149
+
150
+ # Shape mode for createShape()
151
+ ELLIPSE = :ellipse
152
+
153
+ # Shape mode for createShape()
154
+ ARC = :arc
155
+
156
+ # Shape mode for createShape()
157
+ TRIANGLE = :triangle
158
+
159
+ # Shape mode for createShape()
160
+ QUAD = :quad
161
+
162
+ # Shape mode for createShape()
163
+ GROUP = :group
164
+
165
+ # Shape mode for beginShape()
166
+ POINTS = :points
167
+
168
+ # Shape mode for beginShape()
169
+ LINES = :lines
170
+
171
+ # Shape mode for beginShape()
172
+ TRIANGLES = :triangles
173
+
174
+ # Shape mode for beginShape()
175
+ TRIANGLE_FAN = :triangle_fan
176
+
177
+ # Shape mode for beginShape()
178
+ TRIANGLE_STRIP = :triangle_strip
179
+
180
+ # Shape mode for beginShape()
181
+ QUADS = :quads
182
+
183
+ # Shape mode for beginShape()
184
+ QUAD_STRIP = :quad_strip
185
+
186
+ # Shape mode for beginShape()
187
+ TESS = :tess
188
+
189
+ # OPEN flag for endShape()
190
+ OPEN = :open
191
+
192
+ # CLOSE flag for endShape()
193
+ CLOSE = :close
194
+
143
195
  # Key codes.
144
196
  ENTER = :enter
145
197
  SPACE = :space
@@ -206,6 +258,7 @@ module Processing
206
258
  @rectMode__ = nil
207
259
  @ellipseMode__ = nil
208
260
  @imageMode__ = nil
261
+ @shapeMode__ = nil
209
262
  @blendMode__ = nil
210
263
  @textAlignH__ = nil
211
264
  @textAlignV__ = nil
@@ -222,6 +275,7 @@ module Processing
222
275
  rectMode CORNER
223
276
  ellipseMode CENTER
224
277
  imageMode CORNER
278
+ shapeMode CORNER
225
279
  blendMode BLEND
226
280
  strokeCap ROUND
227
281
  strokeJoin MITER
@@ -235,7 +289,9 @@ module Processing
235
289
 
236
290
  # @private
237
291
  def updateCanvas__(image, painter)
238
- @image__, @painter__ = image, painter
292
+ @image__, @painter__ = image, painter
293
+ @painter__.miter_limit = 10
294
+ @painter__.stroke_outset = 0.5
239
295
  end
240
296
 
241
297
  # @private
@@ -434,7 +490,7 @@ module Processing
434
490
  end
435
491
 
436
492
  # @private
437
- def toAngle__(angle)
493
+ def toDegrees__(angle)
438
494
  angle * @angleScale__
439
495
  end
440
496
 
@@ -460,8 +516,8 @@ module Processing
460
516
  #
461
517
  # CORNER -> rect(left, top, width, height)
462
518
  # CORNERS -> rect(left, top, right, bottom)
463
- # CENTER -> rect(center_x, center_y, width, height)
464
- # RADIUS -> rect(center_x, center_y, radius_h, radius_v)
519
+ # CENTER -> rect(centerX, centerY, width, height)
520
+ # RADIUS -> rect(centerX, centerY, radiusH, radiusV)
465
521
  #
466
522
  # @param mode [CORNER, CORNERS, CENTER, RADIUS]
467
523
  #
@@ -475,8 +531,8 @@ module Processing
475
531
  #
476
532
  # CORNER -> ellipse(left, top, width, height)
477
533
  # CORNERS -> ellipse(left, top, right, bottom)
478
- # CENTER -> ellipse(center_x, center_y, width, height)
479
- # RADIUS -> ellipse(center_x, center_y, radius_h, radius_v)
534
+ # CENTER -> ellipse(centerX, centerY, width, height)
535
+ # RADIUS -> ellipse(centerX, centerY, radiusH, radiusV)
480
536
  #
481
537
  # @param mode [CORNER, CORNERS, CENTER, RADIUS]
482
538
  #
@@ -490,7 +546,7 @@ module Processing
490
546
  #
491
547
  # CORNER -> image(img, left, top, width, height)
492
548
  # CORNERS -> image(img, left, top, right, bottom)
493
- # CENTER -> image(img, center_x, center_y, width, height)
549
+ # CENTER -> image(img, centerX, centerY, width, height)
494
550
  #
495
551
  # @param mode [CORNER, CORNERS, CENTER]
496
552
  #
@@ -500,6 +556,20 @@ module Processing
500
556
  @imageMode__ = mode
501
557
  end
502
558
 
559
+ # Sets shape mode. Default is CORNER.
560
+ #
561
+ # CORNER -> shape(shp, left, top, width, height)
562
+ # CORNERS -> shape(shp, left, top, right, bottom)
563
+ # CENTER -> shape(shp, centerX, centerY, width, height)
564
+ #
565
+ # @param mode [CORNER, CORNERS, CENTER]
566
+ #
567
+ # @return [nil] nil
568
+ #
569
+ def shapeMode(mode)
570
+ @shapeMode__ = mode
571
+ end
572
+
503
573
  # @private
504
574
  private def toXYWH__(mode, a, b, c, d)
505
575
  case mode
@@ -924,9 +994,8 @@ module Processing
924
994
  def arc(a, b, c, d, start, stop)
925
995
  assertDrawing__
926
996
  x, y, w, h = toXYWH__ @ellipseMode__, a, b, c, d
927
- start = toAngle__(-start)
928
- stop = toAngle__(-stop)
929
- @painter__.ellipse x, y, w, h, from: start, to: stop
997
+ from, to = toDegrees__(-start), toDegrees__(-stop)
998
+ @painter__.ellipse x, y, w, h, from: from, to: to
930
999
  nil
931
1000
  end
932
1001
 
@@ -1094,6 +1163,98 @@ module Processing
1094
1163
 
1095
1164
  alias drawImage image
1096
1165
 
1166
+ # Draws a shape.
1167
+ #
1168
+ # The parameters a, b, c, and d are determined by shapeMode().
1169
+ #
1170
+ # @overload shape(img, a, b)
1171
+ # @overload shape(img, a, b, c, d)
1172
+ #
1173
+ # @param shp [Shape] shape to draw
1174
+ # @param a [Numeric] horizontal position of the shape, by default
1175
+ # @param b [Numeric] vertical position of the shape, by default
1176
+ # @param c [Numeric] width of the shape, by default
1177
+ # @param d [Numeric] height of the shape, by default
1178
+ #
1179
+ # @return [nil] nil
1180
+ #
1181
+ def shape(shp, a = 0, b = 0, c = nil, d = nil)
1182
+ assertDrawing__
1183
+ return nil unless shp.isVisible
1184
+
1185
+ if c || d || @shapeMode__ != CORNER
1186
+ x, y, w, h = toXYWH__ @shapeMode__, a, b, c || shp.width, d || shp.height
1187
+ shp.draw__ @painter__, x, y, w, h
1188
+ else
1189
+ shp.draw__ @painter__, a, b
1190
+ end
1191
+ nil
1192
+ end
1193
+
1194
+ alias drawShape shape
1195
+
1196
+ # Begins drawing complex shapes.
1197
+ #
1198
+ # @param mode [POINTS, LINES, TRIANGLES, TRIANGLE_FAN, TRIANGLE_STRIP, QUADS, QUAD_STRIP, TESS]
1199
+ #
1200
+ # @return [nil] nil
1201
+ #
1202
+ # @example
1203
+ # # Draws polygon
1204
+ # beginShape
1205
+ # vertex 10, 10
1206
+ # vertex 10, 50
1207
+ # vertex 50, 50
1208
+ # vertex 90, 10
1209
+ # endShape CLOSE
1210
+ #
1211
+ # # Draws triangles
1212
+ # beginShape TRIANGLES
1213
+ # vertex 10, 10
1214
+ # vertex 10, 50
1215
+ # vertex 50, 50
1216
+ # endShape
1217
+ #
1218
+ # @see https://processing.org/reference/beginShape_.html
1219
+ #
1220
+ def beginShape(mode = nil)
1221
+ @shapeMode__, @shapePoints__ = mode, []
1222
+ nil
1223
+ end
1224
+
1225
+ # Ends drawing complex shapes.
1226
+ #
1227
+ # @overload endShape()
1228
+ # @overload endShape(CLOSE)
1229
+ #
1230
+ # @param mode [CLOSE] Use CLOSE to create looped polygon
1231
+ #
1232
+ # @return [nil] nil
1233
+ #
1234
+ # @see https://processing.org/reference/endShape_.html
1235
+ #
1236
+ def endShape(mode = nil)
1237
+ raise "endShape() must be called after beginShape()" unless @shapePoints__
1238
+ polygon = Shape.createPolygon__ @shapeMode__, @shapePoints__, mode == CLOSE
1239
+ @painter__.polygon polygon if polygon
1240
+ @shapeMode__ = @shapePoints__ = nil
1241
+ nil
1242
+ end
1243
+
1244
+ # Append vertex for shape polygon.
1245
+ #
1246
+ # @param x [Numeric] x position of vertex
1247
+ # @param y [Numeric] y position of vertex
1248
+ #
1249
+ # @return [nil] nil
1250
+ #
1251
+ # @see https://processing.org/reference/vertex_.html
1252
+ #
1253
+ def vertex(x, y)
1254
+ raise "vertex() must be called after beginShape()" unless @shapePoints__
1255
+ @shapePoints__ << x << y
1256
+ end
1257
+
1097
1258
  # Copies image.
1098
1259
  #
1099
1260
  # @overload copy(sx, sy, sw, sh, dx, dy, dw, dh)
@@ -1181,9 +1342,9 @@ module Processing
1181
1342
  #
1182
1343
  # @return [nil] nil
1183
1344
  #
1184
- def scale(x, y)
1345
+ def scale(x, y = nil, z = 1)
1185
1346
  assertDrawing__
1186
- @painter__.scale x, y
1347
+ @painter__.scale x, (y || x), z
1187
1348
  nil
1188
1349
  end
1189
1350
 
@@ -1195,7 +1356,7 @@ module Processing
1195
1356
  #
1196
1357
  def rotate(angle)
1197
1358
  assertDrawing__
1198
- @painter__.rotate toAngle__ angle
1359
+ @painter__.rotate toDegrees__ angle
1199
1360
  nil
1200
1361
  end
1201
1362
 
@@ -1254,6 +1415,7 @@ module Processing
1254
1415
  @rectMode__,
1255
1416
  @ellipseMode__,
1256
1417
  @imageMode__,
1418
+ @shapeMode__,
1257
1419
  @textAlignH__,
1258
1420
  @textAlignV__,
1259
1421
  @tint__,
@@ -1285,6 +1447,7 @@ module Processing
1285
1447
  @rectMode__,
1286
1448
  @ellipseMode__,
1287
1449
  @imageMode__,
1450
+ @shapeMode__,
1288
1451
  @textAlignH__,
1289
1452
  @textAlignV__,
1290
1453
  @tint__ = @styleStack__.pop
@@ -1732,6 +1895,67 @@ module Processing
1732
1895
  Image.new Rays::Image.new(w, h, colorspace).paint {background 0, 0}
1733
1896
  end
1734
1897
 
1898
+ # Creates a new shape.
1899
+ #
1900
+ # @overload createShape()
1901
+ # @overload createShape(LINE, x1, y1, x2, y2)
1902
+ # @overload createShape(RECT, a, b, c, d)
1903
+ # @overload createShape(ELLIPSE, a, b, c, d)
1904
+ # @overload createShape(ARC, a, b, c, d, start, stop)
1905
+ # @overload createShape(TRIANGLE, x1, y1, x2, y2, x3, y3)
1906
+ # @overload createShape(QUAD, x1, y1, x2, y2, x3, y3, x4, y4)
1907
+ # @overload createShape(GROUP)
1908
+ #
1909
+ # @param kind [LINE, RECT, ELLIPSE, ARC, TRIANGLE, QUAD, GROUP]
1910
+ #
1911
+ def createShape(kind = nil, *args)
1912
+ case kind
1913
+ when LINE then createLineShape__( *args)
1914
+ when RECT then createRectShape__( *args)
1915
+ when ELLIPSE then createEllipseShape__( *args)
1916
+ when ARC then createArcShape__( *args)
1917
+ when TRIANGLE then createTriangleShape__(*args)
1918
+ when QUAD then createQuadShape__( *args)
1919
+ when GROUP then Shape.new nil, [], context: self
1920
+ when nil then Shape.new context: self
1921
+ else raise ArgumentError, "Unknown shape kind '#{kind}'"
1922
+ end
1923
+ end
1924
+
1925
+ # @private
1926
+ private def createLineShape__(x1, y1, x2, y2)
1927
+ Shape.new Rays::Polygon.lines(x1, y1, x2, y2), context: self
1928
+ end
1929
+
1930
+ # @private
1931
+ private def createRectShape__(a, b, c, d)
1932
+ x, y, w, h = toXYWH__ @rectMode__, a, b, c, d
1933
+ Shape.new Rays::Polygon.rect(x, y, w, h), context: self
1934
+ end
1935
+
1936
+ # @private
1937
+ private def createEllipseShape__(a, b, c, d)
1938
+ x, y, w, h = toXYWH__ @ellipseMode__, a, b, c, d
1939
+ Shape.new Rays::Polygon.ellipse(x, y, w, h), context: self
1940
+ end
1941
+
1942
+ # @private
1943
+ private def createArcShape__(a, b, c, d, start, stop)
1944
+ x, y, w, h = toXYWH__ @ellipseMode__, a, b, c, d
1945
+ from, to = toDegrees__(-start), toDegrees__(-stop)
1946
+ Shape.new Rays::Polygon.ellipse(x, y, w, h, from: from, to: to), context: self
1947
+ end
1948
+
1949
+ # @private
1950
+ private def createTriangleShape__(x1, y1, x2, y2, x3, y3)
1951
+ Shape.new Rays::Polygon.new(x1, y1, x2, y2, x3, y3, loop: true), context: self
1952
+ end
1953
+
1954
+ # @private
1955
+ private def createQuadShape__(x1, y1, x2, y2, x3, y3, x4, y4)
1956
+ Shape.new Rays::Polygon.quads(x1, y1, x2, y2, x3, y3, x4, y4), context: self
1957
+ end
1958
+
1735
1959
  # Creates a new off-screen graphics context object.
1736
1960
  #
1737
1961
  # @param width [Numeric] width of graphics image