summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerard Ziemski <[email protected]>2003-11-19 18:47:55 +0000
committerGerard Ziemski <[email protected]>2003-11-19 18:47:55 +0000
commit0f343197b80999930287b8043c9197a685437116 (patch)
treea0689efc66f766056a894ae8c6a95dab2b920ed8
parentbbe6acb715a9d6486d6bd257d78b3d6f6e240fad (diff)
implemented GLJPanel for Mac OS X
git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/svn-server-sync/jogl/trunk@74 232f8b59-042b-4e1e-8c03-345bb8c30851
-rw-r--r--src/native/jogl/MacOSXWindowSystemInterface.m17
-rw-r--r--src/net/java/games/jogl/GLJPanel.java20
-rw-r--r--src/net/java/games/jogl/impl/GLContext.java11
-rw-r--r--src/net/java/games/jogl/impl/macosx/MacOSXGLContext.java24
-rw-r--r--src/net/java/games/jogl/impl/macosx/MacOSXOffscreenGLContext.java61
-rw-r--r--src/net/java/games/jogl/impl/macosx/MacOSXOnscreenGLContext.java4
-rw-r--r--src/net/java/games/jogl/impl/macosx/MacOSXPbufferGLContext.java55
-rw-r--r--src/net/java/games/jogl/impl/windows/WindowsGLContext.java12
-rw-r--r--src/net/java/games/jogl/impl/windows/WindowsOffscreenGLContext.java12
-rw-r--r--src/net/java/games/jogl/impl/x11/X11GLContext.java12
-rw-r--r--src/net/java/games/jogl/impl/x11/X11OffscreenGLContext.java12
11 files changed, 157 insertions, 83 deletions
diff --git a/src/native/jogl/MacOSXWindowSystemInterface.m b/src/native/jogl/MacOSXWindowSystemInterface.m
index f72170b69..a91b744ef 100644
--- a/src/native/jogl/MacOSXWindowSystemInterface.m
+++ b/src/native/jogl/MacOSXWindowSystemInterface.m
@@ -101,7 +101,7 @@ Bool deleteContext(void* context, void* view)
//fprintf(stderr, "deleteContext context=%p, view=%p\n", context, view);
NSOpenGLContext *nsContext = (NSOpenGLContext*)context;
- [nsContext setView: nil];
+ [nsContext clearDrawable];
[nsContext release];
return true;
}
@@ -187,12 +187,15 @@ void* createPBuffer(void* context, int width, int height)
Bool destroyPBuffer(void* context, void* buffer)
{
-//fprintf(stderr, "destroyPBuffer context=%p, buffer=%p\n", context, buffer);
+fprintf(stderr, "destroyPBuffer context=%p, buffer=%p\n", context, buffer);
#ifdef AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER)
NSOpenGLContext *nsContext = (NSOpenGLContext*)context;
NSOpenGLPixelBuffer *pBuffer = (NSOpenGLPixelBuffer*)buffer;
- [nsContext setPixelBuffer:NULL cubeMapFace:0 mipMapLevel:0 currentVirtualScreen:0];
+ if (nsContext != NULL)
+ {
+ [nsContext clearDrawable];
+ }
[pBuffer release];
return true;
@@ -209,6 +212,7 @@ int bindPBuffer(void* context, void* buffer)
NSOpenGLPixelBuffer *pBuffer = (NSOpenGLPixelBuffer*)buffer;
glPushMatrix();
+ glPushAttrib(GL_CURRENT_BIT|GL_ENABLE_BIT|GL_TEXTURE_BIT|GL_TRANSFORM_BIT);
GLuint pBufferTextureName;
glGenTextures(1, &pBufferTextureName);
@@ -224,12 +228,12 @@ int bindPBuffer(void* context, void* buffer)
glEnable([pBuffer textureTarget]);
#ifdef USE_GL_TEXTURE_RECTANGLE_EXT
- GLint matrixMode;
- glGetIntegerv(GL_MATRIX_MODE, &matrixMode);
+ //GLint matrixMode;
+ //glGetIntegerv(GL_MATRIX_MODE, &matrixMode);
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glScalef([pBuffer pixelsWide], [pBuffer pixelsHigh], 1.0f); // GL_TEXTURE_RECTANGLE_EXT wants texture coordinates in texture image space (not 0 to 1)
- glMatrixMode(matrixMode);
+ //glMatrixMode(matrixMode);
#endif
return pBufferTextureName;
@@ -247,6 +251,7 @@ void unbindPBuffer(void* context, void* buffer, int texture)
glDeleteTextures(1, &pBufferTextureName);
+ glPopAttrib();
glPopMatrix();
#endif
}
diff --git a/src/net/java/games/jogl/GLJPanel.java b/src/net/java/games/jogl/GLJPanel.java
index 07952eef3..b887d01c1 100644
--- a/src/net/java/games/jogl/GLJPanel.java
+++ b/src/net/java/games/jogl/GLJPanel.java
@@ -133,8 +133,8 @@ public final class GLJPanel extends JPanel implements GLDrawable {
getGL().glViewport(fx, fy, fwidth, fheight);
drawableHelper.reshape(GLJPanel.this, fx, fy, fwidth, fheight);
if (offscreenImage != null &&
- (offscreenImage.getWidth() != getWidth() ||
- offscreenImage.getHeight() != getHeight())) {
+ (offscreenImage.getWidth() != context.getOffscreenContextWidth() ||
+ offscreenImage.getHeight() != context.getOffscreenContextHeight())) {
offscreenImage.flush();
offscreenImage = null;
}
@@ -222,7 +222,7 @@ public final class GLJPanel extends JPanel implements GLDrawable {
// Must now copy pixels from offscreen context into surface
if (offscreenImage == null) {
int awtFormat = context.getOffscreenContextBufferedImageType();
- offscreenImage = new BufferedImage(getWidth(), getHeight(), awtFormat);
+ offscreenImage = new BufferedImage(context.getOffscreenContextWidth(), context.getOffscreenContextHeight(), awtFormat);
switch (awtFormat) {
case BufferedImage.TYPE_3BYTE_BGR:
glFormat = GL.GL_BGR;
@@ -240,7 +240,7 @@ public final class GLJPanel extends JPanel implements GLDrawable {
case BufferedImage.TYPE_INT_ARGB:
glFormat = GL.GL_BGRA;
- glType = GL.GL_UNSIGNED_BYTE;
+ glType = context.getOffscreenContextPixelDataType();
glComps = 4;
dbInt = (DataBufferInt) offscreenImage.getRaster().getDataBuffer();
break;
@@ -269,7 +269,7 @@ public final class GLJPanel extends JPanel implements GLDrawable {
// would require changing the generated bitmaps too.
gl.glPixelStorei(GL.GL_PACK_SWAP_BYTES, GL.GL_FALSE);
gl.glPixelStorei(GL.GL_PACK_LSB_FIRST, GL.GL_TRUE);
- gl.glPixelStorei(GL.GL_PACK_ROW_LENGTH, getWidth());
+ gl.glPixelStorei(GL.GL_PACK_ROW_LENGTH, offscreenImage.getWidth());
gl.glPixelStorei(GL.GL_PACK_SKIP_ROWS, 0);
gl.glPixelStorei(GL.GL_PACK_SKIP_PIXELS, 0);
gl.glPixelStorei(GL.GL_PACK_ALIGNMENT, 1);
@@ -277,9 +277,9 @@ public final class GLJPanel extends JPanel implements GLDrawable {
// Actually read the pixels.
gl.glReadBuffer(context.getOffscreenContextReadBuffer());
if (dbByte != null) {
- gl.glReadPixels(0, 0, getWidth(), getHeight(), glFormat, glType, dbByte.getData());
+ gl.glReadPixels(0, 0, offscreenImage.getWidth(), offscreenImage.getHeight(), glFormat, glType, dbByte.getData());
} else if (dbInt != null) {
- gl.glReadPixels(0, 0, getWidth(), getHeight(), glFormat, glType, dbInt.getData());
+ gl.glReadPixels(0, 0, offscreenImage.getWidth(), offscreenImage.getHeight(), glFormat, glType, dbInt.getData());
}
// Restore saved modes.
@@ -295,11 +295,11 @@ public final class GLJPanel extends JPanel implements GLDrawable {
if (context.offscreenImageNeedsVerticalFlip()) {
g.drawImage(offscreenImage,
- 0, 0, getWidth(), getHeight(),
- 0, getHeight(), getWidth(), 0,
+ 0, 0, offscreenImage.getWidth(), offscreenImage.getHeight(),
+ 0, offscreenImage.getHeight(), offscreenImage.getWidth(), 0,
GLJPanel.this);
} else {
- g.drawImage(offscreenImage, 0, 0, getWidth(), getHeight(), GLJPanel.this);
+ g.drawImage(offscreenImage, 0, 0, offscreenImage.getWidth(), offscreenImage.getHeight(), GLJPanel.this);
}
}
}
diff --git a/src/net/java/games/jogl/impl/GLContext.java b/src/net/java/games/jogl/impl/GLContext.java
index e0def092a..82672b1c3 100644
--- a/src/net/java/games/jogl/impl/GLContext.java
+++ b/src/net/java/games/jogl/impl/GLContext.java
@@ -464,12 +464,21 @@ public abstract class GLContext {
which to read pixels (GL.GL_FRONT or GL.GL_BACK). */
public abstract int getOffscreenContextReadBuffer();
+ /** Only called for offscreen contexts; needed by glReadPixels */
+ public abstract int getOffscreenContextWidth();
+
+ /** Only called for offscreen contexts; needed by glReadPixels */
+ public abstract int getOffscreenContextHeight();
+
+ /** Only called for offscreen contexts; needed by glReadPixels */
+ public abstract int getOffscreenContextPixelDataType();
+
/** On some platforms the mismatch between OpenGL's coordinate
system (origin at bottom left) and the window system's
coordinate system (origin at top left) necessitates a vertical
flip of pixels read from offscreen contexts. */
public abstract boolean offscreenImageNeedsVerticalFlip();
-
+
/** Attempts to make the GL context current. If necessary, creates a
context and calls the initAction once the context is current.
Most error conditions cause an exception to be thrown, except
diff --git a/src/net/java/games/jogl/impl/macosx/MacOSXGLContext.java b/src/net/java/games/jogl/impl/macosx/MacOSXGLContext.java
index e1618a15a..d636eaa6f 100644
--- a/src/net/java/games/jogl/impl/macosx/MacOSXGLContext.java
+++ b/src/net/java/games/jogl/impl/macosx/MacOSXGLContext.java
@@ -85,11 +85,29 @@ public abstract class MacOSXGLContext extends GLContext
protected abstract boolean isOffscreen();
- public abstract int getOffscreenContextBufferedImageType();
+ public int getOffscreenContextBufferedImageType() {
+ throw new GLException("Should not call this");
+ }
- public abstract int getOffscreenContextReadBuffer();
+ public int getOffscreenContextReadBuffer() {
+ throw new GLException("Should not call this");
+ }
- public abstract boolean offscreenImageNeedsVerticalFlip();
+ public int getOffscreenContextWidth() {
+ throw new GLException("Should not call this");
+ }
+
+ public int getOffscreenContextHeight() {
+ throw new GLException("Should not call this");
+ }
+
+ public int getOffscreenContextPixelDataType() {
+ throw new GLException("Should not call this");
+ }
+
+ public boolean offscreenImageNeedsVerticalFlip() {
+ throw new GLException("Should not call this");
+ }
/**
* Creates and initializes an appropriate OpenGl nsContext. Should only be
diff --git a/src/net/java/games/jogl/impl/macosx/MacOSXOffscreenGLContext.java b/src/net/java/games/jogl/impl/macosx/MacOSXOffscreenGLContext.java
index 431710a7c..1bbb32eda 100644
--- a/src/net/java/games/jogl/impl/macosx/MacOSXOffscreenGLContext.java
+++ b/src/net/java/games/jogl/impl/macosx/MacOSXOffscreenGLContext.java
@@ -43,48 +43,42 @@ import java.awt.image.BufferedImage;
import net.java.games.jogl.*;
import net.java.games.jogl.impl.*;
-public class MacOSXOffscreenGLContext extends MacOSXGLContext
-{
- // Width and height of the underlying bitmap
- private int width;
- private int height;
-
+public class MacOSXOffscreenGLContext extends MacOSXPbufferGLContext
+{
public MacOSXOffscreenGLContext(GLCapabilities capabilities,
GLCapabilitiesChooser chooser,
GLContext shareWith) {
- super(null, capabilities, chooser, shareWith);
- }
-
- protected GL createGL() {
- return new MacOSXGLImpl(this);
+ super(capabilities, -1, -1);
}
protected boolean isOffscreen() {
return true;
}
+ public boolean offscreenImageNeedsVerticalFlip() {
+ return true;
+ }
+
public int getOffscreenContextBufferedImageType() {
return BufferedImage.TYPE_INT_ARGB;
}
- public int getOffscreenContextReadBuffer() {
- return GL.GL_FRONT;
+ public int getOffscreenContextWidth() {
+ return initWidth;
}
-
- public boolean offscreenImageNeedsVerticalFlip() {
- // We can take care of this in the DIB creation (see below)
- return false;
+
+ public int getOffscreenContextHeight() {
+ return initWidth;
}
-
- public boolean canCreatePbufferContext() {
- // For now say no
- return false;
+
+ public int getOffscreenContextPixelDataType() {
+ return GL.GL_UNSIGNED_INT_8_8_8_8_REV;
}
-
- public synchronized GLContext createPbufferContext(GLCapabilities capabilities, int initialWidth, int initialHeight) {
- throw new GLException("Not supported");
+
+ public int getOffscreenContextReadBuffer() {
+ return GL.GL_BACK;
}
-
+
public void bindPbufferToTexture() {
throw new GLException("Should not call this");
}
@@ -94,13 +88,12 @@ public class MacOSXOffscreenGLContext extends MacOSXGLContext
}
protected synchronized boolean makeCurrent(Runnable initAction) throws GLException {
- if (pendingOffscreenResize) {
+ if (pendingOffscreenResize && (nsContext != 0)) {
if (pendingOffscreenWidth != width || pendingOffscreenHeight != height) {
- if (nsContext != 0) {
- destroy();
- }
- width = pendingOffscreenWidth;
- height = pendingOffscreenHeight;
+ destroyPBuffer();
+ initWidth = pendingOffscreenWidth;
+ initHeight = pendingOffscreenHeight;
+ createPbuffer(0, 0);
pendingOffscreenResize = false;
}
}
@@ -108,9 +101,5 @@ public class MacOSXOffscreenGLContext extends MacOSXGLContext
}
protected synchronized void swapBuffers() throws GLException {
- }
-
- private void destroy() {
- free();
- }
+ }
}
diff --git a/src/net/java/games/jogl/impl/macosx/MacOSXOnscreenGLContext.java b/src/net/java/games/jogl/impl/macosx/MacOSXOnscreenGLContext.java
index 97020de28..27b8a67f7 100644
--- a/src/net/java/games/jogl/impl/macosx/MacOSXOnscreenGLContext.java
+++ b/src/net/java/games/jogl/impl/macosx/MacOSXOnscreenGLContext.java
@@ -80,10 +80,6 @@ public class MacOSXOnscreenGLContext extends MacOSXGLContext {
}
}
- protected GL createGL() {
- return new MacOSXGLImpl(this);
- }
-
protected boolean isOffscreen() {
return false;
}
diff --git a/src/net/java/games/jogl/impl/macosx/MacOSXPbufferGLContext.java b/src/net/java/games/jogl/impl/macosx/MacOSXPbufferGLContext.java
index 70068ce63..5e2662b47 100644
--- a/src/net/java/games/jogl/impl/macosx/MacOSXPbufferGLContext.java
+++ b/src/net/java/games/jogl/impl/macosx/MacOSXPbufferGLContext.java
@@ -4,16 +4,20 @@ import net.java.games.jogl.*;
import net.java.games.jogl.impl.*;
public class MacOSXPbufferGLContext extends MacOSXGLContext {
+
private static final boolean DEBUG = false;
+
+ // see MacOSXWindowSystemInterface.m createPBuffer
+ private static final boolean USE_GL_TEXTURE_RECTANGLE_EXT = true;
- private int initWidth;
- private int initHeight;
+ protected int initWidth;
+ protected int initHeight;
private long pBuffer;
private int pBufferTextureName;
- private int width;
- private int height;
+ protected int width;
+ protected int height;
// FIXME: kept around because we create the OpenGL context lazily to
// better integrate with the MacOSXGLContext framework
@@ -23,10 +27,6 @@ public class MacOSXPbufferGLContext extends MacOSXGLContext {
super(null, capabilities, null, null);
this.initWidth = initialWidth;
this.initHeight = initialHeight;
- if (initWidth <= 0 || initHeight <= 0) {
- throw new GLException("Initial width and height of pbuffer must be positive (were (" +
- initWidth + ", " + initHeight + "))");
- }
}
public boolean canCreatePbufferContext() {
@@ -61,14 +61,35 @@ public class MacOSXPbufferGLContext extends MacOSXGLContext {
nsContextOfParent = parentContext;
- width = getNextPowerOf2(initWidth);
- height = getNextPowerOf2(initHeight);
-
+ if (USE_GL_TEXTURE_RECTANGLE_EXT)
+ {
+ // GL_TEXTURE_RECTANGLE_EXT
+ width = initWidth;
+ height = initHeight;
+ }
+ else
+ {
+ // GL_TEXTURE_2D
+ width = getNextPowerOf2(initWidth);
+ height = getNextPowerOf2(initHeight);
+ }
+
if (DEBUG) {
System.err.println("Created pbuffer " + width + " x " + height);
}
}
+ public void destroyPBuffer() {
+ if (this.pBuffer != 0) {
+ CGL.destroyPBuffer(nsContext, pBuffer);
+ }
+ this.pBuffer = 0;
+
+ if (DEBUG) {
+ System.err.println("Destroyed pbuffer " + width + " x " + height);
+ }
+ }
+
public void handleModeSwitch(long parentView, long parentContext) {
throw new GLException("Not yet implemented");
}
@@ -79,18 +100,6 @@ public class MacOSXPbufferGLContext extends MacOSXGLContext {
return false;
}
- public int getOffscreenContextBufferedImageType() {
- throw new GLException("Should not call this");
- }
-
- public int getOffscreenContextReadBuffer() {
- throw new GLException("Should not call this");
- }
-
- public boolean offscreenImageNeedsVerticalFlip() {
- throw new GLException("Should not call this");
- }
-
protected void swapBuffers() throws GLException {
// FIXME: do we need to do anything if the pbuffer is double-buffered?
}
diff --git a/src/net/java/games/jogl/impl/windows/WindowsGLContext.java b/src/net/java/games/jogl/impl/windows/WindowsGLContext.java
index 9232cf37a..ff61bbd52 100644
--- a/src/net/java/games/jogl/impl/windows/WindowsGLContext.java
+++ b/src/net/java/games/jogl/impl/windows/WindowsGLContext.java
@@ -101,6 +101,18 @@ public abstract class WindowsGLContext extends GLContext {
public abstract int getOffscreenContextBufferedImageType();
+ public int getOffscreenContextWidth() {
+ throw new GLException("Should not call this");
+ }
+
+ public int getOffscreenContextHeight() {
+ throw new GLException("Should not call this");
+ }
+
+ public int getOffscreenContextPixelDataType() {
+ throw new GLException("Should not call this");
+ }
+
public abstract int getOffscreenContextReadBuffer();
public abstract boolean offscreenImageNeedsVerticalFlip();
diff --git a/src/net/java/games/jogl/impl/windows/WindowsOffscreenGLContext.java b/src/net/java/games/jogl/impl/windows/WindowsOffscreenGLContext.java
index 8c2e72a7d..6185ae9fd 100644
--- a/src/net/java/games/jogl/impl/windows/WindowsOffscreenGLContext.java
+++ b/src/net/java/games/jogl/impl/windows/WindowsOffscreenGLContext.java
@@ -73,6 +73,18 @@ public class WindowsOffscreenGLContext extends WindowsGLContext {
}
}
+ public int getOffscreenContextWidth() {
+ return width;
+ }
+
+ public int getOffscreenContextHeight() {
+ return height;
+ }
+
+ public int getOffscreenContextPixelDataType() {
+ return GL.GL_UNSIGNED_BYTE;
+ }
+
public int getOffscreenContextReadBuffer() {
// On Windows these contexts are always single-buffered
return GL.GL_FRONT;
diff --git a/src/net/java/games/jogl/impl/x11/X11GLContext.java b/src/net/java/games/jogl/impl/x11/X11GLContext.java
index 3fb142bff..39bae6f62 100644
--- a/src/net/java/games/jogl/impl/x11/X11GLContext.java
+++ b/src/net/java/games/jogl/impl/x11/X11GLContext.java
@@ -93,6 +93,18 @@ public abstract class X11GLContext extends GLContext {
public abstract int getOffscreenContextBufferedImageType();
+ public int getOffscreenContextWidth() {
+ throw new GLException("Should not call this");
+ }
+
+ public int getOffscreenContextHeight() {
+ throw new GLException("Should not call this");
+ }
+
+ public int getOffscreenContextPixelDataType() {
+ throw new GLException("Should not call this");
+ }
+
public abstract int getOffscreenContextReadBuffer();
public abstract boolean offscreenImageNeedsVerticalFlip();
diff --git a/src/net/java/games/jogl/impl/x11/X11OffscreenGLContext.java b/src/net/java/games/jogl/impl/x11/X11OffscreenGLContext.java
index 6d4557407..10ffdc854 100644
--- a/src/net/java/games/jogl/impl/x11/X11OffscreenGLContext.java
+++ b/src/net/java/games/jogl/impl/x11/X11OffscreenGLContext.java
@@ -76,6 +76,18 @@ public class X11OffscreenGLContext extends X11GLContext {
}
}
+ public int getOffscreenContextWidth() {
+ return width;
+ }
+
+ public int getOffscreenContextHeight() {
+ return height;
+ }
+
+ public int getOffscreenContextPixelDataType() {
+ return GL.GL_UNSIGNED_BYTE;
+ }
+
public int getOffscreenContextReadBuffer() {
if (isDoubleBuffered) {
return GL.GL_BACK;