From a1955cb141dd5c7caca94304480c335593804f29 Mon Sep 17 00:00:00 2001 From: kramm Date: Sun, 21 Jan 2007 18:58:01 +0000 Subject: [PATCH] initial revision --- lib/modules/swffilter.c | 145 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 lib/modules/swffilter.c diff --git a/lib/modules/swffilter.c b/lib/modules/swffilter.c new file mode 100644 index 0000000..4a47474 --- /dev/null +++ b/lib/modules/swffilter.c @@ -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;sgradient->num;s++) + swf_SetRGBA(tag, &f->gradient->rgba[s]); + for(s=0;sgradient->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;sgradient->num;s++) + swf_GetRGBA(tag, &f->gradient->rgba[s]); + for(s=0;sgradient->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; +} -- 1.7.10.4