rubysketch 0.2.1 → 0.2.6

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: 7b5455321365a6f09ff9b1b2fc60610475a1d5393a41b276d433e1030503a1dc
4
- data.tar.gz: 159b3ec3b99acf5d95e0d833ccbddc8df382ae7b09c77e1b6e4058ef16d29b9f
3
+ metadata.gz: 9068a9fe7e5239420f8e32fb2e30912748bf9c90c52f40516604997b1166830a
4
+ data.tar.gz: 2a75b3ec215aeb15bfba929f561abd2a4f94c4c8093b27bad4de1ee74dd15efa
5
5
  SHA512:
6
- metadata.gz: e85a61ae56932d886029b57ab86085c8db14fa817527da37983822a0d37469352f53b53cdbe103fe3c92de31f6424b0ba44c5eee29605976a0756dea89307fea
7
- data.tar.gz: 1d6d641becbe81d1a692f2a0fcf016c1f15ac743699e97d0e3bb9f1e0078f6883f3613b0aafb027fba922ceacfee718e768739a7e9a1ecb1aaca38a5141b22a6
6
+ metadata.gz: d7a6252c38ab1fdda0c761c390bb5d0bb3583e740d7beea5efe3c5939a1f52840aac93c41aee693870dde4539df3f69dba20476c34b85a2eb5791fb3bcd63498
7
+ data.tar.gz: ccd6c65ff6b5e0340e7a8e779c2d1da2f277294ae9e03386a7d1317568badade0d4fe51758559680ef22ccc080486a3d2df43dab0501c91c9a6da3cc7144eb1d
@@ -0,0 +1,17 @@
1
+ # RubySketch ChangeLog
2
+
3
+
4
+ ## [0.2.6] - 2020-04-17
5
+
6
+ - push(), pushMatrix() and pushStyle() take block to automatic pop
7
+ - add stroke_cap() and stroke_join()
8
+ - refine startup process
9
+ - add curve() and bezier()
10
+ - add imageMode(), Image#resize(), Image#copy() and copy()
11
+ - add loop(), noLoop() and redraw()
12
+
13
+
14
+ ## [0.2.5] - 2020-03-29
15
+
16
+ - delete debug prints
17
+ - show unsupported image type
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.2.6
@@ -20,12 +20,10 @@ end
20
20
  draw do
21
21
  background 0
22
22
 
23
- begin
24
- pushMatrix
23
+ pushMatrix do
25
24
  translate width / 2, height / 2
26
25
 
27
- begin
28
- pushMatrix
26
+ pushMatrix do
29
27
  fill COLORS[0]
30
28
  ellipse 0, 0, 20, 20
31
29
  rotate (now - start) / 60.0 * 360
@@ -33,32 +31,25 @@ draw do
33
31
  strokeWeight 5
34
32
  line 0, 0, 200, 0
35
33
  fill 1
36
- popMatrix
37
34
  end
38
35
 
39
- begin
40
- pushMatrix
36
+ pushMatrix do
41
37
  strokeWeight 3
42
38
  60.times do
43
39
  rotate 6
44
40
  stroke COLORS[1]
45
41
  line 200, 0, 210, 0
46
42
  end
47
- popMatrix
48
43
  end
49
44
 
50
- begin
51
- pushMatrix
45
+ pushMatrix do
52
46
  strokeWeight 5
53
47
  12.times do
54
48
  rotate 30
55
49
  stroke COLORS[3]
56
50
  line 190, 0, 210, 0
57
51
  end
58
- popMatrix
59
52
  end
60
-
61
- popMatrix
62
53
  end
63
54
 
64
55
  textSize 20
@@ -5,7 +5,7 @@
5
5
  require 'rubysketch-processing'
6
6
 
7
7
 
8
- icon = loadImage 'rubysketch.png'
8
+ icon = loadImage 'https://xord.org/rubysketch/rubysketch.png'
9
9
 
10
10
  draw do
11
11
  background 0, 10
@@ -1,4 +1,33 @@
1
1
  require 'rubysketch'
2
2
 
3
3
 
4
- RubySketch.__send__ :start_on_object_at_exit, self, RubySketch::Processing.new
4
+ begin
5
+ context = RubySketch::Processing.new
6
+ methods = context.class.instance_methods(false)
7
+ .reject {|name| name =~ /__$/}
8
+ consts = context.class.constants
9
+ .reject {|name| name =~ /__$/}
10
+ .each_with_object({}) {|name, h| h[name] = context.class.const_get name}
11
+
12
+ self.class.class_eval do
13
+ methods.each do |name|
14
+ define_method name do |*args, &block|
15
+ context.__send__ name, *args, &block
16
+ end
17
+ end
18
+ consts.each do |(name, value)|
19
+ const_set name, value
20
+ end
21
+ end
22
+
23
+ window = RubySketch::Window.new do |_|
24
+ window.start
25
+ end
26
+ context.setup__ window
27
+
28
+ window.canvas_painter.__send__ :begin_paint
29
+ at_exit do
30
+ window.canvas_painter.__send__ :end_paint
31
+ Reflex.start {window.show}
32
+ end
33
+ end
@@ -1,6 +1,10 @@
1
+ require 'digest/sha1'
2
+ require 'pathname'
3
+ require 'tmpdir'
4
+ require 'open-uri'
5
+
1
6
  require 'reflex'
2
7
  require 'rubysketch/module'
3
- require 'rubysketch/starter'
4
8
  require 'rubysketch/window'
5
9
  require 'rubysketch/processing'
6
10
  require 'rubysketch/glsl'
@@ -4,8 +4,6 @@ module RubySketch
4
4
  # @private
5
5
  class GLSL
6
6
 
7
- extend Starter
8
-
9
7
  def initialize (glsl)
10
8
  @shader = Reflex::Shader.new glsl
11
9
  end
@@ -7,8 +7,6 @@ module RubySketch
7
7
 
8
8
  include Math
9
9
 
10
- extend Starter
11
-
12
10
  HALF_PI = PI / 2
13
11
  QUARTER_PI = PI / 4
14
12
  TWO_PI = PI * 2
@@ -43,6 +41,8 @@ module RubySketch
43
41
 
44
42
  # @private
45
43
  def initialize ()
44
+ @loop__ = true
45
+ @redraw__ = false
46
46
  @matrixStack__ = []
47
47
  @styleStack__ = []
48
48
  @frameCount__ = 0
@@ -59,18 +59,67 @@ module RubySketch
59
59
  angleMode RADIANS
60
60
  rectMode CORNER
61
61
  ellipseMode CENTER
62
+ imageMode CORNER
62
63
  end
63
64
 
64
65
  # @private
65
- def on_start__ (window)
66
+ def setup__ (window)
66
67
  @window__ = window
67
- @painter__ = window.canvas_painter
68
+ @painter__ = window.canvas_painter.tap do |o|
69
+ o.miter_limit = 10
70
+ end
71
+
72
+ drawFrame = -> event {
73
+ @painter__ = window.canvas_painter
74
+ @matrixStack__.clear
75
+ @styleStack__.clear
76
+ begin
77
+ push
78
+ @drawBlock__.call event if @drawBlock__
79
+ ensure
80
+ pop
81
+ end
82
+ @frameCount__ += 1
83
+ }
84
+
85
+ updateMouseState = -> x, y, pressed = nil {
86
+ @mouseX__ = x
87
+ @mouseY__ = y
88
+ @mousePressed__ = pressed if pressed != nil
89
+ }
90
+
91
+ updateMousePrevPos = -> {
92
+ @mousePrevX__ = @mouseX__
93
+ @mousePrevY__ = @mouseY__
94
+ }
95
+
96
+ @window__.draw = proc do |e|
97
+ if @loop__ || @redraw__
98
+ @redraw__ = false
99
+ drawFrame.call e
100
+ end
101
+ updateMousePrevPos.call
102
+ end
103
+
104
+ @window__.pointer_down = proc do |e|
105
+ updateMouseState.call e.x, e.y, true
106
+ @mousePressedBlock__.call e if @mousePressedBlock__
107
+ end
108
+
109
+ @window__.pointer_up = proc do |e|
110
+ updateMouseState.call e.x, e.y, false
111
+ @mouseReleasedBlock__.call e if @mouseReleasedBlock__
112
+ end
113
+
114
+ @window__.pointer_move = proc do |e|
115
+ updateMouseState.call e.x, e.y
116
+ @mouseMovedBlock__.call e if @mouseMovedBlock__
117
+ end
68
118
 
69
- setupDrawBlock__
70
- setupMousePressedBlock__
71
- setupMouseReleasedBlock__
72
- setupMouseMovedBlock__
73
- setupMouseDraggedBlock__
119
+ @window__.pointer_drag = proc do |e|
120
+ updateMouseState.call e.x, e.y
121
+ @mouseDraggedBlock__.call e if @mouseDraggedBlock__
122
+ end
74
123
  end
75
124
 
76
125
  # Returns the absolute number of the value.
@@ -293,23 +342,6 @@ module RubySketch
293
342
  nil
294
343
  end
295
344
 
296
- # @private
297
- private def setupDrawBlock__ ()
298
- @window__.draw = proc do |e, painter|
299
- @painter__ = painter
300
- @matrixStack__.clear
301
- @styleStack__.clear
302
- begin
303
- push
304
- @drawBlock__.call e if @drawBlock__
305
- ensure
306
- pop
307
- end
308
- @frameCount__ += 1
309
- updateMousePrevPos__
310
- end
311
- end
312
-
313
345
  # Define draw block.
314
346
  #
315
347
  def draw (&block)
@@ -322,71 +354,26 @@ module RubySketch
322
354
  nil
323
355
  end
324
356
 
325
- # @private
326
- private def setupMousePressedBlock__ ()
327
- @window__.pointer_down = proc do |e|
328
- updateMouseState__ e.x, e.y, true
329
- @mousePressedBlock__.call e if @mousePressedBlock__
330
- end
331
- end
332
-
333
357
  def mousePressed (&block)
334
358
  @mousePressedBlock__ = block if block
335
359
  @mousePressed__
336
360
  end
337
361
 
338
- # @private
339
- private def setupMouseReleasedBlock__ ()
340
- @window__.pointer_up = proc do |e|
341
- updateMouseState__ e.x, e.y, false
342
- @mouseReleasedBlock__.call e if @mouseReleasedBlock__
343
- end
344
- end
345
-
346
362
  def mouseReleased (&block)
347
363
  @mouseReleasedBlock__ = block if block
348
364
  nil
349
365
  end
350
366
 
351
- # @private
352
- private def setupMouseMovedBlock__ ()
353
- @window__.pointer_move = proc do |e|
354
- updateMouseState__ e.x, e.y
355
- @mouseMovedBlock__.call e if @mouseMovedBlock__
356
- end
357
- end
358
-
359
367
  def mouseMoved (&block)
360
368
  @mouseMovedBlock__ = block if block
361
369
  nil
362
370
  end
363
371
 
364
- # @private
365
- private def setupMouseDraggedBlock__ ()
366
- @window__.pointer_drag = proc do |e|
367
- updateMouseState__ e.x, e.y
368
- @mouseDraggedBlock__.call e if @mouseDraggedBlock__
369
- end
370
- end
371
-
372
372
  def mouseDragged (&block)
373
373
  @mouseDraggedBlock__ = block if block
374
374
  nil
375
375
  end
376
376
 
377
- # @private
378
- private def updateMouseState__ (x, y, pressed = nil)
379
- @mouseX__ = x
380
- @mouseY__ = y
381
- @mousePressed__ = pressed if pressed != nil
382
- end
383
-
384
- # @private
385
- private def updateMousePrevPos__ ()
386
- @mousePrevX__ = @mouseX__
387
- @mousePrevY__ = @mouseY__
388
- end
389
-
390
377
  # @private
391
378
  private def size__ (width, height)
392
379
  raise 'size() must be called on startup or setup block' if @started__
@@ -487,7 +474,7 @@ module RubySketch
487
474
  # @return [nil] nil
488
475
  #
489
476
  def colorMode (mode, *maxes)
490
- raise ArgumentError, "Invalid color mode: #{mode}" unless [RGB, HSB].include?(mode)
477
+ raise ArgumentError, "invalid color mode: #{mode}" unless [RGB, HSB].include?(mode)
491
478
  raise ArgumentError unless [0, 1, 3, 4].include?(maxes.size)
492
479
 
493
480
  @hsbColor__ = mode.upcase == HSB
@@ -499,9 +486,9 @@ module RubySketch
499
486
  end
500
487
 
501
488
  # @private
502
- private def to_rgba__ (*args)
489
+ private def toRGBA__ (*args)
503
490
  a, b, c, d = args
504
- return parse_color__(a, b || alphaMax__) if a.kind_of?(String)
491
+ return parseColor__(a, b || alphaMax__) if a.kind_of?(String)
505
492
 
506
493
  rgba = case args.size
507
494
  when 1, 2 then [a, a, a, b || alphaMax__]
@@ -514,9 +501,9 @@ module RubySketch
514
501
  end
515
502
 
516
503
  # @private
517
- private def parse_color__ (str, alpha)
504
+ private def parseColor__ (str, alpha)
518
505
  result = str.match /^\s*##{'([0-9a-f]{2})' * 3}\s*$/i
519
- raise ArgumentError, "Invalid color code: '#{str}'" unless result
506
+ raise ArgumentError, "invalid color code: '#{str}'" unless result
520
507
 
521
508
  rgb = result[1..3].map.with_index {|hex, i| hex.to_i(16) / 255.0}
522
509
  return *rgb, (alpha / alphaMax__)
@@ -537,13 +524,13 @@ module RubySketch
537
524
  @angleScale__ = case mode
538
525
  when RADIANS then RAD2DEG__
539
526
  when DEGREES then 1.0
540
- else raise ArgumentError, "Invalid angle mode: #{mode}"
527
+ else raise ArgumentError, "invalid angle mode: #{mode}"
541
528
  end
542
529
  nil
543
530
  end
544
531
 
545
532
  # @private
546
- private def to_angle__ (angle)
533
+ private def toAngle__ (angle)
547
534
  angle * @angleScale__
548
535
  end
549
536
 
@@ -577,8 +564,22 @@ module RubySketch
577
564
  @ellipseMode__ = mode
578
565
  end
579
566
 
567
+ # Sets image mode. Default is CORNER.
568
+ #
569
+ # CORNER -> image(img, left, top, width, height)
570
+ # CORNERS -> image(img, left, top, right, bottom)
571
+ # CENTER -> image(img, center_x, center_y, width, height)
572
+ #
573
+ # @param mode [CORNER, CORNERS, CENTER]
574
+ #
575
+ # @return [nil] nil
576
+ #
577
+ def imageMode (mode)
578
+ @imageMode__ = mode
579
+ end
580
+
580
581
  # @private
581
- private def to_xywh__ (mode, a, b, c, d)
582
+ private def toXYWH__ (mode, a, b, c, d)
582
583
  case mode
583
584
  when CORNER then [a, b, c, d]
584
585
  when CORNERS then [a, b, c - a, d - b]
@@ -588,6 +589,30 @@ module RubySketch
588
589
  end
589
590
  end
590
591
 
592
+ # Enables calling draw block on every frame.
593
+ #
594
+ # @return [nil] nil
595
+ #
596
+ def loop ()
597
+ @loop__ = true
598
+ end
599
+
600
+ # Disables calling draw block on every frame.
601
+ #
602
+ # @return [nil] nil
603
+ #
604
+ def noLoop ()
605
+ @loop__ = false
606
+ end
607
+
608
+ # Calls draw block to redraw frame.
609
+ #
610
+ # @return [nil] nil
611
+ #
612
+ def redraw ()
613
+ @redraw__ = true
614
+ end
615
+
591
616
  # Clears screen.
592
617
  #
593
618
  # @overload background(str)
@@ -607,7 +632,7 @@ module RubySketch
607
632
  # @return [nil] nil
608
633
  #
609
634
  def background (*args)
610
- rgba = to_rgba__ *args
635
+ rgba = toRGBA__ *args
611
636
  if rgba[3] == 1
612
637
  @painter__.background *rgba
613
638
  else
@@ -637,7 +662,7 @@ module RubySketch
637
662
  # @return [nil] nil
638
663
  #
639
664
  def fill (*args)
640
- @painter__.fill(*to_rgba__(*args))
665
+ @painter__.fill(*toRGBA__(*args))
641
666
  nil
642
667
  end
643
668
 
@@ -660,7 +685,7 @@ module RubySketch
660
685
  # @return [nil] nil
661
686
  #
662
687
  def stroke (*args)
663
- @painter__.stroke(*to_rgba__(*args))
688
+ @painter__.stroke(*toRGBA__(*args))
664
689
  nil
665
690
  end
666
691
 
@@ -732,10 +757,10 @@ module RubySketch
732
757
 
733
758
  # Draws a line.
734
759
  #
735
- # @param x1 [Numeric] horizontal position for first point
736
- # @param y1 [Numeric] vertical position for first point
737
- # @param x2 [Numeric] horizontal position for second point
738
- # @param y2 [Numeric] vertical position for second point
760
+ # @param x1 [Numeric] horizontal position of first point
761
+ # @param y1 [Numeric] vertical position of first point
762
+ # @param x2 [Numeric] horizontal position of second point
763
+ # @param y2 [Numeric] vertical position of second point
739
764
  #
740
765
  # @return [nil] nil
741
766
  #
@@ -763,7 +788,7 @@ module RubySketch
763
788
  # @return [nil] nil
764
789
  #
765
790
  def rect (a, b, c, d, *args)
766
- x, y, w, h = to_xywh__ @rectMode__, a, b, c, d
791
+ x, y, w, h = toXYWH__ @rectMode__, a, b, c, d
767
792
  case args.size
768
793
  when 0 then @painter__.rect x, y, w, h
769
794
  when 1 then @painter__.rect x, y, w, h, round: args[0]
@@ -783,7 +808,7 @@ module RubySketch
783
808
  # @return [nil] nil
784
809
  #
785
810
  def ellipse (a, b, c, d)
786
- x, y, w, h = to_xywh__ @ellipseMode__, a, b, c, d
811
+ x, y, w, h = toXYWH__ @ellipseMode__, a, b, c, d
787
812
  @painter__.ellipse x, y, w, h
788
813
  nil
789
814
  end
@@ -812,9 +837,9 @@ module RubySketch
812
837
  # @return [nil] nil
813
838
  #
814
839
  def arc (a, b, c, d, start, stop)
815
- x, y, w, h = to_xywh__ @ellipseMode__, a, b, c, d
816
- start = to_angle__ start
817
- stop = to_angle__ stop
840
+ x, y, w, h = toXYWH__ @ellipseMode__, a, b, c, d
841
+ start = toAngle__ start
842
+ stop = toAngle__ stop
818
843
  @painter__.ellipse x, y, w, h, from: start, to: stop
819
844
  nil
820
845
  end
@@ -865,6 +890,42 @@ module RubySketch
865
890
  nil
866
891
  end
867
892
 
893
+ # Draws a Catmull-Rom spline curve.
894
+ #
895
+ # @param cx1 [Numeric] horizontal position of beginning control point
896
+ # @param cy1 [Numeric] vertical position of beginning control point
897
+ # @param x1 [Numeric] horizontal position of first point
898
+ # @param y1 [Numeric] vertical position of first point
899
+ # @param x2 [Numeric] horizontal position of second point
900
+ # @param y2 [Numeric] vertical position of second point
901
+ # @param cx2 [Numeric] horizontal position of ending control point
902
+ # @param cy2 [Numeric] vertical position of ending control point
903
+ #
904
+ # @return [nil] nil
905
+ #
906
+ def curve (cx1, cy1, x1, y1, x2, y2, cx2, cy2)
907
+ @painter__.curve cx1, cy1, x1, y1, x2, y2, cx2, cy2
908
+ nil
909
+ end
910
+
911
+ # Draws a Bezier spline curve.
912
+ #
913
+ # @param x1 [Numeric] horizontal position of first point
914
+ # @param y1 [Numeric] vertical position of first point
915
+ # @param cx1 [Numeric] horizontal position of first control point
916
+ # @param cy1 [Numeric] vertical position of first control point
917
+ # @param cx2 [Numeric] horizontal position of second control point
918
+ # @param cy2 [Numeric] vertical position of second control point
919
+ # @param x2 [Numeric] horizontal position of second point
920
+ # @param y2 [Numeric] vertical position of second point
921
+ #
922
+ # @return [nil] nil
923
+ #
924
+ def bezier (x1, y1, cx1, cy1, cx2, cy2, x2, y2)
925
+ @painter__.bezier x1, y1, cx1, cy1, cx2, cy2, x2, y2
926
+ nil
927
+ end
928
+
868
929
  # Draws a text.
869
930
  #
870
931
  # @overload text(str)
@@ -883,24 +944,45 @@ module RubySketch
883
944
 
884
945
  # Draws an image.
885
946
  #
886
- # @overload image(img, x, y)
887
- # @overload image(img, x, y, w, h)
947
+ # @overload image(img, a, b)
948
+ # @overload image(img, a, b, c, d)
888
949
  #
889
950
  # @param img [Image] image to draw
890
- # @param x [Numeric] horizontal position of the image
891
- # @param y [Numeric] vertical position of the image
892
- # @param w [Numeric] width of the image
893
- # @param h [Numeric] height of the image
951
+ # @param a [Numeric] horizontal position of the image
952
+ # @param b [Numeric] vertical position of the image
953
+ # @param c [Numeric] width of the image
954
+ # @param d [Numeric] height of the image
894
955
  #
895
956
  # @return [nil] nil
896
957
  #
897
- def image (img, x, y, w = nil, h = nil)
898
- w ||= img.width
899
- h ||= img.height
900
- @painter__.image img.internal, x, y, w, h
958
+ def image (img, a, b, c = nil, d = nil)
959
+ x, y, w, h = toXYWH__ @imageMode__, a, b, c || img.width, d || img.height
960
+ @painter__.image img.to_internal__, x, y, w, h
901
961
  nil
902
962
  end
903
963
 
964
+ # Copies image.
965
+ #
966
+ # @overload copy(sx, sy, sw, sh, dx, dy, dw, dh)
967
+ # @overload copy(img, sx, sy, sw, sh, dx, dy, dw, dh)
968
+ #
969
+ # @param img [Image] image for copy source
970
+ # @param sx [Numrtic] x position of source region
971
+ # @param sy [Numrtic] y position of source region
972
+ # @param sw [Numrtic] width of source region
973
+ # @param sh [Numrtic] height of source region
974
+ # @param dx [Numrtic] x position of destination region
975
+ # @param dy [Numrtic] y position of destination region
976
+ # @param dw [Numrtic] width of destination region
977
+ # @param dh [Numrtic] height of destination region
978
+ #
979
+ # @return [nil] nil
980
+ #
981
+ def copy (img = nil, sx, sy, sw, sh, dx, dy, dw, dh)
982
+ src = img&.to_internal__ || @window__.canvas
983
+ @painter__.image src, sx, sy, sw, sh, dx, dy, dw, dh
984
+ end
985
+
904
986
  # Applies translation matrix to current transformation matrix.
905
987
  #
906
988
  # @param x [Numeric] horizontal transformation
@@ -936,7 +1018,7 @@ module RubySketch
936
1018
  # @return [nil] nil
937
1019
  #
938
1020
  def rotate (angle)
939
- @painter__.rotate to_angle__ angle
1021
+ @painter__.rotate toAngle__ angle
940
1022
  nil
941
1023
  end
942
1024
 
@@ -944,8 +1026,12 @@ module RubySketch
944
1026
  #
945
1027
  # @return [nil] nil
946
1028
  #
947
- def pushMatrix ()
1029
+ def pushMatrix (&block)
948
1030
  @matrixStack__.push @painter__.matrix
1031
+ if block
1032
+ block.call
1033
+ popMatrix
1034
+ end
949
1035
  nil
950
1036
  end
951
1037
 
@@ -954,7 +1040,7 @@ module RubySketch
954
1040
  # @return [nil] nil
955
1041
  #
956
1042
  def popMatrix ()
957
- raise "Matrix stack underflow" if @matrixStack__.empty?
1043
+ raise "matrix stack underflow" if @matrixStack__.empty?
958
1044
  @painter__.matrix = @matrixStack__.pop
959
1045
  nil
960
1046
  end
@@ -972,18 +1058,25 @@ module RubySketch
972
1058
  #
973
1059
  # @return [nil] nil
974
1060
  #
975
- def pushStyle ()
1061
+ def pushStyle (&block)
976
1062
  @styleStack__.push [
977
1063
  @painter__.fill,
978
1064
  @painter__.stroke,
979
1065
  @painter__.stroke_width,
1066
+ @painter__.stroke_cap,
1067
+ @painter__.stroke_join,
980
1068
  @painter__.font,
981
1069
  @hsbColor__,
982
1070
  @colorMaxes__,
983
1071
  @angleScale__,
984
1072
  @rectMode__,
985
- @ellipseMode__
1073
+ @ellipseMode__,
1074
+ @imageMode__
986
1075
  ]
1076
+ if block
1077
+ block.call
1078
+ popStyle
1079
+ end
987
1080
  nil
988
1081
  end
989
1082
 
@@ -992,16 +1085,19 @@ module RubySketch
992
1085
  # @return [nil] nil
993
1086
  #
994
1087
  def popStyle ()
995
- raise "Style stack underflow" if @styleStack__.empty?
1088
+ raise "style stack underflow" if @styleStack__.empty?
996
1089
  @painter__.fill,
997
1090
  @painter__.stroke,
998
1091
  @painter__.stroke_width,
1092
+ @painter__.stroke_cap,
1093
+ @painter__.stroke_join,
999
1094
  @painter__.font,
1000
1095
  @hsbColor__,
1001
1096
  @colorMaxes__,
1002
1097
  @angleScale__,
1003
1098
  @rectMode__,
1004
- @ellipseMode__ = @styleStack__.pop
1099
+ @ellipseMode__,
1100
+ @imageMode__ = @styleStack__.pop
1005
1101
  nil
1006
1102
  end
1007
1103
 
@@ -1009,9 +1105,13 @@ module RubySketch
1009
1105
  #
1010
1106
  # @return [nil] nil
1011
1107
  #
1012
- def push ()
1108
+ def push (&block)
1013
1109
  pushMatrix
1014
1110
  pushStyle
1111
+ if block
1112
+ block.call
1113
+ pop
1114
+ end
1015
1115
  end
1016
1116
 
1017
1117
  # Restore styles and transformations from stack.
@@ -1027,24 +1127,52 @@ module RubySketch
1027
1127
  #
1028
1128
  # @overload noise(x)
1029
1129
  # @overload noise(x, y)
1130
+ # @overload noise(x, y, z)
1030
1131
  #
1031
1132
  # @param x [Numeric] horizontal point in noise space
1032
1133
  # @param y [Numeric] vertical point in noise space
1134
+ # @param z [Numeric] depth point in noise space
1033
1135
  #
1034
1136
  # @return [Numeric] noise value (0.0..1.0)
1035
1137
  #
1036
- def noise (x, y = 0)
1037
- Rays.perlin(x, y) / 2.0 + 1.0
1138
+ def noise (x, y = 0, z = 0)
1139
+ Rays.perlin(x, y, z) / 2.0 + 0.5
1038
1140
  end
1039
1141
 
1040
1142
  # Loads image.
1041
1143
  #
1042
- # @param filename [String] file name to load image
1144
+ # @param filename [String] file name to load image
1145
+ # @param extension [String] type of image to load (ex. 'png')
1146
+ #
1147
+ # @return [Image] loaded image object
1043
1148
  #
1044
- def loadImage (filename)
1149
+ def loadImage (filename, extension = nil)
1150
+ filename = getImage__ filename, extension if filename =~ %r|^https?://|
1045
1151
  Image.new Rays::Image.load filename
1046
1152
  end
1047
1153
 
1154
+ # @private
1155
+ private def getImage__ (uri, ext)
1156
+ ext ||= File.extname uri
1157
+ raise "unsupported image type -- #{ext}" unless ext =~ /^\.?(png)$/i
1158
+
1159
+ tmpdir = Pathname(Dir.tmpdir) + Digest::SHA1.hexdigest(self.class.name)
1160
+ path = tmpdir + Digest::SHA1.hexdigest(uri)
1161
+ path = path.sub_ext ext
1162
+
1163
+ unless path.file?
1164
+ URI.open uri do |input|
1165
+ tmpdir.mkdir unless tmpdir.directory?
1166
+ path.open('w') do |output|
1167
+ while buf = input.read(2 ** 16)
1168
+ output.write buf
1169
+ end
1170
+ end
1171
+ end
1172
+ end
1173
+ path.to_s
1174
+ end
1175
+
1048
1176
  end# Processing
1049
1177
 
1050
1178
 
@@ -1052,8 +1180,7 @@ module RubySketch
1052
1180
  #
1053
1181
  class Processing::Image
1054
1182
 
1055
- # Initialize image.
1056
- #
1183
+ # @private
1057
1184
  def initialize (image)
1058
1185
  @image = image
1059
1186
  end
@@ -1074,6 +1201,44 @@ module RubySketch
1074
1201
  @image.height
1075
1202
  end
1076
1203
 
1204
+ # Resizes image.
1205
+ #
1206
+ # @param width [Numeric] width for resized image
1207
+ # @param height [Numeric] height for resized image
1208
+ #
1209
+ # @return [nil] nil
1210
+ #
1211
+ def resize (width, height)
1212
+ @image = Rays::Image.new(width, height).paint do |painter|
1213
+ painter.image @image, 0, 0, width, height
1214
+ end
1215
+ nil
1216
+ end
1217
+
1218
+ # Copies image.
1219
+ #
1220
+ # @overload copy(sx, sy, sw, sh, dx, dy, dw, dh)
1221
+ # @overload copy(img, sx, sy, sw, sh, dx, dy, dw, dh)
1222
+ #
1223
+ # @param img [Image] image for copy source
1224
+ # @param sx [Numrtic] x position of source region
1225
+ # @param sy [Numrtic] y position of source region
1226
+ # @param sw [Numrtic] width of source region
1227
+ # @param sh [Numrtic] height of source region
1228
+ # @param dx [Numrtic] x position of destination region
1229
+ # @param dy [Numrtic] y position of destination region
1230
+ # @param dw [Numrtic] width of destination region
1231
+ # @param dh [Numrtic] height of destination region
1232
+ #
1233
+ # @return [nil] nil
1234
+ #
1235
+ def copy (img = nil, sx, sy, sw, sh, dx, dy, dw, dh)
1236
+ img ||= self
1237
+ @image.paint do |painter|
1238
+ painter.image img.to_internal__, sx, sy, sw, sh, dx, dy, dw, dh
1239
+ end
1240
+ end
1241
+
1077
1242
  # Saves image to file.
1078
1243
  #
1079
1244
  # @param filename [String] file name to save image
@@ -1083,7 +1248,7 @@ module RubySketch
1083
1248
  end
1084
1249
 
1085
1250
  # @private
1086
- def internal ()
1251
+ def to_internal__ ()
1087
1252
  @image
1088
1253
  end
1089
1254
 
@@ -1094,10 +1259,7 @@ module RubySketch
1094
1259
  #
1095
1260
  class Processing::Font
1096
1261
 
1097
- # Initialize font.
1098
- #
1099
1262
  # @private
1100
- #
1101
1263
  def initialize (font)
1102
1264
  @font = font
1103
1265
  end
@@ -1143,13 +1305,7 @@ module RubySketch
1143
1305
  #
1144
1306
  attr_reader :h
1145
1307
 
1146
- # Initialize bouding box.
1147
- #
1148
- # @param x [Numeric] horizontal position
1149
- # @param y [Numeric] vertical position
1150
- # @param w [Numeric] width of bounding box
1151
- # @param h [Numeric] height of bounding box
1152
- #
1308
+ # @private
1153
1309
  def initialize (x, y, w, h)
1154
1310
  @x, @y, @w, @h = x, y, w, h
1155
1311
  end
@@ -17,9 +17,7 @@ module RubySketch
17
17
 
18
18
  reset_canvas 1, 1
19
19
 
20
- super *args, size: [width, height] do |_|
21
- start &block if block
22
- end
20
+ super *args, size: [width, height], &block
23
21
  end
24
22
 
25
23
  def start (&block)
@@ -43,8 +41,8 @@ module RubySketch
43
41
  end
44
42
 
45
43
  def on_draw (e)
46
- @canvas_painter.paint do |painter|
47
- call_block @draw, e, painter
44
+ @canvas_painter.paint do |_|
45
+ call_block @draw, e
48
46
  end
49
47
  e.painter.image @canvas
50
48
  end
@@ -80,7 +78,7 @@ module RubySketch
80
78
  old_canvas = @canvas
81
79
  old_painter = @canvas_painter
82
80
 
83
- cs = old_canvas&.color_space || Rays::ColorSpace::RGBA
81
+ cs = old_canvas&.color_space || Rays::RGBA
84
82
  @canvas = Rays::Image.new width, height, cs, painter.pixel_density
85
83
  @canvas_painter = @canvas.painter
86
84
 
@@ -94,6 +92,9 @@ module RubySketch
94
92
  to.fill = from.fill
95
93
  to.stroke = from.stroke
96
94
  to.stroke_width = from.stroke_width
95
+ to.stroke_cap = from.stroke_cap
96
+ to.stroke_join = from.stroke_join
97
+ to.miter_limit = from.miter_limit
97
98
  to.font = from.font
98
99
  end
99
100
 
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.2.1
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - xordog
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-26 00:00:00.000000000 Z
11
+ date: 2020-04-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: yard
@@ -103,6 +103,7 @@ extra_rdoc_files: []
103
103
  files:
104
104
  - ".gitignore"
105
105
  - ".yardopts"
106
+ - ChangeLog.md
106
107
  - LICENSE
107
108
  - README.md
108
109
  - Rakefile
@@ -111,14 +112,12 @@ files:
111
112
  - examples/glsl.rb
112
113
  - examples/hello.rb
113
114
  - examples/image.rb
114
- - examples/rubysketch.png
115
115
  - examples/shapes.rb
116
116
  - lib/rubysketch-processing.rb
117
117
  - lib/rubysketch.rb
118
118
  - lib/rubysketch/glsl.rb
119
119
  - lib/rubysketch/module.rb
120
120
  - lib/rubysketch/processing.rb
121
- - lib/rubysketch/starter.rb
122
121
  - lib/rubysketch/window.rb
123
122
  - rubysketch.gemspec
124
123
  homepage: https://github.com/xord/rubysketch
Binary file
@@ -1,67 +0,0 @@
1
- module RubySketch
2
-
3
-
4
- extend module Functions
5
-
6
- def start (context, start_at_exit: false, &block)
7
- window = Window.new do
8
- context.instance_eval &block if block
9
- end
10
-
11
- context.on_start__ window
12
-
13
- start = proc do
14
- Reflex.start {window.show}
15
- end
16
-
17
- if start_at_exit
18
- at_exit {start.call unless $!}
19
- else
20
- start.call
21
- end
22
-
23
- window
24
- end
25
-
26
- private
27
-
28
- def start_on_object_at_exit (object, context)
29
- klass = context.class
30
- methods = klass.instance_methods(false)
31
- .reject {|name| name =~ /__$/}
32
- consts = klass.constants
33
- .reject {|name| name =~ /__$/}
34
- .each_with_object({}) {|name, h| h[name] = klass.const_get name}
35
-
36
- object.class.class_eval do
37
- methods.each do |name|
38
- define_method name do |*args, &block|
39
- context.__send__ name, *args, &block
40
- end
41
- end
42
- consts.each do |(name, value)|
43
- const_set name, value
44
- end
45
- end
46
-
47
- window = start context, start_at_exit: true
48
-
49
- window.canvas_painter.__send__ :begin_paint
50
- at_exit {window.canvas_painter.__send__ :end_paint}
51
- end
52
-
53
- self
54
-
55
- end# Functions
56
-
57
-
58
- module Starter
59
-
60
- def start (*args, &block)
61
- RubySketch.start self.new(*args), start_at_exit: true, &block
62
- end
63
-
64
- end# Starter
65
-
66
-
67
- end# RubySketch