Hello,
Browsing the source (trying to hack a per-surface GetPixel for Android) I saw this, and noticed that the final two "else" clauses can never be called:
if( hicolor_textures && hasAlpha ){
//RGBA8888...
ByteBuffer buf=ByteBuffer.allocate( sz*4 );
buf.order( ByteOrder.BIG_ENDIAN );
for( int i=0;i<sz;++i ){
int p=pixels[i];
int a=(p>>24) & 255;
int r=((p>>16) & 255)*a/255;
int g=((p>>8) & 255)*a/255;
int b=(p & 255)*a/255;
buf.putInt( (r<<24)|(g<<16)|(b<<8)|a );
}
GLES11.glTexImage2D( GLES11.GL_TEXTURE_2D,0,GLES11.GL_RGBA,texwidth,texheight,0,GLES11.GL_RGBA,GLES11.GL_UNSIGNED_BYTE,null );
GLES11.glTexSubImage2D( GLES11.GL_TEXTURE_2D,0,0,0,pwidth,pheight,GLES11.GL_RGBA,GLES11.GL_UNSIGNED_BYTE,buf );
}else if( hicolor_textures && !hasAlpha ){
//RGB888...
ByteBuffer buf=ByteBuffer.allocate( sz*3 );
buf.order( ByteOrder.BIG_ENDIAN );
for( int i=0;i<sz;++i ){
int p=pixels[i];
int r=(p>>16) & 255;
int g=(p>>8) & 255;
int b=p & 255;
buf.put( (byte)r );
buf.put( (byte)g );
buf.put( (byte)b );
}
GLES11.glTexImage2D( GLES11.GL_TEXTURE_2D,0,GLES11.GL_RGB,texwidth,texheight,0,GLES11.GL_RGB,GLES11.GL_UNSIGNED_BYTE,null );
GLES11.glTexSubImage2D( GLES11.GL_TEXTURE_2D,0,0,0,pwidth,pheight,GLES11.GL_RGB,GLES11.GL_UNSIGNED_BYTE,buf );
}else if( hicolor_textures && hasAlpha ){
//16 bit RGBA...
ByteBuffer buf=ByteBuffer.allocate( sz*2 );
buf.order( ByteOrder.LITTLE_ENDIAN );
//do we need 4 bit alpha?
boolean a4=false;
for( int i=0;i<sz;++i ){
int a=(pixels[i]>>28) & 15;
if( a!=0 && a!=15 ){
a4=true;
break;
}
}
if( a4 ){
//RGBA4444...
for( int i=0;i<sz;++i ){
int p=pixels[i];
int a=(p>>28) & 15;
int r=((p>>20) & 15)*a/15;
int g=((p>>12) & 15)*a/15;
int b=((p>> 4) & 15)*a/15;
buf.putShort( (short)( (r<<12)|(g<<8)|(b<<4)|a ) );
}
GLES11.glTexImage2D( GLES11.GL_TEXTURE_2D,0,GLES11.GL_RGBA,texwidth,texheight,0,GLES11.GL_RGBA,GLES11.GL_UNSIGNED_SHORT_4_4_4_4,null );
GLES11.glTexSubImage2D( GLES11.GL_TEXTURE_2D,0,0,0,pwidth,pheight,GLES11.GL_RGBA,GLES11.GL_UNSIGNED_SHORT_4_4_4_4,buf );
}else{
//RGBA5551...
for( int i=0;i<sz;++i ){
int p=pixels[i];
int a=(p>>31) & 1;
int r=((p>>19) & 31)*a;
int g=((p>>11) & 31)*a;
int b=((p>> 3) & 31)*a;
buf.putShort( (short)( (r<<11)|(g<<6)|(b<<1)|a ) );
}
GLES11.glTexImage2D( GLES11.GL_TEXTURE_2D,0,GLES11.GL_RGBA,texwidth,texheight,0,GLES11.GL_RGBA,GLES11.GL_UNSIGNED_SHORT_5_5_5_1,null );
GLES11.glTexSubImage2D( GLES11.GL_TEXTURE_2D,0,0,0,pwidth,pheight,GLES11.GL_RGBA,GLES11.GL_UNSIGNED_SHORT_5_5_5_1,buf );
}
}else if( hicolor_textures && !hasAlpha ){
ByteBuffer buf=ByteBuffer.allocate( sz*2 );
buf.order( ByteOrder.LITTLE_ENDIAN );
//RGB565...
for( int i=0;i<sz;++i ){
int p=pixels[i];
int r=(p>>19) & 31;
int g=(p>>10) & 63;
int b=(p>> 3) & 31;
buf.putShort( (short)( (r<<11)|(g<<5)|b ) );
}
GLES11.glTexImage2D( GLES11.GL_TEXTURE_2D,0,GLES11.GL_RGB,texwidth,texheight,0,GLES11.GL_RGB,GLES11.GL_UNSIGNED_SHORT_5_6_5,null );
GLES11.glTexSubImage2D( GLES11.GL_TEXTURE_2D,0,0,0,pwidth,pheight,GLES11.GL_RGB,GLES11.GL_UNSIGNED_SHORT_5_6_5,buf );
}
Mark, I assume those last two should be !hicolor_textures ?
This hasn't caused me a problem or anything, just thought you'd like to know as it seems like a mistake.
|