#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 <jpeglib.h>
+#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
/*
=================================================================
=================================================================
*/
-// 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,
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;
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[] =
{
{"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;
*/
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",
// Load the DLL
return Sys_LoadLibrary (dllnames, &jpeg_dll, jpegfuncs);
+#endif
}
*/
void JPEG_CloseLibrary (void)
{
+#ifndef LINK_TO_LIBJPEG
Sys_UnloadLibrary (&jpeg_dll);
jpeg_tried_loading = false; // allow retry
+#endif
}
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;
if(i->maxsize == maxsize)
if(!strcmp(i->imagename, imagename))
return i;
+ i = i->next;
}
return NULL;
}
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)
}
// load the image
- imagedata = loadimagepixelsbgra(imagename, true, false);
+ imagedata = loadimagepixelsbgra(imagename, true, false, false);
if(!imagedata)
return false;
// 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);