char* swf_GetString(TAG*t)
{
- char* str = ((char*)(&(t)->data[(t)->pos]));
+ int pos = t->pos;
while(t->pos < t->len && swf_GetU8(t));
/* make sure we always have a trailing zero byte */
if(t->pos == t->len) {
}
t->data[t->len] = 0;
}
- return str;
+ return (char*)&(t->data[pos]);
}
U8 swf_GetU8(TAG * t)
// Advanced Data Access Functions
+double swf_GetFixed(TAG * t)
+{
+ U16 low = swf_GetU16(t);
+ U16 high = swf_GetU16(t);
+ return high + low*(1/65536.0);
+}
+void swf_SetFixed(TAG * t, double f)
+{
+ U16 fr = (f-(int)f)*65536;
+ swf_SetU16(t, fr);
+ swf_SetU16(t, (U16)f - (f<0 && fr!=0));
+}
+float swf_GetFixed8(TAG * t)
+{
+ U8 low = swf_GetU8(t);
+ U8 high = swf_GetU8(t);
+ return high + low*(1/256.0);
+}
+void swf_SetFixed8(TAG * t, float f)
+{
+ U8 fr = (f-(int)f)*256;
+ swf_SetU8(t, fr);
+ swf_SetU8(t, (U8)f - (f<0 && fr!=0));
+}
+
int swf_SetRGB(TAG * t,RGBA * col)
{ if (!t) return -1;
if (col)
memset(gradient, 0, sizeof(GRADIENT));
return;
}
- if(!gradient)
- gradient = &dummy;
- gradient->num = swf_GetU8(tag);
- for(t=0;t<gradient->num;t++)
+ U8 num = swf_GetU8(tag) & 15;
+ if(gradient) {
+ gradient->num = num;
+ gradient->rgba = rfx_calloc(sizeof(RGBA)*gradient->num);
+ gradient->ratios = rfx_calloc(sizeof(gradient->ratios[0])*gradient->num);
+ }
+ for(t=0;t<num;t++)
{
- int s=t;
- if(s>=8) //FIXME
- s=7;
- gradient->ratios[t] = swf_GetU8(tag);
+ U8 ratio = swf_GetU8(tag);
+ RGBA color;
if(!alpha)
- swf_GetRGB(tag, &gradient->rgba[t]);
+ swf_GetRGB(tag, &color);
else
- swf_GetRGBA(tag, &gradient->rgba[t]);
+ swf_GetRGBA(tag, &color);
+ if(gradient) {
+ gradient->ratios[t] = ratio;
+ gradient->rgba[t] = color;
+ }
}
}
}
}
+void swf_FreeGradient(GRADIENT* gradient)
+{
+ if(gradient->ratios)
+ rfx_free(gradient->ratios);
+ if(gradient->rgba)
+ rfx_free(gradient->rgba);
+ memset(gradient, 0, sizeof(GRADIENT));
+}
+
int swf_CountUBits(U32 v,int nbits)
{ int n = 32;
U32 m = 0x80000000;
if(writer) writer_lastpos = writer->pos;
- if(swf->fileVersion >= 8) {
- if ((swf->firstTag && swf->firstTag->id != ST_FILEATTRIBUTES) &&
- (!swf->firstTag->next || swf->firstTag->next->id != ST_FILEATTRIBUTES))
- {
- U32 flags = 0; // | 128 = usenetwork, | 8 = hasmetadata
- swf_SetU32(swf_InsertTagBefore(swf, swf->firstTag,ST_FILEATTRIBUTES),flags);
- }
- }
-
// Insert REFLEX Tag
#ifdef INSERT_RFX_TAG
#endif // INSERT_RFX_TAG
+ if(swf->fileVersion >= 9) {
+ if ((!swf->firstTag || swf->firstTag->id != ST_SCENEDESCRIPTION) &&
+ (!swf->firstTag ||
+ !swf->firstTag->next || swf->firstTag->next->id != ST_SCENEDESCRIPTION) &&
+ (!swf->firstTag ||
+ !swf->firstTag->next ||
+ !swf->firstTag->next->next || swf->firstTag->next->next->id != ST_SCENEDESCRIPTION))
+ {
+ TAG*scene = swf_InsertTagBefore(swf, swf->firstTag,ST_SCENEDESCRIPTION);
+ swf_SetU16(scene, 1);
+ swf_SetString(scene, "Scene 1");
+ swf_SetU8(scene, 0);
+ }
+ }
+
+ if(swf->fileVersion >= 9) {
+ if (swf->firstTag && swf->firstTag->id != ST_FILEATTRIBUTES)
+ {
+ U32 flags = 0x8; // | 128 = usenetwork, | 8 = hasmetadata
+ swf_SetU32(swf_InsertTagBefore(swf, swf->firstTag,ST_FILEATTRIBUTES),flags);
+ }
+ }
+
// Count Frames + File Size
len = 0;
#include "modules/swfsound.c"
#include "modules/swfdraw.c"
#include "modules/swfrender.c"
+#include "modules/swffilter.c"