#include "quakedef.h"
+#include "image.h"
#include "jpeg.h"
*/
qboolean JPEG_OpenLibrary (void)
{
- const char* dllname;
- const dllfunction_t *func;
+ 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;
-#ifdef WIN32
- dllname = "libjpeg.dll";
-#else
- dllname = "libjpeg.so.62";
-#endif
-
- // Initializations
- for (func = jpegfuncs; func && func->name != NULL; func++)
- *func->funcvariable = NULL;
-
// Load the DLL
- if (! (jpeg_dll = Sys_LoadLibrary (dllname)))
+ if (! Sys_LoadLibrary (dllnames, &jpeg_dll, jpegfuncs))
{
- Con_Printf ("Can't find %s. JPEG support disabled\n", dllname);
+ Con_Printf ("JPEG support disabled\n");
return false;
}
- // Get the function adresses
- for (func = jpegfuncs; func && func->name != NULL; func++)
- if (!(*func->funcvariable = (void *) Sys_GetProcAddress (jpeg_dll, func->name)))
- {
- Con_Printf ("missing function \"%s\" - broken JPEG library!\n", func->name);
- JPEG_CloseLibrary ();
- return false;
- }
-
- Con_Printf ("%s loaded. JPEG support enabled\n", dllname);
+ Con_Printf ("JPEG support enabled\n");
return true;
}
*/
void JPEG_CloseLibrary (void)
{
- if (!jpeg_dll)
- return;
-
- Sys_UnloadLibrary (jpeg_dll);
- jpeg_dll = NULL;
+ Sys_UnloadLibrary (&jpeg_dll);
}
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 qbyte *buffer)
{
cinfo->src = cinfo->mem->alloc_small ((j_common_ptr) cinfo, JPOOL_PERMANENT, sizeof (struct jpeg_source_mgr));
Load a JPEG image into a RGBA buffer
====================
*/
-qbyte* JPEG_LoadImage (qbyte *f, int matchwidth, int matchheight)
+qbyte* JPEG_LoadImage (const qbyte *f, int matchwidth, int matchheight)
{
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
qjpeg_destroy_decompress (&cinfo);
return NULL;
}
+ if (image_width > 4096 || image_height > 4096 || image_width <= 0 || image_height <= 0)
+ {
+ Con_Printf("JPEG_LoadImage: invalid image size %ix%i\n", image_width, image_height);
+ return NULL;
+ }
image_rgba = Mem_Alloc(tempmempool, image_width * image_height * 4);
scanline = Mem_Alloc(tempmempool, image_width * cinfo.output_components);
// 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;
}
// No DLL = no JPEGs
if (!jpeg_dll)
{
- Con_Printf ("You need the libjpeg library to save JPEG images\n");
+ Con_Print("You need the libjpeg library to save JPEG images\n");
return false;
}
// Open the file
- file = FS_Open (filename, "wb", true);
+ file = FS_Open (filename, "wb", true, false);
if (!file)
return false;
cinfo.in_color_space = JCS_RGB;
cinfo.input_components = 3;
qjpeg_set_defaults (&cinfo);
- qjpeg_set_quality (&cinfo, 90, TRUE); // 90% quality; FIXME: use a cvar
+ qjpeg_set_quality (&cinfo, scr_screenshot_jpeg_quality.value * 100, TRUE);
qjpeg_start_compress (&cinfo, true);
// Compress each scanline