X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswfbits.c;h=72e65afbacdfa5ec0e3eefd4d290894bebeddf77;hb=db09f56c8f648428f2019acbb40298fe987d6e97;hp=bbd8641c0ff745d1a8542db4d1ea2373a711e69b;hpb=6c3ab5574d31504d24710c2756899d49275c1a37;p=swftools.git diff --git a/lib/modules/swfbits.c b/lib/modules/swfbits.c index bbd8641..72e65af 100644 --- a/lib/modules/swfbits.c +++ b/lib/modules/swfbits.c @@ -21,13 +21,29 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include +#include +#include +#include "../../config.h" +#ifdef HAVE_ZLIB +#include +#include +#endif +#include +#include + +#ifdef HAVE_JPEGLIB +#define HAVE_BOOLEAN #ifdef __cplusplus extern "C" { #endif -#include "jpeglib.h" +#include #ifdef __cplusplus } #endif +#endif // HAVE_JPEGLIB + +#include "../rfxswf.h" #define OUTBUFFER_SIZE 0x8000 @@ -283,14 +299,14 @@ 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; jpeg = swf_SetJPEGBitsStart(tag, width, height, quality); + U8 *scanline = (U8*)rfx_alloc(3 * width); for (y = 0; y < height; y++) { - U8 scanline[3 * width]; int x, p = 0; for (x = 0; x < width; x++) { scanline[p++] = bitmap[width * y + x].r; @@ -299,8 +315,16 @@ void swf_SetJPEGBits2(TAG * tag, U16 width, U16 height, RGBA * bitmap, } swf_SetJPEGBitsLine(jpeg, scanline); } + 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) { @@ -1060,8 +1084,8 @@ int swf_SetJPEGBits3(TAG * tag, U16 width, U16 height, RGBA * bitmap, int qualit pos = tag->len; swf_SetU32(tag, 0); //placeholder jpeg = swf_SetJPEGBitsStart(tag, width, height, quality); + U8 *scanline = (U8*)rfx_alloc(3 * width); for (y = 0; y < height; y++) { - U8 scanline[3 * width]; int x, p = 0; for (x = 0; x < width; x++) { //int ia = bitmap[width*y+x].a; @@ -1078,6 +1102,7 @@ int swf_SetJPEGBits3(TAG * tag, U16 width, U16 height, RGBA * bitmap, int qualit } swf_SetJPEGBitsLine(jpeg, scanline); } + rfx_free(scanline); swf_SetJPEGBitsFinish(jpeg); PUT32(&tag->data[pos], tag->len - pos - 4); @@ -1092,8 +1117,8 @@ int swf_SetJPEGBits3(TAG * tag, U16 width, U16 height, RGBA * bitmap, int qualit zs.next_out = data; zs.avail_out = OUTBUFFER_SIZE; + scanline = (U8*)rfx_alloc(width); for (y = 0; y < height; y++) { - U8 scanline[width]; int x, p = 0; for (x = 0; x < width; x++) { scanline[p++] = bitmap[width * y + x].a; @@ -1117,6 +1142,8 @@ int swf_SetJPEGBits3(TAG * tag, U16 width, U16 height, RGBA * bitmap, int qualit } } + rfx_free(scanline); + while (1) { int ret = deflate(&zs, Z_FINISH); if (ret != Z_OK && ret != Z_STREAM_END) { @@ -1138,6 +1165,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) { @@ -1149,6 +1185,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); @@ -1159,25 +1196,24 @@ 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; tag = tag1; - swf_DeleteTag(tag2); + swf_DeleteTag(0, tag2); } else { /* use the jpeg version- it's smaller */ tag2->prev = tag; if(tag) tag->next = tag2; tag = tag2; - swf_DeleteTag(tag1); + swf_DeleteTag(0, tag1); } return tag; } -#endif - RGBA *swf_ExtractImage(TAG * tag, int *dwidth, int *dheight) { RGBA *img; @@ -1240,7 +1276,7 @@ void swf_RemoveJPEGTables(SWF * swf) } if (swf->firstTag == tables_tag) swf->firstTag = tables_tag->next; - swf_DeleteTag(tables_tag); + swf_DeleteTag(swf, tables_tag); } typedef struct scale_lookup {