diff --git a/build/build.xml b/build/build.xml index 9ee6b9ec8..f52d1f639 100755 --- a/build/build.xml +++ b/build/build.xml @@ -470,10 +470,13 @@ - + Android signing works properly. (Not modifying our appbundler since + most of the time that appbundler is used, keytool isn't needed). + Also, because Ant's copy task does not retain file permissions on Unix systems, + we need to use instead --> + + + diff --git a/core/src/processing/opengl/PJOGL.java b/core/src/processing/opengl/PJOGL.java index da19a93e0..7e2c4e730 100644 --- a/core/src/processing/opengl/PJOGL.java +++ b/core/src/processing/opengl/PJOGL.java @@ -172,6 +172,9 @@ public class PJOGL extends PGL { */ protected boolean prevCanDraw = false; + /** Stores exceptions that ocurred during drawing */ + protected Exception drawException; + // ........................................................ // JOGL's FBO-layer @@ -687,31 +690,32 @@ public class PJOGL extends PGL { @Override protected void requestDraw() { + drawException = null; boolean canDraw = pg.parent.canDraw(); if (pg.initialized && (canDraw || prevCanDraw)) { + drawLatch = new CountDownLatch(1); + if (WINDOW_TOOLKIT == AWT) { + canvasAWT.display(); + } else if (WINDOW_TOOLKIT == NEWT) { + windowNEWT.display(); + } try { - drawLatch = new CountDownLatch(1); - if (WINDOW_TOOLKIT == AWT) { - canvasAWT.display(); - } else if (WINDOW_TOOLKIT == NEWT) { - windowNEWT.display(); - } - try { - drawLatch.await(DRAW_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS); - } catch (InterruptedException e) { - e.printStackTrace(); - } + drawLatch.await(DRAW_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + e.printStackTrace(); + } - if (canDraw) prevCanDraw = true; - else prevCanDraw = false; - } catch (GLException e) { - // Unwrap GLException so that only the causing exception is shown. - Throwable tr = e.getCause(); - if (tr instanceof RuntimeException) { - throw (RuntimeException)tr; - } else { - throw new RuntimeException(tr); - } + if (canDraw) prevCanDraw = true; + else prevCanDraw = false; + } + + // Throw wherever exception happened during drawing outside the GL thread + // to it is properly picked up by the PDE. + if (drawException != null) { + if (drawException instanceof RuntimeException) { + throw (RuntimeException)drawException; + } else { + throw new RuntimeException(drawException); } } } @@ -830,7 +834,7 @@ public class PJOGL extends PGL { if (frontFBO == null) { // init frontFBO = new FBObject(); - frontFBO.reset(gl, pg.width, pg.height); + frontFBO.reset(gl, pg.width, pg.height, numSamples); frontFBO.attachTexture2D(gl, 0, true); sinkFBO = backFBO.getSamplingSinkFBO(); changedFrontTex = changedBackTex = true; @@ -865,7 +869,11 @@ public class PJOGL extends PGL { } } - pg.parent.handleDraw(); + try { + pg.parent.handleDraw(); + } catch (Exception ex) { + drawException = ex; + } drawLatch.countDown(); }