fixed png2swf -C bug.
[swftools.git] / lib / rfxswf.c
index 3a8a3ce..580a55d 100644 (file)
@@ -120,6 +120,16 @@ void rfx_free(void*ptr)
   free(ptr);
 }
 
+#ifdef MEMORY_INFO
+long rfx_memory_used()
+{
+}
+
+char* rfx_memory_used_str()
+{
+}
+#endif
+
 // internal constants
 
 #define MALLOC_SIZE     128
@@ -532,11 +542,11 @@ void swf_ExpandRect3(SRECT*src, SPOINT center, int radius)
     if(center.x - radius < src->xmin)
        src->xmin = center.x - radius;
     if(center.x + radius > src->xmax)
-       src->xmax = center.x - radius;
+       src->xmax = center.x + radius;
     if(center.y - radius < src->ymin)
        src->ymin = center.y - radius;
     if(center.y + radius > src->ymax)
-       src->ymax = center.y - radius;
+       src->ymax = center.y + radius;
 }
 SPOINT swf_TurnPoint(SPOINT p, MATRIX* m)
 {
@@ -549,6 +559,8 @@ SRECT swf_TurnRect(SRECT r, MATRIX* m)
 {
     SRECT g;
     SPOINT p1,p2,p3,p4,pp1,pp2,pp3,pp4;
+    if(!m)
+      return r;
     p1.x = r.xmin;p1.y = r.ymin;
     p2.x = r.xmax;p2.y = r.ymin;
     p3.x = r.xmin;p3.y = r.ymax;
@@ -656,7 +668,7 @@ int swf_SetMatrix(TAG * t,MATRIX * m)
   return 0;
 }
 
-int swf_GetCXForm(TAG * t,CXFORM * cx,U8 alpha) //FIXME: alpha should be type bool
+int swf_GetCXForm(TAG * t,CXFORM * cx,U8 alpha)
 { CXFORM cxf;
   int hasadd;
   int hasmul;
@@ -770,6 +782,7 @@ void  swf_SetPassword(TAG * t, const char * password)
     fprintf(stderr, "rfxswf: Warning- no usable random generator found\n");
     fprintf(stderr, "Your password will be vulnerable to dictionary attacks\n");
 #endif
+    salt[2] = 0;
     
     md5string = crypt_md5(password, salt);
 
@@ -916,7 +929,12 @@ TAG * swf_ReadTag(struct reader_t*reader, TAG * prev)
   if (t->len)
   { t->data = (U8*)rfx_alloc(t->len);
     t->memsize = t->len;
-    if (reader->read(reader, t->data, t->len) != t->len) return NULL;
+    if (reader->read(reader, t->data, t->len) != t->len) {
+      fprintf(stderr, "rfxswf: Warning: Short read (tagid %d). File truncated?\n", t->id);
+      free(t->data);t->data=0;
+      free(t);
+      return NULL;
+    }
   }
 
   if (prev)
@@ -1212,7 +1230,10 @@ void swf_OptimizeTagOrder(SWF*swf)
          tag->next = level0;
          tag->prev = level0->prev;
          level0->prev = tag;
-         tag->prev->next = tag;
+          if(tag->prev)
+           tag->prev->next = tag;
+          else
+            swf->firstTag = tag;
          changes = 1;
        }
       }
@@ -1294,9 +1315,11 @@ int  swf_WriteSWF2(struct writer_t*writer, SWF * swf)     // Writes SWF to file,
 
 #ifdef INSERT_RFX_TAG
 
-  if (swf->firstTag && swf_NextTag(swf->firstTag))
-    if (swf_GetTagID(swf_NextTag(swf->firstTag))!=ST_REFLEX)
+  if (swf->firstTag && swf->firstTag->next &&
+      (swf->firstTag->id != ST_REFLEX || swf->firstTag->next->id != ST_REFLEX)
+     ) {
       swf_SetBlock(swf_InsertTagBefore(swf, swf->firstTag,ST_REFLEX),"rfx",3);
+  }
 
 #endif // INSERT_RFX_TAG
 
@@ -1414,6 +1437,7 @@ int  swf_WriteSWF(int handle, SWF * swf)     // Writes SWF to file, returns leng
   if(handle<0) {
     writer_init_nullwriter(&writer);
     len = swf_WriteSWF2(&writer, swf);
+    return len;
   }
   writer_init_filewriter(&writer, handle);
   len = swf_WriteSWF2(&writer, swf);
@@ -1471,6 +1495,23 @@ int swf_WriteCGI(SWF * swf)
   return swf_WriteSWF(fileno(stdout),swf);
 }
 
+SWF* swf_CopySWF(SWF*swf)
+{
+    SWF*nswf = rfx_alloc(sizeof(SWF));
+    TAG*tag, *ntag;
+    memcpy(nswf, swf, sizeof(SWF));
+    nswf->firstTag = 0;
+    tag = swf->firstTag;
+    ntag = 0;
+    while(tag) {
+        ntag = swf_CopyTag(ntag, tag);
+        if(!nswf->firstTag)
+            nswf->firstTag = ntag;
+        tag = tag->next;
+    }
+    return nswf;
+}
+
 void swf_FreeTags(SWF * swf)                 // Frees all malloc'ed memory for tags
 { TAG * t = swf->firstTag;
 
@@ -1497,3 +1538,4 @@ void swf_FreeTags(SWF * swf)                 // Frees all malloc'ed memory for t
 #include "modules/swfaction.c"
 #include "modules/swfsound.c"
 #include "modules/swfdraw.c"
+#include "modules/swfrender.c"