propane 3.4.0-java → 3.4.1-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.mvn/extensions.xml +1 -2
- data/.travis.yml +2 -2
- data/CHANGELOG.md +2 -0
- data/README.md +12 -7
- data/Rakefile +2 -2
- data/lib/propane.rb +2 -2
- data/lib/propane/app.rb +18 -9
- data/lib/propane/helper_methods.rb +1 -1
- data/lib/propane/runner.rb +1 -1
- data/lib/propane/version.rb +1 -1
- data/library/color_group/color_group.rb +26 -0
- data/library/dxf/dxf.rb +4 -0
- data/library/net/net.rb +5 -0
- data/library/video_event/video_event.rb +2 -1
- data/pom.rb +3 -3
- data/pom.xml +3 -3
- data/propane.gemspec +1 -1
- data/src/main/java/japplemenubar/JAppleMenuBar.java +3 -3
- data/src/main/java/monkstone/ColorUtil.java +14 -0
- data/src/main/java/monkstone/MathToolModule.java +243 -194
- data/src/main/java/monkstone/filechooser/Chooser.java +1 -0
- data/src/main/java/monkstone/slider/WheelHandler.java +6 -5
- data/src/main/java/monkstone/vecmath/vec3/Vec3.java +3 -2
- data/src/main/java/monkstone/videoevent/CaptureEvent.java +27 -0
- data/src/main/java/monkstone/videoevent/{VideoInterface.java → MovieEvent.java} +10 -26
- data/src/main/java/processing/awt/PSurfaceAWT.java +1 -1
- data/src/main/java/processing/core/PApplet.java +1236 -599
- data/src/main/java/processing/core/PGraphics.java +59 -59
- data/src/main/java/processing/core/PImage.java +528 -129
- data/src/main/java/processing/core/PShape.java +10 -10
- data/src/main/java/processing/core/PVector.java +2 -2
- data/src/main/java/processing/core/ThinkDifferent.java +5 -7
- data/src/main/java/processing/dxf/RawDXF.java +404 -0
- data/src/main/java/processing/net/Client.java +744 -0
- data/src/main/java/processing/net/Server.java +388 -0
- data/src/main/java/processing/opengl/FontTexture.java +19 -20
- data/src/main/java/processing/opengl/FrameBuffer.java +27 -17
- data/src/main/java/processing/opengl/LinePath.java +512 -508
- data/src/main/java/processing/opengl/PGL.java +3106 -3066
- data/src/main/java/processing/opengl/PGraphicsOpenGL.java +4 -4
- data/src/main/java/processing/opengl/PShader.java +1442 -1341
- data/vendors/Rakefile +3 -27
- metadata +12 -25
- data/src/main/java/processing/core/util/image/ImageLoadFacade.java +0 -161
- data/src/main/java/processing/core/util/image/ImageSaveFacade.java +0 -169
- data/src/main/java/processing/core/util/image/constants/TifConstants.java +0 -45
- data/src/main/java/processing/core/util/image/load/AwtImageLoadStrategy.java +0 -80
- data/src/main/java/processing/core/util/image/load/Base64StringImageLoadStrategy.java +0 -73
- data/src/main/java/processing/core/util/image/load/FallbackImageLoadStrategy.java +0 -70
- data/src/main/java/processing/core/util/image/load/ImageIoImageLoadStrategy.java +0 -132
- data/src/main/java/processing/core/util/image/load/ImageLoadStrategy.java +0 -48
- data/src/main/java/processing/core/util/image/load/ImageLoadUtil.java +0 -45
- data/src/main/java/processing/core/util/image/load/TgaImageLoadStrategy.java +0 -255
- data/src/main/java/processing/core/util/image/load/TiffImageLoadStrategy.java +0 -98
- data/src/main/java/processing/core/util/image/save/ImageSaveStrategy.java +0 -49
- data/src/main/java/processing/core/util/image/save/ImageSaveUtil.java +0 -48
- data/src/main/java/processing/core/util/image/save/ImageWriterImageSaveStrategy.java +0 -179
- data/src/main/java/processing/core/util/image/save/SaveImageException.java +0 -41
- data/src/main/java/processing/core/util/image/save/TgaImageSaveStrategy.java +0 -198
- data/src/main/java/processing/core/util/image/save/TiffImageSaveStrategy.java +0 -91
- data/src/main/java/processing/core/util/image/save/TiffNakedFilenameImageSaveStrategy.java +0 -57
- data/src/main/java/processing/core/util/io/InputFactory.java +0 -285
- data/src/main/java/processing/core/util/io/PathUtil.java +0 -109
@@ -1,18 +1,18 @@
|
|
1
|
-
/*
|
1
|
+
/*
|
2
2
|
* Copyright (c) 2016-19 Martin Prout
|
3
|
-
*
|
3
|
+
*
|
4
4
|
* This library is free software; you can redistribute it and/or
|
5
5
|
* modify it under the terms of the GNU Lesser General Public
|
6
6
|
* License as published by the Free Software Foundation; either
|
7
7
|
* version 2.1 of the License, or (at your option) any later version.
|
8
|
-
*
|
8
|
+
*
|
9
9
|
* http://creativecommons.org/licenses/LGPL/2.1/
|
10
|
-
*
|
10
|
+
*
|
11
11
|
* This library is distributed in the hope that it will be useful,
|
12
12
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
13
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
14
|
* Lesser General Public License for more details.
|
15
|
-
*
|
15
|
+
*
|
16
16
|
* You should have received a copy of the GNU Lesser General Public
|
17
17
|
* License along with this library; if not, write to the Free Software
|
18
18
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
@@ -24,6 +24,7 @@ package monkstone.slider;
|
|
24
24
|
* Peasycam when I was struggling with non functioning browser applet, probably
|
25
25
|
* superfluous here.
|
26
26
|
*/
|
27
|
+
@FunctionalInterface
|
27
28
|
public interface WheelHandler {
|
28
29
|
|
29
30
|
/**
|
@@ -33,6 +33,7 @@ import org.jruby.runtime.ThreadContext;
|
|
33
33
|
import org.jruby.runtime.builtin.IRubyObject;
|
34
34
|
import monkstone.vecmath.JRender;
|
35
35
|
import monkstone.vecmath.vec2.Vec2;
|
36
|
+
import org.jruby.RubyNumeric;
|
36
37
|
|
37
38
|
/**
|
38
39
|
*
|
@@ -385,7 +386,7 @@ public final class Vec3 extends RubyObject {
|
|
385
386
|
@JRubyMethod(name = "/", required = 1)
|
386
387
|
public IRubyObject op_div(ThreadContext context, IRubyObject scalar) {
|
387
388
|
Ruby runtime = context.runtime;
|
388
|
-
|
389
|
+
double divisor = (scalar instanceof RubyFloat)
|
389
390
|
? ((RubyFloat) scalar).getValue() : ((RubyFixnum) scalar).getDoubleValue();
|
390
391
|
if (Math.abs(divisor) < Vec3.EPSILON) {
|
391
392
|
return this;
|
@@ -432,7 +433,7 @@ public final class Vec3 extends RubyObject {
|
|
432
433
|
return this;
|
433
434
|
}
|
434
435
|
}
|
435
|
-
|
436
|
+
double new_mag = (scalar instanceof RubyFloat)
|
436
437
|
? ((RubyFloat) scalar).getValue() : ((RubyFixnum) scalar).getDoubleValue();
|
437
438
|
double current = Math.sqrt(jx * jx + jy * jy + jz * jz);
|
438
439
|
if (current > EPSILON) {
|
@@ -0,0 +1,27 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2015-19 Martin Prout
|
3
|
+
*
|
4
|
+
* This library is free software; you can redistribute it and/or
|
5
|
+
* modify it under the terms of the GNU Lesser General Public
|
6
|
+
* License as published by the Free Software Foundation; either
|
7
|
+
* version 2.1 of the License, or (at your option) any later version.
|
8
|
+
*
|
9
|
+
* http://creativecommons.org/licenses/LGPL/2.1/
|
10
|
+
*
|
11
|
+
* This library is distributed in the hope that it will be useful,
|
12
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
+
* Lesser General Public License for more details.
|
15
|
+
*
|
16
|
+
* You should have received a copy of the GNU Lesser General Public
|
17
|
+
* License along with this library; if not, write to the Free Software
|
18
|
+
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
19
|
+
*/
|
20
|
+
|
21
|
+
package monkstone.videoevent;
|
22
|
+
import processing.video.Capture;
|
23
|
+
|
24
|
+
@FunctionalInterface
|
25
|
+
public interface CaptureEvent{
|
26
|
+
public void captureEvent(Capture capture);
|
27
|
+
}
|
@@ -1,48 +1,32 @@
|
|
1
|
-
/*
|
1
|
+
/*
|
2
2
|
* Copyright (c) 2015-19 Martin Prout
|
3
|
-
*
|
3
|
+
*
|
4
4
|
* This library is free software; you can redistribute it and/or
|
5
5
|
* modify it under the terms of the GNU Lesser General Public
|
6
6
|
* License as published by the Free Software Foundation; either
|
7
7
|
* version 2.1 of the License, or (at your option) any later version.
|
8
|
-
*
|
8
|
+
*
|
9
9
|
* http://creativecommons.org/licenses/LGPL/2.1/
|
10
|
-
*
|
10
|
+
*
|
11
11
|
* This library is distributed in the hope that it will be useful,
|
12
12
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
13
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
14
|
* Lesser General Public License for more details.
|
15
|
-
*
|
15
|
+
*
|
16
16
|
* You should have received a copy of the GNU Lesser General Public
|
17
17
|
* License along with this library; if not, write to the Free Software
|
18
18
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
19
19
|
*/
|
20
|
-
package monkstone.videoevent;
|
21
20
|
|
21
|
+
package monkstone.videoevent;
|
22
22
|
import processing.video.Movie;
|
23
|
-
import processing.video.Capture;
|
24
23
|
|
25
24
|
/**
|
26
|
-
* This interface makes it easier/possible to use the reflection methods
|
27
|
-
* Movie and Capture classes in
|
28
|
-
*
|
25
|
+
* This interface makes it easier/possible to use the reflection methods
|
26
|
+
* from Movie and Capture classes in Processing::App in JRubyArt
|
29
27
|
* @author Martin Prout
|
30
28
|
*/
|
31
|
-
|
32
|
-
|
33
|
-
/**
|
34
|
-
* Used to implement reflection method in PApplet
|
35
|
-
*
|
36
|
-
* @see processing.video.Movie
|
37
|
-
* @param movie Movie
|
38
|
-
*/
|
29
|
+
@FunctionalInterface
|
30
|
+
public interface MovieEvent {
|
39
31
|
public void movieEvent(Movie movie);
|
40
|
-
|
41
|
-
/**
|
42
|
-
* Used to implement reflection method in PApplet
|
43
|
-
*
|
44
|
-
* @see processing.video.Capture
|
45
|
-
* @param capture Capture
|
46
|
-
*/
|
47
|
-
public void captureEvent(Capture capture);
|
48
32
|
}
|
@@ -1024,7 +1024,7 @@ public class PSurfaceAWT extends PSurfaceNone {
|
|
1024
1024
|
*/
|
1025
1025
|
/**
|
1026
1026
|
* Set this sketch to communicate its state back to the PDE.
|
1027
|
-
*
|
1027
|
+
*
|
1028
1028
|
* This uses the stderr stream to write positions of the window (so that it
|
1029
1029
|
* will be saved by the PDE for the next run) and notify on quit. See more
|
1030
1030
|
* notes in the Worker class.
|
@@ -31,6 +31,7 @@ import java.awt.DisplayMode;
|
|
31
31
|
// handleSettings() and displayDensity()
|
32
32
|
import java.awt.GraphicsDevice;
|
33
33
|
import java.awt.GraphicsEnvironment;
|
34
|
+
import java.awt.GraphicsConfiguration;
|
34
35
|
// used to present the fullScreen() warning about Spaces on OS X
|
35
36
|
import javax.swing.JOptionPane;
|
36
37
|
|
@@ -38,6 +39,14 @@ import javax.swing.JOptionPane;
|
|
38
39
|
import java.awt.HeadlessException;
|
39
40
|
import java.awt.Toolkit;
|
40
41
|
|
42
|
+
// used by loadImage()
|
43
|
+
import java.awt.Image;
|
44
|
+
import java.awt.color.ColorSpace;
|
45
|
+
import java.awt.image.BufferedImage;
|
46
|
+
import javax.imageio.ImageIO;
|
47
|
+
// allows us to remove our own MediaTracker code
|
48
|
+
import javax.swing.ImageIcon;
|
49
|
+
|
41
50
|
// used by selectInput(), selectOutput(), selectFolder()
|
42
51
|
import java.awt.EventQueue;
|
43
52
|
import java.awt.FileDialog;
|
@@ -71,10 +80,7 @@ import java.util.concurrent.ThreadFactory;
|
|
71
80
|
import java.util.regex.*;
|
72
81
|
import java.util.zip.*;
|
73
82
|
import javax.swing.UnsupportedLookAndFeelException;
|
74
|
-
|
75
|
-
import processing.core.util.image.ImageLoadFacade;
|
76
|
-
import processing.core.util.io.InputFactory;
|
77
|
-
import processing.core.util.io.PathUtil;
|
83
|
+
import java.awt.geom.AffineTransform;
|
78
84
|
import processing.data.*;
|
79
85
|
import processing.event.*;
|
80
86
|
import processing.opengl.*;
|
@@ -137,9 +143,8 @@ public class PApplet implements PConstants {
|
|
137
143
|
}
|
138
144
|
|
139
145
|
/**
|
140
|
-
* Do not use;
|
141
|
-
*
|
142
|
-
* i.e. "if (javaPlatform >= 9)".
|
146
|
+
* Do not use; or javaVersionName are better options. For instance, is useful
|
147
|
+
* when you need a number for comparison, i.e. "if ( >= 9)".
|
143
148
|
*/
|
144
149
|
@Deprecated
|
145
150
|
public static final float javaVersion = 1 + JAVA_PLATFORM / 10f;
|
@@ -434,10 +439,10 @@ public class PApplet implements PConstants {
|
|
434
439
|
* <b>draw()</b>). But, inside mouse events, they update each time the event
|
435
440
|
* is called. If they weren't separated, then the mouse would be read only
|
436
441
|
* once per frame, making response choppy. If the mouse variables were always
|
437
|
-
* updated multiple times per frame, using <b>line(pmouseX, pmouseY,
|
438
|
-
* mouseY)</b> inside <b>draw()</b> would have lots of gaps,
|
439
|
-
* <b>pmouseX</b> may have changed several times in between the calls
|
440
|
-
* <b>line()</b>. Use <b>pmouseX</b> and
|
442
|
+
* updated multiple times per frame, using <NOBR><b>line(pmouseX, pmouseY,
|
443
|
+
* mouseX, mouseY)</b></NOBR> inside <b>draw()</b> would have lots of gaps,
|
444
|
+
* because <b>pmouseX</b> may have changed several times in between the calls
|
445
|
+
* to <b>line()</b>. Use <b>pmouseX</b> and
|
441
446
|
* <b>pmouseY</b> inside <b>draw()</b> if you want values relative to the
|
442
447
|
* previous frame. Use <b>pmouseX</b> and <b>pmouseY</b> inside the mouse
|
443
448
|
* functions if you want continuous response.
|
@@ -988,7 +993,7 @@ public class PApplet implements PConstants {
|
|
988
993
|
BufferedReader errReader = createReader(p.getErrorStream());
|
989
994
|
StringBuilder stdout = new StringBuilder();
|
990
995
|
StringBuilder stderr = new StringBuilder();
|
991
|
-
String line;
|
996
|
+
String line = null;
|
992
997
|
try {
|
993
998
|
while ((line = outReader.readLine()) != null) {
|
994
999
|
stdout.append(line);
|
@@ -1114,11 +1119,12 @@ public class PApplet implements PConstants {
|
|
1114
1119
|
*
|
1115
1120
|
* This function returns the number "2" if the screen is a high-density screen
|
1116
1121
|
* (called a Retina display on OS X or high-dpi on Windows and Linux) and a
|
1117
|
-
* "1" if not. This
|
1118
|
-
*
|
1119
|
-
*
|
1122
|
+
* "1" if not. This information is useful for a program to adapt to run at
|
1123
|
+
* double the pixel density on a screen that supports it.
|
1124
|
+
*
|
1125
|
+
* ( end auto-generated )
|
1120
1126
|
*
|
1121
|
-
* @
|
1127
|
+
* @webref environment
|
1122
1128
|
* @see PApplet#pixelDensity(int)
|
1123
1129
|
* @see PApplet#size(int,int)
|
1124
1130
|
*/
|
@@ -1138,65 +1144,20 @@ public class PApplet implements PConstants {
|
|
1138
1144
|
|
1139
1145
|
/**
|
1140
1146
|
* @param display the display number to check
|
1141
|
-
* @return
|
1142
1147
|
*/
|
1143
|
-
|
1144
|
-
|
1145
|
-
|
1146
|
-
|
1147
|
-
|
1148
|
-
|
1149
|
-
|
1150
|
-
|
1151
|
-
|
1152
|
-
|
1153
|
-
switch (display) {
|
1154
|
-
case -1:
|
1155
|
-
device = env.getDefaultScreenDevice();
|
1156
|
-
break;
|
1157
|
-
case SPAN:
|
1158
|
-
throw new RuntimeException("displayDensity() only works with specific display numbers");
|
1159
|
-
default:
|
1160
|
-
GraphicsDevice[] devices = env.getScreenDevices();
|
1161
|
-
if (display > 0 && display <= devices.length) {
|
1162
|
-
device = devices[display - 1];
|
1163
|
-
} else {
|
1164
|
-
if (devices.length == 1) {
|
1165
|
-
System.err.println("Only one display is currently known, use displayDensity(1).");
|
1166
|
-
} else {
|
1167
|
-
System.err.format("Your displays are numbered %d through %d, "
|
1168
|
-
+ "pass one of those numbers to displayDensity()%n", 1, devices.length);
|
1169
|
-
}
|
1170
|
-
throw new RuntimeException("Display " + display + " does not exist.");
|
1171
|
-
}
|
1172
|
-
break;
|
1173
|
-
}
|
1174
|
-
|
1175
|
-
try {
|
1176
|
-
Field field = device.getClass().getDeclaredField("scale");
|
1177
|
-
if (field != null) {
|
1178
|
-
field.setAccessible(true);
|
1179
|
-
Object scale = field.get(device);
|
1148
|
+
/**
|
1149
|
+
* @param display the display number to check
|
1150
|
+
*/
|
1151
|
+
public int displayDensity(int display) {
|
1152
|
+
GraphicsDevice graphicsDevice = GraphicsEnvironment
|
1153
|
+
.getLocalGraphicsEnvironment()
|
1154
|
+
.getDefaultScreenDevice();
|
1155
|
+
GraphicsConfiguration graphicsConfig = graphicsDevice
|
1156
|
+
.getDefaultConfiguration();
|
1180
1157
|
|
1181
|
-
|
1182
|
-
|
1183
|
-
}
|
1184
|
-
}
|
1185
|
-
} catch (IllegalAccessException | IllegalArgumentException | NoSuchFieldException | SecurityException ignore) {
|
1186
|
-
}
|
1187
|
-
}
|
1188
|
-
} else if (PApplet.platform == PConstants.WINDOWS
|
1189
|
-
|| PApplet.platform == PConstants.LINUX) {
|
1190
|
-
if (suggestedDensity == -1) {
|
1191
|
-
// TODO: detect and return DPI scaling using JNA; Windows has
|
1192
|
-
// a system-wide value, not sure how it works on Linux
|
1193
|
-
return 1;
|
1194
|
-
} else if (suggestedDensity == 1 || suggestedDensity == 2) {
|
1195
|
-
return suggestedDensity;
|
1196
|
-
}
|
1158
|
+
AffineTransform tx = graphicsConfig.getDefaultTransform();
|
1159
|
+
return (int) Math.round(tx.getScaleX());
|
1197
1160
|
}
|
1198
|
-
return 1;
|
1199
|
-
}
|
1200
1161
|
|
1201
1162
|
/**
|
1202
1163
|
* @webref environment
|
@@ -1208,12 +1169,12 @@ public class PApplet implements PConstants {
|
|
1208
1169
|
if (density != this.pixelDensity) {
|
1209
1170
|
if (insideSettings("pixelDensity", density)) {
|
1210
1171
|
if (density != 1 && density != 2) {
|
1211
|
-
throw new RuntimeException("
|
1172
|
+
throw new RuntimeException("pixel_density can only be 1 or 2");
|
1212
1173
|
}
|
1213
1174
|
if (!FX2D.equals(renderer) && density == 2 && displayDensity() == 1) {
|
1214
1175
|
// FX has its own check in PSurfaceFX
|
1215
1176
|
// Don't throw exception because the sketch should still work
|
1216
|
-
System.err.println("
|
1177
|
+
System.err.println("pixel_density(2) is not available for this display");
|
1217
1178
|
this.pixelDensity = 1;
|
1218
1179
|
} else {
|
1219
1180
|
this.pixelDensity = density;
|
@@ -1222,7 +1183,7 @@ public class PApplet implements PConstants {
|
|
1222
1183
|
System.err.println("not inside settings");
|
1223
1184
|
// this should only be reachable when not running in the PDE,
|
1224
1185
|
// so saying it's a settings()--not just setup()--issue should be ok
|
1225
|
-
throw new RuntimeException("
|
1186
|
+
throw new RuntimeException("pixel_density can only be used inside settings()");
|
1226
1187
|
}
|
1227
1188
|
}
|
1228
1189
|
}
|
@@ -1230,9 +1191,6 @@ public class PApplet implements PConstants {
|
|
1230
1191
|
/**
|
1231
1192
|
* Called by PSurface objects to set the width and height variables, and
|
1232
1193
|
* update the pixelWidth and pixelHeight variables.
|
1233
|
-
*
|
1234
|
-
* @param width
|
1235
|
-
* @param height
|
1236
1194
|
*/
|
1237
1195
|
public void setSize(int width, int height) {
|
1238
1196
|
this.width = width;
|
@@ -1276,10 +1234,10 @@ public class PApplet implements PConstants {
|
|
1276
1234
|
|
1277
1235
|
private void smoothWarning(String method) {
|
1278
1236
|
// When running from the PDE, say setup(), otherwise say settings()
|
1279
|
-
final String where =
|
1280
|
-
PGraphics.showWarning("%s
|
1237
|
+
final String where = "settings";
|
1238
|
+
PGraphics.showWarning("%s can only be used inside %s", method, where);
|
1281
1239
|
if (external) {
|
1282
|
-
PGraphics.showWarning("
|
1240
|
+
PGraphics.showWarning("In vanilla processing, %s is automatically moved from setup to settings", method);
|
1283
1241
|
}
|
1284
1242
|
}
|
1285
1243
|
|
@@ -1497,7 +1455,7 @@ public class PApplet implements PConstants {
|
|
1497
1455
|
* <li>resume – called when the sketch is resumed
|
1498
1456
|
* <li>dispose – when the sketch is shutting down (definitely not safe to
|
1499
1457
|
* draw)
|
1500
|
-
*
|
1458
|
+
* <ul>
|
1501
1459
|
* In addition, the new (for 2.0) processing.event classes are passed to the
|
1502
1460
|
* following event types:
|
1503
1461
|
* <ul>
|
@@ -1512,19 +1470,17 @@ public class PApplet implements PConstants {
|
|
1512
1470
|
* @param target the target object that should receive the event
|
1513
1471
|
*/
|
1514
1472
|
public void registerMethod(String methodName, Object target) {
|
1515
|
-
|
1516
|
-
|
1517
|
-
|
1518
|
-
|
1519
|
-
|
1520
|
-
|
1521
|
-
|
1522
|
-
|
1523
|
-
|
1524
|
-
|
1525
|
-
|
1526
|
-
registerNoArgs(methodName, target);
|
1527
|
-
break;
|
1473
|
+
if (methodName.equals("mouseEvent")) {
|
1474
|
+
registerWithArgs("mouseEvent", target, new Class[]{processing.event.MouseEvent.class});
|
1475
|
+
|
1476
|
+
} else if (methodName.equals("keyEvent")) {
|
1477
|
+
registerWithArgs("keyEvent", target, new Class[]{processing.event.KeyEvent.class});
|
1478
|
+
|
1479
|
+
} else if (methodName.equals("touchEvent")) {
|
1480
|
+
registerWithArgs("touchEvent", target, new Class[]{processing.event.TouchEvent.class});
|
1481
|
+
|
1482
|
+
} else {
|
1483
|
+
registerNoArgs(methodName, target);
|
1528
1484
|
}
|
1529
1485
|
}
|
1530
1486
|
|
@@ -1544,7 +1500,7 @@ public class PApplet implements PConstants {
|
|
1544
1500
|
die("There is no public " + name + "() method in the class "
|
1545
1501
|
+ o.getClass().getName());
|
1546
1502
|
|
1547
|
-
} catch (
|
1503
|
+
} catch (Exception e) {
|
1548
1504
|
die("Could not register " + name + " + () for " + o, e);
|
1549
1505
|
}
|
1550
1506
|
}
|
@@ -1871,7 +1827,6 @@ public class PApplet implements PConstants {
|
|
1871
1827
|
}
|
1872
1828
|
|
1873
1829
|
/**
|
1874
|
-
* @param renderer
|
1875
1830
|
* @param display the screen to run the sketch on (1, 2, 3, etc. or on
|
1876
1831
|
* multiple screens using SPAN)
|
1877
1832
|
*/
|
@@ -1905,8 +1860,8 @@ public class PApplet implements PConstants {
|
|
1905
1860
|
* needed.
|
1906
1861
|
*
|
1907
1862
|
* The <b>size()</b> function can only be used once inside a sketch, and
|
1908
|
-
* cannot be used for resizing
|
1909
|
-
* <b>renderer</b> parameter selects which rendering engine to use. For
|
1863
|
+
* cannot be used for resizing.<br/>
|
1864
|
+
* <br/> <b>renderer</b> parameter selects which rendering engine to use. For
|
1910
1865
|
* example, if you will be drawing 3D shapes, use <b>P3D</b>, if you want to
|
1911
1866
|
* export images from a program as a PDF file use <b>PDF</b>. A brief
|
1912
1867
|
* description of the three primary renderers follows:
|
@@ -2078,22 +2033,23 @@ public class PApplet implements PConstants {
|
|
2078
2033
|
/**
|
2079
2034
|
* ( begin auto-generated from createGraphics.xml )
|
2080
2035
|
*
|
2081
|
-
* Creates and returns a new <b>PGraphics</b> object of the types P2D or
|
2082
|
-
*
|
2083
|
-
*
|
2084
|
-
*
|
2036
|
+
* Creates and returns a new <b>PGraphics</b> object of the types P2D or P3D.
|
2037
|
+
* Use this class if you need to draw into an off-screen graphics buffer. The
|
2038
|
+
* PDF renderer requires the filename parameter. The DXF renderer should not
|
2039
|
+
* be used with <b>createGraphics()</b>, it's only built for use with
|
2085
2040
|
* <b>beginRaw()</b> and <b>endRaw()</b>.
|
2086
2041
|
*
|
2087
2042
|
* It's important to call any drawing functions between <b>beginDraw()</b>
|
2088
2043
|
* and <b>endDraw()</b> statements. This is also true for any functions that
|
2089
|
-
* affect drawing, such as <b>smooth()</b> or <b>colorMode()</b
|
2090
|
-
* drawing surface which is completely opaque, surfaces created
|
2091
|
-
* <b>createGraphics()</b> can have transparency. This makes it possible
|
2092
|
-
* draw into a graphics and maintain the alpha channel. By using
|
2093
|
-
* to write a PNG or TGA file, the transparency of the graphics
|
2094
|
-
* honored. Note that transparency levels are binary: pixels
|
2095
|
-
* complete opaque or transparent. For the time being, this means
|
2096
|
-
* characters will be opaque blocks. This will be fixed in a future
|
2044
|
+
* affect drawing, such as <b>smooth()</b> or <b>colorMode()</b>.<br/>
|
2045
|
+
* <br/> the main drawing surface which is completely opaque, surfaces created
|
2046
|
+
* with <b>createGraphics()</b> can have transparency. This makes it possible
|
2047
|
+
* to draw into a graphics and maintain the alpha channel. By using
|
2048
|
+
* <b>save()</b> to write a PNG or TGA file, the transparency of the graphics
|
2049
|
+
* object will be honored. Note that transparency levels are binary: pixels
|
2050
|
+
* are either complete opaque or transparent. For the time being, this means
|
2051
|
+
* that text characters will be opaque blocks. This will be fixed in a future
|
2052
|
+
* release (<a
|
2097
2053
|
* href="http://code.google.com/p/processing/issues/detail?id=80">Issue
|
2098
2054
|
* 80</a>).
|
2099
2055
|
*
|
@@ -2142,7 +2098,6 @@ public class PApplet implements PConstants {
|
|
2142
2098
|
* <A HREF="http://dev.processing.org/reference/core/javadoc/processing/core/PImage.html#save(java.lang.String)">PImage.save()</A>.
|
2143
2099
|
* </UL>
|
2144
2100
|
*
|
2145
|
-
* @return
|
2146
2101
|
* @webref rendering
|
2147
2102
|
* @param w width in pixels
|
2148
2103
|
* @param h height in pixels
|
@@ -2158,11 +2113,7 @@ public class PApplet implements PConstants {
|
|
2158
2113
|
* Create an offscreen graphics surface for drawing, in this case for a
|
2159
2114
|
* renderer that writes to a file (such as PDF or DXF).
|
2160
2115
|
*
|
2161
|
-
* @param w
|
2162
|
-
* @param h
|
2163
|
-
* @param renderer
|
2164
2116
|
* @param path the name of the file (can be an absolute or relative path)
|
2165
|
-
* @return
|
2166
2117
|
*/
|
2167
2118
|
public PGraphics createGraphics(int w, int h,
|
2168
2119
|
String renderer, String path) {
|
@@ -2261,7 +2212,7 @@ public class PApplet implements PConstants {
|
|
2261
2212
|
+ " renderer is not in the class path.");
|
2262
2213
|
}
|
2263
2214
|
|
2264
|
-
} catch (
|
2215
|
+
} catch (IllegalAccessException | IllegalArgumentException | InstantiationException | NoSuchMethodException | SecurityException e) {
|
2265
2216
|
if ((e instanceof IllegalArgumentException)
|
2266
2217
|
|| (e instanceof NoSuchMethodException)
|
2267
2218
|
|| (e instanceof IllegalAccessException)) {
|
@@ -2290,6 +2241,7 @@ public class PApplet implements PConstants {
|
|
2290
2241
|
|
2291
2242
|
/**
|
2292
2243
|
* Create default renderer, likely to be resized, but needed for surface init.
|
2244
|
+
* @return
|
2293
2245
|
*/
|
2294
2246
|
protected PGraphics createPrimaryGraphics() {
|
2295
2247
|
return makeGraphics(sketchWidth(), sketchHeight(),
|
@@ -2574,7 +2526,6 @@ public class PApplet implements PConstants {
|
|
2574
2526
|
/**
|
2575
2527
|
* Add an event to the internal event queue, or process it immediately if the
|
2576
2528
|
* sketch is not currently looping.
|
2577
|
-
*
|
2578
2529
|
* @param pe
|
2579
2530
|
*/
|
2580
2531
|
public void postEvent(processing.event.Event pe) {
|
@@ -3122,15 +3073,15 @@ public class PApplet implements PConstants {
|
|
3122
3073
|
* ( begin auto-generated from millis.xml )
|
3123
3074
|
*
|
3124
3075
|
* Returns the number of milliseconds (thousandths of a second) since starting
|
3125
|
-
* an applet.This information is often used for timing animation sequences.
|
3126
|
-
*
|
3076
|
+
* an applet. This information is often used for timing animation sequences.
|
3077
|
+
*
|
3078
|
+
* ( end auto-generated )
|
3127
3079
|
*
|
3128
3080
|
* <h3>Advanced</h3>
|
3129
3081
|
* <p>
|
3130
3082
|
* This is a function, rather than a variable, because it may change multiple
|
3131
3083
|
* times per frame.
|
3132
3084
|
*
|
3133
|
-
* @return
|
3134
3085
|
* @webref input:time_date
|
3135
3086
|
* @see PApplet#second()
|
3136
3087
|
* @see PApplet#minute()
|
@@ -3147,11 +3098,11 @@ public class PApplet implements PConstants {
|
|
3147
3098
|
/**
|
3148
3099
|
* ( begin auto-generated from second.xml )
|
3149
3100
|
*
|
3150
|
-
* Processing communicates with the clock on your computer.The
|
3101
|
+
* Processing communicates with the clock on your computer. The
|
3151
3102
|
* <b>second()</b> function returns the current second as a value from 0 - 59.
|
3103
|
+
*
|
3152
3104
|
* ( end auto-generated )
|
3153
3105
|
*
|
3154
|
-
* @return
|
3155
3106
|
* @webref input:time_date
|
3156
3107
|
* @see PApplet#millis()
|
3157
3108
|
* @see PApplet#minute()
|
@@ -3168,11 +3119,11 @@ public class PApplet implements PConstants {
|
|
3168
3119
|
/**
|
3169
3120
|
* ( begin auto-generated from minute.xml )
|
3170
3121
|
*
|
3171
|
-
* Processing communicates with the clock on your computer.The
|
3122
|
+
* Processing communicates with the clock on your computer. The
|
3172
3123
|
* <b>minute()</b> function returns the current minute as a value from 0 - 59.
|
3124
|
+
*
|
3173
3125
|
* ( end auto-generated )
|
3174
3126
|
*
|
3175
|
-
* @return
|
3176
3127
|
* @webref input:time_date
|
3177
3128
|
* @see PApplet#millis()
|
3178
3129
|
* @see PApplet#second()
|
@@ -3190,11 +3141,11 @@ public class PApplet implements PConstants {
|
|
3190
3141
|
/**
|
3191
3142
|
* ( begin auto-generated from hour.xml )
|
3192
3143
|
*
|
3193
|
-
* Processing communicates with the clock on your computer.The
|
3194
|
-
* <b>hour()</b> function returns the current hour as a value from 0 - 23.
|
3195
|
-
*
|
3144
|
+
* Processing communicates with the clock on your computer. The
|
3145
|
+
* <b>hour()</b> function returns the current hour as a value from 0 - 23.
|
3146
|
+
*
|
3147
|
+
* ( end auto-generated )
|
3196
3148
|
*
|
3197
|
-
* @return
|
3198
3149
|
* @webref input:time_date
|
3199
3150
|
* @see PApplet#millis()
|
3200
3151
|
* @see PApplet#second()
|
@@ -3211,16 +3162,16 @@ public class PApplet implements PConstants {
|
|
3211
3162
|
/**
|
3212
3163
|
* ( begin auto-generated from day.xml )
|
3213
3164
|
*
|
3214
|
-
* Processing communicates with the clock on your computer.The
|
3215
|
-
* <b>day()</b> function returns the current day as a value from 1 - 31.
|
3216
|
-
*
|
3165
|
+
* Processing communicates with the clock on your computer. The
|
3166
|
+
* <b>day()</b> function returns the current day as a value from 1 - 31.
|
3167
|
+
*
|
3168
|
+
* ( end auto-generated )
|
3217
3169
|
* <h3>Advanced</h3>
|
3218
3170
|
* Get the current day of the month (1 through 31).
|
3219
3171
|
* <p>
|
3220
3172
|
* If you're looking for the day of the week (M-F or whatever) or day of the
|
3221
3173
|
* year (1..365) then use java's Calendar.get()
|
3222
3174
|
*
|
3223
|
-
* @return
|
3224
3175
|
* @webref input:time_date
|
3225
3176
|
* @see PApplet#millis()
|
3226
3177
|
* @see PApplet#second()
|
@@ -3236,11 +3187,11 @@ public class PApplet implements PConstants {
|
|
3236
3187
|
/**
|
3237
3188
|
* ( begin auto-generated from month.xml )
|
3238
3189
|
*
|
3239
|
-
* Processing communicates with the clock on your computer.The
|
3240
|
-
* <b>month()</b> function returns the current month as a value from 1 - 12.
|
3241
|
-
*
|
3190
|
+
* Processing communicates with the clock on your computer. The
|
3191
|
+
* <b>month()</b> function returns the current month as a value from 1 - 12.
|
3192
|
+
*
|
3193
|
+
* ( end auto-generated )
|
3242
3194
|
*
|
3243
|
-
* @return
|
3244
3195
|
* @webref input:time_date
|
3245
3196
|
* @see PApplet#millis()
|
3246
3197
|
* @see PApplet#second()
|
@@ -3257,12 +3208,13 @@ public class PApplet implements PConstants {
|
|
3257
3208
|
/**
|
3258
3209
|
* ( begin auto-generated from year.xml )
|
3259
3210
|
*
|
3260
|
-
* Processing communicates with the clock on your computer.The
|
3211
|
+
* Processing communicates with the clock on your computer. The
|
3261
3212
|
* <b>year()</b> function returns the current year as an integer (2003, 2004,
|
3262
|
-
* 2005, etc).
|
3263
|
-
*
|
3213
|
+
* 2005, etc).
|
3214
|
+
*
|
3215
|
+
* ( end auto-generated ) The <b>year()</b> function returns the current year
|
3216
|
+
* as an integer (2003, 2004, 2005, etc).
|
3264
3217
|
*
|
3265
|
-
* @return
|
3266
3218
|
* @webref input:time_date
|
3267
3219
|
* @see PApplet#millis()
|
3268
3220
|
* @see PApplet#second()
|
@@ -3367,7 +3319,7 @@ public class PApplet implements PConstants {
|
|
3367
3319
|
/**
|
3368
3320
|
* ( begin auto-generated from launch.xml )
|
3369
3321
|
*
|
3370
|
-
* Attempts to open an application or file using your platform's launcher.The
|
3322
|
+
* Attempts to open an application or file using your platform's launcher. The
|
3371
3323
|
* <b>file</b> parameter is a String specifying the file name and location.
|
3372
3324
|
* The location parameter must be a full path name, or the name of an
|
3373
3325
|
* executable in the system's PATH. In most cases, using a full path is the
|
@@ -3396,7 +3348,6 @@ public class PApplet implements PConstants {
|
|
3396
3348
|
*
|
3397
3349
|
* ( end auto-generated )
|
3398
3350
|
*
|
3399
|
-
* @return
|
3400
3351
|
* @webref input:files
|
3401
3352
|
* @param args arguments to the launcher, eg. a filename.
|
3402
3353
|
* @usage Application
|
@@ -3428,14 +3379,12 @@ public class PApplet implements PConstants {
|
|
3428
3379
|
/*int result =*/ p.waitFor();
|
3429
3380
|
// Not installed will throw an IOException (JDK 1.4.2, Ubuntu 7.04)
|
3430
3381
|
openLauncher = launcher;
|
3431
|
-
} catch (
|
3382
|
+
} catch (Exception e) {
|
3432
3383
|
}
|
3433
|
-
}
|
3434
|
-
if (openLauncher == null) {
|
3384
|
+
} if (openLauncher == null) {
|
3435
3385
|
System.err.println("Could not find xdg-open, gnome-open, or kde-open: "
|
3436
3386
|
+ "the open() command may not work.");
|
3437
|
-
}
|
3438
|
-
if (openLauncher != null) {
|
3387
|
+
} if (openLauncher != null) {
|
3439
3388
|
params = new String[]{openLauncher};
|
3440
3389
|
}
|
3441
3390
|
//} else { // give up and just pass it to Runtime.exec()
|
@@ -3460,7 +3409,7 @@ public class PApplet implements PConstants {
|
|
3460
3409
|
}
|
3461
3410
|
|
3462
3411
|
/**
|
3463
|
-
* Pass a set of arguments directly to the command line.Uses Java's
|
3412
|
+
* Pass a set of arguments directly to the command line. Uses Java's
|
3464
3413
|
* <A HREF="https://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#exec-java.lang.String:A-">Runtime.exec()</A>
|
3465
3414
|
* method. This is different from the
|
3466
3415
|
* <A HREF="https://processing.org/reference/launch_.html">launch()</A>
|
@@ -3478,7 +3427,6 @@ public class PApplet implements PConstants {
|
|
3478
3427
|
* </pre> You can also get the system output and error streams from the
|
3479
3428
|
* Process object, but that's more that we'd like to cover here.
|
3480
3429
|
*
|
3481
|
-
* @param args
|
3482
3430
|
* @return a
|
3483
3431
|
* <A HREF="https://docs.oracle.com/javase/8/docs/api/java/lang/Process.html">Process</A>
|
3484
3432
|
* object
|
@@ -3591,11 +3539,6 @@ public class PApplet implements PConstants {
|
|
3591
3539
|
|
3592
3540
|
/**
|
3593
3541
|
* Same as exec() above, but prefixes the call with a shell.
|
3594
|
-
*
|
3595
|
-
* @param stdout
|
3596
|
-
* @param stderr
|
3597
|
-
* @param args
|
3598
|
-
* @return
|
3599
3542
|
*/
|
3600
3543
|
static public int shell(StringList stdout, StringList stderr, String... args) {
|
3601
3544
|
String shell;
|
@@ -3645,18 +3588,14 @@ public class PApplet implements PConstants {
|
|
3645
3588
|
/**
|
3646
3589
|
* Better way of handling e.printStackTrace() calls so that they can be
|
3647
3590
|
* handled by subclasses as necessary.
|
3648
|
-
*
|
3649
|
-
* @param t
|
3650
3591
|
*/
|
3651
3592
|
protected void printStackTrace(Throwable t) {
|
3652
3593
|
t.printStackTrace();
|
3653
3594
|
}
|
3654
3595
|
|
3655
3596
|
/**
|
3656
|
-
* Function for an applet/application to kill itself and display an
|
3657
|
-
*
|
3658
|
-
*
|
3659
|
-
* @param what
|
3597
|
+
* Function for an applet/application to kill itself and display an error.
|
3598
|
+
* Mostly this is here to be improved later.
|
3660
3599
|
*/
|
3661
3600
|
public void die(String what) {
|
3662
3601
|
dispose();
|
@@ -3664,10 +3603,7 @@ public class PApplet implements PConstants {
|
|
3664
3603
|
}
|
3665
3604
|
|
3666
3605
|
/**
|
3667
|
-
* Same as above but with an exception.Also needs work.
|
3668
|
-
*
|
3669
|
-
* @param what
|
3670
|
-
* @param e
|
3606
|
+
* Same as above but with an exception. Also needs work.
|
3671
3607
|
*/
|
3672
3608
|
public void die(String what, Exception e) {
|
3673
3609
|
if (e != null) {
|
@@ -3838,8 +3774,8 @@ public class PApplet implements PConstants {
|
|
3838
3774
|
* to the name. These files are saved to the sketch's folder, which may be
|
3839
3775
|
* opened by selecting "Show sketch folder" from the "Sketch" menu. It is not
|
3840
3776
|
* possible to use <b>save()</b> while running the program in a web browser.
|
3841
|
-
* images saved from the main drawing window will be opaque. To save
|
3842
|
-
* without a background, use <b>createGraphics()</b>.
|
3777
|
+
* <br/> images saved from the main drawing window will be opaque. To save
|
3778
|
+
* images without a background, use <b>createGraphics()</b>.
|
3843
3779
|
*
|
3844
3780
|
* ( end auto-generated )
|
3845
3781
|
*
|
@@ -3883,7 +3819,7 @@ public class PApplet implements PConstants {
|
|
3883
3819
|
* href="http://wiki.processing.org/w/Sign_an_Applet">signed applet</A>. To
|
3884
3820
|
* save a file back to a server, see the <a
|
3885
3821
|
* href="http://wiki.processing.org/w/Saving_files_to_a_web-server">save to
|
3886
|
-
* web</A> code snippet on the Processing Wiki
|
3822
|
+
* web</A> code snippet on the Processing Wiki.<br/>
|
3887
3823
|
* <br/ >
|
3888
3824
|
* All images saved from the main drawing window will be opaque. To save
|
3889
3825
|
* images without a background, use <b>createGraphics()</b>.
|
@@ -3908,13 +3844,10 @@ public class PApplet implements PConstants {
|
|
3908
3844
|
|
3909
3845
|
/**
|
3910
3846
|
* Check a string for #### signs to see if the frame number should be
|
3911
|
-
* inserted.Used for functions like saveFrame() and beginRecord() to replace
|
3912
|
-
* the # marks with the frame number.If only one # is used, it will be
|
3847
|
+
* inserted. Used for functions like saveFrame() and beginRecord() to replace
|
3848
|
+
* the # marks with the frame number. If only one # is used, it will be
|
3913
3849
|
* ignored, under the assumption that it's probably not intended to be the
|
3914
3850
|
* frame number.
|
3915
|
-
*
|
3916
|
-
* @param what
|
3917
|
-
* @return
|
3918
3851
|
*/
|
3919
3852
|
public String insertFrame(String what) {
|
3920
3853
|
int first = what.indexOf('#');
|
@@ -3942,10 +3875,8 @@ public class PApplet implements PConstants {
|
|
3942
3875
|
}
|
3943
3876
|
|
3944
3877
|
/**
|
3945
|
-
* Replace the cursor with the specified PImage.The x- and y- coordinate of
|
3878
|
+
* Replace the cursor with the specified PImage. The x- and y- coordinate of
|
3946
3879
|
* the center will be the center of the image.
|
3947
|
-
*
|
3948
|
-
* @param img
|
3949
3880
|
*/
|
3950
3881
|
public void cursor(PImage img) {
|
3951
3882
|
cursor(img, img.width / 2, img.height / 2);
|
@@ -4205,11 +4136,9 @@ public class PApplet implements PConstants {
|
|
4205
4136
|
}
|
4206
4137
|
*/
|
4207
4138
|
/**
|
4208
|
-
* For arrays, use printArray() instead.This function causes a warning
|
4209
|
-
* the new print(Object...) and println(Object...) functions can't be
|
4210
|
-
* bound by the compiler.
|
4211
|
-
*
|
4212
|
-
* @param what
|
4139
|
+
* For arrays, use printArray() instead. This function causes a warning
|
4140
|
+
* because the new print(Object...) and println(Object...) functions can't be
|
4141
|
+
* reliably bound by the compiler.
|
4213
4142
|
*/
|
4214
4143
|
static public void println(Object what) {
|
4215
4144
|
if (what == null) {
|
@@ -4348,10 +4277,11 @@ public class PApplet implements PConstants {
|
|
4348
4277
|
/**
|
4349
4278
|
* ( begin auto-generated from abs.xml )
|
4350
4279
|
*
|
4351
|
-
* Calculates the absolute value (magnitude) of a number.The absolute value
|
4352
|
-
* a number is always positive.
|
4280
|
+
* Calculates the absolute value (magnitude) of a number. The absolute value
|
4281
|
+
* of a number is always positive.
|
4282
|
+
*
|
4283
|
+
* ( end auto-generated )
|
4353
4284
|
*
|
4354
|
-
* @return
|
4355
4285
|
* @webref math:calculation
|
4356
4286
|
* @param n number to compute
|
4357
4287
|
*/
|
@@ -4366,13 +4296,12 @@ public class PApplet implements PConstants {
|
|
4366
4296
|
/**
|
4367
4297
|
* ( begin auto-generated from sq.xml )
|
4368
4298
|
*
|
4369
|
-
* Squares a number (multiplies a number by itself).The result is always a
|
4299
|
+
* Squares a number (multiplies a number by itself). The result is always a
|
4370
4300
|
* positive number, as multiplying two negative numbers always yields a
|
4371
4301
|
* positive result. For example, -1 * -1 = 1.
|
4372
4302
|
*
|
4373
4303
|
* ( end auto-generated )
|
4374
4304
|
*
|
4375
|
-
* @return
|
4376
4305
|
* @webref math:calculation
|
4377
4306
|
* @param n number to square
|
4378
4307
|
* @see PApplet#sqrt(float)
|
@@ -4384,14 +4313,13 @@ public class PApplet implements PConstants {
|
|
4384
4313
|
/**
|
4385
4314
|
* ( begin auto-generated from sqrt.xml )
|
4386
4315
|
*
|
4387
|
-
* Calculates the square root of a number.The square root of a number is
|
4316
|
+
* Calculates the square root of a number. The square root of a number is
|
4388
4317
|
* always positive, even though there may be a valid negative root. The square
|
4389
4318
|
* root <b>s</b> of number <b>a</b> is such that <b>s*s = a</b>. It is the
|
4390
4319
|
* opposite of squaring.
|
4391
4320
|
*
|
4392
4321
|
* ( end auto-generated )
|
4393
4322
|
*
|
4394
|
-
* @return
|
4395
4323
|
* @webref math:calculation
|
4396
4324
|
* @param n non-negative number
|
4397
4325
|
* @see PApplet#pow(float, float)
|
@@ -4404,11 +4332,11 @@ public class PApplet implements PConstants {
|
|
4404
4332
|
/**
|
4405
4333
|
* ( begin auto-generated from log.xml )
|
4406
4334
|
*
|
4407
|
-
* Calculates the natural logarithm (the base-<i>e</i> logarithm) of a
|
4408
|
-
*
|
4409
|
-
*
|
4335
|
+
* Calculates the natural logarithm (the base-<i>e</i> logarithm) of a number.
|
4336
|
+
* This function expects the values greater than 0.0.
|
4337
|
+
*
|
4338
|
+
* ( end auto-generated )
|
4410
4339
|
*
|
4411
|
-
* @return
|
4412
4340
|
* @webref math:calculation
|
4413
4341
|
* @param n number greater than 0.0
|
4414
4342
|
*/
|
@@ -4420,9 +4348,10 @@ public class PApplet implements PConstants {
|
|
4420
4348
|
* ( begin auto-generated from exp.xml )
|
4421
4349
|
*
|
4422
4350
|
* Returns Euler's number <i>e</i> (2.71828...) raised to the power of the
|
4423
|
-
* <b>value</b> parameter.
|
4351
|
+
* <b>value</b> parameter.
|
4352
|
+
*
|
4353
|
+
* ( end auto-generated )
|
4424
4354
|
*
|
4425
|
-
* @return
|
4426
4355
|
* @webref math:calculation
|
4427
4356
|
* @param n exponent to raise
|
4428
4357
|
*/
|
@@ -4433,14 +4362,13 @@ public class PApplet implements PConstants {
|
|
4433
4362
|
/**
|
4434
4363
|
* ( begin auto-generated from pow.xml )
|
4435
4364
|
*
|
4436
|
-
* Facilitates exponential expressions.The <b>pow()</b> function is an
|
4365
|
+
* Facilitates exponential expressions. The <b>pow()</b> function is an
|
4437
4366
|
* efficient way of multiplying numbers by themselves (or their reciprocal) in
|
4438
4367
|
* large quantities. For example, <b>pow(3, 5)</b> is equivalent to the
|
4439
4368
|
* expression 3*3*3*3*3 and <b>pow(3, -5)</b> is equivalent to 1 / 3*3*3*3*3.
|
4440
4369
|
*
|
4441
4370
|
* ( end auto-generated )
|
4442
4371
|
*
|
4443
|
-
* @return
|
4444
4372
|
* @webref math:calculation
|
4445
4373
|
* @param n base of the exponential expression
|
4446
4374
|
* @param e power by which to raise the base
|
@@ -4453,10 +4381,10 @@ public class PApplet implements PConstants {
|
|
4453
4381
|
/**
|
4454
4382
|
* ( begin auto-generated from max.xml )
|
4455
4383
|
*
|
4456
|
-
* Determines the largest value in a sequence of numbers.
|
4457
|
-
*
|
4384
|
+
* Determines the largest value in a sequence of numbers.
|
4385
|
+
*
|
4386
|
+
* ( end auto-generated )
|
4458
4387
|
*
|
4459
|
-
* @return
|
4460
4388
|
* @webref math:calculation
|
4461
4389
|
* @param a first number to compare
|
4462
4390
|
* @param b second number to compare
|
@@ -4476,10 +4404,7 @@ public class PApplet implements PConstants {
|
|
4476
4404
|
}
|
4477
4405
|
*/
|
4478
4406
|
/**
|
4479
|
-
* @param a
|
4480
4407
|
* @param c third number to compare
|
4481
|
-
* @param b
|
4482
|
-
* @return
|
4483
4408
|
*/
|
4484
4409
|
static public final int max(int a, int b, int c) {
|
4485
4410
|
return (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c);
|
@@ -4556,10 +4481,10 @@ public class PApplet implements PConstants {
|
|
4556
4481
|
/**
|
4557
4482
|
* ( begin auto-generated from min.xml )
|
4558
4483
|
*
|
4559
|
-
* Determines the smallest value in a sequence of numbers.
|
4484
|
+
* Determines the smallest value in a sequence of numbers.
|
4560
4485
|
*
|
4486
|
+
* ( end auto-generated )
|
4561
4487
|
*
|
4562
|
-
* @return
|
4563
4488
|
* @webref math:calculation
|
4564
4489
|
* @param a first number
|
4565
4490
|
* @param b second number
|
@@ -4577,7 +4502,6 @@ public class PApplet implements PConstants {
|
|
4577
4502
|
*/
|
4578
4503
|
/**
|
4579
4504
|
* @param list array of numbers to compare
|
4580
|
-
* @return
|
4581
4505
|
*/
|
4582
4506
|
static public final int min(int[] list) {
|
4583
4507
|
if (list.length == 0) {
|
@@ -4631,10 +4555,10 @@ public class PApplet implements PConstants {
|
|
4631
4555
|
/**
|
4632
4556
|
* ( begin auto-generated from constrain.xml )
|
4633
4557
|
*
|
4634
|
-
* Constrains a value to not exceed a maximum and minimum value.
|
4558
|
+
* Constrains a value to not exceed a maximum and minimum value.
|
4635
4559
|
*
|
4560
|
+
* ( end auto-generated )
|
4636
4561
|
*
|
4637
|
-
* @return
|
4638
4562
|
* @webref math:calculation
|
4639
4563
|
* @param amt the value to constrain
|
4640
4564
|
* @param low minimum limit
|
@@ -4649,12 +4573,12 @@ public class PApplet implements PConstants {
|
|
4649
4573
|
/**
|
4650
4574
|
* ( begin auto-generated from sin.xml )
|
4651
4575
|
*
|
4652
|
-
* Calculates the sine of an angle.This function expects the values of the
|
4653
|
-
|
4654
|
-
|
4655
|
-
|
4576
|
+
* Calculates the sine of an angle. This function expects the values of the
|
4577
|
+
* <b>angle</b> parameter to be provided in radians (values from 0 to 6.28).
|
4578
|
+
* Values are returned in the range -1 to 1.
|
4579
|
+
*
|
4580
|
+
* ( end auto-generated )
|
4656
4581
|
*
|
4657
|
-
* @return
|
4658
4582
|
* @webref math:trigonometry
|
4659
4583
|
* @param angle an angle in radians
|
4660
4584
|
* @see PApplet#cos(float)
|
@@ -4668,12 +4592,12 @@ public class PApplet implements PConstants {
|
|
4668
4592
|
/**
|
4669
4593
|
* ( begin auto-generated from cos.xml )
|
4670
4594
|
*
|
4671
|
-
* Calculates the cosine of an angle.This function expects the values of the
|
4672
|
-
|
4673
|
-
|
4674
|
-
|
4595
|
+
* Calculates the cosine of an angle. This function expects the values of the
|
4596
|
+
* <b>angle</b> parameter to be provided in radians (values from 0 to PI*2).
|
4597
|
+
* Values are returned in the range -1 to 1.
|
4598
|
+
*
|
4599
|
+
* ( end auto-generated )
|
4675
4600
|
*
|
4676
|
-
* @return
|
4677
4601
|
* @webref math:trigonometry
|
4678
4602
|
* @param angle an angle in radians
|
4679
4603
|
* @see PApplet#sin(float)
|
@@ -4687,14 +4611,13 @@ public class PApplet implements PConstants {
|
|
4687
4611
|
/**
|
4688
4612
|
* ( begin auto-generated from tan.xml )
|
4689
4613
|
*
|
4690
|
-
* Calculates the ratio of the sine and cosine of an angle.This function
|
4691
|
-
expects the values of the <b>angle</b> parameter to be provided in radians
|
4692
|
-
(values from 0 to PI*2). Values are returned in the range
|
4693
|
-
<b>infinity</b> to <b>-infinity</b>.
|
4614
|
+
* Calculates the ratio of the sine and cosine of an angle. This function
|
4615
|
+
* expects the values of the <b>angle</b> parameter to be provided in radians
|
4616
|
+
* (values from 0 to PI*2). Values are returned in the range
|
4617
|
+
* <b>infinity</b> to <b>-infinity</b>.
|
4694
4618
|
*
|
4695
4619
|
* ( end auto-generated )
|
4696
4620
|
*
|
4697
|
-
* @return
|
4698
4621
|
* @webref math:trigonometry
|
4699
4622
|
* @param angle an angle in radians
|
4700
4623
|
* @see PApplet#cos(float)
|
@@ -4708,11 +4631,12 @@ public class PApplet implements PConstants {
|
|
4708
4631
|
/**
|
4709
4632
|
* ( begin auto-generated from asin.xml )
|
4710
4633
|
*
|
4711
|
-
* The inverse of <b>sin()</b>, returns the arc sine of a value.This function
|
4712
|
-
expects the values in the range of -1 to 1 and values are returned in the
|
4713
|
-
range <b>-PI/2</b> to <b>PI/2</b>.
|
4634
|
+
* The inverse of <b>sin()</b>, returns the arc sine of a value. This function
|
4635
|
+
* expects the values in the range of -1 to 1 and values are returned in the
|
4636
|
+
* range <b>-PI/2</b> to <b>PI/2</b>.
|
4637
|
+
*
|
4638
|
+
* ( end auto-generated )
|
4714
4639
|
*
|
4715
|
-
* @return
|
4716
4640
|
* @webref math:trigonometry
|
4717
4641
|
* @param value the value whose arc sine is to be returned
|
4718
4642
|
* @see PApplet#sin(float)
|
@@ -4726,11 +4650,12 @@ public class PApplet implements PConstants {
|
|
4726
4650
|
/**
|
4727
4651
|
* ( begin auto-generated from acos.xml )
|
4728
4652
|
*
|
4729
|
-
* The inverse of <b>cos()</b>, returns the arc cosine of a value.This
|
4730
|
-
function expects the values in the range of -1 to 1 and values are returned
|
4731
|
-
in the range <b>0</b> to <b>PI (3.1415927)</b>.
|
4653
|
+
* The inverse of <b>cos()</b>, returns the arc cosine of a value. This
|
4654
|
+
* function expects the values in the range of -1 to 1 and values are returned
|
4655
|
+
* in the range <b>0</b> to <b>PI (3.1415927)</b>.
|
4656
|
+
*
|
4657
|
+
* ( end auto-generated )
|
4732
4658
|
*
|
4733
|
-
* @return
|
4734
4659
|
* @webref math:trigonometry
|
4735
4660
|
* @param value the value whose arc cosine is to be returned
|
4736
4661
|
* @see PApplet#cos(float)
|
@@ -4744,12 +4669,13 @@ public class PApplet implements PConstants {
|
|
4744
4669
|
/**
|
4745
4670
|
* ( begin auto-generated from atan.xml )
|
4746
4671
|
*
|
4747
|
-
* The inverse of <b>tan()</b>, returns the arc tangent of a value.This
|
4748
|
-
function expects the values in the range of -Infinity to Infinity
|
4749
|
-
(exclusive) and values are returned in the range <b>-PI/2</b> to <b>PI/2
|
4750
|
-
|
4672
|
+
* The inverse of <b>tan()</b>, returns the arc tangent of a value. This
|
4673
|
+
* function expects the values in the range of -Infinity to Infinity
|
4674
|
+
* (exclusive) and values are returned in the range <b>-PI/2</b> to <b>PI/2
|
4675
|
+
* </b>.
|
4676
|
+
*
|
4677
|
+
* ( end auto-generated )
|
4751
4678
|
*
|
4752
|
-
* @return
|
4753
4679
|
* @webref math:trigonometry
|
4754
4680
|
* @param value -Infinity to Infinity (exclusive)
|
4755
4681
|
* @see PApplet#tan(float)
|
@@ -4764,8 +4690,8 @@ public class PApplet implements PConstants {
|
|
4764
4690
|
* ( begin auto-generated from atan2.xml )
|
4765
4691
|
*
|
4766
4692
|
* Calculates the angle (in radians) from a specified point to the coordinate
|
4767
|
-
* origin as measured from the positive x-axis.Values are returned as a
|
4768
|
-
|
4693
|
+
* origin as measured from the positive x-axis. Values are returned as a
|
4694
|
+
* <b>float</b> in the range from <b>PI</b> to <b>-PI</b>. The <b>atan2()</b>
|
4769
4695
|
* function is most often used for orienting geometry to the position of the
|
4770
4696
|
* cursor. Note: The y-coordinate of the point is the first parameter and the
|
4771
4697
|
* x-coordinate is the second due the the structure of calculating the
|
@@ -4773,7 +4699,6 @@ public class PApplet implements PConstants {
|
|
4773
4699
|
*
|
4774
4700
|
* ( end auto-generated )
|
4775
4701
|
*
|
4776
|
-
* @return
|
4777
4702
|
* @webref math:trigonometry
|
4778
4703
|
* @param y y-coordinate of the point
|
4779
4704
|
* @param x x-coordinate of the point
|
@@ -4786,15 +4711,14 @@ public class PApplet implements PConstants {
|
|
4786
4711
|
/**
|
4787
4712
|
* ( begin auto-generated from degrees.xml )
|
4788
4713
|
*
|
4789
|
-
* Converts a radian measurement to its corresponding value in degrees.
|
4790
|
-
* There are 360
|
4791
|
-
degrees in a circle and 2*PI radians in a circle. For example, 90° =
|
4714
|
+
* Converts a radian measurement to its corresponding value in degrees.
|
4715
|
+
* Radians and degrees are two ways of measuring the same thing. There are 360
|
4716
|
+
* degrees in a circle and 2*PI radians in a circle. For example, 90° =
|
4792
4717
|
* PI/2 = 1.5707964. All trigonometric functions in Processing require their
|
4793
4718
|
* parameters to be specified in radians.
|
4794
4719
|
*
|
4795
4720
|
* ( end auto-generated )
|
4796
4721
|
*
|
4797
|
-
* @return
|
4798
4722
|
* @webref math:trigonometry
|
4799
4723
|
* @param radians radian value to convert to degrees
|
4800
4724
|
* @see PApplet#radians(float)
|
@@ -4806,15 +4730,14 @@ public class PApplet implements PConstants {
|
|
4806
4730
|
/**
|
4807
4731
|
* ( begin auto-generated from radians.xml )
|
4808
4732
|
*
|
4809
|
-
* Converts a degree measurement to its corresponding value in radians.
|
4810
|
-
* There are 360
|
4811
|
-
degrees in a circle and 2*PI radians in a circle. For example, 90° =
|
4733
|
+
* Converts a degree measurement to its corresponding value in radians.
|
4734
|
+
* Radians and degrees are two ways of measuring the same thing. There are 360
|
4735
|
+
* degrees in a circle and 2*PI radians in a circle. For example, 90° =
|
4812
4736
|
* PI/2 = 1.5707964. All trigonometric functions in Processing require their
|
4813
4737
|
* parameters to be specified in radians.
|
4814
4738
|
*
|
4815
4739
|
* ( end auto-generated )
|
4816
4740
|
*
|
4817
|
-
* @return
|
4818
4741
|
* @webref math:trigonometry
|
4819
4742
|
* @param degrees degree value to convert to radians
|
4820
4743
|
* @see PApplet#degrees(float)
|
@@ -4827,9 +4750,10 @@ public class PApplet implements PConstants {
|
|
4827
4750
|
* ( begin auto-generated from ceil.xml )
|
4828
4751
|
*
|
4829
4752
|
* Calculates the closest int value that is greater than or equal to the value
|
4830
|
-
* of the parameter.For example, <b>ceil(9.03)</b> returns the value 10.
|
4753
|
+
* of the parameter. For example, <b>ceil(9.03)</b> returns the value 10.
|
4754
|
+
*
|
4755
|
+
* ( end auto-generated )
|
4831
4756
|
*
|
4832
|
-
* @return
|
4833
4757
|
* @webref math:calculation
|
4834
4758
|
* @param n number to round up
|
4835
4759
|
* @see PApplet#floor(float)
|
@@ -4843,10 +4767,10 @@ public class PApplet implements PConstants {
|
|
4843
4767
|
* ( begin auto-generated from floor.xml )
|
4844
4768
|
*
|
4845
4769
|
* Calculates the closest int value that is less than or equal to the value of
|
4846
|
-
* the parameter.
|
4770
|
+
* the parameter.
|
4847
4771
|
*
|
4772
|
+
* ( end auto-generated )
|
4848
4773
|
*
|
4849
|
-
* @return
|
4850
4774
|
* @webref math:calculation
|
4851
4775
|
* @param n number to round down
|
4852
4776
|
* @see PApplet#ceil(float)
|
@@ -4859,10 +4783,11 @@ public class PApplet implements PConstants {
|
|
4859
4783
|
/**
|
4860
4784
|
* ( begin auto-generated from round.xml )
|
4861
4785
|
*
|
4862
|
-
* Calculates the integer closest to the <b>value</b> parameter.For example,
|
4863
|
-
|
4786
|
+
* Calculates the integer closest to the <b>value</b> parameter. For example,
|
4787
|
+
* <b>round(9.2)</b> returns the value 9.
|
4788
|
+
*
|
4789
|
+
* ( end auto-generated )
|
4864
4790
|
*
|
4865
|
-
* @return
|
4866
4791
|
* @webref math:calculation
|
4867
4792
|
* @param n number to round
|
4868
4793
|
* @see PApplet#floor(float)
|
@@ -4879,15 +4804,14 @@ public class PApplet implements PConstants {
|
|
4879
4804
|
/**
|
4880
4805
|
* ( begin auto-generated from mag.xml )
|
4881
4806
|
*
|
4882
|
-
* Calculates the magnitude (or length) of a vector.A vector is a direction
|
4883
|
-
in space commonly used in computer graphics and linear algebra. Because it
|
4884
|
-
has no "start" position, the magnitude of a vector can be thought of as the
|
4885
|
-
distance from coordinate (0,0) to its (x,y) value. Therefore, mag() is a
|
4886
|
-
shortcut for writing "dist(0, 0, x, y)".
|
4887
|
-
|
4888
|
-
( end auto-generated )
|
4807
|
+
* Calculates the magnitude (or length) of a vector. A vector is a direction
|
4808
|
+
* in space commonly used in computer graphics and linear algebra. Because it
|
4809
|
+
* has no "start" position, the magnitude of a vector can be thought of as the
|
4810
|
+
* distance from coordinate (0,0) to its (x,y) value. Therefore, mag() is a
|
4811
|
+
* shortcut for writing "dist(0, 0, x, y)".
|
4812
|
+
*
|
4813
|
+
* ( end auto-generated )
|
4889
4814
|
*
|
4890
|
-
* @return
|
4891
4815
|
* @webref math:calculation
|
4892
4816
|
* @param a first value
|
4893
4817
|
* @param b second value
|
@@ -4905,10 +4829,10 @@ public class PApplet implements PConstants {
|
|
4905
4829
|
/**
|
4906
4830
|
* ( begin auto-generated from dist.xml )
|
4907
4831
|
*
|
4908
|
-
* Calculates the distance between two points.
|
4832
|
+
* Calculates the distance between two points.
|
4909
4833
|
*
|
4834
|
+
* ( end auto-generated )
|
4910
4835
|
*
|
4911
|
-
* @return
|
4912
4836
|
* @webref math:calculation
|
4913
4837
|
* @param x1 x-coordinate of the first point
|
4914
4838
|
* @param y1 y-coordinate of the first point
|
@@ -4925,15 +4849,14 @@ public class PApplet implements PConstants {
|
|
4925
4849
|
/**
|
4926
4850
|
* ( begin auto-generated from lerp.xml )
|
4927
4851
|
*
|
4928
|
-
* Calculates a number between two numbers at a specific increment.The
|
4929
|
-
|
4930
|
-
where 0.0 equal to the first point, 0.1 is very near the first point, 0.5
|
4931
|
-
is half-way in between, etc. The lerp function is convenient for creating
|
4932
|
-
motion along a straight path and for drawing dotted lines.
|
4933
|
-
|
4934
|
-
( end auto-generated )
|
4852
|
+
* Calculates a number between two numbers at a specific increment. The
|
4853
|
+
* <b>amt</b> parameter is the amount to interpolate between the two values
|
4854
|
+
* where 0.0 equal to the first point, 0.1 is very near the first point, 0.5
|
4855
|
+
* is half-way in between, etc. The lerp function is convenient for creating
|
4856
|
+
* motion along a straight path and for drawing dotted lines.
|
4857
|
+
*
|
4858
|
+
* ( end auto-generated )
|
4935
4859
|
*
|
4936
|
-
* @return
|
4937
4860
|
* @webref math:calculation
|
4938
4861
|
* @param start first value
|
4939
4862
|
* @param stop second value
|
@@ -4950,14 +4873,15 @@ public class PApplet implements PConstants {
|
|
4950
4873
|
/**
|
4951
4874
|
* ( begin auto-generated from norm.xml )
|
4952
4875
|
*
|
4953
|
-
* Normalizes a number from another range into a value between 0 and 1.
|
4954
|
-
|
4955
|
-
|
4956
|
-
|
4876
|
+
* Normalizes a number from another range into a value between 0 and 1.
|
4877
|
+
*
|
4878
|
+
* Identical to map(value, low, high, 0, 1);
|
4879
|
+
*
|
4880
|
+
* Numbers outside the range are not clamped to 0 and 1, because out-of-range
|
4881
|
+
* values are often intentional and useful.
|
4957
4882
|
*
|
4958
4883
|
* ( end auto-generated )
|
4959
4884
|
*
|
4960
|
-
* @return
|
4961
4885
|
* @webref math:calculation
|
4962
4886
|
* @param value the incoming value to be converted
|
4963
4887
|
* @param start lower bound of the value's current range
|
@@ -4972,14 +4896,15 @@ public class PApplet implements PConstants {
|
|
4972
4896
|
/**
|
4973
4897
|
* ( begin auto-generated from map.xml )
|
4974
4898
|
*
|
4975
|
-
* Re-maps a number from one range to another.In the example above, the
|
4976
|
-
number '25' is converted from a value in the range 0..100 into a value that
|
4977
|
-
ranges from the left edge (0) to the right edge (width) of the screen.
|
4978
|
-
|
4979
|
-
|
4980
|
-
|
4899
|
+
* Re-maps a number from one range to another. In the example above, the
|
4900
|
+
* number '25' is converted from a value in the range 0..100 into a value that
|
4901
|
+
* ranges from the left edge (0) to the right edge (width) of the screen.
|
4902
|
+
*
|
4903
|
+
* Numbers outside the range are not clamped to 0 and 1, because out-of-range
|
4904
|
+
* values are often intentional and useful.
|
4905
|
+
*
|
4906
|
+
* ( end auto-generated )
|
4981
4907
|
*
|
4982
|
-
* @return
|
4983
4908
|
* @webref math:calculation
|
4984
4909
|
* @param value the incoming value to be converted
|
4985
4910
|
* @param start1 lower bound of the value's current range
|
@@ -5026,8 +4951,6 @@ public class PApplet implements PConstants {
|
|
5026
4951
|
|
5027
4952
|
/**
|
5028
4953
|
*
|
5029
|
-
* @param high
|
5030
|
-
* @return
|
5031
4954
|
*/
|
5032
4955
|
public final float random(float high) {
|
5033
4956
|
// avoid an infinite loop when 0 or NaN are passed in
|
@@ -5053,16 +4976,15 @@ public class PApplet implements PConstants {
|
|
5053
4976
|
* ( begin auto-generated from randomGaussian.xml )
|
5054
4977
|
*
|
5055
4978
|
* Returns a float from a random series of numbers having a mean of 0 and
|
5056
|
-
* standard deviation of 1.Each time the <b>randomGaussian()</b>
|
5057
|
-
function is called, it returns a number fitting a Gaussian, or normal,
|
5058
|
-
distribution. There is theoretically no minimum or maximum value that
|
5059
|
-
<b>randomGaussian()</b> might return. Rather, there is just a very low
|
4979
|
+
* standard deviation of 1. Each time the <b>randomGaussian()</b>
|
4980
|
+
* function is called, it returns a number fitting a Gaussian, or normal,
|
4981
|
+
* distribution. There is theoretically no minimum or maximum value that
|
4982
|
+
* <b>randomGaussian()</b> might return. Rather, there is just a very low
|
5060
4983
|
* probability that values far from the mean will be returned; and a higher
|
5061
4984
|
* probability that numbers near the mean will be returned.
|
5062
4985
|
*
|
5063
4986
|
* ( end auto-generated )
|
5064
4987
|
*
|
5065
|
-
* @return
|
5066
4988
|
* @webref math:random
|
5067
4989
|
* @see PApplet#random(float,float)
|
5068
4990
|
* @see PApplet#noise(float, float, float)
|
@@ -5077,9 +4999,9 @@ public class PApplet implements PConstants {
|
|
5077
4999
|
/**
|
5078
5000
|
* ( begin auto-generated from random.xml )
|
5079
5001
|
*
|
5080
|
-
* Generates random numbers.Each time the <b>random()</b> function is called,
|
5081
|
-
it returns an unexpected value within the specified range. If one parameter
|
5082
|
-
is passed to the function it will return a <b>float</b>
|
5002
|
+
* Generates random numbers. Each time the <b>random()</b> function is called,
|
5003
|
+
* it returns an unexpected value within the specified range. If one parameter
|
5004
|
+
* is passed to the function it will return a <b>float</b>
|
5083
5005
|
* between zero and the value of the <b>high</b> parameter. The function call
|
5084
5006
|
* <b>random(5)</b> returns values between 0 and 5 (starting at zero, up to
|
5085
5007
|
* but not including 5). If two parameters are passed, it will return a
|
@@ -5090,7 +5012,6 @@ public class PApplet implements PConstants {
|
|
5090
5012
|
*
|
5091
5013
|
* ( end auto-generated )
|
5092
5014
|
*
|
5093
|
-
* @return
|
5094
5015
|
* @webref math:random
|
5095
5016
|
* @param low lower limit
|
5096
5017
|
* @param high upper limit
|
@@ -5162,8 +5083,6 @@ public class PApplet implements PConstants {
|
|
5162
5083
|
Random perlinRandom;
|
5163
5084
|
|
5164
5085
|
/**
|
5165
|
-
* @param x
|
5166
|
-
* @return
|
5167
5086
|
*/
|
5168
5087
|
public float noise(float x) {
|
5169
5088
|
// is this legit? it's a dumb way to do it (but repair it later)
|
@@ -5171,9 +5090,6 @@ public class PApplet implements PConstants {
|
|
5171
5090
|
}
|
5172
5091
|
|
5173
5092
|
/**
|
5174
|
-
* @param x
|
5175
|
-
* @param y
|
5176
|
-
* @return
|
5177
5093
|
*/
|
5178
5094
|
public float noise(float x, float y) {
|
5179
5095
|
return noise(x, y, 0f);
|
@@ -5187,7 +5103,7 @@ public class PApplet implements PConstants {
|
|
5187
5103
|
* succession of numbers compared to the standard <b>random()</b> function. It
|
5188
5104
|
* was invented by Ken Perlin in the 1980s and been used since in graphical
|
5189
5105
|
* applications to produce procedural textures, natural motion, shapes,
|
5190
|
-
* terrains etc
|
5106
|
+
* terrains etc..contains The main difference to the
|
5191
5107
|
* <b>random()</b> function is that Perlin noise is defined in an infinite
|
5192
5108
|
* n-dimensional space where each pair of coordinates corresponds to a fixed
|
5193
5109
|
* semi-random value (fixed only for the lifespan of the program). The
|
@@ -5195,11 +5111,11 @@ public class PApplet implements PConstants {
|
|
5195
5111
|
* 1D, 2D and 3D noise, depending on the number of coordinates given. The
|
5196
5112
|
* noise value can be animated by moving through the noise space as
|
5197
5113
|
* demonstrated in the example above. The 2nd and 3rd dimension can also be
|
5198
|
-
* interpreted as time
|
5199
|
-
* signal, in respect to the function's use of frequencies. Similar to
|
5200
|
-
* concept of harmonics in physics, perlin noise is computed over several
|
5201
|
-
* octaves which are added together for the final result.
|
5202
|
-
* adjust the character of the resulting sequence is the scale of the input
|
5114
|
+
* interpreted as time..containsThe actual noise is structured similar to an
|
5115
|
+
* audio signal, in respect to the function's use of frequencies. Similar to
|
5116
|
+
* the concept of harmonics in physics, perlin noise is computed over several
|
5117
|
+
* octaves which are added together for the final result. .containsAnother way
|
5118
|
+
* to adjust the character of the resulting sequence is the scale of the input
|
5203
5119
|
* coordinates. As the function works within an infinite space the value of
|
5204
5120
|
* the coordinates doesn't matter as such, only the distance between
|
5205
5121
|
* successive coordinates does (eg. when using <b>noise()</b> within a loop).
|
@@ -5327,8 +5243,8 @@ public class PApplet implements PConstants {
|
|
5327
5243
|
* falloff factor of 0.75 means each octave will now have 75% impact (25%
|
5328
5244
|
* less) of the previous lower octave. Any value between 0.0 and 1.0 is valid,
|
5329
5245
|
* however note that values greater than 0.5 might result in greater than 1.0
|
5330
|
-
* values returned by <b>noise()</b
|
5331
|
-
* By changing these parameters, the signal created by the <b>noise()</b>
|
5246
|
+
* values returned by <b>noise()</b>.<br
|
5247
|
+
* />By changing these parameters, the signal created by the <b>noise()</b>
|
5332
5248
|
* function can be adapted to fit very specific needs and characteristics.
|
5333
5249
|
*
|
5334
5250
|
* ( end auto-generated )
|
@@ -5344,7 +5260,6 @@ public class PApplet implements PConstants {
|
|
5344
5260
|
}
|
5345
5261
|
|
5346
5262
|
/**
|
5347
|
-
* @param lod
|
5348
5263
|
* @see #noiseDetail(int)
|
5349
5264
|
* @param falloff falloff factor for each octave
|
5350
5265
|
*/
|
@@ -5389,33 +5304,35 @@ public class PApplet implements PConstants {
|
|
5389
5304
|
/**
|
5390
5305
|
* ( begin auto-generated from loadImage.xml )
|
5391
5306
|
*
|
5392
|
-
* Loads an image into a variable of type <b>PImage</b>.Four types of images
|
5393
|
-
( <b>.gif</b>, <b>.jpg</b>, <b>.tga</b>, <b>.png</b>) images may be loaded.
|
5394
|
-
|
5395
|
-
|
5396
|
-
*
|
5397
|
-
* <b>
|
5398
|
-
*
|
5399
|
-
*
|
5400
|
-
*
|
5401
|
-
*
|
5402
|
-
*
|
5403
|
-
*
|
5404
|
-
*
|
5405
|
-
*
|
5406
|
-
*
|
5407
|
-
*
|
5408
|
-
*
|
5409
|
-
*
|
5410
|
-
*
|
5411
|
-
*
|
5412
|
-
*
|
5413
|
-
*
|
5414
|
-
*
|
5415
|
-
*
|
5416
|
-
* (
|
5417
|
-
*
|
5418
|
-
*
|
5307
|
+
* Loads an image into a variable of type <b>PImage</b>. Four types of images
|
5308
|
+
* ( <b>.gif</b>, <b>.jpg</b>, <b>.tga</b>, <b>.png</b>) images may be loaded.
|
5309
|
+
* To load correctly, images must be located in the data directory of the
|
5310
|
+
* current sketch. In most cases, load all images in
|
5311
|
+
* <b>setup()</b> to preload them at the start of the program. Loading images
|
5312
|
+
* inside <b>draw()</b> will reduce the speed of a program.<br/>
|
5313
|
+
* <br/> <b>filename</b> parameter can also be a URL to a file found online.
|
5314
|
+
* For security reasons, a Processing sketch found online can only download
|
5315
|
+
* files from the same server from which it came. Getting around this
|
5316
|
+
* restriction requires a <a
|
5317
|
+
* href="http://wiki.processing.org/w/Sign_an_Applet">signed applet</a>.<br/>
|
5318
|
+
* <br/> <b>extension</b> parameter is used to determine the image type in
|
5319
|
+
* cases where the image filename does not end with a proper extension.
|
5320
|
+
* Specify the extension as the second parameter to <b>loadImage()</b>, as
|
5321
|
+
* shown in the third example on this page.<br/>
|
5322
|
+
* <br/> an image is not loaded successfully, the <b>null</b> value is
|
5323
|
+
* returned and an error message will be printed to the console. The error
|
5324
|
+
* message does not halt the program, however the null value may cause a
|
5325
|
+
* NullPointerException if your code does not check whether the value returned
|
5326
|
+
* from <b>loadImage()</b> is null.<br/>
|
5327
|
+
* <br/> on the type of error, a <b>PImage</b> object may still be returned,
|
5328
|
+
* but the width and height of the image will be set to -1. This happens if
|
5329
|
+
* bad image data is returned or cannot be decoded properly. Sometimes this
|
5330
|
+
* happens with image URLs that produce a 403 error or that redirect to a
|
5331
|
+
* password prompt, because <b>loadImage()</b> will attempt to interpret the
|
5332
|
+
* HTML as image data.
|
5333
|
+
*
|
5334
|
+
* ( end auto-generated )
|
5335
|
+
*
|
5419
5336
|
* @webref image:loading_displaying
|
5420
5337
|
* @param filename name of file to load, can be .gif, .jpg, .tga, or a handful
|
5421
5338
|
* of other image types depending on your platform
|
@@ -5442,9 +5359,7 @@ public class PApplet implements PConstants {
|
|
5442
5359
|
// return loadImage(filename, null, params);
|
5443
5360
|
// }
|
5444
5361
|
/**
|
5445
|
-
* @param filename
|
5446
5362
|
* @param extension type of image to load, for example "png", "gif", "jpg"
|
5447
|
-
* @return
|
5448
5363
|
*/
|
5449
5364
|
public PImage loadImage(String filename, String extension) { //, Object params) {
|
5450
5365
|
|
@@ -5455,7 +5370,127 @@ public class PApplet implements PConstants {
|
|
5455
5370
|
g.awaitAsyncSaveCompletion(filename);
|
5456
5371
|
}
|
5457
5372
|
|
5458
|
-
|
5373
|
+
if (extension == null) {
|
5374
|
+
String lower = filename.toLowerCase();
|
5375
|
+
int dot = filename.lastIndexOf('.');
|
5376
|
+
if (dot == -1) {
|
5377
|
+
extension = "unknown"; // no extension found
|
5378
|
+
|
5379
|
+
} else {
|
5380
|
+
extension = lower.substring(dot + 1);
|
5381
|
+
|
5382
|
+
// check for, and strip any parameters on the url, i.e.
|
5383
|
+
// filename.jpg?blah=blah&something=that
|
5384
|
+
int question = extension.indexOf('?');
|
5385
|
+
if (question != -1) {
|
5386
|
+
extension = extension.substring(0, question);
|
5387
|
+
}
|
5388
|
+
}
|
5389
|
+
}
|
5390
|
+
|
5391
|
+
// just in case. them users will try anything!
|
5392
|
+
extension = extension.toLowerCase();
|
5393
|
+
|
5394
|
+
if (extension.equals("tga")) {
|
5395
|
+
try {
|
5396
|
+
PImage image = loadImageTGA(filename);
|
5397
|
+
// if (params != null) {
|
5398
|
+
// image.setParams(g, params);
|
5399
|
+
// }
|
5400
|
+
return image;
|
5401
|
+
} catch (IOException e) {
|
5402
|
+
printStackTrace(e);
|
5403
|
+
return null;
|
5404
|
+
}
|
5405
|
+
}
|
5406
|
+
|
5407
|
+
if (extension.equals("tif") || extension.equals("tiff")) {
|
5408
|
+
byte bytes[] = loadBytes(filename);
|
5409
|
+
PImage image = (bytes == null) ? null : PImage.loadTIFF(bytes);
|
5410
|
+
// if (params != null) {
|
5411
|
+
// image.setParams(g, params);
|
5412
|
+
// }
|
5413
|
+
return image;
|
5414
|
+
}
|
5415
|
+
|
5416
|
+
// For jpeg, gif, and png, load them using createImage(),
|
5417
|
+
// because the javax.imageio code was found to be much slower.
|
5418
|
+
// http://dev.processing.org/bugs/show_bug.cgi?id=392
|
5419
|
+
try {
|
5420
|
+
if (extension.equals("jpg") || extension.equals("jpeg")
|
5421
|
+
|| extension.equals("gif") || extension.equals("png")
|
5422
|
+
|| extension.equals("unknown")) {
|
5423
|
+
byte bytes[] = loadBytes(filename);
|
5424
|
+
if (bytes == null) {
|
5425
|
+
return null;
|
5426
|
+
} else {
|
5427
|
+
//Image awtImage = Toolkit.getDefaultToolkit().createImage(bytes);
|
5428
|
+
Image awtImage = new ImageIcon(bytes).getImage();
|
5429
|
+
|
5430
|
+
if (awtImage instanceof BufferedImage) {
|
5431
|
+
BufferedImage buffImage = (BufferedImage) awtImage;
|
5432
|
+
int space = buffImage.getColorModel().getColorSpace().getType();
|
5433
|
+
if (space == ColorSpace.TYPE_CMYK) {
|
5434
|
+
System.err.println(filename + " is a CMYK image, "
|
5435
|
+
+ "only RGB images are supported.");
|
5436
|
+
return null;
|
5437
|
+
/*
|
5438
|
+
// wishful thinking, appears to not be supported
|
5439
|
+
// https://community.oracle.com/thread/1272045?start=0&tstart=0
|
5440
|
+
BufferedImage destImage =
|
5441
|
+
new BufferedImage(buffImage.getWidth(),
|
5442
|
+
buffImage.getHeight(),
|
5443
|
+
BufferedImage.TYPE_3BYTE_BGR);
|
5444
|
+
ColorConvertOp op = new ColorConvertOp(null);
|
5445
|
+
op.filter(buffImage, destImage);
|
5446
|
+
image = new PImage(destImage);
|
5447
|
+
*/
|
5448
|
+
}
|
5449
|
+
}
|
5450
|
+
|
5451
|
+
PImage image = new PImage(awtImage);
|
5452
|
+
if (image.width == -1) {
|
5453
|
+
System.err.println("The file " + filename
|
5454
|
+
+ " contains bad image data, or may not be an image.");
|
5455
|
+
}
|
5456
|
+
|
5457
|
+
// if it's a .gif image, test to see if it has transparency
|
5458
|
+
if (extension.equals("gif") || extension.equals("png")
|
5459
|
+
|| extension.equals("unknown")) {
|
5460
|
+
image.checkAlpha();
|
5461
|
+
}
|
5462
|
+
|
5463
|
+
// if (params != null) {
|
5464
|
+
// image.setParams(g, params);
|
5465
|
+
// }
|
5466
|
+
image.parent = this;
|
5467
|
+
return image;
|
5468
|
+
}
|
5469
|
+
}
|
5470
|
+
} catch (Exception e) {
|
5471
|
+
// show error, but move on to the stuff below, see if it'll work
|
5472
|
+
printStackTrace(e);
|
5473
|
+
}
|
5474
|
+
|
5475
|
+
if (loadImageFormats == null) {
|
5476
|
+
loadImageFormats = ImageIO.getReaderFormatNames();
|
5477
|
+
}
|
5478
|
+
if (loadImageFormats != null) {
|
5479
|
+
for (int i = 0; i < loadImageFormats.length; i++) {
|
5480
|
+
if (extension.equals(loadImageFormats[i])) {
|
5481
|
+
return loadImageIO(filename);
|
5482
|
+
// PImage image = loadImageIO(filename);
|
5483
|
+
// if (params != null) {
|
5484
|
+
// image.setParams(g, params);
|
5485
|
+
// }
|
5486
|
+
// return image;
|
5487
|
+
}
|
5488
|
+
}
|
5489
|
+
}
|
5490
|
+
|
5491
|
+
// failed, could not load image after all those attempts
|
5492
|
+
System.err.println("Could not find a method to load " + filename);
|
5493
|
+
return null;
|
5459
5494
|
}
|
5460
5495
|
|
5461
5496
|
static private final String REQUEST_IMAGE_THREAD_PREFIX = "requestImage";
|
@@ -5470,19 +5505,18 @@ public class PApplet implements PConstants {
|
|
5470
5505
|
* ( begin auto-generated from requestImage.xml )
|
5471
5506
|
*
|
5472
5507
|
* This function load images on a separate thread so that your sketch does not
|
5473
|
-
* freeze while images load during <b>setup()</b>.While the image is loading,
|
5474
|
-
its width and height will be 0. If an error occurs while loading the image,
|
5475
|
-
its width and height will be set to -1. You'll know when the image has
|
5476
|
-
loaded properly because its width and height will be greater than 0.
|
5477
|
-
Asynchronous image loading (particularly when downloading from a server)
|
5478
|
-
can dramatically improve performance.
|
5479
|
-
<b>extension</b> parameter is used to determine the image type in
|
5480
|
-
* where the image filename does not end with a proper extension.
|
5481
|
-
* extension as the second parameter to <b>requestImage()</b>.
|
5508
|
+
* freeze while images load during <b>setup()</b>. While the image is loading,
|
5509
|
+
* its width and height will be 0. If an error occurs while loading the image,
|
5510
|
+
* its width and height will be set to -1. You'll know when the image has
|
5511
|
+
* loaded properly because its width and height will be greater than 0.
|
5512
|
+
* Asynchronous image loading (particularly when downloading from a server)
|
5513
|
+
* can dramatically improve performance.
|
5514
|
+
* <br/> <b>extension</b> parameter is used to determine the image type in
|
5515
|
+
* cases where the image filename does not end with a proper extension.
|
5516
|
+
* Specify the extension as the second parameter to <b>requestImage()</b>.
|
5482
5517
|
*
|
5483
5518
|
* ( end auto-generated )
|
5484
5519
|
*
|
5485
|
-
* @return
|
5486
5520
|
* @webref image:loading_displaying
|
5487
5521
|
* @param filename name of the file to load, can be .gif, .jpg, .tga, or a
|
5488
5522
|
* handful of other image types depending on your platform
|
@@ -5500,7 +5534,11 @@ public class PApplet implements PConstants {
|
|
5500
5534
|
|
5501
5535
|
// if the image loading thread pool hasn't been created, create it
|
5502
5536
|
if (requestImagePool == null) {
|
5503
|
-
ThreadFactory factory =
|
5537
|
+
ThreadFactory factory = new ThreadFactory() {
|
5538
|
+
public Thread newThread(Runnable r) {
|
5539
|
+
return new Thread(r, REQUEST_IMAGE_THREAD_PREFIX);
|
5540
|
+
}
|
5541
|
+
};
|
5504
5542
|
requestImagePool = Executors.newFixedThreadPool(4, factory);
|
5505
5543
|
}
|
5506
5544
|
requestImagePool.execute(() -> {
|
@@ -5525,6 +5563,256 @@ public class PApplet implements PConstants {
|
|
5525
5563
|
return vessel;
|
5526
5564
|
}
|
5527
5565
|
|
5566
|
+
/**
|
5567
|
+
* Use Java 1.4 ImageIO methods to load an image.
|
5568
|
+
*/
|
5569
|
+
protected PImage loadImageIO(String filename) {
|
5570
|
+
InputStream stream = createInput(filename);
|
5571
|
+
if (stream == null) {
|
5572
|
+
System.err.println("The image " + filename + " could not be found.");
|
5573
|
+
return null;
|
5574
|
+
}
|
5575
|
+
|
5576
|
+
try {
|
5577
|
+
BufferedImage bi = ImageIO.read(stream);
|
5578
|
+
PImage outgoing = new PImage(bi.getWidth(), bi.getHeight());
|
5579
|
+
outgoing.parent = this;
|
5580
|
+
|
5581
|
+
bi.getRGB(0, 0, outgoing.width, outgoing.height,
|
5582
|
+
outgoing.pixels, 0, outgoing.width);
|
5583
|
+
|
5584
|
+
// check the alpha for this image
|
5585
|
+
// was gonna call getType() on the image to see if RGB or ARGB,
|
5586
|
+
// but it's not actually useful, since gif images will come through
|
5587
|
+
// as TYPE_BYTE_INDEXED, which means it'll still have to check for
|
5588
|
+
// the transparency. also, would have to iterate through all the other
|
5589
|
+
// types and guess whether alpha was in there, so.. just gonna stick
|
5590
|
+
// with the old method.
|
5591
|
+
outgoing.checkAlpha();
|
5592
|
+
|
5593
|
+
stream.close();
|
5594
|
+
// return the image
|
5595
|
+
return outgoing;
|
5596
|
+
|
5597
|
+
} catch (Exception e) {
|
5598
|
+
printStackTrace(e);
|
5599
|
+
return null;
|
5600
|
+
}
|
5601
|
+
}
|
5602
|
+
|
5603
|
+
/**
|
5604
|
+
* Targa image loader for RLE-compressed TGA files.
|
5605
|
+
* <p>
|
5606
|
+
* Rewritten for 0115 to read/write RLE-encoded targa images. For 0125,
|
5607
|
+
* non-RLE encoded images are now supported, along with images whose y-order
|
5608
|
+
* is reversed (which is standard for TGA files).
|
5609
|
+
* <p>
|
5610
|
+
* A version of this function is in MovieMaker.java. Any fixes here should be
|
5611
|
+
* applied over in MovieMaker as well.
|
5612
|
+
* <p>
|
5613
|
+
* Known issue with RLE encoding and odd behavior in some apps:
|
5614
|
+
* https://github.com/processing/processing/issues/2096 Please help!
|
5615
|
+
*/
|
5616
|
+
protected PImage loadImageTGA(String filename) throws IOException {
|
5617
|
+
InputStream is = createInput(filename);
|
5618
|
+
if (is == null) {
|
5619
|
+
return null;
|
5620
|
+
}
|
5621
|
+
|
5622
|
+
byte header[] = new byte[18];
|
5623
|
+
int offset = 0;
|
5624
|
+
do {
|
5625
|
+
int count = is.read(header, offset, header.length - offset);
|
5626
|
+
if (count == -1) {
|
5627
|
+
return null;
|
5628
|
+
}
|
5629
|
+
offset += count;
|
5630
|
+
} while (offset < 18);
|
5631
|
+
|
5632
|
+
/*
|
5633
|
+
header[2] image type code
|
5634
|
+
2 (0x02) - Uncompressed, RGB images.
|
5635
|
+
3 (0x03) - Uncompressed, black and white images.
|
5636
|
+
10 (0x0A) - Run-length encoded RGB images.
|
5637
|
+
11 (0x0B) - Compressed, black and white images. (grayscale?)
|
5638
|
+
|
5639
|
+
header[16] is the bit depth (8, 24, 32)
|
5640
|
+
|
5641
|
+
header[17] image descriptor (packed bits)
|
5642
|
+
0x20 is 32 = origin upper-left
|
5643
|
+
0x28 is 32 + 8 = origin upper-left + 32 bits
|
5644
|
+
|
5645
|
+
7 6 5 4 3 2 1 0
|
5646
|
+
128 64 32 16 8 4 2 1
|
5647
|
+
*/
|
5648
|
+
int format = 0;
|
5649
|
+
|
5650
|
+
if (((header[2] == 3) || (header[2] == 11))
|
5651
|
+
&& // B&W, plus RLE or not
|
5652
|
+
(header[16] == 8)
|
5653
|
+
&& // 8 bits
|
5654
|
+
((header[17] == 0x8) || (header[17] == 0x28))) { // origin, 32 bit
|
5655
|
+
format = ALPHA;
|
5656
|
+
|
5657
|
+
} else if (((header[2] == 2) || (header[2] == 10))
|
5658
|
+
&& // RGB, RLE or not
|
5659
|
+
(header[16] == 24)
|
5660
|
+
&& // 24 bits
|
5661
|
+
((header[17] == 0x20) || (header[17] == 0))) { // origin
|
5662
|
+
format = RGB;
|
5663
|
+
|
5664
|
+
} else if (((header[2] == 2) || (header[2] == 10))
|
5665
|
+
&& (header[16] == 32)
|
5666
|
+
&& ((header[17] == 0x8) || (header[17] == 0x28))) { // origin, 32
|
5667
|
+
format = ARGB;
|
5668
|
+
}
|
5669
|
+
|
5670
|
+
if (format == 0) {
|
5671
|
+
System.err.println("Unknown .tga file format for " + filename);
|
5672
|
+
//" (" + header[2] + " " +
|
5673
|
+
//(header[16] & 0xff) + " " +
|
5674
|
+
//hex(header[17], 2) + ")");
|
5675
|
+
return null;
|
5676
|
+
}
|
5677
|
+
|
5678
|
+
int w = ((header[13] & 0xff) << 8) + (header[12] & 0xff);
|
5679
|
+
int h = ((header[15] & 0xff) << 8) + (header[14] & 0xff);
|
5680
|
+
PImage outgoing = createImage(w, h, format);
|
5681
|
+
|
5682
|
+
// where "reversed" means upper-left corner (normal for most of
|
5683
|
+
// the modernized world, but "reversed" for the tga spec)
|
5684
|
+
//boolean reversed = (header[17] & 0x20) != 0;
|
5685
|
+
// https://github.com/processing/processing/issues/1682
|
5686
|
+
boolean reversed = (header[17] & 0x20) == 0;
|
5687
|
+
|
5688
|
+
if ((header[2] == 2) || (header[2] == 3)) { // not RLE encoded
|
5689
|
+
if (reversed) {
|
5690
|
+
int index = (h - 1) * w;
|
5691
|
+
switch (format) {
|
5692
|
+
case ALPHA:
|
5693
|
+
for (int y = h - 1; y >= 0; y--) {
|
5694
|
+
for (int x = 0; x < w; x++) {
|
5695
|
+
outgoing.pixels[index + x] = is.read();
|
5696
|
+
}
|
5697
|
+
index -= w;
|
5698
|
+
}
|
5699
|
+
break;
|
5700
|
+
case RGB:
|
5701
|
+
for (int y = h - 1; y >= 0; y--) {
|
5702
|
+
for (int x = 0; x < w; x++) {
|
5703
|
+
outgoing.pixels[index + x]
|
5704
|
+
= is.read() | (is.read() << 8) | (is.read() << 16)
|
5705
|
+
| 0xff000000;
|
5706
|
+
}
|
5707
|
+
index -= w;
|
5708
|
+
}
|
5709
|
+
break;
|
5710
|
+
case ARGB:
|
5711
|
+
for (int y = h - 1; y >= 0; y--) {
|
5712
|
+
for (int x = 0; x < w; x++) {
|
5713
|
+
outgoing.pixels[index + x]
|
5714
|
+
= is.read() | (is.read() << 8) | (is.read() << 16)
|
5715
|
+
| (is.read() << 24);
|
5716
|
+
}
|
5717
|
+
index -= w;
|
5718
|
+
}
|
5719
|
+
}
|
5720
|
+
} else { // not reversed
|
5721
|
+
int count = w * h;
|
5722
|
+
switch (format) {
|
5723
|
+
case ALPHA:
|
5724
|
+
for (int i = 0; i < count; i++) {
|
5725
|
+
outgoing.pixels[i] = is.read();
|
5726
|
+
}
|
5727
|
+
break;
|
5728
|
+
case RGB:
|
5729
|
+
for (int i = 0; i < count; i++) {
|
5730
|
+
outgoing.pixels[i]
|
5731
|
+
= is.read() | (is.read() << 8) | (is.read() << 16)
|
5732
|
+
| 0xff000000;
|
5733
|
+
}
|
5734
|
+
break;
|
5735
|
+
case ARGB:
|
5736
|
+
for (int i = 0; i < count; i++) {
|
5737
|
+
outgoing.pixels[i]
|
5738
|
+
= is.read() | (is.read() << 8) | (is.read() << 16)
|
5739
|
+
| (is.read() << 24);
|
5740
|
+
}
|
5741
|
+
break;
|
5742
|
+
}
|
5743
|
+
}
|
5744
|
+
|
5745
|
+
} else { // header[2] is 10 or 11
|
5746
|
+
int index = 0;
|
5747
|
+
int px[] = outgoing.pixels;
|
5748
|
+
|
5749
|
+
while (index < px.length) {
|
5750
|
+
int num = is.read();
|
5751
|
+
boolean isRLE = (num & 0x80) != 0;
|
5752
|
+
if (isRLE) {
|
5753
|
+
num -= 127; // (num & 0x7F) + 1
|
5754
|
+
int pixel = 0;
|
5755
|
+
switch (format) {
|
5756
|
+
case ALPHA:
|
5757
|
+
pixel = is.read();
|
5758
|
+
break;
|
5759
|
+
case RGB:
|
5760
|
+
pixel = 0xFF000000
|
5761
|
+
| is.read() | (is.read() << 8) | (is.read() << 16);
|
5762
|
+
//(is.read() << 16) | (is.read() << 8) | is.read();
|
5763
|
+
break;
|
5764
|
+
case ARGB:
|
5765
|
+
pixel = is.read()
|
5766
|
+
| (is.read() << 8) | (is.read() << 16) | (is.read() << 24);
|
5767
|
+
break;
|
5768
|
+
}
|
5769
|
+
for (int i = 0; i < num; i++) {
|
5770
|
+
px[index++] = pixel;
|
5771
|
+
if (index == px.length) {
|
5772
|
+
break;
|
5773
|
+
}
|
5774
|
+
}
|
5775
|
+
} else { // write up to 127 bytes as uncompressed
|
5776
|
+
num += 1;
|
5777
|
+
switch (format) {
|
5778
|
+
case ALPHA:
|
5779
|
+
for (int i = 0; i < num; i++) {
|
5780
|
+
px[index++] = is.read();
|
5781
|
+
}
|
5782
|
+
break;
|
5783
|
+
case RGB:
|
5784
|
+
for (int i = 0; i < num; i++) {
|
5785
|
+
px[index++] = 0xFF000000
|
5786
|
+
| is.read() | (is.read() << 8) | (is.read() << 16);
|
5787
|
+
//(is.read() << 16) | (is.read() << 8) | is.read();
|
5788
|
+
}
|
5789
|
+
break;
|
5790
|
+
case ARGB:
|
5791
|
+
for (int i = 0; i < num; i++) {
|
5792
|
+
px[index++] = is.read()
|
5793
|
+
| //(is.read() << 24) |
|
5794
|
+
(is.read() << 8) | (is.read() << 16) | (is.read() << 24);
|
5795
|
+
//(is.read() << 16) | (is.read() << 8) | is.read();
|
5796
|
+
}
|
5797
|
+
break;
|
5798
|
+
}
|
5799
|
+
}
|
5800
|
+
}
|
5801
|
+
|
5802
|
+
if (!reversed) {
|
5803
|
+
int[] temp = new int[w];
|
5804
|
+
for (int y = 0; y < h / 2; y++) {
|
5805
|
+
int z = (h - 1) - y;
|
5806
|
+
System.arraycopy(px, y * w, temp, 0, w);
|
5807
|
+
System.arraycopy(px, z * w, px, y * w, w);
|
5808
|
+
System.arraycopy(temp, 0, px, z * w, w);
|
5809
|
+
}
|
5810
|
+
}
|
5811
|
+
}
|
5812
|
+
is.close();
|
5813
|
+
return outgoing;
|
5814
|
+
}
|
5815
|
+
|
5528
5816
|
//////////////////////////////////////////////////////////////
|
5529
5817
|
// DATA I/O
|
5530
5818
|
// /**
|
@@ -5546,7 +5834,6 @@ public class PApplet implements PConstants {
|
|
5546
5834
|
// }
|
5547
5835
|
// }
|
5548
5836
|
/**
|
5549
|
-
* @return
|
5550
5837
|
* @webref input:files
|
5551
5838
|
* @param filename name of a file in the data folder or a URL.
|
5552
5839
|
* @see XML
|
@@ -5574,7 +5861,13 @@ public class PApplet implements PConstants {
|
|
5574
5861
|
|
5575
5862
|
// can't use catch-all exception, since it might catch the
|
5576
5863
|
// RuntimeException about the incorrect case sensitivity
|
5577
|
-
} catch (IOException
|
5864
|
+
} catch (IOException e) {
|
5865
|
+
throw new RuntimeException(e);
|
5866
|
+
|
5867
|
+
} catch (ParserConfigurationException e) {
|
5868
|
+
throw new RuntimeException(e);
|
5869
|
+
|
5870
|
+
} catch (SAXException e) {
|
5578
5871
|
throw new RuntimeException(e);
|
5579
5872
|
}
|
5580
5873
|
}
|
@@ -5596,13 +5889,12 @@ public class PApplet implements PConstants {
|
|
5596
5889
|
try {
|
5597
5890
|
return XML.parse(xmlString, options);
|
5598
5891
|
|
5599
|
-
} catch (
|
5892
|
+
} catch (Exception e) {
|
5600
5893
|
throw new RuntimeException(e);
|
5601
5894
|
}
|
5602
5895
|
}
|
5603
5896
|
|
5604
5897
|
/**
|
5605
|
-
* @return
|
5606
5898
|
* @webref output:files
|
5607
5899
|
* @param xml the XML object to save to disk
|
5608
5900
|
* @param filename name of the file to write to
|
@@ -5622,7 +5914,6 @@ public class PApplet implements PConstants {
|
|
5622
5914
|
}
|
5623
5915
|
|
5624
5916
|
/**
|
5625
|
-
* @return
|
5626
5917
|
* @webref input:files
|
5627
5918
|
* @param input String to parse as a JSONObject
|
5628
5919
|
* @see PApplet#loadJSONObject(String)
|
@@ -5633,7 +5924,6 @@ public class PApplet implements PConstants {
|
|
5633
5924
|
}
|
5634
5925
|
|
5635
5926
|
/**
|
5636
|
-
* @return
|
5637
5927
|
* @webref input:files
|
5638
5928
|
* @param filename name of a file in the data folder or a URL
|
5639
5929
|
* @see JSONObject
|
@@ -5649,6 +5939,7 @@ public class PApplet implements PConstants {
|
|
5649
5939
|
try {
|
5650
5940
|
reader.close();
|
5651
5941
|
} catch (IOException e) { // not sure what would cause this
|
5942
|
+
e.printStackTrace();
|
5652
5943
|
}
|
5653
5944
|
return outgoing;
|
5654
5945
|
}
|
@@ -5663,12 +5954,12 @@ public class PApplet implements PConstants {
|
|
5663
5954
|
try {
|
5664
5955
|
reader.close();
|
5665
5956
|
} catch (IOException e) { // not sure what would cause this
|
5957
|
+
e.printStackTrace();
|
5666
5958
|
}
|
5667
5959
|
return outgoing;
|
5668
5960
|
}
|
5669
5961
|
|
5670
5962
|
/**
|
5671
|
-
* @return
|
5672
5963
|
* @webref output:files
|
5673
5964
|
* @param json the JSONObject to save
|
5674
5965
|
* @param filename the name of the file to save to
|
@@ -5683,18 +5974,14 @@ public class PApplet implements PConstants {
|
|
5683
5974
|
}
|
5684
5975
|
|
5685
5976
|
/**
|
5686
|
-
* @param json
|
5687
|
-
* @param filename
|
5688
5977
|
* @param options "compact" and "indent=N", replace N with the number of
|
5689
5978
|
* spaces
|
5690
|
-
* @return
|
5691
5979
|
*/
|
5692
5980
|
public boolean saveJSONObject(JSONObject json, String filename, String options) {
|
5693
5981
|
return json.save(saveFile(filename), options);
|
5694
5982
|
}
|
5695
5983
|
|
5696
5984
|
/**
|
5697
|
-
* @return
|
5698
5985
|
* @webref input:files
|
5699
5986
|
* @param input String to parse as a JSONArray
|
5700
5987
|
* @see JSONObject
|
@@ -5706,7 +5993,6 @@ public class PApplet implements PConstants {
|
|
5706
5993
|
}
|
5707
5994
|
|
5708
5995
|
/**
|
5709
|
-
* @return
|
5710
5996
|
* @webref input:files
|
5711
5997
|
* @param filename name of a file in the data folder or a URL
|
5712
5998
|
* @see JSONArray
|
@@ -5721,6 +6007,7 @@ public class PApplet implements PConstants {
|
|
5721
6007
|
try {
|
5722
6008
|
reader.close();
|
5723
6009
|
} catch (IOException e) { // not sure what would cause this
|
6010
|
+
e.printStackTrace();
|
5724
6011
|
}
|
5725
6012
|
return outgoing;
|
5726
6013
|
}
|
@@ -5732,12 +6019,12 @@ public class PApplet implements PConstants {
|
|
5732
6019
|
try {
|
5733
6020
|
reader.close();
|
5734
6021
|
} catch (IOException e) { // not sure what would cause this
|
6022
|
+
e.printStackTrace();
|
5735
6023
|
}
|
5736
6024
|
return outgoing;
|
5737
6025
|
}
|
5738
6026
|
|
5739
6027
|
/**
|
5740
|
-
* @return
|
5741
6028
|
* @webref output:files
|
5742
6029
|
* @param json the JSONArray to save
|
5743
6030
|
* @param filename the name of the file to save to
|
@@ -5752,11 +6039,8 @@ public class PApplet implements PConstants {
|
|
5752
6039
|
}
|
5753
6040
|
|
5754
6041
|
/**
|
5755
|
-
* @param json
|
5756
|
-
* @param filename
|
5757
6042
|
* @param options "compact" and "indent=N", replace N with the number of
|
5758
6043
|
* spaces
|
5759
|
-
* @return
|
5760
6044
|
*/
|
5761
6045
|
public boolean saveJSONArray(JSONArray json, String filename, String options) {
|
5762
6046
|
return json.save(saveFile(filename), options);
|
@@ -5772,7 +6056,6 @@ public class PApplet implements PConstants {
|
|
5772
6056
|
// return new Table();
|
5773
6057
|
// }
|
5774
6058
|
/**
|
5775
|
-
* @return
|
5776
6059
|
* @webref input:files
|
5777
6060
|
* @param filename name of a file in the data folder or a URL.
|
5778
6061
|
* @see Table
|
@@ -5786,26 +6069,24 @@ public class PApplet implements PConstants {
|
|
5786
6069
|
}
|
5787
6070
|
|
5788
6071
|
/**
|
5789
|
-
* Options may contain "header", "tsv", "csv", or "bin" separated by commas.
|
5790
|
-
a "dictionary" file that contains a mapping of the column titles and the
|
5791
|
-
data types used in the table file.This can be far more efficient (in terms
|
5792
|
-
of speed and memory usage) for loading and parsing tables.
|
6072
|
+
* Options may contain "header", "tsv", "csv", or "bin" separated by commas.
|
5793
6073
|
*
|
5794
|
-
*
|
5795
|
-
|
5796
|
-
|
6074
|
+
* Another option is "dictionary=filename.tsv", which allows users to specify
|
6075
|
+
* a "dictionary" file that contains a mapping of the column titles and the
|
6076
|
+
* data types used in the table file. This can be far more efficient (in terms
|
6077
|
+
* of speed and memory usage) for loading and parsing tables. The dictionary
|
6078
|
+
* file can only be tab separated values (.tsv) and its extension will be
|
6079
|
+
* ignored. This option was added in Processing 2.0.2.
|
5797
6080
|
*
|
5798
|
-
* @param filename
|
5799
6081
|
* @param options may contain "header", "tsv", "csv", or "bin" separated by
|
5800
6082
|
* commas
|
5801
|
-
* @return
|
5802
6083
|
*/
|
5803
6084
|
public Table loadTable(String filename, String options) {
|
5804
6085
|
try {
|
5805
6086
|
String optionStr = Table.extensionOptions(true, filename, options);
|
5806
6087
|
String[] optionList = trim(split(optionStr, ','));
|
5807
6088
|
|
5808
|
-
Table dictionary;
|
6089
|
+
Table dictionary = null;
|
5809
6090
|
for (String opt : optionList) {
|
5810
6091
|
if (opt.startsWith("dictionary=")) {
|
5811
6092
|
dictionary = loadTable(opt.substring(opt.indexOf('=') + 1), "tsv");
|
@@ -5826,23 +6107,18 @@ public class PApplet implements PConstants {
|
|
5826
6107
|
}
|
5827
6108
|
|
5828
6109
|
/**
|
5829
|
-
* @webref
|
5830
|
-
* @return output:files
|
6110
|
+
* @webref output:files
|
5831
6111
|
* @param table the Table object to save to a file
|
5832
6112
|
* @param filename the filename to which the Table should be saved
|
5833
6113
|
* @see Table
|
5834
6114
|
* @see PApplet#loadTable(String)
|
5835
6115
|
*/
|
5836
|
-
|
5837
6116
|
public boolean saveTable(Table table, String filename) {
|
5838
6117
|
return saveTable(table, filename, null);
|
5839
6118
|
}
|
5840
6119
|
|
5841
6120
|
/**
|
5842
|
-
* @param table
|
5843
6121
|
* @param options can be one of "tsv", "csv", "bin", or "html"
|
5844
|
-
* @param filename
|
5845
|
-
* @return
|
5846
6122
|
*/
|
5847
6123
|
public boolean saveTable(Table table, String filename, String options) {
|
5848
6124
|
// String ext = checkExtension(filename);
|
@@ -6114,60 +6390,58 @@ public class PApplet implements PConstants {
|
|
6114
6390
|
|
6115
6391
|
// Will remove the 'sketch' parameter once we get an upstream JOGL fix
|
6116
6392
|
// https://github.com/processing/processing/issues/3831
|
6117
|
-
static protected void selectImpl(final String prompt,
|
6118
|
-
final String callbackMethod,
|
6119
|
-
final File defaultSelection,
|
6120
|
-
final Object callbackObject,
|
6121
|
-
final Frame parentFrame,
|
6122
|
-
final int mode,
|
6123
|
-
final PApplet sketch) {
|
6124
|
-
EventQueue.invokeLater(
|
6125
|
-
|
6126
|
-
File selectedFile = null;
|
6127
|
-
|
6128
|
-
boolean hide = (sketch != null)
|
6129
|
-
&& (sketch.g instanceof PGraphicsOpenGL) && (platform == WINDOWS);
|
6130
|
-
if (hide) {
|
6131
|
-
sketch.surface.setVisible(false);
|
6132
|
-
}
|
6393
|
+
static protected void selectImpl(final String prompt,
|
6394
|
+
final String callbackMethod,
|
6395
|
+
final File defaultSelection,
|
6396
|
+
final Object callbackObject,
|
6397
|
+
final Frame parentFrame,
|
6398
|
+
final int mode,
|
6399
|
+
final PApplet sketch) {
|
6400
|
+
EventQueue.invokeLater(() -> {
|
6401
|
+
File selectedFile = null;
|
6133
6402
|
|
6134
|
-
|
6135
|
-
|
6136
|
-
|
6137
|
-
|
6138
|
-
|
6139
|
-
}
|
6403
|
+
boolean hide = (sketch != null)
|
6404
|
+
&& (sketch.g instanceof PGraphicsOpenGL) && (platform == WINDOWS);
|
6405
|
+
if (hide) {
|
6406
|
+
sketch.surface.setVisible(false);
|
6407
|
+
}
|
6140
6408
|
|
6141
|
-
|
6142
|
-
|
6143
|
-
|
6144
|
-
|
6145
|
-
|
6146
|
-
|
6409
|
+
if (useNativeSelect) {
|
6410
|
+
FileDialog dialog = new FileDialog(parentFrame, prompt, mode);
|
6411
|
+
if (defaultSelection != null) {
|
6412
|
+
dialog.setDirectory(defaultSelection.getParent());
|
6413
|
+
dialog.setFile(defaultSelection.getName());
|
6414
|
+
}
|
6147
6415
|
|
6148
|
-
|
6149
|
-
|
6150
|
-
|
6151
|
-
|
6152
|
-
|
6153
|
-
|
6416
|
+
dialog.setVisible(true);
|
6417
|
+
String directory = dialog.getDirectory();
|
6418
|
+
String filename = dialog.getFile();
|
6419
|
+
if (filename != null) {
|
6420
|
+
selectedFile = new File(directory, filename);
|
6421
|
+
}
|
6154
6422
|
|
6155
|
-
|
6156
|
-
|
6157
|
-
|
6158
|
-
|
6159
|
-
|
6160
|
-
}
|
6161
|
-
if (result == JFileChooser.APPROVE_OPTION) {
|
6162
|
-
selectedFile = chooser.getSelectedFile();
|
6163
|
-
}
|
6423
|
+
} else {
|
6424
|
+
JFileChooser chooser = new JFileChooser();
|
6425
|
+
chooser.setDialogTitle(prompt);
|
6426
|
+
if (defaultSelection != null) {
|
6427
|
+
chooser.setSelectedFile(defaultSelection);
|
6164
6428
|
}
|
6165
6429
|
|
6166
|
-
|
6167
|
-
|
6430
|
+
int result = -1;
|
6431
|
+
if (mode == FileDialog.SAVE) {
|
6432
|
+
result = chooser.showSaveDialog(parentFrame);
|
6433
|
+
} else if (mode == FileDialog.LOAD) {
|
6434
|
+
result = chooser.showOpenDialog(parentFrame);
|
6168
6435
|
}
|
6169
|
-
|
6436
|
+
if (result == JFileChooser.APPROVE_OPTION) {
|
6437
|
+
selectedFile = chooser.getSelectedFile();
|
6438
|
+
}
|
6439
|
+
}
|
6440
|
+
|
6441
|
+
if (hide) {
|
6442
|
+
sketch.surface.setVisible(true);
|
6170
6443
|
}
|
6444
|
+
selectCallback(selectedFile, callbackMethod, callbackObject);
|
6171
6445
|
});
|
6172
6446
|
}
|
6173
6447
|
|
@@ -6419,15 +6693,16 @@ public class PApplet implements PConstants {
|
|
6419
6693
|
* ( begin auto-generated from createReader.xml )
|
6420
6694
|
*
|
6421
6695
|
* Creates a <b>BufferedReader</b> object that can be used to read files
|
6422
|
-
* line-by-line as individual <b>String</b> objects.This is the complement to
|
6423
|
-
the <b>createWriter()</b> function.
|
6424
|
-
|
6425
|
-
|
6426
|
-
|
6427
|
-
|
6428
|
-
|
6696
|
+
* line-by-line as individual <b>String</b> objects. This is the complement to
|
6697
|
+
* the <b>createWriter()</b> function.
|
6698
|
+
*
|
6699
|
+
* Starting with Processing release 0134, all files loaded and saved by the
|
6700
|
+
* Processing API use UTF-8 encoding. In previous releases, the default
|
6701
|
+
* encoding for your platform was used, which causes problems when files are
|
6702
|
+
* moved to other platforms.
|
6703
|
+
*
|
6704
|
+
* ( end auto-generated )
|
6429
6705
|
*
|
6430
|
-
* @return
|
6431
6706
|
* @webref input:files
|
6432
6707
|
* @param filename name of the file to be opened
|
6433
6708
|
* @see BufferedReader
|
@@ -6481,6 +6756,7 @@ public class PApplet implements PConstants {
|
|
6481
6756
|
reader.reset();
|
6482
6757
|
}
|
6483
6758
|
} catch (IOException e) {
|
6759
|
+
e.printStackTrace();
|
6484
6760
|
}
|
6485
6761
|
return reader;
|
6486
6762
|
}
|
@@ -6489,16 +6765,19 @@ public class PApplet implements PConstants {
|
|
6489
6765
|
* ( begin auto-generated from createWriter.xml )
|
6490
6766
|
*
|
6491
6767
|
* Creates a new file in the sketch folder, and a <b>PrintWriter</b> object to
|
6492
|
-
* write to it.For the file to be made
|
6493
|
-
must be closed with its <b>flush()</b> and <b>close()</b> methods (see
|
6494
|
-
above example).
|
6495
|
-
|
6496
|
-
|
6497
|
-
|
6498
|
-
|
6499
|
-
|
6500
|
-
*
|
6501
|
-
*
|
6768
|
+
* write to it. For the file to be made correctly, it should be flushed and
|
6769
|
+
* must be closed with its <b>flush()</b> and <b>close()</b> methods (see
|
6770
|
+
* above example).
|
6771
|
+
*
|
6772
|
+
* Starting with Processing release 0134, all files loaded and saved by the
|
6773
|
+
* Processing API use UTF-8 encoding. In previous releases, the default
|
6774
|
+
* encoding for your platform was used, which causes problems when files are
|
6775
|
+
* moved to other platforms.
|
6776
|
+
*
|
6777
|
+
* ( end auto-generated )
|
6778
|
+
*
|
6779
|
+
* @webref output:files
|
6780
|
+
* @param filename name of the file to be created
|
6502
6781
|
* @see PrintWriter
|
6503
6782
|
* @see PApplet#createReader
|
6504
6783
|
* @see BufferedReader
|
@@ -6523,7 +6802,7 @@ public class PApplet implements PConstants {
|
|
6523
6802
|
}
|
6524
6803
|
return createWriter(output);
|
6525
6804
|
|
6526
|
-
} catch (
|
6805
|
+
} catch (Exception e) {
|
6527
6806
|
throw new RuntimeException("Couldn't create a writer for "
|
6528
6807
|
+ file.getAbsolutePath(), e);
|
6529
6808
|
}
|
@@ -6545,12 +6824,14 @@ public class PApplet implements PConstants {
|
|
6545
6824
|
/**
|
6546
6825
|
* ( begin auto-generated from createInput.xml )
|
6547
6826
|
*
|
6548
|
-
* This is a function for advanced programmers to open a Java InputStream.
|
6549
|
-
|
6550
|
-
|
6551
|
-
|
6827
|
+
* This is a function for advanced programmers to open a Java InputStream.
|
6828
|
+
* It's useful if you want to use the facilities provided by PApplet to easily
|
6829
|
+
* open files from the data folder or from a URL, but want an InputStream
|
6830
|
+
* object so that you can use other parts of Java to take more control of how
|
6831
|
+
* the stream is read.
|
6832
|
+
*
|
6552
6833
|
* The filename passed in can be: - A URL, for instance
|
6553
|
-
<b>openStream("http://processing.org/")</b>
|
6834
|
+
* <b>openStream("http://processing.org/")</b>
|
6554
6835
|
* - A file in the sketch's <b>data</b> folder - The full path to a file to be
|
6555
6836
|
* opened locally (when running as an application)
|
6556
6837
|
*
|
@@ -6602,7 +6883,6 @@ public class PApplet implements PConstants {
|
|
6602
6883
|
* <LI>Another file to be opened locally (when running as an application)
|
6603
6884
|
* </UL>
|
6604
6885
|
*
|
6605
|
-
* @return
|
6606
6886
|
* @webref input:files
|
6607
6887
|
* @param filename the name of the file to use as input
|
6608
6888
|
* @see PApplet#createOutput(String)
|
@@ -6611,39 +6891,239 @@ public class PApplet implements PConstants {
|
|
6611
6891
|
*
|
6612
6892
|
*/
|
6613
6893
|
public InputStream createInput(String filename) {
|
6614
|
-
|
6894
|
+
InputStream input = createInputRaw(filename);
|
6895
|
+
if (input != null) {
|
6896
|
+
// if it's gzip-encoded, automatically decode
|
6897
|
+
final String lower = filename.toLowerCase();
|
6898
|
+
if (lower.endsWith(".gz") || lower.endsWith(".svgz")) {
|
6899
|
+
try {
|
6900
|
+
// buffered has to go *around* the GZ, otherwise 25x slower
|
6901
|
+
return new BufferedInputStream(new GZIPInputStream(input));
|
6902
|
+
|
6903
|
+
} catch (IOException e) {
|
6904
|
+
printStackTrace(e);
|
6905
|
+
}
|
6906
|
+
} else {
|
6907
|
+
return new BufferedInputStream(input);
|
6908
|
+
}
|
6909
|
+
}
|
6910
|
+
return null;
|
6615
6911
|
}
|
6616
6912
|
|
6617
6913
|
/**
|
6618
6914
|
* Call openStream() without automatic gzip decompression.
|
6619
|
-
* @param filename
|
6620
|
-
* @return
|
6621
6915
|
*/
|
6622
6916
|
public InputStream createInputRaw(String filename) {
|
6623
|
-
|
6917
|
+
if (filename == null) {
|
6918
|
+
return null;
|
6919
|
+
}
|
6920
|
+
|
6921
|
+
if (sketchPath == null) {
|
6922
|
+
System.err.println("The sketch path is not set.");
|
6923
|
+
throw new RuntimeException("Files must be loaded inside setup() or after it has been called.");
|
6924
|
+
}
|
6925
|
+
|
6926
|
+
if (filename.length() == 0) {
|
6927
|
+
// an error will be called by the parent function
|
6928
|
+
//System.err.println("The filename passed to openStream() was empty.");
|
6929
|
+
return null;
|
6930
|
+
}
|
6931
|
+
|
6932
|
+
// First check whether this looks like a URL
|
6933
|
+
if (filename.contains(":")) { // at least smells like URL
|
6934
|
+
try {
|
6935
|
+
URL url = new URL(filename);
|
6936
|
+
URLConnection conn = url.openConnection();
|
6937
|
+
|
6938
|
+
if (conn instanceof HttpURLConnection) {
|
6939
|
+
HttpURLConnection httpConn = (HttpURLConnection) conn;
|
6940
|
+
// Will not handle a protocol change (see below)
|
6941
|
+
httpConn.setInstanceFollowRedirects(true);
|
6942
|
+
int response = httpConn.getResponseCode();
|
6943
|
+
// Default won't follow HTTP -> HTTPS redirects for security reasons
|
6944
|
+
// http://stackoverflow.com/a/1884427
|
6945
|
+
if (response >= 300 && response < 400) {
|
6946
|
+
String newLocation = httpConn.getHeaderField("Location");
|
6947
|
+
return createInputRaw(newLocation);
|
6948
|
+
}
|
6949
|
+
return conn.getInputStream();
|
6950
|
+
} else if (conn instanceof JarURLConnection) {
|
6951
|
+
return url.openStream();
|
6952
|
+
}
|
6953
|
+
} catch (MalformedURLException | FileNotFoundException mfue) {
|
6954
|
+
// not a url, that's fine
|
6955
|
+
|
6956
|
+
} // Added in 0119 b/c Java 1.5 throws FNFE when URL not available.
|
6957
|
+
// http://dev.processing.org/bugs/show_bug.cgi?id=403
|
6958
|
+
catch (IOException e) {
|
6959
|
+
// changed for 0117, shouldn't be throwing exception
|
6960
|
+
printStackTrace(e);
|
6961
|
+
//System.err.println("Error downloading from URL " + filename);
|
6962
|
+
return null;
|
6963
|
+
//throw new RuntimeException("Error downloading from URL " + filename);
|
6964
|
+
}
|
6965
|
+
}
|
6966
|
+
|
6967
|
+
InputStream stream = null;
|
6968
|
+
|
6969
|
+
// Moved this earlier than the getResourceAsStream() checks, because
|
6970
|
+
// calling getResourceAsStream() on a directory lists its contents.
|
6971
|
+
// http://dev.processing.org/bugs/show_bug.cgi?id=716
|
6972
|
+
try {
|
6973
|
+
// First see if it's in a data folder. This may fail by throwing
|
6974
|
+
// a SecurityException. If so, this whole block will be skipped.
|
6975
|
+
File file = new File(dataPath(filename));
|
6976
|
+
if (!file.exists()) {
|
6977
|
+
// next see if it's just in the sketch folder
|
6978
|
+
file = sketchFile(filename);
|
6979
|
+
}
|
6980
|
+
|
6981
|
+
if (file.isDirectory()) {
|
6982
|
+
return null;
|
6983
|
+
}
|
6984
|
+
if (file.exists()) {
|
6985
|
+
try {
|
6986
|
+
// handle case sensitivity check
|
6987
|
+
String filePath = file.getCanonicalPath();
|
6988
|
+
String filenameActual = new File(filePath).getName();
|
6989
|
+
// make sure there isn't a subfolder prepended to the name
|
6990
|
+
String filenameShort = new File(filename).getName();
|
6991
|
+
// if the actual filename is the same, but capitalized
|
6992
|
+
// differently, warn the user.
|
6993
|
+
//if (filenameActual.equalsIgnoreCase(filenameShort) &&
|
6994
|
+
//!filenameActual.equals(filenameShort)) {
|
6995
|
+
if (!filenameActual.equals(filenameShort)) {
|
6996
|
+
throw new RuntimeException("This file is named "
|
6997
|
+
+ filenameActual + " not "
|
6998
|
+
+ filename + ". Rename the file "
|
6999
|
+
+ "or change your code.");
|
7000
|
+
}
|
7001
|
+
} catch (IOException e) {
|
7002
|
+
}
|
7003
|
+
}
|
7004
|
+
|
7005
|
+
// if this file is ok, may as well just load it
|
7006
|
+
stream = new FileInputStream(file);
|
7007
|
+
if (stream != null) {
|
7008
|
+
return stream;
|
7009
|
+
}
|
7010
|
+
|
7011
|
+
// have to break these out because a general Exception might
|
7012
|
+
// catch the RuntimeException being thrown above
|
7013
|
+
} catch (IOException ioe) {
|
7014
|
+
} catch (SecurityException se) {
|
7015
|
+
}
|
7016
|
+
|
7017
|
+
// Using getClassLoader() prevents java from converting dots
|
7018
|
+
// to slashes or requiring a slash at the beginning.
|
7019
|
+
// (a slash as a prefix means that it'll load from the root of
|
7020
|
+
// the jar, rather than trying to dig into the package location)
|
7021
|
+
ClassLoader cl = getClass().getClassLoader();
|
7022
|
+
|
7023
|
+
// by default, data files are exported to the root path of the jar.
|
7024
|
+
// (not the data folder) so check there first.
|
7025
|
+
stream = cl.getResourceAsStream("data/" + filename);
|
7026
|
+
if (stream != null) {
|
7027
|
+
String cn = stream.getClass().getName();
|
7028
|
+
// this is an irritation of sun's java plug-in, which will return
|
7029
|
+
// a non-null stream for an object that doesn't exist. like all good
|
7030
|
+
// things, this is probably introduced in java 1.5. awesome!
|
7031
|
+
// http://dev.processing.org/bugs/show_bug.cgi?id=359
|
7032
|
+
if (!cn.equals("sun.plugin.cache.EmptyInputStream")) {
|
7033
|
+
return stream;
|
7034
|
+
}
|
7035
|
+
}
|
7036
|
+
|
7037
|
+
// When used with an online script, also need to check without the
|
7038
|
+
// data folder, in case it's not in a subfolder called 'data'.
|
7039
|
+
// http://dev.processing.org/bugs/show_bug.cgi?id=389
|
7040
|
+
stream = cl.getResourceAsStream(filename);
|
7041
|
+
if (stream != null) {
|
7042
|
+
String cn = stream.getClass().getName();
|
7043
|
+
if (!cn.equals("sun.plugin.cache.EmptyInputStream")) {
|
7044
|
+
return stream;
|
7045
|
+
}
|
7046
|
+
}
|
7047
|
+
|
7048
|
+
try {
|
7049
|
+
// attempt to load from a local file, used when running as
|
7050
|
+
// an application, or as a signed applet
|
7051
|
+
try { // first try to catch any security exceptions
|
7052
|
+
try {
|
7053
|
+
stream = new FileInputStream(dataPath(filename));
|
7054
|
+
if (stream != null) {
|
7055
|
+
return stream;
|
7056
|
+
}
|
7057
|
+
} catch (IOException e2) {
|
7058
|
+
}
|
7059
|
+
|
7060
|
+
try {
|
7061
|
+
stream = new FileInputStream(sketchPath(filename));
|
7062
|
+
if (stream != null) {
|
7063
|
+
return stream;
|
7064
|
+
}
|
7065
|
+
} catch (Exception e) {
|
7066
|
+
} // ignored
|
7067
|
+
|
7068
|
+
try {
|
7069
|
+
stream = new FileInputStream(filename);
|
7070
|
+
if (stream != null) {
|
7071
|
+
return stream;
|
7072
|
+
}
|
7073
|
+
} catch (IOException e1) {
|
7074
|
+
}
|
7075
|
+
|
7076
|
+
} catch (SecurityException se) {
|
7077
|
+
} // online, whups
|
7078
|
+
|
7079
|
+
} catch (Exception e) {
|
7080
|
+
printStackTrace(e);
|
7081
|
+
}
|
7082
|
+
|
7083
|
+
return null;
|
6624
7084
|
}
|
6625
7085
|
|
6626
7086
|
/**
|
6627
7087
|
* @nowebref
|
6628
7088
|
*/
|
6629
7089
|
static public InputStream createInput(File file) {
|
6630
|
-
|
7090
|
+
if (file == null) {
|
7091
|
+
throw new IllegalArgumentException("File passed to createInput() was null");
|
7092
|
+
}
|
7093
|
+
if (!file.exists()) {
|
7094
|
+
System.err.println(file + " does not exist, createInput() will return null");
|
7095
|
+
return null;
|
7096
|
+
}
|
7097
|
+
try {
|
7098
|
+
InputStream input = new FileInputStream(file);
|
7099
|
+
final String lower = file.getName().toLowerCase();
|
7100
|
+
if (lower.endsWith(".gz") || lower.endsWith(".svgz")) {
|
7101
|
+
return new BufferedInputStream(new GZIPInputStream(input));
|
7102
|
+
}
|
7103
|
+
return new BufferedInputStream(input);
|
7104
|
+
|
7105
|
+
} catch (IOException e) {
|
7106
|
+
System.err.println("Could not createInput() for " + file);
|
7107
|
+
e.printStackTrace();
|
7108
|
+
return null;
|
7109
|
+
}
|
6631
7110
|
}
|
6632
7111
|
|
6633
7112
|
/**
|
6634
7113
|
* ( begin auto-generated from loadBytes.xml )
|
6635
7114
|
*
|
6636
|
-
* Reads the contents of a file or url and places it in a byte array.If a
|
6637
|
-
file is specified, it must be located in the sketch's "data"
|
6638
|
-
directory/folder.
|
6639
|
-
|
6640
|
-
|
6641
|
-
|
7115
|
+
* Reads the contents of a file or url and places it in a byte array. If a
|
7116
|
+
* file is specified, it must be located in the sketch's "data"
|
7117
|
+
* directory/folder.
|
7118
|
+
*
|
7119
|
+
* The filename parameter can also be a URL to a file found online. For
|
7120
|
+
* security reasons, a Processing sketch found online can only download files
|
7121
|
+
* from the same server from which it came. Getting around this restriction
|
7122
|
+
* requires a <a
|
6642
7123
|
* href="http://wiki.processing.org/w/Sign_an_Applet">signed applet</a>.
|
6643
7124
|
*
|
6644
7125
|
* ( end auto-generated )
|
6645
7126
|
*
|
6646
|
-
* @return
|
6647
7127
|
* @webref input:files
|
6648
7128
|
* @param filename name of a file in the data folder or a URL.
|
6649
7129
|
* @see PApplet#loadStrings(String)
|
@@ -6685,7 +7165,7 @@ public class PApplet implements PConstants {
|
|
6685
7165
|
}
|
6686
7166
|
|
6687
7167
|
if (input != null) {
|
6688
|
-
byte[] buffer;
|
7168
|
+
byte[] buffer = null;
|
6689
7169
|
if (length != -1) {
|
6690
7170
|
buffer = new byte[length];
|
6691
7171
|
int count;
|
@@ -6702,10 +7182,9 @@ public class PApplet implements PConstants {
|
|
6702
7182
|
} catch (MalformedURLException | FileNotFoundException mfue) {
|
6703
7183
|
// not a url, that's fine
|
6704
7184
|
|
6705
|
-
}
|
6706
|
-
// Java 1.5+ throws FNFE when URL not available
|
7185
|
+
} // Java 1.5+ throws FNFE when URL not available
|
6707
7186
|
// http://dev.processing.org/bugs/show_bug.cgi?id=403
|
6708
|
-
|
7187
|
+
catch (IOException e) {
|
6709
7188
|
printStackTrace(e);
|
6710
7189
|
return null;
|
6711
7190
|
|
@@ -6827,6 +7306,7 @@ public class PApplet implements PConstants {
|
|
6827
7306
|
try {
|
6828
7307
|
is.close();
|
6829
7308
|
} catch (IOException e) {
|
7309
|
+
e.printStackTrace();
|
6830
7310
|
}
|
6831
7311
|
return outgoing;
|
6832
7312
|
}
|
@@ -6837,11 +7317,13 @@ public class PApplet implements PConstants {
|
|
6837
7317
|
* ( begin auto-generated from loadStrings.xml )
|
6838
7318
|
*
|
6839
7319
|
* Reads the contents of a file or url and creates a String array of its
|
6840
|
-
* individual lines.If a file is specified, it must be located in the
|
6841
|
-
sketch's "data" directory/folder.
|
6842
|
-
|
6843
|
-
|
6844
|
-
|
7320
|
+
* individual lines. If a file is specified, it must be located in the
|
7321
|
+
* sketch's "data" directory/folder.
|
7322
|
+
*
|
7323
|
+
* The filename parameter can also be a URL to a file found online. For
|
7324
|
+
* security reasons, a Processing sketch found online can only download files
|
7325
|
+
* from the same server from which it came. Getting around this restriction
|
7326
|
+
* requires a <a
|
6845
7327
|
* href="http://wiki.processing.org/w/Sign_an_Applet">signed applet</a>.
|
6846
7328
|
*
|
6847
7329
|
* If the file is not available or an error occurs, <b>null</b> will be
|
@@ -6868,7 +7350,6 @@ public class PApplet implements PConstants {
|
|
6868
7350
|
* things done in a "scripting" fashion. If you want to handle exceptions, use
|
6869
7351
|
* Java methods for I/O.
|
6870
7352
|
*
|
6871
|
-
* @return
|
6872
7353
|
* @webref input:files
|
6873
7354
|
* @param filename name of the file or url to load
|
6874
7355
|
* @see PApplet#loadBytes(String)
|
@@ -6903,6 +7384,7 @@ public class PApplet implements PConstants {
|
|
6903
7384
|
= new BufferedReader(new InputStreamReader(input, "UTF-8"));
|
6904
7385
|
return loadStrings(reader);
|
6905
7386
|
} catch (IOException e) {
|
7387
|
+
e.printStackTrace();
|
6906
7388
|
}
|
6907
7389
|
return null;
|
6908
7390
|
}
|
@@ -6911,7 +7393,7 @@ public class PApplet implements PConstants {
|
|
6911
7393
|
try {
|
6912
7394
|
String lines[] = new String[100];
|
6913
7395
|
int lineCount = 0;
|
6914
|
-
String line;
|
7396
|
+
String line = null;
|
6915
7397
|
while ((line = reader.readLine()) != null) {
|
6916
7398
|
if (lineCount == lines.length) {
|
6917
7399
|
String temp[] = new String[lineCount << 1];
|
@@ -6932,6 +7414,7 @@ public class PApplet implements PConstants {
|
|
6932
7414
|
return output;
|
6933
7415
|
|
6934
7416
|
} catch (IOException e) {
|
7417
|
+
e.printStackTrace();
|
6935
7418
|
//throw new RuntimeException("Error inside loadStrings()");
|
6936
7419
|
}
|
6937
7420
|
return null;
|
@@ -6943,9 +7426,11 @@ public class PApplet implements PConstants {
|
|
6943
7426
|
* ( begin auto-generated from createOutput.xml )
|
6944
7427
|
*
|
6945
7428
|
* Similar to <b>createInput()</b>, this creates a Java <b>OutputStream</b>
|
6946
|
-
* for a given filename or path.The file will be created in the sketch
|
6947
|
-
folder, or in the same folder as an exported application.
|
6948
|
-
|
7429
|
+
* for a given filename or path. The file will be created in the sketch
|
7430
|
+
* folder, or in the same folder as an exported application.
|
7431
|
+
*
|
7432
|
+
* If the path does not exist, intermediate folders will be created. If an
|
7433
|
+
* exception occurs, it will be printed to the console, and <b>null</b>
|
6949
7434
|
* will be returned.
|
6950
7435
|
*
|
6951
7436
|
* This function is a convenience over the Java approach that requires you to
|
@@ -6958,7 +7443,6 @@ public class PApplet implements PConstants {
|
|
6958
7443
|
*
|
6959
7444
|
* ( end auto-generated )
|
6960
7445
|
*
|
6961
|
-
* @return
|
6962
7446
|
* @webref output:files
|
6963
7447
|
* @param filename name of the file to open
|
6964
7448
|
* @see PApplet#createInput(String)
|
@@ -6981,6 +7465,7 @@ public class PApplet implements PConstants {
|
|
6981
7465
|
return new BufferedOutputStream(output);
|
6982
7466
|
|
6983
7467
|
} catch (IOException e) {
|
7468
|
+
e.printStackTrace();
|
6984
7469
|
}
|
6985
7470
|
return null;
|
6986
7471
|
}
|
@@ -6988,16 +7473,17 @@ public class PApplet implements PConstants {
|
|
6988
7473
|
/**
|
6989
7474
|
* ( begin auto-generated from saveStream.xml )
|
6990
7475
|
*
|
6991
|
-
* Save the contents of a stream to a file in the sketch folder.This is
|
6992
|
-
basically <b>saveBytes(blah, loadBytes())</b>, but done more efficiently
|
6993
|
-
(and with less confusing syntax).
|
7476
|
+
* Save the contents of a stream to a file in the sketch folder. This is
|
7477
|
+
* basically <b>saveBytes(blah, loadBytes())</b>, but done more efficiently
|
7478
|
+
* (and with less confusing syntax).
|
7479
|
+
*
|
7480
|
+
* When using the <b>targetFile</b> parameter, it writes to a <b>File</b>
|
6994
7481
|
* object for greater control over the file location. (Note that unlike some
|
6995
7482
|
* other functions, this will not automatically compress or uncompress gzip
|
6996
7483
|
* files.)
|
6997
7484
|
*
|
6998
7485
|
* ( end auto-generated )
|
6999
7486
|
*
|
7000
|
-
* @return
|
7001
7487
|
* @webref output:files
|
7002
7488
|
* @param target name of the file to write to
|
7003
7489
|
* @param source location to read from (a filename, path, or URL)
|
@@ -7009,12 +7495,10 @@ public class PApplet implements PConstants {
|
|
7009
7495
|
|
7010
7496
|
/**
|
7011
7497
|
* Identical to the other saveStream(), but writes to a File object, for
|
7012
|
-
* greater control over the file location.
|
7013
|
-
uncompress gzip files.
|
7498
|
+
* greater control over the file location.
|
7014
7499
|
*
|
7015
|
-
*
|
7016
|
-
*
|
7017
|
-
* @return
|
7500
|
+
* Note that unlike other api methods, this will not automatically compress or
|
7501
|
+
* uncompress gzip files.
|
7018
7502
|
*/
|
7019
7503
|
public boolean saveStream(File target, String source) {
|
7020
7504
|
return saveStream(target, createInputRaw(source));
|
@@ -7036,9 +7520,11 @@ public class PApplet implements PConstants {
|
|
7036
7520
|
// make sure that this path actually exists before writing
|
7037
7521
|
createPath(target);
|
7038
7522
|
tempFile = createTempFile(target);
|
7039
|
-
|
7040
|
-
|
7041
|
-
|
7523
|
+
FileOutputStream targetStream = new FileOutputStream(tempFile);
|
7524
|
+
|
7525
|
+
saveStream(targetStream, source);
|
7526
|
+
targetStream.close();
|
7527
|
+
targetStream = null;
|
7042
7528
|
|
7043
7529
|
if (target.exists()) {
|
7044
7530
|
if (!target.delete()) {
|
@@ -7057,6 +7543,7 @@ public class PApplet implements PConstants {
|
|
7057
7543
|
if (tempFile != null) {
|
7058
7544
|
tempFile.delete();
|
7059
7545
|
}
|
7546
|
+
e.printStackTrace();
|
7060
7547
|
return false;
|
7061
7548
|
}
|
7062
7549
|
}
|
@@ -7144,9 +7631,10 @@ public class PApplet implements PConstants {
|
|
7144
7631
|
try {
|
7145
7632
|
tempFile = createTempFile(file);
|
7146
7633
|
|
7147
|
-
|
7148
|
-
|
7149
|
-
|
7634
|
+
OutputStream output = createOutput(tempFile);
|
7635
|
+
saveBytes(output, data);
|
7636
|
+
output.close();
|
7637
|
+
output = null;
|
7150
7638
|
|
7151
7639
|
if (file.exists()) {
|
7152
7640
|
if (!file.delete()) {
|
@@ -7164,6 +7652,7 @@ public class PApplet implements PConstants {
|
|
7164
7652
|
if (tempFile != null) {
|
7165
7653
|
tempFile.delete();
|
7166
7654
|
}
|
7655
|
+
e.printStackTrace();
|
7167
7656
|
}
|
7168
7657
|
}
|
7169
7658
|
|
@@ -7176,6 +7665,7 @@ public class PApplet implements PConstants {
|
|
7176
7665
|
output.flush();
|
7177
7666
|
|
7178
7667
|
} catch (IOException e) {
|
7668
|
+
e.printStackTrace();
|
7179
7669
|
}
|
7180
7670
|
}
|
7181
7671
|
|
@@ -7192,7 +7682,7 @@ public class PApplet implements PConstants {
|
|
7192
7682
|
* href="http://wiki.processing.org/w/Sign_an_Applet">signed applet</A>. To
|
7193
7683
|
* save a file back to a server, see the <a
|
7194
7684
|
* href="http://wiki.processing.org/w/Saving_files_to_a_web-server">save to
|
7195
|
-
* web</A> code snippet on the Processing Wiki
|
7685
|
+
* web</A> code snippet on the Processing Wiki.<br/>
|
7196
7686
|
* <br/ >
|
7197
7687
|
* Starting with Processing 1.0, all files loaded and saved by the Processing
|
7198
7688
|
* API use UTF-8 encoding. In previous releases, the default encoding for your
|
@@ -7223,12 +7713,12 @@ public class PApplet implements PConstants {
|
|
7223
7713
|
* @nowebref
|
7224
7714
|
*/
|
7225
7715
|
static public void saveStrings(OutputStream output, String[] data) {
|
7226
|
-
|
7227
|
-
|
7228
|
-
|
7229
|
-
}
|
7230
|
-
writer.flush();
|
7716
|
+
PrintWriter writer = createWriter(output);
|
7717
|
+
for (int i = 0; i < data.length; i++) {
|
7718
|
+
writer.println(data[i]);
|
7231
7719
|
}
|
7720
|
+
writer.flush();
|
7721
|
+
writer.close();
|
7232
7722
|
}
|
7233
7723
|
|
7234
7724
|
//////////////////////////////////////////////////////////////
|
@@ -7429,15 +7919,42 @@ public class PApplet implements PConstants {
|
|
7429
7919
|
* exist.
|
7430
7920
|
*/
|
7431
7921
|
static public void createPath(String path) {
|
7432
|
-
|
7922
|
+
createPath(new File(path));
|
7433
7923
|
}
|
7434
7924
|
|
7435
7925
|
static public void createPath(File file) {
|
7436
|
-
|
7926
|
+
try {
|
7927
|
+
String parent = file.getParent();
|
7928
|
+
if (parent != null) {
|
7929
|
+
File unit = new File(parent);
|
7930
|
+
if (!unit.exists()) {
|
7931
|
+
unit.mkdirs();
|
7932
|
+
}
|
7933
|
+
}
|
7934
|
+
} catch (SecurityException se) {
|
7935
|
+
System.err.println("You don't have permissions to create "
|
7936
|
+
+ file.getAbsolutePath());
|
7937
|
+
}
|
7437
7938
|
}
|
7438
7939
|
|
7439
7940
|
static public String getExtension(String filename) {
|
7440
|
-
|
7941
|
+
String extension;
|
7942
|
+
|
7943
|
+
String lower = filename.toLowerCase();
|
7944
|
+
int dot = filename.lastIndexOf('.');
|
7945
|
+
if (dot == -1) {
|
7946
|
+
return ""; // no extension found
|
7947
|
+
}
|
7948
|
+
extension = lower.substring(dot + 1);
|
7949
|
+
|
7950
|
+
// check for, and strip any parameters on the url, i.e.
|
7951
|
+
// filename.jpg?blah=blah&something=that
|
7952
|
+
int question = extension.indexOf('?');
|
7953
|
+
if (question != -1) {
|
7954
|
+
extension = extension.substring(0, question);
|
7955
|
+
}
|
7956
|
+
|
7957
|
+
return extension;
|
7441
7958
|
}
|
7442
7959
|
|
7443
7960
|
//////////////////////////////////////////////////////////////
|
@@ -9110,9 +9627,9 @@ public class PApplet implements PConstants {
|
|
9110
9627
|
* Utility function for formatting numbers into strings. There are two
|
9111
9628
|
* versions, one for formatting floats and one for formatting ints. The values
|
9112
9629
|
* for the <b>digits</b>, <b>left</b>, and <b>right</b> parameters should
|
9113
|
-
* always be positive integers
|
9114
|
-
* used to add zeros to the left and/or right of a number. This
|
9115
|
-
* for aligning a list of numbers. To
|
9630
|
+
* always be positive integers..containsAs shown in the above example,
|
9631
|
+
* <b>nf()</b> is used to add zeros to the left and/or right of a number. This
|
9632
|
+
* is typically for aligning a list of numbers. To
|
9116
9633
|
* <em>remove</em> digits from a floating-point number, use the
|
9117
9634
|
* <b>int()</b>, <b>ceil()</b>, <b>floor()</b>, or <b>round()</b>
|
9118
9635
|
* functions.
|
@@ -9797,7 +10314,7 @@ public class PApplet implements PConstants {
|
|
9797
10314
|
* com.sketchycompany.Sketchy should be used as the class name.
|
9798
10315
|
* <li>The [sketch args] are any command line parameters you want to send to
|
9799
10316
|
* the sketch itself. These will be passed into the args[] array in PApplet.
|
9800
|
-
*
|
10317
|
+
* </ul>
|
9801
10318
|
* The simplest way to turn and sketch into an application is to add the
|
9802
10319
|
* following code to your program:
|
9803
10320
|
* <PRE>static public void main(String args[]) {
|
@@ -9989,75 +10506,77 @@ public class PApplet implements PConstants {
|
|
9989
10506
|
String folder = calcSketchPath();
|
9990
10507
|
|
9991
10508
|
int argIndex = 0;
|
9992
|
-
|
9993
|
-
|
9994
|
-
|
9995
|
-
|
9996
|
-
|
9997
|
-
|
9998
|
-
|
9999
|
-
|
10000
|
-
|
10001
|
-
|
10002
|
-
|
10003
|
-
|
10004
|
-
|
10005
|
-
|
10006
|
-
|
10007
|
-
|
10008
|
-
|
10009
|
-
|
10010
|
-
|
10011
|
-
|
10012
|
-
|
10013
|
-
|
10014
|
-
|
10015
|
-
|
10016
|
-
|
10017
|
-
|
10018
|
-
|
10019
|
-
|
10020
|
-
|
10021
|
-
|
10022
|
-
|
10023
|
-
|
10024
|
-
|
10025
|
-
|
10026
|
-
|
10027
|
-
|
10028
|
-
|
10029
|
-
|
10030
|
-
|
10031
|
-
|
10032
|
-
|
10033
|
-
|
10034
|
-
|
10035
|
-
|
10036
|
-
|
10037
|
-
|
10038
|
-
|
10509
|
+
OUTER:
|
10510
|
+
while (argIndex < args.length) {
|
10511
|
+
int equals = args[argIndex].indexOf('=');
|
10512
|
+
if (equals != -1) {
|
10513
|
+
param = args[argIndex].substring(0, equals);
|
10514
|
+
value = args[argIndex].substring(equals + 1);
|
10515
|
+
|
10516
|
+
switch (param) {
|
10517
|
+
case ARGS_EDITOR_LOCATION:
|
10518
|
+
external = true;
|
10519
|
+
editorLocation = parseInt(split(value, ','));
|
10520
|
+
break;
|
10521
|
+
case ARGS_DISPLAY:
|
10522
|
+
displayNum = parseInt(value, -2);
|
10523
|
+
if (displayNum == -2) {
|
10524
|
+
// this means the display value couldn't be parsed properly
|
10525
|
+
System.err.println(value + " is not a valid choice for " + ARGS_DISPLAY);
|
10526
|
+
displayNum = -1; // use the default
|
10527
|
+
} break;
|
10528
|
+
case ARGS_WINDOW_COLOR:
|
10529
|
+
if (value.charAt(0) == '#' && value.length() == 7) {
|
10530
|
+
value = value.substring(1);
|
10531
|
+
windowColor = 0xff000000 | Integer.parseInt(value, 16);
|
10532
|
+
} else {
|
10533
|
+
System.err.println(ARGS_WINDOW_COLOR + " should be a # followed by six digits");
|
10534
|
+
} break;
|
10535
|
+
case ARGS_STOP_COLOR:
|
10536
|
+
if (value.charAt(0) == '#' && value.length() == 7) {
|
10537
|
+
value = value.substring(1);
|
10538
|
+
stopColor = 0xff000000 | Integer.parseInt(value, 16);
|
10539
|
+
} else {
|
10540
|
+
System.err.println(ARGS_STOP_COLOR + " should be a # followed by six digits");
|
10541
|
+
} break;
|
10542
|
+
case ARGS_SKETCH_FOLDER:
|
10543
|
+
folder = value;
|
10544
|
+
break;
|
10545
|
+
case ARGS_LOCATION:
|
10546
|
+
location = parseInt(split(value, ','));
|
10547
|
+
break;
|
10548
|
+
case ARGS_DENSITY:
|
10549
|
+
density = parseInt(value, -1);
|
10550
|
+
if (density == -1) {
|
10551
|
+
System.err.println("Could not parse " + value + " for " + ARGS_DENSITY);
|
10552
|
+
} else if (density != 1 && density != 2) {
|
10553
|
+
density = -1;
|
10554
|
+
System.err.println(ARGS_DENSITY + " should be 1 or 2");
|
10555
|
+
} break;
|
10556
|
+
default:
|
10557
|
+
break;
|
10039
10558
|
}
|
10040
|
-
}
|
10041
|
-
|
10042
|
-
|
10043
|
-
|
10044
|
-
present = true;
|
10559
|
+
} else {
|
10560
|
+
switch (args[argIndex]) {
|
10561
|
+
case ARGS_PRESENT:
|
10562
|
+
present = true;
|
10045
10563
|
|
10046
10564
|
// } else if (args[argIndex].equals(ARGS_SPAN_DISPLAYS)) {
|
10047
10565
|
// spanDisplays = true;
|
10048
|
-
|
10049
|
-
|
10050
|
-
|
10051
|
-
|
10052
|
-
|
10053
|
-
|
10054
|
-
|
10055
|
-
|
10056
|
-
|
10566
|
+
break;
|
10567
|
+
case ARGS_HIDE_STOP:
|
10568
|
+
hideStop = true;
|
10569
|
+
break;
|
10570
|
+
case ARGS_EXTERNAL:
|
10571
|
+
external = true;
|
10572
|
+
break;
|
10573
|
+
default:
|
10574
|
+
name = args[argIndex];
|
10575
|
+
break OUTER; // because of break, argIndex won't increment again
|
10576
|
+
}
|
10057
10577
|
}
|
10578
|
+
argIndex++;
|
10058
10579
|
}
|
10059
|
-
argIndex++;
|
10060
|
-
}
|
10061
10580
|
|
10062
10581
|
// // Now that sketch path is passed in args after the sketch name
|
10063
10582
|
// // it's not set in the above loop(the above loop breaks after
|
@@ -10094,8 +10613,8 @@ public class PApplet implements PConstants {
|
|
10094
10613
|
Method method
|
10095
10614
|
= thinkDifferent.getMethod("init", new Class[]{PApplet.class});
|
10096
10615
|
method.invoke(null, new Object[]{sketch});
|
10097
|
-
} catch (
|
10098
|
-
|
10616
|
+
} catch (ClassNotFoundException | IllegalAccessException | IllegalArgumentException | NoSuchMethodException | SecurityException | InvocationTargetException e) {
|
10617
|
+
// That's unfortunate
|
10099
10618
|
}
|
10100
10619
|
}
|
10101
10620
|
|
@@ -10308,14 +10827,13 @@ public class PApplet implements PConstants {
|
|
10308
10827
|
}
|
10309
10828
|
|
10310
10829
|
/**
|
10311
|
-
* Convenience method for Python Mode to run an already-constructed
|
10312
|
-
*
|
10830
|
+
* Convenience method for Python Mode to run an already-constructed sketch.
|
10831
|
+
* This makes it makes it easy to launch a sketch in Jython:
|
10832
|
+
*
|
10313
10833
|
* <pre>class MySketch(PApplet):
|
10314
10834
|
* pass
|
10315
10835
|
*
|
10316
10836
|
*MySketch().runSketch();</pre>
|
10317
|
-
*
|
10318
|
-
* @param args
|
10319
10837
|
*/
|
10320
10838
|
protected void runSketch(final String[] args) {
|
10321
10839
|
final String[] argsWithSketchName = new String[args.length + 1];
|
@@ -10327,13 +10845,6 @@ public class PApplet implements PConstants {
|
|
10327
10845
|
runSketch(argsWithSketchName, this);
|
10328
10846
|
}
|
10329
10847
|
|
10330
|
-
/**
|
10331
|
-
* Convenience method for Python Mode
|
10332
|
-
*/
|
10333
|
-
protected void runSketch() {
|
10334
|
-
runSketch(new String[0]);
|
10335
|
-
}
|
10336
|
-
|
10337
10848
|
/**
|
10338
10849
|
* Convenience method for propane with jdk9
|
10339
10850
|
*/
|
@@ -10346,7 +10857,7 @@ public class PApplet implements PConstants {
|
|
10346
10857
|
* ( begin auto-generated from beginRecord.xml )
|
10347
10858
|
*
|
10348
10859
|
* Opens a new file and all subsequent drawing functions are echoed to this
|
10349
|
-
* file as well as the display window.
|
10860
|
+
* file as well as the display window.The <b>beginRecord()</b> function
|
10350
10861
|
* requires two parameters, the first is the renderer and the second is the
|
10351
10862
|
* file name. This function is always used with <b>endRecord()</b> to stop the
|
10352
10863
|
* recording process and close the file.
|
@@ -10357,6 +10868,7 @@ public class PApplet implements PConstants {
|
|
10357
10868
|
*
|
10358
10869
|
* ( end auto-generated )
|
10359
10870
|
*
|
10871
|
+
* @return
|
10360
10872
|
* @webref output:files
|
10361
10873
|
* @param renderer PDF or SVG
|
10362
10874
|
* @param filename filename for output
|
@@ -11447,6 +11959,32 @@ public class PApplet implements PConstants {
|
|
11447
11959
|
g.rect(a, b, c, d, tl, tr, br, bl);
|
11448
11960
|
}
|
11449
11961
|
|
11962
|
+
/**
|
11963
|
+
* ( begin auto-generated from square.xml )
|
11964
|
+
*
|
11965
|
+
* Draws a square to the screen. A square is a four-sided shape with every
|
11966
|
+
* angle at ninety degrees and each side is the same length. By default, the
|
11967
|
+
* first two parameters set the location of the upper-left corner, the third
|
11968
|
+
* sets the width and height. The way these parameters are interpreted,
|
11969
|
+
* however, may be changed with the
|
11970
|
+
* <b>rectMode()</b> function.
|
11971
|
+
*
|
11972
|
+
* ( end auto-generated )
|
11973
|
+
*
|
11974
|
+
* @webref shape:2d_primitives
|
11975
|
+
* @param x x-coordinate of the rectangle by default
|
11976
|
+
* @param y y-coordinate of the rectangle by default
|
11977
|
+
* @param extent width and height of the rectangle by default
|
11978
|
+
* @see PGraphics#rect(float, float, float, float)
|
11979
|
+
* @see PGraphics#rectMode(int)
|
11980
|
+
*/
|
11981
|
+
public void square(float x, float y, float extent) {
|
11982
|
+
if (recorder != null) {
|
11983
|
+
recorder.square(x, y, extent);
|
11984
|
+
}
|
11985
|
+
g.square(x, y, extent);
|
11986
|
+
}
|
11987
|
+
|
11450
11988
|
/**
|
11451
11989
|
* ( begin auto-generated from ellipseMode.xml )
|
11452
11990
|
*
|
@@ -11543,6 +12081,30 @@ public class PApplet implements PConstants {
|
|
11543
12081
|
g.arc(a, b, c, d, start, stop, mode);
|
11544
12082
|
}
|
11545
12083
|
|
12084
|
+
/**
|
12085
|
+
* ( begin auto-generated from circle.xml )
|
12086
|
+
*
|
12087
|
+
* Draws a circle to the screen. By default, the first two parameters set the
|
12088
|
+
* location of the center, and the third sets the shape's width and height.
|
12089
|
+
* The origin may be changed with the <b>ellipseMode()</b>
|
12090
|
+
* function.
|
12091
|
+
*
|
12092
|
+
* ( end auto-generated )
|
12093
|
+
*
|
12094
|
+
* @webref shape:2d_primitives
|
12095
|
+
* @param x x-coordinate of the ellipse
|
12096
|
+
* @param y y-coordinate of the ellipse
|
12097
|
+
* @param extent width and height of the ellipse by default
|
12098
|
+
* @see PApplet#ellipse(float, float, float, float)
|
12099
|
+
* @see PApplet#ellipseMode(int)
|
12100
|
+
*/
|
12101
|
+
public void circle(float x, float y, float extent) {
|
12102
|
+
if (recorder != null) {
|
12103
|
+
recorder.circle(x, y, extent);
|
12104
|
+
}
|
12105
|
+
g.circle(x, y, extent);
|
12106
|
+
}
|
12107
|
+
|
11546
12108
|
/**
|
11547
12109
|
* ( begin auto-generated from box.xml )
|
11548
12110
|
*
|
@@ -12605,6 +13167,81 @@ public class PApplet implements PConstants {
|
|
12605
13167
|
g.text(num, x, y, z);
|
12606
13168
|
}
|
12607
13169
|
|
13170
|
+
/**
|
13171
|
+
* ( begin auto-generated from push.xml )
|
13172
|
+
*
|
13173
|
+
* The <b>push()</b> function saves the current drawing style settings and
|
13174
|
+
* transformations, while <b>pop()</b> restores these settings. Note that
|
13175
|
+
* these functions are always used together. They allow you to change the
|
13176
|
+
* style and transformation settings and later return to what you had. When a
|
13177
|
+
* new state is started with push(), it builds on the current style and
|
13178
|
+
* transform information.
|
13179
|
+
*
|
13180
|
+
* <b>push()</b> stores information related to the current transformation
|
13181
|
+
* state and style settings controlled by the following functions:
|
13182
|
+
* <b>rotate()</b>, <b>translate()</b>,
|
13183
|
+
* <b>scale()</b>, <b>fill()</b>, <b>stroke()</b>, <b>tint()</b>,
|
13184
|
+
* <b>strokeWeight()</b>, <b>strokeCap()</b>, <b>strokeJoin()</b>,
|
13185
|
+
* <b>imageMode()</b>, <b>rectMode()</b>, <b>ellipseMode()</b>,
|
13186
|
+
* <b>colorMode()</b>, <b>textAlign()</b>, <b>textFont()</b>,
|
13187
|
+
* <b>textMode()</b>, <b>textSize()</b>, <b>textLeading()</b>.
|
13188
|
+
*
|
13189
|
+
* The <b>push()</b> and <b>pop()</b> functions were added with Processing
|
13190
|
+
* 3.5. They can be used in place of <b>pushMatrix()</b>,
|
13191
|
+
* <b>popMatrix()</b>, <b>pushStyles()</b>, and <b>popStyles()</b>. The
|
13192
|
+
* difference is that push() and pop() control both the transformations
|
13193
|
+
* (rotate, scale, translate) and the drawing styles at the same time.
|
13194
|
+
*
|
13195
|
+
* ( end auto-generated )
|
13196
|
+
*
|
13197
|
+
* @webref structure
|
13198
|
+
* @see PGraphics#pop()
|
13199
|
+
*/
|
13200
|
+
public void push() {
|
13201
|
+
if (recorder != null) {
|
13202
|
+
recorder.push();
|
13203
|
+
}
|
13204
|
+
g.push();
|
13205
|
+
}
|
13206
|
+
|
13207
|
+
/**
|
13208
|
+
* ( begin auto-generated from pop.xml )
|
13209
|
+
*
|
13210
|
+
* The <b>pop()</b> function restores the previous drawing style settings and
|
13211
|
+
* transformations after <b>push()</b> has changed them. Note that these
|
13212
|
+
* functions are always used together. They allow you to change the style and
|
13213
|
+
* transformation settings and later return to what you had. When a new state
|
13214
|
+
* is started with push(), it builds on the current style and transform
|
13215
|
+
* information.
|
13216
|
+
*
|
13217
|
+
*
|
13218
|
+
* <b>push()</b> stores information related to the current transformation
|
13219
|
+
* state and style settings controlled by the following functions:
|
13220
|
+
* <b>rotate()</b>, <b>translate()</b>,
|
13221
|
+
* <b>scale()</b>, <b>fill()</b>, <b>stroke()</b>, <b>tint()</b>,
|
13222
|
+
* <b>strokeWeight()</b>, <b>strokeCap()</b>, <b>strokeJoin()</b>,
|
13223
|
+
* <b>imageMode()</b>, <b>rectMode()</b>, <b>ellipseMode()</b>,
|
13224
|
+
* <b>colorMode()</b>, <b>textAlign()</b>, <b>textFont()</b>,
|
13225
|
+
* <b>textMode()</b>, <b>textSize()</b>, <b>textLeading()</b>.
|
13226
|
+
*
|
13227
|
+
* The <b>push()</b> and <b>pop()</b> functions were added with Processing
|
13228
|
+
* 3.5. They can be used in place of <b>pushMatrix()</b>,
|
13229
|
+
* <b>popMatrix()</b>, <b>pushStyles()</b>, and <b>popStyles()</b>. The
|
13230
|
+
* difference is that push() and pop() control both the transformations
|
13231
|
+
* (rotate, scale, translate) and the drawing styles at the same time.
|
13232
|
+
*
|
13233
|
+
* ( end auto-generated )
|
13234
|
+
*
|
13235
|
+
* @webref structure
|
13236
|
+
* @see PGraphics#push()
|
13237
|
+
*/
|
13238
|
+
public void pop() {
|
13239
|
+
if (recorder != null) {
|
13240
|
+
recorder.pop();
|
13241
|
+
}
|
13242
|
+
g.pop();
|
13243
|
+
}
|
13244
|
+
|
12608
13245
|
/**
|
12609
13246
|
* ( begin auto-generated from pushMatrix.xml )
|
12610
13247
|
*
|
@@ -13171,8 +13808,8 @@ public class PApplet implements PConstants {
|
|
13171
13808
|
* The <b>beginCamera()</b> and <b>endCamera()</b> functions enable advanced
|
13172
13809
|
* customization of the camera space. The functions are useful if you want to
|
13173
13810
|
* more control over camera movement, however for most users, the
|
13174
|
-
* <b>camera()</b> function will be sufficient
|
13175
|
-
* replace any transformations (such as <b>rotate()</b> or
|
13811
|
+
* <b>camera()</b> function will be sufficient..containsThe camera functions
|
13812
|
+
* will replace any transformations (such as <b>rotate()</b> or
|
13176
13813
|
* <b>translate()</b>) that occur before them in <b>draw()</b>, but they will
|
13177
13814
|
* not automatically replace the camera transform itself. For this reason,
|
13178
13815
|
* camera functions should be placed at the beginning of
|
@@ -14431,10 +15068,10 @@ public class PApplet implements PConstants {
|
|
14431
15068
|
*
|
14432
15069
|
* Sets the falloff rates for point lights, spot lights, and ambient lights.
|
14433
15070
|
* The parameters are used to determine the falloff with the following
|
14434
|
-
* equation
|
14435
|
-
* (CONSTANT + d * LINEAR + (d*d) *
|
14436
|
-
*
|
14437
|
-
* if
|
15071
|
+
* equation:.containsd = distance from light position to vertex
|
15072
|
+
* positionfalloff = 1 / (CONSTANT + d * LINEAR + (d*d) *
|
15073
|
+
* QUADRATIC).containsLike <b>fill()</b>, it affects only the elements which
|
15074
|
+
* are created after it in the code. The default value if
|
14438
15075
|
* <b>LightFalloff(1.0, 0.0, 0.0)</b>. Thinking about an ambient light with a
|
14439
15076
|
* falloff can be tricky. It is used, for example, if you wanted a region of
|
14440
15077
|
* your scene to be lit ambiently one color and another region to be lit
|
@@ -14601,13 +15238,13 @@ public class PApplet implements PConstants {
|
|
14601
15238
|
/**
|
14602
15239
|
* Takes an RGB or ARGB image and sets it as the background. The width and
|
14603
15240
|
* height of the image must be the same size as the sketch. Use
|
14604
|
-
* image.resize(width, height) to make short work of such a task
|
14605
|
-
*
|
15241
|
+
* image.resize(width, height) to make short work of such a task.<br/>
|
15242
|
+
* <br/>
|
14606
15243
|
* Note that even if the image is set as RGB, the high 8 bits of each pixel
|
14607
15244
|
* should be set opaque (0xFF000000) because the image data will be copied
|
14608
15245
|
* directly to the screen, and non-opaque background images may have strange
|
14609
|
-
* behavior. Use image.filter(OPAQUE) to handle this easily
|
14610
|
-
*
|
15246
|
+
* behavior. Use image.filter(OPAQUE) to handle this easily.<br/>
|
15247
|
+
* <br/>
|
14611
15248
|
* When using 3D, this will also clear the zbuffer (if it exists).
|
14612
15249
|
*
|
14613
15250
|
* @param image PImage to set as background (must be same size as the sketch
|
@@ -14710,8 +15347,8 @@ public class PApplet implements PConstants {
|
|
14710
15347
|
*
|
14711
15348
|
* Extracts the red value from a color, scaled to match current
|
14712
15349
|
* <b>colorMode()</b>. This value is always returned as a float so be careful
|
14713
|
-
* not to assign it to an int value
|
14714
|
-
* undestand, but is slower than another technique. To achieve the same
|
15350
|
+
* not to assign it to an int value..containsThe red() function is easy to use
|
15351
|
+
* and undestand, but is slower than another technique. To achieve the same
|
14715
15352
|
* results when working in <b>colorMode(RGB, 255)</b>, but with greater speed,
|
14716
15353
|
* use the >> (right shift) operator with a bit mask. For example, the
|
14717
15354
|
* following two lines of code are equivalent:<br
|
@@ -14740,7 +15377,7 @@ public class PApplet implements PConstants {
|
|
14740
15377
|
*
|
14741
15378
|
* Extracts the green value from a color, scaled to match current
|
14742
15379
|
* <b>colorMode()</b>. This value is always returned as a float so be careful
|
14743
|
-
* not to assign it to an int value
|
15380
|
+
* not to assign it to an int value..containsThe <b>green()</b>
|
14744
15381
|
* function is easy to use and undestand, but is slower than another
|
14745
15382
|
* technique. To achieve the same results when working in <b>colorMode(RGB,
|
14746
15383
|
* 255)</b>, but with greater speed, use the >> (right shift) operator
|
@@ -14770,7 +15407,7 @@ public class PApplet implements PConstants {
|
|
14770
15407
|
*
|
14771
15408
|
* Extracts the blue value from a color, scaled to match current
|
14772
15409
|
* <b>colorMode()</b>. This value is always returned as a float so be careful
|
14773
|
-
* not to assign it to an int value
|
15410
|
+
* not to assign it to an int value..containsThe <b>blue()</b>
|
14774
15411
|
* function is easy to use and undestand, but is slower than another
|
14775
15412
|
* technique. To achieve the same results when working in <b>colorMode(RGB,
|
14776
15413
|
* 255)</b>, but with greater speed, use a bit mask to remove the other color
|