propose-patch
[org.ibex.core.git] / src / org / xwt / plat / OpenGL.cc
index 5540c2d..3c8cf6a 100644 (file)
@@ -25,6 +25,9 @@
 
 #include <stdio.h>
 
+#define min(a,b) ((a)<(b)?(a):(b)) 
+#define max(a,b) ((a)>(b)?(a):(b)) 
+
 namespace org { namespace xwt { namespace plat {
 
 #define checkGLError() checkGLError2(__FILE__,__LINE__)
@@ -88,12 +91,12 @@ void OpenGL$GLPixelBuffer::setColor(jint argb) {
 void OpenGL$GLPixelBuffer::fillTrapezoid(jint x1, jint x2, jint y1, jint x3, jint x4, jint y2, jint color) {
     activateContext();
     setColor(color);
-    glBegin(GL_QUADS); 
+    glBegin(GL_QUADS); {
         glVertex3f(x1,y1,0.0f );   
         glVertex3f(x3,y2,0.0f );  
         glVertex3f(x4,y2,0.0f ); 
         glVertex3f(x2,y1,0.0f ); 
-    glEnd();
+    } glEnd();
 }
 
 void OpenGL$GLPixelBuffer::setClip(jint x1, jint y1, jint x2, jint y2) {
@@ -176,21 +179,26 @@ void OpenGL$RectGLPicture::natInit(Object *data_, jboolean alphaOnly) {
     textureName = (jint)tex;
 }
 
-void OpenGL$RectGLPicture::draw(jint dx1, jint dy1, jint dx2, jint dy2,jint sx1, jint sy1, jint sx2, jint sy2) { 
-       glEnable(GL_TEXTURE_RECTANGLE_EXT);
-       glBindTexture(GL_TEXTURE_RECTANGLE_EXT, textureName);    
-       glBegin(GL_QUADS); 
-       glTexCoord2i (sx1, sy1   );
-        glVertex3i   (dx1, dy1, 0);   
-        glTexCoord2i (sx2, sy1   ); 
-        glVertex3i   (dx2, dy1, 0);
-        glTexCoord2i (sx2, sy2   ); 
-        glVertex3i   (dx2, dy2, 0);
-        glTexCoord2i (sx1, sy2   );
-        glVertex3i   (dx1, dy2, 0);
-       glEnd();
-       glDisable(GL_TEXTURE_RECTANGLE_EXT);
-       checkGLError();
+void OpenGL$RectGLPicture::draw(jint dx, jint dy, jint cx1, jint cy1, jint cx2, jint cy2) { 
+    cx1 = max(dx, cx1);
+    cy1 = max(dy, cy1);
+    cx2 = min(cx2, dx + width);
+    cy2 = min(cy2, dy + height);
+    if (cy2 <= cy1 || cx2 <= cx1) return;
+    glEnable(GL_TEXTURE_RECTANGLE_EXT);
+    glBindTexture(GL_TEXTURE_RECTANGLE_EXT, textureName);    
+    glBegin(GL_QUADS); {
+      glTexCoord2i (cx1 - dx, cy1 - dy   );
+      glVertex3i   (cx1,      cy1,      0);
+      glTexCoord2i (cx2 - dx, cy1 - dy   );
+      glVertex3i   (cx2,      cy1,      0);
+      glTexCoord2i (cx2 - dx, cy2 - dy   );
+      glVertex3i   (cx2,      cy2,      0);
+      glTexCoord2i (cx1 - dx, cy2 - dy   );
+      glVertex3i   (cx1,      cy2,      0);
+    } glEnd();
+    glDisable(GL_TEXTURE_RECTANGLE_EXT);
+    checkGLError();
 }
 
 void OpenGL::natDeleteTexture(jint tex_) {
@@ -267,26 +275,29 @@ void OpenGL$SquareGLPicture::natInit(Object *data_, jboolean alphaOnly) {
     textureName = (jint)tex;
 }
 
-void OpenGL$SquareGLPicture::draw(jint dx1, jint dy1, jint dx2, jint dy2,jint sx1, jint sy1, jint sx2, jint sy2) {
-    float tx1,ty1,tx2,ty2; // normalized texture coords
-    tx1 = (float) sx1 / (float) texWidth;
-    ty1 = (float) sy1 / (float) texHeight;
-    tx2 = (float) sx2 / (float) texWidth;
-    ty2 = (float) sy2 / (float) texHeight;
-
+void OpenGL$SquareGLPicture::draw(jint dx, jint dy, jint cx1, jint cy1, jint cx2, jint cy2) {
+    cx1 = max(dx, cx1);
+    cy1 = max(dy, cy1);
+    cx2 = min(cx2, dx + width);
+    cy2 = min(cy2, dy + height);
+    if (cy2 <= cy1 || cx2 <= cx1) return;
+    float tx1 = (float) (cx1 - dx) / (float) texWidth;
+    float ty1 = (float) (cy1 - dy) / (float) texHeight;
+    float tx2 = (float) (cx2 - dx) / (float) texWidth;
+    float ty2 = (float) (cy2 - dy) / (float) texHeight;
     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();
+    glBegin(GL_QUADS); {
+       glTexCoord2f (tx1,      ty1        );    
+        glVertex3i   (cx1,      cy1,      0);
+       glTexCoord2f (tx2,      ty1        );    
+        glVertex3i   (cx2,      cy1,      0);
+       glTexCoord2f (tx2,      ty2        );    
+        glVertex3i   (cx2,      cy2,      0);
+       glTexCoord2f (tx1,      ty2        );    
+        glVertex3i   (cx1,      cy2,      0);
+    } glEnd();
     glDisable(GL_TEXTURE_2D);
     checkGLError();
 }