]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - jpeg.c
patch from div0 that enables printf format warnings in gcc
[xonotic/darkplaces.git] / jpeg.c
diff --git a/jpeg.c b/jpeg.c
index ba1d8913aebcbe94d8d7ab19a784a575f6f32de5..c85c90a681f825e586cd87d9898a25e2979b097e 100644 (file)
--- a/jpeg.c
+++ b/jpeg.c
@@ -38,9 +38,9 @@
 =================================================================
 */
 
-// jboolean is qbyte instead of int on Win32
+// jboolean is unsigned char instead of int on Win32
 #ifdef WIN32
-typedef qbyte jboolean;
+typedef unsigned char jboolean;
 #else
 typedef int jboolean;
 #endif
@@ -119,7 +119,7 @@ struct jpeg_error_mgr
 
 struct jpeg_source_mgr
 {
-       const qbyte *next_input_byte;
+       const unsigned char *next_input_byte;
        size_t bytes_in_buffer;
 
        void (*init_source) (j_decompress_ptr cinfo);
@@ -186,18 +186,18 @@ struct jpeg_decompress_struct
        void *comp_info;
        jboolean progressive_mode;
        jboolean arith_code;
-       qbyte arith_dc_L[NUM_ARITH_TBLS];
-       qbyte arith_dc_U[NUM_ARITH_TBLS];
-       qbyte arith_ac_K[NUM_ARITH_TBLS];
+       unsigned char arith_dc_L[NUM_ARITH_TBLS];
+       unsigned char arith_dc_U[NUM_ARITH_TBLS];
+       unsigned char arith_ac_K[NUM_ARITH_TBLS];
        unsigned int restart_interval;
        jboolean saw_JFIF_marker;
-       qbyte JFIF_major_version;
-       qbyte JFIF_minor_version;
-       qbyte density_unit;
+       unsigned char JFIF_major_version;
+       unsigned char JFIF_minor_version;
+       unsigned char density_unit;
        unsigned short X_density;
        unsigned short Y_density;
        jboolean saw_Adobe_marker;
-       qbyte Adobe_transform;
+       unsigned char Adobe_transform;
        jboolean CCIR601_sampling;
        void *marker_list;
        int max_h_samp_factor;
@@ -250,9 +250,9 @@ struct jpeg_compress_struct
        void *quant_tbl_ptrs[NUM_QUANT_TBLS];
        void *dc_huff_tbl_ptrs[NUM_HUFF_TBLS];
        void *ac_huff_tbl_ptrs[NUM_HUFF_TBLS];
-       qbyte arith_dc_L[NUM_ARITH_TBLS];
-       qbyte arith_dc_U[NUM_ARITH_TBLS];
-       qbyte arith_ac_K[NUM_ARITH_TBLS];
+       unsigned char arith_dc_L[NUM_ARITH_TBLS];
+       unsigned char arith_dc_U[NUM_ARITH_TBLS];
+       unsigned char arith_ac_K[NUM_ARITH_TBLS];
 
        int num_scans;
        const void *scan_info;
@@ -267,9 +267,9 @@ struct jpeg_compress_struct
        int restart_in_rows;
 
        jboolean write_JFIF_header;
-       qbyte JFIF_major_version;
-       qbyte JFIF_minor_version;
-       qbyte density_unit;
+       unsigned char JFIF_major_version;
+       unsigned char JFIF_minor_version;
+       unsigned char density_unit;
        unsigned short X_density;
        unsigned short Y_density;
        jboolean write_Adobe_marker;
@@ -302,7 +302,7 @@ struct jpeg_compress_struct
 
 struct jpeg_destination_mgr
 {
-       qbyte* next_output_byte;
+       unsigned char* next_output_byte;
        size_t free_in_buffer;
 
        void (*init_destination) (j_compress_ptr cinfo);
@@ -333,13 +333,13 @@ static void (*qjpeg_finish_compress) (j_compress_ptr cinfo);
 static jboolean (*qjpeg_finish_decompress) (j_decompress_ptr cinfo);
 static jboolean (*qjpeg_resync_to_restart) (j_decompress_ptr cinfo, int desired);
 static int (*qjpeg_read_header) (j_decompress_ptr cinfo, jboolean require_image);
-static JDIMENSION (*qjpeg_read_scanlines) (j_decompress_ptr cinfo, qbyte** scanlines, JDIMENSION max_lines);
+static JDIMENSION (*qjpeg_read_scanlines) (j_decompress_ptr cinfo, unsigned char** scanlines, JDIMENSION max_lines);
 static void (*qjpeg_set_defaults) (j_compress_ptr cinfo);
 static void (*qjpeg_set_quality) (j_compress_ptr cinfo, int quality, jboolean force_baseline);
 static jboolean (*qjpeg_start_compress) (j_compress_ptr cinfo, jboolean write_all_tables);
 static jboolean (*qjpeg_start_decompress) (j_decompress_ptr cinfo);
 static struct jpeg_error_mgr* (*qjpeg_std_error) (struct jpeg_error_mgr *err);
-static JDIMENSION (*qjpeg_write_scanlines) (j_compress_ptr cinfo, qbyte** scanlines, JDIMENSION num_lines);
+static JDIMENSION (*qjpeg_write_scanlines) (j_compress_ptr cinfo, unsigned char** scanlines, JDIMENSION num_lines);
 
 static dllfunction_t jpegfuncs[] =
 {
@@ -364,7 +364,7 @@ static dllfunction_t jpegfuncs[] =
 // Handle for JPEG DLL
 dllhandle_t jpeg_dll = NULL;
 
-static qbyte jpeg_eoi_marker [2] = {0xFF, JPEG_EOI};
+static unsigned char jpeg_eoi_marker [2] = {0xFF, JPEG_EOI};
 static qboolean error_in_jpeg;
 
 // Our own output manager for JPEG compression
@@ -373,7 +373,7 @@ typedef struct
        struct jpeg_destination_mgr pub;
 
        qfile_t* outfile;
-       qbyte* buffer;
+       unsigned char* buffer;
 } my_destination_mgr;
 typedef my_destination_mgr* my_dest_ptr;
 
@@ -395,23 +395,27 @@ Try to load the JPEG DLL
 */
 qboolean JPEG_OpenLibrary (void)
 {
-       const char* dllname;
+       const char* dllnames [] =
+       {
+#if defined(WIN64)
+               "libjpeg64.dll",
+#elif defined(WIN32)
+               "libjpeg.dll",
+#elif defined(MACOSX)
+               "libjpeg.62.dylib",
+#else
+               "libjpeg.so.62",
+               "libjpeg.so",
+#endif
+               NULL
+       };
 
        // Already loaded?
        if (jpeg_dll)
                return true;
 
-// TODO: make Sys_LoadLibrary support multiple names
-#ifdef WIN32
-       dllname = "libjpeg.dll";
-#elif defined(__FreeBSD__)
-       dllname = "libjpeg.so";
-#else
-       dllname = "libjpeg.so.62";
-#endif
-
        // Load the DLL
-       if (! Sys_LoadLibrary (dllname, &jpeg_dll, jpegfuncs))
+       if (! Sys_LoadLibrary (dllnames, &jpeg_dll, jpegfuncs))
        {
                Con_Printf ("JPEG support disabled\n");
                return false;
@@ -466,12 +470,12 @@ static void JPEG_SkipInputData (j_decompress_ptr cinfo, long num_bytes)
     cinfo->src->bytes_in_buffer -= num_bytes;
 }
 
-static void JPEG_MemSrc (j_decompress_ptr cinfo, qbyte *buffer)
+static void JPEG_MemSrc (j_decompress_ptr cinfo, const unsigned char *buffer, size_t filesize)
 {
-       cinfo->src = cinfo->mem->alloc_small ((j_common_ptr) cinfo, JPOOL_PERMANENT, sizeof (struct jpeg_source_mgr));
+       cinfo->src = (struct jpeg_source_mgr *)cinfo->mem->alloc_small ((j_common_ptr) cinfo, JPOOL_PERMANENT, sizeof (struct jpeg_source_mgr));
 
        cinfo->src->next_input_byte = buffer;
-       cinfo->src->bytes_in_buffer = fs_filesize;
+       cinfo->src->bytes_in_buffer = filesize;
 
        cinfo->src->init_source = JPEG_Noop;
        cinfo->src->fill_input_buffer = JPEG_FillInputBuffer;
@@ -494,11 +498,11 @@ JPEG_LoadImage
 Load a JPEG image into a RGBA buffer
 ====================
 */
-qbyte* JPEG_LoadImage (qbyte *f, int matchwidth, int matchheight)
+unsigned char* JPEG_LoadImage (const unsigned char *f, int filesize, int matchwidth, int matchheight)
 {
        struct jpeg_decompress_struct cinfo;
        struct jpeg_error_mgr jerr;
-       qbyte *image_rgba, *scanline;
+       unsigned char *image_rgba, *scanline;
        unsigned int line;
 
        // No DLL = no JPEGs
@@ -507,7 +511,7 @@ qbyte* JPEG_LoadImage (qbyte *f, int matchwidth, int matchheight)
 
        cinfo.err = qjpeg_std_error (&jerr);
        qjpeg_create_decompress (&cinfo);
-       JPEG_MemSrc (&cinfo, f);
+       JPEG_MemSrc (&cinfo, f, filesize);
        qjpeg_read_header (&cinfo, TRUE);
        qjpeg_start_decompress (&cinfo);
 
@@ -526,12 +530,14 @@ qbyte* JPEG_LoadImage (qbyte *f, int matchwidth, int matchheight)
                return NULL;
        }
 
-       image_rgba = Mem_Alloc(tempmempool, image_width * image_height * 4);
-       scanline = Mem_Alloc(tempmempool, image_width * cinfo.output_components);
+       image_rgba = (unsigned char *)Mem_Alloc(tempmempool, image_width * image_height * 4);
+       scanline = (unsigned char *)Mem_Alloc(tempmempool, image_width * cinfo.output_components);
        if (!image_rgba || !scanline)
        {
-               if (!image_rgba)
+               if (image_rgba)
                        Mem_Free (image_rgba);
+               if (scanline)
+                       Mem_Free (scanline);
 
                Con_Printf("JPEG_LoadImage: not enough memory for %i by %i image\n", image_width, image_height);
                qjpeg_finish_decompress (&cinfo);
@@ -543,7 +549,7 @@ qbyte* JPEG_LoadImage (qbyte *f, int matchwidth, int matchheight)
        line = 0;
        while (cinfo.output_scanline < cinfo.output_height)
        {
-               qbyte *buffer_ptr;
+               unsigned char *buffer_ptr;
                int ind;
 
                qjpeg_read_scanlines (&cinfo, &scanline, 1);
@@ -599,7 +605,7 @@ qbyte* JPEG_LoadImage (qbyte *f, int matchwidth, int matchheight)
 static void JPEG_InitDestination (j_compress_ptr cinfo)
 {
        my_dest_ptr dest = (my_dest_ptr)cinfo->dest;
-       dest->buffer = (qbyte*)cinfo->mem->alloc_small ((j_common_ptr) cinfo, JPOOL_IMAGE, JPEG_OUTPUT_BUF_SIZE * sizeof(qbyte));
+       dest->buffer = (unsigned char*)cinfo->mem->alloc_small ((j_common_ptr) cinfo, JPOOL_IMAGE, JPEG_OUTPUT_BUF_SIZE * sizeof(unsigned char));
        dest->pub.next_output_byte = dest->buffer;
        dest->pub.free_in_buffer = JPEG_OUTPUT_BUF_SIZE;
 }
@@ -626,7 +632,7 @@ static void JPEG_TermDestination (j_compress_ptr cinfo)
 
        // Write any data remaining in the buffer
        if (datacount > 0)
-               if (FS_Write (dest->outfile, dest->buffer, datacount) != datacount)
+               if (FS_Write (dest->outfile, dest->buffer, datacount) != (fs_offset_t)datacount)
                        error_in_jpeg = true;
 }
 
@@ -653,11 +659,11 @@ JPEG_SaveImage_preflipped
 Save a preflipped JPEG image to a file
 ====================
 */
-qboolean JPEG_SaveImage_preflipped (const char *filename, int width, int height, qbyte *data)
+qboolean JPEG_SaveImage_preflipped (const char *filename, int width, int height, unsigned char *data)
 {
        struct jpeg_compress_struct cinfo;
        struct jpeg_error_mgr jerr;
-       qbyte *scanline;
+       unsigned char *scanline;
        unsigned int offset, linesize;
        qfile_t* file;
 
@@ -669,7 +675,7 @@ qboolean JPEG_SaveImage_preflipped (const char *filename, int width, int height,
        }
 
        // Open the file
-       file = FS_Open (filename, "wb", true);
+       file = FS_Open (filename, "wb", true, false);
        if (!file)
                return false;
 
@@ -686,7 +692,7 @@ qboolean JPEG_SaveImage_preflipped (const char *filename, int width, int height,
        cinfo.in_color_space = JCS_RGB;
        cinfo.input_components = 3;
        qjpeg_set_defaults (&cinfo);
-       qjpeg_set_quality (&cinfo, scr_screenshot_jpeg_quality.value * 100, TRUE);
+       qjpeg_set_quality (&cinfo, (int)(scr_screenshot_jpeg_quality.value * 100), TRUE);
        qjpeg_start_compress (&cinfo, true);
 
        // Compress each scanline