U8 swf_GetU8(TAG * t)
{ swf_ResetReadBits(t);
#ifdef DEBUG_RFXSWF
- if (t->pos>=t->len)
+ if ((int)t->pos>=(int)t->len)
{ fprintf(stderr,"GetU8() out of bounds: TagID = %i\n",t->id);
+ *(int*)0=0;
return 0;
}
#endif
{ U16 res;
swf_ResetReadBits(t);
#ifdef DEBUG_RFXSWF
- if (t->pos>(t->len-2))
+ if ((int)t->pos>((int)t->len-2))
{ fprintf(stderr,"GetU16() out of bounds: TagID = %i\n",t->id);
return 0;
}
{ U32 res;
swf_ResetReadBits(t);
#ifdef DEBUG_RFXSWF
- if (t->pos>(t->len-4))
+ if ((int)t->pos>((int)t->len-4))
{ fprintf(stderr,"GetU32() out of bounds: TagID = %i\n",t->id);
return 0;
}
void swf_SetS16(TAG * t,int v)
{
if(v>32767 || v<-32768) {
+ #ifdef DEBUG_RFXSWF
fprintf(stderr, "Warning: S16 overflow: %d\n", v);
+ #endif
}
swf_SetU16(t, (S16)v);
}
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
- fprintf(stderr, "%f = %d-%d-%x\n", *(float*)&f2, f1>>15, (f1>>10)&31, f1&0x3ff);
+ if(!(f1&0x3ff)) return 0.0;
+
+ // IEEE 16 is 1-5-10
+ // IEEE 32 is 1-8-23
+ /* gcc 4.1.2 seems to require a union here. *(float*)u doesn't work */
+ union {
+ U32 u;
+ float f;
+ } f2;
+
+ U16 e = (f1>>10)&0x1f;
+ U16 m = f1&0x3ff;
+ /* find highest bit in mantissa */
+ int h=0;
+ while(!(m&0x400)) {
+ m<<=1;
+ h++;
+ }
+ m&=0x3ff;
+ e -= h;
+ e += 0x6f;
+
+ f2.u = (f1&0x8000)<<16; //sign
+ f2.u |= e<<23; //exponent
+ f2.u |= m<<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) {
+ union {
+ U32 u;
+ float f;
+ } v;
+ v.f = f;
+
+ U16 result = (v.u>>16)&0x8000; //sign
+ int exp = ((v.u>>23)&0xff)-0x7f+0x10;
+ U16 m = (v.u>>13)&0x3ff;
+ //fprintf(stderr, "%f: %04x sign, %d exp, %04x mantissa\n", f, result, exp, m);
+ if(exp<-10) {
+ // underflow (clamp to 0.0)
+ exp = 0;
+ m = 0;
+ } else if(exp<0) {
+ // partial underflow- strip some bits
+ m = (m|0x400)>>-exp;
exp = 0;
- fprintf(stderr, "Exponent underflow in FLOAT16 encoding\n");
} else if(exp>=32) {
exp = 31;
+ m = 0x3ff;
fprintf(stderr, "Exponent overflow in FLOAT16 encoding\n");
+ } else {
+ exp++;
+ m = (m>>1)|0x200;
}
- f2 |= exp<<10;
- f2 |= (f1>>13)&0x3ff;
- swf_SetU16(t, f2);
+ result |= exp<<10;
+ result |= m;
+ swf_SetU16(t, result);
+}
+
+float F16toFloat(U16 x)
+{
+ TAG t;
+ t.data = (void*)&x;
+ t.readBit = 0;
+ t.pos = 0;
+ t.len = 2;
+ return swf_GetF16(&t);
+}
+
+float floatToF16(float f)
+{
+ U16 u = 0;
+ TAG t;
+ t.data = (void*)&u;
+ t.len = 0;
+ t.memsize = 2;
+ t.writeBit = 0;
+ swf_SetF16(&t, f);
+ return u;
}
double swf_GetD64(TAG*tag)
nbits = swf_CountBits(r->ymin,nbits);
nbits = swf_CountBits(r->ymax,nbits);
if(nbits>=32) {
+ #ifdef DEBUG_RFXSWF
fprintf(stderr, "rfxswf: Warning: num_bits overflow in swf_SetRect\n");
+ #endif
nbits=31;
}
nbits = swf_CountBits(m->sy,nbits);
if(nbits>=32) {
/* TODO: happens on AMD64 systems for normal values? */
+ #ifdef DEBUG_RFXSWF
fprintf(stderr,"rfxswf: Error: matrix values too large\n");
+ #endif
nbits = 31;
}
swf_SetBits(t,nbits,5);
nbits = swf_CountBits(m->r0,0);
nbits = swf_CountBits(m->r1,nbits);
if(nbits>=32) {
+ #ifdef DEBUG_RFXSWF
fprintf(stderr,"rfxswf: Error: matrix values too large\n");
+ #endif
nbits = 31;
}
swf_SetBits(t,nbits,5);
nbits = swf_CountBits(m->tx,0);
nbits = swf_CountBits(m->ty,nbits);
if(nbits>=32) {
+ #ifdef DEBUG_RFXSWF
fprintf(stderr,"rfxswf: Error: matrix values too large\n");
+ #endif
nbits = 31;
}
swf_SetBits(t,nbits,5);
{ t->data = (U8*)rfx_alloc(t->len);
t->memsize = t->len;
if (reader->read(reader, t->data, t->len) != t->len) {
+ #ifdef DEBUG_RFXSWF
fprintf(stderr, "rfxswf: Warning: Short read (tagid %d). File truncated?\n", t->id);
+ #endif
free(t->data);t->data=0;
free(t);
return NULL;
if(t->id!=ST_DEFINESPRITE)
return;
if(!t->len) {
+ #ifdef DEBUG_RFXSWF
fprintf(stderr, "Error: Sprite has no ID!");
+ #endif
return;
}
if(t->len>4) {