added DEFINEMOVIE to define tags
[swftools.git] / lib / rfxswf.c
index 2c6161e..3a84d11 100644 (file)
 
 #include "rfxswf.h"
 
-#ifdef HAVE_LIBJPEG
-#ifdef HAVE_JPEGLIB_H
+#ifdef HAVE_JPEGLIB
 #define HAVE_BOOLEAN
 #include <jpeglib.h>
-#define _JPEGLIB_INCLUDED_
-#endif // HAVE_JPEGLIB_H
-#endif // HAVE_LIBJPEG
+#endif // HAVE_JPEGLIB
 
-#ifdef HAVE_LIBZ
-#ifdef HAVE_ZLIB_H
+#ifdef HAVE_ZLIB
 #include <zlib.h>
-#define _ZLIB_INCLUDED_
-#endif // HAVE_ZLIB_H
-#endif // HAVE_LIBZ
+#endif // HAVE_ZLIB
 
 #define LAME
 #include "lame/lame.h"
@@ -72,6 +66,13 @@ void swf_SetTagPos(TAG * t,U32 pos)
   #endif
 }
 
+char* swf_GetString(TAG*t)
+{
+    char* str = ((char*)(&(t)->data[(t)->pos]));
+    while(swf_GetU8(t));
+    return str;
+}
+
 U8 swf_GetU8(TAG * t)
 { swf_ResetReadBits(t);
   #ifdef DEBUG_RFXSWF
@@ -322,7 +323,7 @@ int swf_CountBits(U32 v,int nbits)
 int swf_GetRect(TAG * t,SRECT * r)
 { int nbits;
   SRECT dummy;
-  if(!t) {r->xmin=r->xmax=r->ymin=r->ymax;return 0;}
+  if(!t) {r->xmin=r->xmax=r->ymin=r->ymax=0;return 0;}
   if (!r) r = &dummy;
   nbits = (int) swf_GetBits(t,5);
   r->xmin = swf_GetSBits(t,nbits);
@@ -378,6 +379,8 @@ void swf_ExpandRect(SRECT*src, SPOINT add)
 }
 void swf_ExpandRect2(SRECT*src, SRECT*add)
 {
+    if((add->xmin | add->ymin | add->xmax | add->ymax)==0)
+       return;
     if(add->xmin < src->xmin)
        src->xmin = add->xmin;
     if(add->ymin < src->ymin)
@@ -390,8 +393,8 @@ void swf_ExpandRect2(SRECT*src, SRECT*add)
 SPOINT swf_TurnPoint(SPOINT p, MATRIX* m)
 {
     SPOINT r;
-    r.x = (int)(m->sx*(1/65536.0)*p.x + m->r0*(1/65536.0)*p.y + 0.5) + m->tx;
-    r.y = (int)(m->r1*(1/65536.0)*p.x + m->sy*(1/65536.0)*p.y + 0.5) + m->ty;
+    r.x = (int)(m->sx*(1/65536.0)*p.x + m->r1*(1/65536.0)*p.y + 0.5) + m->tx;
+    r.y = (int)(m->r0*(1/65536.0)*p.x + m->sy*(1/65536.0)*p.y + 0.5) + m->ty;
     return r;
 }
 SRECT swf_TurnRect(SRECT r, MATRIX* m)
@@ -637,6 +640,47 @@ TAG * swf_InsertTag(TAG * after,U16 id)     // updates frames, if nescessary
   return t;
 }
 
+TAG * swf_InsertTagBefore(SWF* swf, TAG * before,U16 id)     // updates frames, if nescessary
+{ TAG * t;
+
+  t = (TAG *)malloc(sizeof(TAG));
+  if (t)
+  { memset(t,0x00,sizeof(TAG));
+    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) {
+    swf->firstTag = t;
+  }
+  return t;
+}
+
+void swf_ClearTag(TAG * t)
+{
+  if (t->data) free(t->data);
+  t->data = 0;
+  t->pos = 0;
+  t->len = 0;
+  t->readBit = 0;
+  t->writeBit = 0;
+  t->memsize = 0;
+}
+
+void swf_ResetTag(TAG*tag, U16 id)
+{
+    tag->len = tag->pos = tag->readBit = tag->writeBit = 0;
+    tag->id = id;
+}
+
 int swf_DeleteTag(TAG * t)
 { if (!t) return -1;
 
@@ -1099,29 +1143,37 @@ int  swf_WriteSWF2(struct writer_t*writer, SWF * swf)     // Writes SWF to file,
       swf_SetU16(&t2, swf->frameCount);
       l = swf_GetTagLen(&t2)+8;
     }
+    if(swf->compressed == 8) {
+      l -= 8;
+    }
 
     fileSize = l+len;
     if(len) {// don't touch headers without tags
        swf->fileSize = fileSize;
        swf->frameCount = frameCount;
     }
-   
-    if(swf->compressed) {
-      char*id = "CWS";
-      writer->write(writer, id, 3);
-    }
-    else {
-      char*id = "FWS";
-      writer->write(writer, id, 3);
-    }
 
-    writer->write(writer, &swf->fileVersion, 1);
-    PUT32(b4, swf->fileSize);
-    writer->write(writer, b4, 4);
+    if(swf->compressed != 8) {
+    /* compressed flag set to 8 means "skip first 8 
+       header bytes". This is necessary if the caller wants to
+       create compressed SWFs himself */
+      if(swf->compressed) {
+       char*id = "CWS";
+       writer->write(writer, id, 3);
+      }
+      else {
+       char*id = "FWS";
+       writer->write(writer, id, 3);
+      }
 
-    if(swf->compressed) {
-      writer_init_zlibdeflate(&zwriter, writer);
-      writer = &zwriter;
+      writer->write(writer, &swf->fileVersion, 1);
+      PUT32(b4, swf->fileSize);
+      writer->write(writer, b4, 4);
+      
+      if(swf->compressed) {
+       writer_init_zlibdeflate(&zwriter, writer);
+       writer = &zwriter;
+      }
     }
 
     swf_SetRect(&t1,&swf->movieSize);
@@ -1146,7 +1198,8 @@ int  swf_WriteSWF2(struct writer_t*writer, SWF * swf)     // Writes SWF to file,
       { if (swf_WriteTag2(writer, t)<0) return -1;
         t = swf_NextTag(t);
       }
-      writer->finish(writer); //e.g. flush zlib buffers
+      if(swf->compressed != 8)
+       writer->finish(writer); // flush zlib buffers - only if _we_ initialized that writer.
     }
   }
   return (int)fileSize;
@@ -1229,4 +1282,3 @@ void swf_FreeTags(SWF * swf)                 // Frees all malloc'ed memory for t
 #include "modules/swfbits.c"
 #include "modules/swfaction.c"
 #include "modules/swfsound.c"
-