fix in combineCallbackTex
[swftools.git] / lib / devices / opengl.c
index 36ffcc7..e5d2e91 100644 (file)
@@ -16,7 +16,8 @@
 #include <stdarg.h>
 
 //#define ZSTEP (1/65536.0)
-#define ZSTEP (1/4.0)
+#define ZSTEP (1/32.0)
+//#define ZSTEP (1/4.0)
 
 typedef struct _fontlist {
     gfxfont_t*font;
@@ -67,16 +68,16 @@ void CALLBACK errorCallback(GLenum errorCode)
 {
    const GLubyte *estring;
    estring = gluErrorString(errorCode);
-   dbg("Tessellation Error: %s\n", estring);
+   printf("Tessellation Error: %s\n", estring);
    exit(0);
 }
 void CALLBACK beginCallback(GLenum which)
 {
-   glBegin(which);
+    glBegin(which);
 }
 void CALLBACK endCallback(void)
 {
-   glEnd();
+    glEnd();
 }
 void CALLBACK vertexCallback(GLvoid *vertex)
 {
@@ -100,14 +101,18 @@ void CALLBACK vertexCallbackTex(GLvoid *vertex)
 }
 void CALLBACK combineCallbackTex(GLdouble coords[3], GLdouble *data[4], GLfloat w[4], GLdouble **out)
 {
-   GLdouble *vertex, *texCoord;
+   GLdouble *vertex;
    vertex = (GLdouble *) malloc(5 * sizeof(GLdouble));
    vertex[0] = coords[0];
    vertex[1] = coords[1];
    vertex[2] = coords[2];
-   texCoord = &vertex[3];
-   vertex[3] = w[0]*data[0][3] + w[1]*data[1][3] + w[2]*data[2][3] + w[3]*data[3][3];
-   vertex[4] = w[0]*data[0][4] + w[1]*data[1][4] + w[2]*data[2][4] + w[3]*data[3][4];
+   if(data[2] && data[3]) {
+       vertex[3] = w[0]*data[0][3] + w[1]*data[1][3] + w[2]*data[2][3] + w[3]*data[3][3];
+       vertex[4] = w[0]*data[0][4] + w[1]*data[1][4] + w[2]*data[2][4] + w[3]*data[3][4];
+   } else {
+       vertex[3] = w[0]*data[0][3] + w[1]*data[1][3];
+       vertex[4] = w[0]*data[0][4] + w[1]*data[1][4];
+   }
    *out = vertex;
 }
 
@@ -261,9 +266,10 @@ void tesselatePolygon(GLUtesselator*tesselator, double z, gfxline_t*line)
 void opengl_fill(struct _gfxdevice*dev, gfxline_t*line, gfxcolor_t*color)
 {
     double z;
-    dbg("fill");
+    dbg("fill %02x%02x%02x%02x", color->a, color->r, color->g, color->b);
     internal_t*i = (internal_t*)dev->internal;
-    
+
+    glDisable(GL_TEXTURE_2D);
     glColor4f(color->r/255.0, color->g/255.0, color->b/255.0, color->a/255.0);
     
     i->currentz ++;
@@ -378,7 +384,7 @@ void opengl_fillbitmap(struct _gfxdevice*dev, gfxline_t*line, gfximage_t*img, gf
     int len = 0;
     double*xyz=0;
     gfxline_t*l=0;
-    glColor4f(1.0,0,0,1.0);
+    glColor4f(1.0,0,0.7,1.0);
     
     i->currentz ++;
   
@@ -476,6 +482,8 @@ void opengl_addfont(gfxdevice_t*dev, gfxfont_t*font)
 void opengl_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix)
 {
     internal_t*i = (internal_t*)dev->internal;
+    if(!font)
+       return;
 
     if(i->font && i->font->id && !strcmp(font->id, i->font->id)) {
        // current font is correct
@@ -490,8 +498,10 @@ void opengl_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*co
            l = l->next;
        }
        if(i->font == 0) {
-           fprintf(stderr, "Unknown font id: %s", font->id);
-           return;
+            opengl_addfont(dev, font);
+            i->font = font;
+           //fprintf(stderr, "Unknown font id: %s", font->id);
+           //return;
        }
     }
 
@@ -509,7 +519,7 @@ void opengl_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*co
 
 
 
-void opengl_drawlink(struct _gfxdevice*dev, gfxline_t*line, char*action)
+void opengl_drawlink(struct _gfxdevice*dev, gfxline_t*line, const char*action)
 {
     dbg("link");
 }
@@ -519,12 +529,12 @@ void opengl_endpage(struct _gfxdevice*dev)
     dbg("endpage");
 }
 
-int opengl_result_save(struct _gfxresult*gfx, char*filename)
+int opengl_result_save(struct _gfxresult*gfx, const char*filename)
 {
     dbg("result:save");
     return 0;
 }
-void* opengl_result_get(struct _gfxresult*gfx, char*name)
+void* opengl_result_get(struct _gfxresult*gfx, const char*name)
 {
     dbg("result:get");
     return 0;
@@ -578,7 +588,7 @@ void gfxdevice_opengl_init(gfxdevice_t*dev)
     gluTessCallback(i->tesselator, GLU_TESS_VERTEX, (callbackfunction_t)vertexCallback);
     gluTessCallback(i->tesselator, GLU_TESS_BEGIN, (callbackfunction_t)beginCallback);
     gluTessCallback(i->tesselator, GLU_TESS_END, (callbackfunction_t)endCallback);
-    //gluTessCallback(i->tesselator, GLU_TESS_COMBINE, (callbackfunction_t)combineCallback);
+    gluTessCallback(i->tesselator, GLU_TESS_COMBINE, (callbackfunction_t)combineCallback);
     
     i->tesselator_line = gluNewTess();
     gluTessCallback(i->tesselator_line, GLU_TESS_ERROR, (callbackfunction_t)errorCallback);