2003/10/16 05:39:20
[org.ibex.core.git] / src / org / xwt / plat / OpenGL.cc
index 71870c7..5540c2d 100644 (file)
@@ -126,20 +126,26 @@ void OpenGL$GLPixelBuffer::resetClip() {
     }    
 }
 
-void OpenGL$RectGLPicture::natInit(JArray<jint> *data_) {
+// FEATURE: Eliminate duplicate code in RectGLPicture and SquareGLPicture
+void OpenGL$RectGLPicture::natInit(Object *data_, jboolean alphaOnly) {
     unsigned char *buf;
     int i,j;
     int size = width*height;
-    jint *data = elements(data_);
-    buf = new unsigned char[size*4];
     GLuint tex;
 
-    for(i=0,j=0;i<size;i++,j+=4) {
-        jint pixel = data[i];
-        buf[j+0] = (pixel >> 16) & 0xff;
-        buf[j+1] = (pixel >>  8) & 0xff;
-        buf[j+2] = (pixel >>  0) & 0xff;
-        buf[j+3] = (pixel >> 24) & 0xff;
+    if(alphaOnly) {
+        jbyte *data = elements((JArray<jbyte> *)data_);
+        buf = (unsigned char *) data;
+    } else {
+        jint *data = elements((JArray<jint> *)data_);
+        buf = new unsigned char[size*4];
+        for(i=0,j=0;i<size;i++,j+=4) {
+            jint pixel = data[i];
+            buf[j+0] = (pixel >> 16) & 0xff;
+            buf[j+1] = (pixel >>  8) & 0xff;
+            buf[j+2] = (pixel >>  0) & 0xff;
+            buf[j+3] = (pixel >> 24) & 0xff;
+        }
     }
     
     gl->activateSharedContext();
@@ -147,18 +153,23 @@ void OpenGL$RectGLPicture::natInit(JArray<jint> *data_) {
     glGenTextures(1,&tex);
     glBindTexture(GL_TEXTURE_RECTANGLE_EXT,tex);
     glPixelStorei(GL_PACK_ALIGNMENT,1);
-    glTexImage2D(GL_TEXTURE_RECTANGLE_EXT,0,4,width,height,0,GL_RGBA,GL_UNSIGNED_BYTE,buf);
-    delete buf;
+    glTexImage2D(
+        GL_TEXTURE_RECTANGLE_EXT,0,
+        alphaOnly ? GL_ALPHA : GL_RGBA,width,height,0,
+        alphaOnly ? GL_ALPHA : GL_RGBA,GL_UNSIGNED_BYTE,buf);
+    if(!alphaOnly)
+        delete buf;
 
-    // FIXME: enable linear filtering for opengl 1.2
-    glTexParameteri(GL_TEXTURE_RECTANGLE_EXT,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
-    glTexParameteri(GL_TEXTURE_RECTANGLE_EXT,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
+    if(gl->glVersion >= 1.2) {
+        glTexParameteri(GL_TEXTURE_RECTANGLE_EXT,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+        glTexParameteri(GL_TEXTURE_RECTANGLE_EXT,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+        glTexParameterf(GL_TEXTURE_RECTANGLE_EXT,GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+        glTexParameterf(GL_TEXTURE_RECTANGLE_EXT,GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+    } else {
+        glTexParameteri(GL_TEXTURE_RECTANGLE_EXT,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
+        glTexParameteri(GL_TEXTURE_RECTANGLE_EXT,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
+    }
     
-    /*glTexParameteri(GL_TEXTURE_RECTANGLE_EXT,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
-    glTexParameteri(GL_TEXTURE_RECTANGLE_EXT,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
-    glTexParameterf(GL_TEXTURE_RECTANGLE_EXT,GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-    glTexParameterf(GL_TEXTURE_RECTANGLE_EXT,GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);*/
-
     glDisable(GL_TEXTURE_RECTANGLE_EXT);
     checkGLError();
   
@@ -166,8 +177,6 @@ void OpenGL$RectGLPicture::natInit(JArray<jint> *data_) {
 }
 
 void OpenGL$RectGLPicture::draw(jint dx1, jint dy1, jint dx2, jint dy2,jint sx1, jint sy1, jint sx2, jint sy2) { 
-    if (gl->hasRectangularTextures()) {
-       glColor4f(1.0f,1.0f,1.0f,1.0f);
        glEnable(GL_TEXTURE_RECTANGLE_EXT);
        glBindTexture(GL_TEXTURE_RECTANGLE_EXT, textureName);    
        glBegin(GL_QUADS); 
@@ -182,30 +191,6 @@ void OpenGL$RectGLPicture::draw(jint dx1, jint dy1, jint dx2, jint dy2,jint sx1,
        glEnd();
        glDisable(GL_TEXTURE_RECTANGLE_EXT);
        checkGLError();
-    } else {
-        float tx1,ty1,tx2,ty2; // normalized texture coords
-        tx1 = (float) sx1 / (float) width;
-        ty1 = (float) sy1 / (float) height;
-        tx2 = (float) sx2 / (float) width;
-        ty2 = (float) sy2 / (float) height;
-
-        glColor4f(1.0f,1.0f,1.0f,1.0f);
-        glEnable(GL_TEXTURE_2D);
-        glBindTexture(GL_TEXTURE_2D, textureName);    
-        checkGLError();
-        glBegin(GL_QUADS); 
-            glTexCoord2f (tx1, ty1   );
-            glVertex3i   (dx1, dy1, 0);
-            glTexCoord2f (tx2, ty1   ); 
-            glVertex3i   (dx2, dy1, 0);
-            glTexCoord2f (tx2, ty2   ); 
-            glVertex3i   (dx2, dy2, 0);
-            glTexCoord2f (tx1, ty2   );
-            glVertex3i   (dx1, dy2, 0);
-        glEnd();
-        glDisable(GL_TEXTURE_2D);
-        checkGLError();
-    }
 }
 
 void OpenGL::natDeleteTexture(jint tex_) {
@@ -214,45 +199,67 @@ void OpenGL::natDeleteTexture(jint tex_) {
     glDeleteTextures(1,&tex);
 }
 
-void OpenGL$SquareGLPicture::natInit(JArray<jint> *data_) {
+void OpenGL$SquareGLPicture::natInit(Object *data_, jboolean alphaOnly) {
     unsigned char *buf;
     int row,col,p;
-    jint *data = elements(data_);
-    buf = new unsigned char[texWidth*texHeight*4];
     GLuint tex;
 
-    p=0;
-    for(row=0;row<height;row++) {
-        for(col=0;col<width;col++) {
-            jint pixel = data[row*width+col];
-            buf[p+0] = (pixel >> 16) & 0xff;
-            buf[p+1] = (pixel >>  8) & 0xff;
-            buf[p+2] = (pixel >>  0) & 0xff;
-            buf[p+3] = (pixel >> 24) & 0xff;
-            p+=4;
+    if(alphaOnly) {
+        jbyte *data = elements((JArray<jbyte>*) data_);
+        if(texWidth == width && texHeight == height) {
+            buf = (unsigned char*) data;
+        } else {
+            buf = new unsigned char[texWidth*texHeight];
+            p=0;
+            for(row=0;row<height;row++) {
+                for(col=0;col<width;col++)
+                    buf[p++] = data[row*width+col];
+                for(;col<texWidth;col++)
+                    buf[p++] = 0;
+            }
+            for(;row<texHeight;row++)
+                for(col=0;col<texWidth;col++)
+                    buf[p++] = 0;
+        }
+    } else {
+        jint *data = elements((JArray<jint>*) data_);
+        buf = new unsigned char[texWidth*texHeight*4];
+        p=0;
+        for(row=0;row<height;row++) {
+            for(col=0;col<width;col++) {
+                jint pixel = data[row*width+col];
+                buf[p+0] = (pixel >> 16) & 0xff;
+                buf[p+1] = (pixel >>  8) & 0xff;
+                buf[p+2] = (pixel >>  0) & 0xff;
+                buf[p+3] = (pixel >> 24) & 0xff;
+                p+=4;
+            }
+            for(;col < texWidth;col++,p+=4)
+                buf[p+0] = buf[p+1] = buf[p+2] = buf[p+3] = 0;
         }
-        for(;col < texWidth;col++,p+=4)
-            buf[p+0] = buf[p+1] = buf[p+2] = buf[p+3] = 0;
+        for(;row < texHeight;row++) 
+            for(col=0;col<texWidth;col++,p+=4)
+                buf[p+0] = buf[p+1] = buf[p+2] = buf[p+3] = 0;
     }
-    for(;row < texHeight;row++) 
-        for(col=0;col<texWidth;col++,p+=4)
-            buf[p+0] = buf[p+1] = buf[p+2] = buf[p+3] = 0;
     
     gl->activateSharedContext();
     glEnable(GL_TEXTURE_2D);
     glGenTextures(1,&tex);
     glBindTexture(GL_TEXTURE_2D,tex);
     glPixelStorei(GL_PACK_ALIGNMENT,1);
-    glTexImage2D(GL_TEXTURE_2D,0,4,texWidth,texHeight,0,GL_RGBA,GL_UNSIGNED_BYTE,buf);
+    glTexImage2D(GL_TEXTURE_2D,0,alphaOnly ? GL_ALPHA : GL_RGBA,texWidth,texHeight,0,alphaOnly ? GL_ALPHA : GL_RGBA,GL_UNSIGNED_BYTE,buf);
     checkGLError();    
-    delete buf;
+    if(!alphaOnly || width != texWidth || height != texHeight) delete buf;
 
-    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
-    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
-    /*glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
-    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
-    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-    glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);*/
+    if(gl->glVersion >= 1.2) {
+        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+        glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+        glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+    } else {
+        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
+        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
+    }
 
     glDisable(GL_TEXTURE_2D);
     checkGLError();
@@ -267,7 +274,6 @@ void OpenGL$SquareGLPicture::draw(jint dx1, jint dy1, jint dx2, jint dy2,jint sx
     tx2 = (float) sx2 / (float) texWidth;
     ty2 = (float) sy2 / (float) texHeight;
 
-    glColor4f(1.0f,1.0f,1.0f,1.0f);
     glEnable(GL_TEXTURE_2D);
     glBindTexture(GL_TEXTURE_2D, textureName);    
     checkGLError();