aboutsummaryrefslogtreecommitdiffstats
path: root/src/classes/com/sun
diff options
context:
space:
mode:
authorKenneth Russel <[email protected]>2006-01-01 00:05:20 +0000
committerKenneth Russel <[email protected]>2006-01-01 00:05:20 +0000
commit0747964f0b88d0c9da9c38bf9eff96eb6561f0c1 (patch)
treeedae3208eb4f9692773f1fdf87dfb8f5d4a2c37c /src/classes/com/sun
parent5032e7686b7acd5db0d55920d6d8b8604661efa4 (diff)
Fixed Issue 186: Incorrect mipmap images with gluBuild2DMipmaps
Fixed bug in port of gluBuild2DMipmapLevelsCore from SGI's C code in the case where the unpack alignment was greater than the row width of the mipmap level. Changed debugging code to write Targa files. Added rewinds of buffers where they might be needed. git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/svn-server-sync/jogl/trunk@505 232f8b59-042b-4e1e-8c03-345bb8c30851
Diffstat (limited to 'src/classes/com/sun')
-rw-r--r--src/classes/com/sun/opengl/impl/mipmap/BuildMipmap.java77
1 files changed, 39 insertions, 38 deletions
diff --git a/src/classes/com/sun/opengl/impl/mipmap/BuildMipmap.java b/src/classes/com/sun/opengl/impl/mipmap/BuildMipmap.java
index 4a499420f..6451be351 100644
--- a/src/classes/com/sun/opengl/impl/mipmap/BuildMipmap.java
+++ b/src/classes/com/sun/opengl/impl/mipmap/BuildMipmap.java
@@ -187,6 +187,7 @@ public class BuildMipmap {
for( level = 0; level < levels; level++ ) {
if( newImage_width == newwidth[0] && newImage_height == newheight[0] ) {
+ newImage.rewind();
gl.glTexImage2D( target, level, internalFormat, newImage_width,
newImage_height, 0, format, GL.GL_UNSIGNED_SHORT, newImage );
} else {
@@ -212,6 +213,7 @@ public class BuildMipmap {
newImage_width = newwidth[0];
newImage_height = newheight[0];
+ newImage.rewind();
gl.glTexImage2D( target, level, internalFormat, newImage_width, newImage_height,
0, format, GL.GL_UNSIGNED_SHORT, newImage );
}
@@ -305,6 +307,7 @@ public class BuildMipmap {
if( width == newwidth && height == newheight ) {
// use usersImage for level userLevel
if( baseLevel <= level && level <= maxLevel ) {
+ data.rewind();
gl.glTexImage2D( target, level, internalFormat, width, height, 0, format, type, data );
}
if( levels == 0 ) { /* we're done. clean up and return */
@@ -658,24 +661,14 @@ public class BuildMipmap {
gl.glPixelStorei( GL.GL_UNPACK_SWAP_BYTES, GL.GL_FALSE );
if( baseLevel <= level && level <= maxLevel ) {
srcImage.rewind();
- if (DEBUG) {
- System.err.println("GL Error(" + level + "): " + gl.glGetError() );
- }
gl.glTexImage2D( target, level, internalFormat, newwidth, newheight, 0, format, type, srcImage );
if (DEBUG) {
System.err.println("GL Error(" + level + "): " + gl.glGetError() );
if (VERBOSE) {
- try {
- File file = new File( "glu2DMipmapJ" + level + ".bin" );
- FileOutputStream fos = new FileOutputStream( file );
- srcImage.limit( Mipmap.image_size( newwidth, newheight, format, type ) );
- fos.getChannel().write( srcImage );
- srcImage.clear();
- fos.close();
- } catch( IOException e ) {
- System.err.println("IOException");
- System.err.println(e.getMessage());
- }
+ srcImage.limit( Mipmap.image_size( newwidth, newheight, format, type ) );
+ writeTargaFile("glu2DMipmapJ" + level + ".tga",
+ srcImage, newwidth, newheight);
+ srcImage.clear();
}
}
}
@@ -773,16 +766,10 @@ public class BuildMipmap {
if (DEBUG) {
System.err.println("GL Error(" + level + "): " + gl.glGetError() );
if (VERBOSE) {
- try {
- File file = new File( "glu2DMipmapJ" + level + ".bin" );
- FileOutputStream fos = new FileOutputStream( file );
- srcImage.limit( Mipmap.image_size( newwidth, newheight, format, type ) );
- fos.getChannel().write( srcImage );
- srcImage.clear();
- } catch( IOException e ) {
- System.err.println("IOException");
- System.err.println(e.getMessage());
- }
+ srcImage.limit( Mipmap.image_size( newwidth, newheight, format, type ) );
+ writeTargaFile("glu2DMipmapJ" + level + ".tga",
+ srcImage, newwidth, newheight);
+ srcImage.clear();
}
}
}
@@ -808,12 +795,10 @@ public class BuildMipmap {
srcImage.rewind();
// copy image from srcImage into newMipmapImage by rows
for( ii = 0; ii < newheight; ii++ ) {
+ newMipmapImage.position(newRowLength * ii);
for( jj = 0; jj < rowsize; jj++ ) {
newMipmapImage.put( srcImage.get() );
}
- if( jj < rowsize - 1 ) {
- newMipmapImage.position( newMipmapImage.position() + rowPad );
- }
}
// and use this new image for mipmapping instead
@@ -821,18 +806,10 @@ public class BuildMipmap {
newMipmapImage.rewind();
gl.glTexImage2D( target, level, internalFormat, newwidth, newheight, 0, format, type, newMipmapImage );
if (DEBUG) {
- System.err.println("GL Error: " + gl.glGetError() );
+ System.err.println("GL Error(" + level + " padded): " + gl.glGetError() );
if (VERBOSE) {
- try {
- File file = new File( "glu2DMipmapJ" + level + ".bin" );
- FileOutputStream fos = new FileOutputStream( file );
- srcImage.limit( Mipmap.image_size( newwidth, newheight, format, type ) );
- fos.getChannel().write( newMipmapImage );
- srcImage.clear();
- } catch( IOException e ) {
- System.err.println("IOException");
- System.err.println(e.getMessage());
- }
+ writeTargaFile("glu2DMipmapJ" + level + ".tga",
+ newMipmapImage, newwidth, newheight);
}
}
}
@@ -927,6 +904,7 @@ public class BuildMipmap {
for( level = 0; level <= levels; level++ ) {
if( newImage_width == newwidth[0] && newImage_height == newheight[0] ) {
// use newImage for this level
+ newImage.rewind();
gl.glTexImage2D( target, level, components, newImage_width, newImage_height,
0, format, GL.GL_UNSIGNED_BYTE, newImage );
} else {
@@ -950,6 +928,7 @@ public class BuildMipmap {
newImage_width = newwidth[0];
newImage_height = newheight[0];
+ newImage.rewind();
gl.glTexImage2D( target, level, components, newImage_width, newImage_height,
0, format, GL.GL_UNSIGNED_BYTE, newImage );
}
@@ -1580,4 +1559,26 @@ public class BuildMipmap {
gl.glPixelStorei( GL.GL_UNPACK_IMAGE_HEIGHT, psm.getUnpackImageHeight() );
return( 0 );
}
+
+ private static final int TARGA_HEADER_SIZE = 18;
+ private static void writeTargaFile(String filename, ByteBuffer data,
+ int width, int height) {
+ try {
+ FileOutputStream fos = new FileOutputStream(new File(filename));
+ ByteBuffer header = ByteBuffer.allocate(TARGA_HEADER_SIZE);
+ header.put(0, (byte) 0).put(1, (byte) 0);
+ header.put(2, (byte) 2); // uncompressed type
+ header.put(12, (byte) (width & 0xFF)); // width
+ header.put(13, (byte) (width >> 8)); // width
+ header.put(14, (byte) (height & 0xFF)); // height
+ header.put(15, (byte) (height >> 8)); // height
+ header.put(16, (byte) 24); // pixel size
+ fos.getChannel().write(header);
+ fos.getChannel().write(data);
+ data.clear();
+ fos.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
}