moved swf_ResetReadBits from rfxswf.c to rfxswf.h.
[swftools.git] / lib / rfxswf.c
index f67d951..e7cb0d8 100644 (file)
@@ -65,11 +65,6 @@ U32   swf_GetTagLen(TAG * t) { return t->len; }
 U8*   swf_GetTagLenPtr(TAG * t) { return &(t->data[t->len]); }
 U32   swf_GetTagPos(TAG * t)   { return t->pos; }
 
-// Basic Data Access Functions
-
-#define swf_ResetReadBits(tag)   if (tag->readBit)  { tag->pos++; tag->readBit = 0; }
-#define swf_ResetWriteBits(tag)  if (tag->writeBit) { tag->writeBit = 0; }
-
 // for future purpose: avoid high level lib functions to change tagpos/bitpos
 
 #define swf_SaveTagPos(tag)
@@ -78,9 +73,11 @@ U32   swf_GetTagPos(TAG * t)   { return t->pos; }
 void swf_SetTagPos(TAG * t,U32 pos)
 { swf_ResetReadBits(t);
   if (pos<=t->len) t->pos = pos;
-  #ifdef DEBUG_RFXSWF
-  else fprintf(stderr,"SetTagPos() out of bounds: TagID = %i\n",t->id);
-  #endif
+  else { 
+#ifdef DEBUG_RFXSWF
+    fprintf(stderr,"SetTagPos(%d) out of bounds: TagID = %i\n",pos, t->id);
+#endif
+  }
 }
 
 char* swf_GetString(TAG*t)
@@ -288,7 +285,7 @@ int swf_SetRGBA(TAG * t,RGBA * col)
 void swf_GetRGBA(TAG * t, RGBA * col)
 {
     RGBA dummy;
-    if(!col);
+    if(!col)
        col = &dummy;
     col->r = swf_GetU8(t);
     col->g = swf_GetU8(t);
@@ -433,6 +430,8 @@ void swf_ExpandRect2(SRECT*src, SRECT*add)
 {
     if((add->xmin | add->ymin | add->xmax | add->ymax)==0)
        return;
+    if((src->xmin | src->ymin | src->xmax | src->ymax)==0)
+       *src = *add;
     if(add->xmin < src->xmin)
        src->xmin = add->xmin;
     if(add->ymin < src->ymin)
@@ -861,7 +860,7 @@ int swf_WriteTag2(struct writer_t*writer, TAG * t)
 
   len = (t->id==ST_DEFINESPRITE)?swf_DefineSprite_GetRealSize(t):t->len;
 
-  short_tag = len<0x3f;
+  short_tag = len<0x3f&&(t->id!=ST_DEFINEBITSLOSSLESS&&t->id!=ST_DEFINEBITSLOSSLESS2);
 
   if (writer)
   { if (short_tag)
@@ -1038,7 +1037,7 @@ void swf_FoldSprite(TAG * t)
 
   do
   { 
-    if(t->len<0x3f) {
+    if(t->len<0x3f&&t->id!=ST_DEFINEBITSLOSSLESS&&t->id!=ST_DEFINEBITSLOSSLESS2) {
        swf_SetU16(sprtag,t->len|(t->id<<6));
     } else {
        swf_SetU16(sprtag,0x3f|(t->id<<6));
@@ -1203,6 +1202,7 @@ int  swf_WriteSWF2(struct writer_t*writer, SWF * swf)     // Writes SWF to file,
   int fileSize = 0;
   int inSprite = 0;
   int writer_lastpos = 0;
+  int ret;
     
   if (!swf) return -1;
   if (!writer) return -1; // the caller should provide a nullwriter, not 0, for querying SWF size
@@ -1292,7 +1292,7 @@ int  swf_WriteSWF2(struct writer_t*writer, SWF * swf)     // Writes SWF to file,
     swf_SetU16(&t1,swf->frameRate);
     swf_SetU16(&t1,swf->frameCount);
 
-    int ret = writer->write(writer,b,swf_GetTagLen(&t1));
+    ret = writer->write(writer,b,swf_GetTagLen(&t1));
     if (ret!=swf_GetTagLen(&t1))
     {
       #ifdef DEBUG_RFXSWF
@@ -1395,6 +1395,7 @@ void swf_FreeTags(SWF * swf)                 // Frees all malloc'ed memory for t
     free(t);
     t = tnew;
   }
+  swf->firstTag = 0;
 }
 
 // include advanced functions