📄 libmng_chunk_prc.c
字号:
/* ************************************************************************** *//* * For conditions of distribution and use, * *//* * see copyright notice in libmng.h * *//* ************************************************************************** *//* * * *//* * project : libmng * *//* * file : libmng_chunk_prc.c copyright (c) 2000-2004 G.Juyn * *//* * version : 1.0.9 * *//* * * *//* * purpose : Chunk initialization & cleanup (implementation) * *//* * * *//* * author : G.Juyn * *//* * * *//* * comment : implementation of the chunk initialization & cleanup * *//* * routines * *//* * * *//* * changes : 0.5.1 - 05/08/2000 - G.Juyn * *//* * - changed strict-ANSI stuff * *//* * 0.5.1 - 05/12/2000 - G.Juyn * *//* * - changed trace to macro for callback error-reporting * *//* * * *//* * 0.9.1 - 07/19/2000 - G.Juyn * *//* * - fixed creation-code * *//* * * *//* * 0.9.2 - 07/31/2000 - G.Juyn * *//* * - put add_chunk() inside MNG_INCLUDE_WRITE_PROCS wrapper * *//* * 0.9.2 - 08/01/2000 - G.Juyn * *//* * - wrapper for add_chunk() changed * *//* * 0.9.2 - 08/05/2000 - G.Juyn * *//* * - changed file-prefixes * *//* * * *//* * 0.9.3 - 08/26/2000 - G.Juyn * *//* * - added MAGN chunk * *//* * 0.9.3 - 10/16/2000 - G.Juyn * *//* * - added support for JDAA * *//* * * *//* * 1.0.5 - 08/19/2002 - G.Juyn * *//* * - B597134 - libmng pollutes the linker namespace * *//* * - added HLAPI function to copy chunks * *//* * 1.0.5 - 09/14/2002 - G.Juyn * *//* * - added event handling for dynamic MNG * *//* * 1.0.5 - 10/04/2002 - G.Juyn * *//* * - fixed chunk-storage for evNT chunk * *//* * 1.0.5 - 10/17/2002 - G.Juyn * *//* * - fixed issue in freeing evNT chunk * *//* * * *//* * 1.0.6 - 07/07/2003 - G.R-P * *//* * - added MNG_SKIPCHUNK_cHNK footprint optimizations * *//* * - added MNG_NO_DELTA_PNG reduction feature * *//* * 1.0.6 - 07/14/2003 - G.R-P * *//* * - added MNG_NO_LOOP_SIGNALS_SUPPORTED conditional * *//* * 1.0.6 - 07/29/2003 - G.R-P * *//* * - added conditionals around PAST chunk support * *//* * 1.0.6 - 08/17/2003 - G.R-P * *//* * - added conditionals around non-VLC chunk support * *//* * * *//* * 1.0.7 - 03/24/2004 - G.R-P * *//* * - fixed SKIPCHUNK_eXPI -> fPRI typo * *//* * * *//* * 1.0.9 - 09/25/2004 - G.Juyn * *//* * - replaced MNG_TWEAK_LARGE_FILES with permanent solution * *//* * 1.0.9 - 12/05/2004 - G.Juyn * *//* * - added conditional MNG_OPTIMIZE_CHUNKINITFREE * *//* * 1.0.9 - 12/06/2004 - G.Juyn * *//* * - added conditional MNG_OPTIMIZE_CHUNKASSIGN * *//* * 1.0.9 - 12/20/2004 - G.Juyn * *//* * - cleaned up macro-invocations (thanks to D. Airlie) * *//* * * *//* ************************************************************************** */#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_chunks.h"#include "libmng_chunk_prc.h"#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI)#pragma option -A /* force ANSI-C */#endif/* ************************************************************************** *//* * * *//* * General chunk routines * *//* * * *//* ************************************************************************** */void mng_add_chunk (mng_datap pData, mng_chunkp pChunk){ if (!pData->pFirstchunk) /* list is still empty ? */ { pData->pFirstchunk = pChunk; /* then this becomes the first */ #ifdef MNG_SUPPORT_WRITE if (!pData->iFirstchunkadded) { pData->iFirstchunkadded = ((mng_chunk_headerp)pChunk)->iChunkname;#endif if (((mng_chunk_headerp)pChunk)->iChunkname == MNG_UINT_IHDR) pData->eImagetype = mng_it_png; else#ifdef MNG_INCLUDE_JNG if (((mng_chunk_headerp)pChunk)->iChunkname == MNG_UINT_JHDR) pData->eImagetype = mng_it_jng; else#endif pData->eImagetype = mng_it_mng; pData->eSigtype = pData->eImagetype;#ifdef MNG_SUPPORT_WRITE }#endif } else { /* else we make appropriate links */ ((mng_chunk_headerp)pChunk)->pPrev = pData->pLastchunk; ((mng_chunk_headerp)pData->pLastchunk)->pNext = pChunk; } pData->pLastchunk = pChunk; /* and it's always the last */ return;}/* ************************************************************************** *//* * * *//* * Chunk specific initialization routines * *//* * * *//* ************************************************************************** */#ifdef MNG_OPTIMIZE_CHUNKINITFREEINIT_CHUNK_HDR (mng_init_general){ MNG_ALLOC (pData, *ppChunk, ((mng_chunk_headerp)pHeader)->iChunksize); MNG_COPY (*ppChunk, pHeader, sizeof (mng_chunk_header)); return MNG_NOERROR;}#else /* MNG_OPTIMIZE_CHUNKINITFREE *//* ************************************************************************** */INIT_CHUNK_HDR (mng_init_ihdr){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_IHDR, MNG_LC_START);#endif MNG_ALLOC (pData, *ppChunk, sizeof (mng_ihdr)); ((mng_ihdrp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader);#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_IHDR, MNG_LC_END);#endif return MNG_NOERROR;}/* ************************************************************************** */INIT_CHUNK_HDR (mng_init_plte){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_PLTE, MNG_LC_START);#endif MNG_ALLOC (pData, *ppChunk, sizeof (mng_plte)); ((mng_pltep)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader);#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_PLTE, MNG_LC_END);#endif return MNG_NOERROR;}/* ************************************************************************** */INIT_CHUNK_HDR (mng_init_idat){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_IDAT, MNG_LC_START);#endif MNG_ALLOC (pData, *ppChunk, sizeof (mng_idat)); ((mng_idatp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader);#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_IDAT, MNG_LC_END);#endif return MNG_NOERROR;}/* ************************************************************************** */INIT_CHUNK_HDR (mng_init_iend){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_IEND, MNG_LC_START);#endif MNG_ALLOC (pData, *ppChunk, sizeof (mng_iend)); ((mng_iendp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader);#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_IEND, MNG_LC_END);#endif return MNG_NOERROR;}/* ************************************************************************** */INIT_CHUNK_HDR (mng_init_trns){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_TRNS, MNG_LC_START);#endif MNG_ALLOC (pData, *ppChunk, sizeof (mng_trns)); ((mng_trnsp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader);#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_TRNS, MNG_LC_END);#endif return MNG_NOERROR;}/* ************************************************************************** */#ifndef MNG_SKIPCHUNK_gAMAINIT_CHUNK_HDR (mng_init_gama){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_GAMA, MNG_LC_START);#endif MNG_ALLOC (pData, *ppChunk, sizeof (mng_gama)); ((mng_gamap)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader);#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_GAMA, MNG_LC_END);#endif return MNG_NOERROR;}#endif/* ************************************************************************** */#ifndef MNG_SKIPCHUNK_cHRMINIT_CHUNK_HDR (mng_init_chrm){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_CHRM, MNG_LC_START);#endif MNG_ALLOC (pData, *ppChunk, sizeof (mng_chrm)); ((mng_chrmp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader);#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_CHRM, MNG_LC_END);#endif return MNG_NOERROR;}#endif/* ************************************************************************** */#ifndef MNG_SKIPCHUNK_sRGBINIT_CHUNK_HDR (mng_init_srgb){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_SRGB, MNG_LC_START);#endif MNG_ALLOC (pData, *ppChunk, sizeof (mng_srgb)); ((mng_srgbp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader);#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_SRGB, MNG_LC_END);#endif return MNG_NOERROR;}#endif/* ************************************************************************** */#ifndef MNG_SKIPCHUNK_iCCPINIT_CHUNK_HDR (mng_init_iccp){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_ICCP, MNG_LC_START);#endif MNG_ALLOC (pData, *ppChunk, sizeof (mng_iccp)); ((mng_iccpp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader);#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_ICCP, MNG_LC_END);#endif return MNG_NOERROR;}#endif/* ************************************************************************** */#ifndef MNG_SKIPCHUNK_tEXtINIT_CHUNK_HDR (mng_init_text){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_TEXT, MNG_LC_START);#endif MNG_ALLOC (pData, *ppChunk, sizeof (mng_text)); ((mng_textp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader);#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_TEXT, MNG_LC_END);#endif return MNG_NOERROR;}#endif/* ************************************************************************** */#ifndef MNG_SKIPCHUNK_zTXtINIT_CHUNK_HDR (mng_init_ztxt){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_ZTXT, MNG_LC_START);#endif MNG_ALLOC (pData, *ppChunk, sizeof (mng_ztxt)); ((mng_ztxtp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader);#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_ZTXT, MNG_LC_END);#endif return MNG_NOERROR;}#endif/* ************************************************************************** */#ifndef MNG_SKIPCHUNK_iTXtINIT_CHUNK_HDR (mng_init_itxt){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_ITXT, MNG_LC_START);#endif MNG_ALLOC (pData, *ppChunk, sizeof (mng_itxt)); ((mng_itxtp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader);#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_ITXT, MNG_LC_END);#endif return MNG_NOERROR;}#endif/* ************************************************************************** */#ifndef MNG_SKIPCHUNK_bKGDINIT_CHUNK_HDR (mng_init_bkgd){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_BKGD, MNG_LC_START);#endif MNG_ALLOC (pData, *ppChunk, sizeof (mng_bkgd)); ((mng_bkgdp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader);#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_BKGD, MNG_LC_END);#endif return MNG_NOERROR;}#endif/* ************************************************************************** */#ifndef MNG_SKIPCHUNK_pHYsINIT_CHUNK_HDR (mng_init_phys){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_PHYS, MNG_LC_START);#endif MNG_ALLOC (pData, *ppChunk, sizeof (mng_phys)); ((mng_physp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader);#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_PHYS, MNG_LC_END);#endif return MNG_NOERROR;}#endif/* ************************************************************************** */#ifndef MNG_SKIPCHUNK_sBITINIT_CHUNK_HDR (mng_init_sbit){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_SBIT, MNG_LC_START);#endif MNG_ALLOC (pData, *ppChunk, sizeof (mng_sbit)); ((mng_sbitp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader);#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_SBIT, MNG_LC_END);#endif return MNG_NOERROR;}#endif/* ************************************************************************** */#ifndef MNG_SKIPCHUNK_sPLTINIT_CHUNK_HDR (mng_init_splt){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_SPLT, MNG_LC_START);#endif MNG_ALLOC (pData, *ppChunk, sizeof (mng_splt)); ((mng_spltp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader);#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_SPLT, MNG_LC_END);#endif return MNG_NOERROR;}#endif/* ************************************************************************** */#ifndef MNG_SKIPCHUNK_hISTINIT_CHUNK_HDR (mng_init_hist){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_HIST, MNG_LC_START);#endif MNG_ALLOC (pData, *ppChunk, sizeof (mng_hist)); ((mng_histp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader);#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_HIST, MNG_LC_END);#endif return MNG_NOERROR;}#endif/* ************************************************************************** */#ifndef MNG_SKIPCHUNK_tIMEINIT_CHUNK_HDR (mng_init_time){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_TIME, MNG_LC_START);#endif MNG_ALLOC (pData, *ppChunk, sizeof (mng_time)); ((mng_timep)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader);#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_TIME, MNG_LC_END);#endif return MNG_NOERROR;}#endif/* ************************************************************************** */INIT_CHUNK_HDR (mng_init_mhdr){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_MHDR, MNG_LC_START);#endif MNG_ALLOC (pData, *ppChunk, sizeof (mng_mhdr)); ((mng_mhdrp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader);#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_MHDR, MNG_LC_END);#endif return MNG_NOERROR;}/* ************************************************************************** */INIT_CHUNK_HDR (mng_init_mend){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_INIT_MEND, MNG_LC_START);#endif MNG_ALLOC (pData, *ppChunk, sizeof (mng_mend)); ((mng_mendp)*ppChunk)->sHeader = *((mng_chunk_headerp)pHeader);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -