summaryrefslogtreecommitdiff
path: root/tiff/libtiff/tif_ojpeg.c
diff options
context:
space:
mode:
Diffstat (limited to 'tiff/libtiff/tif_ojpeg.c')
-rw-r--r--tiff/libtiff/tif_ojpeg.c127
1 files changed, 118 insertions, 9 deletions
diff --git a/tiff/libtiff/tif_ojpeg.c b/tiff/libtiff/tif_ojpeg.c
index bf0d1a2a0..a3d4513a5 100644
--- a/tiff/libtiff/tif_ojpeg.c
+++ b/tiff/libtiff/tif_ojpeg.c
@@ -204,6 +204,10 @@ static const TIFFField ojpegFields[] = {
# define XMD_H 1
#endif
+/* If we are building for GS, do NOT mess with boolean - we want it to be int on all platforms.
+ */
+#define GS_TIFF_BUILD
+#ifndef GS_TIFF_BUILD
/* Define "boolean" as unsigned char, not int, per Windows custom. */
#if defined(__WIN32__) && !defined(__MINGW32__)
# ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
@@ -211,9 +215,13 @@ static const TIFFField ojpegFields[] = {
# endif
# define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
#endif
+#endif
#include "jpeglib.h"
#include "jerror.h"
+#ifdef GS_TIFF_BUILD
+#include "jmemcust.h"
+#endif
typedef struct jpeg_error_mgr jpeg_error_mgr;
typedef struct jpeg_common_struct jpeg_common_struct;
@@ -242,8 +250,8 @@ typedef enum {
typedef struct {
TIFF* tif;
- int decoder_ok;
- int error_in_raw_data_decoding;
+ int decoder_ok;
+ int error_in_raw_data_decoding;
#ifndef LIBJPEG_ENCAP_EXTERNAL
JMP_BUF exit_jmpbuf;
#endif
@@ -334,6 +342,10 @@ typedef struct {
OJPEGStateOutState out_state;
uint8 out_buffer[OJPEG_BUFFER];
uint8* skip_buffer;
+#ifdef GS_TIFF_BUILD
+ jpeg_cust_mem_data jmem;
+ jpeg_cust_mem_data *jmem_parent;
+#endif
} OJPEGState;
static int OJPEGVGetField(TIFF* tif, uint32 tag, va_list ap);
@@ -423,7 +435,7 @@ TIFFInitOJPEG(TIFF* tif, int scheme)
assert(scheme==COMPRESSION_OJPEG);
- /*
+ /*
* Merge codec-specific tag information.
*/
if (!_TIFFMergeFields(tif, ojpegFields, TIFFArrayCount(ojpegFields))) {
@@ -1194,6 +1206,91 @@ OJPEGReadSecondarySos(TIFF* tif, uint16 s)
return(1);
}
+#ifdef GS_TIFF_BUILD
+#define TIFF_FROM_CINFO(cinfo) \
+ ((TIFF *)GET_CUST_MEM_DATA(cinfo)->priv)
+
+static void *j_mem_get_small(j_common_ptr cinfo, size_t size)
+{
+ jpeg_cust_mem_data *jc = GET_CUST_MEM_DATA(cinfo);
+ TIFF *tif = (TIFF *)jc->priv;
+ OJPEGState* sp=(OJPEGState*)tif->tif_data;
+ void *ret;
+
+ cinfo->client_data = sp->jmem_parent;
+ ret = sp->jmem_parent->j_mem_get_small(cinfo, size);
+ cinfo->client_data = jc;
+
+ return ret;
+}
+
+static void *j_mem_get_large(j_common_ptr cinfo, size_t size)
+{
+ jpeg_cust_mem_data *jc = GET_CUST_MEM_DATA(cinfo);
+ TIFF *tif = (TIFF *)jc->priv;
+ OJPEGState* sp=(OJPEGState*)tif->tif_data;
+ void *ret;
+
+ cinfo->client_data = sp->jmem_parent;
+ ret = sp->jmem_parent->j_mem_get_large(cinfo, size);
+ cinfo->client_data = jc;
+
+ return ret;
+}
+
+static void j_mem_free_small(j_common_ptr cinfo, void *object, size_t size)
+{
+ jpeg_cust_mem_data *jc = GET_CUST_MEM_DATA(cinfo);
+ TIFF *tif = (TIFF *)jc->priv;
+ OJPEGState* sp=(OJPEGState*)tif->tif_data;
+
+ cinfo->client_data = sp->jmem_parent;
+ sp->jmem_parent->j_mem_free_small(cinfo, object, size);
+ cinfo->client_data = jc;
+}
+
+static void j_mem_free_large(j_common_ptr cinfo, void *object, size_t size)
+{
+ jpeg_cust_mem_data *jc = GET_CUST_MEM_DATA(cinfo);
+ TIFF *tif = (TIFF *)jc->priv;
+ OJPEGState* sp=(OJPEGState*)tif->tif_data;
+
+ cinfo->client_data = sp->jmem_parent;
+ sp->jmem_parent->j_mem_free_large(cinfo, object, size);
+ cinfo->client_data = jc;
+}
+
+static long j_mem_init (j_common_ptr cinfo)
+{
+ jpeg_cust_mem_data *jc = GET_CUST_MEM_DATA(cinfo);
+ TIFF *tif = (TIFF *)jc->priv;
+ OJPEGState* sp=(OJPEGState*)tif->tif_data;
+ long ret;
+
+ cinfo->client_data = sp->jmem_parent;
+ ret = sp->jmem_parent->j_mem_init(cinfo);
+ cinfo->client_data = jc;
+
+ return ret;
+}
+
+static void j_mem_term (j_common_ptr cinfo)
+{
+ jpeg_cust_mem_data *jc = GET_CUST_MEM_DATA(cinfo);
+ TIFF *tif = (TIFF *)jc->priv;
+ OJPEGState* sp=(OJPEGState*)tif->tif_data;
+
+ cinfo->client_data = sp->jmem_parent;
+ sp->jmem_parent->j_mem_term(cinfo);
+ cinfo->client_data = jc;
+}
+#else
+
+#define TIFF_FROM_CINFO(cinfo) \
+ ((TIFF *)GET_CUST_MEM_DATA(cinfo))
+
+#endif
+
static int
OJPEGWriteHeaderInfo(TIFF* tif)
{
@@ -1210,7 +1307,17 @@ OJPEGWriteHeaderInfo(TIFF* tif)
sp->libjpeg_jpeg_error_mgr.output_message=OJPEGLibjpegJpegErrorMgrOutputMessage;
sp->libjpeg_jpeg_error_mgr.error_exit=OJPEGLibjpegJpegErrorMgrErrorExit;
sp->libjpeg_jpeg_decompress_struct.err=&(sp->libjpeg_jpeg_error_mgr);
+ /* set client_data to avoid UMR warning from tools like Purify */
+#ifdef GS_TIFF_BUILD
+ sp->jmem_parent = tif->get_jpeg_mem_ptr(tif->tif_clientdata);
+ (void)jpeg_cust_mem_init(&sp->jmem, (void *)tif,
+ j_mem_init, j_mem_term, NULL,
+ j_mem_get_small, j_mem_free_small,
+ j_mem_get_large, j_mem_free_large, NULL);
+ sp->libjpeg_jpeg_decompress_struct.client_data=&sp->jmem;
+#else
sp->libjpeg_jpeg_decompress_struct.client_data=(void*)tif;
+#endif
if (jpeg_create_decompress_encap(sp,&(sp->libjpeg_jpeg_decompress_struct))==0)
return(0);
sp->libjpeg_session_active=1;
@@ -2531,18 +2638,20 @@ jpeg_encap_unwind(TIFF* tif)
static void
OJPEGLibjpegJpegErrorMgrOutputMessage(jpeg_common_struct* cinfo)
{
+ TIFF *tif = TIFF_FROM_CINFO(cinfo);
char buffer[JMSG_LENGTH_MAX];
(*cinfo->err->format_message)(cinfo,buffer);
- TIFFWarningExt(((TIFF*)(cinfo->client_data))->tif_clientdata,"LibJpeg","%s",buffer);
+ TIFFWarningExt(tif->tif_clientdata,"LibJpeg","%s",buffer);
}
static void
OJPEGLibjpegJpegErrorMgrErrorExit(jpeg_common_struct* cinfo)
{
+ TIFF *tif = TIFF_FROM_CINFO(cinfo);
char buffer[JMSG_LENGTH_MAX];
(*cinfo->err->format_message)(cinfo,buffer);
- TIFFErrorExt(((TIFF*)(cinfo->client_data))->tif_clientdata,"LibJpeg","%s",buffer);
- jpeg_encap_unwind((TIFF*)(cinfo->client_data));
+ TIFFErrorExt(tif->tif_clientdata,"LibJpeg","%s",buffer);
+ jpeg_encap_unwind(tif);
}
static void
@@ -2554,7 +2663,7 @@ OJPEGLibjpegJpegSourceMgrInitSource(jpeg_decompress_struct* cinfo)
static boolean
OJPEGLibjpegJpegSourceMgrFillInputBuffer(jpeg_decompress_struct* cinfo)
{
- TIFF* tif=(TIFF*)cinfo->client_data;
+ TIFF *tif = TIFF_FROM_CINFO(cinfo);
OJPEGState* sp=(OJPEGState*)tif->tif_data;
void* mem=0;
uint32 len=0U;
@@ -2571,7 +2680,7 @@ OJPEGLibjpegJpegSourceMgrFillInputBuffer(jpeg_decompress_struct* cinfo)
static void
OJPEGLibjpegJpegSourceMgrSkipInputData(jpeg_decompress_struct* cinfo, long num_bytes)
{
- TIFF* tif=(TIFF*)cinfo->client_data;
+ TIFF *tif = TIFF_FROM_CINFO(cinfo);
(void)num_bytes;
TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Unexpected error");
jpeg_encap_unwind(tif);
@@ -2584,7 +2693,7 @@ OJPEGLibjpegJpegSourceMgrSkipInputData(jpeg_decompress_struct* cinfo, long num_b
static boolean
OJPEGLibjpegJpegSourceMgrResyncToRestart(jpeg_decompress_struct* cinfo, int desired)
{
- TIFF* tif=(TIFF*)cinfo->client_data;
+ TIFF *tif = TIFF_FROM_CINFO(cinfo);
(void)desired;
TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Unexpected error");
jpeg_encap_unwind(tif);