X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Frfxswf.c;h=061010b0d83a0a6dad55d3e8776aef2fea78cbc8;hb=1f9f467ef90391c81c31da7f6b5ed2131443a1fe;hp=f67d951814037125b3115f3c7e7174b51edfc232;hpb=0288babb81e62bf607d8c2e428b577756b655fed;p=swftools.git diff --git a/lib/rfxswf.c b/lib/rfxswf.c index f67d951..061010b 100644 --- a/lib/rfxswf.c +++ b/lib/rfxswf.c @@ -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) @@ -182,6 +179,13 @@ int swf_SetU16(TAG * t,U16 v) 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]; @@ -288,7 +292,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); @@ -420,6 +424,14 @@ int swf_SetRect(TAG * t,SRECT * r) 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) @@ -433,6 +445,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) @@ -442,6 +456,25 @@ void swf_ExpandRect2(SRECT*src, SRECT*add) 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; @@ -861,7 +894,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 +1071,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 +1236,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 @@ -1227,7 +1261,7 @@ int swf_WriteSWF2(struct writer_t*writer, SWF * swf) // Writes SWF to file, 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); @@ -1292,7 +1326,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 +1429,7 @@ void swf_FreeTags(SWF * swf) // Frees all malloc'ed memory for t free(t); t = tnew; } + swf->firstTag = 0; } // include advanced functions