more horizontal refactoring
[swftools.git] / lib / modules / swffilter.c
index 4a47474..02ef5db 100644 (file)
@@ -1,3 +1,7 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include "../rfxswf.h"
+
 char* filtername[] = {"dropshadow","blur","glow","bevel","gradientglow","convolution","colormatrix","gradientbevel", 0};
 
 void swf_SetFilter(TAG*tag, FILTER*filter)
@@ -9,6 +13,8 @@ void swf_SetFilter(TAG*tag, FILTER*filter)
        swf_SetFixed(tag, f->blury);
        U8 flags = f->passes << 3;
        swf_SetU8(tag, flags);
+    } else if(filter->type == FILTERTYPE_GLOW) {
+       FILTER_GLOW*f = (FILTER_GLOW*)filter;
     } else if(filter->type == FILTERTYPE_DROPSHADOW) {
        FILTER_DROPSHADOW*f = (FILTER_DROPSHADOW*)filter;
        swf_SetRGBA(tag, &f->color);
@@ -56,20 +62,33 @@ FILTER*swf_GetFilter(TAG*tag)
     U8 type = swf_GetU8(tag);
     FILTER*filter;
     if(type == FILTERTYPE_BLUR) {
-       FILTER_BLUR* f = rfx_calloc(sizeof(FILTER_BLUR));
+       FILTER_BLUR* f = (FILTER_BLUR*)rfx_calloc(sizeof(FILTER_BLUR));
        f->type = type;
        f->blurx = swf_GetFixed(tag);
        f->blury = swf_GetFixed(tag);
        U8 flags = swf_GetU8(tag);
        f->passes = (flags&15)<<3;
        return (FILTER*)f;
+    } else if(type == FILTERTYPE_GLOW) {
+       FILTER_GLOW* f = (FILTER_GLOW*)rfx_calloc(sizeof(FILTER_GLOW));
+       f->type = type;
+       swf_GetRGBA(tag, &f->rgba);
+       f->blurx = swf_GetFixed(tag);
+       f->blury = swf_GetFixed(tag);
+       f->strength = swf_GetFixed8(tag);
+       U8 flags = swf_GetU8(tag);
+       f->passes = flags&31;
+       f->innerglow = (flags>>7)&1;
+       f->knockout = (flags>>6)&1;
+       f->composite = (flags>>5)&1;
+       return (FILTER*)f;
     } else if(type == FILTERTYPE_GRADIENTGLOW) {
-       FILTER_GRADIENTGLOW* f = rfx_calloc(sizeof(FILTER_GRADIENTGLOW));
+       FILTER_GRADIENTGLOW* f = (FILTER_GRADIENTGLOW*)rfx_calloc(sizeof(FILTER_GRADIENTGLOW));
        f->type = type;
-       f->gradient = rfx_calloc(sizeof(GRADIENT));
+       f->gradient = (GRADIENT*)rfx_calloc(sizeof(GRADIENT));
        f->gradient->num = swf_GetU8(tag);
-       f->gradient->rgba = rfx_calloc(sizeof(RGBA)*f->gradient->num);
-       f->gradient->ratios = rfx_calloc(sizeof(U8)*f->gradient->num);
+       f->gradient->rgba = (RGBA*)rfx_calloc(sizeof(RGBA)*f->gradient->num);
+       f->gradient->ratios = (U8*)rfx_calloc(sizeof(U8)*f->gradient->num);
        int s;
        for(s=0;s<f->gradient->num;s++)
            swf_GetRGBA(tag, &f->gradient->rgba[s]);
@@ -89,7 +108,7 @@ FILTER*swf_GetFilter(TAG*tag)
        f->ontop = (flags>>4)&1;
        return (FILTER*)f;
     } else if(type == FILTERTYPE_DROPSHADOW) {
-       FILTER_DROPSHADOW* f = rfx_calloc(sizeof(FILTER_DROPSHADOW));
+       FILTER_DROPSHADOW* f = (FILTER_DROPSHADOW*)rfx_calloc(sizeof(FILTER_DROPSHADOW));
        f->type = type;
        swf_GetRGBA(tag, &f->color);
        f->blurx = swf_GetFixed(tag);
@@ -104,7 +123,7 @@ FILTER*swf_GetFilter(TAG*tag)
        f->composite = (flags>>5)&1;
        return (FILTER*)f;
     } else if(type == FILTERTYPE_BEVEL) {
-       FILTER_BEVEL* f = rfx_calloc(sizeof(FILTER_BEVEL));
+       FILTER_BEVEL* f = (FILTER_BEVEL*)rfx_calloc(sizeof(FILTER_BEVEL));
        f->type = type;
        swf_GetRGBA(tag, &f->shadow);
        swf_GetRGBA(tag, &f->highlight);
@@ -130,16 +149,22 @@ FILTER*swf_NewFilter(U8 type)
 {
     FILTER*f = 0;
     if(type == FILTERTYPE_BLUR)
-       f = rfx_calloc(sizeof(FILTER_BLUR));
+       f = (FILTER*)rfx_calloc(sizeof(FILTER_BLUR));
     else if(type == FILTERTYPE_GRADIENTGLOW)
-       f = rfx_calloc(sizeof(FILTER_GRADIENTGLOW));
+       f = (FILTER*)rfx_calloc(sizeof(FILTER_GRADIENTGLOW));
     else if(type == FILTERTYPE_DROPSHADOW)
-       f = rfx_calloc(sizeof(FILTER_DROPSHADOW));
+       f = (FILTER*)rfx_calloc(sizeof(FILTER_DROPSHADOW));
     else if(type == FILTERTYPE_BEVEL)
-       f = rfx_calloc(sizeof(FILTER_BEVEL));
+       f = (FILTER*)rfx_calloc(sizeof(FILTER_BEVEL));
     else 
        fprintf(stderr, "Creation of filter type %02x not supported yet\n", type);
     if(f)
        f->type = type;
     return f;
 }
+
+void swf_DeleteFilter(FILTER*f)
+{
+    //FIXME
+    free(f);
+}