inching closer

This commit is contained in:
Ben Fry
2014-11-04 19:32:10 -05:00
parent c2d18e2ad1
commit d3daf8ae5d
4 changed files with 134 additions and 114 deletions

View File

@@ -25,8 +25,8 @@
package processing.core;
//import java.awt.*;
import java.awt.Color;
import java.awt.Image;
import java.util.HashMap;
import java.util.WeakHashMap;
@@ -501,12 +501,12 @@ public class PGraphics extends PImage implements PConstants {
// ........................................................
// /**
// * Java AWT Image object associated with this renderer. For the 1.0 version
// * of P2D and P3D, this was be associated with their MemoryImageSource.
// * For PGraphicsJava2D, it will be the offscreen drawing buffer.
// */
// public Image image;
/**
* Java AWT Image object associated with this renderer. For the 1.0 version
* of P2D and P3D, this was associated with their MemoryImageSource.
* For PGraphicsJava2D, it will be the offscreen drawing buffer.
*/
public Image image;
// ........................................................

View File

@@ -52,7 +52,7 @@ import processing.data.XML;
public class PGraphicsJava2D extends PGraphics {
BufferStrategy strategy;
BufferedImage bimage;
VolatileImage vimage;
// VolatileImage vimage;
Canvas canvas;
// boolean useCanvas = true;
boolean useCanvas = false;
@@ -60,13 +60,6 @@ public class PGraphicsJava2D extends PGraphics {
// boolean useOffscreen = true; // ~40fps
boolean useOffscreen = false;
/**
* Java AWT Image object associated with this renderer. For the 1.0 version
* of P2D and P3D, this was be associated with their MemoryImageSource.
* For PGraphicsJava2D, it will be the offscreen drawing buffer.
*/
public Image image; // moved from PGraphics, not sure about this yet
public Graphics2D g2;
protected BufferedImage offscreen;
@@ -255,8 +248,8 @@ public class PGraphicsJava2D extends PGraphics {
// and 2) minimal overhead, however. Instinct suggests #1 may be true,
// but #2 seems a problem.
if (primarySurface && !useOffscreen) {
GraphicsConfiguration gc = canvas.getGraphicsConfiguration();
if (false) {
GraphicsConfiguration gc = parent.getGraphicsConfiguration();
if (image == null || ((VolatileImage) image).validate(gc) == VolatileImage.IMAGE_INCOMPATIBLE) {
image = gc.createCompatibleVolatileImage(width, height);
g2 = (Graphics2D) image.getGraphics();
@@ -264,18 +257,12 @@ public class PGraphicsJava2D extends PGraphics {
}
} else {
if (image == null) {
GraphicsConfiguration gc = parent.getGraphicsConfiguration();
image = gc.createCompatibleImage(width, height);
PApplet.debug("created new image, type is " + image);
g2 = (Graphics2D) image.getGraphics();
reapplySettings = true;
}
}
//g2 = (Graphics2D) image.getGraphics();
// if (g2 != g2old) {
// System.out.println("new g2: " + g2);
// g2old = g2;
// }
}
if (useCanvas && primarySurface) {
@@ -291,10 +278,6 @@ public class PGraphicsJava2D extends PGraphics {
"/" + caps.getBackBufferCapabilities().isAccelerated());
}
GraphicsConfiguration gc = canvas.getGraphicsConfiguration();
// if (vimage == null || vimage.validate(gc) == VolatileImage.IMAGE_INCOMPATIBLE) {
// vimage = gc.createCompatibleVolatileImage(width, height);
// }
// g2 = (Graphics2D) vimage.getGraphics();
if (bimage == null ||
bimage.getWidth() != width ||
@@ -375,10 +358,10 @@ public class PGraphicsJava2D extends PGraphics {
PApplet.debug("PGraphicsJava2D.redraw() top of inner do { } block");
PApplet.debug("strategy is " + strategy);
Graphics bsg = strategy.getDrawGraphics();
if (vimage != null) {
bsg.drawImage(vimage, 0, 0, null);
} else {
bsg.drawImage(bimage, 0, 0, null);
// if (vimage != null) {
// bsg.drawImage(vimage, 0, 0, null);
// } else {
bsg.drawImage(bimage, 0, 0, null);
// if (parent.frameCount == 0) {
// try {
// ImageIO.write(image, "jpg", new java.io.File("/Users/fry/Desktop/buff.jpg"));
@@ -386,7 +369,7 @@ public class PGraphicsJava2D extends PGraphics {
// e.printStackTrace();
// }
// }
}
// }
bsg.dispose();
// the strategy version
@@ -1691,7 +1674,7 @@ public class PGraphicsJava2D extends PGraphics {
Font font = (Font) textFont.getNative();
if (font != null) {
FontMetrics metrics = Toolkit.getDefaultToolkit().getFontMetrics(font);
FontMetrics metrics = canvas.getFontMetrics(font);
return metrics.getAscent();
}
return super.textAscent();
@@ -1706,7 +1689,7 @@ public class PGraphicsJava2D extends PGraphics {
Font font = (Font) textFont.getNative();
//if (font != null && (textFont.isStream() || hints[ENABLE_NATIVE_FONTS])) {
if (font != null) {
FontMetrics metrics = parent.getFontMetrics(font);
FontMetrics metrics = canvas.getFontMetrics(font);
return metrics.getDescent();
}
return super.textDescent();

View File

@@ -1,3 +1,25 @@
/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
/*
Part of the Processing project - http://processing.org
Copyright (c) 2014 The Processing Foundation
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation, version 2.1.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General
Public License along with this library; if not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
Boston, MA 02111-1307 USA
*/
package processing.core;
import java.awt.Color;

View File

@@ -1,25 +1,32 @@
/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
/*
Part of the Processing project - http://processing.org
Copyright (c) 2014 The Processing Foundation
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation, version 2.1.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General
Public License along with this library; if not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
Boston, MA 02111-1307 USA
*/
package processing.core;
import java.applet.*;
import java.awt.*;
import java.awt.event.WindowStateListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.*;
import java.net.URL;
import java.util.ArrayList;
@@ -46,6 +53,7 @@ public class PSurfaceAWT implements PSurface {
Canvas canvas;
PApplet sketch;
PGraphics pg;
Thread thread;
boolean paused;
@@ -65,11 +73,14 @@ public class PSurfaceAWT implements PSurface {
useActive = false;
}
createCanvas();
addListeners();
}
void createCanvas() {
canvas = new SmoothCanvas();
//canvas.setIgnoreRepaint(true); // ??
}
@@ -124,6 +135,7 @@ public class PSurfaceAWT implements PSurface {
private Dimension oldSize = new Dimension(0, 0);
private Dimension newSize = new Dimension(0, 0);
@Override
public void validate() {
super.validate();
@@ -230,16 +242,16 @@ public class PSurfaceAWT implements PSurface {
protected synchronized void render() {
if (canvas == null) {
removeListeners(this);
canvas = new Canvas();
add(canvas);
setIgnoreRepaint(true);
canvas.setIgnoreRepaint(true);
addListeners(canvas);
// add(canvas, BorderLayout.CENTER);
// doLayout();
}
// if (canvas == null) {
// removeListeners(this);
// canvas = new Canvas();
// add(canvas);
// setIgnoreRepaint(true);
// canvas.setIgnoreRepaint(true);
// addListeners(canvas);
//// add(canvas, BorderLayout.CENTER);
//// doLayout();
// }
canvas.setBounds(0, 0, sketch.width, sketch.height);
// System.out.println("render(), canvas bounds are " + canvas.getBounds());
if (canvas.getBufferStrategy() == null) { // whole block [121222]
@@ -256,7 +268,7 @@ public class PSurfaceAWT implements PSurface {
// are consistent in case the underlying surface was recreated
do {
Graphics draw = strategy.getDrawGraphics();
draw.drawImage(g.image, 0, 0, sketch.width, sketch.height, null);
draw.drawImage(pg.image, 0, 0, sketch.width, sketch.height, null);
draw.dispose();
// Repeat the rendering if the drawing buffer contents
@@ -328,6 +340,8 @@ public class PSurfaceAWT implements PSurface {
public void blit() {
canvas.repaint();
/*
if (canvas.getGraphicsConfiguration() != null) {
GraphicsDevice device = canvas.getGraphicsConfiguration().getDevice();
if (device != displayDevice) {
@@ -348,6 +362,7 @@ public class PSurfaceAWT implements PSurface {
canvas.repaint();
}
// getToolkit().sync(); // force repaint now (proper method)
*/
}
@@ -469,7 +484,7 @@ public class PSurfaceAWT implements PSurface {
// been overridden by numbers we calculated above if fullScreen and/or
// spanScreens was in use.
//sketch.makePrimaryGraphics(sketchWidth, sketchHeight);
sketch.makePrimaryGraphics();
pg = sketch.makePrimaryGraphics();
if (fullScreen) {
frame.invalidate();
@@ -526,10 +541,10 @@ public class PSurfaceAWT implements PSurface {
(screenRect.height - sketch.height) / 2,
sketch.width, sketch.height);
if (PApplet.platform == PConstants.MACOSX) {
macosxFullScreenEnable(frame);
macosxFullScreenToggle(frame);
}
// if (PApplet.platform == PConstants.MACOSX) {
// macosxFullScreenEnable(frame);
// macosxFullScreenToggle(frame);
// }
if (stopColor != null) {
Label label = new Label("stop");
@@ -945,53 +960,52 @@ public class PSurfaceAWT implements PSurface {
}
}
frame.setIconImages(iconImages);
} catch (Exception e) {
//e.printStackTrace(); // more or less harmless; don't spew errors
}
} catch (Exception e) { } // harmless; keep this to ourselves
}
}
/**
* (No longer in use) Use reflection to call
* <code>com.apple.eawt.FullScreenUtilities.setWindowCanFullScreen(window, true);</code>
*/
static void macosxFullScreenEnable(Window window) {
try {
Class<?> util = Class.forName("com.apple.eawt.FullScreenUtilities");
Class params[] = new Class[] { Window.class, Boolean.TYPE };
Method method = util.getMethod("setWindowCanFullScreen", params);
method.invoke(util, window, true);
} catch (ClassNotFoundException cnfe) {
// ignored
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* (No longer in use) Use reflection to call
* <code>com.apple.eawt.Application.getApplication().requestToggleFullScreen(window);</code>
*/
static void macosxFullScreenToggle(Window window) {
try {
Class<?> appClass = Class.forName("com.apple.eawt.Application");
Method getAppMethod = appClass.getMethod("getApplication");
Object app = getAppMethod.invoke(null, new Object[0]);
Method requestMethod =
appClass.getMethod("requestToggleFullScreen", Window.class);
requestMethod.invoke(app, window);
} catch (ClassNotFoundException cnfe) {
// ignored
} catch (Exception e) {
e.printStackTrace();
}
}
// /**
// * (No longer in use) Use reflection to call
// * <code>com.apple.eawt.FullScreenUtilities.setWindowCanFullScreen(window, true);</code>
// */
// static void macosxFullScreenEnable(Window window) {
// try {
// Class<?> util = Class.forName("com.apple.eawt.FullScreenUtilities");
// Class params[] = new Class[] { Window.class, Boolean.TYPE };
// Method method = util.getMethod("setWindowCanFullScreen", params);
// method.invoke(util, window, true);
//
// } catch (ClassNotFoundException cnfe) {
// // ignored
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
//
//
// /**
// * (No longer in use) Use reflection to call
// * <code>com.apple.eawt.Application.getApplication().requestToggleFullScreen(window);</code>
// */
// static void macosxFullScreenToggle(Window window) {
// try {
// Class<?> appClass = Class.forName("com.apple.eawt.Application");
//
// Method getAppMethod = appClass.getMethod("getApplication");
// Object app = getAppMethod.invoke(null, new Object[0]);
//
// Method requestMethod =
// appClass.getMethod("requestToggleFullScreen", Window.class);
// requestMethod.invoke(app, window);
//
// } catch (ClassNotFoundException cnfe) {
// // ignored
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
//////////////////////////////////////////////////////////////
@@ -1147,8 +1161,8 @@ public class PSurfaceAWT implements PSurface {
}
public void addListeners() {
// lots of listeners, for all my men!
// listeners, for all my men!
protected void addListeners() {
canvas.addMouseListener(new MouseListener() {
@@ -1288,9 +1302,10 @@ public class PSurfaceAWT implements PSurface {
// Don't resize the renderer from the EDT (i.e. from a ComponentEvent),
// otherwise it may attempt a resize mid-render.
// if (g != null) {
Dimension currentSize = getSize();
if (currentSize.width != g.width || currentSize.height != g.height) {
resizeRenderer(currentSize.width, currentSize.height);
Dimension currentSize = canvas.getSize();
if (currentSize.width != pg.width || currentSize.height != pg.height) {
//resizeRenderer(currentSize.width, currentSize.height);
System.err.format("need to resize from %s to %d, %d", currentSize, pg.width, pg.height);
}
// }