fixed graphics bug
[swftools.git] / lib / rfxswf.c
index 7049111..944418d 100644 (file)
 #include <zlib.h>
 #endif // HAVE_ZLIB
 
-#define LAME
+#ifndef RFXSWF_DISABLESOUND
+#ifdef HAVE_LAME
 #include "lame/lame.h"
+#endif
+#endif
 
 #include "./bitio.h"
+#include "./MD5.h"
 
 // internal constants
 
@@ -52,7 +56,6 @@
 
 TAG * swf_NextTag(TAG * t) { return t->next; }
 TAG * swf_PrevTag(TAG * t) { return t->prev; }
-int   swf_GetFrameNo(TAG * t)  { return t->frame; }
 U16   swf_GetTagID(TAG * t)    { return t->id; }
 U32   swf_GetTagLen(TAG * t) { return t->len; }
 U8*   swf_GetTagLenPtr(TAG * t) { return &(t->data[t->len]); }
@@ -293,6 +296,10 @@ void swf_GetGradient(TAG * tag, GRADIENT * gradient, char alpha)
 {
     GRADIENT dummy;
     int t;
+    if(!tag) {
+      memset(gradient, 0, sizeof(GRADIENT));
+      return;
+    }
     if(!gradient)
        gradient = &dummy;
     gradient->num = swf_GetU8(tag);
@@ -309,6 +316,24 @@ void swf_GetGradient(TAG * tag, GRADIENT * gradient, char alpha)
     }
 }
 
+void swf_SetGradient(TAG * tag, GRADIENT * gradient, char alpha)
+{
+    int t;
+    if(!tag) {
+      memset(gradient, 0, sizeof(GRADIENT));
+      return;
+    }
+    swf_SetU8(tag, gradient->num);
+    for(t=0; t<8 && t<gradient->num; t++)
+    {
+       swf_SetU8(tag, gradient->ratios[t]);
+       if(!alpha)
+           swf_SetRGB(tag, &gradient->rgba[t]);
+       else
+           swf_SetRGBA(tag, &gradient->rgba[t]);
+    }
+}
+
 int swf_CountUBits(U32 v,int nbits)
 { int n = 32;
   U32 m = 0x80000000;
@@ -626,23 +651,46 @@ int swf_SetCXForm(TAG * t,CXFORM * cx,U8 alpha)
   return 0;
 }
 
-int swf_GetPoint(TAG * t,SPOINT * p) { return 0; }
-int swf_SetPoint(TAG * t,SPOINT * p) { return 0; }
+//int swf_GetPoint(TAG * t,SPOINT * p) { return 0; }
+//int swf_SetPoint(TAG * t,SPOINT * p) { return 0; }
 
-// Tag List Manipulating Functions
+void  swf_SetPassword(TAG * t, const char * password)
+{
+    /* WARNING: crypt_md5 is not reentrant */
+    char* md5string = crypt_md5(password, "salt"); /* FIXME- get random salt */
+    swf_SetString(t, md5string);
+}
 
-int swf_UpdateFrame(TAG * t,S8 delta)
-// returns number of frames
-{ int res = -1;
-  while (t)
-  { t->frame+=delta;
-    res = t->frame;
-    t = t->next;
-  }
-  return res;
+int swf_VerifyPassword(TAG * t, const char * password)
+{
+    char*md5string1, *md5string2;
+    char*x;
+    char*md5, *salt;
+    int n;
+
+    md5string1 = swf_GetString(t);
+
+    if(!strncmp(md5string1, "$1$",3 )) {
+       return 0;
+    }
+    x = strchr(md5string1+3, '$');
+    if(!x)
+       return 0;
+    n = x-(md5string1+3);
+    salt = (char*)malloc(n+1);
+    memcpy(salt, md5string1+3, n);
+    salt[n] = 0;
+
+    md5string2 = crypt_md5(password, salt);
+    free(salt);
+    if(strcmp(md5string1, md5string2) != 0)
+       return 0;
+    return 1;
 }
 
-TAG * swf_InsertTag(TAG * after,U16 id)     // updates frames, if nescessary
+// Tag List Manipulating Functions
+
+TAG * swf_InsertTag(TAG * after,U16 id)
 { TAG * t;
 
   t = (TAG *)malloc(sizeof(TAG));
@@ -651,19 +699,17 @@ TAG * swf_InsertTag(TAG * after,U16 id)     // updates frames, if nescessary
     t->id = id;
     
     if (after)
-    { t->frame = after->frame;
+    {
       t->prev  = after;
       t->next  = after->next;
       after->next = t;
       if (t->next) t->next->prev = t;
-      
-      if (id==ST_SHOWFRAME) swf_UpdateFrame(t->next,+1);
     }
   }
   return t;
 }
 
-TAG * swf_InsertTagBefore(SWF* swf, TAG * before,U16 id)     // updates frames, if nescessary
+TAG * swf_InsertTagBefore(SWF* swf, TAG * before,U16 id)
 { TAG * t;
 
   t = (TAG *)malloc(sizeof(TAG));
@@ -672,13 +718,11 @@ TAG * swf_InsertTagBefore(SWF* swf, TAG * before,U16 id)     // updates frames,
     t->id = id;
     
     if (before)
-    { t->frame = before->frame;
+    {
       t->next  = before;
       t->prev  = before->prev;
       before->prev = t;
       if (t->prev) t->prev->next = t;
-      
-      if (id==ST_SHOWFRAME) swf_UpdateFrame(t->next,+1);
     }
   }
   if(swf && swf->firstTag == before) {
@@ -707,8 +751,6 @@ void swf_ResetTag(TAG*tag, U16 id)
 int swf_DeleteTag(TAG * t)
 { if (!t) return -1;
 
-  if (t->id==ST_SHOWFRAME) swf_UpdateFrame(t->next,-1);
-    
   if (t->prev) t->prev->next = t->next;
   if (t->next) t->next->prev = t->prev;
 
@@ -736,7 +778,7 @@ TAG * swf_ReadTag(struct reader_t*reader, TAG * prev)
   }
 
   if (id==ST_DEFINESPRITE) len = 2*sizeof(U16);
-  // Sprite handling fix: Flaten sprite tree
+  // Sprite handling fix: Flatten sprite tree
 
   t = (TAG *)malloc(sizeof(TAG));
   
@@ -767,7 +809,7 @@ TAG * swf_ReadTag(struct reader_t*reader, TAG * prev)
   }
 
   if (prev)
-  { t->frame = prev->frame+((prev->id==ST_SHOWFRAME)?1:0);
+  {
     t->prev  = prev;
     prev->next = t;
   }
@@ -994,9 +1036,12 @@ int swf_IsFolded(TAG * t)
 void swf_FoldAll(SWF*swf)
 {
     TAG*tag = swf->firstTag;
+    //swf_DumpSWF(stdout, swf);
     while(tag) {
-       if(tag->id == ST_DEFINESPRITE)
+       if(tag->id == ST_DEFINESPRITE) {
            swf_FoldSprite(tag);
+           //swf_DumpSWF(stdout, swf);
+       }
        tag = swf_NextTag(tag);
     }
 }
@@ -1302,6 +1347,7 @@ void swf_FreeTags(SWF * swf)                 // Frees all malloc'ed memory for t
 #include "modules/swfdump.c"
 #include "modules/swfshape.c"
 #include "modules/swftext.c"
+#include "modules/swffont.c"
 #include "modules/swfobject.c"
 #include "modules/swfbutton.c"
 #include "modules/swftools.c"
@@ -1309,3 +1355,4 @@ void swf_FreeTags(SWF * swf)                 // Frees all malloc'ed memory for t
 #include "modules/swfbits.c"
 #include "modules/swfaction.c"
 #include "modules/swfsound.c"
+#include "modules/swfdraw.c"