aboutsummaryrefslogtreecommitdiffstats
path: root/gl4java/utils/textures/TextureGrabber.java
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2000-11-18 06:43:49 +0000
committerSven Gothel <[email protected]>2000-11-18 06:43:49 +0000
commit880653d31a8f1ff8384fdbc75b84934bceecfdb8 (patch)
treebdafb71416f176d2a4b73bf716c9dc3f13685a8b /gl4java/utils/textures/TextureGrabber.java
Initial revision
Diffstat (limited to 'gl4java/utils/textures/TextureGrabber.java')
-rw-r--r--gl4java/utils/textures/TextureGrabber.java116
1 files changed, 116 insertions, 0 deletions
diff --git a/gl4java/utils/textures/TextureGrabber.java b/gl4java/utils/textures/TextureGrabber.java
new file mode 100644
index 0000000..d7d3bff
--- /dev/null
+++ b/gl4java/utils/textures/TextureGrabber.java
@@ -0,0 +1,116 @@
+package gl4java.utils.textures;
+
+import gl4java.*;
+
+import java.io.*;
+import java.net.*;
+
+/**
+ * This abstract Class defines the interface
+ * for ALL texture Grabbers !
+ * The TextureGrabber's implementations are used to
+ * save the pixels of the GL Context to a file !
+ *
+ * @see TextureTool
+ * @see GLImageCanvas
+ */
+public abstract class TextureGrabber
+implements GLEnum, GLUEnum
+{
+ protected byte[] pixels=null;
+ protected int xpos;
+ protected int ypos;
+ protected int width;
+ protected int height;
+ protected GLFunc gl;
+
+ public TextureGrabber(GLFunc gl)
+ {
+ this.gl=gl;
+ }
+
+ /**
+ * Grab the pixels outta the OpenGL Frambuffer
+ *
+ * @param source the frambuffer source (like glReadBuffer),
+ * can be: GL_FRONT, GL_BACK, ....
+ * @param x the xpos
+ * @param y the ypos
+ * @param w the width
+ * @param h the height
+ *
+ * @see GLFunc#glReadBuffer
+ */
+ public void grabPixels(int source, int x, int y, int w, int h)
+ {
+ int swapbytes[]={0}, lsbfirst[]={0}, rowlength[]={0};
+ int skiprows[]={0}, skippixels[]={0}, alignment[]={0};
+
+ xpos=x;
+ ypos=y;
+ width=w;
+ height=h;
+ pixels=new byte[w * h * 3];
+
+ /* Save current modes. */
+ gl.glGetIntegerv(GL_PACK_SWAP_BYTES, swapbytes);
+ gl.glGetIntegerv(GL_PACK_LSB_FIRST, lsbfirst);
+ gl.glGetIntegerv(GL_PACK_ROW_LENGTH, rowlength);
+ gl.glGetIntegerv(GL_PACK_SKIP_ROWS, skiprows);
+ gl.glGetIntegerv(GL_PACK_SKIP_PIXELS, skippixels);
+ gl.glGetIntegerv(GL_PACK_ALIGNMENT, alignment);
+
+ /* Little endian machines (DEC Alpha, Intel 80x86, ... for example) could
+ benefit from setting GL_PACK_LSB_FIRST to GL_TRUE
+ instead of GL_FALSE, but this would require changing the
+ generated bitmaps too. */
+ gl.glPixelStorei(GL_PACK_SWAP_BYTES, 0);
+ gl.glPixelStorei(GL_PACK_LSB_FIRST, 1);
+ gl.glPixelStorei(GL_PACK_ROW_LENGTH, w);
+ gl.glPixelStorei(GL_PACK_SKIP_ROWS, 0);
+ gl.glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
+ gl.glPixelStorei(GL_PACK_ALIGNMENT, 1);
+
+ //get viewport data
+ gl.glReadBuffer(source);
+ gl.glReadPixels(x, y, w, h, GL_RGB, GL_UNSIGNED_BYTE, pixels);
+
+ gl.glPixelStorei(GL_PACK_SWAP_BYTES, swapbytes[0]);
+ gl.glPixelStorei(GL_PACK_LSB_FIRST, lsbfirst[0]);
+ gl.glPixelStorei(GL_PACK_ROW_LENGTH, rowlength[0]);
+ gl.glPixelStorei(GL_PACK_SKIP_ROWS, skiprows[0]);
+ gl.glPixelStorei(GL_PACK_SKIP_PIXELS, skippixels[0]);
+ gl.glPixelStorei(GL_PACK_ALIGNMENT, alignment[0]);
+
+ }
+
+ public boolean write2File(String fname)
+ {
+ try {
+ OutputStream os= new java.io.FileOutputStream(fname);
+ return write2File(os);
+ } catch (Exception ex) {
+ System.out.println("TGATextureGrabber.write2File <"+
+ fname+"> failed !\n"+ex);
+ }
+ return false;
+ }
+
+ public boolean write2File(URL base, String uri)
+ {
+ try {
+ URL url = new URL (base, uri);
+ URLConnection urlcon = url.openConnection();
+ urlcon.setDoOutput(true);
+ OutputStream os = urlcon.getOutputStream();
+ return write2File(os);
+ } catch (Exception ex) {
+ System.out.println("TGATextureGrabber.write2File <"+
+ base+" / "+uri+"> failed !\n"+ex);
+ }
+ return false;
+ }
+
+ public abstract boolean write2File(OutputStream os);
+}
+