📄 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.7 * */
/* * * */
/* * 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 * */
/* * * */
/* ************************************************************************** */
#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
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;
}
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 * */
/* * * */
/* ************************************************************************** */
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_gAMA
INIT_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_cHRM
INIT_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_sRGB
INIT_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_iCCP
INIT_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_tEXt
INIT_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_zTXt
INIT_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_iTXt
INIT_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_bKGD
INIT_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_pHYs
INIT_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_sBIT
INIT_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_sPLT
INIT_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_hIST
INIT_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_tIME
INIT_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);
#ifdef MNG_SUPPORT_TRACE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -