propane 3.5.0-java → 3.6.0-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 -1
- data/.mvn/wrapper/MavenWrapperDownloader.java +1 -1
- data/.mvn/wrapper/maven-wrapper.properties +2 -2
- data/.travis.yml +1 -1
- data/CHANGELOG.md +3 -1
- data/README.md +5 -13
- data/Rakefile +1 -1
- data/lib/propane.rb +2 -1
- data/lib/propane/helper_methods.rb +0 -1
- data/lib/propane/runner.rb +2 -0
- data/lib/propane/version.rb +1 -1
- data/pom.rb +43 -43
- data/pom.xml +4 -4
- data/propane.gemspec +4 -3
- data/src/main/java/japplemenubar/JAppleMenuBar.java +3 -3
- data/src/main/java/processing/awt/PGraphicsJava2D.java +8 -17
- data/src/main/java/processing/awt/PImageAWT.java +123 -6
- data/src/main/java/processing/awt/PShapeJava2D.java +1 -0
- data/src/main/java/processing/awt/PSurfaceAWT.java +9 -7
- data/src/main/java/processing/awt/ShimAWT.java +2 -1
- data/src/main/java/processing/core/PApplet.java +4605 -6014
- data/src/main/java/processing/core/PConstants.java +5 -5
- data/src/main/java/processing/core/PFont.java +5 -17
- data/src/main/java/processing/core/PGraphics.java +308 -320
- data/src/main/java/processing/core/PImage.java +1440 -1537
- data/src/main/java/processing/core/PMatrix2D.java +24 -7
- data/src/main/java/processing/core/PMatrix3D.java +12 -5
- data/src/main/java/processing/core/PShape.java +155 -173
- data/src/main/java/processing/core/PShapeOBJ.java +2 -0
- data/src/main/java/processing/core/PShapeSVG.java +632 -611
- data/src/main/java/processing/core/PSurface.java +15 -10
- data/src/main/java/processing/core/PSurfaceNone.java +8 -4
- data/src/main/java/processing/core/PVector.java +35 -28
- data/src/main/java/processing/data/Table.java +20 -20
- data/src/main/java/processing/data/XML.java +1 -1
- data/src/main/java/processing/event/Event.java +1 -1
- data/src/main/java/processing/event/MouseEvent.java +7 -6
- data/src/main/java/processing/javafx/PGraphicsFX2D.java +20 -345
- data/src/main/java/processing/javafx/PSurfaceFX.java +127 -125
- data/src/main/java/processing/opengl/FrameBuffer.java +2 -4
- data/src/main/java/processing/opengl/LinePath.java +4 -0
- data/src/main/java/processing/opengl/LineStroker.java +2 -6
- data/src/main/java/processing/opengl/PGL.java +72 -45
- data/src/main/java/processing/opengl/PGraphicsOpenGL.java +106 -60
- data/src/main/java/processing/opengl/PJOGL.java +15 -3
- data/src/main/java/processing/opengl/PShader.java +26 -47
- data/src/main/java/processing/opengl/PShapeOpenGL.java +1041 -1001
- data/src/main/java/processing/opengl/PSurfaceJOGL.java +211 -208
- data/src/main/java/processing/opengl/Texture.java +7 -4
- data/src/main/java/processing/opengl/VertexBuffer.java +2 -2
- data/vendors/Rakefile +22 -33
- metadata +38 -18
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
2
2
|
|
3
|
-
|
3
|
+
/*
|
4
4
|
Part of the Processing project - http://processing.org
|
5
5
|
|
6
6
|
Copyright (c) 2012-15 The Processing Foundation
|
@@ -20,7 +20,8 @@
|
|
20
20
|
Public License along with this library; if not, write to the
|
21
21
|
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
22
22
|
Boston, MA 02111-1307 USA
|
23
|
-
|
23
|
+
*/
|
24
|
+
|
24
25
|
package processing.opengl;
|
25
26
|
|
26
27
|
import java.awt.Component;
|
@@ -78,11 +79,9 @@ import processing.awt.PImageAWT;
|
|
78
79
|
// have this removed by 4.0 final
|
79
80
|
import processing.awt.ShimAWT;
|
80
81
|
|
81
|
-
public class PSurfaceJOGL implements PSurface {
|
82
82
|
|
83
|
-
|
84
|
-
|
85
|
-
*/
|
83
|
+
public class PSurfaceJOGL implements PSurface {
|
84
|
+
/** Selected GL profile */
|
86
85
|
public static GLProfile profile;
|
87
86
|
|
88
87
|
public PJOGL pgl;
|
@@ -115,9 +114,10 @@ public class PSurfaceJOGL implements PSurface {
|
|
115
114
|
|
116
115
|
protected boolean external = false;
|
117
116
|
|
117
|
+
|
118
118
|
public PSurfaceJOGL(PGraphics graphics) {
|
119
119
|
this.graphics = graphics;
|
120
|
-
this.pgl = (PJOGL) ((PGraphicsOpenGL)
|
120
|
+
this.pgl = (PJOGL) ((PGraphicsOpenGL)graphics).pgl;
|
121
121
|
}
|
122
122
|
|
123
123
|
|
@@ -132,70 +132,63 @@ public class PSurfaceJOGL implements PSurface {
|
|
132
132
|
public int displayDensity(int display) {
|
133
133
|
return shim.displayDensity(display);
|
134
134
|
}
|
135
|
-
|
135
|
+
*/
|
136
|
+
|
137
|
+
|
136
138
|
// TODO rewrite before 4.0 release
|
137
139
|
@Override
|
138
140
|
public PImage loadImage(String path, Object... args) {
|
139
141
|
return ShimAWT.loadImage(sketch, path, args);
|
140
142
|
}
|
141
143
|
|
144
|
+
|
142
145
|
@Override
|
143
146
|
public void selectInput(String prompt, String callbackMethod,
|
144
|
-
|
147
|
+
File file, Object callbackObject) {
|
145
148
|
EventQueue.invokeLater(() -> {
|
146
149
|
// https://github.com/processing/processing/issues/3831
|
147
|
-
boolean hide = (sketch != null)
|
148
|
-
|
149
|
-
if (hide)
|
150
|
-
setVisible(false);
|
151
|
-
}
|
150
|
+
boolean hide = (sketch != null) &&
|
151
|
+
(PApplet.platform == PConstants.WINDOWS);
|
152
|
+
if (hide) setVisible(false);
|
152
153
|
|
153
154
|
ShimAWT.selectImpl(prompt, callbackMethod, file,
|
154
|
-
|
155
|
+
callbackObject, null, FileDialog.LOAD);
|
155
156
|
|
156
|
-
if (hide)
|
157
|
-
setVisible(true);
|
158
|
-
}
|
157
|
+
if (hide) setVisible(true);
|
159
158
|
});
|
160
159
|
}
|
161
160
|
|
161
|
+
|
162
162
|
@Override
|
163
163
|
public void selectOutput(String prompt, String callbackMethod,
|
164
|
-
|
164
|
+
File file, Object callbackObject) {
|
165
165
|
EventQueue.invokeLater(() -> {
|
166
166
|
// https://github.com/processing/processing/issues/3831
|
167
|
-
boolean hide = (sketch != null)
|
168
|
-
|
169
|
-
if (hide)
|
170
|
-
setVisible(false);
|
171
|
-
}
|
167
|
+
boolean hide = (sketch != null) &&
|
168
|
+
(PApplet.platform == PConstants.WINDOWS);
|
169
|
+
if (hide) setVisible(false);
|
172
170
|
|
173
171
|
ShimAWT.selectImpl(prompt, callbackMethod, file,
|
174
|
-
|
172
|
+
callbackObject, null, FileDialog.SAVE);
|
175
173
|
|
176
|
-
if (hide)
|
177
|
-
setVisible(true);
|
178
|
-
}
|
174
|
+
if (hide) setVisible(true);
|
179
175
|
});
|
180
176
|
}
|
181
177
|
|
178
|
+
|
182
179
|
@Override
|
183
180
|
public void selectFolder(String prompt, String callbackMethod,
|
184
|
-
|
181
|
+
File file, Object callbackObject) {
|
185
182
|
EventQueue.invokeLater(() -> {
|
186
183
|
// https://github.com/processing/processing/issues/3831
|
187
|
-
boolean hide = (sketch != null)
|
188
|
-
|
189
|
-
if (hide)
|
190
|
-
|
191
|
-
}
|
192
|
-
|
184
|
+
boolean hide = (sketch != null) &&
|
185
|
+
(PApplet.platform == PConstants.WINDOWS);
|
186
|
+
if (hide) setVisible(false);
|
187
|
+
|
193
188
|
ShimAWT.selectFolderImpl(prompt, callbackMethod, file,
|
194
189
|
callbackObject, null);
|
195
|
-
|
196
|
-
if (hide)
|
197
|
-
setVisible(true);
|
198
|
-
}
|
190
|
+
|
191
|
+
if (hide) setVisible(true);
|
199
192
|
});
|
200
193
|
}
|
201
194
|
|
@@ -213,6 +206,7 @@ public class PSurfaceJOGL implements PSurface {
|
|
213
206
|
}
|
214
207
|
}
|
215
208
|
|
209
|
+
|
216
210
|
@Override
|
217
211
|
public void initFrame(PApplet sketch) {
|
218
212
|
this.sketch = sketch;
|
@@ -225,11 +219,13 @@ public class PSurfaceJOGL implements PSurface {
|
|
225
219
|
initAnimator();
|
226
220
|
}
|
227
221
|
|
222
|
+
|
228
223
|
@Override
|
229
224
|
public Object getNative() {
|
230
225
|
return window;
|
231
226
|
}
|
232
227
|
|
228
|
+
|
233
229
|
protected void initDisplay() {
|
234
230
|
display = NewtFactory.createDisplay(null);
|
235
231
|
display.addReference();
|
@@ -243,12 +239,12 @@ public class PSurfaceJOGL implements PSurface {
|
|
243
239
|
int displayNum = sketch.sketchDisplay();
|
244
240
|
if (displayNum > 0) { // if -1, use the default device
|
245
241
|
if (displayNum <= awtDevices.length) {
|
246
|
-
awtDisplayDevice = awtDevices[displayNum
|
242
|
+
awtDisplayDevice = awtDevices[displayNum-1];
|
247
243
|
} else {
|
248
|
-
System.err.format("Display %d does not exist, "
|
249
|
-
|
244
|
+
System.err.format("Display %d does not exist, " +
|
245
|
+
"using the default display instead.%n", displayNum);
|
250
246
|
for (int i = 0; i < awtDevices.length; i++) {
|
251
|
-
System.err.format("Display %d is %s%n", i
|
247
|
+
System.err.format("Display %d is %s%n", i+1, awtDevices[i]);
|
252
248
|
}
|
253
249
|
}
|
254
250
|
} else if (0 < awtDevices.length) {
|
@@ -263,53 +259,48 @@ public class PSurfaceJOGL implements PSurface {
|
|
263
259
|
displayRect = config.getBounds();
|
264
260
|
}
|
265
261
|
|
262
|
+
|
266
263
|
protected void initGL() {
|
267
264
|
// System.out.println("*******************************");
|
268
265
|
if (profile == null) {
|
269
266
|
switch (PJOGL.profile) {
|
270
267
|
case 1:
|
271
268
|
try {
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
break;
|
269
|
+
profile = GLProfile.getGL2ES1();
|
270
|
+
} catch (GLException ex) {
|
271
|
+
profile = GLProfile.getMaxFixedFunc(true);
|
272
|
+
} break;
|
277
273
|
case 2:
|
278
274
|
try {
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
275
|
+
profile = GLProfile.getGL2ES2();
|
276
|
+
|
277
|
+
// workaround for https://jogamp.org/bugzilla/show_bug.cgi?id=1347
|
278
|
+
if (!profile.isHardwareRasterizer()) {
|
279
|
+
GLProfile hardware = GLProfile.getMaxProgrammable(true);
|
280
|
+
if (hardware.isGL2ES2()) {
|
281
|
+
profile = hardware;
|
282
|
+
}
|
286
283
|
}
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
}
|
292
|
-
break;
|
284
|
+
|
285
|
+
} catch (GLException ex) {
|
286
|
+
profile = GLProfile.getMaxProgrammable(true);
|
287
|
+
} break;
|
293
288
|
case 3:
|
294
289
|
try {
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
}
|
302
|
-
break;
|
290
|
+
profile = GLProfile.getGL2GL3();
|
291
|
+
} catch (GLException ex) {
|
292
|
+
profile = GLProfile.getMaxProgrammable(true);
|
293
|
+
} if (!profile.isGL3()) {
|
294
|
+
PGraphics.showWarning("Requested profile GL3 but is not available, got: " + profile);
|
295
|
+
} break;
|
303
296
|
case 4:
|
304
297
|
try {
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
}
|
312
|
-
break;
|
298
|
+
profile = GLProfile.getGL4ES3();
|
299
|
+
} catch (GLException ex) {
|
300
|
+
profile = GLProfile.getMaxProgrammable(true);
|
301
|
+
} if (!profile.isGL4()) {
|
302
|
+
PGraphics.showWarning("Requested profile GL4 but is not available, got: " + profile);
|
303
|
+
} break;
|
313
304
|
default:
|
314
305
|
throw new RuntimeException(PGL.UNSUPPORTED_GLPROF_ERROR);
|
315
306
|
}
|
@@ -323,6 +314,7 @@ public class PSurfaceJOGL implements PSurface {
|
|
323
314
|
|
324
315
|
// caps.setPBuffer(false);
|
325
316
|
// caps.setFBO(false);
|
317
|
+
|
326
318
|
// pgl.reqNumSamples = PGL.smoothToSamples(graphics.smooth);
|
327
319
|
caps.setSampleBuffers(true);
|
328
320
|
caps.setNumSamples(PGL.smoothToSamples(graphics.smooth));
|
@@ -331,6 +323,7 @@ public class PSurfaceJOGL implements PSurface {
|
|
331
323
|
pgl.setCaps(caps);
|
332
324
|
}
|
333
325
|
|
326
|
+
|
334
327
|
protected void initWindow() {
|
335
328
|
window = GLWindow.create(screen, pgl.getCaps());
|
336
329
|
|
@@ -346,15 +339,16 @@ public class PSurfaceJOGL implements PSurface {
|
|
346
339
|
// } else {
|
347
340
|
// window = GLWindow.create(displayDevice.getScreen(), pgl.getCaps());
|
348
341
|
// }
|
349
|
-
|
350
|
-
|
342
|
+
|
343
|
+
windowScaleFactor = PApplet.platform == PConstants.MACOS ?
|
344
|
+
1 : sketch.pixelDensity;
|
351
345
|
|
352
346
|
boolean spanDisplays = sketch.sketchDisplay() == PConstants.SPAN;
|
353
|
-
screenRect = spanDisplays
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
347
|
+
screenRect = spanDisplays ?
|
348
|
+
new Rectangle(screen.getX(), screen.getY(), screen.getWidth(), screen.getHeight()) :
|
349
|
+
new Rectangle((int) displayRect.getX(), (int) displayRect.getY(),
|
350
|
+
(int) displayRect.getWidth(),
|
351
|
+
(int) displayRect.getHeight());
|
358
352
|
|
359
353
|
// Set the displayWidth/Height variables inside PApplet, so that they're
|
360
354
|
// usable and can even be returned by the sketchWidth()/Height() methods.
|
@@ -381,7 +375,8 @@ public class PSurfaceJOGL implements PSurface {
|
|
381
375
|
// graphics.setSize(w, h - 22 - 22);
|
382
376
|
System.err.println("setting width/height to " + w + " " + h);
|
383
377
|
}
|
384
|
-
|
378
|
+
*/
|
379
|
+
|
385
380
|
sketchWidth = sketch.sketchWidth();
|
386
381
|
sketchHeight = sketch.sketchHeight();
|
387
382
|
// System.out.println("init: " + sketchWidth + " " + sketchHeight);
|
@@ -399,7 +394,7 @@ public class PSurfaceJOGL implements PSurface {
|
|
399
394
|
fullScreen = true;
|
400
395
|
sketch.fullScreen();
|
401
396
|
}
|
402
|
-
|
397
|
+
*/
|
403
398
|
|
404
399
|
if (fullScreen || spanDisplays) {
|
405
400
|
sketchWidth = screenRect.width / windowScaleFactor;
|
@@ -410,13 +405,13 @@ public class PSurfaceJOGL implements PSurface {
|
|
410
405
|
|
411
406
|
float[] reqSurfacePixelScale;
|
412
407
|
if (graphics.is2X() && PApplet.platform == PConstants.MACOS) {
|
413
|
-
|
414
|
-
|
415
|
-
|
408
|
+
// Retina
|
409
|
+
reqSurfacePixelScale = new float[] { ScalableSurface.AUTOMAX_PIXELSCALE,
|
410
|
+
ScalableSurface.AUTOMAX_PIXELSCALE };
|
416
411
|
} else {
|
417
412
|
// Non-retina
|
418
|
-
reqSurfacePixelScale = new float[]{ScalableSurface.IDENTITY_PIXELSCALE,
|
419
|
-
|
413
|
+
reqSurfacePixelScale = new float[] { ScalableSurface.IDENTITY_PIXELSCALE,
|
414
|
+
ScalableSurface.IDENTITY_PIXELSCALE };
|
420
415
|
}
|
421
416
|
window.setSurfaceScale(reqSurfacePixelScale);
|
422
417
|
window.setSize(sketchWidth * windowScaleFactor, sketchHeight * windowScaleFactor);
|
@@ -434,6 +429,7 @@ public class PSurfaceJOGL implements PSurface {
|
|
434
429
|
}
|
435
430
|
}
|
436
431
|
|
432
|
+
|
437
433
|
protected void initListeners() {
|
438
434
|
NEWTMouseListener mouseListener = new NEWTMouseListener();
|
439
435
|
window.addMouseListener(mouseListener);
|
@@ -446,6 +442,7 @@ public class PSurfaceJOGL implements PSurface {
|
|
446
442
|
window.addGLEventListener(drawlistener);
|
447
443
|
}
|
448
444
|
|
445
|
+
|
449
446
|
protected void initAnimator() {
|
450
447
|
if (PApplet.platform == PConstants.WINDOWS) {
|
451
448
|
// Force Windows to keep timer resolution high by
|
@@ -455,8 +452,7 @@ public class PSurfaceJOGL implements PSurface {
|
|
455
452
|
Thread highResTimerThread = new Thread(() -> {
|
456
453
|
try {
|
457
454
|
Thread.sleep(Long.MAX_VALUE);
|
458
|
-
} catch (InterruptedException ignore) {
|
459
|
-
}
|
455
|
+
} catch (InterruptedException ignore) { }
|
460
456
|
}, "HighResTimerThread");
|
461
457
|
highResTimerThread.setDaemon(true);
|
462
458
|
highResTimerThread.start();
|
@@ -500,6 +496,7 @@ public class PSurfaceJOGL implements PSurface {
|
|
500
496
|
drawExceptionHandler.start();
|
501
497
|
}
|
502
498
|
|
499
|
+
|
503
500
|
@Override
|
504
501
|
public void setTitle(final String title) {
|
505
502
|
display.getEDTUtil().invoke(false, () -> {
|
@@ -507,6 +504,7 @@ public class PSurfaceJOGL implements PSurface {
|
|
507
504
|
});
|
508
505
|
}
|
509
506
|
|
507
|
+
|
510
508
|
@Override
|
511
509
|
public void setVisible(final boolean visible) {
|
512
510
|
display.getEDTUtil().invoke(false, () -> {
|
@@ -514,6 +512,7 @@ public class PSurfaceJOGL implements PSurface {
|
|
514
512
|
});
|
515
513
|
}
|
516
514
|
|
515
|
+
|
517
516
|
@Override
|
518
517
|
public void setResizable(final boolean resizable) {
|
519
518
|
display.getEDTUtil().invoke(false, () -> {
|
@@ -521,12 +520,14 @@ public class PSurfaceJOGL implements PSurface {
|
|
521
520
|
});
|
522
521
|
}
|
523
522
|
|
523
|
+
|
524
524
|
@Override
|
525
525
|
public void setIcon(PImage icon) {
|
526
|
-
PGraphics.showWarning("Window icons for OpenGL sketches can only be set in settings()\n"
|
527
|
-
|
526
|
+
PGraphics.showWarning("Window icons for OpenGL sketches can only be set in settings()\n" +
|
527
|
+
"using PJOGL.setIcon(filename).");
|
528
528
|
}
|
529
529
|
|
530
|
+
|
530
531
|
@Override
|
531
532
|
public void setAlwaysOnTop(final boolean always) {
|
532
533
|
display.getEDTUtil().invoke(false, () -> {
|
@@ -534,18 +535,19 @@ public class PSurfaceJOGL implements PSurface {
|
|
534
535
|
});
|
535
536
|
}
|
536
537
|
|
538
|
+
|
537
539
|
protected void initIcons() {
|
538
540
|
IOUtil.ClassResources res = null;
|
539
541
|
if (PJOGL.icons == null || PJOGL.icons.length == 0) {
|
540
542
|
// Default Processing icons
|
541
|
-
final int[] sizes = {16, 32, 48, 64, 128, 256, 512};
|
543
|
+
final int[] sizes = { 16, 32, 48, 64, 128, 256, 512 };
|
542
544
|
String[] iconImages = new String[sizes.length];
|
543
545
|
for (int i = 0; i < sizes.length; i++) {
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
546
|
+
iconImages[i] = "/icon/icon-" + sizes[i] + ".png";
|
547
|
+
}
|
548
|
+
res = new ClassResources(iconImages,
|
549
|
+
PApplet.class.getClassLoader(),
|
550
|
+
PApplet.class);
|
549
551
|
} else {
|
550
552
|
// Loading custom icons from user-provided files.
|
551
553
|
String[] iconImages = new String[PJOGL.icons.length];
|
@@ -554,12 +556,13 @@ public class PSurfaceJOGL implements PSurface {
|
|
554
556
|
}
|
555
557
|
|
556
558
|
res = new ClassResources(iconImages,
|
557
|
-
|
558
|
-
|
559
|
+
sketch.getClass().getClassLoader(),
|
560
|
+
sketch.getClass());
|
559
561
|
}
|
560
562
|
NewtFactory.setWindowIcons(res);
|
561
563
|
}
|
562
564
|
|
565
|
+
|
563
566
|
@SuppressWarnings("resource")
|
564
567
|
private String resourceFilename(String filename) {
|
565
568
|
// The code below comes from PApplet.createInputRaw() with a few adaptations
|
@@ -585,21 +588,17 @@ public class PSurfaceJOGL implements PSurface {
|
|
585
588
|
//if (filenameActual.equalsIgnoreCase(filenameShort) &&
|
586
589
|
//!filenameActual.equals(filenameShort)) {
|
587
590
|
if (!filenameActual.equals(filenameShort)) {
|
588
|
-
throw new RuntimeException("This file is named "
|
589
|
-
|
590
|
-
|
591
|
-
|
591
|
+
throw new RuntimeException("This file is named " +
|
592
|
+
filenameActual + " not " +
|
593
|
+
filename + ". Rename the file " +
|
594
|
+
"or change your code.");
|
592
595
|
}
|
593
|
-
} catch (IOException e) {
|
594
|
-
}
|
596
|
+
} catch (IOException e) { }
|
595
597
|
}
|
596
598
|
|
597
599
|
stream = new FileInputStream(file);
|
598
|
-
|
599
|
-
|
600
|
-
return file.getCanonicalPath();
|
601
|
-
}
|
602
|
-
|
600
|
+
stream.close();
|
601
|
+
return file.getCanonicalPath();
|
603
602
|
// have to break these out because a general Exception might
|
604
603
|
// catch the RuntimeException being thrown above
|
605
604
|
} catch (IOException | SecurityException ioe) {
|
@@ -634,8 +633,7 @@ public class PSurfaceJOGL implements PSurface {
|
|
634
633
|
return filename;
|
635
634
|
}
|
636
635
|
}
|
637
|
-
} catch (IOException e) {
|
638
|
-
}
|
636
|
+
} catch (IOException e) { }
|
639
637
|
|
640
638
|
try {
|
641
639
|
// attempt to load from a local file, used when running as
|
@@ -644,34 +642,25 @@ public class PSurfaceJOGL implements PSurface {
|
|
644
642
|
try {
|
645
643
|
String path = sketch.dataPath(filename);
|
646
644
|
stream = new FileInputStream(path);
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
}
|
651
|
-
} catch (IOException e2) {
|
652
|
-
}
|
645
|
+
stream.close();
|
646
|
+
return path;
|
647
|
+
} catch (IOException e2) { }
|
653
648
|
|
654
649
|
try {
|
655
650
|
String path = sketch.sketchPath(filename);
|
656
651
|
stream = new FileInputStream(path);
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
}
|
661
|
-
} catch (IOException e) {
|
662
|
-
} // ignored
|
652
|
+
stream.close();
|
653
|
+
return path;
|
654
|
+
} catch (IOException e) { } // ignored
|
663
655
|
|
664
656
|
try {
|
665
657
|
stream = new FileInputStream(filename);
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
} catch (IOException e1) {
|
671
|
-
}
|
658
|
+
stream.close();
|
659
|
+
return filename;
|
660
|
+
|
661
|
+
} catch (IOException e1) { }
|
672
662
|
|
673
|
-
} catch (SecurityException se) {
|
674
|
-
} // online, whups
|
663
|
+
} catch (SecurityException se) { } // online, whups
|
675
664
|
|
676
665
|
} catch (Exception e) {
|
677
666
|
//die(e.getMessage(), e);
|
@@ -681,6 +670,7 @@ public class PSurfaceJOGL implements PSurface {
|
|
681
670
|
return "";
|
682
671
|
}
|
683
672
|
|
673
|
+
|
684
674
|
@Override
|
685
675
|
public void placeWindow(int[] location, int[] editorLocation) {
|
686
676
|
|
@@ -717,19 +707,19 @@ public class PSurfaceJOGL implements PSurface {
|
|
717
707
|
if ((locationX + w > sketch.displayWidth - 33) ||
|
718
708
|
(locationY + h > sketch.displayHeight - 33)) {
|
719
709
|
// otherwise center on screen
|
720
|
-
|
710
|
+
*/
|
721
711
|
locationX = (sketch.displayWidth - w) / 2;
|
722
712
|
locationY = (sketch.displayHeight - h) / 2;
|
723
713
|
/*
|
724
714
|
}
|
725
|
-
|
715
|
+
*/
|
726
716
|
window.setTopLevelPosition(locationX, locationY);
|
727
717
|
}
|
728
718
|
} else { // just center on screen
|
729
719
|
// Can't use frame.setLocationRelativeTo(null) because it sends the
|
730
720
|
// frame to the main display, which undermines the --display setting.
|
731
721
|
window.setTopLevelPosition(screenRect.x + (screenRect.width - sketchWidth) / 2,
|
732
|
-
|
722
|
+
screenRect.y + (screenRect.height - sketchHeight) / 2);
|
733
723
|
}
|
734
724
|
|
735
725
|
Point frameLoc = new Point(x, y);
|
@@ -740,11 +730,12 @@ public class PSurfaceJOGL implements PSurface {
|
|
740
730
|
}
|
741
731
|
}
|
742
732
|
|
733
|
+
|
743
734
|
@Override
|
744
735
|
public void placePresent(int stopColor) {
|
745
736
|
float scale = getPixelScale();
|
746
|
-
pgl.initPresentMode(0.5f * (screenRect.width
|
747
|
-
|
737
|
+
pgl.initPresentMode(0.5f * (screenRect.width/scale - sketchWidth),
|
738
|
+
0.5f * (screenRect.height/scale - sketchHeight), stopColor);
|
748
739
|
PApplet.hideMenuBar();
|
749
740
|
|
750
741
|
window.setUndecorated(true);
|
@@ -752,11 +743,13 @@ public class PSurfaceJOGL implements PSurface {
|
|
752
743
|
window.setTopLevelSize((int) displayRect.getWidth(), (int) displayRect.getHeight());
|
753
744
|
}
|
754
745
|
|
746
|
+
|
755
747
|
@Override
|
756
748
|
public void setupExternalMessages() {
|
757
749
|
external = true;
|
758
750
|
}
|
759
751
|
|
752
|
+
|
760
753
|
@Override
|
761
754
|
public void startThread() {
|
762
755
|
if (animator != null) {
|
@@ -764,12 +757,15 @@ public class PSurfaceJOGL implements PSurface {
|
|
764
757
|
}
|
765
758
|
}
|
766
759
|
|
760
|
+
|
761
|
+
@Override
|
767
762
|
public void pauseThread() {
|
768
763
|
if (animator != null) {
|
769
764
|
animator.pause();
|
770
765
|
}
|
771
766
|
}
|
772
767
|
|
768
|
+
|
773
769
|
@Override
|
774
770
|
public void resumeThread() {
|
775
771
|
if (animator != null) {
|
@@ -777,6 +773,7 @@ public class PSurfaceJOGL implements PSurface {
|
|
777
773
|
}
|
778
774
|
}
|
779
775
|
|
776
|
+
|
780
777
|
@Override
|
781
778
|
public boolean stopThread() {
|
782
779
|
if (drawExceptionHandler != null) {
|
@@ -790,6 +787,7 @@ public class PSurfaceJOGL implements PSurface {
|
|
790
787
|
}
|
791
788
|
}
|
792
789
|
|
790
|
+
|
793
791
|
@Override
|
794
792
|
public boolean isStopped() {
|
795
793
|
if (animator != null) {
|
@@ -799,6 +797,7 @@ public class PSurfaceJOGL implements PSurface {
|
|
799
797
|
}
|
800
798
|
}
|
801
799
|
|
800
|
+
|
802
801
|
@Override
|
803
802
|
public void setLocation(final int x, final int y) {
|
804
803
|
display.getEDTUtil().invoke(false, () -> {
|
@@ -806,11 +805,10 @@ public class PSurfaceJOGL implements PSurface {
|
|
806
805
|
});
|
807
806
|
}
|
808
807
|
|
808
|
+
|
809
809
|
@Override
|
810
810
|
public void setSize(int wide, int high) {
|
811
|
-
if (pgl.presentMode())
|
812
|
-
return;
|
813
|
-
}
|
811
|
+
if (pgl.presentMode()) return;
|
814
812
|
|
815
813
|
// When the surface is set to resizable via surface.setResizable(true),
|
816
814
|
// a crash may occur if the user sets the window to size zero.
|
@@ -835,6 +833,7 @@ public class PSurfaceJOGL implements PSurface {
|
|
835
833
|
}
|
836
834
|
}
|
837
835
|
|
836
|
+
|
838
837
|
public float getPixelScale() {
|
839
838
|
if (graphics.pixelDensity == 1) {
|
840
839
|
return 1;
|
@@ -854,10 +853,12 @@ public class PSurfaceJOGL implements PSurface {
|
|
854
853
|
return currentPixelScale[0];
|
855
854
|
}
|
856
855
|
|
856
|
+
|
857
857
|
public Component getComponent() {
|
858
858
|
return canvas;
|
859
859
|
}
|
860
860
|
|
861
|
+
|
861
862
|
public void setSmooth(int level) {
|
862
863
|
pgl.reqNumSamples = level;
|
863
864
|
GLCapabilities caps = new GLCapabilities(profile);
|
@@ -873,35 +874,37 @@ public class PSurfaceJOGL implements PSurface {
|
|
873
874
|
config.setChosenCapabilities(caps);
|
874
875
|
}
|
875
876
|
|
877
|
+
|
876
878
|
@Override
|
877
879
|
public void setFrameRate(float fps) {
|
878
880
|
if (fps < 1) {
|
879
881
|
PGraphics.showWarning(
|
880
|
-
"The OpenGL renderer cannot have a frame rate lower than 1.\n"
|
881
|
-
|
882
|
+
"The OpenGL renderer cannot have a frame rate lower than 1.\n" +
|
883
|
+
"Your sketch will run at 1 frame per second.");
|
882
884
|
fps = 1;
|
883
885
|
} else if (fps > 1000) {
|
884
886
|
PGraphics.showWarning(
|
885
|
-
"The OpenGL renderer cannot have a frame rate higher than 1000.\n"
|
886
|
-
|
887
|
+
"The OpenGL renderer cannot have a frame rate higher than 1000.\n" +
|
888
|
+
"Your sketch will run at 1000 frames per second.");
|
887
889
|
fps = 1000;
|
888
890
|
}
|
889
891
|
if (animator != null) {
|
890
892
|
animator.stop();
|
891
|
-
animator.setFPS((int)
|
893
|
+
animator.setFPS((int)fps);
|
892
894
|
pgl.setFps(fps);
|
893
895
|
animator.start();
|
894
896
|
}
|
895
897
|
}
|
896
898
|
|
899
|
+
|
897
900
|
public void requestFocus() {
|
898
901
|
display.getEDTUtil().invoke(false, () -> {
|
899
902
|
window.requestFocus();
|
900
903
|
});
|
901
904
|
}
|
902
905
|
|
903
|
-
class DrawListener implements GLEventListener {
|
904
906
|
|
907
|
+
class DrawListener implements GLEventListener {
|
905
908
|
@Override
|
906
909
|
public void display(GLAutoDrawable drawable) {
|
907
910
|
if (display.getEDTUtil().isCurrentThreadEDT()) {
|
@@ -939,12 +942,10 @@ public class PSurfaceJOGL implements PSurface {
|
|
939
942
|
sketch.exitActual();
|
940
943
|
}
|
941
944
|
}
|
942
|
-
|
943
945
|
@Override
|
944
946
|
public void dispose(GLAutoDrawable drawable) {
|
945
947
|
// sketch.dispose();
|
946
948
|
}
|
947
|
-
|
948
949
|
@Override
|
949
950
|
public void init(GLAutoDrawable drawable) {
|
950
951
|
pgl.getGL(drawable);
|
@@ -953,9 +954,9 @@ public class PSurfaceJOGL implements PSurface {
|
|
953
954
|
|
954
955
|
int c = graphics.backgroundColor;
|
955
956
|
pgl.clearColor(((c >> 16) & 0xff) / 255f,
|
956
|
-
|
957
|
-
|
958
|
-
|
957
|
+
((c >> 8) & 0xff) / 255f,
|
958
|
+
((c) & 0xff) / 255f,
|
959
|
+
((c >> 24) & 0xff) / 255f);
|
959
960
|
pgl.clear(PGL.COLOR_BUFFER_BIT);
|
960
961
|
}
|
961
962
|
|
@@ -963,18 +964,17 @@ public class PSurfaceJOGL implements PSurface {
|
|
963
964
|
public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
|
964
965
|
pgl.resetFBOLayer();
|
965
966
|
pgl.getGL(drawable);
|
966
|
-
float scale = PApplet.platform == PConstants.MACOS
|
967
|
-
|
967
|
+
float scale = PApplet.platform == PConstants.MACOS ?
|
968
|
+
getCurrentPixelScale() : getPixelScale();
|
968
969
|
setSize((int) (w / scale), (int) (h / scale));
|
969
970
|
}
|
970
971
|
}
|
971
972
|
|
972
|
-
protected class NEWTWindowListener implements com.jogamp.newt.event.WindowListener {
|
973
973
|
|
974
|
+
protected class NEWTWindowListener implements com.jogamp.newt.event.WindowListener {
|
974
975
|
public NEWTWindowListener() {
|
975
976
|
super();
|
976
977
|
}
|
977
|
-
|
978
978
|
@Override
|
979
979
|
public void windowGainedFocus(com.jogamp.newt.event.WindowEvent arg0) {
|
980
980
|
sketch.focused = true;
|
@@ -1013,49 +1013,41 @@ public class PSurfaceJOGL implements PSurface {
|
|
1013
1013
|
}
|
1014
1014
|
}
|
1015
1015
|
|
1016
|
+
|
1016
1017
|
// NEWT mouse listener
|
1017
1018
|
protected class NEWTMouseListener extends com.jogamp.newt.event.MouseAdapter {
|
1018
|
-
|
1019
1019
|
public NEWTMouseListener() {
|
1020
1020
|
super();
|
1021
1021
|
}
|
1022
|
-
|
1023
1022
|
@Override
|
1024
1023
|
public void mousePressed(com.jogamp.newt.event.MouseEvent e) {
|
1025
1024
|
nativeMouseEvent(e, MouseEvent.PRESS);
|
1026
1025
|
}
|
1027
|
-
|
1028
1026
|
@Override
|
1029
1027
|
public void mouseReleased(com.jogamp.newt.event.MouseEvent e) {
|
1030
1028
|
nativeMouseEvent(e, MouseEvent.RELEASE);
|
1031
1029
|
}
|
1032
|
-
|
1033
1030
|
@Override
|
1034
1031
|
public void mouseClicked(com.jogamp.newt.event.MouseEvent e) {
|
1035
1032
|
nativeMouseEvent(e, MouseEvent.CLICK);
|
1036
1033
|
}
|
1037
|
-
|
1038
1034
|
@Override
|
1039
1035
|
public void mouseDragged(com.jogamp.newt.event.MouseEvent e) {
|
1040
1036
|
nativeMouseEvent(e, MouseEvent.DRAG);
|
1041
1037
|
}
|
1042
|
-
|
1043
1038
|
@Override
|
1044
1039
|
public void mouseMoved(com.jogamp.newt.event.MouseEvent e) {
|
1045
1040
|
nativeMouseEvent(e, MouseEvent.MOVE);
|
1046
1041
|
}
|
1047
|
-
|
1048
1042
|
@Override
|
1049
1043
|
public void mouseWheelMoved(com.jogamp.newt.event.MouseEvent e) {
|
1050
1044
|
nativeMouseEvent(e, MouseEvent.WHEEL);
|
1051
1045
|
}
|
1052
|
-
|
1053
1046
|
@Override
|
1054
1047
|
public void mouseEntered(com.jogamp.newt.event.MouseEvent e) {
|
1055
1048
|
// System.out.println("enter");
|
1056
1049
|
nativeMouseEvent(e, MouseEvent.ENTER);
|
1057
1050
|
}
|
1058
|
-
|
1059
1051
|
@Override
|
1060
1052
|
public void mouseExited(com.jogamp.newt.event.MouseEvent e) {
|
1061
1053
|
// System.out.println("exit");
|
@@ -1063,30 +1055,28 @@ public class PSurfaceJOGL implements PSurface {
|
|
1063
1055
|
}
|
1064
1056
|
}
|
1065
1057
|
|
1058
|
+
|
1066
1059
|
// NEWT key listener
|
1067
1060
|
protected class NEWTKeyListener extends com.jogamp.newt.event.KeyAdapter {
|
1068
|
-
|
1069
1061
|
public NEWTKeyListener() {
|
1070
1062
|
super();
|
1071
1063
|
}
|
1072
|
-
|
1073
1064
|
@Override
|
1074
1065
|
public void keyPressed(com.jogamp.newt.event.KeyEvent e) {
|
1075
1066
|
nativeKeyEvent(e, KeyEvent.PRESS);
|
1076
1067
|
}
|
1077
|
-
|
1078
1068
|
@Override
|
1079
1069
|
public void keyReleased(com.jogamp.newt.event.KeyEvent e) {
|
1080
1070
|
nativeKeyEvent(e, KeyEvent.RELEASE);
|
1081
1071
|
}
|
1082
|
-
|
1083
|
-
public void keyTyped(com.jogamp.newt.event.KeyEvent e) {
|
1072
|
+
public void keyTyped(com.jogamp.newt.event.KeyEvent e) {
|
1084
1073
|
nativeKeyEvent(e, KeyEvent.TYPE);
|
1085
1074
|
}
|
1086
1075
|
}
|
1087
1076
|
|
1077
|
+
|
1088
1078
|
protected void nativeMouseEvent(com.jogamp.newt.event.MouseEvent nativeEvent,
|
1089
|
-
|
1079
|
+
int peAction) {
|
1090
1080
|
int modifiers = nativeEvent.getModifiers();
|
1091
1081
|
/*
|
1092
1082
|
int peModifiers = modifiers &
|
@@ -1113,8 +1103,8 @@ public class PSurfaceJOGL implements PSurface {
|
|
1113
1103
|
if (peAction == MouseEvent.WHEEL) {
|
1114
1104
|
// Invert wheel rotation count so it matches JAVA2D's
|
1115
1105
|
// https://github.com/processing/processing/issues/3840
|
1116
|
-
peCount = -(nativeEvent.isShiftDown() ? (int)
|
1117
|
-
|
1106
|
+
peCount = -(nativeEvent.isShiftDown() ? (int)nativeEvent.getRotation()[0]:
|
1107
|
+
(int)nativeEvent.getRotation()[1]);
|
1118
1108
|
} else {
|
1119
1109
|
peCount = nativeEvent.getClickCount();
|
1120
1110
|
}
|
@@ -1131,10 +1121,10 @@ public class PSurfaceJOGL implements PSurface {
|
|
1131
1121
|
int my = sy;
|
1132
1122
|
|
1133
1123
|
if (pgl.presentMode()) {
|
1134
|
-
mx -= (int)
|
1135
|
-
my -= (int)
|
1136
|
-
if (peAction == KeyEvent.RELEASE
|
1137
|
-
|
1124
|
+
mx -= (int)pgl.presentX;
|
1125
|
+
my -= (int)pgl.presentY;
|
1126
|
+
if (peAction == KeyEvent.RELEASE &&
|
1127
|
+
pgl.insideStopButton(sx, sy - screenRect.height / windowScaleFactor)) {
|
1138
1128
|
sketch.exit();
|
1139
1129
|
}
|
1140
1130
|
if (mx < 0 || sketchWidth < mx || my < 0 || sketchHeight < my) {
|
@@ -1143,16 +1133,17 @@ public class PSurfaceJOGL implements PSurface {
|
|
1143
1133
|
}
|
1144
1134
|
|
1145
1135
|
MouseEvent me = new MouseEvent(nativeEvent, nativeEvent.getWhen(),
|
1146
|
-
|
1147
|
-
|
1148
|
-
|
1149
|
-
|
1136
|
+
peAction, modifiers,
|
1137
|
+
mx, my,
|
1138
|
+
peButton,
|
1139
|
+
peCount);
|
1150
1140
|
|
1151
1141
|
sketch.postEvent(me);
|
1152
1142
|
}
|
1153
1143
|
|
1144
|
+
|
1154
1145
|
protected void nativeKeyEvent(com.jogamp.newt.event.KeyEvent nativeEvent,
|
1155
|
-
|
1146
|
+
int peAction) {
|
1156
1147
|
int modifiers = nativeEvent.getModifiers();
|
1157
1148
|
// int peModifiers = nativeEvent.getModifiers() &
|
1158
1149
|
// (InputEvent.SHIFT_MASK |
|
@@ -1168,8 +1159,8 @@ public class PSurfaceJOGL implements PSurface {
|
|
1168
1159
|
keyChar = PConstants.CODED;
|
1169
1160
|
} else if (isHackyKey(code)) {
|
1170
1161
|
// we can return only one char for ENTER, let it be \n everywhere
|
1171
|
-
keyCode = code == com.jogamp.newt.event.KeyEvent.VK_ENTER
|
1172
|
-
|
1162
|
+
keyCode = code == com.jogamp.newt.event.KeyEvent.VK_ENTER ?
|
1163
|
+
PConstants.ENTER : code;
|
1173
1164
|
keyChar = hackToChar(code, nativeEvent.getKeyChar());
|
1174
1165
|
} else {
|
1175
1166
|
keyCode = code;
|
@@ -1184,10 +1175,10 @@ public class PSurfaceJOGL implements PSurface {
|
|
1184
1175
|
// In contrast to key symbol, key code uses a fixed US keyboard layout and therefore is keyboard layout independent.
|
1185
1176
|
// E.g. virtual key code VK_Y denotes the same physical key regardless whether keyboard layout QWERTY or QWERTZ is active. The key symbol of the former is VK_Y, where the latter produces VK_Y.
|
1186
1177
|
KeyEvent ke = new KeyEvent(nativeEvent, nativeEvent.getWhen(),
|
1187
|
-
|
1188
|
-
|
1189
|
-
|
1190
|
-
|
1178
|
+
peAction, modifiers,
|
1179
|
+
keyChar,
|
1180
|
+
keyCode,
|
1181
|
+
nativeEvent.isAutoRepeat());
|
1191
1182
|
|
1192
1183
|
sketch.postEvent(ke);
|
1193
1184
|
|
@@ -1196,27 +1187,29 @@ public class PSurfaceJOGL implements PSurface {
|
|
1196
1187
|
// Create key typed event
|
1197
1188
|
// TODO: combine dead keys with the following key
|
1198
1189
|
KeyEvent tke = new KeyEvent(nativeEvent, nativeEvent.getWhen(),
|
1199
|
-
|
1200
|
-
|
1201
|
-
|
1202
|
-
|
1190
|
+
KeyEvent.TYPE, modifiers,
|
1191
|
+
keyChar,
|
1192
|
+
0,
|
1193
|
+
nativeEvent.isAutoRepeat());
|
1203
1194
|
|
1204
1195
|
sketch.postEvent(tke);
|
1205
1196
|
}
|
1206
1197
|
}
|
1207
1198
|
}
|
1208
1199
|
|
1200
|
+
|
1209
1201
|
private static boolean isPCodedKey(short code) {
|
1210
|
-
return code == com.jogamp.newt.event.KeyEvent.VK_UP
|
1211
|
-
|
1212
|
-
|
1213
|
-
|
1214
|
-
|
1215
|
-
|
1216
|
-
|
1217
|
-
|
1202
|
+
return code == com.jogamp.newt.event.KeyEvent.VK_UP ||
|
1203
|
+
code == com.jogamp.newt.event.KeyEvent.VK_DOWN ||
|
1204
|
+
code == com.jogamp.newt.event.KeyEvent.VK_LEFT ||
|
1205
|
+
code == com.jogamp.newt.event.KeyEvent.VK_RIGHT ||
|
1206
|
+
code == com.jogamp.newt.event.KeyEvent.VK_ALT ||
|
1207
|
+
code == com.jogamp.newt.event.KeyEvent.VK_CONTROL ||
|
1208
|
+
code == com.jogamp.newt.event.KeyEvent.VK_SHIFT ||
|
1209
|
+
code == com.jogamp.newt.event.KeyEvent.VK_WINDOWS;
|
1218
1210
|
}
|
1219
1211
|
|
1212
|
+
|
1220
1213
|
// Why do we need this mapping?
|
1221
1214
|
// Relevant discussion and links here:
|
1222
1215
|
// http://forum.jogamp.org/Newt-wrong-keycode-for-key-td4033690.html#a4033697
|
@@ -1244,6 +1237,7 @@ public class PSurfaceJOGL implements PSurface {
|
|
1244
1237
|
}
|
1245
1238
|
}
|
1246
1239
|
|
1240
|
+
|
1247
1241
|
private static boolean isHackyKey(short code) {
|
1248
1242
|
switch (code) {
|
1249
1243
|
case com.jogamp.newt.event.KeyEvent.VK_BACK_SPACE:
|
@@ -1256,6 +1250,7 @@ public class PSurfaceJOGL implements PSurface {
|
|
1256
1250
|
return false;
|
1257
1251
|
}
|
1258
1252
|
|
1253
|
+
|
1259
1254
|
private static char hackToChar(short code, char def) {
|
1260
1255
|
switch (code) {
|
1261
1256
|
case com.jogamp.newt.event.KeyEvent.VK_BACK_SPACE:
|
@@ -1272,9 +1267,11 @@ public class PSurfaceJOGL implements PSurface {
|
|
1272
1267
|
return def;
|
1273
1268
|
}
|
1274
1269
|
|
1270
|
+
|
1275
1271
|
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
1276
|
-
class CursorInfo {
|
1277
1272
|
|
1273
|
+
|
1274
|
+
class CursorInfo {
|
1278
1275
|
PImage image;
|
1279
1276
|
int x, y;
|
1280
1277
|
|
@@ -1299,6 +1296,8 @@ public class PSurfaceJOGL implements PSurface {
|
|
1299
1296
|
PConstants.TEXT, "text"
|
1300
1297
|
);
|
1301
1298
|
|
1299
|
+
|
1300
|
+
|
1302
1301
|
@Override
|
1303
1302
|
public void setCursor(int kind) {
|
1304
1303
|
if (!cursorNames.containsKey(kind)) {
|
@@ -1309,8 +1308,8 @@ public class PSurfaceJOGL implements PSurface {
|
|
1309
1308
|
if (cursor == null) {
|
1310
1309
|
String name = cursorNames.get(kind);
|
1311
1310
|
if (name != null) {
|
1312
|
-
ImageIcon icon
|
1313
|
-
|
1311
|
+
ImageIcon icon =
|
1312
|
+
new ImageIcon(getClass().getResource("cursors/" + name + ".png"));
|
1314
1313
|
PImage img = new PImageAWT(icon.getImage());
|
1315
1314
|
// Most cursors just use the center as the hotspot...
|
1316
1315
|
int x = img.width / 2;
|
@@ -1343,11 +1342,12 @@ public class PSurfaceJOGL implements PSurface {
|
|
1343
1342
|
}
|
1344
1343
|
}
|
1345
1344
|
|
1345
|
+
|
1346
1346
|
@Override
|
1347
1347
|
public void setCursor(PImage image, int hotspotX, int hotspotY) {
|
1348
1348
|
Display disp = window.getScreen().getDisplay();
|
1349
|
-
BufferedImage bimg = (BufferedImage)
|
1350
|
-
DataBufferInt dbuf = (DataBufferInt)
|
1349
|
+
BufferedImage bimg = (BufferedImage)image.getNative();
|
1350
|
+
DataBufferInt dbuf = (DataBufferInt)bimg.getData().getDataBuffer();
|
1351
1351
|
int[] ipix = dbuf.getData();
|
1352
1352
|
ByteBuffer pixels = ByteBuffer.allocate(ipix.length * 4);
|
1353
1353
|
pixels.asIntBuffer().put(ipix);
|
@@ -1361,6 +1361,7 @@ public class PSurfaceJOGL implements PSurface {
|
|
1361
1361
|
});
|
1362
1362
|
}
|
1363
1363
|
|
1364
|
+
|
1364
1365
|
@Override
|
1365
1366
|
public void showCursor() {
|
1366
1367
|
display.getEDTUtil().invoke(false, () -> {
|
@@ -1368,6 +1369,7 @@ public class PSurfaceJOGL implements PSurface {
|
|
1368
1369
|
});
|
1369
1370
|
}
|
1370
1371
|
|
1372
|
+
|
1371
1373
|
@Override
|
1372
1374
|
public void hideCursor() {
|
1373
1375
|
display.getEDTUtil().invoke(false, () -> {
|
@@ -1375,6 +1377,7 @@ public class PSurfaceJOGL implements PSurface {
|
|
1375
1377
|
});
|
1376
1378
|
}
|
1377
1379
|
|
1380
|
+
|
1378
1381
|
@Override
|
1379
1382
|
public boolean openLink(String url) {
|
1380
1383
|
return ShimAWT.openLink(url);
|