📄 libmng_jpeg.c
字号:
/* ************************************************************************** *//* * For conditions of distribution and use, * *//* * see copyright notice in libmng.h * *//* ************************************************************************** *//* * * *//* * project : libmng * *//* * file : libmng_jpeg.c copyright (c) 2000 G.Juyn * *//* * version : 1.0.4 * *//* * * *//* * purpose : JPEG library interface (implementation) * *//* * * *//* * author : G.Juyn * *//* * web : http://www.3-t.com * *//* * email : mailto:info@3-t.com * *//* * * *//* * comment : implementation of the JPEG library interface * *//* * * *//* * changes : 0.5.1 - 05/08/2000 - G.Juyn * *//* * - changed strict-ANSI stuff * *//* * * *//* * 0.5.2 - 05/22/2000 - G.Juyn * *//* * - implemented all the JNG routines * *//* * * *//* * 0.5.3 - 06/17/2000 - G.Juyn * *//* * - added tracing of JPEG calls * *//* * 0.5.3 - 06/24/2000 - G.Juyn * *//* * - fixed inclusion of IJG read/write code * *//* * 0.5.3 - 06/29/2000 - G.Juyn * *//* * - fixed some 64-bit warnings * *//* * * *//* * 0.9.2 - 08/05/2000 - G.Juyn * *//* * - changed file-prefixes * *//* * * *//* * 0.9.3 - 10/16/2000 - G.Juyn * *//* * - added support for JDAA * *//* * * *//* * 1.0.1 - 04/19/2001 - G.Juyn * *//* * - added export of JPEG functions for DLL * *//* * 1.0.1 - 04/22/2001 - G.Juyn * *//* * - fixed memory-leaks (Thanks Gregg!) * *//* * * *//* * 1.0.4 - 06/22/2002 - G.Juyn * *//* * - B526138 - returned IJGSRC6B calling convention to * *//* * default for MSVC * *//* * * *//* ************************************************************************** */#include "libmng.h"#include "libmng_data.h"#include "libmng_error.h"#include "libmng_trace.h"#ifdef __BORLANDC__#pragma hdrstop#endif#include "libmng_memory.h"#include "libmng_pixels.h"#include "libmng_jpeg.h"#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI)#pragma option -A /* force ANSI-C */#endif/* ************************************************************************** */#ifdef MNG_INCLUDE_JNG/* ************************************************************************** *//* * * *//* * Local IJG callback routines (source-manager, error-manager and such) * *//* * * *//* ************************************************************************** */#ifdef MNG_INCLUDE_IJG6B/* ************************************************************************** */#ifdef MNG_INCLUDE_JNG_READ#ifdef MNG_DEFINE_JPEG_STDCALLvoid MNG_DECL mng_init_source (j_decompress_ptr cinfo)#elsevoid mng_init_source (j_decompress_ptr cinfo)#endif{ return; /* nothing needed */}#endif /* MNG_INCLUDE_JNG_READ *//* ************************************************************************** */#ifdef MNG_INCLUDE_JNG_READ#ifdef MNG_DEFINE_JPEG_STDCALLboolean MNG_DECL mng_fill_input_buffer (j_decompress_ptr cinfo)#elseboolean mng_fill_input_buffer (j_decompress_ptr cinfo)#endif{ return FALSE; /* force IJG routine to return to caller */}#endif /* MNG_INCLUDE_JNG_READ *//* ************************************************************************** */#ifdef MNG_INCLUDE_JNG_READ#ifdef MNG_DEFINE_JPEG_STDCALLvoid MNG_DECL mng_skip_input_data (j_decompress_ptr cinfo, long num_bytes)#elsevoid mng_skip_input_data (j_decompress_ptr cinfo, long num_bytes)#endif{ if (num_bytes > 0) /* ignore fony calls */ { /* address my generic structure */ mng_datap pData = (mng_datap)cinfo->client_data; /* address source manager */ mngjpeg_sourcep pSrc = pData->pJPEGdinfo->src; /* problem scenario ? */ if (pSrc->bytes_in_buffer < (size_t)num_bytes) { /* tell the boss we need to skip some data! */ pData->iJPEGtoskip = (mng_uint32)((size_t)num_bytes - pSrc->bytes_in_buffer); pSrc->bytes_in_buffer = 0; /* let the JPEG lib suspend */ pSrc->next_input_byte = MNG_NULL; } else { /* simply advance in the buffer */ pSrc->bytes_in_buffer -= num_bytes; pSrc->next_input_byte += num_bytes; } } return;}#endif /* MNG_INCLUDE_JNG_READ *//* ************************************************************************** */#ifdef MNG_INCLUDE_JNG_READ#ifdef MNG_DEFINE_JPEG_STDCALLvoid MNG_DECL mng_skip_input_data2 (j_decompress_ptr cinfo, long num_bytes)#elsevoid mng_skip_input_data2 (j_decompress_ptr cinfo, long num_bytes)#endif{ if (num_bytes > 0) /* ignore fony calls */ { /* address my generic structure */ mng_datap pData = (mng_datap)cinfo->client_data; /* address source manager */ mngjpeg_sourcep pSrc = pData->pJPEGdinfo2->src; /* problem scenario ? */ if (pSrc->bytes_in_buffer < (size_t)num_bytes) { /* tell the boss we need to skip some data! */ pData->iJPEGtoskip2 = (mng_uint32)((size_t)num_bytes - pSrc->bytes_in_buffer); pSrc->bytes_in_buffer = 0; /* let the JPEG lib suspend */ pSrc->next_input_byte = MNG_NULL; } else { /* simply advance in the buffer */ pSrc->bytes_in_buffer -= num_bytes; pSrc->next_input_byte += num_bytes; } } return;}#endif /* MNG_INCLUDE_JNG_READ *//* ************************************************************************** */#ifdef MNG_INCLUDE_JNG_READ#ifdef MNG_DEFINE_JPEG_STDCALLvoid MNG_DECL mng_term_source (j_decompress_ptr cinfo)#elsevoid mng_term_source (j_decompress_ptr cinfo)#endif{ return; /* nothing needed */}#endif /* MNG_INCLUDE_JNG_READ *//* ************************************************************************** */#ifdef MNG_USE_SETJMP#ifdef MNG_DEFINE_JPEG_STDCALLvoid MNG_DECL mng_error_exit (j_common_ptr cinfo)#elsevoid mng_error_exit (j_common_ptr cinfo)#endif{ /* address my generic structure */ mng_datap pData = (mng_datap)cinfo->client_data;#ifdef MNG_ERROR_TELLTALE /* fill the message text ??? */ (*cinfo->err->output_message) (cinfo);#endif /* return to the point of no return... */ longjmp (pData->sErrorbuf, cinfo->err->msg_code);}#endif /* MNG_USE_SETJMP *//* ************************************************************************** */#ifdef MNG_USE_SETJMP#ifdef MNG_DEFINE_JPEG_STDCALLvoid MNG_DECL mng_output_message (j_common_ptr cinfo)#elsevoid mng_output_message (j_common_ptr cinfo)#endif{ return; /* just do nothing ! */}#endif /* MNG_USE_SETJMP *//* ************************************************************************** */#endif /* MNG_INCLUDE_IJG6B *//* ************************************************************************** *//* * * *//* * Global JPEG routines * *//* * * *//* ************************************************************************** */mng_retcode mngjpeg_initialize (mng_datap pData){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_JPEG_INITIALIZE, MNG_LC_START)#endif /* allocate space for JPEG structures if necessary */#ifdef MNG_INCLUDE_JNG_READ if (pData->pJPEGderr == MNG_NULL) MNG_ALLOC (pData, pData->pJPEGderr, sizeof (mngjpeg_error )) if (pData->pJPEGdsrc == MNG_NULL) MNG_ALLOC (pData, pData->pJPEGdsrc, sizeof (mngjpeg_source)) if (pData->pJPEGdinfo == MNG_NULL) MNG_ALLOC (pData, pData->pJPEGdinfo, sizeof (mngjpeg_decomp)) /* enable reverse addressing */ pData->pJPEGdinfo->client_data = pData; if (pData->pJPEGderr2 == MNG_NULL) MNG_ALLOC (pData, pData->pJPEGderr2, sizeof (mngjpeg_error )) if (pData->pJPEGdsrc2 == MNG_NULL) MNG_ALLOC (pData, pData->pJPEGdsrc2, sizeof (mngjpeg_source)) if (pData->pJPEGdinfo2 == MNG_NULL) MNG_ALLOC (pData, pData->pJPEGdinfo2, sizeof (mngjpeg_decomp)) /* enable reverse addressing */ pData->pJPEGdinfo2->client_data = pData;#endif#ifdef MNG_INCLUDE_JNG_WRITE if (pData->pJPEGcerr == MNG_NULL) MNG_ALLOC (pData, pData->pJPEGcerr, sizeof (mngjpeg_error )) if (pData->pJPEGcinfo == MNG_NULL) MNG_ALLOC (pData, pData->pJPEGcinfo, sizeof (mngjpeg_comp )) /* enable reverse addressing */ pData->pJPEGcinfo->client_data = pData;#endif if (pData->pJPEGbuf == MNG_NULL) /* initialize temporary buffers */ { pData->iJPEGbufmax = MNG_JPEG_MAXBUF; MNG_ALLOC (pData, pData->pJPEGbuf, pData->iJPEGbufmax) } if (pData->pJPEGbuf2 == MNG_NULL) { pData->iJPEGbufmax2 = MNG_JPEG_MAXBUF; MNG_ALLOC (pData, pData->pJPEGbuf2, pData->iJPEGbufmax2) } pData->pJPEGcurrent = pData->pJPEGbuf; pData->iJPEGbufremain = 0; pData->pJPEGrow = MNG_NULL; pData->iJPEGrowlen = 0; pData->iJPEGtoskip = 0; pData->pJPEGcurrent2 = pData->pJPEGbuf2; pData->iJPEGbufremain2 = 0; pData->pJPEGrow2 = MNG_NULL; pData->iJPEGrowlen2 = 0; pData->iJPEGtoskip2 = 0; /* not doing anything yet ! */ pData->bJPEGcompress = MNG_FALSE; pData->bJPEGdecompress = MNG_FALSE; pData->bJPEGhasheader = MNG_FALSE; pData->bJPEGdecostarted = MNG_FALSE; pData->bJPEGscanstarted = MNG_FALSE; pData->bJPEGdecompress2 = MNG_FALSE; pData->bJPEGhasheader2 = MNG_FALSE; pData->bJPEGdecostarted2 = MNG_FALSE; pData->bJPEGscanstarted2 = MNG_FALSE; pData->iJPEGrow = 0; /* zero input/output lines */ pData->iJPEGalpharow = 0; pData->iJPEGrgbrow = 0; pData->iJPEGdisprow = 0;#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_JPEG_INITIALIZE, MNG_LC_END)#endif return MNG_NOERROR;}/* ************************************************************************** */mng_retcode mngjpeg_cleanup (mng_datap pData){#if defined(MNG_INCLUDE_IJG6B) && defined(MNG_USE_SETJMP) mng_retcode iRetcode;#endif#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_JPEG_CLEANUP, MNG_LC_START)#endif#ifdef MNG_INCLUDE_IJG6B#ifdef MNG_USE_SETJMP iRetcode = setjmp (pData->sErrorbuf);/* setup local JPEG error-recovery */ if (iRetcode != 0) /* got here from longjmp ? */ MNG_ERRORJ (pData, iRetcode) /* then IJG-lib issued an error */#endif#ifdef MNG_INCLUDE_JNG_READ /* still decompressing something ? */ if (pData->bJPEGdecompress) jpeg_destroy_decompress (pData->pJPEGdinfo); if (pData->bJPEGdecompress2) jpeg_destroy_decompress (pData->pJPEGdinfo2);#endif#ifdef MNG_INCLUDE_JNG_WRITE if (pData->bJPEGcompress) /* still compressing something ? */ jpeg_destroy_compress (pData->pJPEGcinfo);#endif#endif /* MNG_INCLUDE_IJG6B */ /* cleanup temporary buffers */ MNG_FREE (pData, pData->pJPEGbuf2, pData->iJPEGbufmax2) MNG_FREE (pData, pData->pJPEGbuf, pData->iJPEGbufmax) /* cleanup space for JPEG structures */#ifdef MNG_INCLUDE_JNG_WRITE MNG_FREE (pData, pData->pJPEGcinfo, sizeof (mngjpeg_comp )) MNG_FREE (pData, pData->pJPEGcerr, sizeof (mngjpeg_error ))#endif#ifdef MNG_INCLUDE_JNG_READ MNG_FREE (pData, pData->pJPEGdinfo, sizeof (mngjpeg_decomp)) MNG_FREE (pData, pData->pJPEGdsrc, sizeof (mngjpeg_source)) MNG_FREE (pData, pData->pJPEGderr, sizeof (mngjpeg_error )) MNG_FREE (pData, pData->pJPEGdinfo2, sizeof (mngjpeg_decomp)) MNG_FREE (pData, pData->pJPEGdsrc2, sizeof (mngjpeg_source)) MNG_FREE (pData, pData->pJPEGderr2, sizeof (mngjpeg_error ))#endif MNG_FREE (pData, pData->pJPEGrow2, pData->iJPEGrowlen2) MNG_FREE (pData, pData->pJPEGrow, pData->iJPEGrowlen)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -