initial revision
authorkramm <kramm>
Sun, 21 Jan 2007 18:58:01 +0000 (18:58 +0000)
committerkramm <kramm>
Sun, 21 Jan 2007 18:58:01 +0000 (18:58 +0000)
lib/modules/swffilter.c [new file with mode: 0644]

diff --git a/lib/modules/swffilter.c b/lib/modules/swffilter.c
new file mode 100644 (file)
index 0000000..4a47474
--- /dev/null
@@ -0,0 +1,145 @@
+char* filtername[] = {"dropshadow","blur","glow","bevel","gradientglow","convolution","colormatrix","gradientbevel", 0};
+
+void swf_SetFilter(TAG*tag, FILTER*filter)
+{
+    swf_SetU8(tag, filter->type);
+    if(filter->type == FILTERTYPE_BLUR) {
+       FILTER_BLUR*f = (FILTER_BLUR*)filter;
+       swf_SetFixed(tag, f->blurx);
+       swf_SetFixed(tag, f->blury);
+       U8 flags = f->passes << 3;
+       swf_SetU8(tag, flags);
+    } else if(filter->type == FILTERTYPE_DROPSHADOW) {
+       FILTER_DROPSHADOW*f = (FILTER_DROPSHADOW*)filter;
+       swf_SetRGBA(tag, &f->color);
+       swf_SetFixed(tag, f->blurx);
+       swf_SetFixed(tag, f->blury);
+       swf_SetFixed(tag, f->angle);
+       swf_SetFixed(tag, f->distance);
+       swf_SetFixed8(tag, f->strength);
+       U8 flags = f->innershadow<<7|f->knockout<<6|f->composite<<5|f->passes;
+       swf_SetU8(tag, flags);
+    } else if(filter->type == FILTERTYPE_GRADIENTGLOW) {
+       FILTER_GRADIENTGLOW*f = (FILTER_GRADIENTGLOW*)filter;
+       swf_SetU8(tag, f->gradient->num);
+       int s;
+       for(s=0;s<f->gradient->num;s++)
+           swf_SetRGBA(tag, &f->gradient->rgba[s]);
+       for(s=0;s<f->gradient->num;s++)
+           swf_SetU8(tag, f->gradient->ratios[s]);
+
+       swf_SetFixed(tag, f->blurx);
+       swf_SetFixed(tag, f->blury);
+       swf_SetFixed(tag, f->angle);
+       swf_SetFixed(tag, f->distance);
+       swf_SetFixed8(tag, f->strength);
+       U8 flags = f->passes|f->innershadow<<7|f->knockout<<6|f->composite<<5|f->ontop<<4;
+       swf_SetU8(tag, flags);
+    } else if(filter->type == FILTERTYPE_BEVEL) {
+       FILTER_BEVEL*f = (FILTER_BEVEL*)filter;
+       swf_SetRGBA(tag, &f->shadow);
+       swf_SetRGBA(tag, &f->highlight);
+       swf_SetFixed(tag, f->blurx);
+       swf_SetFixed(tag, f->blury);
+       swf_SetFixed(tag, f->angle);
+       swf_SetFixed(tag, f->distance);
+       swf_SetFixed8(tag, f->strength);
+       U8 flags = f->passes|f->innershadow<<7|f->knockout<<6|f->composite<<5|f->ontop<<4;
+       swf_SetU8(tag, flags);
+    } else {
+       fprintf(stderr, "Writing of filter type %02x not supported yet\n", filter->type);
+    }
+}
+
+FILTER*swf_GetFilter(TAG*tag)
+{
+    U8 type = swf_GetU8(tag);
+    FILTER*filter;
+    if(type == FILTERTYPE_BLUR) {
+       FILTER_BLUR* f = 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_GRADIENTGLOW) {
+       FILTER_GRADIENTGLOW* f = rfx_calloc(sizeof(FILTER_GRADIENTGLOW));
+       f->type = type;
+       f->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);
+       int s;
+       for(s=0;s<f->gradient->num;s++)
+           swf_GetRGBA(tag, &f->gradient->rgba[s]);
+       for(s=0;s<f->gradient->num;s++)
+           f->gradient->ratios[s] = swf_GetU8(tag);
+       
+       f->blurx = swf_GetFixed(tag);
+       f->blury = swf_GetFixed(tag);
+       f->angle = swf_GetFixed(tag);
+       f->distance = swf_GetFixed(tag);
+       f->strength = swf_GetFixed8(tag);
+       U8 flags = swf_GetU8(tag);
+       f->passes = flags&15;
+       f->innershadow = (flags>>7)&1;
+       f->knockout = (flags>>6)&1;
+       f->composite = (flags>>5)&1;
+       f->ontop = (flags>>4)&1;
+       return (FILTER*)f;
+    } else if(type == FILTERTYPE_DROPSHADOW) {
+       FILTER_DROPSHADOW* f = rfx_calloc(sizeof(FILTER_DROPSHADOW));
+       f->type = type;
+       swf_GetRGBA(tag, &f->color);
+       f->blurx = swf_GetFixed(tag);
+       f->blury = swf_GetFixed(tag);
+       f->angle = swf_GetFixed(tag);
+       f->distance = swf_GetFixed(tag);
+       f->strength = swf_GetFixed8(tag);
+       U8 flags = swf_GetU8(tag);
+       f->passes = flags&31;
+       f->innershadow = (flags>>7)&1;
+       f->knockout = (flags>>6)&1;
+       f->composite = (flags>>5)&1;
+       return (FILTER*)f;
+    } else if(type == FILTERTYPE_BEVEL) {
+       FILTER_BEVEL* f = rfx_calloc(sizeof(FILTER_BEVEL));
+       f->type = type;
+       swf_GetRGBA(tag, &f->shadow);
+       swf_GetRGBA(tag, &f->highlight);
+       f->blurx = swf_GetFixed(tag);
+       f->blury = swf_GetFixed(tag);
+       f->angle = swf_GetFixed(tag);
+       f->distance = swf_GetFixed(tag);
+       f->strength = swf_GetFixed8(tag);
+       U8 flags = swf_GetU8(tag);
+       f->passes = flags&15;
+       f->innershadow = (flags>>7)&1;
+       f->knockout = (flags>>6)&1;
+       f->composite = (flags>>5)&1;
+       f->ontop = (flags>>4)&1;
+       return (FILTER*)f;
+    } else {
+       fprintf(stderr, "Reading of filter type %02x not supported yet\n", type);
+    }
+    return 0;
+}
+
+FILTER*swf_NewFilter(U8 type)
+{
+    FILTER*f = 0;
+    if(type == FILTERTYPE_BLUR)
+       f = rfx_calloc(sizeof(FILTER_BLUR));
+    else if(type == FILTERTYPE_GRADIENTGLOW)
+       f = rfx_calloc(sizeof(FILTER_GRADIENTGLOW));
+    else if(type == FILTERTYPE_DROPSHADOW)
+       f = rfx_calloc(sizeof(FILTER_DROPSHADOW));
+    else if(type == FILTERTYPE_BEVEL)
+       f = 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;
+}