picrate 2.1.2-java → 2.4.2-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.
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
+ }