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:
dhewg 2011-12-22 13:40:12 +01:00
parent 2c1186dc1b
commit 9e715ba7cc
3 changed files with 90 additions and 3 deletions

View file

@ -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

View file

@ -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})

View file

@ -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() */