X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2Fplat%2FOpenGL.cc;h=3c8cf6ad73369948d141fa4a302e4238de40a998;hb=de378041d5ca2aca1a2b5a31ef15ae90a86c977f;hp=5540c2deb1cf893feef4ef5999dc2a1c2a5a5a50;hpb=745fb6aad79e10eb8c402b8fa6a591769c0fcdfb;p=org.ibex.core.git diff --git a/src/org/xwt/plat/OpenGL.cc b/src/org/xwt/plat/OpenGL.cc index 5540c2d..3c8cf6a 100644 --- a/src/org/xwt/plat/OpenGL.cc +++ b/src/org/xwt/plat/OpenGL.cc @@ -25,6 +25,9 @@ #include +#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(); }