📄 libmng_chunk_xs.c
字号:
/* ************************************************************************** */
/* * For conditions of distribution and use, * */
/* * see copyright notice in libmng.h * */
/* ************************************************************************** */
/* * * */
/* * project : libmng * */
/* * file : libmng_chunk_xs.c copyright (c) 2000-2003 G.Juyn * */
/* * version : 1.0.8 * */
/* * * */
/* * purpose : chunk access functions (implementation) * */
/* * * */
/* * author : G.Juyn * */
/* * * */
/* * comment : implementation of the chunk access functions * */
/* * * */
/* * changes : 0.5.1 - 05/06/2000 - G.Juyn * */
/* * - changed and filled iterate-chunk function * */
/* * 0.5.1 - 05/08/2000 - G.Juyn * */
/* * - fixed calling convention * */
/* * - added getchunk functions * */
/* * - added putchunk functions * */
/* * - changed strict-ANSI stuff * */
/* * 0.5.1 - 05/11/2000 - G.Juyn * */
/* * - added empty-chunk put-routines * */
/* * 0.5.1 - 05/12/2000 - G.Juyn * */
/* * - changed trace to macro for callback error-reporting * */
/* * 0.5.1 - 05/15/2000 - G.Juyn * */
/* * - added getimgdata & putimgdata functions * */
/* * * */
/* * 0.5.2 - 05/19/2000 - G.Juyn * */
/* * - B004 - fixed problem with MNG_SUPPORT_WRITE not defined * */
/* * also for MNG_SUPPORT_WRITE without MNG_INCLUDE_JNG * */
/* * - Cleaned up some code regarding mixed support * */
/* * * */
/* * 0.9.1 - 07/19/2000 - G.Juyn * */
/* * - fixed creation-code * */
/* * * */
/* * 0.9.2 - 08/05/2000 - G.Juyn * */
/* * - changed file-prefixes * */
/* * - added function to set simplicity field * */
/* * - fixed putchunk_unknown() function * */
/* * * */
/* * 0.9.3 - 08/07/2000 - G.Juyn * */
/* * - B111300 - fixup for improved portability * */
/* * 0.9.3 - 08/26/2000 - G.Juyn * */
/* * - added MAGN chunk * */
/* * 0.9.3 - 10/20/2000 - G.Juyn * */
/* * - fixed putchunk_plte() to set bEmpty parameter * */
/* * * */
/* * 0.9.5 - 01/25/2001 - G.Juyn * */
/* * - fixed some small compiler warnings (thanks Nikki) * */
/* * * */
/* * 1.0.5 - 09/07/2002 - G.Juyn * */
/* * - B578940 - unimplemented functions return errorcode * */
/* * 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/07/2002 - G.Juyn * */
/* * - added check for TERM placement during create/write * */
/* * 1.0.5 - 11/28/2002 - G.Juyn * */
/* * - fixed definition of iMethodX/Y for MAGN chunk * */
/* * * */
/* * 1.0.6 - 05/25/2003 - G.R-P * */
/* * - added MNG_SKIPCHUNK_cHNK footprint optimizations * */
/* * 1.0.6 - 07/07/2003 - G.R-P * */
/* * - added MNG_NO_DELTA_PNG reduction and more SKIPCHUNK * */
/* * optimizations * */
/* * 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.8 - 04/01/2004 - G.Juyn * */
/* * - added missing get-/put-chunk-jdaa * */
/* * 1.0.8 - 08/02/2004 - G.Juyn * */
/* * - added conditional to allow easier writing of large MNG's * */
/* * * */
/* ************************************************************************** */
#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"
#include "libmng_chunk_io.h"
#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI)
#pragma option -A /* force ANSI-C */
#endif
/* ************************************************************************** */
#ifdef MNG_ACCESS_CHUNKS
/* ************************************************************************** */
mng_retcode MNG_DECL mng_iterate_chunks (mng_handle hHandle,
mng_uint32 iChunkseq,
mng_iteratechunk fProc)
{
mng_uint32 iSeq;
mng_chunkid iChunkname;
mng_datap pData;
mng_chunkp pChunk;
mng_bool bCont;
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (((mng_datap)hHandle), MNG_FN_ITERATE_CHUNKS, MNG_LC_START)
#endif
MNG_VALIDHANDLE (hHandle) /* check validity handle */
pData = ((mng_datap)hHandle); /* and make it addressable */
iSeq = 0;
bCont = MNG_TRUE;
pChunk = pData->pFirstchunk; /* get the first chunk */
/* as long as there are some more */
while ((pChunk) && (bCont)) /* and the app didn't signal a stop */
{
if (iSeq >= iChunkseq) /* reached the first target ? */
{ /* then call this and next ones back in... */
iChunkname = ((mng_chunk_headerp)pChunk)->iChunkname;
bCont = fProc (hHandle, (mng_handle)pChunk, iChunkname, iSeq);
}
iSeq++; /* next one */
pChunk = ((mng_chunk_headerp)pChunk)->pNext;
}
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (((mng_datap)hHandle), MNG_FN_ITERATE_CHUNKS, MNG_LC_END)
#endif
return MNG_NOERROR;
}
/* ************************************************************************** */
#ifdef MNG_SUPPORT_WRITE
mng_retcode MNG_DECL mng_copy_chunk (mng_handle hHandle,
mng_handle hChunk,
mng_handle hHandleOut)
{
mng_datap pDataOut;
mng_chunkp pChunk;
mng_chunkp pChunkOut;
mng_retcode iRetcode;
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (((mng_datap)hHandle), MNG_FN_COPY_CHUNK, MNG_LC_START)
#endif
MNG_VALIDHANDLE (hHandle) /* check validity handles */
MNG_VALIDHANDLE (hHandleOut)
pDataOut = (mng_datap)hHandleOut; /* make outhandle addressable */
pChunk = (mng_chunkp)hChunk; /* address the chunk */
if (!pDataOut->bCreating) /* aren't we creating a new file ? */
MNG_ERROR (pDataOut, MNG_FUNCTIONINVALID)
/* create a new chunk */
iRetcode = ((mng_createchunk)((mng_chunk_headerp)pChunk)->fCreate)
(pDataOut, ((mng_chunk_headerp)pChunk), &pChunkOut);
if (!iRetcode) /* assign the chunk-specific data */
iRetcode = ((mng_assignchunk)((mng_chunk_headerp)pChunk)->fAssign)
(pDataOut, pChunkOut, pChunk);
if (iRetcode) /* on error bail out */
return iRetcode;
mng_add_chunk (pDataOut, pChunkOut); /* and put it in the output-stream */
/* could it be the end of the chain ? */
if (((mng_chunk_headerp)pChunkOut)->iChunkname == MNG_UINT_IEND)
{
#ifdef MNG_INCLUDE_JNG
if ((pDataOut->iFirstchunkadded == MNG_UINT_IHDR) ||
(pDataOut->iFirstchunkadded == MNG_UINT_JHDR) )
#else
if (pDataOut->iFirstchunkadded == MNG_UINT_IHDR)
#endif
pDataOut->bCreating = MNG_FALSE; /* right; this should be the last chunk !!! */
}
if (((mng_chunk_headerp)pChunkOut)->iChunkname == MNG_UINT_MEND)
pDataOut->bCreating = MNG_FALSE; /* definitely this should be the last !!! */
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (((mng_datap)hHandle), MNG_FN_COPY_CHUNK, MNG_LC_END)
#endif
return MNG_NOERROR;
}
#endif /* MNG_SUPPORT_WRITE */
/* ************************************************************************** */
mng_retcode MNG_DECL mng_getchunk_ihdr (mng_handle hHandle,
mng_handle hChunk,
mng_uint32 *iWidth,
mng_uint32 *iHeight,
mng_uint8 *iBitdepth,
mng_uint8 *iColortype,
mng_uint8 *iCompression,
mng_uint8 *iFilter,
mng_uint8 *iInterlace)
{
mng_datap pData;
mng_ihdrp pChunk;
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_IHDR, MNG_LC_START)
#endif
MNG_VALIDHANDLE (hHandle) /* check validity handle */
pData = (mng_datap)hHandle; /* and make it addressable */
pChunk = (mng_ihdrp)hChunk; /* address the chunk */
if (pChunk->sHeader.iChunkname != MNG_UINT_IHDR)
MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */
*iWidth = pChunk->iWidth; /* fill the fields */
*iHeight = pChunk->iHeight;
*iBitdepth = pChunk->iBitdepth;
*iColortype = pChunk->iColortype;
*iCompression = pChunk->iCompression;
*iFilter = pChunk->iFilter;
*iInterlace = pChunk->iInterlace;
/* fill the chunk */
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_IHDR, MNG_LC_END)
#endif
return MNG_NOERROR;
}
/* ************************************************************************** */
mng_retcode MNG_DECL mng_getchunk_plte (mng_handle hHandle,
mng_handle hChunk,
mng_uint32 *iCount,
mng_palette8 *aPalette)
{
mng_datap pData;
mng_pltep pChunk;
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PLTE, MNG_LC_START)
#endif
MNG_VALIDHANDLE (hHandle) /* check validity handle */
pData = (mng_datap)hHandle; /* and make it addressable */
pChunk = (mng_pltep)hChunk; /* address the chunk */
if (pChunk->sHeader.iChunkname != MNG_UINT_PLTE)
MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */
*iCount = pChunk->iEntrycount; /* fill the fields */
MNG_COPY (*aPalette, pChunk->aEntries, sizeof (mng_palette8))
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PLTE, MNG_LC_END)
#endif
return MNG_NOERROR;
}
/* ************************************************************************** */
mng_retcode MNG_DECL mng_getchunk_idat (mng_handle hHandle,
mng_handle hChunk,
mng_uint32 *iRawlen,
mng_ptr *pRawdata)
{
mng_datap pData;
mng_idatp pChunk;
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_IDAT, MNG_LC_START)
#endif
MNG_VALIDHANDLE (hHandle) /* check validity handle */
pData = (mng_datap)hHandle; /* and make it addressable */
pChunk = (mng_idatp)hChunk; /* address the chunk */
if (pChunk->sHeader.iChunkname != MNG_UINT_IDAT)
MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */
*iRawlen = pChunk->iDatasize; /* fill the fields */
*pRawdata = pChunk->pData;
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_IDAT, MNG_LC_END)
#endif
return MNG_NOERROR;
}
/* ************************************************************************** */
mng_retcode MNG_DECL mng_getchunk_trns (mng_handle hHandle,
mng_handle hChunk,
mng_bool *bEmpty,
mng_bool *bGlobal,
mng_uint8 *iType,
mng_uint32 *iCount,
mng_uint8arr *aAlphas,
mng_uint16 *iGray,
mng_uint16 *iRed,
mng_uint16 *iGreen,
mng_uint16 *iBlue,
mng_uint32 *iRawlen,
mng_uint8arr *aRawdata)
{
mng_datap pData;
mng_trnsp pChunk;
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_TRNS, MNG_LC_START)
#endif
MNG_VALIDHANDLE (hHandle) /* check validity handle */
pData = (mng_datap)hHandle; /* and make it addressable */
pChunk = (mng_trnsp)hChunk; /* address the chunk */
if (pChunk->sHeader.iChunkname != MNG_UINT_tRNS)
MNG_ERROR (pData, MNG_WRONGCHUNK) /* ouch */
*bEmpty = pChunk->bEmpty; /* fill the fields */
*bGlobal = pChunk->bGlobal;
*iType = pChunk->iType;
*iCount = pChunk->iCount;
*iGray = pChunk->iGray;
*iRed = pChunk->iRed;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -