X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=jpeg.c;h=359a3cd08adf0fb52478b686dd97fd750c7a31ca;hb=ae92f5da727207fbeaeac0fa1f4aded67e47e19a;hp=a248948f327685779d497767c045dc4d3de7986f;hpb=27ad2d336694ea2dc50035130bae321316e3936f;p=xonotic%2Fdarkplaces.git diff --git a/jpeg.c b/jpeg.c index a248948f..359a3cd0 100644 --- a/jpeg.c +++ b/jpeg.c @@ -28,6 +28,33 @@ cvar_t sv_writepicture_quality = {CVAR_SAVE, "sv_writepicture_quality", "10", "WritePicture quality offset (higher means better quality, but slower)"}; +// jboolean is unsigned char instead of int on Win32 +#ifdef WIN32 +typedef unsigned char jboolean; +#else +typedef int jboolean; +#endif + +#ifdef LINK_TO_LIBJPEG +#include +#define qjpeg_create_compress jpeg_create_compress +#define qjpeg_create_decompress jpeg_create_decompress +#define qjpeg_destroy_compress jpeg_destroy_compress +#define qjpeg_destroy_decompress jpeg_destroy_decompress +#define qjpeg_finish_compress jpeg_finish_compress +#define qjpeg_finish_decompress jpeg_finish_decompress +#define qjpeg_resync_to_restart jpeg_resync_to_restart +#define qjpeg_read_header jpeg_read_header +#define qjpeg_read_scanlines jpeg_read_scanlines +#define qjpeg_set_defaults jpeg_set_defaults +#define qjpeg_set_quality jpeg_set_quality +#define qjpeg_start_compress jpeg_start_compress +#define qjpeg_start_decompress jpeg_start_decompress +#define qjpeg_std_error jpeg_std_error +#define qjpeg_write_scanlines jpeg_write_scanlines +#define qjpeg_simple_progression jpeg_simple_progression +#define jpeg_dll true +#else /* ================================================================= @@ -39,18 +66,12 @@ cvar_t sv_writepicture_quality = {CVAR_SAVE, "sv_writepicture_quality", "10", "W ================================================================= */ -// jboolean is unsigned char instead of int on Win32 -#ifdef WIN32 -typedef unsigned char jboolean; -#else -typedef int jboolean; -#endif - -#define JPEG_LIB_VERSION 62 // Version 6b - typedef void *j_common_ptr; typedef struct jpeg_compress_struct *j_compress_ptr; typedef struct jpeg_decompress_struct *j_decompress_ptr; + +#define JPEG_LIB_VERSION 62 // Version 6b + typedef enum { JCS_UNKNOWN, @@ -82,16 +103,16 @@ typedef unsigned int JDIMENSION; struct jpeg_memory_mgr { void* (*alloc_small) (j_common_ptr cinfo, int pool_id, size_t sizeofobject); - void (*alloc_large) (); - void (*alloc_sarray) (); - void (*alloc_barray) (); - void (*request_virt_sarray) (); - void (*request_virt_barray) (); - void (*realize_virt_arrays) (); - void (*access_virt_sarray) (); - void (*access_virt_barray) (); - void (*free_pool) (); - void (*self_destruct) (); + void (*_reserve_space_for_alloc_large) (void *dummy, ...); + void (*_reserve_space_for_alloc_sarray) (void *dummy, ...); + void (*_reserve_space_for_alloc_barray) (void *dummy, ...); + void (*_reserve_space_for_request_virt_sarray) (void *dummy, ...); + void (*_reserve_space_for_request_virt_barray) (void *dummy, ...); + void (*_reserve_space_for_realize_virt_arrays) (void *dummy, ...); + void (*_reserve_space_for_access_virt_sarray) (void *dummy, ...); + void (*_reserve_space_for_access_virt_barray) (void *dummy, ...); + void (*_reserve_space_for_free_pool) (void *dummy, ...); + void (*_reserve_space_for_self_destruct) (void *dummy, ...); long max_memory_to_use; long max_alloc_chunk; @@ -406,6 +427,7 @@ static jboolean (*qjpeg_start_compress) (j_compress_ptr cinfo, jboolean write_al 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, unsigned char** scanlines, JDIMENSION num_lines); +static void (*qjpeg_simple_progression) (j_compress_ptr cinfo); static dllfunction_t jpegfuncs[] = { @@ -424,12 +446,14 @@ static dllfunction_t jpegfuncs[] = {"jpeg_start_decompress", (void **) &qjpeg_start_decompress}, {"jpeg_std_error", (void **) &qjpeg_std_error}, {"jpeg_write_scanlines", (void **) &qjpeg_write_scanlines}, + {"jpeg_simple_progression", (void **) &qjpeg_simple_progression}, {NULL, NULL} }; // Handle for JPEG DLL dllhandle_t jpeg_dll = NULL; qboolean jpeg_tried_loading = 0; +#endif static unsigned char jpeg_eoi_marker [2] = {0xFF, JPEG_EOI}; static jmp_buf error_in_jpeg; @@ -464,11 +488,12 @@ Try to load the JPEG DLL */ qboolean JPEG_OpenLibrary (void) { +#ifdef LINK_TO_LIBJPEG + return true; +#else const char* dllnames [] = { -#if defined(WIN64) - "libjpeg64.dll", -#elif defined(WIN32) +#if defined(WIN32) "libjpeg.dll", #elif defined(MACOSX) "libjpeg.62.dylib", @@ -490,6 +515,7 @@ qboolean JPEG_OpenLibrary (void) // Load the DLL return Sys_LoadLibrary (dllnames, &jpeg_dll, jpegfuncs); +#endif } @@ -502,8 +528,10 @@ Unload the JPEG DLL */ void JPEG_CloseLibrary (void) { +#ifndef LINK_TO_LIBJPEG Sys_UnloadLibrary (&jpeg_dll); jpeg_tried_loading = false; // allow retry +#endif } @@ -804,6 +832,7 @@ qboolean JPEG_SaveImage_preflipped (const char *filename, int width, int height, cinfo.input_components = 3; qjpeg_set_defaults (&cinfo); qjpeg_set_quality (&cinfo, (int)(scr_screenshot_jpeg_quality.value * 100), TRUE); + qjpeg_simple_progression (&cinfo); // turn off subsampling (to make text look better) cinfo.optimize_coding = 1; @@ -990,6 +1019,7 @@ static CompressedImageCacheItem *CompressedImageCache_Find(const char *imagename if(i->maxsize == maxsize) if(!strcmp(i->imagename, imagename)) return i; + i = i->next; } return NULL; } @@ -1047,6 +1077,8 @@ qboolean Image_Compress(const char *imagename, size_t maxsize, void **buf, size_ // try to compress it to JPEG *buf = Z_Malloc(maxsize); *size = JPEG_SaveImage_to_Buffer((char *) *buf, maxsize, image_width, image_height, newimagedata); + Mem_Free(newimagedata); + if(!*size) { Z_Free(*buf);