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)
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)
t->data[t->len++] = a[1];
return 0;
}
+void swf_SetS16(TAG * t,int v)
+{
+ if(v>32767 || v<-32768) {
+ fprintf(stderr, "Warning: S16 overflow: %d\n", v);
+ }
+ swf_SetU16(t, (S16)v);
+}
int swf_SetU32(TAG * t,U32 v)
{ U8 a[4];
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);
void swf_ExpandRect(SRECT*src, SPOINT add)
{
+ if((src->xmin | src->ymin | src->xmax | src->ymax)==0) {
+ src->xmin = add.x;
+ src->ymin = add.y;
+ src->xmax = add.x;
+ src->ymax = add.y;
+ if((add.x|add.y) == 0) src->xmax++; //make sure the bbox is not NULL anymore
+ return;
+ }
if(add.x < src->xmin)
src->xmin = add.x;
if(add.x > src->xmax)
{
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)
if(add->ymax > src->ymax)
src->ymax = add->ymax;
}
+void swf_ExpandRect3(SRECT*src, SPOINT center, int radius)
+{
+ if((src->xmin | src->ymin | src->xmax | src->ymax)==0) {
+ src->xmin = center.x-radius;
+ src->ymin = center.y-radius;
+ src->xmax = center.x+radius;
+ src->ymax = center.y+radius;
+ if((center.x|center.y|radius) == 0) src->xmax++; //make sure the bbox is not NULL anymore
+ return;
+ }
+ if(center.x - radius < src->xmin)
+ src->xmin = center.x - radius;
+ if(center.x + radius > src->xmax)
+ 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;
+}
SPOINT swf_TurnPoint(SPOINT p, MATRIX* m)
{
SPOINT r;
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)
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));
}
}
-void swf_FoldAllTags(TAG*tag)
-{
- SWF swf;
- memset(&swf, 0, sizeof(swf));
- swf.firstTag = tag;
- swf_FoldAll(&swf);
-}
-
void swf_UnFoldAll(SWF*swf)
{
TAG*tag = swf->firstTag;
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
if (swf->firstTag && swf_NextTag(swf->firstTag))
if (swf_GetTagID(swf_NextTag(swf->firstTag))!=ST_REFLEX)
- swf_SetBlock(swf_InsertTag(swf->firstTag,ST_REFLEX),"rfx",3);
+ swf_SetBlock(swf_InsertTagBefore(swf, swf->firstTag,ST_REFLEX),"rfx",3);
#endif // INSERT_RFX_TAG
while(t) {
len += swf_WriteTag(-1,t);
- if(t->id == ST_DEFINESPRITE) inSprite++;
+ if(t->id == ST_DEFINESPRITE && !swf_IsFolded(t)) inSprite++;
else if(t->id == ST_END && inSprite) inSprite--;
else if(t->id == ST_SHOWFRAME && !inSprite) frameCount++;
t = swf_NextTag(t);
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
free(t);
t = tnew;
}
+ swf->firstTag = 0;
}
// include advanced functions