mirror of
https://github.com/dhewm/dhewm3.git
synced 2025-03-21 02:01:03 +00:00
Check for jpeg_mem_src()
This function only exists starting with libjpeg8. Check for existence and provide an implementation if necessary. This allows libjpeg6 to be used. Code borrowed from libjpeg8, adapt copyright in README accordingly.
This commit is contained in:
parent
2c1186dc1b
commit
9e715ba7cc
3 changed files with 90 additions and 3 deletions
|
@ -111,9 +111,10 @@ in this Software without prior written authorization of the copyright holder.
|
|||
|
||||
JPEG library
|
||||
-----------------------------------------------------------------------------
|
||||
neo/renderer/jpeg-6/*
|
||||
neo/renderer/jpeg-6/*, renderer/Image_files.cpp
|
||||
|
||||
Copyright (C) 1991-1995, Thomas G. Lane
|
||||
This software is copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding.
|
||||
All Rights Reserved except as specified below.
|
||||
|
||||
Permission is hereby granted to use, copy, modify, and distribute this
|
||||
software (or portions thereof) for any purpose, without fee, subject to these
|
||||
|
|
|
@ -25,6 +25,7 @@ set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/sys/cmake")
|
|||
set(CMAKE_SKIP_RPATH ON CACHE BOOL "Skip RPATH" FORCE)
|
||||
|
||||
include(CheckCXXCompilerFlag)
|
||||
include(CheckFunctionExists)
|
||||
|
||||
option(CORE "Build the core" ON)
|
||||
option(GAME "Build the base game code" ON)
|
||||
|
@ -70,6 +71,13 @@ endif()
|
|||
find_package(JPEG REQUIRED)
|
||||
include_directories(${JPEG_INCLUDE_DIR})
|
||||
|
||||
set(CMAKE_REQUIRED_INCLUDES ${JPEG_INCLUDE_DIR})
|
||||
set(CMAKE_REQUIRED_LIBRARIES ${JPEG_LIBRARY})
|
||||
CHECK_FUNCTION_EXISTS("jpeg_mem_src" jpeg_has_mem_src)
|
||||
if (jpeg_has_mem_src)
|
||||
add_definitions(-DHAVE_JPEG_MEM_SRC)
|
||||
endif ()
|
||||
|
||||
find_package(OGG REQUIRED)
|
||||
include_directories(${OGG_INCLUDE_DIR})
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@ If you have questions concerning this license or the applicable additional terms
|
|||
#include "sys/platform.h"
|
||||
|
||||
#include <jpeglib.h>
|
||||
#include <jerror.h>
|
||||
|
||||
#include "renderer/tr_local.h"
|
||||
|
||||
|
@ -795,6 +796,83 @@ Interfaces with the huge libjpeg
|
|||
=========================================================
|
||||
*/
|
||||
|
||||
#ifdef HAVE_JPEG_MEM_SRC
|
||||
#define j_mem_src jpeg_mem_src
|
||||
#else
|
||||
static void init_mem_source(j_decompress_ptr cinfo)
|
||||
{
|
||||
/* no work necessary here */
|
||||
}
|
||||
|
||||
static boolean fill_mem_input_buffer(j_decompress_ptr cinfo)
|
||||
{
|
||||
static JOCTET mybuffer[4];
|
||||
|
||||
/* The whole JPEG data is expected to reside in the supplied memory
|
||||
* buffer, so any request for more data beyond the given buffer size
|
||||
* is treated as an error.
|
||||
*/
|
||||
WARNMS(cinfo, JWRN_JPEG_EOF);
|
||||
/* Insert a fake EOI marker */
|
||||
mybuffer[0] = (JOCTET) 0xFF;
|
||||
mybuffer[1] = (JOCTET) JPEG_EOI;
|
||||
|
||||
cinfo->src->next_input_byte = mybuffer;
|
||||
cinfo->src->bytes_in_buffer = 2;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void skip_input_data(j_decompress_ptr cinfo, long num_bytes)
|
||||
{
|
||||
struct jpeg_source_mgr *src = cinfo->src;
|
||||
|
||||
if (num_bytes > 0) {
|
||||
while (num_bytes > (long)src->bytes_in_buffer) {
|
||||
num_bytes -= (long)src->bytes_in_buffer;
|
||||
(void)(*src->fill_input_buffer) (cinfo);
|
||||
/* note we assume that fill_input_buffer will never return FALSE,
|
||||
* so suspension need not be handled.
|
||||
*/
|
||||
}
|
||||
src->next_input_byte += (size_t)num_bytes;
|
||||
src->bytes_in_buffer -= (size_t)num_bytes;
|
||||
}
|
||||
}
|
||||
|
||||
static void term_source(j_decompress_ptr cinfo)
|
||||
{
|
||||
/* no work necessary here */
|
||||
}
|
||||
|
||||
static void j_mem_src(j_decompress_ptr cinfo, unsigned char *inbuffer, unsigned long insize)
|
||||
{
|
||||
struct jpeg_source_mgr *src;
|
||||
|
||||
if (inbuffer == NULL || insize == 0) /* Treat empty input as fatal error */
|
||||
ERREXIT(cinfo, JERR_INPUT_EMPTY);
|
||||
|
||||
/* The source object is made permanent so that a series of JPEG images
|
||||
* can be read from the same buffer by calling jpeg_mem_src only before
|
||||
* the first one.
|
||||
*/
|
||||
if (cinfo->src == NULL) { /* first time for this JPEG object? */
|
||||
cinfo->src = (struct jpeg_source_mgr *)
|
||||
(*cinfo->mem->alloc_small)((j_common_ptr)cinfo, JPOOL_PERMANENT,
|
||||
sizeof(struct jpeg_source_mgr));
|
||||
}
|
||||
|
||||
src = cinfo->src;
|
||||
src->init_source = init_mem_source;
|
||||
src->fill_input_buffer = fill_mem_input_buffer;
|
||||
src->skip_input_data = skip_input_data;
|
||||
src->resync_to_restart = jpeg_resync_to_restart; /* use default method */
|
||||
src->term_source = term_source;
|
||||
src->bytes_in_buffer = (size_t)insize;
|
||||
src->next_input_byte = (JOCTET *)inbuffer;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
=============
|
||||
LoadJPG
|
||||
|
@ -870,7 +948,7 @@ static void LoadJPG( const char *filename, unsigned char **pic, int *width, int
|
|||
|
||||
/* Step 2: specify data source (eg, a file) */
|
||||
|
||||
jpeg_mem_src(&cinfo, fbuffer, len);
|
||||
j_mem_src(&cinfo, fbuffer, len);
|
||||
|
||||
/* Step 3: read file parameters with jpeg_read_header() */
|
||||
|
||||
|
|
Loading…
Reference in a new issue