propane 3.3.1-java → 3.6.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (157) hide show
  1. checksums.yaml +4 -4
  2. data/.mvn/extensions.xml +1 -2
  3. data/.mvn/wrapper/MavenWrapperDownloader.java +117 -0
  4. data/.mvn/wrapper/maven-wrapper.properties +2 -3
  5. data/.travis.yml +9 -0
  6. data/CHANGELOG.md +17 -5
  7. data/Gemfile +2 -0
  8. data/README.md +17 -8
  9. data/Rakefile +16 -30
  10. data/bin/propane +3 -1
  11. data/lib/propane.rb +6 -4
  12. data/lib/propane/app.rb +20 -10
  13. data/lib/propane/creators/sketch_class.rb +7 -1
  14. data/lib/propane/creators/sketch_factory.rb +4 -2
  15. data/lib/propane/creators/sketch_writer.rb +1 -0
  16. data/lib/propane/helper_methods.rb +23 -24
  17. data/lib/propane/helpers/numeric.rb +2 -0
  18. data/lib/propane/helpers/version_error.rb +1 -0
  19. data/lib/propane/library.rb +5 -1
  20. data/lib/propane/library_loader.rb +2 -0
  21. data/lib/propane/native_folder.rb +21 -15
  22. data/lib/propane/native_loader.rb +3 -0
  23. data/lib/propane/runner.rb +14 -6
  24. data/lib/propane/version.rb +2 -1
  25. data/library/boids/boids.rb +21 -11
  26. data/library/color_group/color_group.rb +28 -0
  27. data/library/control_panel/control_panel.rb +8 -5
  28. data/library/dxf/dxf.rb +6 -0
  29. data/library/file_chooser/chooser.rb +10 -9
  30. data/library/file_chooser/file_chooser.rb +10 -9
  31. data/library/library_proxy/library_proxy.rb +2 -0
  32. data/library/net/net.rb +7 -0
  33. data/library/simplex_noise/simplex_noise.rb +2 -0
  34. data/library/slider/slider.rb +23 -22
  35. data/library/vector_utils/vector_utils.rb +4 -0
  36. data/library/video_event/video_event.rb +4 -1
  37. data/mvnw +127 -51
  38. data/mvnw.cmd +182 -145
  39. data/pom.rb +53 -50
  40. data/pom.xml +17 -8
  41. data/propane.gemspec +13 -11
  42. data/src/main/java/monkstone/ColorUtil.java +13 -1
  43. data/src/main/java/monkstone/MathToolModule.java +253 -203
  44. data/src/main/java/monkstone/PropaneLibrary.java +2 -2
  45. data/src/main/java/monkstone/fastmath/Deglut.java +1 -1
  46. data/src/main/java/monkstone/filechooser/Chooser.java +2 -1
  47. data/src/main/java/monkstone/noise/SimplexNoise.java +2 -2
  48. data/src/main/java/monkstone/slider/CustomHorizontalSlider.java +1 -1
  49. data/src/main/java/monkstone/slider/CustomVerticalSlider.java +1 -1
  50. data/src/main/java/monkstone/slider/SimpleHorizontalSlider.java +1 -1
  51. data/src/main/java/monkstone/slider/SimpleVerticalSlider.java +1 -1
  52. data/src/main/java/monkstone/slider/SliderBar.java +1 -1
  53. data/src/main/java/monkstone/slider/SliderGroup.java +1 -1
  54. data/src/main/java/monkstone/slider/WheelHandler.java +7 -6
  55. data/src/main/java/monkstone/vecmath/package-info.java +1 -1
  56. data/src/main/java/monkstone/vecmath/vec2/Vec2.java +2 -2
  57. data/src/main/java/monkstone/vecmath/vec3/Vec3.java +1 -1
  58. data/src/main/java/monkstone/videoevent/CaptureEvent.java +27 -0
  59. data/src/main/java/monkstone/videoevent/{VideoInterface.java → MovieEvent.java} +11 -27
  60. data/src/main/java/monkstone/videoevent/package-info.java +1 -1
  61. data/src/main/java/processing/awt/PGraphicsJava2D.java +2164 -1661
  62. data/src/main/java/processing/awt/PImageAWT.java +377 -0
  63. data/src/main/java/processing/awt/PShapeJava2D.java +280 -268
  64. data/src/main/java/processing/awt/PSurfaceAWT.java +942 -829
  65. data/src/main/java/processing/awt/ShimAWT.java +581 -0
  66. data/src/main/java/processing/core/PApplet.java +831 -824
  67. data/src/main/java/processing/core/PConstants.java +477 -447
  68. data/src/main/java/processing/core/PFont.java +914 -880
  69. data/src/main/java/processing/core/PGraphics.java +229 -213
  70. data/src/main/java/processing/core/PImage.java +620 -318
  71. data/src/main/java/processing/core/PMatrix.java +172 -159
  72. data/src/main/java/processing/core/PMatrix2D.java +478 -409
  73. data/src/main/java/processing/core/PMatrix3D.java +762 -735
  74. data/src/main/java/processing/core/PShape.java +2888 -2652
  75. data/src/main/java/processing/core/PShapeOBJ.java +436 -415
  76. data/src/main/java/processing/core/PShapeSVG.java +1702 -1479
  77. data/src/main/java/processing/core/PStyle.java +40 -37
  78. data/src/main/java/processing/core/PSurface.java +139 -97
  79. data/src/main/java/processing/core/PSurfaceNone.java +296 -208
  80. data/src/main/java/processing/core/PVector.java +997 -965
  81. data/src/main/java/processing/core/ThinkDifferent.java +12 -17
  82. data/src/main/java/processing/data/DoubleDict.java +756 -710
  83. data/src/main/java/processing/data/DoubleList.java +749 -696
  84. data/src/main/java/processing/data/FloatDict.java +748 -702
  85. data/src/main/java/processing/data/FloatList.java +751 -697
  86. data/src/main/java/processing/data/IntDict.java +720 -673
  87. data/src/main/java/processing/data/IntList.java +699 -633
  88. data/src/main/java/processing/data/JSONArray.java +931 -873
  89. data/src/main/java/processing/data/JSONObject.java +1262 -1165
  90. data/src/main/java/processing/data/JSONTokener.java +351 -341
  91. data/src/main/java/processing/data/LongDict.java +710 -663
  92. data/src/main/java/processing/data/LongList.java +701 -635
  93. data/src/main/java/processing/data/Sort.java +37 -41
  94. data/src/main/java/processing/data/StringDict.java +525 -486
  95. data/src/main/java/processing/data/StringList.java +626 -580
  96. data/src/main/java/processing/data/Table.java +3690 -3510
  97. data/src/main/java/processing/data/TableRow.java +182 -183
  98. data/src/main/java/processing/data/XML.java +957 -883
  99. data/src/main/java/processing/dxf/RawDXF.java +404 -0
  100. data/src/main/java/processing/event/Event.java +87 -66
  101. data/src/main/java/processing/event/KeyEvent.java +48 -41
  102. data/src/main/java/processing/event/MouseEvent.java +88 -113
  103. data/src/main/java/processing/event/TouchEvent.java +10 -6
  104. data/src/main/java/processing/javafx/PGraphicsFX2D.java +20 -345
  105. data/src/main/java/processing/javafx/PSurfaceFX.java +149 -121
  106. data/src/main/java/processing/net/Client.java +744 -0
  107. data/src/main/java/processing/net/Server.java +388 -0
  108. data/src/main/java/processing/opengl/FontTexture.java +289 -270
  109. data/src/main/java/processing/opengl/FrameBuffer.java +386 -364
  110. data/src/main/java/processing/opengl/LinePath.java +547 -500
  111. data/src/main/java/processing/opengl/LineStroker.java +588 -581
  112. data/src/main/java/processing/opengl/PGL.java +3047 -2914
  113. data/src/main/java/processing/opengl/PGraphics2D.java +408 -315
  114. data/src/main/java/processing/opengl/PGraphics3D.java +107 -72
  115. data/src/main/java/processing/opengl/PGraphicsOpenGL.java +12378 -12075
  116. data/src/main/java/processing/opengl/PJOGL.java +1753 -1670
  117. data/src/main/java/processing/opengl/PShader.java +1266 -1257
  118. data/src/main/java/processing/opengl/PShapeOpenGL.java +4678 -4580
  119. data/src/main/java/processing/opengl/PSurfaceJOGL.java +1114 -1027
  120. data/src/main/java/processing/opengl/Texture.java +1492 -1401
  121. data/src/main/java/processing/opengl/VertexBuffer.java +57 -55
  122. data/test/create_test.rb +21 -20
  123. data/test/deglut_spec_test.rb +4 -2
  124. data/test/helper_methods_test.rb +49 -20
  125. data/test/math_tool_test.rb +39 -32
  126. data/test/native_folder.rb +47 -0
  127. data/test/respond_to_test.rb +3 -2
  128. data/test/sketches/key_event.rb +2 -2
  129. data/test/sketches/library/my_library/my_library.rb +3 -0
  130. data/test/test_helper.rb +2 -0
  131. data/test/vecmath_spec_test.rb +35 -22
  132. data/vendors/Rakefile +33 -62
  133. metadata +54 -45
  134. data/src/main/java/processing/core/util/image/ImageLoadFacade.java +0 -161
  135. data/src/main/java/processing/core/util/image/ImageSaveFacade.java +0 -169
  136. data/src/main/java/processing/core/util/image/constants/TifConstants.java +0 -45
  137. data/src/main/java/processing/core/util/image/load/AwtImageLoadStrategy.java +0 -80
  138. data/src/main/java/processing/core/util/image/load/Base64StringImageLoadStrategy.java +0 -73
  139. data/src/main/java/processing/core/util/image/load/FallbackImageLoadStrategy.java +0 -70
  140. data/src/main/java/processing/core/util/image/load/ImageIoImageLoadStrategy.java +0 -132
  141. data/src/main/java/processing/core/util/image/load/ImageLoadStrategy.java +0 -48
  142. data/src/main/java/processing/core/util/image/load/ImageLoadUtil.java +0 -45
  143. data/src/main/java/processing/core/util/image/load/TgaImageLoadStrategy.java +0 -255
  144. data/src/main/java/processing/core/util/image/load/TiffImageLoadStrategy.java +0 -98
  145. data/src/main/java/processing/core/util/image/save/ImageSaveStrategy.java +0 -49
  146. data/src/main/java/processing/core/util/image/save/ImageSaveUtil.java +0 -48
  147. data/src/main/java/processing/core/util/image/save/ImageWriterImageSaveStrategy.java +0 -179
  148. data/src/main/java/processing/core/util/image/save/SaveImageException.java +0 -41
  149. data/src/main/java/processing/core/util/image/save/TgaImageSaveStrategy.java +0 -198
  150. data/src/main/java/processing/core/util/image/save/TiffImageSaveStrategy.java +0 -91
  151. data/src/main/java/processing/core/util/image/save/TiffNakedFilenameImageSaveStrategy.java +0 -57
  152. data/src/main/java/processing/core/util/io/InputFactory.java +0 -285
  153. data/src/main/java/processing/core/util/io/PathUtil.java +0 -109
  154. data/src/main/java/processing/opengl/shaders/LightVert-brcm.glsl +0 -154
  155. data/src/main/java/processing/opengl/shaders/LightVert-vc4.glsl +0 -154
  156. data/src/main/java/processing/opengl/shaders/TexLightVert-brcm.glsl +0 -160
  157. data/src/main/java/processing/opengl/shaders/TexLightVert-vc4.glsl +0 -160
@@ -3,7 +3,7 @@
3
3
  /*
4
4
  Part of the Processing project - http://processing.org
5
5
 
6
- Copyright (c) 2012-15 The Processing Foundation
6
+ Copyright (c) 2012-20 The Processing Foundation
7
7
  Copyright (c) 2004-12 Ben Fry and Casey Reas
8
8
  Copyright (c) 2001-04 Massachusetts Institute of Technology
9
9
 
@@ -24,40 +24,6 @@
24
24
 
25
25
  package processing.core;
26
26
 
27
- // dummy object for backwards compatibility, plus the select methods
28
- import java.awt.Frame;
29
-
30
- // before calling settings() to get displayWidth/Height
31
- import java.awt.DisplayMode;
32
- // handleSettings() and displayDensity()
33
- import java.awt.GraphicsDevice;
34
- import java.awt.GraphicsEnvironment;
35
- // used to present the fullScreen() warning about Spaces on OS X
36
- import javax.swing.JOptionPane;
37
-
38
- // inside runSketch() to warn users about headless
39
- import java.awt.HeadlessException;
40
- import java.awt.Toolkit;
41
-
42
- // used by selectInput(), selectOutput(), selectFolder()
43
- import java.awt.EventQueue;
44
- import java.awt.FileDialog;
45
- import javax.swing.JFileChooser;
46
-
47
- // set the look and feel, if specified
48
- import javax.swing.UIManager;
49
-
50
- // used by link()
51
- import java.awt.Desktop;
52
-
53
- // used by desktopFile() method
54
- import javax.swing.filechooser.FileSystemView;
55
-
56
- // loadXML() error handling
57
- import javax.xml.parsers.ParserConfigurationException;
58
-
59
- import org.xml.sax.SAXException;
60
-
61
27
  import java.io.*;
62
28
  import java.lang.reflect.*;
63
29
  import java.net.*;
@@ -72,9 +38,13 @@ import java.util.concurrent.ThreadFactory;
72
38
  import java.util.regex.*;
73
39
  import java.util.zip.*;
74
40
 
75
- import processing.core.util.image.ImageLoadFacade;
76
- import processing.core.util.io.InputFactory;
77
- import processing.core.util.io.PathUtil;
41
+ // loadXML() error handling
42
+ import javax.xml.parsers.ParserConfigurationException;
43
+ import org.xml.sax.SAXException;
44
+
45
+ // TODO have this removed by 4.0 final
46
+ import processing.awt.ShimAWT;
47
+
78
48
  import processing.data.*;
79
49
  import processing.event.*;
80
50
  import processing.opengl.*;
@@ -117,45 +87,44 @@ import processing.opengl.*;
117
87
  */
118
88
  public class PApplet implements PConstants {
119
89
  /** Full name of the Java version (i.e. 1.5.0_11). */
120
- static public final String javaVersionName =
90
+ static public final String JAVA_VERSION_NAME =
121
91
  System.getProperty("java.version");
122
92
 
123
- static public final int javaPlatform;
93
+ static public final int JAVA_PLATFORM;
124
94
  static {
125
- String version = javaVersionName;
126
- if (javaVersionName.startsWith("1.")) {
95
+ String version = JAVA_VERSION_NAME;
96
+ if (JAVA_VERSION_NAME.startsWith("1.")) {
127
97
  version = version.substring(2);
128
- javaPlatform = parseInt(version.substring(0, version.indexOf('.')));
98
+ JAVA_PLATFORM = parseInt(version.substring(0, version.indexOf('.')));
129
99
  } else {
130
100
  // Remove -xxx and .yyy from java.version (@see JEP-223)
131
- javaPlatform = parseInt(version.replaceAll("-.*","").replaceAll("\\..*",""));
101
+ JAVA_PLATFORM = parseInt(version.replaceAll("-.*","").replaceAll("\\..*",""));
132
102
  }
133
103
  }
134
104
 
135
105
  /**
136
- * Do not use; javaPlatform or javaVersionName are better options.
137
- * For instance, javaPlatform is useful when you need a number for
138
- * comparison, i.e. "if (javaPlatform >= 9)".
106
+ * Do not use; JAVA_PLATFORM or JAVA_VERSION_NAME are better options.
107
+ * For instance, JAVA_PLATFORM is useful when you need a number for
108
+ * comparison, i.e. "if (JAVA_PLATFORM >= 9)".
139
109
  */
140
110
  @Deprecated
141
- public static final float javaVersion = 1 + javaPlatform / 10f;
111
+ public static final float JAVA_VERSION = 1 + JAVA_PLATFORM / 10f;
142
112
 
143
113
  /**
144
- * Current platform in use, one of the
145
- * PConstants WINDOWS, MACOSX, MACOS9, LINUX or OTHER.
114
+ * Current platform in use, one of the PConstants WINDOWS, MACOS, LINUX or OTHER.
146
115
  */
147
116
  static public int platform;
148
117
 
149
118
  static {
150
- String osname = System.getProperty("os.name");
119
+ final String name = System.getProperty("os.name");
151
120
 
152
- if (osname.indexOf("Mac") != -1) {
153
- platform = MACOSX;
121
+ if (name.contains("Mac")) {
122
+ platform = MACOS;
154
123
 
155
- } else if (osname.indexOf("Windows") != -1) {
124
+ } else if (name.contains("Windows")) {
156
125
  platform = WINDOWS;
157
126
 
158
- } else if (osname.equals("Linux")) { // true for the ibm vm
127
+ } else if (name.equals("Linux")) { // true for the ibm vm
159
128
  platform = LINUX;
160
129
 
161
130
  } else {
@@ -232,24 +201,6 @@ public class PApplet implements PConstants {
232
201
  static public final int DEFAULT_WIDTH = 100;
233
202
  static public final int DEFAULT_HEIGHT = 100;
234
203
 
235
- // /**
236
- // * Exception thrown when size() is called the first time.
237
- // * <p>
238
- // * This is used internally so that setup() is forced to run twice
239
- // * when the renderer is changed. This is the only way for us to handle
240
- // * invoking the new renderer while also in the midst of rendering.
241
- // */
242
- // static public class RendererChangeException extends RuntimeException { }
243
-
244
- /**
245
- * true if no size() command has been executed. This is used to wait until
246
- * a size has been set before placing in the window and showing it.
247
- */
248
- // public boolean defaultSize;
249
-
250
- // /** Storage for the current renderer size to avoid re-allocation. */
251
- // Dimension currentSize = new Dimension();
252
-
253
204
  /**
254
205
  * ( begin auto-generated from pixels.xml )
255
206
  *
@@ -276,6 +227,9 @@ public class PApplet implements PConstants {
276
227
  * @see PApplet#get(int, int, int, int)
277
228
  * @see PApplet#set(int, int, int)
278
229
  * @see PImage
230
+ * @see PApplet#pixelDensity(int)
231
+ * @see PApplet#pixelWidth
232
+ * @see PApplet#pixelHeight
279
233
  */
280
234
  public int[] pixels;
281
235
 
@@ -573,7 +527,7 @@ public class PApplet implements PConstants {
573
527
  *
574
528
  * The system variable <b>key</b> always contains the value of the most
575
529
  * recent key on the keyboard that was used (either pressed or released).
576
- * <br/> <br/>
530
+ *
577
531
  * For non-ASCII keys, use the <b>keyCode</b> variable. The keys included
578
532
  * in the ASCII specification (BACKSPACE, TAB, ENTER, RETURN, ESC, and
579
533
  * DELETE) do not require checking to see if they key is coded, and you
@@ -608,7 +562,7 @@ public class PApplet implements PConstants {
608
562
  * for these keys, it's first necessary to check and see if the key is
609
563
  * coded. This is done with the conditional "if (key == CODED)" as shown in
610
564
  * the example.
611
- * <br/> <br/>
565
+ *
612
566
  * The keys included in the ASCII specification (BACKSPACE, TAB, ENTER,
613
567
  * RETURN, ESC, and DELETE) do not require checking to see if they key is
614
568
  * coded, and you should simply use the <b>key</b> variable instead of
@@ -616,7 +570,7 @@ public class PApplet implements PConstants {
616
570
  * ENTER key is commonly used on PCs and Unix and the RETURN key is used
617
571
  * instead on Macintosh. Check for both ENTER and RETURN to make sure your
618
572
  * program will work for all platforms.
619
- * <br/> <br/>
573
+ *
620
574
  * For users familiar with Java, the values for UP and DOWN are simply
621
575
  * shorter versions of Java's KeyEvent.VK_UP and KeyEvent.VK_DOWN. Other
622
576
  * keyCode values can be found in the Java <a
@@ -746,6 +700,9 @@ public class PApplet implements PConstants {
746
700
  */
747
701
  protected boolean exitCalled;
748
702
 
703
+ // ok to be static because it's not possible to mix enabled/disabled
704
+ static protected boolean disableAWT;
705
+
749
706
  // messages to send if attached as an external vm
750
707
 
751
708
  /**
@@ -768,6 +725,9 @@ public class PApplet implements PConstants {
768
725
  /** Used by the PDE to suggest a display (set in prefs, passed on Run) */
769
726
  static public final String ARGS_DISPLAY = "--display";
770
727
 
728
+ /** Disable AWT so that LWJGL and others can run */
729
+ static public final String ARGS_DISABLE_AWT = "--disable-awt";
730
+
771
731
  // static public final String ARGS_SPAN_DISPLAYS = "--span";
772
732
 
773
733
  static public final String ARGS_BGCOLOR = "--bgcolor";
@@ -825,75 +785,11 @@ public class PApplet implements PConstants {
825
785
  }
826
786
 
827
787
 
828
- /**
829
- * A dummy frame to keep compatibility with 2.x code
830
- * and encourage users to update.
831
- */
832
- public Frame frame;
833
-
834
-
835
- // public Frame getFrame() {
836
- // return frame;
837
- // }
838
- //
839
- //
840
- // public void setFrame(Frame frame) {
841
- // this.frame = frame;
842
- // }
843
-
844
-
845
- // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
846
-
847
-
848
788
  // /**
849
- // * Applet initialization. This can do GUI work because the components have
850
- // * not been 'realized' yet: things aren't visible, displayed, etc.
789
+ // * A dummy frame to keep compatibility with 2.x code
790
+ // * and encourage users to update.
851
791
  // */
852
- // public void init() {
853
- //// println("init() called " + Integer.toHexString(hashCode()));
854
- // // using a local version here since the class variable is deprecated
855
- //// Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
856
- //// screenWidth = screen.width;
857
- //// screenHeight = screen.height;
858
- //
859
- // defaultSize = true;
860
- // finished = false; // just for clarity
861
- //
862
- // // this will be cleared by draw() if it is not overridden
863
- // looping = true;
864
- // redraw = true; // draw this guy at least once
865
- // firstMouse = true;
866
- //
867
- // // calculated dynamically on first call
868
- //// // Removed in 2.1.2, brought back for 2.1.3. Usually sketchPath is set
869
- //// // inside runSketch(), but if this sketch takes care of calls to init()
870
- //// // when PApplet.main() is not used (i.e. it's in a Java application).
871
- //// // THe path needs to be set here so that loadXxxx() functions work.
872
- //// if (sketchPath == null) {
873
- //// sketchPath = calcSketchPath();
874
- //// }
875
- //
876
- // // set during Surface.initFrame()
877
- //// // Figure out the available display width and height.
878
- //// // No major problem if this fails, we have to try again anyway in
879
- //// // handleDraw() on the first (== 0) frame.
880
- //// checkDisplaySize();
881
- //
882
- //// // Set the default size, until the user specifies otherwise
883
- //// int w = sketchWidth();
884
- //// int h = sketchHeight();
885
- //// defaultSize = (w == DEFAULT_WIDTH) && (h == DEFAULT_HEIGHT);
886
- ////
887
- //// g = makeGraphics(w, h, sketchRenderer(), null, true);
888
- //// // Fire component resize event
889
- //// setSize(w, h);
890
- //// setPreferredSize(new Dimension(w, h));
891
- ////
892
- //// width = g.width;
893
- //// height = g.height;
894
- //
895
- // surface.startThread();
896
- // }
792
+ // public Frame frame;
897
793
 
898
794
 
899
795
  // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
@@ -902,12 +798,11 @@ public class PApplet implements PConstants {
902
798
  boolean insideSettings;
903
799
 
904
800
  String renderer = JAVA2D;
905
- // int quality = 2;
906
801
  int smooth = 1; // default smoothing (whatever that means for the renderer)
907
802
 
908
803
  boolean fullScreen;
909
804
  int display = -1; // use default
910
- GraphicsDevice[] displayDevices;
805
+ // GraphicsDevice[] displayDevices;
911
806
  // Unlike the others above, needs to be public to support
912
807
  // the pixelWidth and pixelHeight fields.
913
808
  public int pixelDensity = 1;
@@ -949,31 +844,19 @@ public class PApplet implements PConstants {
949
844
  void handleSettings() {
950
845
  insideSettings = true;
951
846
 
952
- // Need the list of display devices to be queried already for usage below.
953
- // https://github.com/processing/processing/issues/3295
954
- // https://github.com/processing/processing/issues/3296
955
- // Not doing this from a static initializer because it may cause
956
- // PApplet to cache and the values to stick through subsequent runs.
957
- // Instead make it a runtime thing and a local variable.
958
- GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
959
- GraphicsDevice device = ge.getDefaultScreenDevice();
960
- displayDevices = ge.getScreenDevices();
961
-
962
- // Default or unparsed will be -1, spanning will be 0, actual displays will
963
- // be numbered from 1 because it's too weird to say "display 0" in prefs.
964
- if (display > 0 && display <= displayDevices.length) {
965
- device = displayDevices[display-1];
847
+ if (!disableAWT) {
848
+ displayWidth = ShimAWT.getDisplayWidth();
849
+ displayHeight = ShimAWT.getDisplayHeight();
850
+ } else {
851
+ // https://github.com/processing/processing4/issues/57
852
+ System.err.println("AWT disabled, displayWidth/displayHeight will be 0");
966
853
  }
967
- // Set displayWidth and displayHeight for people still using those.
968
- DisplayMode displayMode = device.getDisplayMode();
969
- displayWidth = displayMode.getWidth();
970
- displayHeight = displayMode.getHeight();
971
854
 
972
855
  // Here's where size(), fullScreen(), smooth(N) and noSmooth() might
973
856
  // be called, conjuring up the demons of various rendering configurations.
974
857
  settings();
975
858
 
976
- if (display == SPAN && platform == MACOSX) {
859
+ if (display == SPAN && platform == MACOS) {
977
860
  // Make sure "Displays have separate Spaces" is unchecked
978
861
  // in System Preferences > Mission Control
979
862
  Process p = exec("defaults", "read", "com.apple.spaces", "spans-displays");
@@ -981,7 +864,7 @@ public class PApplet implements PConstants {
981
864
  BufferedReader errReader = createReader(p.getErrorStream());
982
865
  StringBuilder stdout = new StringBuilder();
983
866
  StringBuilder stderr = new StringBuilder();
984
- String line = null;
867
+ String line;
985
868
  try {
986
869
  while ((line = outReader.readLine()) != null) {
987
870
  stdout.append(line);
@@ -996,24 +879,21 @@ public class PApplet implements PConstants {
996
879
  int resultCode = -1;
997
880
  try {
998
881
  resultCode = p.waitFor();
999
- } catch (InterruptedException e) { }
1000
-
1001
- String result = trim(stdout.toString());
1002
- if ("0".equals(result)) {
1003
- EventQueue.invokeLater(new Runnable() {
1004
- public void run() {
1005
- checkLookAndFeel();
1006
- final String msg =
1007
- "To use fullScreen(SPAN), first turn off “Displays have separate spaces”\n" +
1008
- "in System Preferences \u2192 Mission Control. Then log out and log back in.";
1009
- JOptionPane.showMessageDialog(null, msg, "Apple's Defaults Stink",
1010
- JOptionPane.WARNING_MESSAGE);
1011
- }
1012
- });
1013
- } else if (!"1".equals(result)) {
882
+ } catch (InterruptedException ignored) { }
883
+
884
+ if (resultCode == 1) {
1014
885
  System.err.println("Could not check the status of “Displays have separate spaces.”");
1015
886
  System.err.format("Received message '%s' and result code %d.%n", trim(stderr.toString()), resultCode);
1016
887
  }
888
+
889
+ String processOutput = trim(stdout.toString());
890
+ // It looks like on Catalina, the option may not be set, so resultCode
891
+ // will be 1 (an error, since the param doesn't exist. But "Displays
892
+ // have separate spaces" is on by default, so show the message.
893
+ if (resultCode == 1 || "0".equals(processOutput)) {
894
+ System.err.println("To use fullScreen(SPAN), first turn off “Displays have separate spaces”");
895
+ System.err.println("in System Preferences \u2192 Mission Control. Then log out and log back in.");
896
+ }
1017
897
  }
1018
898
 
1019
899
  insideSettings = false;
@@ -1056,17 +936,6 @@ public class PApplet implements PConstants {
1056
936
  }
1057
937
 
1058
938
 
1059
- // Named quality instead of smooth to avoid people trying to set (or get)
1060
- // the current smooth level this way. Also that smooth(number) isn't really
1061
- // public or well-known API. It's specific to the capabilities of the
1062
- // rendering surface, and somewhat independent of whether the sketch is
1063
- // smoothing at any given time. It's also a bit like getFill() would return
1064
- // true/false for whether fill was enabled, getFillColor() would return the
1065
- // color itself. Or at least that's what I can recall at the moment. [fry]
1066
- // public int sketchQuality() {
1067
- // //return 2;
1068
- // return quality;
1069
- // }
1070
939
  // smoothing 1 is default.. 0 is none.. 2,4,8 depend on renderer
1071
940
  final public int sketchSmooth() {
1072
941
  return smooth;
@@ -1074,20 +943,10 @@ public class PApplet implements PConstants {
1074
943
 
1075
944
 
1076
945
  final public boolean sketchFullScreen() {
1077
- //return false;
1078
946
  return fullScreen;
1079
947
  }
1080
948
 
1081
949
 
1082
- // // Could be named 'screen' instead of display since it's the people using
1083
- // // full screen who will be looking for it. On the other hand, screenX/Y/Z
1084
- // // makes things confusing, and if 'displayIndex' exists...
1085
- // public boolean sketchSpanDisplays() {
1086
- // //return false;
1087
- // return spanDisplays;
1088
- // }
1089
-
1090
-
1091
950
  // Numbered from 1, SPAN (0) means all displays, -1 means the default display
1092
951
  final public int sketchDisplay() {
1093
952
  return display;
@@ -1095,13 +954,11 @@ public class PApplet implements PConstants {
1095
954
 
1096
955
 
1097
956
  final public String sketchOutputPath() {
1098
- //return null;
1099
957
  return outputPath;
1100
958
  }
1101
959
 
1102
960
 
1103
961
  final public OutputStream sketchOutputStream() {
1104
- //return null;
1105
962
  return outputStream;
1106
963
  }
1107
964
 
@@ -1136,8 +993,16 @@ public class PApplet implements PConstants {
1136
993
  if (display != SPAN && (fullScreen || present)) {
1137
994
  return displayDensity(display);
1138
995
  }
996
+
997
+ int displayCount = 0;
998
+ if (!disableAWT) {
999
+ displayCount = ShimAWT.getDisplayCount();
1000
+ } else {
1001
+ // https://github.com/processing/processing4/issues/57
1002
+ System.err.println("display count needs to be implemented for non-AWT");
1003
+ }
1139
1004
  // walk through all displays, use 2 if any display is 2
1140
- for (int i = 0; i < displayDevices.length; i++) {
1005
+ for (int i = 0; i < displayCount; i++) {
1141
1006
  if (displayDensity(i+1) == 2) {
1142
1007
  return 2;
1143
1008
  }
@@ -1146,70 +1011,37 @@ public class PApplet implements PConstants {
1146
1011
  return 1;
1147
1012
  }
1148
1013
 
1014
+
1149
1015
  /**
1150
1016
  * @param display the display number to check
1017
+ * (1-indexed to match the Preferences dialog box)
1151
1018
  */
1152
1019
  public int displayDensity(int display) {
1153
- if (PApplet.platform == PConstants.MACOSX) {
1154
- // This should probably be reset each time there's a display change.
1155
- // A 5-minute search didn't turn up any such event in the Java 7 API.
1156
- // Also, should we use the Toolkit associated with the editor window?
1157
- final String javaVendor = System.getProperty("java.vendor");
1158
- if (javaVendor.contains("Oracle")) {
1159
- GraphicsDevice device;
1160
- GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
1161
-
1162
- if (display == -1) {
1163
- device = env.getDefaultScreenDevice();
1164
-
1165
- } else if (display == SPAN) {
1166
- throw new RuntimeException("displayDensity() only works with specific display numbers");
1167
-
1168
- } else {
1169
- GraphicsDevice[] devices = env.getScreenDevices();
1170
- if (display > 0 && display <= devices.length) {
1171
- device = devices[display - 1];
1172
- } else {
1173
- if (devices.length == 1) {
1174
- System.err.println("Only one display is currently known, use displayDensity(1).");
1175
- } else {
1176
- System.err.format("Your displays are numbered %d through %d, " +
1177
- "pass one of those numbers to displayDensity()%n", 1, devices.length);
1178
- }
1179
- throw new RuntimeException("Display " + display + " does not exist.");
1180
- }
1181
- }
1182
-
1183
- try {
1184
- Field field = device.getClass().getDeclaredField("scale");
1185
- if (field != null) {
1186
- field.setAccessible(true);
1187
- Object scale = field.get(device);
1188
-
1189
- if (scale instanceof Integer && ((Integer)scale).intValue() == 2) {
1190
- return 2;
1191
- }
1192
- }
1193
- } catch (Exception ignore) { }
1194
- }
1195
- } else if (PApplet.platform == PConstants.WINDOWS ||
1196
- PApplet.platform == PConstants.LINUX) {
1197
- if (suggestedDensity == -1) {
1198
- // TODO: detect and return DPI scaling using JNA; Windows has
1199
- // a system-wide value, not sure how it works on Linux
1200
- return 1;
1201
- } else if (suggestedDensity == 1 || suggestedDensity == 2) {
1202
- return suggestedDensity;
1203
- }
1020
+ if (!disableAWT) {
1021
+ return ShimAWT.getDisplayDensity(display);
1204
1022
  }
1205
- return 1;
1023
+ /*
1024
+ if (display > 0 && display <= displayDevices.length) {
1025
+ GraphicsConfiguration graphicsConfig =
1026
+ displayDevices[display - 1].getDefaultConfiguration();
1027
+ AffineTransform tx = graphicsConfig.getDefaultTransform();
1028
+ return (int) Math.round(tx.getScaleX());
1029
+ }
1030
+
1031
+ System.err.println("Display " + display + " does not exist, " +
1032
+ "returning 1 for displayDensity(" + display + ")");
1033
+ */
1034
+ // https://github.com/processing/processing4/issues/57
1035
+ System.err.println("displayDensity() unavailable because AWT is disabled");
1036
+ return 1; // not the end of the world, so don't throw a RuntimeException
1206
1037
  }
1207
1038
 
1208
1039
 
1209
1040
  /**
1210
1041
  * @webref environment
1211
1042
  * @param density 1 or 2
1212
- *
1043
+ * @see PApplet#pixelWidth
1044
+ * @see PApplet#pixelHeight
1213
1045
  */
1214
1046
  public void pixelDensity(int density) {
1215
1047
  //println(density + " " + this.pixelDensity);
@@ -1420,6 +1252,7 @@ public class PApplet implements PConstants {
1420
1252
  Object[] emptyArgs = new Object[] { };
1421
1253
 
1422
1254
 
1255
+ @SuppressWarnings("unused")
1423
1256
  void handle() {
1424
1257
  handle(emptyArgs);
1425
1258
  }
@@ -1429,7 +1262,7 @@ public class PApplet implements PConstants {
1429
1262
  for (int i = 0; i < count; i++) {
1430
1263
  try {
1431
1264
  methods[i].invoke(objects[i], args);
1432
- } catch (Exception e) {
1265
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
1433
1266
  // check for wrapped exception, get root exception
1434
1267
  Throwable t;
1435
1268
  if (e instanceof InvocationTargetException) {
@@ -1566,13 +1399,13 @@ public class PApplet implements PConstants {
1566
1399
  die("There is no public " + name + "() method in the class " +
1567
1400
  o.getClass().getName());
1568
1401
 
1569
- } catch (Exception e) {
1402
+ } catch (SecurityException e) {
1570
1403
  die("Could not register " + name + " + () for " + o, e);
1571
1404
  }
1572
1405
  }
1573
1406
 
1574
1407
 
1575
- private void registerWithArgs(String name, Object o, Class<?> cargs[]) {
1408
+ private void registerWithArgs(String name, Object o, Class<?>[] cargs) {
1576
1409
  Class<?> c = o.getClass();
1577
1410
  try {
1578
1411
  Method method = c.getMethod(name, cargs);
@@ -1588,7 +1421,7 @@ public class PApplet implements PConstants {
1588
1421
  die("There is no public " + name + "() method in the class " +
1589
1422
  o.getClass().getName());
1590
1423
 
1591
- } catch (Exception e) {
1424
+ } catch (SecurityException e) {
1592
1425
  die("Could not register " + name + " + () for " + o, e);
1593
1426
  }
1594
1427
  }
@@ -1606,8 +1439,6 @@ public class PApplet implements PConstants {
1606
1439
  die("No registered methods with the name " + name + "() were found.");
1607
1440
  }
1608
1441
  try {
1609
- // Method method = o.getClass().getMethod(name, new Class[] {});
1610
- // meth.remove(o, method);
1611
1442
  meth.remove(target);
1612
1443
  } catch (Exception e) {
1613
1444
  die("Could not unregister " + name + "() for " + target, e);
@@ -1615,18 +1446,7 @@ public class PApplet implements PConstants {
1615
1446
  }
1616
1447
  }
1617
1448
 
1618
-
1619
- protected void handleMethods(String methodName) {
1620
- synchronized (registerLock) {
1621
- RegisteredMethods meth = registerMap.get(methodName);
1622
- if (meth != null) {
1623
- meth.handle();
1624
- }
1625
- }
1626
- }
1627
-
1628
-
1629
- protected void handleMethods(String methodName, Object[] args) {
1449
+ protected void handleMethods(String methodName, Object...args) {
1630
1450
  synchronized (registerLock) {
1631
1451
  RegisteredMethods meth = registerMap.get(methodName);
1632
1452
  if (meth != null) {
@@ -1945,8 +1765,8 @@ public class PApplet implements PConstants {
1945
1765
  * are needed.
1946
1766
  *
1947
1767
  * The <b>size()</b> function can only be used once inside a sketch, and
1948
- * cannot be used for resizing.<br/>
1949
- * <br/> <b>renderer</b> parameter selects which rendering engine to use.
1768
+ * cannot be used for resizing.
1769
+ * <b>renderer</b> parameter selects which rendering engine to use.
1950
1770
  * For example, if you will be drawing 3D shapes, use <b>P3D</b>, if you
1951
1771
  * want to export images from a program as a PDF file use <b>PDF</b>. A
1952
1772
  * brief description of the three primary renderers follows:
@@ -1967,7 +1787,7 @@ public class PApplet implements PConstants {
1967
1787
  * <b>strokeJoin()</b>, which can lead to ugly results when using
1968
1788
  * <b>strokeWeight()</b>. (<a
1969
1789
  * href="http://code.google.com/p/processing/issues/detail?id=123">Issue
1970
- * 123</a>)
1790
+ * 123</a>)
1971
1791
  *
1972
1792
  * The maximum width and height is limited by your operating system, and is
1973
1793
  * usually the width and height of your actual screen. On some machines it
@@ -1999,6 +1819,9 @@ public class PApplet implements PConstants {
1999
1819
  * @param height height of the display window in units of pixels
2000
1820
  * @see PApplet#width
2001
1821
  * @see PApplet#height
1822
+ * @see PApplet#setup()
1823
+ * @see PApplet#settings()
1824
+ * @see PApplet#fullScreen()
2002
1825
  */
2003
1826
  public void size(int width, int height) {
2004
1827
  // Check to make sure the width/height have actually changed. It's ok to
@@ -2132,8 +1955,8 @@ public class PApplet implements PConstants {
2132
1955
  *
2133
1956
  * It's important to call any drawing functions between <b>beginDraw()</b>
2134
1957
  * and <b>endDraw()</b> statements. This is also true for any functions
2135
- * that affect drawing, such as <b>smooth()</b> or <b>colorMode()</b>.<br/>
2136
- * <br/> the main drawing surface which is completely opaque, surfaces
1958
+ * that affect drawing, such as <b>smooth()</b> or <b>colorMode()</b>.
1959
+ * the main drawing surface which is completely opaque, surfaces
2137
1960
  * created with <b>createGraphics()</b> can have transparency. This makes
2138
1961
  * it possible to draw into a graphics and maintain the alpha channel. By
2139
1962
  * using <b>save()</b> to write a PNG or TGA file, the transparency of the
@@ -2254,7 +2077,7 @@ public class PApplet implements PConstants {
2254
2077
  Class<?> rendererClass =
2255
2078
  Thread.currentThread().getContextClassLoader().loadClass(renderer);
2256
2079
 
2257
- Constructor<?> constructor = rendererClass.getConstructor(new Class[] { });
2080
+ Constructor<?> constructor = rendererClass.getConstructor();
2258
2081
  PGraphics pg = (PGraphics) constructor.newInstance();
2259
2082
 
2260
2083
  pg.setParent(this);
@@ -2346,10 +2169,10 @@ public class PApplet implements PConstants {
2346
2169
  * fresh buffer of pixels to play with. Set the size of the buffer with the
2347
2170
  * <b>width</b> and <b>height</b> parameters. The <b>format</b> parameter
2348
2171
  * defines how the pixels are stored. See the PImage reference for more information.
2349
- * <br/> <br/>
2172
+ *
2350
2173
  * Be sure to include all three parameters, specifying only the width and
2351
2174
  * height (but no format) will produce a strange error.
2352
- * <br/> <br/>
2175
+ *
2353
2176
  * Advanced users please note that createImage() should be used instead of
2354
2177
  * the syntax <tt>new PImage()</tt>.
2355
2178
  *
@@ -2525,11 +2348,11 @@ public class PApplet implements PConstants {
2525
2348
  * the program to update the display window only when necessary, for
2526
2349
  * example when an event registered by <b>mousePressed()</b> or
2527
2350
  * <b>keyPressed()</b> occurs.
2528
- * <br/><br/> structuring a program, it only makes sense to call redraw()
2351
+ * structuring a program, it only makes sense to call redraw()
2529
2352
  * within events such as <b>mousePressed()</b>. This is because
2530
2353
  * <b>redraw()</b> does not run <b>draw()</b> immediately (it only sets a
2531
2354
  * flag that indicates an update is needed).
2532
- * <br/><br/> <b>redraw()</b> within <b>draw()</b> has no effect because
2355
+ * <b>redraw()</b> within <b>draw()</b> has no effect because
2533
2356
  * <b>draw()</b> is continuously called anyway.
2534
2357
  *
2535
2358
  * ( end auto-generated )
@@ -2583,7 +2406,7 @@ public class PApplet implements PConstants {
2583
2406
  * <b>draw()</b>. If <b>loop()</b> is called, the code in <b>draw()</b>
2584
2407
  * begin to run continuously again. If using <b>noLoop()</b> in
2585
2408
  * <b>setup()</b>, it should be the last line inside the block.
2586
- * <br/> <br/>
2409
+ *
2587
2410
  * When <b>noLoop()</b> is used, it's not possible to manipulate or access
2588
2411
  * the screen inside event handling functions such as <b>mousePressed()</b>
2589
2412
  * or <b>keyPressed()</b>. Instead, use those functions to call
@@ -2591,7 +2414,7 @@ public class PApplet implements PConstants {
2591
2414
  * can update the screen properly. This means that when noLoop() has been
2592
2415
  * called, no drawing can happen, and functions like saveFrame() or
2593
2416
  * loadPixels() may not be used.
2594
- * <br/> <br/>
2417
+ *
2595
2418
  * Note that if the sketch is resized, <b>redraw()</b> will be called to
2596
2419
  * update the sketch, even after <b>noLoop()</b> has been specified.
2597
2420
  * Otherwise, the sketch would enter an odd state until <b>loop()</b> was called.
@@ -2684,7 +2507,7 @@ public class PApplet implements PConstants {
2684
2507
  int button = event.getButton();
2685
2508
 
2686
2509
  // If running on Mac OS, allow ctrl-click as right mouse.
2687
- if (PApplet.platform == PConstants.MACOSX && event.getButton() == PConstants.LEFT) {
2510
+ if (PApplet.platform == PConstants.MACOS && event.getButton() == PConstants.LEFT) {
2688
2511
  if (action == MouseEvent.PRESS && event.isControlDown()) {
2689
2512
  macosxLeftButtonWithCtrlPressed = true;
2690
2513
  }
@@ -2738,7 +2561,7 @@ public class PApplet implements PConstants {
2738
2561
  break;
2739
2562
  }
2740
2563
 
2741
- handleMethods("mouseEvent", new Object[] { event });
2564
+ handleMethods("mouseEvent", event);
2742
2565
 
2743
2566
  switch (action) {
2744
2567
  case MouseEvent.PRESS:
@@ -3010,7 +2833,7 @@ public class PApplet implements PConstants {
3010
2833
  }
3011
2834
  */
3012
2835
 
3013
- handleMethods("keyEvent", new Object[] { event });
2836
+ handleMethods("keyEvent", event);
3014
2837
 
3015
2838
  // if someone else wants to intercept the key, they should
3016
2839
  // set key to zero (or something besides the ESC).
@@ -3025,8 +2848,8 @@ public class PApplet implements PConstants {
3025
2848
  // embedded inside an application that has its own close behavior.
3026
2849
  if (external &&
3027
2850
  event.getKeyCode() == 'W' &&
3028
- ((event.isMetaDown() && platform == MACOSX) ||
3029
- (event.isControlDown() && platform != MACOSX))) {
2851
+ ((event.isMetaDown() && platform == MACOS) ||
2852
+ (event.isControlDown() && platform != MACOS))) {
3030
2853
  // Can't use this native stuff b/c the native event might be NEWT
3031
2854
  // if (external && event.getNative() instanceof java.awt.event.KeyEvent &&
3032
2855
  // ((java.awt.event.KeyEvent) event.getNative()).getModifiers() ==
@@ -3044,7 +2867,7 @@ public class PApplet implements PConstants {
3044
2867
  *
3045
2868
  * The <b>keyPressed()</b> function is called once every time a key is
3046
2869
  * pressed. The key that was pressed is stored in the <b>key</b> variable.
3047
- * <br/> <br/>
2870
+ *
3048
2871
  * For non-ASCII keys, use the <b>keyCode</b> variable. The keys included
3049
2872
  * in the ASCII specification (BACKSPACE, TAB, ENTER, RETURN, ESC, and
3050
2873
  * DELETE) do not require checking to see if they key is coded, and you
@@ -3053,7 +2876,7 @@ public class PApplet implements PConstants {
3053
2876
  * commonly used on PCs and Unix and the RETURN key is used instead on
3054
2877
  * Macintosh. Check for both ENTER and RETURN to make sure your program
3055
2878
  * will work for all platforms.
3056
- * <br/> <br/>
2879
+ *
3057
2880
  * Because of how operating systems handle key repeats, holding down a key
3058
2881
  * may cause multiple calls to keyPressed() (and keyReleased() as well).
3059
2882
  * The rate of repeat is set by the operating system and how each computer
@@ -3426,17 +3249,9 @@ public class PApplet implements PConstants {
3426
3249
  * @param url the complete URL, as a String in quotes
3427
3250
  */
3428
3251
  public void link(String url) {
3429
- try {
3430
- if (Desktop.isDesktopSupported()) {
3431
- Desktop.getDesktop().browse(new URI(url));
3432
- } else {
3433
- // Just pass it off to open() and hope for the best
3434
- launch(url);
3435
- }
3436
- } catch (IOException e) {
3437
- printStackTrace(e);
3438
- } catch (URISyntaxException e) {
3439
- printStackTrace(e);
3252
+ if (!surface.openLink(url)) {
3253
+ // Just pass it off to launch() and hope for the best
3254
+ launch(url);
3440
3255
  }
3441
3256
  }
3442
3257
 
@@ -3453,25 +3268,25 @@ public class PApplet implements PConstants {
3453
3268
  * of an executable in the system's PATH. In most cases, using a full path
3454
3269
  * is the best option, rather than relying on the system PATH. Be sure to
3455
3270
  * make the file executable before attempting to open it (chmod +x).
3456
- * <br/> <br/>
3271
+ *
3457
3272
  * The <b>args</b> parameter is a String or String array which is passed to
3458
3273
  * the command line. If you have multiple parameters, e.g. an application
3459
3274
  * and a document, or a command with multiple switches, use the version
3460
3275
  * that takes a String array, and place each individual item in a separate
3461
3276
  * element.
3462
- * <br/> <br/>
3277
+ *
3463
3278
  * If args is a String (not an array), then it can only be a single file or
3464
3279
  * application with no parameters. It's not the same as executing that
3465
3280
  * String using a shell. For instance, launch("javac -help") will not work
3466
3281
  * properly.
3467
- * <br/> <br/>
3282
+ *
3468
3283
  * This function behaves differently on each platform. On Windows, the
3469
3284
  * parameters are sent to the Windows shell via "cmd /c". On Mac OS X, the
3470
3285
  * "open" command is used (type "man open" in Terminal.app for
3471
3286
  * documentation). On Linux, it first tries gnome-open, then kde-open, but
3472
3287
  * if neither are available, it sends the command to the shell without any
3473
3288
  * alterations.
3474
- * <br/> <br/>
3289
+ *
3475
3290
  * For users familiar with Java, this is not quite the same as
3476
3291
  * Runtime.exec(), because the launcher command is prepended. Instead, the
3477
3292
  * <b>exec(String[])</b> function is a shortcut for
@@ -3492,7 +3307,7 @@ public class PApplet implements PConstants {
3492
3307
  // in the user.dir part of the url
3493
3308
  params = new String[] { "cmd", "/c" };
3494
3309
 
3495
- } else if (platform == MACOSX) {
3310
+ } else if (platform == MACOS) {
3496
3311
  params = new String[] { "open" };
3497
3312
 
3498
3313
  } else if (platform == LINUX) {
@@ -3829,7 +3644,7 @@ public class PApplet implements PConstants {
3829
3644
  handleMethods("dispose");
3830
3645
  }
3831
3646
 
3832
- if (platform == MACOSX) {
3647
+ if (platform == MACOS) {
3833
3648
  try {
3834
3649
  final String td = "processing.core.ThinkDifferent";
3835
3650
  final Class<?> thinkDifferent = getClass().getClassLoader().loadClass(td);
@@ -3855,8 +3670,8 @@ public class PApplet implements PConstants {
3855
3670
  */
3856
3671
  public void method(String name) {
3857
3672
  try {
3858
- Method method = getClass().getMethod(name, new Class[] {});
3859
- method.invoke(this, new Object[] { });
3673
+ Method method = getClass().getMethod(name);
3674
+ method.invoke(this);
3860
3675
 
3861
3676
  } catch (IllegalArgumentException e) {
3862
3677
  e.printStackTrace();
@@ -3891,13 +3706,7 @@ public class PApplet implements PConstants {
3891
3706
  * @see PApplet#noLoop()
3892
3707
  */
3893
3708
  public void thread(final String name) {
3894
- Thread later = new Thread() {
3895
- @Override
3896
- public void run() {
3897
- method(name);
3898
- }
3899
- };
3900
- later.start();
3709
+ new Thread(() -> method(name)).start();
3901
3710
  }
3902
3711
 
3903
3712
 
@@ -3919,7 +3728,7 @@ public class PApplet implements PConstants {
3919
3728
  * which may be opened by selecting "Show sketch folder" from the "Sketch"
3920
3729
  * menu. It is not possible to use <b>save()</b> while running the program
3921
3730
  * in a web browser.
3922
- * <br/> images saved from the main drawing window will be opaque. To save
3731
+ * images saved from the main drawing window will be opaque. To save
3923
3732
  * images without a background, use <b>createGraphics()</b>.
3924
3733
  *
3925
3734
  * ( end auto-generated )
@@ -3966,7 +3775,7 @@ public class PApplet implements PConstants {
3966
3775
  * href="http://wiki.processing.org/w/Sign_an_Applet">signed applet</A>. To
3967
3776
  * save a file back to a server, see the <a
3968
3777
  * href="http://wiki.processing.org/w/Saving_files_to_a_web-server">save to
3969
- * web</A> code snippet on the Processing Wiki.<br/>
3778
+ * web</A> code snippet on the Processing Wiki.
3970
3779
  * <br/ >
3971
3780
  * All images saved from the main drawing window will be opaque. To save
3972
3781
  * images without a background, use <b>createGraphics()</b>.
@@ -4208,7 +4017,7 @@ public class PApplet implements PConstants {
4208
4017
  * to this function creates a new line of output. Individual elements can
4209
4018
  * be separated with quotes ("") and joined with the string concatenation
4210
4019
  * operator (+). See <b>print()</b> for more about what to expect in the output.
4211
- * <br/><br/> <b>println()</b> on an array (by itself) will write the
4020
+ * <b>println()</b> on an array (by itself) will write the
4212
4021
  * contents of the array to the console. This is often helpful for looking
4213
4022
  * at the data a program is producing. A new line is put between each
4214
4023
  * element of the array. This function can only print one dimensional
@@ -5018,9 +4827,9 @@ public class PApplet implements PConstants {
5018
4827
  * ( begin auto-generated from norm.xml )
5019
4828
  *
5020
4829
  * Normalizes a number from another range into a value between 0 and 1.
5021
- * <br/> <br/>
4830
+ *
5022
4831
  * Identical to map(value, low, high, 0, 1);
5023
- * <br/> <br/>
4832
+ *
5024
4833
  * Numbers outside the range are not clamped to 0 and 1, because
5025
4834
  * out-of-range values are often intentional and useful.
5026
4835
  *
@@ -5043,7 +4852,7 @@ public class PApplet implements PConstants {
5043
4852
  * the number '25' is converted from a value in the range 0..100 into
5044
4853
  * a value that ranges from the left edge (0) to the right edge (width)
5045
4854
  * of the screen.
5046
- * <br/> <br/>
4855
+ *
5047
4856
  * Numbers outside the range are not clamped to 0 and 1, because
5048
4857
  * out-of-range values are often intentional and useful.
5049
4858
  *
@@ -5432,8 +5241,6 @@ public class PApplet implements PConstants {
5432
5241
  // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5433
5242
 
5434
5243
 
5435
- protected String[] loadImageFormats;
5436
-
5437
5244
  /**
5438
5245
  * ( begin auto-generated from loadImage.xml )
5439
5246
  *
@@ -5442,23 +5249,23 @@ public class PApplet implements PConstants {
5442
5249
  * be loaded. To load correctly, images must be located in the data
5443
5250
  * directory of the current sketch. In most cases, load all images in
5444
5251
  * <b>setup()</b> to preload them at the start of the program. Loading
5445
- * images inside <b>draw()</b> will reduce the speed of a program.<br/>
5446
- * <br/> <b>filename</b> parameter can also be a URL to a file found
5252
+ * images inside <b>draw()</b> will reduce the speed of a program.
5253
+ * <b>filename</b> parameter can also be a URL to a file found
5447
5254
  * online. For security reasons, a Processing sketch found online can only
5448
5255
  * download files from the same server from which it came. Getting around
5449
5256
  * this restriction requires a <a
5450
5257
  * href="http://wiki.processing.org/w/Sign_an_Applet">signed
5451
- * applet</a>.<br/>
5452
- * <br/> <b>extension</b> parameter is used to determine the image type in
5258
+ * applet</a>.
5259
+ * <b>extension</b> parameter is used to determine the image type in
5453
5260
  * cases where the image filename does not end with a proper extension.
5454
5261
  * Specify the extension as the second parameter to <b>loadImage()</b>, as
5455
- * shown in the third example on this page.<br/>
5456
- * <br/> an image is not loaded successfully, the <b>null</b> value is
5262
+ * shown in the third example on this page.
5263
+ * an image is not loaded successfully, the <b>null</b> value is
5457
5264
  * returned and an error message will be printed to the console. The error
5458
5265
  * message does not halt the program, however the null value may cause a
5459
5266
  * NullPointerException if your code does not check whether the value
5460
- * returned from <b>loadImage()</b> is null.<br/>
5461
- * <br/> on the type of error, a <b>PImage</b> object may still be
5267
+ * returned from <b>loadImage()</b> is null.
5268
+ * on the type of error, a <b>PImage</b> object may still be
5462
5269
  * returned, but the width and height of the image will be set to -1. This
5463
5270
  * happens if bad image data is returned or cannot be decoded properly.
5464
5271
  * Sometimes this happens with image URLs that produce a 403 error or that
@@ -5475,29 +5282,14 @@ public class PApplet implements PConstants {
5475
5282
  * @see PGraphics#background(float, float, float, float)
5476
5283
  */
5477
5284
  public PImage loadImage(String filename) {
5478
- // return loadImage(filename, null, null);
5479
5285
  return loadImage(filename, null);
5480
5286
  }
5481
5287
 
5482
- // /**
5483
- // * @param extension the type of image to load, for example "png", "gif", "jpg"
5484
- // */
5485
- // public PImage loadImage(String filename, String extension) {
5486
- // return loadImage(filename, extension, null);
5487
- // }
5488
-
5489
- // /**
5490
- // * @nowebref
5491
- // */
5492
- // public PImage loadImage(String filename, Object params) {
5493
- // return loadImage(filename, null, params);
5494
- // }
5495
5288
 
5496
5289
  /**
5497
5290
  * @param extension type of image to load, for example "png", "gif", "jpg"
5498
5291
  */
5499
- public PImage loadImage(String filename, String extension) { //, Object params) {
5500
-
5292
+ public PImage loadImage(String filename, String extension) {
5501
5293
  // awaitAsyncSaveCompletion() has to run on the main thread, because P2D
5502
5294
  // and P3D call GL functions. If this runs on background, requestImage()
5503
5295
  // already called awaitAsyncSaveCompletion() on the main thread.
@@ -5505,7 +5297,7 @@ public class PApplet implements PConstants {
5505
5297
  g.awaitAsyncSaveCompletion(filename);
5506
5298
  }
5507
5299
 
5508
- return ImageLoadFacade.get().loadFromFile(this, filename, extension);
5300
+ return surface.loadImage(filename, extension);
5509
5301
  }
5510
5302
 
5511
5303
 
@@ -5529,7 +5321,7 @@ public class PApplet implements PConstants {
5529
5321
  * when the image has loaded properly because its width and height will be
5530
5322
  * greater than 0. Asynchronous image loading (particularly when
5531
5323
  * downloading from a server) can dramatically improve performance.
5532
- * <br/> <b>extension</b> parameter is used to determine the image type in
5324
+ * <b>extension</b> parameter is used to determine the image type in
5533
5325
  * cases where the image filename does not end with a proper extension.
5534
5326
  * Specify the extension as the second parameter to <b>requestImage()</b>.
5535
5327
  *
@@ -5551,11 +5343,7 @@ public class PApplet implements PConstants {
5551
5343
 
5552
5344
  // if the image loading thread pool hasn't been created, create it
5553
5345
  if (requestImagePool == null) {
5554
- ThreadFactory factory = new ThreadFactory() {
5555
- public Thread newThread(Runnable r) {
5556
- return new Thread(r, REQUEST_IMAGE_THREAD_PREFIX);
5557
- }
5558
- };
5346
+ ThreadFactory factory = r -> new Thread(r, REQUEST_IMAGE_THREAD_PREFIX);
5559
5347
  requestImagePool = Executors.newFixedThreadPool(4, factory);
5560
5348
  }
5561
5349
  requestImagePool.execute(() -> {
@@ -5635,13 +5423,7 @@ public class PApplet implements PConstants {
5635
5423
 
5636
5424
  // can't use catch-all exception, since it might catch the
5637
5425
  // RuntimeException about the incorrect case sensitivity
5638
- } catch (IOException e) {
5639
- throw new RuntimeException(e);
5640
-
5641
- } catch (ParserConfigurationException e) {
5642
- throw new RuntimeException(e);
5643
-
5644
- } catch (SAXException e) {
5426
+ } catch (IOException | ParserConfigurationException | SAXException e) {
5645
5427
  throw new RuntimeException(e);
5646
5428
  }
5647
5429
  }
@@ -5872,10 +5654,9 @@ public class PApplet implements PConstants {
5872
5654
  String optionStr = Table.extensionOptions(true, filename, options);
5873
5655
  String[] optionList = trim(split(optionStr, ','));
5874
5656
 
5875
- Table dictionary = null;
5876
5657
  for (String opt : optionList) {
5877
5658
  if (opt.startsWith("dictionary=")) {
5878
- dictionary = loadTable(opt.substring(opt.indexOf('=') + 1), "tsv");
5659
+ Table dictionary = loadTable(opt.substring(opt.indexOf('=') + 1), "tsv");
5879
5660
  return dictionary.typedParse(createInput(filename), optionStr);
5880
5661
  }
5881
5662
  }
@@ -6085,25 +5866,6 @@ public class PApplet implements PConstants {
6085
5866
  */
6086
5867
 
6087
5868
 
6088
- static private boolean lookAndFeelCheck;
6089
-
6090
- /**
6091
- * Initialize the Look & Feel if it hasn't been already.
6092
- * Call this before using any Swing-related code in PApplet methods.
6093
- */
6094
- static private void checkLookAndFeel() {
6095
- if (!lookAndFeelCheck) {
6096
- if (platform == WINDOWS) {
6097
- // Windows is defaulting to Metal or something else awful.
6098
- // Which also is not scaled properly with HiDPI interfaces.
6099
- try {
6100
- UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
6101
- } catch (Exception e) { }
6102
- }
6103
- lookAndFeelCheck = true;
6104
- }
6105
- }
6106
-
6107
5869
  /**
6108
5870
  * Open a platform-specific file chooser dialog to select a file for input.
6109
5871
  * After the selection is made, the selected File will be passed to the
@@ -6145,10 +5907,12 @@ public class PApplet implements PConstants {
6145
5907
 
6146
5908
  public void selectInput(String prompt, String callback,
6147
5909
  File file, Object callbackObject) {
6148
- selectInput(prompt, callback, file, callbackObject, null, this); //selectFrame());
5910
+ //selectInput(prompt, callback, file, callbackObject, null, this);
5911
+ surface.selectInput(prompt, callback, file, callbackObject);
6149
5912
  }
6150
5913
 
6151
5914
 
5915
+ /*
6152
5916
  static public void selectInput(String prompt, String callbackMethod,
6153
5917
  File file, Object callbackObject, Frame parent,
6154
5918
  PApplet sketch) {
@@ -6160,6 +5924,7 @@ public class PApplet implements PConstants {
6160
5924
  File file, Object callbackObject, Frame parent) {
6161
5925
  selectImpl(prompt, callbackMethod, file, callbackObject, parent, FileDialog.LOAD, null);
6162
5926
  }
5927
+ */
6163
5928
 
6164
5929
 
6165
5930
  /**
@@ -6181,10 +5946,12 @@ public class PApplet implements PConstants {
6181
5946
 
6182
5947
  public void selectOutput(String prompt, String callback,
6183
5948
  File file, Object callbackObject) {
6184
- selectOutput(prompt, callback, file, callbackObject, null, this); //selectFrame());
5949
+ //selectOutput(prompt, callback, file, callbackObject, null, this);
5950
+ surface.selectOutput(prompt, callback, file, callbackObject);
6185
5951
  }
6186
5952
 
6187
5953
 
5954
+ /*
6188
5955
  static public void selectOutput(String prompt, String callbackMethod,
6189
5956
  File file, Object callbackObject, Frame parent) {
6190
5957
  selectImpl(prompt, callbackMethod, file, callbackObject, parent, FileDialog.SAVE, null);
@@ -6252,6 +6019,7 @@ public class PApplet implements PConstants {
6252
6019
  }
6253
6020
  });
6254
6021
  }
6022
+ */
6255
6023
 
6256
6024
 
6257
6025
  /**
@@ -6273,10 +6041,12 @@ public class PApplet implements PConstants {
6273
6041
 
6274
6042
  public void selectFolder(String prompt, String callback,
6275
6043
  File file, Object callbackObject) {
6276
- selectFolder(prompt, callback, file, callbackObject, null, this); //selectFrame());
6044
+ //selectFolder(prompt, callback, file, callbackObject, null, this);
6045
+ surface.selectFolder(prompt, callback, file, callbackObject);
6277
6046
  }
6278
6047
 
6279
6048
 
6049
+ /*
6280
6050
  static public void selectFolder(final String prompt,
6281
6051
  final String callbackMethod,
6282
6052
  final File defaultSelection,
@@ -6302,7 +6072,7 @@ public class PApplet implements PConstants {
6302
6072
  (sketch.g instanceof PGraphicsOpenGL) && (platform == WINDOWS);
6303
6073
  if (hide) sketch.surface.setVisible(false);
6304
6074
 
6305
- if (platform == MACOSX && useNativeSelect != false) {
6075
+ if (platform == MACOS && useNativeSelect != false) {
6306
6076
  FileDialog fileDialog =
6307
6077
  new FileDialog(parentFrame, prompt, FileDialog.LOAD);
6308
6078
  if (defaultSelection != null) {
@@ -6335,16 +6105,17 @@ public class PApplet implements PConstants {
6335
6105
  }
6336
6106
  });
6337
6107
  }
6108
+ */
6338
6109
 
6339
6110
 
6340
- static private void selectCallback(File selectedFile,
6341
- String callbackMethod,
6342
- Object callbackObject) {
6111
+ static public void selectCallback(File selectedFile,
6112
+ String callbackMethod,
6113
+ Object callbackObject) {
6343
6114
  try {
6344
6115
  Class<?> callbackClass = callbackObject.getClass();
6345
6116
  Method selectMethod =
6346
- callbackClass.getMethod(callbackMethod, new Class[] { File.class });
6347
- selectMethod.invoke(callbackObject, new Object[] { selectedFile });
6117
+ callbackClass.getMethod(callbackMethod, File.class);
6118
+ selectMethod.invoke(callbackObject, selectedFile);
6348
6119
 
6349
6120
  } catch (IllegalAccessException iae) {
6350
6121
  System.err.println(callbackMethod + "() must be public");
@@ -6358,7 +6129,6 @@ public class PApplet implements PConstants {
6358
6129
  }
6359
6130
 
6360
6131
 
6361
-
6362
6132
  //////////////////////////////////////////////////////////////
6363
6133
 
6364
6134
  // LISTING DIRECTORIES
@@ -6522,7 +6292,7 @@ public class PApplet implements PConstants {
6522
6292
  * Creates a <b>BufferedReader</b> object that can be used to read files
6523
6293
  * line-by-line as individual <b>String</b> objects. This is the complement
6524
6294
  * to the <b>createWriter()</b> function.
6525
- * <br/> <br/>
6295
+ *
6526
6296
  * Starting with Processing release 0134, all files loaded and saved by the
6527
6297
  * Processing API use UTF-8 encoding. In previous releases, the default
6528
6298
  * encoding for your platform was used, which causes problems when files
@@ -6598,7 +6368,7 @@ public class PApplet implements PConstants {
6598
6368
  * to write to it. For the file to be made correctly, it should be flushed
6599
6369
  * and must be closed with its <b>flush()</b> and <b>close()</b> methods
6600
6370
  * (see above example).
6601
- * <br/> <br/>
6371
+ *
6602
6372
  * Starting with Processing release 0134, all files loaded and saved by the
6603
6373
  * Processing API use UTF-8 encoding. In previous releases, the default
6604
6374
  * encoding for your platform was used, which causes problems when files
@@ -6730,7 +6500,23 @@ public class PApplet implements PConstants {
6730
6500
  *
6731
6501
  */
6732
6502
  public InputStream createInput(String filename) {
6733
- return InputFactory.createInput(this, filename);
6503
+ InputStream input = createInputRaw(filename);
6504
+ if (input != null) {
6505
+ // if it's gzip-encoded, automatically decode
6506
+ final String lower = filename.toLowerCase();
6507
+ if (lower.endsWith(".gz") || lower.endsWith(".svgz")) {
6508
+ try {
6509
+ // buffered has to go *around* the GZ, otherwise 25x slower
6510
+ return new BufferedInputStream(new GZIPInputStream(input));
6511
+
6512
+ } catch (IOException e) {
6513
+ printStackTrace(e);
6514
+ }
6515
+ } else {
6516
+ return new BufferedInputStream(input);
6517
+ }
6518
+ }
6519
+ return null;
6734
6520
  }
6735
6521
 
6736
6522
 
@@ -6738,7 +6524,154 @@ public class PApplet implements PConstants {
6738
6524
  * Call openStream() without automatic gzip decompression.
6739
6525
  */
6740
6526
  public InputStream createInputRaw(String filename) {
6741
- return InputFactory.createInputRaw(this, filename);
6527
+ if (filename == null) return null;
6528
+
6529
+ if (sketchPath == null) {
6530
+ System.err.println("The sketch path is not set.");
6531
+ throw new RuntimeException("Files must be loaded inside setup() or after it has been called.");
6532
+ }
6533
+
6534
+ if (filename.length() == 0) {
6535
+ // an error will be called by the parent function
6536
+ //System.err.println("The filename passed to openStream() was empty.");
6537
+ return null;
6538
+ }
6539
+
6540
+ // First check whether this looks like a URL
6541
+ if (filename.contains(":")) { // at least smells like URL
6542
+ try {
6543
+ URL url = new URL(filename);
6544
+ URLConnection conn = url.openConnection();
6545
+
6546
+ if (conn instanceof HttpURLConnection) {
6547
+ HttpURLConnection httpConn = (HttpURLConnection) conn;
6548
+ // Will not handle a protocol change (see below)
6549
+ httpConn.setInstanceFollowRedirects(true);
6550
+ int response = httpConn.getResponseCode();
6551
+ // Default won't follow HTTP -> HTTPS redirects for security reasons
6552
+ // http://stackoverflow.com/a/1884427
6553
+ if (response >= 300 && response < 400) {
6554
+ String newLocation = httpConn.getHeaderField("Location");
6555
+ return createInputRaw(newLocation);
6556
+ }
6557
+ return conn.getInputStream();
6558
+ } else if (conn instanceof JarURLConnection) {
6559
+ return url.openStream();
6560
+ }
6561
+ } catch (MalformedURLException mfue) {
6562
+ // not a url, that's fine
6563
+
6564
+ } catch (FileNotFoundException fnfe) {
6565
+ // Added in 0119 b/c Java 1.5 throws FNFE when URL not available.
6566
+ // http://dev.processing.org/bugs/show_bug.cgi?id=403
6567
+
6568
+ } catch (IOException e) {
6569
+ // changed for 0117, shouldn't be throwing exception
6570
+ printStackTrace(e);
6571
+ //System.err.println("Error downloading from URL " + filename);
6572
+ return null;
6573
+ //throw new RuntimeException("Error downloading from URL " + filename);
6574
+ }
6575
+ }
6576
+
6577
+ InputStream stream;
6578
+
6579
+ // Moved this earlier than the getResourceAsStream() checks, because
6580
+ // calling getResourceAsStream() on a directory lists its contents.
6581
+ // http://dev.processing.org/bugs/show_bug.cgi?id=716
6582
+ try {
6583
+ // First see if it's in a data folder. This may fail by throwing
6584
+ // a SecurityException. If so, this whole block will be skipped.
6585
+ File file = new File(dataPath(filename));
6586
+ if (!file.exists()) {
6587
+ // next see if it's just in the sketch folder
6588
+ file = sketchFile(filename);
6589
+ }
6590
+
6591
+ if (file.isDirectory()) {
6592
+ return null;
6593
+ }
6594
+ if (file.exists()) {
6595
+ try {
6596
+ // handle case sensitivity check
6597
+ String filePath = file.getCanonicalPath();
6598
+ String filenameActual = new File(filePath).getName();
6599
+ // make sure there isn't a subfolder prepended to the name
6600
+ String filenameShort = new File(filename).getName();
6601
+ // if the actual filename is the same, but capitalized
6602
+ // differently, warn the user.
6603
+ //if (filenameActual.equalsIgnoreCase(filenameShort) &&
6604
+ //!filenameActual.equals(filenameShort)) {
6605
+ if (!filenameActual.equals(filenameShort)) {
6606
+ throw new RuntimeException("This file is named " +
6607
+ filenameActual + " not " +
6608
+ filename + ". Rename the file " +
6609
+ "or change your code.");
6610
+ }
6611
+ } catch (IOException ignored) { }
6612
+ }
6613
+
6614
+ // if this file is ok, may as well just load it
6615
+ return new FileInputStream(file);
6616
+
6617
+ // have to break these out because a general Exception might
6618
+ // catch the RuntimeException being thrown above
6619
+ } catch (IOException | SecurityException ignored) { }
6620
+
6621
+ // Using getClassLoader() prevents java from converting dots
6622
+ // to slashes or requiring a slash at the beginning.
6623
+ // (a slash as a prefix means that it'll load from the root of
6624
+ // the jar, rather than trying to dig into the package location)
6625
+ ClassLoader cl = getClass().getClassLoader();
6626
+
6627
+ // by default, data files are exported to the root path of the jar.
6628
+ // (not the data folder) so check there first.
6629
+ stream = cl.getResourceAsStream("data/" + filename);
6630
+ if (stream != null) {
6631
+ String cn = stream.getClass().getName();
6632
+ // this is an irritation of sun's java plug-in, which will return
6633
+ // a non-null stream for an object that doesn't exist. like all good
6634
+ // things, this is probably introduced in java 1.5. awesome!
6635
+ // http://dev.processing.org/bugs/show_bug.cgi?id=359
6636
+ if (!cn.equals("sun.plugin.cache.EmptyInputStream")) {
6637
+ return stream;
6638
+ }
6639
+ }
6640
+
6641
+ // When used with an online script, also need to check without the
6642
+ // data folder, in case it's not in a subfolder called 'data'.
6643
+ // http://dev.processing.org/bugs/show_bug.cgi?id=389
6644
+ stream = cl.getResourceAsStream(filename);
6645
+ if (stream != null) {
6646
+ String cn = stream.getClass().getName();
6647
+ if (!cn.equals("sun.plugin.cache.EmptyInputStream")) {
6648
+ return stream;
6649
+ }
6650
+ }
6651
+
6652
+ try {
6653
+ // attempt to load from a local file, used when running as
6654
+ // an application, or as a signed applet
6655
+ try { // first try to catch any security exceptions
6656
+ try {
6657
+ return new FileInputStream(dataPath(filename));
6658
+ } catch (IOException ignored) { }
6659
+
6660
+ try {
6661
+ return new FileInputStream(sketchPath(filename));
6662
+ } catch (Exception ignored) { }
6663
+
6664
+ try {
6665
+ return new FileInputStream(filename);
6666
+ } catch (IOException ignored) { }
6667
+
6668
+ } catch (SecurityException ignored) { } // online, whups
6669
+
6670
+ } catch (Exception e) {
6671
+ printStackTrace(e);
6672
+ }
6673
+
6674
+ return null;
6742
6675
  }
6743
6676
 
6744
6677
 
@@ -6746,7 +6679,26 @@ public class PApplet implements PConstants {
6746
6679
  * @nowebref
6747
6680
  */
6748
6681
  static public InputStream createInput(File file) {
6749
- return InputFactory.createInput(file);
6682
+ if (file == null) {
6683
+ throw new IllegalArgumentException("File passed to createInput() was null");
6684
+ }
6685
+ if (!file.exists()) {
6686
+ System.err.println(file + " does not exist, createInput() will return null");
6687
+ return null;
6688
+ }
6689
+ try {
6690
+ InputStream input = new FileInputStream(file);
6691
+ final String lower = file.getName().toLowerCase();
6692
+ if (lower.endsWith(".gz") || lower.endsWith(".svgz")) {
6693
+ return new BufferedInputStream(new GZIPInputStream(input));
6694
+ }
6695
+ return new BufferedInputStream(input);
6696
+
6697
+ } catch (IOException e) {
6698
+ System.err.println("Could not createInput() for " + file);
6699
+ e.printStackTrace();
6700
+ return null;
6701
+ }
6750
6702
  }
6751
6703
 
6752
6704
 
@@ -6805,7 +6757,7 @@ public class PApplet implements PConstants {
6805
6757
  }
6806
6758
 
6807
6759
  if (input != null) {
6808
- byte[] buffer = null;
6760
+ byte[] buffer;
6809
6761
  if (length != -1) {
6810
6762
  buffer = new byte[length];
6811
6763
  int count;
@@ -6979,7 +6931,7 @@ public class PApplet implements PConstants {
6979
6931
  * message does not halt the program, however the null value may cause a
6980
6932
  * NullPointerException if your code does not check whether the value
6981
6933
  * returned is null.
6982
- * <br/> <br/>
6934
+ *
6983
6935
  * Starting with Processing release 0134, all files loaded and saved by the
6984
6936
  * Processing API use UTF-8 encoding. In previous releases, the default
6985
6937
  * encoding for your platform was used, which causes problems when files
@@ -7028,25 +6980,20 @@ public class PApplet implements PConstants {
7028
6980
  * @nowebref
7029
6981
  */
7030
6982
  static public String[] loadStrings(InputStream input) {
7031
- try {
7032
- BufferedReader reader =
7033
- new BufferedReader(new InputStreamReader(input, "UTF-8"));
7034
- return loadStrings(reader);
7035
- } catch (IOException e) {
7036
- e.printStackTrace();
7037
- }
7038
- return null;
6983
+ BufferedReader reader =
6984
+ new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
6985
+ return loadStrings(reader);
7039
6986
  }
7040
6987
 
7041
6988
 
7042
6989
  static public String[] loadStrings(BufferedReader reader) {
7043
6990
  try {
7044
- String lines[] = new String[100];
6991
+ String[] lines = new String[100];
7045
6992
  int lineCount = 0;
7046
- String line = null;
6993
+ String line;
7047
6994
  while ((line = reader.readLine()) != null) {
7048
6995
  if (lineCount == lines.length) {
7049
- String temp[] = new String[lineCount << 1];
6996
+ String[] temp = new String[lineCount << 1];
7050
6997
  System.arraycopy(lines, 0, temp, 0, lineCount);
7051
6998
  lines = temp;
7052
6999
  }
@@ -7059,7 +7006,7 @@ public class PApplet implements PConstants {
7059
7006
  }
7060
7007
 
7061
7008
  // resize array to appropriate amount for these lines
7062
- String output[] = new String[lineCount];
7009
+ String[] output = new String[lineCount];
7063
7010
  System.arraycopy(lines, 0, output, 0, lineCount);
7064
7011
  return output;
7065
7012
 
@@ -7179,24 +7126,23 @@ public class PApplet implements PConstants {
7179
7126
 
7180
7127
  saveStream(targetStream, source);
7181
7128
  targetStream.close();
7182
- targetStream = null;
7183
7129
 
7184
7130
  if (target.exists()) {
7185
7131
  if (!target.delete()) {
7186
- System.err.println("Could not replace " +
7187
- target.getAbsolutePath() + ".");
7132
+ System.err.println("Could not replace " + target);
7188
7133
  }
7189
7134
  }
7190
7135
  if (!tempFile.renameTo(target)) {
7191
- System.err.println("Could not rename temporary file " +
7192
- tempFile.getAbsolutePath());
7136
+ System.err.println("Could not rename temporary file " + tempFile);
7193
7137
  return false;
7194
7138
  }
7195
7139
  return true;
7196
7140
 
7197
7141
  } catch (IOException e) {
7198
7142
  if (tempFile != null) {
7199
- tempFile.delete();
7143
+ if (!tempFile.delete()) {
7144
+ System.err.println("Could not rename temporary file " + tempFile);
7145
+ }
7200
7146
  }
7201
7147
  e.printStackTrace();
7202
7148
  return false;
@@ -7260,7 +7206,9 @@ public class PApplet implements PConstants {
7260
7206
  static private File createTempFile(File file) throws IOException {
7261
7207
  File parentDir = file.getParentFile();
7262
7208
  if (!parentDir.exists()) {
7263
- parentDir.mkdirs();
7209
+ if (!parentDir.mkdirs()) {
7210
+ throw new IOException("Could not make directories for " + parentDir);
7211
+ }
7264
7212
  }
7265
7213
  String name = file.getName();
7266
7214
  String prefix;
@@ -7291,25 +7239,29 @@ public class PApplet implements PConstants {
7291
7239
  tempFile = createTempFile(file);
7292
7240
 
7293
7241
  OutputStream output = createOutput(tempFile);
7294
- saveBytes(output, data);
7295
- output.close();
7296
- output = null;
7242
+ if (output != null) {
7243
+ saveBytes(output, data);
7244
+ output.close();
7245
+ } else {
7246
+ System.err.println("Could not write to " + tempFile);
7247
+ }
7297
7248
 
7298
7249
  if (file.exists()) {
7299
7250
  if (!file.delete()) {
7300
- System.err.println("Could not replace " + file.getAbsolutePath());
7251
+ System.err.println("Could not replace " + file);
7301
7252
  }
7302
7253
  }
7303
7254
 
7304
7255
  if (!tempFile.renameTo(file)) {
7305
- System.err.println("Could not rename temporary file " +
7306
- tempFile.getAbsolutePath());
7256
+ System.err.println("Could not rename temporary file " + tempFile);
7307
7257
  }
7308
7258
 
7309
7259
  } catch (IOException e) {
7310
7260
  System.err.println("error saving bytes to " + file);
7311
7261
  if (tempFile != null) {
7312
- tempFile.delete();
7262
+ if (!tempFile.delete()) {
7263
+ System.err.println("Could not delete temporary file " + tempFile);
7264
+ }
7313
7265
  }
7314
7266
  e.printStackTrace();
7315
7267
  }
@@ -7345,7 +7297,7 @@ public class PApplet implements PConstants {
7345
7297
  * href="http://wiki.processing.org/w/Sign_an_Applet">signed applet</A>. To
7346
7298
  * save a file back to a server, see the <a
7347
7299
  * href="http://wiki.processing.org/w/Saving_files_to_a_web-server">save to
7348
- * web</A> code snippet on the Processing Wiki.<br/>
7300
+ * web</A> code snippet on the Processing Wiki.
7349
7301
  * <br/ >
7350
7302
  * Starting with Processing 1.0, all files loaded and saved by the
7351
7303
  * Processing API use UTF-8 encoding. In previous releases, the default
@@ -7360,7 +7312,7 @@ public class PApplet implements PConstants {
7360
7312
  * @see PApplet#loadBytes(String)
7361
7313
  * @see PApplet#saveBytes(String, byte[])
7362
7314
  */
7363
- public void saveStrings(String filename, String data[]) {
7315
+ public void saveStrings(String filename, String[] data) {
7364
7316
  saveStrings(saveFile(filename), data);
7365
7317
  }
7366
7318
 
@@ -7368,7 +7320,7 @@ public class PApplet implements PConstants {
7368
7320
  /**
7369
7321
  * @nowebref
7370
7322
  */
7371
- static public void saveStrings(File file, String data[]) {
7323
+ static public void saveStrings(File file, String[] data) {
7372
7324
  saveStrings(createOutput(file), data);
7373
7325
  }
7374
7326
 
@@ -7404,7 +7356,7 @@ public class PApplet implements PConstants {
7404
7356
 
7405
7357
  // Workaround for bug in Java for OS X from Oracle (7u51)
7406
7358
  // https://github.com/processing/processing/issues/2181
7407
- if (platform == MACOSX) {
7359
+ if (platform == MACOS) {
7408
7360
  if (jarPath.contains("Contents/Java/")) {
7409
7361
  String appPath = jarPath.substring(0, jarPath.indexOf(".app") + 4);
7410
7362
  File containingFolder = new File(appPath).getParentFile();
@@ -7498,17 +7450,15 @@ public class PApplet implements PConstants {
7498
7450
 
7499
7451
  static File desktopFolder;
7500
7452
 
7501
- /** Not a supported function. For testing use only. */
7502
7453
  static public File desktopFile(String what) {
7503
7454
  if (desktopFolder == null) {
7504
7455
  // Should work on Linux and OS X (on OS X, even with the localized version).
7505
7456
  desktopFolder = new File(System.getProperty("user.home"), "Desktop");
7506
7457
  if (!desktopFolder.exists()) {
7507
- if (platform == WINDOWS) {
7508
- FileSystemView filesys = FileSystemView.getFileSystemView();
7509
- desktopFolder = filesys.getHomeDirectory();
7458
+ if (platform == WINDOWS && !disableAWT) {
7459
+ desktopFolder = ShimAWT.getWindowsDesktop();
7510
7460
  } else {
7511
- throw new UnsupportedOperationException("Could not find a suitable desktop foldder");
7461
+ throw new UnsupportedOperationException("Could not find a suitable Desktop foldder");
7512
7462
  }
7513
7463
  }
7514
7464
  }
@@ -7516,7 +7466,6 @@ public class PApplet implements PConstants {
7516
7466
  }
7517
7467
 
7518
7468
 
7519
- /** Not a supported function. For testing use only. */
7520
7469
  static public String desktopPath(String what) {
7521
7470
  return desktopFile(what).getAbsolutePath();
7522
7471
  }
@@ -7593,17 +7542,42 @@ public class PApplet implements PConstants {
7593
7542
  * may not actually exist.
7594
7543
  */
7595
7544
  static public void createPath(String path) {
7596
- PathUtil.createPath(path);
7545
+ createPath(new File(path));
7597
7546
  }
7598
7547
 
7599
7548
 
7600
7549
  static public void createPath(File file) {
7601
- PathUtil.createPath(file);
7550
+ try {
7551
+ String parent = file.getParent();
7552
+ if (parent != null) {
7553
+ File unit = new File(parent);
7554
+ if (!unit.exists()) unit.mkdirs();
7555
+ }
7556
+ } catch (SecurityException se) {
7557
+ System.err.println("You don't have permissions to create " +
7558
+ file.getAbsolutePath());
7559
+ }
7602
7560
  }
7603
7561
 
7604
7562
 
7605
7563
  static public String getExtension(String filename) {
7606
- return PathUtil.parseExtension(filename);
7564
+ String extension;
7565
+
7566
+ String lower = filename.toLowerCase();
7567
+ int dot = filename.lastIndexOf('.');
7568
+ if (dot == -1) {
7569
+ return ""; // no extension found
7570
+ }
7571
+ extension = lower.substring(dot + 1);
7572
+
7573
+ // check for, and strip any parameters on the url, i.e.
7574
+ // filename.jpg?blah=blah&something=that
7575
+ int question = extension.indexOf('?');
7576
+ if (question != -1) {
7577
+ extension = extension.substring(0, question);
7578
+ }
7579
+
7580
+ return extension;
7607
7581
  }
7608
7582
 
7609
7583
 
@@ -7627,11 +7601,7 @@ public class PApplet implements PConstants {
7627
7601
  // using toURI() and URI.toURL()."
7628
7602
  // https://docs.oracle.com/javase/8/docs/api/java/net/URL.html
7629
7603
  static public String urlDecode(String str) {
7630
- try {
7631
- return URLDecoder.decode(str, "UTF-8");
7632
- } catch (UnsupportedEncodingException e) { // safe per the JDK source
7633
- return null;
7634
- }
7604
+ return URLDecoder.decode(str, StandardCharsets.UTF_8);
7635
7605
  }
7636
7606
 
7637
7607
 
@@ -7657,7 +7627,7 @@ public class PApplet implements PConstants {
7657
7627
  * @param list array to sort
7658
7628
  * @see PApplet#reverse(boolean[])
7659
7629
  */
7660
- static public byte[] sort(byte list[]) {
7630
+ static public byte[] sort(byte[] list) {
7661
7631
  return sort(list, list.length);
7662
7632
  }
7663
7633
 
@@ -7671,7 +7641,7 @@ public class PApplet implements PConstants {
7671
7641
  return outgoing;
7672
7642
  }
7673
7643
 
7674
- static public char[] sort(char list[]) {
7644
+ static public char[] sort(char[] list) {
7675
7645
  return sort(list, list.length);
7676
7646
  }
7677
7647
 
@@ -7682,7 +7652,7 @@ public class PApplet implements PConstants {
7682
7652
  return outgoing;
7683
7653
  }
7684
7654
 
7685
- static public int[] sort(int list[]) {
7655
+ static public int[] sort(int[] list) {
7686
7656
  return sort(list, list.length);
7687
7657
  }
7688
7658
 
@@ -7693,7 +7663,7 @@ public class PApplet implements PConstants {
7693
7663
  return outgoing;
7694
7664
  }
7695
7665
 
7696
- static public float[] sort(float list[]) {
7666
+ static public float[] sort(float[] list) {
7697
7667
  return sort(list, list.length);
7698
7668
  }
7699
7669
 
@@ -7704,7 +7674,7 @@ public class PApplet implements PConstants {
7704
7674
  return outgoing;
7705
7675
  }
7706
7676
 
7707
- static public String[] sort(String list[]) {
7677
+ static public String[] sort(String[] list) {
7708
7678
  return sort(list, list.length);
7709
7679
  }
7710
7680
 
@@ -7800,7 +7770,7 @@ public class PApplet implements PConstants {
7800
7770
  * Increases the size of an array. By default, this function doubles the
7801
7771
  * size of the array, but the optional <b>newSize</b> parameter provides
7802
7772
  * precise control over the increase in size.
7803
- * <br/> <br/>
7773
+ *
7804
7774
  * When using an array of objects, the data returned from the function must
7805
7775
  * be cast to the object array's data type. For example: <em>SomeClass[]
7806
7776
  * items = (SomeClass[]) expand(originalArray)</em>.
@@ -7811,85 +7781,85 @@ public class PApplet implements PConstants {
7811
7781
  * @param list the array to expand
7812
7782
  * @see PApplet#shorten(boolean[])
7813
7783
  */
7814
- static public boolean[] expand(boolean list[]) {
7784
+ static public boolean[] expand(boolean[] list) {
7815
7785
  return expand(list, list.length > 0 ? list.length << 1 : 1);
7816
7786
  }
7817
7787
 
7818
7788
  /**
7819
7789
  * @param newSize new size for the array
7820
7790
  */
7821
- static public boolean[] expand(boolean list[], int newSize) {
7822
- boolean temp[] = new boolean[newSize];
7791
+ static public boolean[] expand(boolean[] list, int newSize) {
7792
+ boolean[] temp = new boolean[newSize];
7823
7793
  System.arraycopy(list, 0, temp, 0, Math.min(newSize, list.length));
7824
7794
  return temp;
7825
7795
  }
7826
7796
 
7827
- static public byte[] expand(byte list[]) {
7797
+ static public byte[] expand(byte[] list) {
7828
7798
  return expand(list, list.length > 0 ? list.length << 1 : 1);
7829
7799
  }
7830
7800
 
7831
- static public byte[] expand(byte list[], int newSize) {
7832
- byte temp[] = new byte[newSize];
7801
+ static public byte[] expand(byte[] list, int newSize) {
7802
+ byte[] temp = new byte[newSize];
7833
7803
  System.arraycopy(list, 0, temp, 0, Math.min(newSize, list.length));
7834
7804
  return temp;
7835
7805
  }
7836
7806
 
7837
- static public char[] expand(char list[]) {
7807
+ static public char[] expand(char[] list) {
7838
7808
  return expand(list, list.length > 0 ? list.length << 1 : 1);
7839
7809
  }
7840
7810
 
7841
- static public char[] expand(char list[], int newSize) {
7842
- char temp[] = new char[newSize];
7811
+ static public char[] expand(char[] list, int newSize) {
7812
+ char[] temp = new char[newSize];
7843
7813
  System.arraycopy(list, 0, temp, 0, Math.min(newSize, list.length));
7844
7814
  return temp;
7845
7815
  }
7846
7816
 
7847
- static public int[] expand(int list[]) {
7817
+ static public int[] expand(int[] list) {
7848
7818
  return expand(list, list.length > 0 ? list.length << 1 : 1);
7849
7819
  }
7850
7820
 
7851
- static public int[] expand(int list[], int newSize) {
7852
- int temp[] = new int[newSize];
7821
+ static public int[] expand(int[] list, int newSize) {
7822
+ int[] temp = new int[newSize];
7853
7823
  System.arraycopy(list, 0, temp, 0, Math.min(newSize, list.length));
7854
7824
  return temp;
7855
7825
  }
7856
7826
 
7857
- static public long[] expand(long list[]) {
7827
+ static public long[] expand(long[] list) {
7858
7828
  return expand(list, list.length > 0 ? list.length << 1 : 1);
7859
7829
  }
7860
7830
 
7861
- static public long[] expand(long list[], int newSize) {
7862
- long temp[] = new long[newSize];
7831
+ static public long[] expand(long[] list, int newSize) {
7832
+ long[] temp = new long[newSize];
7863
7833
  System.arraycopy(list, 0, temp, 0, Math.min(newSize, list.length));
7864
7834
  return temp;
7865
7835
  }
7866
7836
 
7867
- static public float[] expand(float list[]) {
7837
+ static public float[] expand(float[] list) {
7868
7838
  return expand(list, list.length > 0 ? list.length << 1 : 1);
7869
7839
  }
7870
7840
 
7871
- static public float[] expand(float list[], int newSize) {
7872
- float temp[] = new float[newSize];
7841
+ static public float[] expand(float[] list, int newSize) {
7842
+ float[] temp = new float[newSize];
7873
7843
  System.arraycopy(list, 0, temp, 0, Math.min(newSize, list.length));
7874
7844
  return temp;
7875
7845
  }
7876
7846
 
7877
- static public double[] expand(double list[]) {
7847
+ static public double[] expand(double[] list) {
7878
7848
  return expand(list, list.length > 0 ? list.length << 1 : 1);
7879
7849
  }
7880
7850
 
7881
- static public double[] expand(double list[], int newSize) {
7882
- double temp[] = new double[newSize];
7851
+ static public double[] expand(double[] list, int newSize) {
7852
+ double[] temp = new double[newSize];
7883
7853
  System.arraycopy(list, 0, temp, 0, Math.min(newSize, list.length));
7884
7854
  return temp;
7885
7855
  }
7886
7856
 
7887
- static public String[] expand(String list[]) {
7857
+ static public String[] expand(String[] list) {
7888
7858
  return expand(list, list.length > 0 ? list.length << 1 : 1);
7889
7859
  }
7890
7860
 
7891
- static public String[] expand(String list[], int newSize) {
7892
- String temp[] = new String[newSize];
7861
+ static public String[] expand(String[] list, int newSize) {
7862
+ String[] temp = new String[newSize];
7893
7863
  // in case the new size is smaller than list.length
7894
7864
  System.arraycopy(list, 0, temp, 0, Math.min(newSize, list.length));
7895
7865
  return temp;
@@ -7920,7 +7890,7 @@ public class PApplet implements PConstants {
7920
7890
  * Expands an array by one element and adds data to the new position. The
7921
7891
  * datatype of the <b>element</b> parameter must be the same as the
7922
7892
  * datatype of the array.
7923
- * <br/> <br/>
7893
+ *
7924
7894
  * When using an array of objects, the data returned from the function must
7925
7895
  * be cast to the object array's data type. For example: <em>SomeClass[]
7926
7896
  * items = (SomeClass[]) append(originalArray, element)</em>.
@@ -7933,31 +7903,31 @@ public class PApplet implements PConstants {
7933
7903
  * @see PApplet#shorten(boolean[])
7934
7904
  * @see PApplet#expand(boolean[])
7935
7905
  */
7936
- static public byte[] append(byte array[], byte value) {
7906
+ static public byte[] append(byte[] array, byte value) {
7937
7907
  array = expand(array, array.length + 1);
7938
7908
  array[array.length-1] = value;
7939
7909
  return array;
7940
7910
  }
7941
7911
 
7942
- static public char[] append(char array[], char value) {
7912
+ static public char[] append(char[] array, char value) {
7943
7913
  array = expand(array, array.length + 1);
7944
7914
  array[array.length-1] = value;
7945
7915
  return array;
7946
7916
  }
7947
7917
 
7948
- static public int[] append(int array[], int value) {
7918
+ static public int[] append(int[] array, int value) {
7949
7919
  array = expand(array, array.length + 1);
7950
7920
  array[array.length-1] = value;
7951
7921
  return array;
7952
7922
  }
7953
7923
 
7954
- static public float[] append(float array[], float value) {
7924
+ static public float[] append(float[] array, float value) {
7955
7925
  array = expand(array, array.length + 1);
7956
7926
  array[array.length-1] = value;
7957
7927
  return array;
7958
7928
  }
7959
7929
 
7960
- static public String[] append(String array[], String value) {
7930
+ static public String[] append(String[] array, String value) {
7961
7931
  array = expand(array, array.length + 1);
7962
7932
  array[array.length-1] = value;
7963
7933
  return array;
@@ -7975,7 +7945,7 @@ public class PApplet implements PConstants {
7975
7945
  * ( begin auto-generated from shorten.xml )
7976
7946
  *
7977
7947
  * Decreases an array by one element and returns the shortened array.
7978
- * <br/> <br/>
7948
+ *
7979
7949
  * When using an array of objects, the data returned from the function must
7980
7950
  * be cast to the object array's data type. For example: <em>SomeClass[]
7981
7951
  * items = (SomeClass[]) shorten(originalArray)</em>.
@@ -7987,27 +7957,27 @@ public class PApplet implements PConstants {
7987
7957
  * @see PApplet#append(byte[], byte)
7988
7958
  * @see PApplet#expand(boolean[])
7989
7959
  */
7990
- static public boolean[] shorten(boolean list[]) {
7960
+ static public boolean[] shorten(boolean[] list) {
7991
7961
  return subset(list, 0, list.length-1);
7992
7962
  }
7993
7963
 
7994
- static public byte[] shorten(byte list[]) {
7964
+ static public byte[] shorten(byte[] list) {
7995
7965
  return subset(list, 0, list.length-1);
7996
7966
  }
7997
7967
 
7998
- static public char[] shorten(char list[]) {
7968
+ static public char[] shorten(char[] list) {
7999
7969
  return subset(list, 0, list.length-1);
8000
7970
  }
8001
7971
 
8002
- static public int[] shorten(int list[]) {
7972
+ static public int[] shorten(int[] list) {
8003
7973
  return subset(list, 0, list.length-1);
8004
7974
  }
8005
7975
 
8006
- static public float[] shorten(float list[]) {
7976
+ static public float[] shorten(float[] list) {
8007
7977
  return subset(list, 0, list.length-1);
8008
7978
  }
8009
7979
 
8010
- static public String[] shorten(String list[]) {
7980
+ static public String[] shorten(String[] list) {
8011
7981
  return subset(list, 0, list.length-1);
8012
7982
  }
8013
7983
 
@@ -8024,7 +7994,7 @@ public class PApplet implements PConstants {
8024
7994
  * parameters must be of the same datatype. The <b>array</b> parameter
8025
7995
  * defines the array which will be modified and the second parameter
8026
7996
  * defines the data which will be inserted.
8027
- * <br/> <br/>
7997
+ *
8028
7998
  * When using an array of objects, the data returned from the function must
8029
7999
  * be cast to the object array's data type. For example: <em>SomeClass[]
8030
8000
  * items = (SomeClass[]) splice(array1, array2, index)</em>.
@@ -8037,9 +8007,9 @@ public class PApplet implements PConstants {
8037
8007
  * @see PApplet#concat(boolean[], boolean[])
8038
8008
  * @see PApplet#subset(boolean[], int, int)
8039
8009
  */
8040
- static final public boolean[] splice(boolean list[],
8010
+ static final public boolean[] splice(boolean[] list,
8041
8011
  boolean value, int index) {
8042
- boolean outgoing[] = new boolean[list.length + 1];
8012
+ boolean[] outgoing = new boolean[list.length + 1];
8043
8013
  System.arraycopy(list, 0, outgoing, 0, index);
8044
8014
  outgoing[index] = value;
8045
8015
  System.arraycopy(list, index, outgoing, index + 1,
@@ -8047,9 +8017,9 @@ public class PApplet implements PConstants {
8047
8017
  return outgoing;
8048
8018
  }
8049
8019
 
8050
- static final public boolean[] splice(boolean list[],
8051
- boolean value[], int index) {
8052
- boolean outgoing[] = new boolean[list.length + value.length];
8020
+ static final public boolean[] splice(boolean[] list,
8021
+ boolean[] value, int index) {
8022
+ boolean[] outgoing = new boolean[list.length + value.length];
8053
8023
  System.arraycopy(list, 0, outgoing, 0, index);
8054
8024
  System.arraycopy(value, 0, outgoing, index, value.length);
8055
8025
  System.arraycopy(list, index, outgoing, index + value.length,
@@ -8057,9 +8027,9 @@ public class PApplet implements PConstants {
8057
8027
  return outgoing;
8058
8028
  }
8059
8029
 
8060
- static final public byte[] splice(byte list[],
8030
+ static final public byte[] splice(byte[] list,
8061
8031
  byte value, int index) {
8062
- byte outgoing[] = new byte[list.length + 1];
8032
+ byte[] outgoing = new byte[list.length + 1];
8063
8033
  System.arraycopy(list, 0, outgoing, 0, index);
8064
8034
  outgoing[index] = value;
8065
8035
  System.arraycopy(list, index, outgoing, index + 1,
@@ -8067,9 +8037,9 @@ public class PApplet implements PConstants {
8067
8037
  return outgoing;
8068
8038
  }
8069
8039
 
8070
- static final public byte[] splice(byte list[],
8071
- byte value[], int index) {
8072
- byte outgoing[] = new byte[list.length + value.length];
8040
+ static final public byte[] splice(byte[] list,
8041
+ byte[] value, int index) {
8042
+ byte[] outgoing = new byte[list.length + value.length];
8073
8043
  System.arraycopy(list, 0, outgoing, 0, index);
8074
8044
  System.arraycopy(value, 0, outgoing, index, value.length);
8075
8045
  System.arraycopy(list, index, outgoing, index + value.length,
@@ -8078,9 +8048,9 @@ public class PApplet implements PConstants {
8078
8048
  }
8079
8049
 
8080
8050
 
8081
- static final public char[] splice(char list[],
8051
+ static final public char[] splice(char[] list,
8082
8052
  char value, int index) {
8083
- char outgoing[] = new char[list.length + 1];
8053
+ char[] outgoing = new char[list.length + 1];
8084
8054
  System.arraycopy(list, 0, outgoing, 0, index);
8085
8055
  outgoing[index] = value;
8086
8056
  System.arraycopy(list, index, outgoing, index + 1,
@@ -8088,9 +8058,9 @@ public class PApplet implements PConstants {
8088
8058
  return outgoing;
8089
8059
  }
8090
8060
 
8091
- static final public char[] splice(char list[],
8092
- char value[], int index) {
8093
- char outgoing[] = new char[list.length + value.length];
8061
+ static final public char[] splice(char[] list,
8062
+ char[] value, int index) {
8063
+ char[] outgoing = new char[list.length + value.length];
8094
8064
  System.arraycopy(list, 0, outgoing, 0, index);
8095
8065
  System.arraycopy(value, 0, outgoing, index, value.length);
8096
8066
  System.arraycopy(list, index, outgoing, index + value.length,
@@ -8098,9 +8068,9 @@ public class PApplet implements PConstants {
8098
8068
  return outgoing;
8099
8069
  }
8100
8070
 
8101
- static final public int[] splice(int list[],
8071
+ static final public int[] splice(int[] list,
8102
8072
  int value, int index) {
8103
- int outgoing[] = new int[list.length + 1];
8073
+ int[] outgoing = new int[list.length + 1];
8104
8074
  System.arraycopy(list, 0, outgoing, 0, index);
8105
8075
  outgoing[index] = value;
8106
8076
  System.arraycopy(list, index, outgoing, index + 1,
@@ -8108,9 +8078,9 @@ public class PApplet implements PConstants {
8108
8078
  return outgoing;
8109
8079
  }
8110
8080
 
8111
- static final public int[] splice(int list[],
8112
- int value[], int index) {
8113
- int outgoing[] = new int[list.length + value.length];
8081
+ static final public int[] splice(int[] list,
8082
+ int[] value, int index) {
8083
+ int[] outgoing = new int[list.length + value.length];
8114
8084
  System.arraycopy(list, 0, outgoing, 0, index);
8115
8085
  System.arraycopy(value, 0, outgoing, index, value.length);
8116
8086
  System.arraycopy(list, index, outgoing, index + value.length,
@@ -8118,9 +8088,9 @@ public class PApplet implements PConstants {
8118
8088
  return outgoing;
8119
8089
  }
8120
8090
 
8121
- static final public float[] splice(float list[],
8091
+ static final public float[] splice(float[] list,
8122
8092
  float value, int index) {
8123
- float outgoing[] = new float[list.length + 1];
8093
+ float[] outgoing = new float[list.length + 1];
8124
8094
  System.arraycopy(list, 0, outgoing, 0, index);
8125
8095
  outgoing[index] = value;
8126
8096
  System.arraycopy(list, index, outgoing, index + 1,
@@ -8128,9 +8098,9 @@ public class PApplet implements PConstants {
8128
8098
  return outgoing;
8129
8099
  }
8130
8100
 
8131
- static final public float[] splice(float list[],
8132
- float value[], int index) {
8133
- float outgoing[] = new float[list.length + value.length];
8101
+ static final public float[] splice(float[] list,
8102
+ float[] value, int index) {
8103
+ float[] outgoing = new float[list.length + value.length];
8134
8104
  System.arraycopy(list, 0, outgoing, 0, index);
8135
8105
  System.arraycopy(value, 0, outgoing, index, value.length);
8136
8106
  System.arraycopy(list, index, outgoing, index + value.length,
@@ -8138,9 +8108,9 @@ public class PApplet implements PConstants {
8138
8108
  return outgoing;
8139
8109
  }
8140
8110
 
8141
- static final public String[] splice(String list[],
8111
+ static final public String[] splice(String[] list,
8142
8112
  String value, int index) {
8143
- String outgoing[] = new String[list.length + 1];
8113
+ String[] outgoing = new String[list.length + 1];
8144
8114
  System.arraycopy(list, 0, outgoing, 0, index);
8145
8115
  outgoing[index] = value;
8146
8116
  System.arraycopy(list, index, outgoing, index + 1,
@@ -8148,9 +8118,9 @@ public class PApplet implements PConstants {
8148
8118
  return outgoing;
8149
8119
  }
8150
8120
 
8151
- static final public String[] splice(String list[],
8152
- String value[], int index) {
8153
- String outgoing[] = new String[list.length + value.length];
8121
+ static final public String[] splice(String[] list,
8122
+ String[] value, int index) {
8123
+ String[] outgoing = new String[list.length + value.length];
8154
8124
  System.arraycopy(list, 0, outgoing, 0, index);
8155
8125
  System.arraycopy(value, 0, outgoing, index, value.length);
8156
8126
  System.arraycopy(list, index, outgoing, index + value.length,
@@ -8196,7 +8166,7 @@ public class PApplet implements PConstants {
8196
8166
  * from the <b>offset</b> to the end of the array. When specifying the
8197
8167
  * <b>offset</b> remember the first array element is 0. This function does
8198
8168
  * not change the source array.
8199
- * <br/> <br/>
8169
+ *
8200
8170
  * When using an array of objects, the data returned from the function must
8201
8171
  * be cast to the object array's data type. For example: <em>SomeClass[]
8202
8172
  * items = (SomeClass[]) subset(originalArray, 0, 4)</em>.
@@ -8319,7 +8289,7 @@ public class PApplet implements PConstants {
8319
8289
  * Concatenates two arrays. For example, concatenating the array { 1, 2, 3
8320
8290
  * } and the array { 4, 5, 6 } yields { 1, 2, 3, 4, 5, 6 }. Both parameters
8321
8291
  * must be arrays of the same datatype.
8322
- * <br/> <br/>
8292
+ *
8323
8293
  * When using an array of objects, the data returned from the function must
8324
8294
  * be cast to the object array's data type. For example: <em>SomeClass[]
8325
8295
  * items = (SomeClass[]) concat(array1, array2)</em>.
@@ -8331,43 +8301,43 @@ public class PApplet implements PConstants {
8331
8301
  * @see PApplet#splice(boolean[], boolean, int)
8332
8302
  * @see PApplet#arrayCopy(Object, int, Object, int, int)
8333
8303
  */
8334
- static public boolean[] concat(boolean a[], boolean b[]) {
8335
- boolean c[] = new boolean[a.length + b.length];
8304
+ static public boolean[] concat(boolean[] a, boolean[] b) {
8305
+ boolean[] c = new boolean[a.length + b.length];
8336
8306
  System.arraycopy(a, 0, c, 0, a.length);
8337
8307
  System.arraycopy(b, 0, c, a.length, b.length);
8338
8308
  return c;
8339
8309
  }
8340
8310
 
8341
- static public byte[] concat(byte a[], byte b[]) {
8342
- byte c[] = new byte[a.length + b.length];
8311
+ static public byte[] concat(byte[] a, byte[] b) {
8312
+ byte[] c = new byte[a.length + b.length];
8343
8313
  System.arraycopy(a, 0, c, 0, a.length);
8344
8314
  System.arraycopy(b, 0, c, a.length, b.length);
8345
8315
  return c;
8346
8316
  }
8347
8317
 
8348
- static public char[] concat(char a[], char b[]) {
8349
- char c[] = new char[a.length + b.length];
8318
+ static public char[] concat(char[] a, char[] b) {
8319
+ char[] c = new char[a.length + b.length];
8350
8320
  System.arraycopy(a, 0, c, 0, a.length);
8351
8321
  System.arraycopy(b, 0, c, a.length, b.length);
8352
8322
  return c;
8353
8323
  }
8354
8324
 
8355
- static public int[] concat(int a[], int b[]) {
8356
- int c[] = new int[a.length + b.length];
8325
+ static public int[] concat(int[] a, int[] b) {
8326
+ int[] c = new int[a.length + b.length];
8357
8327
  System.arraycopy(a, 0, c, 0, a.length);
8358
8328
  System.arraycopy(b, 0, c, a.length, b.length);
8359
8329
  return c;
8360
8330
  }
8361
8331
 
8362
- static public float[] concat(float a[], float b[]) {
8363
- float c[] = new float[a.length + b.length];
8332
+ static public float[] concat(float[] a, float[] b) {
8333
+ float[] c = new float[a.length + b.length];
8364
8334
  System.arraycopy(a, 0, c, 0, a.length);
8365
8335
  System.arraycopy(b, 0, c, a.length, b.length);
8366
8336
  return c;
8367
8337
  }
8368
8338
 
8369
- static public String[] concat(String a[], String b[]) {
8370
- String c[] = new String[a.length + b.length];
8339
+ static public String[] concat(String[] a, String[] b) {
8340
+ String[] c = new String[a.length + b.length];
8371
8341
  System.arraycopy(a, 0, c, 0, a.length);
8372
8342
  System.arraycopy(b, 0, c, a.length, b.length);
8373
8343
  return c;
@@ -8396,8 +8366,8 @@ public class PApplet implements PConstants {
8396
8366
  * @param list booleans[], bytes[], chars[], ints[], floats[], or Strings[]
8397
8367
  * @see PApplet#sort(String[], int)
8398
8368
  */
8399
- static public boolean[] reverse(boolean list[]) {
8400
- boolean outgoing[] = new boolean[list.length];
8369
+ static public boolean[] reverse(boolean[] list) {
8370
+ boolean[] outgoing = new boolean[list.length];
8401
8371
  int length1 = list.length - 1;
8402
8372
  for (int i = 0; i < list.length; i++) {
8403
8373
  outgoing[i] = list[length1 - i];
@@ -8405,8 +8375,8 @@ public class PApplet implements PConstants {
8405
8375
  return outgoing;
8406
8376
  }
8407
8377
 
8408
- static public byte[] reverse(byte list[]) {
8409
- byte outgoing[] = new byte[list.length];
8378
+ static public byte[] reverse(byte[] list) {
8379
+ byte[] outgoing = new byte[list.length];
8410
8380
  int length1 = list.length - 1;
8411
8381
  for (int i = 0; i < list.length; i++) {
8412
8382
  outgoing[i] = list[length1 - i];
@@ -8414,8 +8384,8 @@ public class PApplet implements PConstants {
8414
8384
  return outgoing;
8415
8385
  }
8416
8386
 
8417
- static public char[] reverse(char list[]) {
8418
- char outgoing[] = new char[list.length];
8387
+ static public char[] reverse(char[] list) {
8388
+ char[] outgoing = new char[list.length];
8419
8389
  int length1 = list.length - 1;
8420
8390
  for (int i = 0; i < list.length; i++) {
8421
8391
  outgoing[i] = list[length1 - i];
@@ -8423,8 +8393,8 @@ public class PApplet implements PConstants {
8423
8393
  return outgoing;
8424
8394
  }
8425
8395
 
8426
- static public int[] reverse(int list[]) {
8427
- int outgoing[] = new int[list.length];
8396
+ static public int[] reverse(int[] list) {
8397
+ int[] outgoing = new int[list.length];
8428
8398
  int length1 = list.length - 1;
8429
8399
  for (int i = 0; i < list.length; i++) {
8430
8400
  outgoing[i] = list[length1 - i];
@@ -8432,8 +8402,8 @@ public class PApplet implements PConstants {
8432
8402
  return outgoing;
8433
8403
  }
8434
8404
 
8435
- static public float[] reverse(float list[]) {
8436
- float outgoing[] = new float[list.length];
8405
+ static public float[] reverse(float[] list) {
8406
+ float[] outgoing = new float[list.length];
8437
8407
  int length1 = list.length - 1;
8438
8408
  for (int i = 0; i < list.length; i++) {
8439
8409
  outgoing[i] = list[length1 - i];
@@ -8441,8 +8411,8 @@ public class PApplet implements PConstants {
8441
8411
  return outgoing;
8442
8412
  }
8443
8413
 
8444
- static public String[] reverse(String list[]) {
8445
- String outgoing[] = new String[list.length];
8414
+ static public String[] reverse(String[] list) {
8415
+ String[] outgoing = new String[list.length];
8446
8416
  int length1 = list.length - 1;
8447
8417
  for (int i = 0; i < list.length; i++) {
8448
8418
  outgoing[i] = list[length1 - i];
@@ -8548,7 +8518,7 @@ public class PApplet implements PConstants {
8548
8518
  * The splitTokens() function splits a String at one or many character
8549
8519
  * "tokens." The <b>tokens</b> parameter specifies the character or
8550
8520
  * characters to be used as a boundary.
8551
- * <br/> <br/>
8521
+ *
8552
8522
  * If no <b>tokens</b> character is specified, any whitespace character is
8553
8523
  * used to split. Whitespace characters include tab (\\t), line feed (\\n),
8554
8524
  * carriage return (\\r), form feed (\\f), and space. To convert a String
@@ -8565,7 +8535,7 @@ public class PApplet implements PConstants {
8565
8535
  */
8566
8536
  static public String[] splitTokens(String value, String delim) {
8567
8537
  StringTokenizer toker = new StringTokenizer(value, delim);
8568
- String pieces[] = new String[toker.countTokens()];
8538
+ String[] pieces = new String[toker.countTokens()];
8569
8539
 
8570
8540
  int index = 0;
8571
8541
  while (toker.hasMoreTokens()) {
@@ -8582,11 +8552,11 @@ public class PApplet implements PConstants {
8582
8552
  * string as the divider. The <b>delim</b> parameter specifies the
8583
8553
  * character or characters that mark the boundaries between each piece. A
8584
8554
  * String[] array is returned that contains each of the pieces.
8585
- * <br/> <br/>
8555
+ *
8586
8556
  * If the result is a set of numbers, you can convert the String[] array to
8587
8557
  * to a float[] or int[] array using the datatype conversion functions
8588
8558
  * <b>int()</b> and <b>float()</b> (see example above).
8589
- * <br/> <br/>
8559
+ *
8590
8560
  * The <b>splitTokens()</b> function works in a similar fashion, except
8591
8561
  * that it splits using a range of characters instead of a specific
8592
8562
  * character or sequence.
@@ -8615,10 +8585,10 @@ public class PApplet implements PConstants {
8615
8585
  if (value == null) return null;
8616
8586
  //return split(what, String.valueOf(delim)); // huh
8617
8587
 
8618
- char chars[] = value.toCharArray();
8588
+ char[] chars = value.toCharArray();
8619
8589
  int splitCount = 0; //1;
8620
- for (int i = 0; i < chars.length; i++) {
8621
- if (chars[i] == delim) splitCount++;
8590
+ for (char ch : chars) {
8591
+ if (ch == delim) splitCount++;
8622
8592
  }
8623
8593
  // make sure that there is something in the input string
8624
8594
  //if (chars.length > 0) {
@@ -8627,12 +8597,12 @@ public class PApplet implements PConstants {
8627
8597
  // on second thought, i don't agree with this, will disable
8628
8598
  //}
8629
8599
  if (splitCount == 0) {
8630
- String splits[] = new String[1];
8600
+ String[] splits = new String[1];
8631
8601
  splits[0] = value;
8632
8602
  return splits;
8633
8603
  }
8634
8604
  //int pieceCount = splitCount + 1;
8635
- String splits[] = new String[splitCount + 1];
8605
+ String[] splits = new String[splitCount + 1];
8636
8606
  int splitIndex = 0;
8637
8607
  int startIndex = 0;
8638
8608
  for (int i = 0; i < chars.length; i++) {
@@ -8670,7 +8640,7 @@ public class PApplet implements PConstants {
8670
8640
  static Pattern matchPattern(String regexp) {
8671
8641
  Pattern p = null;
8672
8642
  if (matchPatterns == null) {
8673
- matchPatterns = new LinkedHashMap<String, Pattern>(16, 0.75f, true) {
8643
+ matchPatterns = new LinkedHashMap<>(16, 0.75f, true) {
8674
8644
  @Override
8675
8645
  protected boolean removeEldestEntry(Map.Entry<String, Pattern> eldest) {
8676
8646
  // Limit the number of match patterns at 10 most recently used
@@ -8873,8 +8843,8 @@ public class PApplet implements PConstants {
8873
8843
  * to zero will return false, and any other value will return true.
8874
8844
  * @return array of boolean elements
8875
8845
  */
8876
- static final public boolean[] parseBoolean(int what[]) {
8877
- boolean outgoing[] = new boolean[what.length];
8846
+ static final public boolean[] parseBoolean(int[] what) {
8847
+ boolean[] outgoing = new boolean[what.length];
8878
8848
  for (int i = 0; i < what.length; i++) {
8879
8849
  outgoing[i] = (what[i] != 0);
8880
8850
  }
@@ -8892,8 +8862,8 @@ public class PApplet implements PConstants {
8892
8862
  }
8893
8863
  */
8894
8864
 
8895
- static final public boolean[] parseBoolean(String what[]) {
8896
- boolean outgoing[] = new boolean[what.length];
8865
+ static final public boolean[] parseBoolean(String[] what) {
8866
+ boolean[] outgoing = new boolean[what.length];
8897
8867
  for (int i = 0; i < what.length; i++) {
8898
8868
  outgoing[i] = Boolean.parseBoolean(what[i]);
8899
8869
  }
@@ -8927,32 +8897,32 @@ public class PApplet implements PConstants {
8927
8897
 
8928
8898
  // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8929
8899
 
8930
- static final public byte[] parseByte(boolean what[]) {
8931
- byte outgoing[] = new byte[what.length];
8900
+ static final public byte[] parseByte(boolean[] what) {
8901
+ byte[] outgoing = new byte[what.length];
8932
8902
  for (int i = 0; i < what.length; i++) {
8933
8903
  outgoing[i] = what[i] ? (byte)1 : 0;
8934
8904
  }
8935
8905
  return outgoing;
8936
8906
  }
8937
8907
 
8938
- static final public byte[] parseByte(char what[]) {
8939
- byte outgoing[] = new byte[what.length];
8908
+ static final public byte[] parseByte(char[] what) {
8909
+ byte[] outgoing = new byte[what.length];
8940
8910
  for (int i = 0; i < what.length; i++) {
8941
8911
  outgoing[i] = (byte) what[i];
8942
8912
  }
8943
8913
  return outgoing;
8944
8914
  }
8945
8915
 
8946
- static final public byte[] parseByte(int what[]) {
8947
- byte outgoing[] = new byte[what.length];
8916
+ static final public byte[] parseByte(int[] what) {
8917
+ byte[] outgoing = new byte[what.length];
8948
8918
  for (int i = 0; i < what.length; i++) {
8949
8919
  outgoing[i] = (byte) what[i];
8950
8920
  }
8951
8921
  return outgoing;
8952
8922
  }
8953
8923
 
8954
- static final public byte[] parseByte(float what[]) {
8955
- byte outgoing[] = new byte[what.length];
8924
+ static final public byte[] parseByte(float[] what) {
8925
+ byte[] outgoing = new byte[what.length];
8956
8926
  for (int i = 0; i < what.length; i++) {
8957
8927
  outgoing[i] = (byte) what[i];
8958
8928
  }
@@ -9007,8 +8977,8 @@ public class PApplet implements PConstants {
9007
8977
  }
9008
8978
  */
9009
8979
 
9010
- static final public char[] parseChar(byte what[]) {
9011
- char outgoing[] = new char[what.length];
8980
+ static final public char[] parseChar(byte[] what) {
8981
+ char[] outgoing = new char[what.length];
9012
8982
  for (int i = 0; i < what.length; i++) {
9013
8983
  outgoing[i] = (char) (what[i] & 0xff);
9014
8984
  }
@@ -9024,8 +8994,8 @@ public class PApplet implements PConstants {
9024
8994
  }
9025
8995
 
9026
8996
  /*
9027
- static final public char[] parseChar(float what[]) { // nonsensical
9028
- char outgoing[] = new char[what.length];
8997
+ static final public char[] parseChar(int[] what) {
8998
+ char[] outgoing = new char[what.length];
9029
8999
  for (int i = 0; i < what.length; i++) {
9030
9000
  outgoing[i] = (char) what[i];
9031
9001
  }
@@ -9095,32 +9065,32 @@ public class PApplet implements PConstants {
9095
9065
 
9096
9066
  // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9097
9067
 
9098
- static final public int[] parseInt(boolean what[]) {
9099
- int list[] = new int[what.length];
9068
+ static final public int[] parseInt(boolean[] what) {
9069
+ int[] list = new int[what.length];
9100
9070
  for (int i = 0; i < what.length; i++) {
9101
9071
  list[i] = what[i] ? 1 : 0;
9102
9072
  }
9103
9073
  return list;
9104
9074
  }
9105
9075
 
9106
- static final public int[] parseInt(byte what[]) { // note this unsigns
9107
- int list[] = new int[what.length];
9076
+ static final public int[] parseInt(byte[] what) { // note this unsigns
9077
+ int[] list = new int[what.length];
9108
9078
  for (int i = 0; i < what.length; i++) {
9109
9079
  list[i] = (what[i] & 0xff);
9110
9080
  }
9111
9081
  return list;
9112
9082
  }
9113
9083
 
9114
- static final public int[] parseInt(char what[]) {
9115
- int list[] = new int[what.length];
9084
+ static final public int[] parseInt(char[] what) {
9085
+ int[] list = new int[what.length];
9116
9086
  for (int i = 0; i < what.length; i++) {
9117
9087
  list[i] = what[i];
9118
9088
  }
9119
9089
  return list;
9120
9090
  }
9121
9091
 
9122
- static public int[] parseInt(float what[]) {
9123
- int inties[] = new int[what.length];
9092
+ static public int[] parseInt(float[] what) {
9093
+ int[] inties = new int[what.length];
9124
9094
  for (int i = 0; i < what.length; i++) {
9125
9095
  inties[i] = (int)what[i];
9126
9096
  }
@@ -9136,7 +9106,7 @@ public class PApplet implements PConstants {
9136
9106
  *
9137
9107
  * numbers will contain { 1, 300, 44 }
9138
9108
  */
9139
- static public int[] parseInt(String what[]) {
9109
+ static public int[] parseInt(String[] what) {
9140
9110
  return parseInt(what, 0);
9141
9111
  }
9142
9112
 
@@ -9150,8 +9120,8 @@ public class PApplet implements PConstants {
9150
9120
  *
9151
9121
  * numbers will contain { 1, 300, 9999, 44 }
9152
9122
  */
9153
- static public int[] parseInt(String what[], int missing) {
9154
- int output[] = new int[what.length];
9123
+ static public int[] parseInt(String[] what, int missing) {
9124
+ int[] output = new int[what.length];
9155
9125
  for (int i = 0; i < what.length; i++) {
9156
9126
  try {
9157
9127
  output[i] = Integer.parseInt(what[i]);
@@ -9192,46 +9162,28 @@ public class PApplet implements PConstants {
9192
9162
 
9193
9163
  // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9194
9164
 
9195
- /*
9196
- static final public float[] parseFloat(boolean what[]) {
9197
- float floaties[] = new float[what.length];
9198
- for (int i = 0; i < what.length; i++) {
9199
- floaties[i] = what[i] ? 1 : 0;
9200
- }
9201
- return floaties;
9202
- }
9203
-
9204
- static final public float[] parseFloat(char what[]) {
9205
- float floaties[] = new float[what.length];
9206
- for (int i = 0; i < what.length; i++) {
9207
- floaties[i] = (char) what[i];
9208
- }
9209
- return floaties;
9210
- }
9211
- */
9212
-
9213
- static final public float[] parseFloat(byte what[]) {
9214
- float floaties[] = new float[what.length];
9165
+ static final public float[] parseFloat(byte[] what) {
9166
+ float[] floaties = new float[what.length];
9215
9167
  for (int i = 0; i < what.length; i++) {
9216
9168
  floaties[i] = what[i];
9217
9169
  }
9218
9170
  return floaties;
9219
9171
  }
9220
9172
 
9221
- static final public float[] parseFloat(int what[]) {
9222
- float floaties[] = new float[what.length];
9173
+ static final public float[] parseFloat(int[] what) {
9174
+ float[] floaties = new float[what.length];
9223
9175
  for (int i = 0; i < what.length; i++) {
9224
9176
  floaties[i] = what[i];
9225
9177
  }
9226
9178
  return floaties;
9227
9179
  }
9228
9180
 
9229
- static final public float[] parseFloat(String what[]) {
9181
+ static final public float[] parseFloat(String[] what) {
9230
9182
  return parseFloat(what, Float.NaN);
9231
9183
  }
9232
9184
 
9233
- static final public float[] parseFloat(String what[], float missing) {
9234
- float output[] = new float[what.length];
9185
+ static final public float[] parseFloat(String[] what, float missing) {
9186
+ float[] output = new float[what.length];
9235
9187
  for (int i = 0; i < what.length; i++) {
9236
9188
  try {
9237
9189
  output[i] = Float.parseFloat(what[i]);
@@ -9266,32 +9218,32 @@ public class PApplet implements PConstants {
9266
9218
 
9267
9219
  // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9268
9220
 
9269
- static final public String[] str(boolean x[]) {
9270
- String s[] = new String[x.length];
9221
+ static final public String[] str(boolean[] x) {
9222
+ String[] s = new String[x.length];
9271
9223
  for (int i = 0; i < x.length; i++) s[i] = String.valueOf(x[i]);
9272
9224
  return s;
9273
9225
  }
9274
9226
 
9275
- static final public String[] str(byte x[]) {
9276
- String s[] = new String[x.length];
9227
+ static final public String[] str(byte[] x) {
9228
+ String[] s = new String[x.length];
9277
9229
  for (int i = 0; i < x.length; i++) s[i] = String.valueOf(x[i]);
9278
9230
  return s;
9279
9231
  }
9280
9232
 
9281
- static final public String[] str(char x[]) {
9282
- String s[] = new String[x.length];
9233
+ static final public String[] str(char[] x) {
9234
+ String[] s = new String[x.length];
9283
9235
  for (int i = 0; i < x.length; i++) s[i] = String.valueOf(x[i]);
9284
9236
  return s;
9285
9237
  }
9286
9238
 
9287
- static final public String[] str(int x[]) {
9288
- String s[] = new String[x.length];
9239
+ static final public String[] str(int[] x) {
9240
+ String[] s = new String[x.length];
9289
9241
  for (int i = 0; i < x.length; i++) s[i] = String.valueOf(x[i]);
9290
9242
  return s;
9291
9243
  }
9292
9244
 
9293
- static final public String[] str(float x[]) {
9294
- String s[] = new String[x.length];
9245
+ static final public String[] str(float[] x) {
9246
+ String[] s = new String[x.length];
9295
9247
  for (int i = 0; i < x.length; i++) s[i] = String.valueOf(x[i]);
9296
9248
  return s;
9297
9249
  }
@@ -9348,8 +9300,8 @@ public class PApplet implements PConstants {
9348
9300
  * @see <a href="https://processing.org/reference/intconvert_.html">int(float)</a>
9349
9301
  */
9350
9302
 
9351
- static public String[] nf(int nums[], int digits) {
9352
- String formatted[] = new String[nums.length];
9303
+ static public String[] nf(int[] nums, int digits) {
9304
+ String[] formatted = new String[nums.length];
9353
9305
  for (int i = 0; i < formatted.length; i++) {
9354
9306
  formatted[i] = nf(nums[i], digits);
9355
9307
  }
@@ -9381,7 +9333,7 @@ public class PApplet implements PConstants {
9381
9333
  * appropriate commas to mark units of 1000. There are two versions, one
9382
9334
  * for formatting ints and one for formatting an array of ints. The value
9383
9335
  * for the <b>digits</b> parameter should always be a positive integer.
9384
- * <br/><br/>
9336
+ *
9385
9337
  * For a non-US locale, this will insert periods instead of commas, or
9386
9338
  * whatever is apprioriate for that region.
9387
9339
  *
@@ -9392,8 +9344,8 @@ public class PApplet implements PConstants {
9392
9344
  * @see PApplet#nfp(float, int, int)
9393
9345
  * @see PApplet#nfs(float, int, int)
9394
9346
  */
9395
- static public String[] nfc(int nums[]) {
9396
- String formatted[] = new String[nums.length];
9347
+ static public String[] nfc(int[] nums) {
9348
+ String[] formatted = new String[nums.length];
9397
9349
  for (int i = 0; i < formatted.length; i++) {
9398
9350
  formatted[i] = nfc(nums[i]);
9399
9351
  }
@@ -9452,8 +9404,8 @@ public class PApplet implements PConstants {
9452
9404
  /**
9453
9405
  * @param nums the numbers to format
9454
9406
  */
9455
- static public String[] nfs(int nums[], int digits) {
9456
- String formatted[] = new String[nums.length];
9407
+ static public String[] nfs(int[] nums, int digits) {
9408
+ String[] formatted = new String[nums.length];
9457
9409
  for (int i = 0; i < formatted.length; i++) {
9458
9410
  formatted[i] = nfs(nums[i], digits);
9459
9411
  }
@@ -9490,8 +9442,8 @@ public class PApplet implements PConstants {
9490
9442
  /**
9491
9443
  * @param nums the numbers to format
9492
9444
  */
9493
- static public String[] nfp(int nums[], int digits) {
9494
- String formatted[] = new String[nums.length];
9445
+ static public String[] nfp(int[] nums, int digits) {
9446
+ String[] formatted = new String[nums.length];
9495
9447
  for (int i = 0; i < formatted.length; i++) {
9496
9448
  formatted[i] = nfp(nums[i], digits);
9497
9449
  }
@@ -9512,8 +9464,8 @@ public class PApplet implements PConstants {
9512
9464
  * @param left number of digits to the left of the decimal point
9513
9465
  * @param right number of digits to the right of the decimal point
9514
9466
  */
9515
- static public String[] nf(float nums[], int left, int right) {
9516
- String formatted[] = new String[nums.length];
9467
+ static public String[] nf(float[] nums, int left, int right) {
9468
+ String[] formatted = new String[nums.length];
9517
9469
  for (int i = 0; i < formatted.length; i++) {
9518
9470
  formatted[i] = nf(nums[i], left, right);
9519
9471
  }
@@ -9545,8 +9497,8 @@ public class PApplet implements PConstants {
9545
9497
  /**
9546
9498
  * @param right number of digits to the right of the decimal point
9547
9499
  */
9548
- static public String[] nfc(float nums[], int right) {
9549
- String formatted[] = new String[nums.length];
9500
+ static public String[] nfc(float[] nums, int right) {
9501
+ String[] formatted = new String[nums.length];
9550
9502
  for (int i = 0; i < formatted.length; i++) {
9551
9503
  formatted[i] = nfc(nums[i], right);
9552
9504
  }
@@ -9579,8 +9531,8 @@ public class PApplet implements PConstants {
9579
9531
  * @param left the number of digits to the left of the decimal point
9580
9532
  * @param right the number of digits to the right of the decimal point
9581
9533
  */
9582
- static public String[] nfs(float nums[], int left, int right) {
9583
- String formatted[] = new String[nums.length];
9534
+ static public String[] nfs(float[] nums, int left, int right) {
9535
+ String[] formatted = new String[nums.length];
9584
9536
  for (int i = 0; i < formatted.length; i++) {
9585
9537
  formatted[i] = nfs(nums[i], left, right);
9586
9538
  }
@@ -9595,8 +9547,8 @@ public class PApplet implements PConstants {
9595
9547
  * @param left the number of digits to the left of the decimal point
9596
9548
  * @param right the number of digits to the right of the decimal point
9597
9549
  */
9598
- static public String[] nfp(float nums[], int left, int right) {
9599
- String formatted[] = new String[nums.length];
9550
+ static public String[] nfp(float[] nums, int left, int right) {
9551
+ String[] formatted = new String[nums.length];
9600
9552
  for (int i = 0; i < formatted.length; i++) {
9601
9553
  formatted[i] = nfp(nums[i], left, right);
9602
9554
  }
@@ -9621,7 +9573,7 @@ public class PApplet implements PConstants {
9621
9573
  * equivalent hexadecimal notation. For example color(0, 102, 153) will
9622
9574
  * convert to the String "FF006699". This function can help make your geeky
9623
9575
  * debugging sessions much happier.
9624
- * <br/> <br/>
9576
+ *
9625
9577
  * Note that the maximum number of digits is 8, because an int value can
9626
9578
  * only represent up to 32 bits. Specifying more than eight digits will
9627
9579
  * simply shorten the string to eight anyway.
@@ -9722,7 +9674,7 @@ public class PApplet implements PConstants {
9722
9674
  * equivalent binary notation. For example color(0, 102, 153, 255) will
9723
9675
  * convert to the String "11111111000000000110011010011001". This function
9724
9676
  * can help make your geeky debugging sessions much happier.
9725
- * <br/> <br/>
9677
+ *
9726
9678
  * Note that the maximum number of digits is 32, because an int value can
9727
9679
  * only represent up to 32 bits. Specifying more than 32 digits will simply
9728
9680
  * shorten the string to 32 anyway.
@@ -10074,36 +10026,12 @@ public class PApplet implements PConstants {
10074
10026
  }
10075
10027
 
10076
10028
 
10077
- // Moving this back off the EDT for alpha 10. Not sure if we're helping or
10078
- // hurting, but unless we do, errors inside settings() are never passed
10029
+ // Moving this back off the EDT for 3.0 alpha 10. Not sure if we're helping
10030
+ // or hurting, but unless we do, errors inside settings() are never passed
10079
10031
  // through to the PDE. There are other ways around that, no doubt, but I'm
10080
10032
  // also suspecting that these "not showing up" bugs might be EDT issues.
10081
10033
  static public void runSketch(final String[] args,
10082
10034
  final PApplet constructedSketch) {
10083
- // EventQueue.invokeLater(new Runnable() {
10084
- // public void run() {
10085
- // runSketchEDT(args, constructedSketch);
10086
- // }
10087
- // });
10088
- // }
10089
- //
10090
- //
10091
- // /**
10092
- // * Moving this to the EDT for 3.0a6 because that's the proper thing to do
10093
- // * when messing with Swing components. But mostly we're AWT, so who knows.
10094
- // */
10095
- // static protected void runSketchEDT(final String[] args,
10096
- // final PApplet constructedSketch) {
10097
- // Supposed to help with flicker, but no effect on OS X.
10098
- // TODO IIRC this helped on Windows, but need to double check.
10099
- System.setProperty("sun.awt.noerasebackground", "true");
10100
-
10101
- // Remove 60fps limit on the JavaFX "pulse" timer
10102
- System.setProperty("javafx.animation.fullspeed", "true");
10103
-
10104
- // Doesn't seem to do anything helpful here (that can't be done via Runner)
10105
- //System.setProperty("com.apple.mrj.application.apple.menu.about.name", "potato");
10106
-
10107
10035
  Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
10108
10036
  public void uncaughtException(Thread t, Throwable e) {
10109
10037
  e.printStackTrace();
@@ -10132,16 +10060,6 @@ public class PApplet implements PConstants {
10132
10060
  }
10133
10061
  */
10134
10062
 
10135
- // Catch any HeadlessException to provide more useful feedback
10136
- try {
10137
- // Call validate() while resize events are in progress
10138
- Toolkit.getDefaultToolkit().setDynamicLayout(true);
10139
- } catch (HeadlessException e) {
10140
- System.err.println("Cannot run sketch without a display. Read this for possible solutions:");
10141
- System.err.println("https://github.com/processing/processing/wiki/Running-without-a-Display");
10142
- System.exit(1);
10143
- }
10144
-
10145
10063
  // So that the system proxy setting are used by default
10146
10064
  System.setProperty("java.net.useSystemProxies", "true");
10147
10065
 
@@ -10188,6 +10106,9 @@ public class PApplet implements PConstants {
10188
10106
  displayNum = -1; // use the default
10189
10107
  }
10190
10108
 
10109
+ } else if (param.equals(ARGS_DISABLE_AWT)) {
10110
+ disableAWT = true;
10111
+
10191
10112
  } else if (param.equals(ARGS_WINDOW_COLOR)) {
10192
10113
  if (value.charAt(0) == '#' && value.length() == 7) {
10193
10114
  value = value.substring(1);
@@ -10241,16 +10162,9 @@ public class PApplet implements PConstants {
10241
10162
  argIndex++;
10242
10163
  }
10243
10164
 
10244
- // // Now that sketch path is passed in args after the sketch name
10245
- // // it's not set in the above loop(the above loop breaks after
10246
- // // finding sketch name). So setting sketch path here.
10247
- // // https://github.com/processing/processing/commit/0a14835e6f5f4766b022e73a8fe562318636727c
10248
- // // TODO this is a hack added for PDE X and needs to be removed [fry 141104]
10249
- // for (int i = 0; i < args.length; i++) {
10250
- // if (args[i].startsWith(ARGS_SKETCH_FOLDER)){
10251
- // folder = args[i].substring(args[i].indexOf('=') + 1);
10252
- // }
10253
- // }
10165
+ if (!disableAWT) {
10166
+ ShimAWT.initRun();
10167
+ }
10254
10168
 
10255
10169
  final PApplet sketch;
10256
10170
  if (constructedSketch != null) {
@@ -10269,14 +10183,16 @@ public class PApplet implements PConstants {
10269
10183
  }
10270
10184
  }
10271
10185
 
10272
- if (platform == MACOSX) {
10186
+ // TODO When disabling AWT for LWJGL or others, we need to figure out
10187
+ // how to make Cmd-Q and the rest of this still work properly.
10188
+ if (platform == MACOS && !disableAWT) {
10273
10189
  try {
10274
10190
  final String td = "processing.core.ThinkDifferent";
10275
10191
  Class<?> thinkDifferent =
10276
10192
  Thread.currentThread().getContextClassLoader().loadClass(td);
10277
10193
  Method method =
10278
- thinkDifferent.getMethod("init", new Class[] { PApplet.class });
10279
- method.invoke(null, new Object[] { sketch });
10194
+ thinkDifferent.getMethod("init", PApplet.class);
10195
+ method.invoke(null, sketch);
10280
10196
  } catch (Exception e) {
10281
10197
  e.printStackTrace(); // That's unfortunate
10282
10198
  }
@@ -10309,25 +10225,7 @@ public class PApplet implements PConstants {
10309
10225
  }
10310
10226
 
10311
10227
  // Call the settings() method which will give us our size() call
10312
- // try {
10313
10228
  sketch.handleSettings();
10314
- // } catch (Throwable t) {
10315
- // System.err.println("I think I'm gonna hurl");
10316
- // }
10317
-
10318
- //// sketch.spanDisplays = spanDisplays;
10319
- // // If spanning screens, that means we're also full screen.
10320
- //// fullScreen |= spanDisplays;
10321
- // if (spanDisplays) {
10322
- // displayIndex = SPAN;
10323
- //// fullScreen = true;
10324
- // }
10325
-
10326
- // // If the applet doesn't call for full screen, but the command line does,
10327
- // // enable it. Conversely, if the command line does not, don't disable it.
10328
- // // Query the applet to see if it wants to be full screen all the time.
10329
- // //fullScreen |= sketch.sketchFullScreen();
10330
- // sketch.fullScreen |= fullScreen;
10331
10229
 
10332
10230
  sketch.external = external;
10333
10231
 
@@ -10336,22 +10234,6 @@ public class PApplet implements PConstants {
10336
10234
  }
10337
10235
 
10338
10236
  final PSurface surface = sketch.initSurface();
10339
- // sketch.initSurface(windowColor, displayIndex, fullScreen, spanDisplays);
10340
-
10341
- /*
10342
- // Wait until the applet has figured out its width. In a static mode app,
10343
- // everything happens inside setup(), so this will be after setup() has
10344
- // completed, and the empty draw() has set "finished" to true.
10345
- while (sketch.defaultSize && !sketch.finished) {
10346
- //System.out.println("default size");
10347
- try {
10348
- Thread.sleep(5);
10349
-
10350
- } catch (InterruptedException e) {
10351
- //System.out.println("interrupt");
10352
- }
10353
- }
10354
- */
10355
10237
 
10356
10238
  if (present) {
10357
10239
  if (hideStop) {
@@ -10370,14 +10252,6 @@ public class PApplet implements PConstants {
10370
10252
 
10371
10253
  sketch.showSurface();
10372
10254
  sketch.startSurface();
10373
- /*
10374
- if (sketch.getGraphics().displayable()) {
10375
- surface.setVisible(true);
10376
- }
10377
-
10378
- //sketch.init();
10379
- surface.startThread();
10380
- */
10381
10255
  }
10382
10256
 
10383
10257
 
@@ -10401,61 +10275,63 @@ public class PApplet implements PConstants {
10401
10275
 
10402
10276
  // Create fake Frame object to warn user about the changes
10403
10277
  if (g.displayable()) {
10404
- frame = new Frame() {
10405
- @Override
10406
- public void setResizable(boolean resizable) {
10407
- deprecationWarning("setResizable");
10408
- surface.setResizable(resizable);
10409
- }
10410
-
10411
- @Override
10412
- public void setVisible(boolean visible) {
10413
- deprecationWarning("setVisible");
10414
- surface.setVisible(visible);
10415
- }
10416
-
10417
- @Override
10418
- public void setTitle(String title) {
10419
- deprecationWarning("setTitle");
10420
- surface.setTitle(title);
10421
- }
10422
-
10423
- @Override
10424
- public void setUndecorated(boolean ignored) {
10425
- throw new RuntimeException("'frame' has been removed from Processing 3, " +
10426
- "use fullScreen() to get an undecorated full screen frame");
10427
- }
10278
+ /*
10279
+ if (!disableAWT) {
10280
+ frame = new Frame() {
10281
+ @Override
10282
+ public void setResizable(boolean resizable) {
10283
+ deprecationWarning("setResizable");
10284
+ surface.setResizable(resizable);
10285
+ }
10428
10286
 
10429
- // Can't override this one because it's called by Window's constructor
10430
- /*
10431
- @Override
10432
- public void setLocation(int x, int y) {
10433
- deprecationWarning("setLocation");
10434
- surface.setLocation(x, y);
10435
- }
10436
- */
10287
+ @Override
10288
+ public void setVisible(boolean visible) {
10289
+ deprecationWarning("setVisible");
10290
+ surface.setVisible(visible);
10291
+ }
10437
10292
 
10438
- @Override
10439
- public void setSize(int w, int h) {
10440
- deprecationWarning("setSize");
10441
- surface.setSize(w, h);
10442
- }
10293
+ @Override
10294
+ public void setTitle(String title) {
10295
+ deprecationWarning("setTitle");
10296
+ surface.setTitle(title);
10297
+ }
10443
10298
 
10444
- private void deprecationWarning(String method) {
10445
- PGraphics.showWarning("Use surface." + method + "() instead of " +
10446
- "frame." + method + " in Processing 3");
10447
- //new Exception(method).printStackTrace(System.out);
10448
- }
10449
- };
10299
+ @Override
10300
+ public void setUndecorated(boolean ignored) {
10301
+ throw new RuntimeException("'frame' has been removed from Processing 3, " +
10302
+ "use fullScreen() to get an undecorated full screen frame");
10303
+ }
10304
+ */
10305
+ /*
10306
+ // Can't override this one because it's called by Window's constructor
10307
+ @Override
10308
+ public void setLocation(int x, int y) {
10309
+ deprecationWarning("setLocation");
10310
+ surface.setLocation(x, y);
10311
+ }
10312
+ */
10313
+ /*
10314
+ @Override
10315
+ public void setSize(int w, int h) {
10316
+ deprecationWarning("setSize");
10317
+ surface.setSize(w, h);
10318
+ }
10450
10319
 
10451
- surface.initFrame(this); //, backgroundColor, displayNum, fullScreen, spanDisplays);
10320
+ private void deprecationWarning(String method) {
10321
+ PGraphics.showWarning("Use surface." + method + "() instead of " +
10322
+ "frame." + method + " in Processing 3");
10323
+ //new Exception(method).printStackTrace(System.out);
10324
+ }
10325
+ };
10326
+ }
10327
+ */
10328
+ surface.initFrame(this);
10452
10329
  surface.setTitle(getClass().getSimpleName());
10453
10330
 
10454
10331
  } else {
10455
10332
  surface.initOffscreen(this); // for PDF/PSurfaceNone and friends
10456
10333
  }
10457
10334
 
10458
- // init();
10459
10335
  return surface;
10460
10336
  }
10461
10337
 
@@ -10489,7 +10365,7 @@ public class PApplet implements PConstants {
10489
10365
 
10490
10366
  /** Convenience method, should only be called by PSurface subclasses. */
10491
10367
  static public void hideMenuBar() {
10492
- if (PApplet.platform == PConstants.MACOSX) {
10368
+ if (PApplet.platform == PConstants.MACOS) {
10493
10369
  // Call some native code to remove the menu bar on OS X. Not necessary
10494
10370
  // on Linux and Windows, who are happy to make full screen windows.
10495
10371
  japplemenubar.JAppleMenuBar.hide();
@@ -10498,11 +10374,13 @@ public class PApplet implements PConstants {
10498
10374
 
10499
10375
 
10500
10376
  /**
10501
- * Convenience method for Python Mode to run an already-constructed sketch.This makes it makes it easy to launch a sketch in Jython:<pre>class MySketch(PApplet):
10377
+ * Convenience method for Python Mode to run an already-constructed sketch.
10378
+ * This makes it makes it easy to launch a sketch in Jython:
10379
+ *
10380
+ * <pre>class MySketch(PApplet):
10502
10381
  * pass
10503
10382
  *
10504
10383
  *MySketch().runSketch();</pre>
10505
- * @param args
10506
10384
  */
10507
10385
  protected void runSketch(final String[] args) {
10508
10386
  final String[] argsWithSketchName = new String[args.length + 1];
@@ -10515,17 +10393,12 @@ public class PApplet implements PConstants {
10515
10393
  }
10516
10394
 
10517
10395
 
10518
- /** Convenience method for Python Mode */
10519
- protected void runSketch() {
10396
+ /*
10397
+ * Convenience method for propane with jdk9
10398
+ */
10399
+ public void runPropane() {
10520
10400
  runSketch(new String[0]);
10521
10401
  }
10522
-
10523
- /**
10524
- * Convenience method for propane with jdk9
10525
- */
10526
- public void runPropane() {
10527
- runSketch(new String[0]);
10528
- }
10529
10402
 
10530
10403
 
10531
10404
  //////////////////////////////////////////////////////////////
@@ -10685,7 +10558,7 @@ public class PApplet implements PConstants {
10685
10558
  * Loads the pixel data for the display window into the <b>pixels[]</b>
10686
10559
  * array. This function must always be called before reading from or
10687
10560
  * writing to <b>pixels[]</b>.
10688
- * <br/><br/> renderers may or may not seem to require <b>loadPixels()</b>
10561
+ * renderers may or may not seem to require <b>loadPixels()</b>
10689
10562
  * or <b>updatePixels()</b>. However, the rule is that any time you want to
10690
10563
  * manipulate the <b>pixels[]</b> array, you must first call
10691
10564
  * <b>loadPixels()</b>, and after changes have been made, call
@@ -10715,14 +10588,14 @@ public class PApplet implements PConstants {
10715
10588
  * Use in conjunction with <b>loadPixels()</b>. If you're only reading
10716
10589
  * pixels from the array, there's no need to call <b>updatePixels()</b>
10717
10590
  * unless there are changes.
10718
- * <br/><br/> renderers may or may not seem to require <b>loadPixels()</b>
10591
+ * renderers may or may not seem to require <b>loadPixels()</b>
10719
10592
  * or <b>updatePixels()</b>. However, the rule is that any time you want to
10720
10593
  * manipulate the <b>pixels[]</b> array, you must first call
10721
10594
  * <b>loadPixels()</b>, and after changes have been made, call
10722
10595
  * <b>updatePixels()</b>. Even if the renderer may not seem to use this
10723
10596
  * function in the current Processing release, this will always be subject
10724
10597
  * to change.
10725
- * <br/> <br/>
10598
+ *
10726
10599
  * Currently, none of the renderers use the additional parameters to
10727
10600
  * <b>updatePixels()</b>, however this may be implemented in the future.
10728
10601
  *
@@ -10804,12 +10677,12 @@ public class PApplet implements PConstants {
10804
10677
  * specifies a position in 2D and the <b>vertex()</b> function with three
10805
10678
  * parameters specifies a position in 3D. Each shape will be outlined with
10806
10679
  * the current stroke color and filled with the fill color.
10807
- * <br/> <br/>
10680
+ *
10808
10681
  * Transformations such as <b>translate()</b>, <b>rotate()</b>, and
10809
10682
  * <b>scale()</b> do not work within <b>beginShape()</b>. It is also not
10810
10683
  * possible to use other shapes, such as <b>ellipse()</b> or <b>rect()</b>
10811
10684
  * within <b>beginShape()</b>.
10812
- * <br/> <br/>
10685
+ *
10813
10686
  * The P3D renderer settings allow <b>stroke()</b> and <b>fill()</b>
10814
10687
  * settings to be altered per-vertex, however the default P2D renderer does
10815
10688
  * not. Settings such as <b>strokeWeight()</b>, <b>strokeCap()</b>, and
@@ -10949,7 +10822,7 @@ public class PApplet implements PConstants {
10949
10822
  * Sets a texture to be applied to vertex points. The <b>texture()</b>
10950
10823
  * function must be called between <b>beginShape()</b> and
10951
10824
  * <b>endShape()</b> and before any calls to <b>vertex()</b>.
10952
- * <br/> <br/>
10825
+ *
10953
10826
  * When textures are in use, the fill color is ignored. Instead, use tint()
10954
10827
  * to specify the color of the texture as it is applied to the shape.
10955
10828
  *
@@ -11587,6 +11460,29 @@ public class PApplet implements PConstants {
11587
11460
  }
11588
11461
 
11589
11462
 
11463
+ /**
11464
+ * ( begin auto-generated from square.xml )
11465
+ *
11466
+ * Draws a square to the screen. A square is a four-sided shape with
11467
+ * every angle at ninety degrees and each side is the same length.
11468
+ * By default, the first two parameters set the location of the
11469
+ * upper-left corner, the third sets the width and height. The way
11470
+ * these parameters are interpreted, however, may be changed with the
11471
+ * <b>rectMode()</b> function.
11472
+ *
11473
+ * ( end auto-generated )
11474
+ *
11475
+ * @webref shape:2d_primitives
11476
+ * @param x x-coordinate of the rectangle by default
11477
+ * @param y y-coordinate of the rectangle by default
11478
+ * @param extent width and height of the rectangle by default
11479
+ * @see PGraphics#rect(float, float, float, float)
11480
+ * @see PGraphics#rectMode(int)
11481
+ */
11482
+ public void square(float x, float y, float extent) {
11483
+ if (recorder != null) recorder.square(x, y, extent);
11484
+ g.square(x, y, extent);
11485
+ }
11590
11486
 
11591
11487
 
11592
11488
  /**
@@ -11677,6 +11573,27 @@ public class PApplet implements PConstants {
11677
11573
  }
11678
11574
 
11679
11575
 
11576
+ /**
11577
+ * ( begin auto-generated from circle.xml )
11578
+ *
11579
+ * Draws a circle to the screen. By default, the first two parameters
11580
+ * set the location of the center, and the third sets the shape's width
11581
+ * and height. The origin may be changed with the <b>ellipseMode()</b>
11582
+ * function.
11583
+ *
11584
+ * ( end auto-generated )
11585
+ * @webref shape:2d_primitives
11586
+ * @param x x-coordinate of the ellipse
11587
+ * @param y y-coordinate of the ellipse
11588
+ * @param extent width and height of the ellipse by default
11589
+ * @see PApplet#ellipse(float, float, float, float)
11590
+ * @see PApplet#ellipseMode(int)
11591
+ */
11592
+ public void circle(float x, float y, float extent) {
11593
+ if (recorder != null) recorder.circle(x, y, extent);
11594
+ g.circle(x, y, extent);
11595
+ }
11596
+
11680
11597
 
11681
11598
  /**
11682
11599
  * ( begin auto-generated from box.xml )
@@ -11957,17 +11874,17 @@ public class PApplet implements PConstants {
11957
11874
  * ( begin auto-generated from curvePoint.xml )
11958
11875
  *
11959
11876
  * Evalutes the curve at point t for points a, b, c, d. The parameter t
11960
- * varies between 0 and 1, a and d are points on the curve, and b and c are
11961
- * the control points. This can be done once with the x coordinates and a
11877
+ * varies between 0 and 1, a and d are the control points, and b and c are
11878
+ * the points on the curve. This can be done once with the x coordinates and a
11962
11879
  * second time with the y coordinates to get the location of a curve at t.
11963
11880
  *
11964
11881
  * ( end auto-generated )
11965
11882
  *
11966
11883
  * @webref shape:curves
11967
- * @param a coordinate of first point on the curve
11968
- * @param b coordinate of second point on the curve
11969
- * @param c coordinate of third point on the curve
11970
- * @param d coordinate of fourth point on the curve
11884
+ * @param a coordinate of first control point
11885
+ * @param b coordinate of first point on the curve
11886
+ * @param c coordinate of second point on the curve
11887
+ * @param d coordinate of second control point
11971
11888
  * @param t value between 0 and 1
11972
11889
  * @see PGraphics#curve(float, float, float, float, float, float, float, float, float, float, float, float)
11973
11890
  * @see PGraphics#curveVertex(float, float)
@@ -12312,7 +12229,7 @@ public class PApplet implements PConstants {
12312
12229
  * CENTER, and RIGHT set the display characteristics of the letters in
12313
12230
  * relation to the values for the <b>x</b> and <b>y</b> parameters of the
12314
12231
  * <b>text()</b> function.
12315
- * <br/> <br/>
12232
+ *
12316
12233
  * In Processing 0125 and later, an optional second parameter can be used
12317
12234
  * to vertically align the text. BASELINE is the default, and the vertical
12318
12235
  * alignment will be reset to BASELINE if the second parameter is not used.
@@ -12320,12 +12237,12 @@ public class PApplet implements PConstants {
12320
12237
  * offsets the line based on the current <b>textDescent()</b>. For multiple
12321
12238
  * lines, the final line will be aligned to the bottom, with the previous
12322
12239
  * lines appearing above it.
12323
- * <br/> <br/>
12240
+ *
12324
12241
  * When using <b>text()</b> with width and height parameters, BASELINE is
12325
12242
  * ignored, and treated as TOP. (Otherwise, text would by default draw
12326
12243
  * outside the box, since BASELINE is the default setting. BASELINE is not
12327
12244
  * a useful drawing mode for text drawn in a rectangle.)
12328
- * <br/> <br/>
12245
+ *
12329
12246
  * The vertical alignment is based on the value of <b>textAscent()</b>,
12330
12247
  * which many fonts do not specify correctly. It may be necessary to use a
12331
12248
  * hack and offset by a few pixels by hand so that the offset looks
@@ -12699,6 +12616,83 @@ public class PApplet implements PConstants {
12699
12616
  g.text(num, x, y, z);
12700
12617
  }
12701
12618
 
12619
+
12620
+ /**
12621
+ * ( begin auto-generated from push.xml )
12622
+ *
12623
+ * The <b>push()</b> function saves the current drawing style
12624
+ * settings and transformations, while <b>pop()</b> restores these
12625
+ * settings. Note that these functions are always used together.
12626
+ * They allow you to change the style and transformation settings
12627
+ * and later return to what you had. When a new state is started
12628
+ * with push(), it builds on the current style and transform
12629
+ * information.
12630
+ *
12631
+ * <b>push()</b> stores information related to the current
12632
+ * transformation state and style settings controlled by the
12633
+ * following functions: <b>rotate()</b>, <b>translate()</b>,
12634
+ * <b>scale()</b>, <b>fill()</b>, <b>stroke()</b>, <b>tint()</b>,
12635
+ * <b>strokeWeight()</b>, <b>strokeCap()</b>, <b>strokeJoin()</b>,
12636
+ * <b>imageMode()</b>, <b>rectMode()</b>, <b>ellipseMode()</b>,
12637
+ * <b>colorMode()</b>, <b>textAlign()</b>, <b>textFont()</b>,
12638
+ * <b>textMode()</b>, <b>textSize()</b>, <b>textLeading()</b>.
12639
+ *
12640
+ * The <b>push()</b> and <b>pop()</b> functions were added with
12641
+ * Processing 3.5. They can be used in place of <b>pushMatrix()</b>,
12642
+ * <b>popMatrix()</b>, <b>pushStyles()</b>, and <b>popStyles()</b>.
12643
+ * The difference is that push() and pop() control both the
12644
+ * transformations (rotate, scale, translate) and the drawing styles
12645
+ * at the same time.
12646
+ *
12647
+ * ( end auto-generated )
12648
+ *
12649
+ * @webref structure
12650
+ * @see PGraphics#pop()
12651
+ */
12652
+ public void push() {
12653
+ if (recorder != null) recorder.push();
12654
+ g.push();
12655
+ }
12656
+
12657
+
12658
+ /**
12659
+ * ( begin auto-generated from pop.xml )
12660
+ *
12661
+ * The <b>pop()</b> function restores the previous drawing style
12662
+ * settings and transformations after <b>push()</b> has changed them.
12663
+ * Note that these functions are always used together. They allow
12664
+ * you to change the style and transformation settings and later
12665
+ * return to what you had. When a new state is started with push(),
12666
+ * it builds on the current style and transform information.
12667
+ *
12668
+ *
12669
+ * <b>push()</b> stores information related to the current
12670
+ * transformation state and style settings controlled by the
12671
+ * following functions: <b>rotate()</b>, <b>translate()</b>,
12672
+ * <b>scale()</b>, <b>fill()</b>, <b>stroke()</b>, <b>tint()</b>,
12673
+ * <b>strokeWeight()</b>, <b>strokeCap()</b>, <b>strokeJoin()</b>,
12674
+ * <b>imageMode()</b>, <b>rectMode()</b>, <b>ellipseMode()</b>,
12675
+ * <b>colorMode()</b>, <b>textAlign()</b>, <b>textFont()</b>,
12676
+ * <b>textMode()</b>, <b>textSize()</b>, <b>textLeading()</b>.
12677
+ *
12678
+ * The <b>push()</b> and <b>pop()</b> functions were added with
12679
+ * Processing 3.5. They can be used in place of <b>pushMatrix()</b>,
12680
+ * <b>popMatrix()</b>, <b>pushStyles()</b>, and <b>popStyles()</b>.
12681
+ * The difference is that push() and pop() control both the
12682
+ * transformations (rotate, scale, translate) and the drawing styles
12683
+ * at the same time.
12684
+ *
12685
+ * ( end auto-generated )
12686
+ *
12687
+ * @webref structure
12688
+ * @see PGraphics#push()
12689
+ */
12690
+ public void pop() {
12691
+ if (recorder != null) recorder.pop();
12692
+ g.pop();
12693
+ }
12694
+
12695
+
12702
12696
  /**
12703
12697
  * ( begin auto-generated from pushMatrix.xml )
12704
12698
  *
@@ -12800,7 +12794,7 @@ public class PApplet implements PConstants {
12800
12794
  * Rotates a shape the amount specified by the <b>angle</b> parameter.
12801
12795
  * Angles should be specified in radians (values from 0 to TWO_PI) or
12802
12796
  * converted to radians with the <b>radians()</b> function.
12803
- * <br/> <br/>
12797
+ *
12804
12798
  * Objects are always rotated around their relative position to the origin
12805
12799
  * and positive numbers rotate objects in a clockwise direction.
12806
12800
  * Transformations apply to everything that happens after and subsequent
@@ -12808,7 +12802,7 @@ public class PApplet implements PConstants {
12808
12802
  * <b>rotate(HALF_PI)</b> and then <b>rotate(HALF_PI)</b> is the same as
12809
12803
  * <b>rotate(PI)</b>. All tranformations are reset when <b>draw()</b>
12810
12804
  * begins again.
12811
- * <br/> <br/>
12805
+ *
12812
12806
  * Technically, <b>rotate()</b> multiplies the current transformation
12813
12807
  * matrix by a rotation matrix. This function can be further controlled by
12814
12808
  * the <b>pushMatrix()</b> and <b>popMatrix()</b>.
@@ -13019,7 +13013,7 @@ public class PApplet implements PConstants {
13019
13013
  * <b>shearX(PI/2)</b> and then <b>shearX(PI/2)</b> is the same as
13020
13014
  * <b>shearX(PI)</b>. If <b>shearX()</b> is called within the
13021
13015
  * <b>draw()</b>, the transformation is reset when the loop begins again.
13022
- * <br/> <br/>
13016
+ *
13023
13017
  * Technically, <b>shearX()</b> multiplies the current transformation
13024
13018
  * matrix by a rotation matrix. This function can be further controlled by
13025
13019
  * the <b>pushMatrix()</b> and <b>popMatrix()</b> functions.
@@ -13054,7 +13048,7 @@ public class PApplet implements PConstants {
13054
13048
  * <b>shearY(PI/2)</b> and then <b>shearY(PI/2)</b> is the same as
13055
13049
  * <b>shearY(PI)</b>. If <b>shearY()</b> is called within the
13056
13050
  * <b>draw()</b>, the transformation is reset when the loop begins again.
13057
- * <br/> <br/>
13051
+ *
13058
13052
  * Technically, <b>shearY()</b> multiplies the current transformation
13059
13053
  * matrix by a rotation matrix. This function can be further controlled by
13060
13054
  * the <b>pushMatrix()</b> and <b>popMatrix()</b> functions.
@@ -13564,7 +13558,7 @@ public class PApplet implements PConstants {
13564
13558
  * transformations (scale, rotate, translate, etc.) The X value can be used
13565
13559
  * to place an object in space relative to the location of the original
13566
13560
  * point once the transformations are no longer in use.
13567
- * <br/> <br/>
13561
+ *
13568
13562
  * In the example, the <b>modelX()</b>, <b>modelY()</b>, and
13569
13563
  * <b>modelZ()</b> functions record the location of a box in space after
13570
13564
  * being placed using a series of translate and rotate commands. After
@@ -13708,7 +13702,7 @@ public class PApplet implements PConstants {
13708
13702
  *
13709
13703
  * Sets the width of the stroke used for lines, points, and the border
13710
13704
  * around shapes. All widths are set in units of pixels.
13711
- * <br/> <br/>
13705
+ *
13712
13706
  * When drawing with P3D, series of connected lines (such as the stroke
13713
13707
  * around a polygon, triangle, or ellipse) produce unattractive results
13714
13708
  * when a thick stroke weight is set (<a
@@ -13739,7 +13733,7 @@ public class PApplet implements PConstants {
13739
13733
  * are either mitered, beveled, or rounded and specified with the
13740
13734
  * corresponding parameters MITER, BEVEL, and ROUND. The default joint is
13741
13735
  * MITER.
13742
- * <br/> <br/>
13736
+ *
13743
13737
  * This function is not available with the P3D renderer, (<a
13744
13738
  * href="http://code.google.com/p/processing/issues/detail?id=123">see
13745
13739
  * Issue 123</a>). More information about the renderers can be found in the
@@ -13765,7 +13759,7 @@ public class PApplet implements PConstants {
13765
13759
  * Sets the style for rendering line endings. These ends are either
13766
13760
  * squared, extended, or rounded and specified with the corresponding
13767
13761
  * parameters SQUARE, PROJECT, and ROUND. The default cap is ROUND.
13768
- * <br/> <br/>
13762
+ *
13769
13763
  * This function is not available with the P3D renderer (<a
13770
13764
  * href="http://code.google.com/p/processing/issues/detail?id=123">see
13771
13765
  * Issue 123</a>). More information about the renderers can be found in the
@@ -13812,7 +13806,7 @@ public class PApplet implements PConstants {
13812
13806
  * is either specified in terms of the RGB or HSB color depending on the
13813
13807
  * current <b>colorMode()</b> (the default color space is RGB, with each
13814
13808
  * value in the range from 0 to 255).
13815
- * <br/> <br/>
13809
+ *
13816
13810
  * When using hexadecimal notation to specify a color, use "#" or "0x"
13817
13811
  * before the values (e.g. #CCFFAA, 0xFFCCFFAA). The # syntax uses six
13818
13812
  * digits to specify a color (the way colors are specified in HTML and
@@ -13820,7 +13814,7 @@ public class PApplet implements PConstants {
13820
13814
  * hexadecimal value must be specified with eight characters; the first two
13821
13815
  * characters define the alpha component and the remainder the red, green,
13822
13816
  * and blue components.
13823
- * <br/> <br/>
13817
+ *
13824
13818
  * The value for the parameter "gray" must be less than or equal to the
13825
13819
  * current maximum value as specified by <b>colorMode()</b>. The default
13826
13820
  * maximum value is 255.
@@ -14014,7 +14008,7 @@ public class PApplet implements PConstants {
14014
14008
  * color is either specified in terms of the RGB or HSB color depending on
14015
14009
  * the current <b>colorMode()</b> (the default color space is RGB, with
14016
14010
  * each value in the range from 0 to 255).
14017
- * <br/> <br/>
14011
+ *
14018
14012
  * When using hexadecimal notation to specify a color, use "#" or "0x"
14019
14013
  * before the values (e.g. #CCFFAA, 0xFFCCFFAA). The # syntax uses six
14020
14014
  * digits to specify a color (the way colors are specified in HTML and
@@ -14022,11 +14016,11 @@ public class PApplet implements PConstants {
14022
14016
  * hexadecimal value must be specified with eight characters; the first two
14023
14017
  * characters define the alpha component and the remainder the red, green,
14024
14018
  * and blue components.
14025
- * <br/> <br/>
14019
+ *
14026
14020
  * The value for the parameter "gray" must be less than or equal to the
14027
14021
  * current maximum value as specified by <b>colorMode()</b>. The default
14028
14022
  * maximum value is 255.
14029
- * <br/> <br/>
14023
+ *
14030
14024
  * To change the color of an image (or a texture), use tint().
14031
14025
  *
14032
14026
  * ( end auto-generated )
@@ -14162,6 +14156,8 @@ public class PApplet implements PConstants {
14162
14156
 
14163
14157
  /**
14164
14158
  * gray number specifying value between white and black
14159
+ *
14160
+ * @param gray value between black and white, by default 0 to 255
14165
14161
  */
14166
14162
  public void specular(float gray) {
14167
14163
  if (recorder != null) recorder.specular(gray);
@@ -14227,6 +14223,8 @@ public class PApplet implements PConstants {
14227
14223
 
14228
14224
  /**
14229
14225
  * gray number specifying value between white and black
14226
+ *
14227
+ * @param gray value between black and white, by default 0 to 255
14230
14228
  */
14231
14229
  public void emissive(float gray) {
14232
14230
  if (recorder != null) recorder.emissive(gray);
@@ -14518,13 +14516,13 @@ public class PApplet implements PConstants {
14518
14516
  * of the Processing window. The default background is light gray. In the
14519
14517
  * <b>draw()</b> function, the background color is used to clear the
14520
14518
  * display window at the beginning of each frame.
14521
- * <br/> <br/>
14519
+ *
14522
14520
  * An image can also be used as the background for a sketch, however its
14523
14521
  * width and height must be the same size as the sketch window. To resize
14524
14522
  * an image 'b' to the size of the sketch window, use b.resize(width, height).
14525
- * <br/> <br/>
14523
+ *
14526
14524
  * Images used as background will ignore the current <b>tint()</b> setting.
14527
- * <br/> <br/>
14525
+ *
14528
14526
  * It is not possible to use transparency (alpha) in background colors with
14529
14527
  * the main drawing surface, however they will work properly with <b>createGraphics()</b>.
14530
14528
  *
@@ -14607,13 +14605,13 @@ public class PApplet implements PConstants {
14607
14605
  /**
14608
14606
  * Takes an RGB or ARGB image and sets it as the background.
14609
14607
  * The width and height of the image must be the same size as the sketch.
14610
- * Use image.resize(width, height) to make short work of such a task.<br/>
14611
- * <br/>
14608
+ * Use image.resize(width, height) to make short work of such a task.
14609
+ *
14612
14610
  * Note that even if the image is set as RGB, the high 8 bits of each pixel
14613
14611
  * should be set opaque (0xFF000000) because the image data will be copied
14614
14612
  * directly to the screen, and non-opaque background images may have strange
14615
- * behavior. Use image.filter(OPAQUE) to handle this easily.<br/>
14616
- * <br/>
14613
+ * behavior. Use image.filter(OPAQUE) to handle this easily.
14614
+ *
14617
14615
  * When using 3D, this will also clear the zbuffer (if it exists).
14618
14616
  *
14619
14617
  * @param image PImage to set as background (must be same size as the sketch window)
@@ -14916,6 +14914,15 @@ public class PApplet implements PConstants {
14916
14914
  }
14917
14915
 
14918
14916
 
14917
+ /**
14918
+ * Check the alpha on an image, using a really primitive loop.
14919
+ */
14920
+ public void checkAlpha() {
14921
+ if (recorder != null) recorder.checkAlpha();
14922
+ g.checkAlpha();
14923
+ }
14924
+
14925
+
14919
14926
  /**
14920
14927
  * ( begin auto-generated from PImage_get.xml )
14921
14928
  *
@@ -15096,8 +15103,8 @@ public class PApplet implements PConstants {
15096
15103
  /**
15097
15104
  * ( begin auto-generated from PImage_filter.xml )
15098
15105
  *
15099
- * Filters an image as defined by one of the following modes:<br
15100
- * />THRESHOLD - converts the image to black and white pixels depending if
15106
+ * Filters an image as defined by one of the following modes:
15107
+ * THRESHOLD - converts the image to black and white pixels depending if
15101
15108
  * they are above or below the threshold defined by the level parameter.
15102
15109
  * The level must be between 0.0 (black) and 1.0(white). If no level is
15103
15110
  * specified, 0.5 is used.