X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=jpeg.c;h=965f7c875edf36780d9edfb62281e3c4bcc333cf;hb=3f4d89c11594f247887a62a78877a36f85fdd2ee;hp=6b21c232a5a5df5c13d2c3dded8c6aa04ad7fd53;hpb=e1229ad9d6f49317dd8a9fa895f2d937badde185;p=xonotic%2Fdarkplaces.git diff --git a/jpeg.c b/jpeg.c index 6b21c232..965f7c87 100644 --- a/jpeg.c +++ b/jpeg.c @@ -25,9 +25,37 @@ #include "quakedef.h" #include "image.h" #include "jpeg.h" +#include "image_png.h" 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 +67,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 +104,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 +428,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 +447,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 +489,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 +516,7 @@ qboolean JPEG_OpenLibrary (void) // Load the DLL return Sys_LoadLibrary (dllnames, &jpeg_dll, jpegfuncs); +#endif } @@ -502,8 +529,10 @@ Unload the JPEG DLL */ void JPEG_CloseLibrary (void) { +#ifndef LINK_TO_LIBJPEG Sys_UnloadLibrary (&jpeg_dll); jpeg_tried_loading = false; // allow retry +#endif } @@ -650,7 +679,7 @@ unsigned char* JPEG_LoadImage_BGRA (const unsigned char *f, int filesize) line++; } - Mem_Free (scanline); + Mem_Free (scanline); scanline = NULL; qjpeg_finish_decompress (&cinfo); qjpeg_destroy_decompress (&cinfo); @@ -757,7 +786,7 @@ static void JPEG_MemDest (j_compress_ptr cinfo, void* buf, size_t bufsize) dest->pub.term_destination = JPEG_Mem_TermDestination; dest->outfile = NULL; - dest->buffer = buf; + dest->buffer = (unsigned char *) buf; dest->bufsize = bufsize; } @@ -785,7 +814,7 @@ qboolean JPEG_SaveImage_preflipped (const char *filename, int width, int height, } // Open the file - file = FS_Open (filename, "wb", true, false); + file = FS_OpenRealFile(filename, "wb", true); if (!file) return false; @@ -804,6 +833,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; @@ -970,7 +1000,7 @@ static void CompressedImageCache_Add(const char *imagename, size_t maxsize, void if(strlen(imagename) >= MAX_QPATH) return; // can't add this - i = Z_Malloc(sizeof(CompressedImageCacheItem)); + i = (CompressedImageCacheItem*) Z_Malloc(sizeof(CompressedImageCacheItem)); strlcpy(i->imagename, imagename, sizeof(i->imagename)); i->maxsize = maxsize; i->compressed = compressed; @@ -990,6 +1020,7 @@ static CompressedImageCacheItem *CompressedImageCache_Find(const char *imagename if(i->maxsize == maxsize) if(!strcmp(i->imagename, imagename)) return i; + i = i->next; } return NULL; } @@ -1002,6 +1033,7 @@ qboolean Image_Compress(const char *imagename, size_t maxsize, void **buf, size_ CompressedImageCacheItem *i; JPEG_OpenLibrary (); // for now; LH had the idea of replacing this by a better format + PNG_OpenLibrary (); // for loading // No DLL = no JPEGs if (!jpeg_dll) @@ -1018,7 +1050,7 @@ qboolean Image_Compress(const char *imagename, size_t maxsize, void **buf, size_ } // load the image - imagedata = loadimagepixelsbgra(imagename, true, false); + imagedata = loadimagepixelsbgra(imagename, true, false, false); if(!imagedata) return false; @@ -1038,7 +1070,7 @@ qboolean Image_Compress(const char *imagename, size_t maxsize, void **buf, size_ Image_MipReduce32(imagedata, imagedata, &image_width, &image_height, &one, image_width/2, image_height/2, 1); } - newimagedata = Mem_Alloc(tempmempool, image_width * image_height * 3); + newimagedata = (unsigned char *) Mem_Alloc(tempmempool, image_width * image_height * 3); // convert the image from BGRA to RGB Image_CopyMux(newimagedata, imagedata, image_width, image_height, false, false, false, 3, 4, components); @@ -1046,7 +1078,9 @@ 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(*buf, maxsize, image_width, image_height, newimagedata); + *size = JPEG_SaveImage_to_Buffer((char *) *buf, maxsize, image_width, image_height, newimagedata); + Mem_Free(newimagedata); + if(!*size) { Z_Free(*buf);