1a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* 2a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Copyright (C)2009-2012 D. R. Commander. All Rights Reserved. 3a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * 4a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Redistribution and use in source and binary forms, with or without 5a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * modification, are permitted provided that the following conditions are met: 6a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * 7a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * - Redistributions of source code must retain the above copyright notice, 8a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * this list of conditions and the following disclaimer. 9a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * - Redistributions in binary form must reproduce the above copyright notice, 10a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * this list of conditions and the following disclaimer in the documentation 11a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * and/or other materials provided with the distribution. 12a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * - Neither the name of the libjpeg-turbo Project nor the names of its 13a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * contributors may be used to endorse or promote products derived from this 14a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * software without specific prior written permission. 15a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * 16a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", 17a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE 20a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * POSSIBILITY OF SUCH DAMAGE. 27a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat */ 28a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 29a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* TurboJPEG/OSS: this implements the TurboJPEG API using libjpeg-turbo */ 30a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 31a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <stdio.h> 32a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <stdlib.h> 33a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <string.h> 34a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#ifndef JCS_EXTENSIONS 35a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#define JPEG_INTERNAL_OPTIONS 36a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#endif 37a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <jpeglib.h> 38a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <jerror.h> 39a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <setjmp.h> 40a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include "./turbojpeg.h" 41a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 42a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#define PAD(v, p) ((v+(p)-1)&(~((p)-1))) 43a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 44a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#define CSTATE_START 100 45a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#define DSTATE_START 200 46a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#define MEMZERO(ptr, size) memset(ptr, 0, size) 47a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 48a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#ifndef min 49a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #define min(a,b) ((a)<(b)?(a):(b)) 50a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#endif 51a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 52a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#ifndef max 53a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #define max(a,b) ((a)>(b)?(a):(b)) 54a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#endif 55a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 56a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 57a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* Error handling (based on example in example.c) */ 58a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 59a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstatic char errStr[JMSG_LENGTH_MAX]="No error"; 60a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 61a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstruct my_error_mgr 62a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 63a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat struct jpeg_error_mgr pub; 64a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat jmp_buf setjmp_buffer; 65a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}; 66a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehattypedef struct my_error_mgr *my_error_ptr; 67a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 68a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstatic void my_error_exit(j_common_ptr cinfo) 69a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 70a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat my_error_ptr myerr=(my_error_ptr)cinfo->err; 71a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat (*cinfo->err->output_message)(cinfo); 72a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat longjmp(myerr->setjmp_buffer, 1); 73a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 74a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 75a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* Based on output_message() in jerror.c */ 76a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 77a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstatic void my_output_message(j_common_ptr cinfo) 78a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 79a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat (*cinfo->err->format_message)(cinfo, errStr); 80a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 81a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 82a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 83a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* Global structures, macros, etc. */ 84a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 85a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatenum {COMPRESS=1, DECOMPRESS=2}; 86a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 87a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehattypedef struct _tjinstance 88a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 89a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat struct jpeg_compress_struct cinfo; 90a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat struct jpeg_decompress_struct dinfo; 91a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat struct jpeg_destination_mgr jdst; 92a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat struct jpeg_source_mgr jsrc; 93a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat struct my_error_mgr jerr; 94a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int init; 95a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} tjinstance; 96a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 97a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstatic const int pixelsize[TJ_NUMSAMP]={3, 3, 3, 1, 3}; 98a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 99a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#define NUMSF 4 100a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstatic const tjscalingfactor sf[NUMSF]={ 101a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat {1, 1}, 102a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat {1, 2}, 103a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat {1, 4}, 104a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat {1, 8} 105a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}; 106a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 107a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#define _throw(m) {snprintf(errStr, JMSG_LENGTH_MAX, "%s", m); \ 108a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat retval=-1; goto bailout;} 109a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#define getinstance(handle) tjinstance *this=(tjinstance *)handle; \ 110a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat j_compress_ptr cinfo=NULL; j_decompress_ptr dinfo=NULL; \ 111a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat (void) cinfo; (void) dinfo; /* silence warnings */ \ 112a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(!this) {snprintf(errStr, JMSG_LENGTH_MAX, "Invalid handle"); \ 113a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return -1;} \ 114a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat cinfo=&this->cinfo; dinfo=&this->dinfo; 115a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 116a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstatic int getPixelFormat(int pixelSize, int flags) 117a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 118a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(pixelSize==1) return TJPF_GRAY; 119a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(pixelSize==3) 120a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 121a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(flags&TJ_BGR) return TJPF_BGR; 122a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat else return TJPF_RGB; 123a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 124a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(pixelSize==4) 125a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 126a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(flags&TJ_ALPHAFIRST) 127a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 128a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(flags&TJ_BGR) return TJPF_XBGR; 129a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat else return TJPF_XRGB; 130a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 131a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat else 132a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 133a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(flags&TJ_BGR) return TJPF_BGRX; 134a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat else return TJPF_RGBX; 135a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 136a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 137a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return -1; 138a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 139a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 140a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstatic int setCompDefaults(struct jpeg_compress_struct *cinfo, 141a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int pixelFormat, int subsamp, int jpegQual) 142a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 143a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int retval=0; 144a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 145a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat switch(pixelFormat) 146a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 147a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_GRAY: 148a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat cinfo->in_color_space=JCS_GRAYSCALE; break; 149a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #if JCS_EXTENSIONS==1 150a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_RGB: 151a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat cinfo->in_color_space=JCS_EXT_RGB; break; 152a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_BGR: 153a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat cinfo->in_color_space=JCS_EXT_BGR; break; 154a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_RGBX: 155a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_RGBA: 156a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat cinfo->in_color_space=JCS_EXT_RGBX; break; 157a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_BGRX: 158a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_BGRA: 159a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat cinfo->in_color_space=JCS_EXT_BGRX; break; 160a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_XRGB: 161a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_ARGB: 162a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat cinfo->in_color_space=JCS_EXT_XRGB; break; 163a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_XBGR: 164a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_ABGR: 165a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat cinfo->in_color_space=JCS_EXT_XBGR; break; 166a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #else 167a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_RGB: 168a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_BGR: 169a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_RGBX: 170a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_BGRX: 171a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_XRGB: 172a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_XBGR: 173a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_RGBA: 174a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_BGRA: 175a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_ARGB: 176a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_ABGR: 177a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat cinfo->in_color_space=JCS_RGB; pixelFormat=TJPF_RGB; 178a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat break; 179a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 180a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 181a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 182a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat cinfo->input_components=tjPixelSize[pixelFormat]; 183a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat jpeg_set_defaults(cinfo); 184a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(jpegQual>=0) 185a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 186a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat jpeg_set_quality(cinfo, jpegQual, TRUE); 187a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(jpegQual>=96) cinfo->dct_method=JDCT_ISLOW; 188a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat else cinfo->dct_method=JDCT_FASTEST; 189a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 190a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(subsamp==TJSAMP_GRAY) 191a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat jpeg_set_colorspace(cinfo, JCS_GRAYSCALE); 192a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat else 193a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat jpeg_set_colorspace(cinfo, JCS_YCbCr); 194a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 195a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat cinfo->comp_info[0].h_samp_factor=tjMCUWidth[subsamp]/8; 196a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat cinfo->comp_info[1].h_samp_factor=1; 197a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat cinfo->comp_info[2].h_samp_factor=1; 198a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat cinfo->comp_info[0].v_samp_factor=tjMCUHeight[subsamp]/8; 199a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat cinfo->comp_info[1].v_samp_factor=1; 200a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat cinfo->comp_info[2].v_samp_factor=1; 201a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 202a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return retval; 203a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 204a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 205a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstatic int setDecompDefaults(struct jpeg_decompress_struct *dinfo, 206a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int pixelFormat) 207a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 208a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int retval=0; 209a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 210a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat switch(pixelFormat) 211a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 212a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_GRAY: 213a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dinfo->out_color_space=JCS_GRAYSCALE; break; 214a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #if JCS_EXTENSIONS==1 215a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_RGB: 216a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dinfo->out_color_space=JCS_EXT_RGB; break; 217a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_BGR: 218a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dinfo->out_color_space=JCS_EXT_BGR; break; 219a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_RGBX: 220a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dinfo->out_color_space=JCS_EXT_RGBX; break; 221a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_BGRX: 222a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dinfo->out_color_space=JCS_EXT_BGRX; break; 223a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_XRGB: 224a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dinfo->out_color_space=JCS_EXT_XRGB; break; 225a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_XBGR: 226a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dinfo->out_color_space=JCS_EXT_XBGR; break; 227a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #if JCS_ALPHA_EXTENSIONS==1 228a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_RGBA: 229a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dinfo->out_color_space=JCS_EXT_RGBA; break; 230a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_BGRA: 231a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dinfo->out_color_space=JCS_EXT_BGRA; break; 232a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_ARGB: 233a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dinfo->out_color_space=JCS_EXT_ARGB; break; 234a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_ABGR: 235a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dinfo->out_color_space=JCS_EXT_ABGR; break; 236a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 237a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #else 238a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_RGB: 239a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_BGR: 240a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_RGBX: 241a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_BGRX: 242a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_XRGB: 243a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_XBGR: 244a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_RGBA: 245a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_BGRA: 246a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_ARGB: 247a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_ABGR: 248a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dinfo->out_color_space=JCS_RGB; break; 249a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 250a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat default: 251a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat _throw("Unsupported pixel format"); 252a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 253a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 254a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat bailout: 255a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return retval; 256a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 257a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 258a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 259a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstatic int getSubsamp(j_decompress_ptr dinfo) 260a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 261a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int retval=-1, i, k; 262a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat for(i=0; i<NUMSUBOPT; i++) 263a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 264a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(dinfo->num_components==pixelsize[i]) 265a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 266a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(dinfo->comp_info[0].h_samp_factor==tjMCUWidth[i]/8 267a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat && dinfo->comp_info[0].v_samp_factor==tjMCUHeight[i]/8) 268a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 269a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int match=0; 270a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat for(k=1; k<dinfo->num_components; k++) 271a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 272a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(dinfo->comp_info[k].h_samp_factor==1 273a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat && dinfo->comp_info[k].v_samp_factor==1) 274a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat match++; 275a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 276a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(match==dinfo->num_components-1) 277a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 278a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat retval=i; break; 279a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 280a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 281a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 282a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 283a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return retval; 284a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 285a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 286a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 287a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#ifndef JCS_EXTENSIONS 288a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 289a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* Conversion functions to emulate the colorspace extensions. This allows the 290a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat TurboJPEG wrapper to be used with libjpeg */ 291a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 292a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#define TORGB(PS, ROFFSET, GOFFSET, BOFFSET) { \ 293a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int rowPad=pitch-width*PS; \ 294a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat while(height--) \ 295a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { \ 296a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat unsigned char *endOfRow=src+width*PS; \ 297a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat while(src<endOfRow) \ 298a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { \ 299a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dst[RGB_RED]=src[ROFFSET]; \ 300a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dst[RGB_GREEN]=src[GOFFSET]; \ 301a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dst[RGB_BLUE]=src[BOFFSET]; \ 302a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dst+=RGB_PIXELSIZE; src+=PS; \ 303a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } \ 304a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat src+=rowPad; \ 305a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } \ 306a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 307a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 308a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstatic unsigned char *toRGB(unsigned char *src, int width, int pitch, 309a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int height, int pixelFormat, unsigned char *dst) 310a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 311a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat unsigned char *retval=src; 312a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat switch(pixelFormat) 313a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 314a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_RGB: 315a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #if RGB_RED!=0 || RGB_GREEN!=1 || RGB_BLUE!=2 || RGB_PIXELSIZE!=3 316a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat retval=dst; TORGB(3, 0, 1, 2); 317a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 318a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat break; 319a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_BGR: 320a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #if RGB_RED!=2 || RGB_GREEN!=1 || RGB_BLUE!=0 || RGB_PIXELSIZE!=3 321a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat retval=dst; TORGB(3, 2, 1, 0); 322a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 323a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat break; 324a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_RGBX: 325a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_RGBA: 326a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #if RGB_RED!=0 || RGB_GREEN!=1 || RGB_BLUE!=2 || RGB_PIXELSIZE!=4 327a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat retval=dst; TORGB(4, 0, 1, 2); 328a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 329a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat break; 330a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_BGRX: 331a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_BGRA: 332a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #if RGB_RED!=2 || RGB_GREEN!=1 || RGB_BLUE!=0 || RGB_PIXELSIZE!=4 333a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat retval=dst; TORGB(4, 2, 1, 0); 334a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 335a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat break; 336a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_XRGB: 337a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_ARGB: 338a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #if RGB_RED!=1 || RGB_GREEN!=2 || RGB_BLUE!=3 || RGB_PIXELSIZE!=4 339a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat retval=dst; TORGB(4, 1, 2, 3); 340a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 341a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat break; 342a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_XBGR: 343a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_ABGR: 344a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #if RGB_RED!=3 || RGB_GREEN!=2 || RGB_BLUE!=1 || RGB_PIXELSIZE!=4 345a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat retval=dst; TORGB(4, 3, 2, 1); 346a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 347a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat break; 348a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 349a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return retval; 350a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 351a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 352a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#define FROMRGB(PS, ROFFSET, GOFFSET, BOFFSET, SETALPHA) { \ 353a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int rowPad=pitch-width*PS; \ 354a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat while(height--) \ 355a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { \ 356a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat unsigned char *endOfRow=dst+width*PS; \ 357a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat while(dst<endOfRow) \ 358a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { \ 359a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dst[ROFFSET]=src[RGB_RED]; \ 360a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dst[GOFFSET]=src[RGB_GREEN]; \ 361a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dst[BOFFSET]=src[RGB_BLUE]; \ 362a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat SETALPHA \ 363a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dst+=PS; src+=RGB_PIXELSIZE; \ 364a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } \ 365a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dst+=rowPad; \ 366a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } \ 367a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 368a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 369a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstatic void fromRGB(unsigned char *src, unsigned char *dst, int width, 370a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int pitch, int height, int pixelFormat) 371a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 372a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat switch(pixelFormat) 373a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 374a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_RGB: 375a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #if RGB_RED!=0 || RGB_GREEN!=1 || RGB_BLUE!=2 || RGB_PIXELSIZE!=3 376a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FROMRGB(3, 0, 1, 2,); 377a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 378a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat break; 379a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_BGR: 380a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #if RGB_RED!=2 || RGB_GREEN!=1 || RGB_BLUE!=0 || RGB_PIXELSIZE!=3 381a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FROMRGB(3, 2, 1, 0,); 382a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 383a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat break; 384a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_RGBX: 385a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #if RGB_RED!=0 || RGB_GREEN!=1 || RGB_BLUE!=2 || RGB_PIXELSIZE!=4 386a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FROMRGB(4, 0, 1, 2,); 387a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 388a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat break; 389a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_RGBA: 390a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #if RGB_RED!=0 || RGB_GREEN!=1 || RGB_BLUE!=2 || RGB_PIXELSIZE!=4 391a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FROMRGB(4, 0, 1, 2, dst[3]=0xFF;); 392a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 393a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat break; 394a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_BGRX: 395a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #if RGB_RED!=2 || RGB_GREEN!=1 || RGB_BLUE!=0 || RGB_PIXELSIZE!=4 396a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FROMRGB(4, 2, 1, 0,); 397a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 398a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat break; 399a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_BGRA: 400a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #if RGB_RED!=2 || RGB_GREEN!=1 || RGB_BLUE!=0 || RGB_PIXELSIZE!=4 401a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FROMRGB(4, 2, 1, 0, dst[3]=0xFF;); return; 402a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 403a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat break; 404a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_XRGB: 405a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #if RGB_RED!=1 || RGB_GREEN!=2 || RGB_BLUE!=3 || RGB_PIXELSIZE!=4 406a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FROMRGB(4, 1, 2, 3,); return; 407a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 408a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat break; 409a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_ARGB: 410a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #if RGB_RED!=1 || RGB_GREEN!=2 || RGB_BLUE!=3 || RGB_PIXELSIZE!=4 411a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FROMRGB(4, 1, 2, 3, dst[0]=0xFF;); return; 412a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 413a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat break; 414a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_XBGR: 415a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #if RGB_RED!=3 || RGB_GREEN!=2 || RGB_BLUE!=1 || RGB_PIXELSIZE!=4 416a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FROMRGB(4, 3, 2, 1,); return; 417a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 418a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat break; 419a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat case TJPF_ABGR: 420a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #if RGB_RED!=3 || RGB_GREEN!=2 || RGB_BLUE!=1 || RGB_PIXELSIZE!=4 421a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat FROMRGB(4, 3, 2, 1, dst[0]=0xFF;); return; 422a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 423a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat break; 424a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 425a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 426a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 427a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#endif 428a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 429a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 430a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* General API functions */ 431a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 432a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatDLLEXPORT char* DLLCALL tjGetErrorStr(void) 433a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 434a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return errStr; 435a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 436a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 437a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 438a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatDLLEXPORT int DLLCALL tjDestroy(tjhandle handle) 439a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 440a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat getinstance(handle); 441a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(setjmp(this->jerr.setjmp_buffer)) return -1; 442a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(this->init&COMPRESS) jpeg_destroy_compress(cinfo); 443a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(this->init&DECOMPRESS) jpeg_destroy_decompress(dinfo); 444a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat free(this); 445a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return 0; 446a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 447a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 448a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 449a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* Compressor */ 450a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 451a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstatic boolean empty_output_buffer(j_compress_ptr cinfo) 452a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 453a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat ERREXIT(cinfo, JERR_BUFFER_SIZE); 454a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return TRUE; 455a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 456a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 457a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstatic void dst_noop(j_compress_ptr cinfo) 458a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 459a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 460a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 461a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstatic tjhandle _tjInitCompress(tjinstance *this) 462a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 463a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat /* This is also straight out of example.c */ 464a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->cinfo.err=jpeg_std_error(&this->jerr.pub); 465a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->jerr.pub.error_exit=my_error_exit; 466a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->jerr.pub.output_message=my_output_message; 467a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 468a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(setjmp(this->jerr.setjmp_buffer)) 469a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 470a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat /* If we get here, the JPEG code has signaled an error. */ 471a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(this) free(this); return NULL; 472a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 473a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 474a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat jpeg_create_compress(&this->cinfo); 475a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->cinfo.dest=&this->jdst; 476a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->jdst.init_destination=dst_noop; 477a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->jdst.empty_output_buffer=empty_output_buffer; 478a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->jdst.term_destination=dst_noop; 479a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 480a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->init|=COMPRESS; 481a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return (tjhandle)this; 482a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 483a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 484a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatDLLEXPORT tjhandle DLLCALL tjInitCompress(void) 485a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 486a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat tjinstance *this=NULL; 487a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if((this=(tjinstance *)malloc(sizeof(tjinstance)))==NULL) 488a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 489a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat snprintf(errStr, JMSG_LENGTH_MAX, 490a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat "tjInitCompress(): Memory allocation failure"); 491a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return NULL; 492a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 493a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat MEMZERO(this, sizeof(tjinstance)); 494a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return _tjInitCompress(this); 495a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 496a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 497a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 498a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatDLLEXPORT unsigned long DLLCALL tjBufSize(int width, int height, 499a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int jpegSubsamp) 500a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 501a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat unsigned long retval=0; int mcuw, mcuh, chromasf; 502a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(width<1 || height<1 || jpegSubsamp<0 || jpegSubsamp>=NUMSUBOPT) 503a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat _throw("tjBufSize(): Invalid argument"); 504a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 505a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat // This allows for rare corner cases in which a JPEG image can actually be 506a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat // larger than the uncompressed input (we wouldn't mention it if it hadn't 507a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat // happened before.) 508a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat mcuw=tjMCUWidth[jpegSubsamp]; 509a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat mcuh=tjMCUHeight[jpegSubsamp]; 510a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat chromasf=jpegSubsamp==TJSAMP_GRAY? 0: 4*64/(mcuw*mcuh); 511a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat retval=PAD(width, mcuw) * PAD(height, mcuh) * (2 + chromasf) + 2048; 512a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 513a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat bailout: 514a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return retval; 515a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 516a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 517a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 518a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatDLLEXPORT unsigned long DLLCALL TJBUFSIZE(int width, int height) 519a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 520a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat unsigned long retval=0; 521a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(width<1 || height<1) 522a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat _throw("TJBUFSIZE(): Invalid argument"); 523a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 524a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat // This allows for rare corner cases in which a JPEG image can actually be 525a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat // larger than the uncompressed input (we wouldn't mention it if it hadn't 526a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat // happened before.) 527a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat retval=PAD(width, 16) * PAD(height, 16) * 6 + 2048; 528a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 529a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat bailout: 530a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return retval; 531a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 532a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 533a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 534a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatDLLEXPORT int DLLCALL tjCompress2(tjhandle handle, unsigned char *srcBuf, 535a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int width, int pitch, int height, int pixelFormat, unsigned char **jpegBuf, 536a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat unsigned long *jpegSize, int jpegSubsamp, int jpegQual, int flags) 537a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 538a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int i, retval=0; JSAMPROW *row_pointer=NULL; 539a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #ifndef JCS_EXTENSIONS 540a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat unsigned char *rgbBuf=NULL; 541a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 542a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 543a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat getinstance(handle) 544a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if((this->init&COMPRESS)==0) 545a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat _throw("tjCompress2(): Instance has not been initialized for compression"); 546a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 547a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(srcBuf==NULL || width<=0 || pitch<0 || height<=0 || pixelFormat<0 548a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat || pixelFormat>=TJ_NUMPF || jpegBuf==NULL || jpegSize==NULL 549a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat || jpegSubsamp<0 || jpegSubsamp>=NUMSUBOPT || jpegQual<0 || jpegQual>100) 550a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat _throw("tjCompress2(): Invalid argument"); 551a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 552a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(setjmp(this->jerr.setjmp_buffer)) 553a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 554a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat /* If we get here, the JPEG code has signaled an error. */ 555a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat retval=-1; 556a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat goto bailout; 557a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 558a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 559a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(pitch==0) pitch=width*tjPixelSize[pixelFormat]; 560a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 561a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #ifndef JCS_EXTENSIONS 562a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(pixelFormat!=TJPF_GRAY) 563a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 564a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rgbBuf=(unsigned char *)malloc(width*height*RGB_PIXELSIZE); 565a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(!rgbBuf) _throw("tjCompress2(): Memory allocation failure"); 566a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat srcBuf=toRGB(srcBuf, width, pitch, height, pixelFormat, rgbBuf); 567a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat pitch=width*RGB_PIXELSIZE; 568a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 569a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 570a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 571a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat cinfo->image_width=width; 572a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat cinfo->image_height=height; 573a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 574a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(flags&TJFLAG_FORCEMMX) putenv("JSIMD_FORCEMMX=1"); 575a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat else if(flags&TJFLAG_FORCESSE) putenv("JSIMD_FORCESSE=1"); 576a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat else if(flags&TJFLAG_FORCESSE2) putenv("JSIMD_FORCESSE2=1"); 577a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 578a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(setCompDefaults(cinfo, pixelFormat, jpegSubsamp, jpegQual)==-1) 579a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return -1; 580a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 581a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->jdst.next_output_byte=*jpegBuf; 582a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->jdst.free_in_buffer=tjBufSize(width, height, jpegSubsamp); 583a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 584a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat jpeg_start_compress(cinfo, TRUE); 585a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if((row_pointer=(JSAMPROW *)malloc(sizeof(JSAMPROW)*height))==NULL) 586a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat _throw("tjCompress2(): Memory allocation failure"); 587a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat for(i=0; i<height; i++) 588a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 589a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(flags&TJFLAG_BOTTOMUP) row_pointer[i]=&srcBuf[(height-i-1)*pitch]; 590a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat else row_pointer[i]=&srcBuf[i*pitch]; 591a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 592a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat while(cinfo->next_scanline<cinfo->image_height) 593a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 594a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat jpeg_write_scanlines(cinfo, &row_pointer[cinfo->next_scanline], 595a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat cinfo->image_height-cinfo->next_scanline); 596a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 597a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat jpeg_finish_compress(cinfo); 598a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat *jpegSize=tjBufSize(width, height, jpegSubsamp) 599a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat -(unsigned long)(this->jdst.free_in_buffer); 600a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 601a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat bailout: 602a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(cinfo->global_state>CSTATE_START) jpeg_abort_compress(cinfo); 603a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #ifndef JCS_EXTENSIONS 604a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(rgbBuf) free(rgbBuf); 605a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 606a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(row_pointer) free(row_pointer); 607a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return retval; 608a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 609a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 610a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatDLLEXPORT int DLLCALL tjCompress(tjhandle handle, unsigned char *srcBuf, 611a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int width, int pitch, int height, int pixelSize, unsigned char *jpegBuf, 612a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat unsigned long *jpegSize, int jpegSubsamp, int jpegQual, int flags) 613a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 614a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int retval=0; unsigned long size; 615a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat retval=tjCompress2(handle, srcBuf, width, pitch, height, 616a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat getPixelFormat(pixelSize, flags), &jpegBuf, &size, jpegSubsamp, jpegQual, 617a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat flags); 618a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat *jpegSize=size; 619a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return retval; 620a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 621a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 622a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 623a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* Decompressor */ 624a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 625a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstatic boolean fill_input_buffer(j_decompress_ptr dinfo) 626a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 627a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat ERREXIT(dinfo, JERR_BUFFER_SIZE); 628a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return TRUE; 629a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 630a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 631a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstatic void skip_input_data(j_decompress_ptr dinfo, long num_bytes) 632a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 633a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dinfo->src->next_input_byte += (size_t) num_bytes; 634a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dinfo->src->bytes_in_buffer -= (size_t) num_bytes; 635a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 636a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 637a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstatic void src_noop(j_decompress_ptr dinfo) 638a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 639a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 640a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 641a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstatic tjhandle _tjInitDecompress(tjinstance *this) 642a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 643a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat /* This is also straight out of example.c */ 644a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->dinfo.err=jpeg_std_error(&this->jerr.pub); 645a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->jerr.pub.error_exit=my_error_exit; 646a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->jerr.pub.output_message=my_output_message; 647a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 648a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(setjmp(this->jerr.setjmp_buffer)) 649a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 650a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat /* If we get here, the JPEG code has signaled an error. */ 651a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(this) free(this); return NULL; 652a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 653a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 654a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat jpeg_create_decompress(&this->dinfo); 655a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->dinfo.src=&this->jsrc; 656a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->jsrc.init_source=src_noop; 657a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->jsrc.fill_input_buffer=fill_input_buffer; 658a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->jsrc.skip_input_data=skip_input_data; 659a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->jsrc.resync_to_restart=jpeg_resync_to_restart; 660a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->jsrc.term_source=src_noop; 661a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 662a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->init|=DECOMPRESS; 663a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return (tjhandle)this; 664a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 665a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 666a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatDLLEXPORT tjhandle DLLCALL tjInitDecompress(void) 667a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 668a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat tjinstance *this; 669a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if((this=(tjinstance *)malloc(sizeof(tjinstance)))==NULL) 670a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 671a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat snprintf(errStr, JMSG_LENGTH_MAX, 672a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat "tjInitDecompress(): Memory allocation failure"); 673a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return NULL; 674a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 675a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat MEMZERO(this, sizeof(tjinstance)); 676a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return _tjInitDecompress(this); 677a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 678a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 679a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 680a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatDLLEXPORT int DLLCALL tjDecompressHeader2(tjhandle handle, 681a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat unsigned char *jpegBuf, unsigned long jpegSize, int *width, int *height, 682a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int *jpegSubsamp) 683a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 684a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int retval=0; 685a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 686a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat getinstance(handle); 687a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if((this->init&DECOMPRESS)==0) 688a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat _throw("tjDecompressHeader2(): Instance has not been initialized for decompression"); 689a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 690a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(jpegBuf==NULL || jpegSize<=0 || width==NULL || height==NULL 691a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat || jpegSubsamp==NULL) 692a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat _throw("tjDecompressHeader2(): Invalid argument"); 693a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 694a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(setjmp(this->jerr.setjmp_buffer)) 695a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 696a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat /* If we get here, the JPEG code has signaled an error. */ 697a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return -1; 698a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 699a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 700a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->jsrc.bytes_in_buffer=jpegSize; 701a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->jsrc.next_input_byte=jpegBuf; 702a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat jpeg_read_header(dinfo, TRUE); 703a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 704a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat *width=dinfo->image_width; 705a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat *height=dinfo->image_height; 706a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat *jpegSubsamp=getSubsamp(dinfo); 707a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 708a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat jpeg_abort_decompress(dinfo); 709a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 710a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(*jpegSubsamp<0) 711a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat _throw("tjDecompressHeader2(): Could not determine subsampling type for JPEG image"); 712a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(*width<1 || *height<1) 713a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat _throw("tjDecompressHeader2(): Invalid data returned in header"); 714a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 715a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat bailout: 716a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return retval; 717a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 718a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 719a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatDLLEXPORT int DLLCALL tjDecompressHeader(tjhandle handle, 720a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat unsigned char *jpegBuf, unsigned long jpegSize, int *width, int *height) 721a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 722a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int jpegSubsamp; 723a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return tjDecompressHeader2(handle, jpegBuf, jpegSize, width, height, 724a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat &jpegSubsamp); 725a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 726a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 727a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 728a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatDLLEXPORT tjscalingfactor* DLLCALL tjGetScalingFactors(int *numscalingfactors) 729a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 730a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(numscalingfactors==NULL) 731a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 732a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat snprintf(errStr, JMSG_LENGTH_MAX, 733a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat "tjGetScalingFactors(): Invalid argument"); 734a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return NULL; 735a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 736a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 737a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat *numscalingfactors=NUMSF; 738a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return (tjscalingfactor *)sf; 739a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 740a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 741a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 742a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatDLLEXPORT int DLLCALL tjDecompress2(tjhandle handle, unsigned char *jpegBuf, 743a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat unsigned long jpegSize, unsigned char *dstBuf, int width, int pitch, 744a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int height, int pixelFormat, int flags) 745a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 746a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int i, retval=0; JSAMPROW *row_pointer=NULL; 747a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int jpegwidth, jpegheight, scaledw, scaledh; 748a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #ifndef JCS_EXTENSIONS 749a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat unsigned char *rgbBuf=NULL; 750a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat unsigned char *_dstBuf=NULL; int _pitch=0; 751a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 752a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 753a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat getinstance(handle); 754a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if((this->init&DECOMPRESS)==0) 755a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat _throw("tjDecompress2(): Instance has not been initialized for decompression"); 756a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 757a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(jpegBuf==NULL || jpegSize<=0 || dstBuf==NULL || width<0 || pitch<0 758a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat || height<0 || pixelFormat<0 || pixelFormat>=TJ_NUMPF) 759a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat _throw("tjDecompress2(): Invalid argument"); 760a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 761a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(flags&TJFLAG_FORCEMMX) putenv("JSIMD_FORCEMMX=1"); 762a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat else if(flags&TJFLAG_FORCESSE) putenv("JSIMD_FORCESSE=1"); 763a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat else if(flags&TJFLAG_FORCESSE2) putenv("JSIMD_FORCESSE2=1"); 764a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 765a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(setjmp(this->jerr.setjmp_buffer)) 766a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 767a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat /* If we get here, the JPEG code has signaled an error. */ 768a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat retval=-1; 769a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat goto bailout; 770a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 771a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 772a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->jsrc.bytes_in_buffer=jpegSize; 773a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat this->jsrc.next_input_byte=jpegBuf; 774a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat jpeg_read_header(dinfo, TRUE); 775a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(setDecompDefaults(dinfo, pixelFormat)==-1) 776a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 777a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat retval=-1; goto bailout; 778a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 779a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 780a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(flags&TJFLAG_FASTUPSAMPLE) dinfo->do_fancy_upsampling=FALSE; 781a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 782a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat jpegwidth=dinfo->image_width; jpegheight=dinfo->image_height; 783a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(width==0) width=jpegwidth; 784a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(height==0) height=jpegheight; 785a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat for(i=0; i<NUMSF; i++) 786a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 787a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat scaledw=TJSCALED(jpegwidth, sf[i]); 788a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat scaledh=TJSCALED(jpegheight, sf[i]); 789a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(scaledw<=width && scaledh<=height) 790a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat break; 791a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 792a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(scaledw>width || scaledh>height) 793a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat _throw("tjDecompress2(): Could not scale down to desired image dimensions"); 794a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat width=scaledw; height=scaledh; 795a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dinfo->scale_num=sf[i].num; 796a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dinfo->scale_denom=sf[i].denom; 797a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 798a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat jpeg_start_decompress(dinfo); 799a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(pitch==0) pitch=dinfo->output_width*tjPixelSize[pixelFormat]; 800a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 801a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #ifndef JCS_EXTENSIONS 802a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(pixelFormat!=TJPF_GRAY && 803a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat (RGB_RED!=tjRedOffset[pixelFormat] || 804a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat RGB_GREEN!=tjGreenOffset[pixelFormat] || 805a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat RGB_BLUE!=tjBlueOffset[pixelFormat] || 806a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat RGB_PIXELSIZE!=tjPixelSize[pixelFormat])) 807a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 808a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat rgbBuf=(unsigned char *)malloc(width*height*3); 809a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(!rgbBuf) _throw("tjDecompress2(): Memory allocation failure"); 810a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat _pitch=pitch; pitch=width*3; 811a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat _dstBuf=dstBuf; dstBuf=rgbBuf; 812a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 813a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 814a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 815a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if((row_pointer=(JSAMPROW *)malloc(sizeof(JSAMPROW) 816a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat *dinfo->output_height))==NULL) 817a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat _throw("tjDecompress2(): Memory allocation failure"); 818a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat for(i=0; i<(int)dinfo->output_height; i++) 819a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 820a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(flags&TJFLAG_BOTTOMUP) 821a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat row_pointer[i]=&dstBuf[(dinfo->output_height-i-1)*pitch]; 822a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat else row_pointer[i]=&dstBuf[i*pitch]; 823a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 824a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat while(dinfo->output_scanline<dinfo->output_height) 825a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat { 826a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat jpeg_read_scanlines(dinfo, &row_pointer[dinfo->output_scanline], 827a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat dinfo->output_height-dinfo->output_scanline); 828a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 829a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat jpeg_finish_decompress(dinfo); 830a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 831a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #ifndef JCS_EXTENSIONS 832a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat fromRGB(rgbBuf, _dstBuf, width, _pitch, height, pixelFormat); 833a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 834a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 835a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat bailout: 836a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(dinfo->global_state>DSTATE_START) jpeg_abort_decompress(dinfo); 837a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #ifndef JCS_EXTENSIONS 838a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(rgbBuf) free(rgbBuf); 839a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat #endif 840a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if(row_pointer) free(row_pointer); 841a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return retval; 842a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 843a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 844a430b2b5ca4f0967836f5820e8f03adc17fc0a24San MehatDLLEXPORT int DLLCALL tjDecompress(tjhandle handle, unsigned char *jpegBuf, 845a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat unsigned long jpegSize, unsigned char *dstBuf, int width, int pitch, 846a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int height, int pixelSize, int flags) 847a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 848a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return tjDecompress2(handle, jpegBuf, jpegSize, dstBuf, width, pitch, 849a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat height, getPixelFormat(pixelSize, flags), flags); 850a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 851