X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Frfxswf.c;h=f6353a368a739892be8f60ba7587c4f0c36a1a35;hb=753c672c453d65155923a539472414a26ea4e445;hp=bd8cd17ac2efee628f3859a5d795494f48b8bdfb;hpb=f5626be739a1e1b61f89d7a389be3c4b5d4d9128;p=swftools.git diff --git a/lib/rfxswf.c b/lib/rfxswf.c index bd8cd17..f6353a3 100644 --- a/lib/rfxswf.c +++ b/lib/rfxswf.c @@ -406,6 +406,34 @@ int swf_SetU30String(TAG*tag, const char*str, int l) swf_SetBlock(tag, (void*)str, l); return len; } +float swf_GetF16(TAG * t) +{ + // D16 is 1-5-10 + // D32 is 1-8-23 + U16 f1 = swf_GetU16(t); + if(!f1) return 0; + U32 f2 = (f1&0x8000)<<16; //sign + f2 |= ((f1&0x7c00)<<13)+(0x40000000-(0x4000<<13)); //exp + f2 |= (f1&0x03ff)<<13; //mantissa + return *(float*)&f2; +} +void swf_SetF16(TAG * t, float f) +{ + U32 f1 = *(U32*)&f; + U16 f2 = (f1>>16)&0x8000; + int exp = ((f1>>23)&0xff)-0x80+0x10; + if(exp<0) { + exp = 0; + fprintf(stderr, "Exponent underflow in FLOAT16 encoding\n"); + } else if(exp>=32) { + exp = 31; + fprintf(stderr, "Exponent overflow in FLOAT16 encoding\n"); + } + f2 |= exp<<10; + f2 |= (f1>>13)&0x3ff; + swf_SetU16(t, f2); +} + double swf_GetD64(TAG*tag) { /* FIXME: this is not big-endian compatible */ @@ -949,7 +977,7 @@ void swf_SetPassword(TAG * t, const char * password) md5string = crypt_md5(password, salt); swf_SetU16(t,0); - swf_SetString(t, (U8*)md5string); + swf_SetString(t, md5string); } void swf_SetString(TAG*t, const char* s) @@ -957,7 +985,7 @@ void swf_SetString(TAG*t, const char* s) if(!s) { swf_SetU8(t, 0); } else { - swf_SetBlock(t,s,strlen(s)+1); + swf_SetBlock(t,(U8*)s,strlen(s)+1); } } @@ -1561,13 +1589,24 @@ int WriteExtraTags(SWF*swf, writer_t*writer) } swf_DeleteTag(0, fileattrib); } else { - if(swf_WriteTag2(writer, has_fileattributes)<0) - return -1; + if(swf->fileAttributes) { + /* if we're writing a file out again where we might have possible + modified the fileattributes in the header, adjust the tag data */ + TAG*tt = swf_CopyTag(0,has_fileattributes); + U32 flags = swf_GetU32(tt) | swf->fileAttributes; + swf_ResetTag(tt, tt->id); + swf_SetU32(tt, flags); + if(swf_WriteTag2(writer, has_fileattributes)<0) return -1; + swf_DeleteTag(0, tt); + } else { + if(swf_WriteTag2(writer, has_fileattributes)<0) + return -1; + } } if(0 && !has_scenedescription) { TAG*scene = swf_InsertTag(0, ST_SCENEDESCRIPTION); swf_SetU16(scene, 1); - swf_SetString(scene, (U8*)"Scene 1"); + swf_SetString(scene, "Scene 1"); swf_SetU8(scene, 0); if(writer) { if(swf_WriteTag2(writer, scene)<0)