propose-patch
[org.ibex.core.git] / src / org / xwt / plat / OpenGL.cc
index 2aba6ba..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__)
@@ -177,6 +180,11 @@ void OpenGL$RectGLPicture::natInit(Object *data_, jboolean alphaOnly) {
 }
 
 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); {
@@ -268,18 +276,27 @@ void OpenGL$SquareGLPicture::natInit(Object *data_, jboolean alphaOnly) {
 }
 
 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 (cx1 - dx, cy1 - dy   );
-        glVertex3i   (dx1,      dy1,      0);
-        glTexCoord2f (cx2 - dx, cy1 - dy   );
-        glVertex3i   (dx2,      dy1,      0);
-        glTexCoord2f (cx2 - dx, cy2 - dy   );
-        glVertex3i   (dx2,      dy2,      0);
-        glTexCoord2f (cx1 - dx, cy2 - dy   );
-        glVertex3i   (dx1,      dy2,      0);
+       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();