#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__)
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) {
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_) {
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();
}