+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);
+}
+