|
From: <tre...@us...> - 2008-01-13 00:29:30
|
Revision: 682
http://ogoglio.svn.sourceforge.net/ogoglio/?rev=682&view=rev
Author: trevorolio
Date: 2008-01-12 16:29:30 -0800 (Sat, 12 Jan 2008)
Log Message:
-----------
Tried a new way of capturing profile images, which will hopefully work on XP and Linux in addition to OS X.
Modified Paths:
--------------
maven/trunk/ogoglio-body-editor-applet/src/main/java/com/ogoglio/bodyeditor/BodyEditorApplet.java
Modified: maven/trunk/ogoglio-body-editor-applet/src/main/java/com/ogoglio/bodyeditor/BodyEditorApplet.java
===================================================================
--- maven/trunk/ogoglio-body-editor-applet/src/main/java/com/ogoglio/bodyeditor/BodyEditorApplet.java 2008-01-13 00:28:53 UTC (rev 681)
+++ maven/trunk/ogoglio-body-editor-applet/src/main/java/com/ogoglio/bodyeditor/BodyEditorApplet.java 2008-01-13 00:29:30 UTC (rev 682)
@@ -17,14 +17,13 @@
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
-import java.awt.GraphicsConfiguration;
import java.awt.Panel;
+import java.awt.Rectangle;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
@@ -36,19 +35,16 @@
import javax.media.j3d.Background;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
-import javax.media.j3d.Canvas3D;
import javax.media.j3d.DirectionalLight;
-import javax.media.j3d.GraphicsContext3D;
import javax.media.j3d.ImageComponent;
import javax.media.j3d.ImageComponent2D;
-import javax.media.j3d.Raster;
+import javax.media.j3d.Screen3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.View;
import javax.swing.JLabel;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
-import javax.vecmath.Point3f;
import javax.vecmath.Vector3f;
import com.ogoglio.client.WebAPIAuthenticator;
@@ -74,9 +70,6 @@
import com.ogoglio.xml.AccountDocument;
import com.ogoglio.xml.BodyConfigurationDocument;
import com.ogoglio.xml.BodyDataDocument;
-import com.sun.image.codec.jpeg.JPEGCodec;
-import com.sun.image.codec.jpeg.JPEGEncodeParam;
-import com.sun.image.codec.jpeg.JPEGImageEncoder;
/*
* NOTE: String arrays don't function in LiveConnect in IE, so we use the getXXXCount and getXXX(index) pattern
@@ -212,8 +205,47 @@
if (user == null || bodyPanel == null || bodyPanel.renderable == null) {
return;
}
- bodyPanel.canvas.writeJPEG = true;
- bodyPanel.canvas.repaint();
+ new Thread(){
+ public void run(){
+ try {
+
+ // Obtain the size of the displayed canvas
+ Rectangle rect = bodyPanel.canvas.getBounds();
+
+ // Create a buffer for the Off Screen Canvas large enough to contain the displayed image
+ BufferedImage img = new BufferedImage(rect.width, rect.height, BufferedImage.TYPE_INT_RGB);
+ ImageComponent2D buf = new ImageComponent2D(ImageComponent.FORMAT_RGB, img);
+
+ // provide the buffer to the off-screen canvas
+ bodyPanel.offscreenCanvas.setOffScreenBuffer(buf);
+
+ // get the Screen3d associated with this canvas, and set the physical dimensions
+ Screen3D screen = bodyPanel.offscreenCanvas.getScreen3D();
+ Screen3D screenDisplay = bodyPanel.canvas.getScreen3D();
+
+ screen.setSize(screenDisplay.getSize());
+ screen.setPhysicalScreenWidth(screenDisplay.getPhysicalScreenWidth());
+ screen.setPhysicalScreenHeight(screenDisplay.getPhysicalScreenHeight());
+
+ // Request that the Off-Screen canvas is rendered
+ bodyPanel.offscreenCanvas.renderOffScreenBuffer();
+
+ // wait for the rendering to complete
+ bodyPanel.offscreenCanvas.waitForOffScreenRendering();
+
+ // obtain the image from the Off-Screen canvas
+ ImageComponent2D image = bodyPanel.offscreenCanvas.getOffScreenBuffer();
+ BufferedImage img2 = image.getImage();
+
+ ByteArrayOutputStream jpegBuffer = new ByteArrayOutputStream();
+ ImageIO.write(img2, "jpeg", jpegBuffer);
+ webClient.setAccountPhoto(webClient.getAuthenticator().getUsername(), new ByteArrayInputStream(jpegBuffer.toByteArray()), "image/jpeg");
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+
+ }
+ }.start();
}
public String getBodyConfigurationDocument() {
@@ -327,8 +359,10 @@
J3DCamera camera = null;
- CapturingCanvas3D canvas = null;
+ J3DCanvas canvas = null;
+ J3DCanvas offscreenCanvas = null;
+
BranchGroup sceneRoot = new BranchGroup();
BranchGroup worldBranch = new BranchGroup();
@@ -348,12 +382,15 @@
setLayout(new BorderLayout());
universe = new J3DUniverse();
- canvas = new CapturingCanvas3D(J3DRenderer.getGraphicsConfiguration(), false);
+ canvas = new J3DCanvas(J3DRenderer.getGraphicsConfiguration(), false);
canvas.addMouseWheelListener(this);
camera = new J3DCamera();
camera.setCanvas(canvas);
+ add(canvas, BorderLayout.CENTER);
- add(canvas, BorderLayout.CENTER);
+ offscreenCanvas = new J3DCanvas(J3DRenderer.getGraphicsConfiguration(), true);
+ camera.getView().addCanvas3D(offscreenCanvas);
+
setupUniverse();
}
@@ -483,35 +520,6 @@
//renderer.stopRenderer();
}
- private class CapturingCanvas3D extends J3DCanvas {
- boolean writeJPEG = false;
-
- public CapturingCanvas3D(GraphicsConfiguration graphicsConfiguration, boolean offscreen) {
- super(graphicsConfiguration, offscreen);
- }
-
- public void postSwap() {
- if (!writeJPEG) {
- super.postSwap();
- return;
- }
- try {
- GraphicsContext3D ctx = getGraphicsContext3D();
- Raster ras = new Raster(new Point3f(-1.0f, -1.0f, -1.0f), Raster.RASTER_COLOR, 0, 0, getWidth(), getHeight(), new ImageComponent2D(ImageComponent.FORMAT_RGB, new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB)), null);
- ctx.readRaster(ras);
- BufferedImage img = ras.getImage().getImage();
-
- ByteArrayOutputStream jpegBuffer = new ByteArrayOutputStream();
- ImageIO.write(img, "jpeg", jpegBuffer);
- webClient.setAccountPhoto(webClient.getAuthenticator().getUsername(), new ByteArrayInputStream(jpegBuffer.toByteArray()), "image/jpeg");
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- writeJPEG = false;
- }
- }
- }
-
private class TemplateProvider implements TemplateDataProvider {
public InputStream getTemplateGeometry(String username, long templateID, int lod) {
return null;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|