From 1fd32055c18aeabc8e40474c3bc4a927caf55cb4 Mon Sep 17 00:00:00 2001 From: kramm Date: Sun, 21 Jan 2007 18:59:18 +0000 Subject: [PATCH] fixes in swf_GetString and swf_GetGradient, added FIXED types --- lib/rfxswf.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 49 insertions(+), 11 deletions(-) diff --git a/lib/rfxswf.c b/lib/rfxswf.c index ad3ad21..acec565 100644 --- a/lib/rfxswf.c +++ b/lib/rfxswf.c @@ -82,7 +82,7 @@ void swf_SetTagPos(TAG * t,U32 pos) 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) { @@ -93,7 +93,7 @@ char* swf_GetString(TAG*t) } t->data[t->len] = 0; } - return str; + return (char*)&(t->data[pos]); } U8 swf_GetU8(TAG * t) @@ -260,6 +260,29 @@ int swf_SetBits(TAG * t,U32 v,int nbits) // 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) +{ + swf_SetU16(t, (U16)((f-(int)f)*65536)); + swf_SetU16(t, (U16)f); +} +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) +{ + swf_SetU8(t, (U8)((f-(int)f)*256)); + swf_SetU8(t, (U8)f); +} + int swf_SetRGB(TAG * t,RGBA * col) { if (!t) return -1; if (col) @@ -309,19 +332,24 @@ void swf_GetGradient(TAG * tag, GRADIENT * gradient, char alpha) memset(gradient, 0, sizeof(GRADIENT)); return; } - if(!gradient) - gradient = &dummy; - gradient->num = swf_GetU8(tag); + U8 num = swf_GetU8(tag); + 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;tnum;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; + } } } @@ -343,6 +371,15 @@ void swf_SetGradient(TAG * tag, GRADIENT * gradient, char alpha) } } +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; @@ -1482,3 +1519,4 @@ void swf_FreeTags(SWF * swf) // Frees all malloc'ed memory for t #include "modules/swfsound.c" #include "modules/swfdraw.c" #include "modules/swfrender.c" +#include "modules/swffilter.c" -- 1.7.10.4