X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswfbits.c;h=4fa38f55c0eb1d5904e16f061a35a546e3c09fe7;hb=1f86ebaac605b62901bd103b1f23b53979acc5a4;hp=220fff4976d097d6731aeb9ce86846ccb669d8e2;hpb=4a566feb5f1074db505f5f8a78c7fdf487d94b9a;p=swftools.git diff --git a/lib/modules/swfbits.c b/lib/modules/swfbits.c index 220fff4..4fa38f5 100644 --- a/lib/modules/swfbits.c +++ b/lib/modules/swfbits.c @@ -299,8 +299,8 @@ int swf_SetJPEGBitsFinish(JPEGBITS * jpegbits) return 0; } -void swf_SetJPEGBits2(TAG * tag, U16 width, U16 height, RGBA * bitmap, - int quality) +#if defined(HAVE_JPEGLIB) +void swf_SetJPEGBits2(TAG * tag, U16 width, U16 height, RGBA * bitmap, int quality) { JPEGBITS *jpeg; int y; @@ -318,8 +318,15 @@ void swf_SetJPEGBits2(TAG * tag, U16 width, U16 height, RGBA * bitmap, rfx_free(scanline); swf_SetJPEGBitsFinish(jpeg); } +#else +void swf_SetJPEGBits2(TAG * tag, U16 width, U16 height, RGBA * bitmap, int quality) +{ + fprintf(stderr, "Error: swftools compiled without jpeglib\n"); + return -1; +} +#endif -void swf_GetJPEGSize(char *fname, int *width, int *height) +void swf_GetJPEGSize(const char *fname, int *width, int *height) { struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; @@ -340,7 +347,7 @@ void swf_GetJPEGSize(char *fname, int *width, int *height) fclose(fi); } -int swf_SetJPEGBits(TAG * t, char *fname, int quality) +int swf_SetJPEGBits(TAG * t, const char *fname, int quality) { struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; @@ -554,7 +561,8 @@ static void tag_init_source(struct jpeg_decompress_struct *cinfo) static boolean tag_fill_input_buffer(struct jpeg_decompress_struct *cinfo) { TAG *tag = (TAG *) cinfo->client_data; - if (tag->data[tag->pos + 0] == 0xff && + if (tag->pos + 4 <= tag->len && + tag->data[tag->pos + 0] == 0xff && tag->data[tag->pos + 1] == 0xd9 && tag->data[tag->pos + 2] == 0xff && tag->data[tag->pos + 3] == 0xd8) { @@ -1158,6 +1166,15 @@ int swf_SetJPEGBits3(TAG * tag, U16 width, U16 height, RGBA * bitmap, int qualit return 0; } +#else +int swf_SetJPEGBits3(TAG * tag, U16 width, U16 height, RGBA * bitmap, int quality) +{ + fprintf(stderr, "Error: swftools compiled without jpeglib\n"); + return -1; +} +#endif + + /* expects mem to be non-premultiplied */ TAG* swf_AddImage(TAG*tag, int bitid, RGBA*mem, int width, int height, int quality) { @@ -1169,6 +1186,7 @@ TAG* swf_AddImage(TAG*tag, int bitid, RGBA*mem, int width, int height, int quali swf_SetU16(tag1, bitid); swf_SetLosslessImage(tag1, mem, width, height); +#if defined(HAVE_JPEGLIB) /* try jpeg image */ if(has_alpha) { tag2 = swf_InsertTag(0, ST_DEFINEBITSJPEG3); @@ -1179,8 +1197,9 @@ TAG* swf_AddImage(TAG*tag, int bitid, RGBA*mem, int width, int height, int quali swf_SetU16(tag2, bitid); swf_SetJPEGBits2(tag2, width, height, mem, quality); } +#endif - if(quality>100 || (tag1 && tag1->len < tag2->len)) { + if(quality>100 || !tag2 || (tag1 && tag1->len < tag2->len)) { /* use the zlib version- it's smaller */ tag1->prev = tag; if(tag) tag->next = tag1; @@ -1196,8 +1215,6 @@ TAG* swf_AddImage(TAG*tag, int bitid, RGBA*mem, int width, int height, int quali return tag; } -#endif - RGBA *swf_ExtractImage(TAG * tag, int *dwidth, int *dheight) { RGBA *img; @@ -1366,6 +1383,97 @@ static void decodeMonochromeImage(RGBA*data, int width, int height, RGBA*colors) } } +static void blurImage(RGBA*src, int width, int height, int r) +{ + int e = 2; // r times e is the sampling interval + double*gauss = (double*)malloc(r*e*sizeof(double)); + double sum=0; + int x; + for(x=0;x> 16; + d[x].g = g >> 16; + d[x].b = b >> 16; + d[x].a = a >> 16; + } + for(x=width-range;x> 16; + d[yy].g = g >> 16; + d[yy].b = b >> 16; + d[yy].a = a >> 16; + yy += width; + } + for(y=0;y4) { + /* high-resolution monochrome images are usually dithered, so + low-pass filter them first to get rid of any moire patterns */ + blurImage(data, width, height, r+1); + } } tmpline = (rgba_int_t*)malloc(width*sizeof(rgba_int_t));