picrate 2.1.2-java → 2.4.2-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/.mvn/extensions.xml +1 -1
  3. data/CHANGELOG.md +8 -0
  4. data/README.md +3 -2
  5. data/Rakefile +2 -1
  6. data/docs/_includes/footer.html +1 -1
  7. data/docs/_layouts/post.html +1 -1
  8. data/docs/_methods/noise_mode.md +88 -0
  9. data/docs/_posts/2018-05-06-install_jruby.md +1 -1
  10. data/docs/_posts/2018-11-18-building-gem.md +3 -1
  11. data/docs/classes.md +2 -2
  12. data/docs/editors.md +2 -2
  13. data/docs/gems.md +3 -3
  14. data/docs/index.html +1 -1
  15. data/docs/libraries.md +2 -2
  16. data/docs/live.md +2 -2
  17. data/docs/magic.md +2 -2
  18. data/docs/methods.md +2 -2
  19. data/docs/modules.md +3 -3
  20. data/docs/objects.md +2 -2
  21. data/lib/picrate/app.rb +7 -6
  22. data/lib/picrate/native_folder.rb +1 -3
  23. data/lib/picrate/version.rb +1 -1
  24. data/library/pdf/pdf.rb +7 -0
  25. data/library/svg/svg.rb +7 -0
  26. data/picrate.gemspec +5 -3
  27. data/pom.rb +25 -4
  28. data/pom.xml +39 -4
  29. data/src/main/java/monkstone/FastNoiseModuleJava.java +127 -0
  30. data/src/main/java/monkstone/PicrateLibrary.java +3 -1
  31. data/src/main/java/monkstone/SmoothNoiseModuleJava.java +127 -0
  32. data/src/main/java/monkstone/fastmath/DegLutTables.java +111 -0
  33. data/src/main/java/monkstone/fastmath/Deglut.java +41 -93
  34. data/src/main/java/monkstone/noise/OpenSimplex2F.java +914 -0
  35. data/src/main/java/monkstone/noise/OpenSimplex2S.java +1138 -0
  36. data/src/main/java/monkstone/vecmath/package-info.java +1 -1
  37. data/src/main/java/monkstone/vecmath/vec3/Vec3.java +1 -1
  38. data/src/main/java/monkstone/videoevent/package-info.java +1 -1
  39. data/src/main/java/processing/awt/ShimAWT.java +260 -94
  40. data/src/main/java/processing/core/PApplet.java +14664 -13450
  41. data/src/main/java/processing/core/PConstants.java +5 -5
  42. data/src/main/java/processing/core/PFont.java +1 -1
  43. data/src/main/java/processing/core/PGraphics.java +200 -201
  44. data/src/main/java/processing/core/PImage.java +539 -549
  45. data/src/main/java/processing/core/PShape.java +18 -18
  46. data/src/main/java/processing/core/PVector.java +23 -23
  47. data/src/main/java/processing/data/Table.java +4 -4
  48. data/src/main/java/processing/net/Client.java +13 -13
  49. data/src/main/java/processing/net/Server.java +5 -5
  50. data/src/main/java/processing/opengl/PGraphicsOpenGL.java +4 -4
  51. data/src/main/java/processing/pdf/PGraphicsPDF.java +529 -0
  52. data/src/main/java/processing/svg/PGraphicsSVG.java +378 -0
  53. data/test/deglut_spec_test.rb +2 -2
  54. data/test/respond_to_test.rb +0 -2
  55. data/test/test_helper.rb +1 -1
  56. data/vendors/Rakefile +1 -1
  57. metadata +26 -15
  58. data/src/main/java/monkstone/noise/SimplexNoise.java +0 -465
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2018-20 Martin Prout
2
+ * Copyright (c) 2018-21 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 General Public
@@ -1,7 +1,7 @@
1
1
  package monkstone.vecmath.vec3;
2
2
 
3
3
  /*
4
- * Copyright (c) 2018-20 Martin Prout
4
+ * Copyright (c) 2018-21 Martin Prout
5
5
  *
6
6
  * This library is free software; you can redistribute it and/or
7
7
  * modify it under the terms of the GNU General Public
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2018-20 Martin Prout
2
+ * Copyright (c) 2018-21 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 General Public
@@ -9,19 +9,27 @@ import java.awt.Image;
9
9
  import java.awt.Toolkit;
10
10
  import java.awt.color.ColorSpace;
11
11
  import java.awt.image.BufferedImage;
12
+ import java.io.BufferedOutputStream;
12
13
  import java.io.File;
13
14
  import java.io.IOException;
14
15
  import java.io.InputStream;
15
16
  import java.net.URI;
16
17
  import java.net.URISyntaxException;
17
-
18
+ import java.util.Iterator;
18
19
  import java.awt.DisplayMode;
19
20
  import java.awt.GraphicsConfiguration;
20
21
  import java.awt.GraphicsDevice;
21
22
  import java.awt.GraphicsEnvironment;
22
23
  import java.awt.geom.AffineTransform;
23
24
 
25
+ import javax.imageio.IIOImage;
24
26
  import javax.imageio.ImageIO;
27
+ import javax.imageio.ImageTypeSpecifier;
28
+ import javax.imageio.ImageWriteParam;
29
+ import javax.imageio.ImageWriter;
30
+ import javax.imageio.metadata.IIOInvalidTreeException;
31
+ import javax.imageio.metadata.IIOMetadata;
32
+ import javax.imageio.metadata.IIOMetadataNode;
25
33
  import javax.swing.ImageIcon;
26
34
  import javax.swing.JFileChooser;
27
35
  import javax.swing.UIManager;
@@ -34,14 +42,14 @@ import processing.core.PApplet;
34
42
  import processing.core.PConstants;
35
43
  import processing.core.PImage;
36
44
 
45
+
37
46
  /**
38
- * This class exists as an abstraction layer to remove AWT from PApplet. It is a
39
- * staging area for AWT-specific code that's shared by the Java2D, JavaFX, and
40
- * JOGL renderers. Once PSurfaceFX and PSurfaceJOGL have their own
41
- * implementations, these methods will move to PSurfaceAWT.
47
+ * This class exists as an abstraction layer to remove AWT from PApplet.
48
+ * It is a staging area for AWT-specific code that's shared by the Java2D,
49
+ * JavaFX, and JOGL renderers. Once PSurfaceFX and PSurfaceJOGL have
50
+ * their own implementations, these methods will move to PSurfaceAWT.
42
51
  */
43
52
  public class ShimAWT implements PConstants {
44
-
45
53
  /*
46
54
  PGraphics graphics;
47
55
  PApplet sketch;
@@ -51,17 +59,16 @@ public class ShimAWT implements PConstants {
51
59
  this.graphics = graphics;
52
60
  this.sketch = sketch;
53
61
  }
54
- */
62
+ */
55
63
  static private ShimAWT instance;
56
64
 
57
65
  private GraphicsDevice[] displayDevices;
58
66
 
59
- private final int displayWidth;
60
- private final int displayHeight;
67
+ private int displayWidth;
68
+ private int displayHeight;
61
69
 
62
- /**
63
- * Only needed for display functions
64
- */
70
+
71
+ /** Only needed for display functions */
65
72
  static private ShimAWT getInstance() {
66
73
  if (instance == null) {
67
74
  instance = new ShimAWT();
@@ -69,6 +76,7 @@ public class ShimAWT implements PConstants {
69
76
  return instance;
70
77
  }
71
78
 
79
+
72
80
  private ShimAWT() {
73
81
  // Need the list of display devices to be queried already for usage below.
74
82
  // https://github.com/processing/processing/issues/3295
@@ -87,24 +95,29 @@ public class ShimAWT implements PConstants {
87
95
  // }
88
96
  // When this was called, display will always be unset (even in 3.x),
89
97
  // since this happens before settings() is called.
98
+
90
99
  // Set displayWidth and displayHeight for people still using those.
91
100
  DisplayMode displayMode = device.getDisplayMode();
92
101
  displayWidth = displayMode.getWidth();
93
102
  displayHeight = displayMode.getHeight();
94
103
  }
95
104
 
105
+
96
106
  static public int getDisplayWidth() {
97
107
  return getInstance().displayWidth;
98
108
  }
99
109
 
110
+
100
111
  static public int getDisplayHeight() {
101
112
  return getInstance().displayHeight;
102
113
  }
103
114
 
115
+
104
116
  static public int getDisplayCount() {
105
117
  return getInstance().displayDevices.length;
106
118
  }
107
119
 
120
+
108
121
  static public int getDisplayDensity(int num) {
109
122
  return getInstance().displayDensityImpl(num);
110
123
  }
@@ -124,20 +137,29 @@ public class ShimAWT implements PConstants {
124
137
  // If nobody's density is 2 then everyone is 1
125
138
  return 1;
126
139
  }
127
- */
140
+ */
141
+
142
+
128
143
  private int displayDensityImpl(int display) {
129
144
  if (display > 0 && display <= displayDevices.length) {
130
- GraphicsConfiguration graphicsConfig
131
- = displayDevices[display - 1].getDefaultConfiguration();
145
+ GraphicsConfiguration graphicsConfig =
146
+ displayDevices[display - 1].getDefaultConfiguration();
132
147
  AffineTransform tx = graphicsConfig.getDefaultTransform();
133
148
  return (int) Math.round(tx.getScaleX());
134
149
  }
135
150
 
136
- System.err.println("Display " + display + " does not exist, "
137
- + "returning 1 for displayDensity(" + display + ")");
151
+ System.err.println("Display " + display + " does not exist, " +
152
+ "returning 1 for displayDensity(" + display + ")");
138
153
  return 1; // not the end of the world, so don't throw a RuntimeException
139
154
  }
140
155
 
156
+
157
+ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
158
+
159
+
160
+ static protected String[] loadImageFormats; // list of ImageIO formats
161
+
162
+
141
163
  static public PImage loadImage(PApplet sketch, String filename, Object... args) {
142
164
  String extension = null;
143
165
  if (args != null && args.length > 0) {
@@ -169,22 +191,21 @@ public class ShimAWT implements PConstants {
169
191
  if (extension.equals("tga")) {
170
192
  try {
171
193
  InputStream input = sketch.createInput(filename);
172
- if (input == null) {
173
- return null;
174
- }
194
+ if (input == null) return null;
175
195
 
176
196
  PImage image = PImage.loadTGA(input);
177
197
  image.parent = sketch;
178
198
  return image;
179
199
 
180
200
  } catch (IOException e) {
201
+ e.printStackTrace();
181
202
  return null;
182
203
  }
183
204
  }
184
205
 
185
206
  if (extension.equals("tif") || extension.equals("tiff")) {
186
207
  InputStream input = sketch.createInput(filename);
187
- PImage image = (input == null) ? null : PImage.loadTIFF(input);
208
+ PImage image = (input == null) ? null : PImage.loadTIFF(input);
188
209
  return image;
189
210
  }
190
211
 
@@ -192,9 +213,9 @@ public class ShimAWT implements PConstants {
192
213
  // because the javax.imageio code was found to be much slower.
193
214
  // http://dev.processing.org/bugs/show_bug.cgi?id=392
194
215
  try {
195
- if (extension.equals("jpg") || extension.equals("jpeg")
196
- || extension.equals("gif") || extension.equals("png")
197
- || extension.equals("unknown")) {
216
+ if (extension.equals("jpg") || extension.equals("jpeg") ||
217
+ extension.equals("gif") || extension.equals("png") ||
218
+ extension.equals("unknown")) {
198
219
  byte[] bytes = sketch.loadBytes(filename);
199
220
  if (bytes == null) {
200
221
  return null;
@@ -206,8 +227,8 @@ public class ShimAWT implements PConstants {
206
227
  BufferedImage buffImage = (BufferedImage) awtImage;
207
228
  int space = buffImage.getColorModel().getColorSpace().getType();
208
229
  if (space == ColorSpace.TYPE_CMYK) {
209
- System.err.println(filename + " is a CMYK image, "
210
- + "only RGB images are supported.");
230
+ System.err.println(filename + " is a CMYK image, " +
231
+ "only RGB images are supported.");
211
232
  return null;
212
233
  /*
213
234
  // wishful thinking, appears to not be supported
@@ -219,19 +240,19 @@ public class ShimAWT implements PConstants {
219
240
  ColorConvertOp op = new ColorConvertOp(null);
220
241
  op.filter(buffImage, destImage);
221
242
  image = new PImage(destImage);
222
- */
243
+ */
223
244
  }
224
245
  }
225
246
 
226
247
  PImage image = new PImageAWT(awtImage);
227
248
  if (image.width == -1) {
228
- System.err.println("The file " + filename
229
- + " contains bad image data, or may not be an image.");
249
+ System.err.println("The file " + filename +
250
+ " contains bad image data, or may not be an image.");
230
251
  }
231
252
 
232
253
  // if it's a .gif image, test to see if it has transparency
233
- if (extension.equals("gif") || extension.equals("png")
234
- || extension.equals("unknown")) {
254
+ if (extension.equals("gif") || extension.equals("png") ||
255
+ extension.equals("unknown")) {
235
256
  image.checkAlpha();
236
257
  }
237
258
 
@@ -241,15 +262,15 @@ public class ShimAWT implements PConstants {
241
262
  }
242
263
  } catch (Exception e) {
243
264
  // show error, but move on to the stuff below, see if it'll work
244
-
265
+ e.printStackTrace();
245
266
  }
246
267
 
247
268
  if (loadImageFormats == null) {
248
269
  loadImageFormats = ImageIO.getReaderFormatNames();
249
270
  }
250
271
  if (loadImageFormats != null) {
251
- for (String loadImageFormat : loadImageFormats) {
252
- if (extension.equals(loadImageFormat)) {
272
+ for (int i = 0; i < loadImageFormats.length; i++) {
273
+ if (extension.equals(loadImageFormats[i])) {
253
274
  return loadImageIO(sketch, filename);
254
275
  }
255
276
  }
@@ -260,7 +281,6 @@ public class ShimAWT implements PConstants {
260
281
  return null;
261
282
  }
262
283
 
263
- static protected String[] loadImageFormats;
264
284
 
265
285
  /**
266
286
  * Use Java 1.4 ImageIO methods to load an image.
@@ -280,6 +300,7 @@ public class ShimAWT implements PConstants {
280
300
 
281
301
  //bi.getRGB(0, 0, outgoing.width, outgoing.height,
282
302
  // outgoing.pixels, 0, outgoing.width);
303
+
283
304
  // check the alpha for this image
284
305
  // was gonna call getType() on the image to see if RGB or ARGB,
285
306
  // but it's not actually useful, since gif images will come through
@@ -293,11 +314,164 @@ public class ShimAWT implements PConstants {
293
314
  // return the image
294
315
  return outgoing;
295
316
 
296
- } catch (IOException e) {
317
+ } catch (Exception e) {
318
+ e.printStackTrace();
297
319
  return null;
298
320
  }
299
321
  }
300
322
 
323
+
324
+ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
325
+
326
+
327
+ static public boolean saveImage(PImage image, String path) {
328
+ if (saveImageFormats == null) {
329
+ saveImageFormats = javax.imageio.ImageIO.getWriterFormatNames();
330
+ }
331
+ try {
332
+ if (saveImageFormats != null) {
333
+ for (int i = 0; i < saveImageFormats.length; i++) {
334
+ if (path.endsWith("." + saveImageFormats[i])) {
335
+ if (!saveImageIO(image, path)) {
336
+ System.err.println("Error while saving image.");
337
+ return false;
338
+ }
339
+ return true;
340
+ }
341
+ }
342
+ }
343
+ } catch (IOException e) {
344
+ e.printStackTrace();
345
+ }
346
+ return false;
347
+ }
348
+
349
+
350
+ static protected String[] saveImageFormats;
351
+
352
+
353
+ /**
354
+ * Use ImageIO functions from Java 1.4 and later to handle image save.
355
+ * Various formats are supported, typically jpeg, png, bmp, and wbmp.
356
+ * To get a list of the supported formats for writing, use: <BR>
357
+ * <TT>println(javax.imageio.ImageIO.getReaderFormatNames())</TT>
358
+ */
359
+ static protected boolean saveImageIO(PImage image, String path) throws IOException {
360
+ try {
361
+ int outputFormat = (image.format == ARGB) ?
362
+ BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB;
363
+
364
+ String extension =
365
+ path.substring(path.lastIndexOf('.') + 1).toLowerCase();
366
+
367
+ // JPEG and BMP images that have an alpha channel set get pretty unhappy.
368
+ // BMP just doesn't write, and JPEG writes it as a CMYK image.
369
+ // http://code.google.com/p/processing/issues/detail?id=415
370
+ if (extension.equals("bmp") || extension.equals("jpg") || extension.equals("jpeg")) {
371
+ outputFormat = BufferedImage.TYPE_INT_RGB;
372
+ }
373
+
374
+ BufferedImage bimage = new BufferedImage(image.pixelWidth, image.pixelHeight, outputFormat);
375
+ bimage.setRGB(0, 0, image.pixelWidth, image.pixelHeight, image.pixels, 0, image.pixelWidth);
376
+
377
+ File file = new File(path);
378
+
379
+ ImageWriter writer = null;
380
+ ImageWriteParam param = null;
381
+ IIOMetadata metadata = null;
382
+
383
+ if (extension.equals("jpg") || extension.equals("jpeg")) {
384
+ if ((writer = imageioWriter("jpeg")) != null) {
385
+ // Set JPEG quality to 90% with baseline optimization. Setting this
386
+ // to 1 was a huge jump (about triple the size), so this seems good.
387
+ // Oddly, a smaller file size than Photoshop at 90%, but I suppose
388
+ // it's a completely different algorithm.
389
+ param = writer.getDefaultWriteParam();
390
+ param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
391
+ param.setCompressionQuality(0.9f);
392
+ }
393
+ }
394
+
395
+ if (extension.equals("png")) {
396
+ if ((writer = imageioWriter("png")) != null) {
397
+ param = writer.getDefaultWriteParam();
398
+ if (false) {
399
+ metadata = imageioDPI(writer, param, 100);
400
+ }
401
+ }
402
+ }
403
+
404
+ if (writer != null) {
405
+ BufferedOutputStream output =
406
+ new BufferedOutputStream(PApplet.createOutput(file));
407
+ writer.setOutput(ImageIO.createImageOutputStream(output));
408
+ // writer.write(null, new IIOImage(bimage, null, null), param);
409
+ writer.write(metadata, new IIOImage(bimage, null, metadata), param);
410
+ writer.dispose();
411
+
412
+ output.flush();
413
+ output.close();
414
+ return true;
415
+ }
416
+ // If iter.hasNext() somehow fails up top, it falls through to here
417
+ return javax.imageio.ImageIO.write(bimage, extension, file);
418
+
419
+ } catch (Exception e) {
420
+ e.printStackTrace();
421
+ throw new IOException("image save failed.");
422
+ }
423
+ }
424
+
425
+
426
+ static private ImageWriter imageioWriter(String extension) {
427
+ Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName(extension);
428
+ if (iter.hasNext()) {
429
+ return iter.next();
430
+ }
431
+ return null;
432
+ }
433
+
434
+
435
+ static private IIOMetadata imageioDPI(ImageWriter writer, ImageWriteParam param, double dpi) {
436
+ // http://stackoverflow.com/questions/321736/how-to-set-dpi-information-in-an-image
437
+ ImageTypeSpecifier typeSpecifier =
438
+ ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);
439
+ IIOMetadata metadata =
440
+ writer.getDefaultImageMetadata(typeSpecifier, param);
441
+
442
+ if (!metadata.isReadOnly() && metadata.isStandardMetadataFormatSupported()) {
443
+ // for PNG, it's dots per millimeter
444
+ double dotsPerMilli = dpi / 25.4;
445
+
446
+ IIOMetadataNode horiz = new IIOMetadataNode("HorizontalPixelSize");
447
+ horiz.setAttribute("value", Double.toString(dotsPerMilli));
448
+
449
+ IIOMetadataNode vert = new IIOMetadataNode("VerticalPixelSize");
450
+ vert.setAttribute("value", Double.toString(dotsPerMilli));
451
+
452
+ IIOMetadataNode dim = new IIOMetadataNode("Dimension");
453
+ dim.appendChild(horiz);
454
+ dim.appendChild(vert);
455
+
456
+ IIOMetadataNode root = new IIOMetadataNode("javax_imageio_1.0");
457
+ root.appendChild(dim);
458
+
459
+ try {
460
+ metadata.mergeTree("javax_imageio_1.0", root);
461
+ return metadata;
462
+
463
+ } catch (IIOInvalidTreeException e) {
464
+ System.err.println("Could not set the DPI of the output image");
465
+ e.printStackTrace();
466
+ }
467
+ }
468
+ return null;
469
+ }
470
+
471
+
472
+ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
473
+
474
+
301
475
  static public void initRun() {
302
476
  // Supposed to help with flicker, but no effect on OS X.
303
477
  // TODO IIRC this helped on Windows, but need to double check.
@@ -332,11 +506,13 @@ public class ShimAWT implements PConstants {
332
506
  // If nobody's density is 2 then everyone is 1
333
507
  return 1;
334
508
  }
335
- */
336
- /**
337
- * @param display the display number to check (1-indexed to match the
338
- * Preferences dialog box)
339
- */
509
+ */
510
+
511
+
512
+ /**
513
+ * @param display the display number to check
514
+ * (1-indexed to match the Preferences dialog box)
515
+ */
340
516
  /*
341
517
  public int displayDensity(int display) {
342
518
  if (display > 0 && display <= displayDevices.length) {
@@ -349,12 +525,14 @@ public class ShimAWT implements PConstants {
349
525
  System.err.println("Display " + display + " does not exist, returning ");
350
526
  return 1; // not the end of the world, so don't throw a RuntimeException
351
527
  }
352
- */
528
+ */
529
+
530
+
353
531
  static public void selectInput(String prompt, String callbackMethod,
354
- File file, Object callbackObject) {
532
+ File file, Object callbackObject) {
355
533
  EventQueue.invokeLater(() -> {
356
534
  selectImpl(prompt, callbackMethod, file,
357
- callbackObject, null, FileDialog.LOAD);
535
+ callbackObject, null, FileDialog.LOAD);
358
536
  });
359
537
  }
360
538
 
@@ -371,12 +549,14 @@ public class ShimAWT implements PConstants {
371
549
  PApplet sketch) {
372
550
  selectImpl(prompt, callbackMethod, file, callbackObject, parent, FileDialog.SAVE, sketch);
373
551
  }
374
- */
552
+ */
553
+
554
+
375
555
  static public void selectOutput(String prompt, String callbackMethod,
376
- File file, Object callbackObject) {
556
+ File file, Object callbackObject) {
377
557
  EventQueue.invokeLater(() -> {
378
558
  selectImpl(prompt, callbackMethod, file,
379
- callbackObject, null, FileDialog.SAVE);
559
+ callbackObject, null, FileDialog.SAVE);
380
560
  });
381
561
  }
382
562
 
@@ -405,13 +585,15 @@ public class ShimAWT implements PConstants {
405
585
  }
406
586
  });
407
587
  }
408
- */
588
+ */
589
+
590
+
409
591
  static public void selectImpl(final String prompt,
410
- final String callbackMethod,
411
- final File defaultSelection,
412
- final Object callbackObject,
413
- final Frame parentFrame,
414
- final int mode) {
592
+ final String callbackMethod,
593
+ final File defaultSelection,
594
+ final Object callbackObject,
595
+ final Frame parentFrame,
596
+ final int mode) {
415
597
  File selectedFile = null;
416
598
 
417
599
  if (PApplet.useNativeSelect) {
@@ -448,13 +630,14 @@ public class ShimAWT implements PConstants {
448
630
  PApplet.selectCallback(selectedFile, callbackMethod, callbackObject);
449
631
  }
450
632
 
633
+
451
634
  static public void selectFolder(final String prompt,
452
- final String callbackMethod,
453
- final File defaultSelection,
454
- final Object callbackObject) {
635
+ final String callbackMethod,
636
+ final File defaultSelection,
637
+ final Object callbackObject) {
455
638
  EventQueue.invokeLater(() -> {
456
639
  selectFolderImpl(prompt, callbackMethod, defaultSelection,
457
- callbackObject, null);
640
+ callbackObject, null);
458
641
  });
459
642
  }
460
643
 
@@ -482,49 +665,31 @@ public class ShimAWT implements PConstants {
482
665
  callbackObject, parentFrame, sketch);
483
666
  });
484
667
  }
485
- */
668
+ */
669
+
670
+
486
671
  static public void selectFolderImpl(final String prompt,
487
- final String callbackMethod,
488
- final File defaultSelection,
489
- final Object callbackObject,
490
- final Frame parentFrame) {
672
+ final String callbackMethod,
673
+ final File defaultSelection,
674
+ final Object callbackObject,
675
+ final Frame parentFrame) {
491
676
  File selectedFile = null;
492
677
 
493
- checkLookAndFeel();
494
- JFileChooser fileChooser = new JFileChooser();
495
- fileChooser.setDialogTitle(prompt);
496
- fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
497
- if (defaultSelection != null) {
498
- fileChooser.setCurrentDirectory(defaultSelection);
499
- }
500
-
501
- int result = fileChooser.showOpenDialog(parentFrame);
502
- if (result == JFileChooser.APPROVE_OPTION) {
503
- selectedFile = fileChooser.getSelectedFile();
504
- }
678
+ JFileChooser fileChooser = new JFileChooser();
679
+ fileChooser.setDialogTitle(prompt);
680
+ fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
681
+ if (defaultSelection != null) {
682
+ fileChooser.setCurrentDirectory(defaultSelection);
683
+ }
505
684
 
685
+ int result = fileChooser.showOpenDialog(parentFrame);
686
+ if (result == JFileChooser.APPROVE_OPTION) {
687
+ selectedFile = fileChooser.getSelectedFile();
688
+ }
689
+
506
690
  PApplet.selectCallback(selectedFile, callbackMethod, callbackObject);
507
691
  }
508
692
 
509
- static private boolean lookAndFeelCheck;
510
-
511
- /**
512
- * Initialize the Look & Feel if it hasn't been already. Call this before
513
- * using any Swing-related code in PApplet methods.
514
- */
515
- static private void checkLookAndFeel() {
516
- if (!lookAndFeelCheck) {
517
- if (PApplet.platform == PConstants.WINDOWS) {
518
- // Windows is defaulting to Metal or something else awful.
519
- // Which also is not scaled properly with HiDPI interfaces.
520
- try {
521
- UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
522
- } catch (ClassNotFoundException | IllegalAccessException | InstantiationException | UnsupportedLookAndFeelException e) {
523
- }
524
- }
525
- lookAndFeelCheck = true;
526
- }
527
- }
528
693
 
529
694
  // TODO maybe call this with reflection from inside PApplet?
530
695
  // longer term, develop a more general method for other platforms
@@ -532,6 +697,7 @@ public class ShimAWT implements PConstants {
532
697
  return FileSystemView.getFileSystemView().getHomeDirectory();
533
698
  }
534
699
 
700
+
535
701
  static public boolean openLink(String url) {
536
702
  try {
537
703
  if (Desktop.isDesktopSupported()) {
@@ -542,4 +708,4 @@ public class ShimAWT implements PConstants {
542
708
  }
543
709
  return false;
544
710
  }
545
- }
711
+ }