added \n to error messages
[swftools.git] / lib / modules / swfbits.c
index bbd8641..90c8549 100644 (file)
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
 
+#include <stdlib.h>
+#include <stdio.h>
+#include <memory.h>
+#include "../../config.h"
+#ifdef HAVE_ZLIB
+#include <zconf.h>
+#include <zlib.h>
+#endif
+#include <fcntl.h>
+#include <ctype.h>
+
+#ifdef HAVE_JPEGLIB
+#define HAVE_BOOLEAN
 #ifdef __cplusplus
 extern "C" {
 #endif
-#include "jpeglib.h"
+#include <jpeglib.h>
 #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,10 +315,18 @@ 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)
+void swf_GetJPEGSize(const char *fname, int *width, int *height)
 {
     struct jpeg_decompress_struct cinfo;
     struct jpeg_error_mgr jerr;
@@ -323,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;
@@ -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 {