diff options
author | Sven Gothel <[email protected]> | 2000-11-18 06:43:49 +0000 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2000-11-18 06:43:49 +0000 |
commit | 880653d31a8f1ff8384fdbc75b84934bceecfdb8 (patch) | |
tree | bdafb71416f176d2a4b73bf716c9dc3f13685a8b /gl4java/utils/textures/TextureGrabber.java |
Initial revision
Diffstat (limited to 'gl4java/utils/textures/TextureGrabber.java')
-rw-r--r-- | gl4java/utils/textures/TextureGrabber.java | 116 |
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); +} + |