diff --git a/build/linux/dist.sh b/build/linux/dist.sh index 5676c6daf..847201114 100755 --- a/build/linux/dist.sh +++ b/build/linux/dist.sh @@ -17,7 +17,7 @@ cp -r ../shared processing cp -r ../../net processing/libraries/ cp -r ../../opengl processing/libraries/ cp -r ../../serial processing/libraries/ -#cp -r ../../pdf processing/libraries/ +cp -r ../../pdf processing/libraries/ # new style examples thing ala reas cd processing diff --git a/build/macosx/dist.sh b/build/macosx/dist.sh index 06a5cf38e..2059f85cd 100755 --- a/build/macosx/dist.sh +++ b/build/macosx/dist.sh @@ -28,7 +28,7 @@ cp -r ../../net processing/libraries/ cp -r ../../opengl processing/libraries/ cp -r ../../serial processing/libraries/ cp -r ../../video processing/libraries/ -#cp -r ../../pdf processing/libraries/ +cp -r ../../pdf processing/libraries/ # new style examples thing ala reas cd processing diff --git a/build/shared/lib/export/application.exe b/build/shared/lib/export/application.exe index 83195752a..db286fe1b 100755 Binary files a/build/shared/lib/export/application.exe and b/build/shared/lib/export/application.exe differ diff --git a/build/windows/dist.sh b/build/windows/dist.sh index 95c74b7a0..5644a2864 100755 --- a/build/windows/dist.sh +++ b/build/windows/dist.sh @@ -28,7 +28,7 @@ cp -r ../../net processing/libraries/ cp -r ../../opengl processing/libraries/ cp -r ../../serial processing/libraries/ cp -r ../../video processing/libraries/ -#cp -r ../../pdf processing/libraries/ +cp -r ../../pdf processing/libraries/ # new style examples thing ala reas cd processing diff --git a/build/windows/launcher/export.exe b/build/windows/launcher/export.exe index 83195752a..db286fe1b 100755 Binary files a/build/windows/launcher/export.exe and b/build/windows/launcher/export.exe differ diff --git a/build/windows/launcher/processing.exe b/build/windows/launcher/processing.exe index 926321f58..e71a57ee2 100755 Binary files a/build/windows/launcher/processing.exe and b/build/windows/launcher/processing.exe differ diff --git a/core/PApplet.java b/core/PApplet.java index 743d4b1a2..bd564edde 100644 --- a/core/PApplet.java +++ b/core/PApplet.java @@ -781,6 +781,11 @@ public class PApplet extends Applet } + public void size(int iwidth, int iheight, String irenderer) { + size(iwidth, iheight, irenderer, null); + } + + /** * Creates a new PGraphics object and sets it to the specified size. *

@@ -792,19 +797,10 @@ public class PApplet extends Applet * XXXX Also note that this calls defaults(), which will reset any * XXXX settings for the font, stroke, fill, colorMode, lights, etc. */ - public void size(int iwidth, int iheight, String irenderer) { - /* - cases are: - - - no renderer set at all, create a new one (and throw ex) - newRenderer() - - displace the old renderer with a new one (make sure inside setup) - replaceRenderer() - - resize the previous renderer - resizeRenderer() - */ - - String currentRenderer = (g == null) ? null : g.getClass().getName(); + public void size(int iwidth, int iheight, + String irenderer, String ipath) { + String currentRenderer = + (g == null) ? null : g.getClass().getName(); if (currentRenderer != null) { if (currentRenderer.equals(irenderer)) { @@ -821,95 +817,68 @@ public class PApplet extends Applet // so all that needs to be done is to set the defaults // (clear the background, set default strokeWeight, etc). //g.defaults(); + // removed this in favor of calling defaults() from beginFrame() // this will happen when P3D or OPENGL are used with size() // inside of setup. it's also safe to call defaults() now, // because it's happening inside setup, which is just frame 0, // meaning that the graphics context is proper and visible. - return; } else { // just resizing, no need to create new graphics object - //println("resizing to " + iwidth + " " + iheight); g.resize(iwidth, iheight); updateSize(iwidth, iheight); redraw(); // changed for rev 0100 - - /* - this.width = iwidth; - this.height = iheight; - defaultSize = false; - - // make the applet itself larger.. it's a subclass of Component, - // so this is important for when it's embedded inside another app. - setSize(width, height); - */ - return; } + // in either case, the renderer is unchanged, so return + //return; - } else { + } else { // renderer is being changed if (frameCount > 0) { throw new RuntimeException("size() cannot be called to change " + "the renderer outside of setup()"); } - } - } + // otherwise ok to fall through and create renderer below + // the renderer is changing, so need to create a new object + g = createGraphics(iwidth, iheight, irenderer, ipath); + //if (g != null) { + updateSize(iwidth, iheight); + //} - String openglError = - "Before using OpenGL, first select " + - "Import Library > opengl from the Sketch menu."; - - try { - Class rendererClass = Class.forName(irenderer); - Class constructorParams[] = - new Class[] { Integer.TYPE, - Integer.TYPE, - PApplet.class }; - Constructor constructor = - rendererClass.getConstructor(constructorParams); - Object constructorValues[] = - new Object[] { new Integer(iwidth), - new Integer(iheight), - this }; - // create the actual PGraphics object for rendering - g = (PGraphics) constructor.newInstance(constructorValues); - - updateSize(iwidth, iheight); - - } catch (InvocationTargetException ite) { - String msg = ite.getTargetException().getMessage(); - if ((msg != null) && - (msg.indexOf("no jogl in java.library.path") != -1)) { - throw new RuntimeException(openglError); - } else { - //System.err.println("target ex"); - ite.getTargetException().printStackTrace(); - //throw ite.getTargetException(); - } - - } catch (ClassNotFoundException cnfe) { - if (cnfe.getMessage().indexOf("processing.opengl.PGraphicsGL") != -1) { - throw new RuntimeException(openglError); - } else { - throw new RuntimeException("You need to use \"Import Library\" " + - "to add " + irenderer + " to your sketch."); - } - - } catch (Exception e) { - e.printStackTrace(); - die("Could not start because of a problem with size()", e); - } - - if ((currentRenderer != null) && - !currentRenderer.equals(irenderer)) { // throw an exception so that setup() is called again // but with a properly sized render // this is for opengl, which needs a valid, properly sized // display before calling anything inside setup(). + throw new RuntimeException(NEW_RENDERER); + } + } else { // none exists, just create a freshy + g = createGraphics(iwidth, iheight, irenderer, ipath); + updateSize(iwidth, iheight); + } + + /* + // the renderer is changing, so need to create a new object + g = createGraphics(iwidth, iheight, irenderer); + //if (g != null) { + updateSize(iwidth, iheight); + //} + + //if ((currentRenderer != null) && + // !currentRenderer.equals(irenderer)) { + if (currentRenderer != null) { + // throw an exception so that setup() is called again + // but with a properly sized render + // this is for opengl, which needs a valid, properly sized + // display before calling anything inside setup(). throw new RuntimeException(NEW_RENDERER); } + */ } + /** + * Sets this.width and this.height, unsets defaultSize, and calls + * the size() methods inside any libraries. + */ protected void updateSize(int iwidth, int iheight) { this.width = iwidth; this.height = iheight; @@ -937,6 +906,7 @@ public class PApplet extends Applet } + /* public PGraphics createGraphics(String renderer) { return createGraphics(width, height, renderer); } @@ -945,53 +915,108 @@ public class PApplet extends Applet public PGraphics createGraphics(int iwidth, int iheight) { return createGraphics(iwidth, iheight, g.getClass().getName()); } + */ - public PGraphics createGraphics(int iwidth, int iheight, String renderer) { + public PGraphics createGraphics(int iwidth, int iheight, + String irenderer, String ipath) { + return createGraphics(iwidth, iheight, irenderer, this, ipath); + } + + + static public PGraphics createGraphics(int iwidth, int iheight, + String irenderer, PApplet applet, + String ipath) { + /* + // ok when calling size, but not really with createGraphics() if (renderer.equals(OPENGL)) { throw new RuntimeException("createGraphics() with OPENGL is not " + "supported. Use P3D instead."); } + */ + + String openglError = + "Before using OpenGL, first select " + + "Import Library > opengl from the Sketch menu."; - PGraphics outgoing; try { - Class rendererClass = Class.forName(renderer); - Class constructorParams[] = - new Class[] { Integer.TYPE, - Integer.TYPE, - PApplet.class }; + Class rendererClass = Class.forName(irenderer); + Class constructorParams[] = null; + Object constructorValues[] = null; + + if (ipath == null) { + constructorParams = new Class[] { + Integer.TYPE, Integer.TYPE, PApplet.class + }; + constructorValues = new Object[] { + new Integer(iwidth), new Integer(iheight), applet + }; + } else { + constructorParams = new Class[] { + Integer.TYPE, Integer.TYPE, PApplet.class, String.class + }; + constructorValues = new Object[] { + new Integer(iwidth), new Integer(iheight), applet, ipath + }; + } + Constructor constructor = rendererClass.getConstructor(constructorParams); - Object constructorValues[] = - new Object[] { new Integer(iwidth), - new Integer(iheight), - this }; // create the actual PGraphics object for rendering - //System.out.println("creating new PGraphics " + constructor); - outgoing = (PGraphics) constructor.newInstance(constructorValues); + return (PGraphics) constructor.newInstance(constructorValues); + //updateSize(iwidth, iheight); } catch (InvocationTargetException ite) { - Throwable target = ite.getTargetException(); - target.printStackTrace(); - throw new RuntimeException(target.getMessage()); - //throw new RuntimeException(ite.getTargetException()); // java 1.4 + String msg = ite.getTargetException().getMessage(); + if ((msg != null) && + (msg.indexOf("no jogl in java.library.path") != -1)) { + throw new RuntimeException(openglError); + } else { + //ite.getTargetException().printStackTrace(); + Throwable target = ite.getTargetException(); + target.printStackTrace(); + throw new RuntimeException(target.getMessage()); + } } catch (ClassNotFoundException cnfe) { - throw new RuntimeException("You need to use \"Import Library\" " + - "to add " + renderer + " to your sketch."); + if (cnfe.getMessage().indexOf("processing.opengl.PGraphicsGL") != -1) { + throw new RuntimeException(openglError); + } else { + throw new RuntimeException("You need to use \"Import Library\" " + + "to add " + irenderer + " to your sketch."); + } } catch (Exception e) { - //throw new RuntimeException(e); // java 1.4 + if ((e instanceof IllegalArgumentException) || + (e instanceof NoSuchMethodException) || + (e instanceof IllegalAccessException)) { + + String msg = "public " + + irenderer.substring(irenderer.lastIndexOf('.') + 1) + + "(int width, int height, PApplet parent" + + ((ipath == null) ? "" : ", String filename") + + ") does not exist."; + throw new RuntimeException(msg); + + } else { + e.printStackTrace(); + return null; + //die("Could not create " + irenderer); + } + + /* + } catch (Exception e) { e.printStackTrace(); - throw new RuntimeException("Could not start because of a " + - "problem inside size()"); + die("Could not start because of a problem with size()", e); + */ } // clear things out to get started - outgoing.defaults(); + //outgoing.defaults(); + // tell people to use beginFrame/endFrame // and send 'em off - return outgoing; + //return outgoing; } @@ -1062,6 +1087,7 @@ public class PApplet extends Applet //g.mis.newPixels(pixels, g.cm, 0, width); // must call this // make sure the screen is visible and usable + // (also prevents over-drawing when using PGraphicsGL) if ((g != null) && (g.image != null)) { screen.drawImage(g.image, 0, 0, null); } @@ -5788,6 +5814,13 @@ public class PApplet extends Applet } + public PGraphics record(String renderer, String filename) { + this.recorder = createGraphics(width, height, renderer, filename); + recorder.beginFrame(); + return recorder; + } + + ////////////////////////////////////////////////////////////// @@ -6932,4 +6965,9 @@ public class PApplet extends Applet if (recorder != null) recorder.recordRaw(recorderRaw); g.recordRaw(recorderRaw); } + + + public PGraphics recordRaw(String renderer, String filename) { + return g.recordRaw(renderer, filename); + } } diff --git a/core/PGraphics.java b/core/PGraphics.java index c7298a7fd..a9fa6a259 100644 --- a/core/PGraphics.java +++ b/core/PGraphics.java @@ -3537,4 +3537,11 @@ public class PGraphics extends PImage implements PConstants { throw new RuntimeException("recordRaw() not supported " + "by this renderer."); } + + public PGraphics recordRaw(String renderer, String filename) { + PGraphics rec = + PApplet.createGraphics(width, height, renderer, null, filename); + recordRaw(rec); + return rec; + } } diff --git a/core/todo.txt b/core/todo.txt index 97d6807c2..1cb921b7a 100644 --- a/core/todo.txt +++ b/core/todo.txt @@ -2,6 +2,29 @@ X user.dir wasn't getting set properly X when graphics can be resized, resize rather than creating new context +_ make dxf writer that'll work with recordRaw() +X enable PGraphicsPDF for inclusion +_ write documentation on images (they suck) and fonts (use ttf) + +_ when re-calling size() with opengl, need to remove the old canvas +_ need to check to see if this is working properly now + +_ straighten out save() and saveFrame() +_ use File object for when people know what they're doing? +_ same issue occurs with pdf and creating graphics obj + +_ loadImage("") produces weird error message +_ http://processing.org/discourse/yabb_beta/YaBB.cgi?board=Programs;action=display;num=1136487954 + +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + +_ PSound.play() won't play the sound a 2nd time (reopened) +_ http://dev.processing.org/bugs/show_bug.cgi?id=208 + +. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + +_ need to move off anim off the main event thread +_ move away from using display() X temporarily rolling back major thread changes X major threading change to use wait()/notifyAll() instead of interrupt/sleep _ noLoop() at end of setup is prolly b/c of interruptedex @@ -15,20 +38,6 @@ _ http://processing.org/discourse/yabb_beta/YaBB.cgi?board=SoftwareBugs;action _ http://dev.processing.org/bugs/show_bug.cgi?id=164 _ making 'run' synchronized caused a freeze on start w/ opengl -_ need to move off anim off the main event thread -_ move away from using display() - -_ loadImage("") produces weird error message -_ http://processing.org/discourse/yabb_beta/YaBB.cgi?board=Programs;action=display;num=1136487954 - -_ make dxf writer that'll work with recordRaw() -_ enable PGraphicsPDF for inclusion -_ write documentation on images (they suck) and fonts (use ttf) -_ when re-calling size() with opengl, need to remove the old canvas - -_ PSound.play() won't play the sound a 2nd time (reopened) -_ http://dev.processing.org/bugs/show_bug.cgi?id=208 - _ ArrayIndexOutOfBoundsException in PLine _ http://dev.processing.org/bugs/show_bug.cgi?id=246 diff --git a/pdf/PGraphicsPDF.java b/pdf/PGraphicsPDF.java index 7b0d96849..cdb40ad96 100644 --- a/pdf/PGraphicsPDF.java +++ b/pdf/PGraphicsPDF.java @@ -22,11 +22,11 @@ public class PGraphicsPDF extends PGraphics2 { // recording api.. allow multiple frames per file? // would be the case for video, or for pdf - static public String filename; + //static public String filename; File temp; int frameCount; - File file; // = new File("test.pdf"); + File file; Document document; PdfWriter writer; PdfContentByte content; @@ -36,9 +36,11 @@ public class PGraphicsPDF extends PGraphics2 { // BaseFont baseFont = mapper.awtToPdf(java.awt.Font awtFont) - public PGraphicsPDF(int width, int height, PApplet applet) { //File file) { + public PGraphicsPDF(int width, int height, PApplet applet, String path) { super(width, height, null); - //this.file = file; + + if (path == null) path = "output.pdf"; + this.file = new File(path); // don't want to require PApplet as the way to do this.. but how? //if (applet != null) {