src/3rdparty/libmng/libmng_chunk_xs.c
changeset 0 1918ee327afb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/3rdparty/libmng/libmng_chunk_xs.c	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,7016 @@
+/* ************************************************************************** */
+/* *             For conditions of distribution and use,                    * */
+/* *                see copyright notice in libmng.h                        * */
+/* ************************************************************************** */
+/* *                                                                        * */
+/* * project   : libmng                                                     * */
+/* * file      : libmng_chunk_xs.c         copyright (c) 2000-2007 G.Juyn   * */
+/* * version   : 1.0.10                                                     * */
+/* *                                                                        * */
+/* * 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 * */
+/* *                                                                        * */
+/* *             1.0.9 - 09/17/2004 - G.R-P                                 * */
+/* *             - added two more conditionals                              * */
+/* *             1.0.9 - 09/25/2004 - G.Juyn                                * */
+/* *             - replaced MNG_TWEAK_LARGE_FILES with permanent solution   * */
+/* *             1.0.9 - 17/14/2004 - G.Juyn                                * */
+/* *             - fixed PPLT getchunk/putchunk routines                    * */
+/* *             1.0.9 - 12/05/2004 - G.Juyn                                * */
+/* *             - added conditional MNG_OPTIMIZE_CHUNKINITFREE             * */
+/* *             1.0.9 - 12/20/2004 - G.Juyn                                * */
+/* *             - cleaned up macro-invocations (thanks to D. Airlie)       * */
+/* *                                                                        * */
+/* *             1.0.10 - 04/08/2007 - G.Juyn                               * */
+/* *             - added support for mPNG proposal                          * */
+/* *                                                                        * */
+/* ************************************************************************** */
+
+#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"
+#ifdef MNG_OPTIMIZE_CHUNKREADER
+#include "libmng_chunk_descr.h"
+#endif
+#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;
+  *iGreen   = pChunk->iGreen;
+  *iBlue    = pChunk->iBlue;
+  *iRawlen  = pChunk->iRawlen;
+
+  MNG_COPY (*aAlphas,  pChunk->aEntries, sizeof (mng_uint8arr));
+  MNG_COPY (*aRawdata, pChunk->aRawdata, sizeof (mng_uint8arr));
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_TRNS, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_gAMA
+mng_retcode MNG_DECL mng_getchunk_gama (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_bool   *bEmpty,
+                                        mng_uint32 *iGamma)
+{
+  mng_datap pData;
+  mng_gamap pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_GAMA, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_gamap)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_gAMA)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *bEmpty = pChunk->bEmpty;            /* fill the fields */
+  *iGamma = pChunk->iGamma;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_GAMA, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_cHRM
+mng_retcode MNG_DECL mng_getchunk_chrm (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_bool   *bEmpty,
+                                        mng_uint32 *iWhitepointx,
+                                        mng_uint32 *iWhitepointy,
+                                        mng_uint32 *iRedx,
+                                        mng_uint32 *iRedy,
+                                        mng_uint32 *iGreenx,
+                                        mng_uint32 *iGreeny,
+                                        mng_uint32 *iBluex,
+                                        mng_uint32 *iBluey)
+{
+  mng_datap pData;
+  mng_chrmp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_CHRM, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_chrmp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_cHRM)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *bEmpty       = pChunk->bEmpty;      /* fill the fields */     
+  *iWhitepointx = pChunk->iWhitepointx;
+  *iWhitepointy = pChunk->iWhitepointy;
+  *iRedx        = pChunk->iRedx;
+  *iRedy        = pChunk->iRedy;
+  *iGreenx      = pChunk->iGreenx;
+  *iGreeny      = pChunk->iGreeny;
+  *iBluex       = pChunk->iBluex;
+  *iBluey       = pChunk->iBluey;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_CHRM, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_sRGB
+mng_retcode MNG_DECL mng_getchunk_srgb (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_bool   *bEmpty,
+                                        mng_uint8  *iRenderingintent)
+{
+  mng_datap pData;
+  mng_srgbp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SRGB, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_srgbp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_sRGB)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *bEmpty           = pChunk->bEmpty;  /* fill the fields */        
+  *iRenderingintent = pChunk->iRenderingintent;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SRGB, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_iCCP
+mng_retcode MNG_DECL mng_getchunk_iccp (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_bool   *bEmpty,
+                                        mng_uint32 *iNamesize,
+                                        mng_pchar  *zName,
+                                        mng_uint8  *iCompression,
+                                        mng_uint32 *iProfilesize,
+                                        mng_ptr    *pProfile)
+{
+  mng_datap pData;
+  mng_iccpp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ICCP, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_iccpp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_iCCP)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *bEmpty       = pChunk->bEmpty;      /* fill the fields */     
+  *iNamesize    = pChunk->iNamesize;
+  *zName        = pChunk->zName;
+  *iCompression = pChunk->iCompression;
+  *iProfilesize = pChunk->iProfilesize;
+  *pProfile     = pChunk->pProfile;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ICCP, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_tEXt
+mng_retcode MNG_DECL mng_getchunk_text (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint32 *iKeywordsize,
+                                        mng_pchar  *zKeyword,
+                                        mng_uint32 *iTextsize,
+                                        mng_pchar  *zText)
+{
+  mng_datap pData;
+  mng_textp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_TEXT, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_textp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_tEXt)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+                                       /* fill the fields */
+  *iKeywordsize = pChunk->iKeywordsize;
+  *zKeyword     = pChunk->zKeyword;
+  *iTextsize    = pChunk->iTextsize;
+  *zText        = pChunk->zText;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_TEXT, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_zTXt
+mng_retcode MNG_DECL mng_getchunk_ztxt (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint32 *iKeywordsize,
+                                        mng_pchar  *zKeyword,
+                                        mng_uint8  *iCompression,
+                                        mng_uint32 *iTextsize,
+                                        mng_pchar  *zText)
+{
+  mng_datap pData;
+  mng_ztxtp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ZTXT, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_ztxtp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_zTXt)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+                                       /* fill the fields */
+  *iKeywordsize = pChunk->iKeywordsize;
+  *zKeyword     = pChunk->zKeyword;
+  *iCompression = pChunk->iCompression;
+  *iTextsize    = pChunk->iTextsize;
+  *zText        = pChunk->zText;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ZTXT, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_iTXt
+mng_retcode MNG_DECL mng_getchunk_itxt (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint32 *iKeywordsize,
+                                        mng_pchar  *zKeyword,
+                                        mng_uint8  *iCompressionflag,
+                                        mng_uint8  *iCompressionmethod,
+                                        mng_uint32 *iLanguagesize,
+                                        mng_pchar  *zLanguage,
+                                        mng_uint32 *iTranslationsize,
+                                        mng_pchar  *zTranslation,
+                                        mng_uint32 *iTextsize,
+                                        mng_pchar  *zText)
+{
+  mng_datap pData;
+  mng_itxtp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ITXT, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_itxtp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_iTXt)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+                                       /* fill the fields */
+  *iKeywordsize       = pChunk->iKeywordsize;
+  *zKeyword           = pChunk->zKeyword;
+  *iCompressionflag   = pChunk->iCompressionflag;
+  *iCompressionmethod = pChunk->iCompressionmethod;
+  *iLanguagesize      = pChunk->iLanguagesize;
+  *zLanguage          = pChunk->zLanguage;
+  *iTranslationsize   = pChunk->iTranslationsize;
+  *zTranslation       = pChunk->zTranslation;
+  *iTextsize          = pChunk->iTextsize;
+  *zText              = pChunk->zText;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ITXT, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_bKGD
+mng_retcode MNG_DECL mng_getchunk_bkgd (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_bool   *bEmpty,
+                                        mng_uint8  *iType,
+                                        mng_uint8  *iIndex,
+                                        mng_uint16 *iGray,
+                                        mng_uint16 *iRed,
+                                        mng_uint16 *iGreen,
+                                        mng_uint16 *iBlue)
+{
+  mng_datap pData;
+  mng_bkgdp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_BKGD, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_bkgdp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_bKGD)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *bEmpty = pChunk->bEmpty;            /* fill the fields */
+  *iType  = pChunk->iType;
+  *iIndex = pChunk->iIndex;
+  *iGray  = pChunk->iGray;
+  *iRed   = pChunk->iRed;
+  *iGreen = pChunk->iGreen;
+  *iBlue  = pChunk->iBlue;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_BKGD, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_pHYs
+mng_retcode MNG_DECL mng_getchunk_phys (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_bool   *bEmpty,
+                                        mng_uint32 *iSizex,
+                                        mng_uint32 *iSizey,
+                                        mng_uint8  *iUnit)
+{
+  mng_datap pData;
+  mng_physp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PHYS, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_physp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_pHYs)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *bEmpty = pChunk->bEmpty;            /* fill the fields */
+  *iSizex = pChunk->iSizex;
+  *iSizey = pChunk->iSizey;
+  *iUnit  = pChunk->iUnit;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PHYS, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_sBIT
+mng_retcode MNG_DECL mng_getchunk_sbit (mng_handle    hHandle,
+                                        mng_handle    hChunk,
+                                        mng_bool      *bEmpty,
+                                        mng_uint8     *iType,
+                                        mng_uint8arr4 *aBits)
+{
+  mng_datap pData;
+  mng_sbitp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SBIT, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_sbitp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_sBIT)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *bEmpty     = pChunk->bEmpty;
+  *iType      = pChunk->iType;
+  (*aBits)[0] = pChunk->aBits[0];
+  (*aBits)[1] = pChunk->aBits[1];
+  (*aBits)[2] = pChunk->aBits[2];
+  (*aBits)[3] = pChunk->aBits[3];
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SBIT, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_sPLT
+mng_retcode MNG_DECL mng_getchunk_splt (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_bool   *bEmpty,
+                                        mng_uint32 *iNamesize,
+                                        mng_pchar  *zName,
+                                        mng_uint8  *iSampledepth,
+                                        mng_uint32 *iEntrycount,
+                                        mng_ptr    *pEntries)
+{
+  mng_datap pData;
+  mng_spltp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SPLT, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_spltp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_sPLT)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *bEmpty       = pChunk->bEmpty;      /* fill the fields */      
+  *iNamesize    = pChunk->iNamesize;
+  *zName        = pChunk->zName;
+  *iSampledepth = pChunk->iSampledepth;
+  *iEntrycount  = pChunk->iEntrycount;
+  *pEntries     = pChunk->pEntries;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SPLT, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_hIST
+mng_retcode MNG_DECL mng_getchunk_hist (mng_handle    hHandle,
+                                        mng_handle    hChunk,
+                                        mng_uint32    *iEntrycount,
+                                        mng_uint16arr *aEntries)
+{
+  mng_datap pData;
+  mng_histp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_HIST, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_histp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_hIST)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iEntrycount = pChunk->iEntrycount;  /* fill the fields */
+
+  MNG_COPY (*aEntries, pChunk->aEntries, sizeof (mng_uint16arr));
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_HIST, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_tIME
+mng_retcode MNG_DECL mng_getchunk_time (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint16 *iYear,
+                                        mng_uint8  *iMonth,
+                                        mng_uint8  *iDay,
+                                        mng_uint8  *iHour,
+                                        mng_uint8  *iMinute,
+                                        mng_uint8  *iSecond)
+{
+  mng_datap pData;
+  mng_timep pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_TIME, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_timep)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_tIME)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iYear   = pChunk->iYear;            /* fill the fields */ 
+  *iMonth  = pChunk->iMonth;
+  *iDay    = pChunk->iDay;
+  *iHour   = pChunk->iHour;
+  *iMinute = pChunk->iMinute;
+  *iSecond = pChunk->iSecond;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_TIME, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+mng_retcode MNG_DECL mng_getchunk_mhdr (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint32 *iWidth,
+                                        mng_uint32 *iHeight,
+                                        mng_uint32 *iTicks,
+                                        mng_uint32 *iLayercount,
+                                        mng_uint32 *iFramecount,
+                                        mng_uint32 *iPlaytime,
+                                        mng_uint32 *iSimplicity)
+{
+  mng_datap pData;
+  mng_mhdrp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_MHDR, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_mhdrp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iWidth      = pChunk->iWidth;       /* fill the fields */   
+  *iHeight     = pChunk->iHeight;
+  *iTicks      = pChunk->iTicks;
+  *iLayercount = pChunk->iLayercount;
+  *iFramecount = pChunk->iFramecount;
+  *iPlaytime   = pChunk->iPlaytime;
+  *iSimplicity = pChunk->iSimplicity;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_MHDR, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_LOOP
+mng_retcode MNG_DECL mng_getchunk_loop (mng_handle  hHandle,
+                                        mng_handle  hChunk,
+                                        mng_uint8   *iLevel,
+                                        mng_uint32  *iRepeat,
+                                        mng_uint8   *iTermination,
+                                        mng_uint32  *iItermin,
+                                        mng_uint32  *iItermax,
+                                        mng_uint32  *iCount,
+                                        mng_uint32p *pSignals)
+{
+  mng_datap pData;
+  mng_loopp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_LOOP, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_loopp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_LOOP)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iLevel       = pChunk->iLevel;      /* fill teh fields */
+  *iRepeat      = pChunk->iRepeat;
+  *iTermination = pChunk->iTermination;
+  *iItermin     = pChunk->iItermin;
+  *iItermax     = pChunk->iItermax;
+  *iCount       = pChunk->iCount;
+  *pSignals     = pChunk->pSignals;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_LOOP, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+/* ************************************************************************** */
+
+mng_retcode MNG_DECL mng_getchunk_endl (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint8  *iLevel)
+{
+  mng_datap pData;
+  mng_endlp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ENDL, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_endlp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_ENDL)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iLevel = pChunk->iLevel;            /* fill the field */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ENDL, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_DEFI
+mng_retcode MNG_DECL mng_getchunk_defi (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint16 *iObjectid,
+                                        mng_uint8  *iDonotshow,
+                                        mng_uint8  *iConcrete,
+                                        mng_bool   *bHasloca,
+                                        mng_int32  *iXlocation,
+                                        mng_int32  *iYlocation,
+                                        mng_bool   *bHasclip,
+                                        mng_int32  *iLeftcb,
+                                        mng_int32  *iRightcb,
+                                        mng_int32  *iTopcb,
+                                        mng_int32  *iBottomcb)
+{
+  mng_datap pData;
+  mng_defip pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_DEFI, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_defip)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_DEFI)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iObjectid  = pChunk->iObjectid;     /* fill the fields */
+  *iDonotshow = pChunk->iDonotshow;
+  *iConcrete  = pChunk->iConcrete;
+  *bHasloca   = pChunk->bHasloca;
+  *iXlocation = pChunk->iXlocation;
+  *iYlocation = pChunk->iYlocation;
+  *bHasclip   = pChunk->bHasclip;
+  *iLeftcb    = pChunk->iLeftcb;
+  *iRightcb   = pChunk->iRightcb;
+  *iTopcb     = pChunk->iTopcb;
+  *iBottomcb  = pChunk->iBottomcb;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_DEFI, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_BASI
+mng_retcode MNG_DECL mng_getchunk_basi (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_uint16 *iRed,
+                                        mng_uint16 *iGreen,
+                                        mng_uint16 *iBlue,
+                                        mng_uint16 *iAlpha,
+                                        mng_uint8  *iViewable)
+{
+  mng_datap pData;
+  mng_basip pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_BASI, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_basip)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_BASI)
+    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;
+  *iRed         = pChunk->iRed;
+  *iGreen       = pChunk->iGreen;
+  *iBlue        = pChunk->iBlue;
+  *iAlpha       = pChunk->iAlpha;
+  *iViewable    = pChunk->iViewable;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_BASI, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_CLON
+mng_retcode MNG_DECL mng_getchunk_clon (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint16 *iSourceid,
+                                        mng_uint16 *iCloneid,
+                                        mng_uint8  *iClonetype,
+                                        mng_uint8  *iDonotshow,
+                                        mng_uint8  *iConcrete,
+                                        mng_bool   *bHasloca,
+                                        mng_uint8  *iLocationtype,
+                                        mng_int32  *iLocationx,
+                                        mng_int32  *iLocationy)
+{
+  mng_datap pData;
+  mng_clonp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_CLON, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_clonp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_CLON)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iSourceid     = pChunk->iSourceid;  /* fill the fields */  
+  *iCloneid      = pChunk->iCloneid;
+  *iClonetype    = pChunk->iClonetype;
+  *iDonotshow    = pChunk->iDonotshow;
+  *iConcrete     = pChunk->iConcrete;
+  *bHasloca      = pChunk->bHasloca;
+  *iLocationtype = pChunk->iLocationtype;
+  *iLocationx    = pChunk->iLocationx;
+  *iLocationy    = pChunk->iLocationy;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_CLON, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_PAST
+mng_retcode MNG_DECL mng_getchunk_past (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint16 *iDestid,
+                                        mng_uint8  *iTargettype,
+                                        mng_int32  *iTargetx,
+                                        mng_int32  *iTargety,
+                                        mng_uint32 *iCount)
+{
+  mng_datap pData;
+  mng_pastp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PAST, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_pastp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_PAST)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iDestid     = pChunk->iDestid;       /* fill the fields */
+  *iTargettype = pChunk->iTargettype;
+  *iTargetx    = pChunk->iTargetx;
+  *iTargety    = pChunk->iTargety;
+  *iCount      = pChunk->iCount;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PAST, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_PAST
+mng_retcode MNG_DECL mng_getchunk_past_src (mng_handle hHandle,
+                                            mng_handle hChunk,
+                                            mng_uint32 iEntry,
+                                            mng_uint16 *iSourceid,
+                                            mng_uint8  *iComposition,
+                                            mng_uint8  *iOrientation,
+                                            mng_uint8  *iOffsettype,
+                                            mng_int32  *iOffsetx,
+                                            mng_int32  *iOffsety,
+                                            mng_uint8  *iBoundarytype,
+                                            mng_int32  *iBoundaryl,
+                                            mng_int32  *iBoundaryr,
+                                            mng_int32  *iBoundaryt,
+                                            mng_int32  *iBoundaryb)
+{
+  mng_datap        pData;
+  mng_pastp        pChunk;
+  mng_past_sourcep pEntry;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PAST_SRC, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_pastp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_PAST)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  if (iEntry >= pChunk->iCount)        /* valid index ? */
+    MNG_ERROR (pData, MNG_INVALIDENTRYIX)
+                                       /* address the entry */
+  pEntry         = pChunk->pSources + iEntry;
+
+  *iSourceid     = pEntry->iSourceid;  /* fill the fields */
+  *iComposition  = pEntry->iComposition;
+  *iOrientation  = pEntry->iOrientation;
+  *iOffsettype   = pEntry->iOffsettype;
+  *iOffsetx      = pEntry->iOffsetx;
+  *iOffsety      = pEntry->iOffsety;
+  *iBoundarytype = pEntry->iBoundarytype;
+  *iBoundaryl    = pEntry->iBoundaryl;
+  *iBoundaryr    = pEntry->iBoundaryr;
+  *iBoundaryt    = pEntry->iBoundaryt;
+  *iBoundaryb    = pEntry->iBoundaryb;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PAST_SRC, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_DISC
+mng_retcode MNG_DECL mng_getchunk_disc (mng_handle  hHandle,
+                                        mng_handle  hChunk,
+                                        mng_uint32  *iCount,
+                                        mng_uint16p *pObjectids)
+{
+  mng_datap pData;
+  mng_discp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_DISC, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_discp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_DISC)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iCount     = pChunk->iCount;        /* fill the fields */
+  *pObjectids = pChunk->pObjectids;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_DISC, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_BACK
+mng_retcode MNG_DECL mng_getchunk_back (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint16 *iRed,
+                                        mng_uint16 *iGreen,
+                                        mng_uint16 *iBlue,
+                                        mng_uint8  *iMandatory,
+                                        mng_uint16 *iImageid,
+                                        mng_uint8  *iTile)
+{
+  mng_datap pData;
+  mng_backp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_BACK, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_backp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_BACK)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iRed       = pChunk->iRed;          /* fill the fields */
+  *iGreen     = pChunk->iGreen;
+  *iBlue      = pChunk->iBlue;
+  *iMandatory = pChunk->iMandatory;
+  *iImageid   = pChunk->iImageid;
+  *iTile      = pChunk->iTile;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_BACK, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_FRAM
+mng_retcode MNG_DECL mng_getchunk_fram (mng_handle  hHandle,
+                                        mng_handle  hChunk,
+                                        mng_bool    *bEmpty,
+                                        mng_uint8   *iMode,
+                                        mng_uint32  *iNamesize,
+                                        mng_pchar   *zName,
+                                        mng_uint8   *iChangedelay,
+                                        mng_uint8   *iChangetimeout,
+                                        mng_uint8   *iChangeclipping,
+                                        mng_uint8   *iChangesyncid,
+                                        mng_uint32  *iDelay,
+                                        mng_uint32  *iTimeout,
+                                        mng_uint8   *iBoundarytype,
+                                        mng_int32   *iBoundaryl,
+                                        mng_int32   *iBoundaryr,
+                                        mng_int32   *iBoundaryt,
+                                        mng_int32   *iBoundaryb,
+                                        mng_uint32  *iCount,
+                                        mng_uint32p *pSyncids)
+{
+  mng_datap pData;
+  mng_framp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_FRAM, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_framp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_FRAM)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *bEmpty          = pChunk->bEmpty;   /* fill the fields */      
+  *iMode           = pChunk->iMode;
+  *iNamesize       = pChunk->iNamesize;
+  *zName           = pChunk->zName;
+  *iChangedelay    = pChunk->iChangedelay;
+  *iChangetimeout  = pChunk->iChangetimeout;
+  *iChangeclipping = pChunk->iChangeclipping;
+  *iChangesyncid   = pChunk->iChangesyncid;
+  *iDelay          = pChunk->iDelay;
+  *iTimeout        = pChunk->iTimeout;
+  *iBoundarytype   = pChunk->iBoundarytype;
+  *iBoundaryl      = pChunk->iBoundaryl;
+  *iBoundaryr      = pChunk->iBoundaryr;
+  *iBoundaryt      = pChunk->iBoundaryt;
+  *iBoundaryb      = pChunk->iBoundaryb;
+  *iCount          = pChunk->iCount;
+  *pSyncids        = pChunk->pSyncids;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_FRAM, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_MOVE
+mng_retcode MNG_DECL mng_getchunk_move (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint16 *iFirstid,
+                                        mng_uint16 *iLastid,
+                                        mng_uint8  *iMovetype,
+                                        mng_int32  *iMovex,
+                                        mng_int32  *iMovey)
+{
+  mng_datap pData;
+  mng_movep pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_MOVE, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_movep)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_MOVE)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iFirstid  = pChunk->iFirstid;       /* fill the fields */
+  *iLastid   = pChunk->iLastid;
+  *iMovetype = pChunk->iMovetype;
+  *iMovex    = pChunk->iMovex;
+  *iMovey    = pChunk->iMovey;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_MOVE, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_CLIP
+mng_retcode MNG_DECL mng_getchunk_clip (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint16 *iFirstid,
+                                        mng_uint16 *iLastid,
+                                        mng_uint8  *iCliptype,
+                                        mng_int32  *iClipl,
+                                        mng_int32  *iClipr,
+                                        mng_int32  *iClipt,
+                                        mng_int32  *iClipb)
+{
+  mng_datap pData;
+  mng_clipp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_CLIP, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_clipp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_CLIP)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iFirstid  = pChunk->iFirstid;       /* fill the fields */
+  *iLastid   = pChunk->iLastid;
+  *iCliptype = pChunk->iCliptype;
+  *iClipl    = pChunk->iClipl;
+  *iClipr    = pChunk->iClipr;
+  *iClipt    = pChunk->iClipt;
+  *iClipb    = pChunk->iClipb;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_CLIP, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_SHOW
+mng_retcode MNG_DECL mng_getchunk_show (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_bool   *bEmpty,
+                                        mng_uint16 *iFirstid,
+                                        mng_uint16 *iLastid,
+                                        mng_uint8  *iMode)
+{
+  mng_datap pData;
+  mng_showp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SHOW, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_showp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_SHOW)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *bEmpty   = pChunk->bEmpty;          /* fill the fields */
+  *iFirstid = pChunk->iFirstid;
+  *iLastid  = pChunk->iLastid;
+  *iMode    = pChunk->iMode;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SHOW, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_TERM
+mng_retcode MNG_DECL mng_getchunk_term (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint8  *iTermaction,
+                                        mng_uint8  *iIteraction,
+                                        mng_uint32 *iDelay,
+                                        mng_uint32 *iItermax)
+{
+  mng_datap pData;
+  mng_termp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_TERM, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_termp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_TERM)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iTermaction = pChunk->iTermaction;  /* fill the fields */
+  *iIteraction = pChunk->iIteraction;
+  *iDelay      = pChunk->iDelay;
+  *iItermax    = pChunk->iItermax;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_TERM, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_SAVE
+mng_retcode MNG_DECL mng_getchunk_save (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_bool   *bEmpty,
+                                        mng_uint8  *iOffsettype,
+                                        mng_uint32 *iCount)
+{
+  mng_datap pData;
+  mng_savep pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SAVE, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_savep)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_SAVE)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *bEmpty      = pChunk->bEmpty;       /* fill the fields */
+  *iOffsettype = pChunk->iOffsettype;
+  *iCount      = pChunk->iCount;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SAVE, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+/* ************************************************************************** */
+
+mng_retcode MNG_DECL mng_getchunk_save_entry (mng_handle     hHandle,
+                                              mng_handle     hChunk,
+                                              mng_uint32     iEntry,
+                                              mng_uint8      *iEntrytype,
+                                              mng_uint32arr2 *iOffset,
+                                              mng_uint32arr2 *iStarttime,
+                                              mng_uint32     *iLayernr,
+                                              mng_uint32     *iFramenr,
+                                              mng_uint32     *iNamesize,
+                                              mng_pchar      *zName)
+{
+  mng_datap       pData;
+  mng_savep       pChunk;
+  mng_save_entryp pEntry;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SAVE_ENTRY, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_savep)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_SAVE)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  if (iEntry >= pChunk->iCount)        /* valid index ? */
+    MNG_ERROR (pData, MNG_INVALIDENTRYIX)
+
+  pEntry  = pChunk->pEntries + iEntry; /* address the entry */
+                                       /* fill the fields */
+  *iEntrytype      = pEntry->iEntrytype;
+  (*iOffset)[0]    = pEntry->iOffset[0];
+  (*iOffset)[1]    = pEntry->iOffset[1];
+  (*iStarttime)[0] = pEntry->iStarttime[0];
+  (*iStarttime)[1] = pEntry->iStarttime[1];
+  *iLayernr        = pEntry->iLayernr;
+  *iFramenr        = pEntry->iFramenr;
+  *iNamesize       = pEntry->iNamesize;
+  *zName           = pEntry->zName;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SAVE_ENTRY, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_SEEK
+mng_retcode MNG_DECL mng_getchunk_seek (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint32 *iNamesize,
+                                        mng_pchar  *zName)
+{
+  mng_datap pData;
+  mng_seekp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SEEK, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_seekp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_SEEK)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iNamesize = pChunk->iNamesize;      /* fill the fields */
+  *zName     = pChunk->zName;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_SEEK, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_eXPI
+mng_retcode MNG_DECL mng_getchunk_expi (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint16 *iSnapshotid,
+                                        mng_uint32 *iNamesize,
+                                        mng_pchar  *zName)
+{
+  mng_datap pData;
+  mng_expip pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_EXPI, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_expip)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_eXPI)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iSnapshotid = pChunk->iSnapshotid;  /* fill the fields */
+  *iNamesize   = pChunk->iNamesize;
+  *zName       = pChunk->zName;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_EXPI, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_fPRI
+mng_retcode MNG_DECL mng_getchunk_fpri (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint8  *iDeltatype,
+                                        mng_uint8  *iPriority)
+{
+  mng_datap pData;
+  mng_fprip pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_FPRI, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_fprip)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_fPRI)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iDeltatype = pChunk->iDeltatype;    /* fill the fields */
+  *iPriority  = pChunk->iPriority;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_FPRI, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_nEED
+mng_retcode MNG_DECL mng_getchunk_need (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint32 *iKeywordssize,
+                                        mng_pchar  *zKeywords)
+{
+  mng_datap pData;
+  mng_needp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_NEED, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_needp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_nEED)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+                                       /* fill the fields */
+  *iKeywordssize = pChunk->iKeywordssize;
+  *zKeywords     = pChunk->zKeywords;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_NEED, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_pHYg
+mng_retcode MNG_DECL mng_getchunk_phyg (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_bool   *bEmpty,
+                                        mng_uint32 *iSizex,
+                                        mng_uint32 *iSizey,
+                                        mng_uint8  *iUnit)
+{
+  mng_datap pData;
+  mng_phygp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PHYG, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_phygp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_pHYg)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *bEmpty = pChunk->bEmpty;            /* fill the fields */
+  *iSizex = pChunk->iSizex;
+  *iSizey = pChunk->iSizey;
+  *iUnit  = pChunk->iUnit;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PHYG, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifdef MNG_INCLUDE_JNG
+
+mng_retcode MNG_DECL mng_getchunk_jhdr (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint32 *iWidth,
+                                        mng_uint32 *iHeight,
+                                        mng_uint8  *iColortype,
+                                        mng_uint8  *iImagesampledepth,
+                                        mng_uint8  *iImagecompression,
+                                        mng_uint8  *iImageinterlace,
+                                        mng_uint8  *iAlphasampledepth,
+                                        mng_uint8  *iAlphacompression,
+                                        mng_uint8  *iAlphafilter,
+                                        mng_uint8  *iAlphainterlace)
+{
+  mng_datap pData;
+  mng_jhdrp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_JHDR, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_jhdrp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_JHDR)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iWidth            = pChunk->iWidth; /* fill the fields */          
+  *iHeight           = pChunk->iHeight;
+  *iColortype        = pChunk->iColortype;
+  *iImagesampledepth = pChunk->iImagesampledepth;
+  *iImagecompression = pChunk->iImagecompression;
+  *iImageinterlace   = pChunk->iImageinterlace;
+  *iAlphasampledepth = pChunk->iAlphasampledepth;
+  *iAlphacompression = pChunk->iAlphacompression;
+  *iAlphafilter      = pChunk->iAlphafilter;
+  *iAlphainterlace   = pChunk->iAlphainterlace;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_JHDR, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+#endif /* MNG_INCLUDE_JNG */
+
+/* ************************************************************************** */
+
+#ifdef MNG_INCLUDE_JNG
+
+mng_retcode MNG_DECL mng_getchunk_jdat (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint32 *iRawlen,
+                                        mng_ptr    *pRawdata)
+{
+  mng_datap pData;
+  mng_jdatp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_JDAT, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_jdatp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_JDAT)
+    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_JDAT, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+#endif /* MNG_INCLUDE_JNG */
+
+/* ************************************************************************** */
+
+#ifdef MNG_INCLUDE_JNG
+
+mng_retcode MNG_DECL mng_getchunk_jdaa (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint32 *iRawlen,
+                                        mng_ptr    *pRawdata)
+{
+  mng_datap pData;
+  mng_jdaap pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_JDAA, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_jdaap)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_JDAA)
+    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_JDAA, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+#endif /* MNG_INCLUDE_JNG */
+
+/* ************************************************************************** */
+
+#ifndef MNG_NO_DELTA_PNG
+mng_retcode MNG_DECL mng_getchunk_dhdr (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint16 *iObjectid,
+                                        mng_uint8  *iImagetype,
+                                        mng_uint8  *iDeltatype,
+                                        mng_uint32 *iBlockwidth,
+                                        mng_uint32 *iBlockheight,
+                                        mng_uint32 *iBlockx,
+                                        mng_uint32 *iBlocky)
+{
+  mng_datap pData;
+  mng_dhdrp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_DHDR, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_dhdrp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_DHDR)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iObjectid    = pChunk->iObjectid;   /* fill the fields */
+  *iImagetype   = pChunk->iImagetype;
+  *iDeltatype   = pChunk->iDeltatype;
+  *iBlockwidth  = pChunk->iBlockwidth;
+  *iBlockheight = pChunk->iBlockheight;
+  *iBlockx      = pChunk->iBlockx;
+  *iBlocky      = pChunk->iBlocky;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_DHDR, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_NO_DELTA_PNG
+mng_retcode MNG_DECL mng_getchunk_prom (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint8  *iColortype,
+                                        mng_uint8  *iSampledepth,
+                                        mng_uint8  *iFilltype)
+{
+  mng_datap pData;
+  mng_promp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PROM, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_promp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_PROM)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iColortype   = pChunk->iColortype;  /* fill the fields */
+  *iSampledepth = pChunk->iSampledepth;
+  *iFilltype    = pChunk->iFilltype;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PROM, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_NO_DELTA_PNG
+mng_retcode MNG_DECL mng_getchunk_pplt (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint8  *iDeltatype,
+                                        mng_uint32 *iCount)
+{
+  mng_datap pData;
+  mng_ppltp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PPLT, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_ppltp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_PPLT)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iDeltatype = pChunk->iDeltatype;    /* fill the fields */
+  *iCount     = pChunk->iCount;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PPLT, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_NO_DELTA_PNG
+mng_retcode MNG_DECL mng_getchunk_pplt_entry (mng_handle hHandle,
+                                              mng_handle hChunk,
+                                              mng_uint32 iEntry,
+                                              mng_uint16 *iRed,
+                                              mng_uint16 *iGreen,
+                                              mng_uint16 *iBlue,
+                                              mng_uint16 *iAlpha,
+                                              mng_bool   *bUsed)
+{
+  mng_datap       pData;
+  mng_ppltp       pChunk;
+  mng_pplt_entryp pEntry;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PPLT_ENTRY, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_ppltp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_PPLT)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  if (iEntry >= pChunk->iCount)        /* valid index ? */
+    MNG_ERROR (pData, MNG_INVALIDENTRYIX)
+
+  pEntry  = &pChunk->aEntries[iEntry]; /* address the entry */
+
+  *iRed   = pEntry->iRed;              /* fill the fields */
+  *iGreen = pEntry->iGreen;
+  *iBlue  = pEntry->iBlue;
+  *iAlpha = pEntry->iAlpha;
+  *bUsed  = pEntry->bUsed;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_PPLT_ENTRY, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_NO_DELTA_PNG
+mng_retcode MNG_DECL mng_getchunk_drop (mng_handle   hHandle,
+                                        mng_handle   hChunk,
+                                        mng_uint32   *iCount,
+                                        mng_chunkidp *pChunknames)
+{
+  mng_datap pData;
+  mng_dropp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_DROP, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_dropp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_DROP)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iCount      = pChunk->iCount;       /* fill the fields */
+  *pChunknames = pChunk->pChunknames;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_DROP, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_NO_DELTA_PNG
+#ifndef MNG_SKIPCHUNK_DBYK
+mng_retcode MNG_DECL mng_getchunk_dbyk (mng_handle  hHandle,
+                                        mng_handle  hChunk,
+                                        mng_chunkid *iChunkname,
+                                        mng_uint8   *iPolarity,
+                                        mng_uint32  *iKeywordssize,
+                                        mng_pchar   *zKeywords)
+{
+  mng_datap pData;
+  mng_dbykp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_DBYK, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_dbykp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_DBYK)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iChunkname    = pChunk->iChunkname; /* fill the fields */  
+  *iPolarity     = pChunk->iPolarity;
+  *iKeywordssize = pChunk->iKeywordssize;
+  *zKeywords     = pChunk->zKeywords;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_DBYK, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_NO_DELTA_PNG
+#ifndef MNG_SKIPCHUNK_ORDR
+mng_retcode MNG_DECL mng_getchunk_ordr (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint32 *iCount)
+{
+  mng_datap pData;
+  mng_ordrp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ORDR, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_ordrp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_ORDR)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iCount = pChunk->iCount;            /* fill the field */ 
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ORDR, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_NO_DELTA_PNG
+#ifndef MNG_SKIPCHUNK_ORDR
+mng_retcode MNG_DECL mng_getchunk_ordr_entry (mng_handle  hHandle,
+                                              mng_handle  hChunk,
+                                              mng_uint32  iEntry,
+                                              mng_chunkid *iChunkname,
+                                              mng_uint8   *iOrdertype)
+{
+  mng_datap       pData;
+  mng_ordrp       pChunk;
+  mng_ordr_entryp pEntry;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ORDR_ENTRY, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_ordrp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_ORDR)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  if (iEntry >= pChunk->iCount)        /* valid index ? */
+    MNG_ERROR (pData, MNG_INVALIDENTRYIX)
+
+  pEntry = pChunk->pEntries + iEntry;  /* address the proper entry */
+
+  *iChunkname = pEntry->iChunkname;    /* fill the fields */
+  *iOrdertype = pEntry->iOrdertype;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_ORDR_ENTRY, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_MAGN
+mng_retcode MNG_DECL mng_getchunk_magn (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint16 *iFirstid,
+                                        mng_uint16 *iLastid,
+                                        mng_uint16 *iMethodX,
+                                        mng_uint16 *iMX,
+                                        mng_uint16 *iMY,
+                                        mng_uint16 *iML,
+                                        mng_uint16 *iMR,
+                                        mng_uint16 *iMT,
+                                        mng_uint16 *iMB,
+                                        mng_uint16 *iMethodY)
+{
+  mng_datap pData;
+  mng_magnp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_MAGN, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_magnp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_MAGN)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iFirstid = pChunk->iFirstid;        /* fill the fields */
+  *iLastid  = pChunk->iLastid;
+  *iMethodX = (mng_uint16)pChunk->iMethodX;
+  *iMX      = pChunk->iMX;
+  *iMY      = pChunk->iMY;
+  *iML      = pChunk->iML;
+  *iMR      = pChunk->iMR;
+  *iMT      = pChunk->iMT;
+  *iMB      = pChunk->iMB;
+  *iMethodY = (mng_uint16)pChunk->iMethodY;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_MAGN, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifdef MNG_INCLUDE_MPNG_PROPOSAL
+MNG_EXT mng_retcode MNG_DECL mng_getchunk_mpng (mng_handle hHandle,
+                                                mng_handle hChunk,
+                                                mng_uint32 *iFramewidth,
+                                                mng_uint32 *iFrameheight,
+                                                mng_uint16 *iNumplays,
+                                                mng_uint16 *iTickspersec,
+                                                mng_uint8  *iCompressionmethod,
+                                                mng_uint32 *iCount)
+{
+  mng_datap pData;
+  mng_mpngp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_MPNG, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_mpngp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_mpNG)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+                                       /* fill the fields */
+  *iFramewidth        = pChunk->iFramewidth;
+  *iFrameheight       = pChunk->iFrameheight;
+  *iNumplays          = pChunk->iNumplays;
+  *iTickspersec       = pChunk->iTickspersec;
+  *iCompressionmethod = pChunk->iCompressionmethod;
+  *iCount             = pChunk->iFramessize / sizeof (mng_mpng_frame);
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_MPNG, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifdef MNG_INCLUDE_MPNG_PROPOSAL
+MNG_EXT mng_retcode MNG_DECL mng_getchunk_mpng_frame (mng_handle hHandle,
+                                                      mng_handle hChunk,
+                                                      mng_uint32 iEntry,
+                                                      mng_uint32 *iX,
+                                                      mng_uint32 *iY,
+                                                      mng_uint32 *iWidth,
+                                                      mng_uint32 *iHeight,
+                                                      mng_int32  *iXoffset,
+                                                      mng_int32  *iYoffset,
+                                                      mng_uint16 *iTicks)
+{
+  mng_datap       pData;
+  mng_mpngp       pChunk;
+  mng_mpng_framep pFrame;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_MPNG_FRAME, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_mpngp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_mpNG)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+                                       /* valid index ? */
+  if (iEntry >= (pChunk->iFramessize / sizeof (mng_mpng_frame)))
+    MNG_ERROR (pData, MNG_INVALIDENTRYIX)
+
+  pFrame  = pChunk->pFrames + iEntry;  /* address the entry */
+                                       /* fill the fields */
+  *iX        = pFrame->iX;
+  *iY        = pFrame->iY;
+  *iWidth    = pFrame->iWidth;
+  *iHeight   = pFrame->iHeight;
+  *iXoffset  = pFrame->iXoffset;
+  *iYoffset  = pFrame->iYoffset;
+  *iTicks    = pFrame->iTicks;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_MPNG_FRAME, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_evNT
+mng_retcode MNG_DECL mng_getchunk_evnt (mng_handle hHandle,
+                                        mng_handle hChunk,
+                                        mng_uint32 *iCount)
+{
+  mng_datap pData;
+  mng_evntp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_EVNT, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_evntp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_evNT)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  *iCount = pChunk->iCount;            /* fill the fields */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_EVNT, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+/* ************************************************************************** */
+
+mng_retcode MNG_DECL mng_getchunk_evnt_entry (mng_handle hHandle,
+                                              mng_handle hChunk,
+                                              mng_uint32 iEntry,
+                                              mng_uint8  *iEventtype,
+                                              mng_uint8  *iMasktype,
+                                              mng_int32  *iLeft,
+                                              mng_int32  *iRight,
+                                              mng_int32  *iTop,
+                                              mng_int32  *iBottom,
+                                              mng_uint16 *iObjectid,
+                                              mng_uint8  *iIndex,
+                                              mng_uint32 *iSegmentnamesize,
+                                              mng_pchar  *zSegmentname)
+{
+  mng_datap       pData;
+  mng_evntp       pChunk;
+  mng_evnt_entryp pEntry;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_EVNT_ENTRY, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_evntp)hChunk;          /* address the chunk */
+
+  if (pChunk->sHeader.iChunkname != MNG_UINT_evNT)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+
+  if (iEntry >= pChunk->iCount)        /* valid index ? */
+    MNG_ERROR (pData, MNG_INVALIDENTRYIX)
+
+  pEntry  = pChunk->pEntries + iEntry; /* address the entry */
+                                       /* fill the fields */
+  *iEventtype       = pEntry->iEventtype;
+  *iMasktype        = pEntry->iMasktype;
+  *iLeft            = pEntry->iLeft;    
+  *iRight           = pEntry->iRight;
+  *iTop             = pEntry->iTop;
+  *iBottom          = pEntry->iBottom;
+  *iObjectid        = pEntry->iObjectid;
+  *iIndex           = pEntry->iIndex;
+  *iSegmentnamesize = pEntry->iSegmentnamesize;
+  *zSegmentname     = pEntry->zSegmentname;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_EVNT_ENTRY, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+mng_retcode MNG_DECL mng_getchunk_unknown (mng_handle  hHandle,
+                                           mng_handle  hChunk,
+                                           mng_chunkid *iChunkname,
+                                           mng_uint32  *iRawlen,
+                                           mng_ptr     *pRawdata)
+{
+  mng_datap          pData;
+  mng_unknown_chunkp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_UNKNOWN, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData  = (mng_datap)hHandle;         /* and make it addressable */
+  pChunk = (mng_unknown_chunkp)hChunk; /* address the chunk */
+
+  if (pChunk->sHeader.fCleanup != mng_free_unknown)
+    MNG_ERROR (pData, MNG_WRONGCHUNK)  /* ouch */
+                                       /* fill the fields */
+  *iChunkname = pChunk->sHeader.iChunkname;
+  *iRawlen    = pChunk->iDatasize;
+  *pRawdata   = pChunk->pData;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETCHUNK_UNKNOWN, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+/* ************************************************************************** */
+/* ************************************************************************** */
+
+#ifdef MNG_INCLUDE_WRITE_PROCS
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_TERM
+MNG_LOCAL mng_bool check_term (mng_datap   pData,
+                               mng_chunkid iChunkname)
+{
+  mng_chunk_headerp pChunk = (mng_chunk_headerp)pData->pLastchunk;
+
+  if (!pChunk)                         /* nothing added yet ? */
+    return MNG_TRUE;
+                                       /* last added chunk is TERM ? */
+  if (pChunk->iChunkname != MNG_UINT_TERM)
+    return MNG_TRUE;
+                                       /* previous to last is MHDR ? */
+  if ((pChunk->pPrev) && (((mng_chunk_headerp)pChunk->pPrev)->iChunkname == MNG_UINT_MHDR))
+    return MNG_TRUE;
+
+  if (iChunkname == MNG_UINT_SEEK)     /* new chunk to be added is SEEK ? */
+    return MNG_TRUE;
+
+  return MNG_FALSE;
+}
+#endif
+
+/* ************************************************************************** */
+
+mng_retcode MNG_DECL mng_putchunk_ihdr (mng_handle hHandle,
+                                        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_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_IHDR, mng_init_general, mng_free_general, mng_read_ihdr, mng_write_ihdr, mng_assign_general, 0, 0, sizeof(mng_ihdr)};
+#else
+          {MNG_UINT_IHDR, mng_init_ihdr, mng_free_ihdr, mng_read_ihdr, mng_write_ihdr, mng_assign_ihdr, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_IHDR, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_IHDR))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_ihdr (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_IHDR, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+  ((mng_ihdrp)pChunk)->iWidth       = iWidth;
+  ((mng_ihdrp)pChunk)->iHeight      = iHeight;
+  ((mng_ihdrp)pChunk)->iBitdepth    = iBitdepth;
+  ((mng_ihdrp)pChunk)->iColortype   = iColortype;
+  ((mng_ihdrp)pChunk)->iCompression = iCompression;
+  ((mng_ihdrp)pChunk)->iFilter      = iFilter;
+  ((mng_ihdrp)pChunk)->iInterlace   = iInterlace;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_IHDR, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+/* ************************************************************************** */
+
+mng_retcode MNG_DECL mng_putchunk_plte (mng_handle   hHandle,
+                                        mng_uint32   iCount,
+                                        mng_palette8 aPalette)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_PLTE, mng_init_general, mng_free_general, mng_read_plte, mng_write_plte, mng_assign_general, 0, 0, sizeof(mng_plte)};
+#else
+          {MNG_UINT_PLTE, mng_init_plte, mng_free_plte, mng_read_plte, mng_write_plte, mng_assign_plte, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PLTE, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a header first! */
+  if (pData->iFirstchunkadded == 0)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_PLTE))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_plte (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_PLTE, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_pltep)pChunk)->iEntrycount = iCount;
+  ((mng_pltep)pChunk)->bEmpty      = (mng_bool)(iCount == 0);
+
+  MNG_COPY (((mng_pltep)pChunk)->aEntries, aPalette, sizeof (mng_palette8));
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PLTE, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+/* ************************************************************************** */
+
+mng_retcode MNG_DECL mng_putchunk_idat (mng_handle hHandle,
+                                        mng_uint32 iRawlen,
+                                        mng_ptr    pRawdata)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_IDAT, mng_init_general, mng_free_idat, mng_read_idat, mng_write_idat, mng_assign_idat, 0, 0, sizeof(mng_idat)};
+#else
+          {MNG_UINT_IDAT, mng_init_idat, mng_free_idat, mng_read_idat, mng_write_idat, mng_assign_idat, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_IDAT, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a header first! */
+  if (pData->iFirstchunkadded == 0)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_IDAT))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_idat (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_IDAT, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_idatp)pChunk)->bEmpty    = (mng_bool)(iRawlen == 0);
+  ((mng_idatp)pChunk)->iDatasize = iRawlen;
+
+  if (iRawlen)
+  {
+    MNG_ALLOC (pData, ((mng_idatp)pChunk)->pData, iRawlen);
+    MNG_COPY (((mng_idatp)pChunk)->pData, pRawdata, iRawlen);
+  }
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_IDAT, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+/* ************************************************************************** */
+
+mng_retcode MNG_DECL mng_putchunk_iend (mng_handle hHandle)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_IEND, mng_init_general, mng_free_general, mng_read_iend, mng_write_iend, mng_assign_general, 0, 0, sizeof(mng_iend)};
+#else
+          {MNG_UINT_IEND, mng_init_iend, mng_free_iend, mng_read_iend, mng_write_iend, mng_assign_iend, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_IEND, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a header first! */
+  if (pData->iFirstchunkadded == 0)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_IEND))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_iend (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_IEND, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_INCLUDE_JNG
+  if ((pData->iFirstchunkadded == MNG_UINT_IHDR) ||
+      (pData->iFirstchunkadded == MNG_UINT_JHDR)    )
+#else
+  if (pData->iFirstchunkadded == MNG_UINT_IHDR)
+#endif
+    pData->bCreating = MNG_FALSE;      /* should be last chunk !!! */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_IEND, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+/* ************************************************************************** */
+
+mng_retcode MNG_DECL mng_putchunk_trns (mng_handle   hHandle,
+                                        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_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_tRNS, mng_init_general, mng_free_general, mng_read_trns, mng_write_trns, mng_assign_general, 0, 0, sizeof(mng_trns)};
+#else
+          {MNG_UINT_tRNS, mng_init_trns, mng_free_trns, mng_read_trns, mng_write_trns, mng_assign_trns, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_TRNS, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a header first! */
+  if (pData->iFirstchunkadded == 0)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_tRNS))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_trns (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_tRNS, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_trnsp)pChunk)->bEmpty   = bEmpty;
+  ((mng_trnsp)pChunk)->bGlobal  = bGlobal;
+  ((mng_trnsp)pChunk)->iType    = iType;
+  ((mng_trnsp)pChunk)->iCount   = iCount;
+  ((mng_trnsp)pChunk)->iGray    = iGray;
+  ((mng_trnsp)pChunk)->iRed     = iRed;
+  ((mng_trnsp)pChunk)->iGreen   = iGreen;
+  ((mng_trnsp)pChunk)->iBlue    = iBlue;
+  ((mng_trnsp)pChunk)->iRawlen  = iRawlen;
+
+  MNG_COPY (((mng_trnsp)pChunk)->aEntries, aAlphas,  sizeof (mng_uint8arr));
+  MNG_COPY (((mng_trnsp)pChunk)->aRawdata, aRawdata, sizeof (mng_uint8arr));
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_TRNS, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_gAMA
+mng_retcode MNG_DECL mng_putchunk_gama (mng_handle hHandle,
+                                        mng_bool   bEmpty,
+                                        mng_uint32 iGamma)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_gAMA, mng_init_general, mng_free_general, mng_read_gama, mng_write_gama, mng_assign_general, 0, 0, sizeof(mng_gama)};
+#else
+          {MNG_UINT_gAMA, mng_init_gama, mng_free_gama, mng_read_gama, mng_write_gama, mng_assign_gama, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_GAMA, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a header first! */
+  if (pData->iFirstchunkadded == 0)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_gAMA))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_gama (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_gAMA, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_gamap)pChunk)->bEmpty = bEmpty;
+  ((mng_gamap)pChunk)->iGamma = iGamma;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_GAMA, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_cHRM
+mng_retcode MNG_DECL mng_putchunk_chrm (mng_handle hHandle,
+                                        mng_bool   bEmpty,
+                                        mng_uint32 iWhitepointx,
+                                        mng_uint32 iWhitepointy,
+                                        mng_uint32 iRedx,
+                                        mng_uint32 iRedy,
+                                        mng_uint32 iGreenx,
+                                        mng_uint32 iGreeny,
+                                        mng_uint32 iBluex,
+                                        mng_uint32 iBluey)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_cHRM, mng_init_general, mng_free_general, mng_read_chrm, mng_write_chrm, mng_assign_general, 0, 0, sizeof(mng_chrm)};
+#else
+          {MNG_UINT_cHRM, mng_init_chrm, mng_free_chrm, mng_read_chrm, mng_write_chrm, mng_assign_chrm, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_CHRM, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a header first! */
+  if (pData->iFirstchunkadded == 0)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_cHRM))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_chrm (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_cHRM, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_chrmp)pChunk)->bEmpty       = bEmpty;
+  ((mng_chrmp)pChunk)->iWhitepointx = iWhitepointx;
+  ((mng_chrmp)pChunk)->iWhitepointy = iWhitepointy;
+  ((mng_chrmp)pChunk)->iRedx        = iRedx;
+  ((mng_chrmp)pChunk)->iRedy        = iRedy;
+  ((mng_chrmp)pChunk)->iGreenx      = iGreenx;
+  ((mng_chrmp)pChunk)->iGreeny      = iGreeny;
+  ((mng_chrmp)pChunk)->iBluex       = iBluex;
+  ((mng_chrmp)pChunk)->iBluey       = iBluey;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_CHRM, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_sRGB
+mng_retcode MNG_DECL mng_putchunk_srgb (mng_handle hHandle,
+                                        mng_bool   bEmpty,
+                                        mng_uint8  iRenderingintent)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_sRGB, mng_init_general, mng_free_general, mng_read_srgb, mng_write_srgb, mng_assign_general, 0, 0, sizeof(mng_srgb)};
+#else
+          {MNG_UINT_sRGB, mng_init_srgb, mng_free_srgb, mng_read_srgb, mng_write_srgb, mng_assign_srgb, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SRGB, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a header first! */
+  if (pData->iFirstchunkadded == 0)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_sRGB))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_srgb (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_sRGB, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_srgbp)pChunk)->bEmpty           = bEmpty;
+  ((mng_srgbp)pChunk)->iRenderingintent = iRenderingintent;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SRGB, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_iCCP
+mng_retcode MNG_DECL mng_putchunk_iccp (mng_handle hHandle,
+                                        mng_bool   bEmpty,
+                                        mng_uint32 iNamesize,
+                                        mng_pchar  zName,
+                                        mng_uint8  iCompression,
+                                        mng_uint32 iProfilesize,
+                                        mng_ptr    pProfile)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_iCCP, mng_init_general, mng_free_iccp, mng_read_iccp, mng_write_iccp, mng_assign_iccp, 0, 0, sizeof(mng_iccp)};
+#else
+          {MNG_UINT_iCCP, mng_init_iccp, mng_free_iccp, mng_read_iccp, mng_write_iccp, mng_assign_iccp, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ICCP, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a header first! */
+  if (pData->iFirstchunkadded == 0)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_iCCP))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_iccp (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_iCCP, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_iccpp)pChunk)->bEmpty       = bEmpty;
+  ((mng_iccpp)pChunk)->iNamesize    = iNamesize;
+  ((mng_iccpp)pChunk)->iCompression = iCompression;
+  ((mng_iccpp)pChunk)->iProfilesize = iProfilesize;
+
+  if (iNamesize)
+  {
+    MNG_ALLOC (pData, ((mng_iccpp)pChunk)->zName, iNamesize + 1);
+    MNG_COPY (((mng_iccpp)pChunk)->zName, zName, iNamesize);
+  }
+
+  if (iProfilesize)
+  {
+    MNG_ALLOC (pData, ((mng_iccpp)pChunk)->pProfile, iProfilesize);
+    MNG_COPY (((mng_iccpp)pChunk)->pProfile, pProfile, iProfilesize);
+  }
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ICCP, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_tEXt
+mng_retcode MNG_DECL mng_putchunk_text (mng_handle hHandle,
+                                        mng_uint32 iKeywordsize,
+                                        mng_pchar  zKeyword,
+                                        mng_uint32 iTextsize,
+                                        mng_pchar  zText)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_tEXt, mng_init_general, mng_free_text, mng_read_text, mng_write_text, mng_assign_text, 0, 0, sizeof(mng_text)};
+#else
+          {MNG_UINT_tEXt, mng_init_text, mng_free_text, mng_read_text, mng_write_text, mng_assign_text, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_TEXT, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a header first! */
+  if (pData->iFirstchunkadded == 0)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_tEXt))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_text (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_tEXt, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_textp)pChunk)->iKeywordsize = iKeywordsize;
+  ((mng_textp)pChunk)->iTextsize    = iTextsize;
+
+  if (iKeywordsize)
+  {
+    MNG_ALLOC (pData, ((mng_textp)pChunk)->zKeyword, iKeywordsize + 1);
+    MNG_COPY (((mng_textp)pChunk)->zKeyword, zKeyword, iKeywordsize);
+  }
+
+  if (iTextsize)
+  {
+    MNG_ALLOC (pData, ((mng_textp)pChunk)->zText, iTextsize + 1);
+    MNG_COPY (((mng_textp)pChunk)->zText, zText, iTextsize);
+  }
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_TEXT, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_zTXt
+mng_retcode MNG_DECL mng_putchunk_ztxt (mng_handle hHandle,
+                                        mng_uint32 iKeywordsize,
+                                        mng_pchar  zKeyword,
+                                        mng_uint8  iCompression,
+                                        mng_uint32 iTextsize,
+                                        mng_pchar  zText)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_zTXt, mng_init_general, mng_free_ztxt, mng_read_ztxt, mng_write_ztxt, mng_assign_ztxt, 0, 0, sizeof(mng_ztxt)};
+#else
+          {MNG_UINT_zTXt, mng_init_ztxt, mng_free_ztxt, mng_read_ztxt, mng_write_ztxt, mng_assign_ztxt, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ZTXT, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a header first! */
+  if (pData->iFirstchunkadded == 0)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_zTXt))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_ztxt (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_zTXt, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_ztxtp)pChunk)->iKeywordsize = iKeywordsize;
+  ((mng_ztxtp)pChunk)->iCompression = iCompression;
+  ((mng_ztxtp)pChunk)->iTextsize    = iTextsize;
+
+  if (iKeywordsize)
+  {
+    MNG_ALLOC (pData, ((mng_ztxtp)pChunk)->zKeyword, iKeywordsize + 1);
+    MNG_COPY (((mng_ztxtp)pChunk)->zKeyword, zKeyword, iKeywordsize);
+  }
+
+  if (iTextsize)
+  {
+    MNG_ALLOC (pData, ((mng_ztxtp)pChunk)->zText, iTextsize + 1);
+    MNG_COPY  (((mng_ztxtp)pChunk)->zText, zText, iTextsize);
+  }
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ZTXT, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_iTXt
+mng_retcode MNG_DECL mng_putchunk_itxt (mng_handle hHandle,
+                                        mng_uint32 iKeywordsize,
+                                        mng_pchar  zKeyword,
+                                        mng_uint8  iCompressionflag,
+                                        mng_uint8  iCompressionmethod,
+                                        mng_uint32 iLanguagesize,
+                                        mng_pchar  zLanguage,
+                                        mng_uint32 iTranslationsize,
+                                        mng_pchar  zTranslation,
+                                        mng_uint32 iTextsize,
+                                        mng_pchar  zText)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_iTXt, mng_init_general, mng_free_itxt, mng_read_itxt, mng_write_itxt, mng_assign_itxt, 0, 0, sizeof(mng_itxt)};
+#else
+          {MNG_UINT_iTXt, mng_init_itxt, mng_free_itxt, mng_read_itxt, mng_write_itxt, mng_assign_itxt, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ITXT, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a header first! */
+  if (pData->iFirstchunkadded == 0)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_iTXt))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_itxt (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_iTXt, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_itxtp)pChunk)->iKeywordsize       = iKeywordsize;
+  ((mng_itxtp)pChunk)->iCompressionflag   = iCompressionflag;
+  ((mng_itxtp)pChunk)->iCompressionmethod = iCompressionmethod;
+  ((mng_itxtp)pChunk)->iLanguagesize      = iLanguagesize;
+  ((mng_itxtp)pChunk)->iTranslationsize   = iTranslationsize;
+  ((mng_itxtp)pChunk)->iTextsize          = iTextsize;
+
+  if (iKeywordsize)
+  {
+    MNG_ALLOC (pData, ((mng_itxtp)pChunk)->zKeyword, iKeywordsize + 1);
+    MNG_COPY (((mng_itxtp)pChunk)->zKeyword, zKeyword, iKeywordsize);
+  }
+
+  if (iLanguagesize)
+  {
+    MNG_ALLOC (pData, ((mng_itxtp)pChunk)->zLanguage, iLanguagesize + 1);
+    MNG_COPY (((mng_itxtp)pChunk)->zLanguage, zLanguage, iLanguagesize);
+  }
+
+  if (iTranslationsize)
+  {
+    MNG_ALLOC (pData, ((mng_itxtp)pChunk)->zTranslation, iTranslationsize + 1);
+    MNG_COPY (((mng_itxtp)pChunk)->zTranslation, zTranslation, iTranslationsize);
+  }
+
+  if (iTextsize)
+  {
+    MNG_ALLOC (pData, ((mng_itxtp)pChunk)->zText, iTextsize + 1);
+    MNG_COPY (((mng_itxtp)pChunk)->zText, zText, iTextsize);
+  }
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ITXT, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_bKGD
+mng_retcode MNG_DECL mng_putchunk_bkgd (mng_handle hHandle,
+                                        mng_bool   bEmpty,
+                                        mng_uint8  iType,
+                                        mng_uint8  iIndex,
+                                        mng_uint16 iGray,
+                                        mng_uint16 iRed,
+                                        mng_uint16 iGreen,
+                                        mng_uint16 iBlue)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_bKGD, mng_init_general, mng_free_general, mng_read_bkgd, mng_write_bkgd, mng_assign_general, 0, 0, sizeof(mng_bkgd)};
+#else
+          {MNG_UINT_bKGD, mng_init_bkgd, mng_free_bkgd, mng_read_bkgd, mng_write_bkgd, mng_assign_bkgd, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_BKGD, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a header first! */
+  if (pData->iFirstchunkadded == 0)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_bKGD))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_bkgd (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_bKGD, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_bkgdp)pChunk)->bEmpty = bEmpty;
+  ((mng_bkgdp)pChunk)->iType  = iType;
+  ((mng_bkgdp)pChunk)->iIndex = iIndex;
+  ((mng_bkgdp)pChunk)->iGray  = iGray;
+  ((mng_bkgdp)pChunk)->iRed   = iRed;
+  ((mng_bkgdp)pChunk)->iGreen = iGreen;
+  ((mng_bkgdp)pChunk)->iBlue  = iBlue;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_BKGD, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_pHYs
+mng_retcode MNG_DECL mng_putchunk_phys (mng_handle hHandle,
+                                        mng_bool   bEmpty,
+                                        mng_uint32 iSizex,
+                                        mng_uint32 iSizey,
+                                        mng_uint8  iUnit)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_pHYs, mng_init_general, mng_free_general, mng_read_phys, mng_write_phys, mng_assign_general, 0, 0, sizeof(mng_phys)};
+#else
+          {MNG_UINT_pHYs, mng_init_phys, mng_free_phys, mng_read_phys, mng_write_phys, mng_assign_phys, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PHYS, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a header first! */
+  if (pData->iFirstchunkadded == 0)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_pHYs))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_phys (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_pHYs, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_physp)pChunk)->bEmpty = bEmpty;
+  ((mng_physp)pChunk)->iSizex = iSizex;
+  ((mng_physp)pChunk)->iSizey = iSizey;
+  ((mng_physp)pChunk)->iUnit  = iUnit;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PHYS, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_sBIT
+mng_retcode MNG_DECL mng_putchunk_sbit (mng_handle    hHandle,
+                                        mng_bool      bEmpty,
+                                        mng_uint8     iType,
+                                        mng_uint8arr4 aBits)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_sBIT, mng_init_general, mng_free_general, mng_read_sbit, mng_write_sbit, mng_assign_general, 0, 0, sizeof(mng_sbit)};
+#else
+          {MNG_UINT_sBIT, mng_init_sbit, mng_free_sbit, mng_read_sbit, mng_write_sbit, mng_assign_sbit, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SBIT, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a header first! */
+  if (pData->iFirstchunkadded == 0)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_sBIT))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_sbit (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_sBIT, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_sbitp)pChunk)->bEmpty   = bEmpty;
+  ((mng_sbitp)pChunk)->iType    = iType;
+  ((mng_sbitp)pChunk)->aBits[0] = aBits[0];
+  ((mng_sbitp)pChunk)->aBits[1] = aBits[1];
+  ((mng_sbitp)pChunk)->aBits[2] = aBits[2];
+  ((mng_sbitp)pChunk)->aBits[3] = aBits[3];
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SBIT, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_sPLT
+mng_retcode MNG_DECL mng_putchunk_splt (mng_handle hHandle,
+                                        mng_bool   bEmpty,
+                                        mng_uint32 iNamesize,
+                                        mng_pchar  zName,
+                                        mng_uint8  iSampledepth,
+                                        mng_uint32 iEntrycount,
+                                        mng_ptr    pEntries)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_sPLT, mng_init_general, mng_free_splt, mng_read_splt, mng_write_splt, mng_assign_splt, 0, 0, sizeof(mng_splt)};
+#else
+          {MNG_UINT_sPLT, mng_init_splt, mng_free_splt, mng_read_splt, mng_write_splt, mng_assign_splt, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SPLT, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a header first! */
+  if (pData->iFirstchunkadded == 0)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_sPLT))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_splt (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_sPLT, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_spltp)pChunk)->bEmpty       = bEmpty;
+  ((mng_spltp)pChunk)->iNamesize    = iNamesize;
+  ((mng_spltp)pChunk)->iSampledepth = iSampledepth;
+  ((mng_spltp)pChunk)->iEntrycount  = iEntrycount;
+
+  if (iNamesize)
+  {
+    MNG_ALLOC (pData, ((mng_spltp)pChunk)->zName, iNamesize + 1);
+    MNG_COPY (((mng_spltp)pChunk)->zName, zName, iNamesize);
+  }
+
+  if (iEntrycount)
+  {
+    mng_uint32 iSize = iEntrycount * ((iSampledepth >> 1) + 2);
+
+    MNG_ALLOC (pData, ((mng_spltp)pChunk)->pEntries, iSize);
+    MNG_COPY  (((mng_spltp)pChunk)->pEntries, pEntries, iSize);
+  }
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SPLT, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_hIST
+mng_retcode MNG_DECL mng_putchunk_hist (mng_handle    hHandle,
+                                        mng_uint32    iEntrycount,
+                                        mng_uint16arr aEntries)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_hIST, mng_init_general, mng_free_general, mng_read_hist, mng_write_hist, mng_assign_general, 0, 0, sizeof(mng_hist)};
+#else
+          {MNG_UINT_hIST, mng_init_hist, mng_free_hist, mng_read_hist, mng_write_hist, mng_assign_hist, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_HIST, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a header first! */
+  if (pData->iFirstchunkadded == 0)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_hIST))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_hist (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_hIST, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_histp)pChunk)->iEntrycount = iEntrycount;
+
+  MNG_COPY (((mng_histp)pChunk)->aEntries, aEntries, sizeof (mng_uint16arr));
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_HIST, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_tIME
+mng_retcode MNG_DECL mng_putchunk_time (mng_handle hHandle,
+                                        mng_uint16 iYear,
+                                        mng_uint8  iMonth,
+                                        mng_uint8  iDay,
+                                        mng_uint8  iHour,
+                                        mng_uint8  iMinute,
+                                        mng_uint8  iSecond)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_tIME, mng_init_general, mng_free_general, mng_read_time, mng_write_time, mng_assign_general, 0, 0, sizeof(mng_time)};
+#else
+          {MNG_UINT_tIME, mng_init_time, mng_free_time, mng_read_time, mng_write_time, mng_assign_time, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_TIME, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_tIME))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* must have had a header first! */
+  if (pData->iFirstchunkadded == 0)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_time (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_tIME, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_timep)pChunk)->iYear   = iYear;
+  ((mng_timep)pChunk)->iMonth  = iMonth;
+  ((mng_timep)pChunk)->iDay    = iDay;
+  ((mng_timep)pChunk)->iHour   = iHour;
+  ((mng_timep)pChunk)->iMinute = iMinute;
+  ((mng_timep)pChunk)->iSecond = iSecond;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_TIME, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+mng_retcode MNG_DECL mng_putchunk_mhdr (mng_handle hHandle,
+                                        mng_uint32 iWidth,
+                                        mng_uint32 iHeight,
+                                        mng_uint32 iTicks,
+                                        mng_uint32 iLayercount,
+                                        mng_uint32 iFramecount,
+                                        mng_uint32 iPlaytime,
+                                        mng_uint32 iSimplicity)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_MHDR, mng_init_general, mng_free_general, mng_read_mhdr, mng_write_mhdr, mng_assign_general, 0, 0, sizeof(mng_mhdr)};
+#else
+          {MNG_UINT_MHDR, mng_init_mhdr, mng_free_mhdr, mng_read_mhdr, mng_write_mhdr, mng_assign_mhdr, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MHDR, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must be very first! */
+  if (pData->iFirstchunkadded != 0)
+    MNG_ERROR (pData, MNG_SEQUENCEERROR)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_MHDR))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_mhdr (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_MHDR, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_mhdrp)pChunk)->iWidth      = iWidth;
+  ((mng_mhdrp)pChunk)->iHeight     = iHeight;
+  ((mng_mhdrp)pChunk)->iTicks      = iTicks;
+  ((mng_mhdrp)pChunk)->iLayercount = iLayercount;
+  ((mng_mhdrp)pChunk)->iFramecount = iFramecount;
+  ((mng_mhdrp)pChunk)->iPlaytime   = iPlaytime;
+  ((mng_mhdrp)pChunk)->iSimplicity = iSimplicity;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MHDR, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+/* ************************************************************************** */
+
+mng_retcode MNG_DECL mng_putchunk_mend (mng_handle hHandle)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_MEND, mng_init_general, mng_free_general, mng_read_mend, mng_write_mend, mng_assign_general, 0, 0, sizeof(mng_mend)};
+#else
+          {MNG_UINT_MEND, mng_init_mend, mng_free_mend, mng_read_mend, mng_write_mend, mng_assign_mend, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MEND, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a header first! */
+  if (pData->iFirstchunkadded == 0)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_MEND))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_mend (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_MEND, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+  pData->bCreating = MNG_FALSE;        /* should be last chunk !!! */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MEND, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_LOOP
+mng_retcode MNG_DECL mng_putchunk_loop (mng_handle  hHandle,
+                                        mng_uint8   iLevel,
+                                        mng_uint32  iRepeat,
+                                        mng_uint8   iTermination,
+                                        mng_uint32  iItermin,
+                                        mng_uint32  iItermax,
+                                        mng_uint32  iCount,
+                                        mng_uint32p pSignals)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_LOOP, mng_init_general, mng_free_loop, mng_read_loop, mng_write_loop, mng_assign_loop, 0, 0, sizeof(mng_loop)};
+#else
+          {MNG_UINT_LOOP, mng_init_loop, mng_free_loop, mng_read_loop, mng_write_loop, mng_assign_loop, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_LOOP, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_LOOP))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_loop (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_LOOP, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_loopp)pChunk)->iLevel       = iLevel;
+  ((mng_loopp)pChunk)->iRepeat      = iRepeat;
+  ((mng_loopp)pChunk)->iTermination = iTermination;
+  ((mng_loopp)pChunk)->iItermin     = iItermin;
+  ((mng_loopp)pChunk)->iItermax     = iItermax;
+  ((mng_loopp)pChunk)->iCount       = iCount;
+  ((mng_loopp)pChunk)->pSignals     = pSignals;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_LOOP, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+/* ************************************************************************** */
+
+mng_retcode MNG_DECL mng_putchunk_endl (mng_handle hHandle,
+                                        mng_uint8  iLevel)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_ENDL, mng_init_general, mng_free_general, mng_read_endl, mng_write_endl, mng_assign_general, 0, 0, sizeof(mng_endl)};
+#else
+          {MNG_UINT_ENDL, mng_init_endl, mng_free_endl, mng_read_endl, mng_write_endl, mng_assign_endl, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ENDL, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_ENDL))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_endl (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_ENDL, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_endlp)pChunk)->iLevel = iLevel;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ENDL, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_DEFI
+mng_retcode MNG_DECL mng_putchunk_defi (mng_handle hHandle,
+                                        mng_uint16 iObjectid,
+                                        mng_uint8  iDonotshow,
+                                        mng_uint8  iConcrete,
+                                        mng_bool   bHasloca,
+                                        mng_int32  iXlocation,
+                                        mng_int32  iYlocation,
+                                        mng_bool   bHasclip,
+                                        mng_int32  iLeftcb,
+                                        mng_int32  iRightcb,
+                                        mng_int32  iTopcb,
+                                        mng_int32  iBottomcb)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_DEFI, mng_init_general, mng_free_general, mng_read_defi, mng_write_defi, mng_assign_general, 0, 0, sizeof(mng_defi)};
+#else
+          {MNG_UINT_DEFI, mng_init_defi, mng_free_defi, mng_read_defi, mng_write_defi, mng_assign_defi, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_DEFI, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_DEFI))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_defi (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_DEFI, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_defip)pChunk)->iObjectid  = iObjectid;
+  ((mng_defip)pChunk)->iDonotshow = iDonotshow;
+  ((mng_defip)pChunk)->iConcrete  = iConcrete;
+  ((mng_defip)pChunk)->bHasloca   = bHasloca;
+  ((mng_defip)pChunk)->iXlocation = iXlocation;
+  ((mng_defip)pChunk)->iYlocation = iYlocation;
+  ((mng_defip)pChunk)->bHasclip   = bHasclip;
+  ((mng_defip)pChunk)->iLeftcb    = iLeftcb;
+  ((mng_defip)pChunk)->iRightcb   = iRightcb;
+  ((mng_defip)pChunk)->iTopcb     = iTopcb;
+  ((mng_defip)pChunk)->iBottomcb  = iBottomcb;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_DEFI, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_BASI
+mng_retcode MNG_DECL mng_putchunk_basi (mng_handle hHandle,
+                                        mng_uint32 iWidth,
+                                        mng_uint32 iHeight,
+                                        mng_uint8  iBitdepth,
+                                        mng_uint8  iColortype,
+                                        mng_uint8  iCompression,
+                                        mng_uint8  iFilter,
+                                        mng_uint8  iInterlace,
+                                        mng_uint16 iRed,
+                                        mng_uint16 iGreen,
+                                        mng_uint16 iBlue,
+                                        mng_uint16 iAlpha,
+                                        mng_uint8  iViewable)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_BASI, mng_init_general, mng_free_general, mng_read_basi, mng_write_basi, mng_assign_general, 0, 0, sizeof(mng_basi)};
+#else
+          {MNG_UINT_BASI, mng_init_basi, mng_free_basi, mng_read_basi, mng_write_basi, mng_assign_basi, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_BASI, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_BASI))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_basi (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_BASI, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_basip)pChunk)->iWidth       = iWidth;
+  ((mng_basip)pChunk)->iHeight      = iHeight;
+  ((mng_basip)pChunk)->iBitdepth    = iBitdepth;
+  ((mng_basip)pChunk)->iColortype   = iColortype;
+  ((mng_basip)pChunk)->iCompression = iCompression;
+  ((mng_basip)pChunk)->iFilter      = iFilter;
+  ((mng_basip)pChunk)->iInterlace   = iInterlace;
+  ((mng_basip)pChunk)->iRed         = iRed;
+  ((mng_basip)pChunk)->iGreen       = iGreen;
+  ((mng_basip)pChunk)->iBlue        = iBlue;
+  ((mng_basip)pChunk)->iAlpha       = iAlpha;
+  ((mng_basip)pChunk)->iViewable    = iViewable;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_BASI, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_CLON
+mng_retcode MNG_DECL mng_putchunk_clon (mng_handle hHandle,
+                                        mng_uint16 iSourceid,
+                                        mng_uint16 iCloneid,
+                                        mng_uint8  iClonetype,
+                                        mng_uint8  iDonotshow,
+                                        mng_uint8  iConcrete,
+                                        mng_bool   bHasloca,
+                                        mng_uint8  iLocationtype,
+                                        mng_int32  iLocationx,
+                                        mng_int32  iLocationy)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_CLON, mng_init_general, mng_free_general, mng_read_clon, mng_write_clon, mng_assign_general, 0, 0, sizeof(mng_clon)};
+#else
+          {MNG_UINT_CLON, mng_init_clon, mng_free_clon, mng_read_clon, mng_write_clon, mng_assign_clon, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_CLON, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_CLON))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_clon (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_CLON, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_clonp)pChunk)->iSourceid     = iSourceid;
+  ((mng_clonp)pChunk)->iCloneid      = iCloneid;
+  ((mng_clonp)pChunk)->iClonetype    = iClonetype;
+  ((mng_clonp)pChunk)->iDonotshow    = iDonotshow;
+  ((mng_clonp)pChunk)->iConcrete     = iConcrete;
+  ((mng_clonp)pChunk)->bHasloca      = bHasloca;
+  ((mng_clonp)pChunk)->iLocationtype = iLocationtype;
+  ((mng_clonp)pChunk)->iLocationx    = iLocationx;
+  ((mng_clonp)pChunk)->iLocationy    = iLocationy;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_CLON, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_PAST
+mng_retcode MNG_DECL mng_putchunk_past (mng_handle hHandle,
+                                        mng_uint16 iDestid,
+                                        mng_uint8  iTargettype,
+                                        mng_int32  iTargetx,
+                                        mng_int32  iTargety,
+                                        mng_uint32 iCount)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_PAST, mng_init_general, mng_free_past, mng_read_past, mng_write_past, mng_assign_past, 0, 0, sizeof(mng_past)};
+#else
+          {MNG_UINT_PAST, mng_init_past, mng_free_past, mng_read_past, mng_write_past, mng_assign_past, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PAST, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_PAST))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_past (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_PAST, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_pastp)pChunk)->iDestid     = iDestid;
+  ((mng_pastp)pChunk)->iTargettype = iTargettype;
+  ((mng_pastp)pChunk)->iTargetx    = iTargetx;
+  ((mng_pastp)pChunk)->iTargety    = iTargety;
+  ((mng_pastp)pChunk)->iCount      = iCount;
+
+  if (iCount)
+    MNG_ALLOC (pData, ((mng_pastp)pChunk)->pSources, iCount * sizeof (mng_past_source));
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PAST, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_PAST
+mng_retcode MNG_DECL mng_putchunk_past_src (mng_handle hHandle,
+                                            mng_uint32 iEntry,
+                                            mng_uint16 iSourceid,
+                                            mng_uint8  iComposition,
+                                            mng_uint8  iOrientation,
+                                            mng_uint8  iOffsettype,
+                                            mng_int32  iOffsetx,
+                                            mng_int32  iOffsety,
+                                            mng_uint8  iBoundarytype,
+                                            mng_int32  iBoundaryl,
+                                            mng_int32  iBoundaryr,
+                                            mng_int32  iBoundaryt,
+                                            mng_int32  iBoundaryb)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_past_sourcep pEntry;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PAST_SRC, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+
+  pChunk = pData->pLastchunk;          /* last one must have been PAST ! */
+
+  if (((mng_chunk_headerp)pChunk)->iChunkname != MNG_UINT_PAST)
+    MNG_ERROR (pData, MNG_NOCORRCHUNK)
+                                       /* index out of bounds ? */
+  if (iEntry >= ((mng_pastp)pChunk)->iCount)
+    MNG_ERROR (pData, MNG_INVALIDENTRYIX)
+                                       /* address proper entry */
+  pEntry = ((mng_pastp)pChunk)->pSources + iEntry;
+
+  pEntry->iSourceid     = iSourceid;   /* fill entry */
+  pEntry->iComposition  = iComposition;
+  pEntry->iOrientation  = iOrientation;
+  pEntry->iOffsettype   = iOffsettype;
+  pEntry->iOffsetx      = iOffsetx;
+  pEntry->iOffsety      = iOffsety;
+  pEntry->iBoundarytype = iBoundarytype;
+  pEntry->iBoundaryl    = iBoundaryl;
+  pEntry->iBoundaryr    = iBoundaryr;
+  pEntry->iBoundaryt    = iBoundaryt;
+  pEntry->iBoundaryb    = iBoundaryb;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PAST_SRC, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_DISC
+mng_retcode MNG_DECL mng_putchunk_disc (mng_handle  hHandle,
+                                        mng_uint32  iCount,
+                                        mng_uint16p pObjectids)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_DISC, mng_init_general, mng_free_disc, mng_read_disc, mng_write_disc, mng_assign_disc, 0, 0, sizeof(mng_disc)};
+#else
+          {MNG_UINT_DISC, mng_init_disc, mng_free_disc, mng_read_disc, mng_write_disc, mng_assign_disc, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_DISC, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_DISC))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_disc (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_DISC, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_discp)pChunk)->iCount = iCount;
+
+  if (iCount)
+  {
+    mng_uint32 iSize = iCount * sizeof (mng_uint32);
+
+    MNG_ALLOC (pData, ((mng_discp)pChunk)->pObjectids, iSize);
+    MNG_COPY (((mng_discp)pChunk)->pObjectids, pObjectids, iSize);
+  }
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_DISC, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_BACK
+mng_retcode MNG_DECL mng_putchunk_back (mng_handle hHandle,
+                                        mng_uint16 iRed,
+                                        mng_uint16 iGreen,
+                                        mng_uint16 iBlue,
+                                        mng_uint8  iMandatory,
+                                        mng_uint16 iImageid,
+                                        mng_uint8  iTile)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_BACK, mng_init_general, mng_free_general, mng_read_back, mng_write_back, mng_assign_general, 0, 0, sizeof(mng_back)};
+#else
+          {MNG_UINT_BACK, mng_init_back, mng_free_back, mng_read_back, mng_write_back, mng_assign_back, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_BACK, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_BACK))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_back (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_BACK, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_backp)pChunk)->iRed       = iRed;
+  ((mng_backp)pChunk)->iGreen     = iGreen;
+  ((mng_backp)pChunk)->iBlue      = iBlue;
+  ((mng_backp)pChunk)->iMandatory = iMandatory;
+  ((mng_backp)pChunk)->iImageid   = iImageid;
+  ((mng_backp)pChunk)->iTile      = iTile;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_BACK, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_FRAM
+mng_retcode MNG_DECL mng_putchunk_fram (mng_handle  hHandle,
+                                        mng_bool    bEmpty,
+                                        mng_uint8   iMode,
+                                        mng_uint32  iNamesize,
+                                        mng_pchar   zName,
+                                        mng_uint8   iChangedelay,
+                                        mng_uint8   iChangetimeout,
+                                        mng_uint8   iChangeclipping,
+                                        mng_uint8   iChangesyncid,
+                                        mng_uint32  iDelay,
+                                        mng_uint32  iTimeout,
+                                        mng_uint8   iBoundarytype,
+                                        mng_int32   iBoundaryl,
+                                        mng_int32   iBoundaryr,
+                                        mng_int32   iBoundaryt,
+                                        mng_int32   iBoundaryb,
+                                        mng_uint32  iCount,
+                                        mng_uint32p pSyncids)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_FRAM, mng_init_general, mng_free_fram, mng_read_fram, mng_write_fram, mng_assign_fram, 0, 0, sizeof(mng_fram)};
+#else
+          {MNG_UINT_FRAM, mng_init_fram, mng_free_fram, mng_read_fram, mng_write_fram, mng_assign_fram, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_FRAM, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_FRAM))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_fram (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_FRAM, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_framp)pChunk)->bEmpty          = bEmpty;
+  ((mng_framp)pChunk)->iMode           = iMode;
+  ((mng_framp)pChunk)->iNamesize       = iNamesize;
+  ((mng_framp)pChunk)->iChangedelay    = iChangedelay;
+  ((mng_framp)pChunk)->iChangetimeout  = iChangetimeout;
+  ((mng_framp)pChunk)->iChangeclipping = iChangeclipping;
+  ((mng_framp)pChunk)->iChangesyncid   = iChangesyncid;
+  ((mng_framp)pChunk)->iDelay          = iDelay;
+  ((mng_framp)pChunk)->iTimeout        = iTimeout;
+  ((mng_framp)pChunk)->iBoundarytype   = iBoundarytype;
+  ((mng_framp)pChunk)->iBoundaryl      = iBoundaryl;
+  ((mng_framp)pChunk)->iBoundaryr      = iBoundaryr;
+  ((mng_framp)pChunk)->iBoundaryt      = iBoundaryt;
+  ((mng_framp)pChunk)->iBoundaryb      = iBoundaryb;
+  ((mng_framp)pChunk)->iCount          = iCount;
+
+  if (iNamesize)
+  {
+    MNG_ALLOC (pData, ((mng_framp)pChunk)->zName, iNamesize + 1);
+    MNG_COPY (((mng_framp)pChunk)->zName, zName, iNamesize);
+  }
+
+  if (iCount)
+  {
+    mng_uint32 iSize = iCount * sizeof (mng_uint32);
+
+    MNG_ALLOC (pData, ((mng_framp)pChunk)->pSyncids, iSize);
+    MNG_COPY (((mng_framp)pChunk)->pSyncids, pSyncids, iSize);
+  }
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_FRAM, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_MOVE
+mng_retcode MNG_DECL mng_putchunk_move (mng_handle hHandle,
+                                        mng_uint16 iFirstid,
+                                        mng_uint16 iLastid,
+                                        mng_uint8  iMovetype,
+                                        mng_int32  iMovex,
+                                        mng_int32  iMovey)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_MOVE, mng_init_general, mng_free_general, mng_read_move, mng_write_move, mng_assign_general, 0, 0, sizeof(mng_move)};
+#else
+          {MNG_UINT_MOVE, mng_init_move, mng_free_move, mng_read_move, mng_write_move, mng_assign_move, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MOVE, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_MOVE))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_move (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_MOVE, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_movep)pChunk)->iFirstid  = iFirstid;
+  ((mng_movep)pChunk)->iLastid   = iLastid;
+  ((mng_movep)pChunk)->iMovetype = iMovetype;
+  ((mng_movep)pChunk)->iMovex    = iMovex;
+  ((mng_movep)pChunk)->iMovey    = iMovey;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MOVE, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_CLIP
+mng_retcode MNG_DECL mng_putchunk_clip (mng_handle hHandle,
+                                        mng_uint16 iFirstid,
+                                        mng_uint16 iLastid,
+                                        mng_uint8  iCliptype,
+                                        mng_int32  iClipl,
+                                        mng_int32  iClipr,
+                                        mng_int32  iClipt,
+                                        mng_int32  iClipb)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_CLIP, mng_init_general, mng_free_general, mng_read_clip, mng_write_clip, mng_assign_general, 0, 0, sizeof(mng_clip)};
+#else
+          {MNG_UINT_CLIP, mng_init_clip, mng_free_clip, mng_read_clip, mng_write_clip, mng_assign_clip, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_CLIP, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_CLIP))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_clip (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_CLIP, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_clipp)pChunk)->iFirstid  = iFirstid;
+  ((mng_clipp)pChunk)->iLastid   = iLastid;
+  ((mng_clipp)pChunk)->iCliptype = iCliptype;
+  ((mng_clipp)pChunk)->iClipl    = iClipl;
+  ((mng_clipp)pChunk)->iClipr    = iClipr;
+  ((mng_clipp)pChunk)->iClipt    = iClipt;
+  ((mng_clipp)pChunk)->iClipb    = iClipb;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_CLIP, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_SHOW
+mng_retcode MNG_DECL mng_putchunk_show (mng_handle hHandle,
+                                        mng_bool   bEmpty,
+                                        mng_uint16 iFirstid,
+                                        mng_uint16 iLastid,
+                                        mng_uint8  iMode)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_SHOW, mng_init_general, mng_free_general, mng_read_show, mng_write_show, mng_assign_general, 0, 0, sizeof(mng_show)};
+#else
+          {MNG_UINT_SHOW, mng_init_show, mng_free_show, mng_read_show, mng_write_show, mng_assign_show, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SHOW, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_SHOW))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_show (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_SHOW, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_showp)pChunk)->bEmpty   = bEmpty;
+  ((mng_showp)pChunk)->iFirstid = iFirstid;
+  ((mng_showp)pChunk)->iLastid  = iLastid;
+  ((mng_showp)pChunk)->iMode    = iMode;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SHOW, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_TERM
+mng_retcode MNG_DECL mng_putchunk_term (mng_handle hHandle,
+                                        mng_uint8  iTermaction,
+                                        mng_uint8  iIteraction,
+                                        mng_uint32 iDelay,
+                                        mng_uint32 iItermax)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_TERM, mng_init_general, mng_free_general, mng_read_term, mng_write_term, mng_assign_general, 0, 0, sizeof(mng_term)};
+#else
+          {MNG_UINT_TERM, mng_init_term, mng_free_term, mng_read_term, mng_write_term, mng_assign_term, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_TERM, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_term (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_TERM, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_termp)pChunk)->iTermaction = iTermaction;
+  ((mng_termp)pChunk)->iIteraction = iIteraction;
+  ((mng_termp)pChunk)->iDelay      = iDelay;
+  ((mng_termp)pChunk)->iItermax    = iItermax;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_TERM, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_SAVE
+mng_retcode MNG_DECL mng_putchunk_save (mng_handle hHandle,
+                                        mng_bool   bEmpty,
+                                        mng_uint8  iOffsettype,
+                                        mng_uint32 iCount)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_SAVE, mng_init_general, mng_free_save, mng_read_save, mng_write_save, mng_assign_save, 0, 0, sizeof(mng_save)};
+#else
+          {MNG_UINT_SAVE, mng_init_save, mng_free_save, mng_read_save, mng_write_save, mng_assign_save, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SAVE, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_SAVE))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_save (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_SAVE, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_savep)pChunk)->bEmpty      = bEmpty;
+  ((mng_savep)pChunk)->iOffsettype = iOffsettype;
+  ((mng_savep)pChunk)->iCount      = iCount;
+
+  if (iCount)
+    MNG_ALLOC (pData, ((mng_savep)pChunk)->pEntries, iCount * sizeof (mng_save_entry));
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SAVE, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+/* ************************************************************************** */
+
+mng_retcode MNG_DECL mng_putchunk_save_entry (mng_handle     hHandle,
+                                              mng_uint32     iEntry,
+                                              mng_uint8      iEntrytype,
+                                              mng_uint32arr2 iOffset,
+                                              mng_uint32arr2 iStarttime,
+                                              mng_uint32     iLayernr,
+                                              mng_uint32     iFramenr,
+                                              mng_uint32     iNamesize,
+                                              mng_pchar      zName)
+{
+  mng_datap       pData;
+  mng_chunkp      pChunk;
+  mng_save_entryp pEntry;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SAVE_ENTRY, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+
+  pChunk = pData->pLastchunk;          /* last one must have been SAVE ! */
+
+  if (((mng_chunk_headerp)pChunk)->iChunkname != MNG_UINT_SAVE)
+    MNG_ERROR (pData, MNG_NOCORRCHUNK)
+                                       /* index out of bounds ? */
+  if (iEntry >= ((mng_savep)pChunk)->iCount)
+    MNG_ERROR (pData, MNG_INVALIDENTRYIX)
+                                       /* address proper entry */
+  pEntry = ((mng_savep)pChunk)->pEntries + iEntry;
+
+  pEntry->iEntrytype    = iEntrytype;  /* fill entry */
+  pEntry->iOffset[0]    = iOffset[0];
+  pEntry->iOffset[1]    = iOffset[1];
+  pEntry->iStarttime[0] = iStarttime[0];
+  pEntry->iStarttime[1] = iStarttime[1];
+  pEntry->iLayernr      = iLayernr;
+  pEntry->iFramenr      = iFramenr;
+  pEntry->iNamesize     = iNamesize;
+
+  if (iNamesize)
+  {
+    MNG_ALLOC (pData, pEntry->zName, iNamesize + 1);
+    MNG_COPY (pEntry->zName, zName, iNamesize);
+  }
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SAVE_ENTRY, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_SEEK
+mng_retcode MNG_DECL mng_putchunk_seek (mng_handle hHandle,
+                                        mng_uint32 iNamesize,
+                                        mng_pchar  zName)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_SEEK, mng_init_general, mng_free_seek, mng_read_seek, mng_write_seek, mng_assign_seek, 0, 0, sizeof(mng_seek)};
+#else
+          {MNG_UINT_SEEK, mng_init_seek, mng_free_seek, mng_read_seek, mng_write_seek, mng_assign_seek, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SEEK, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_SEEK))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_seek (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_SEEK, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_seekp)pChunk)->iNamesize = iNamesize;
+
+  if (iNamesize)
+  {
+    MNG_ALLOC (pData, ((mng_seekp)pChunk)->zName, iNamesize + 1);
+    MNG_COPY (((mng_seekp)pChunk)->zName, zName, iNamesize);
+  }
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_SEEK, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_eXPI
+mng_retcode MNG_DECL mng_putchunk_expi (mng_handle hHandle,
+                                        mng_uint16 iSnapshotid,
+                                        mng_uint32 iNamesize,
+                                        mng_pchar  zName)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_eXPI, mng_init_general, mng_free_expi, mng_read_expi, mng_write_expi, mng_assign_general, 0, 0, sizeof(mng_expi)};
+#else
+          {MNG_UINT_eXPI, mng_init_expi, mng_free_expi, mng_read_expi, mng_write_expi, mng_assign_expi, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_EXPI, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_eXPI))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_expi (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_eXPI, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_expip)pChunk)->iSnapshotid = iSnapshotid;
+  ((mng_expip)pChunk)->iNamesize   = iNamesize;
+
+  if (iNamesize)
+  {
+    MNG_ALLOC (pData, ((mng_expip)pChunk)->zName, iNamesize + 1);
+    MNG_COPY (((mng_expip)pChunk)->zName, zName, iNamesize);
+  }
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_EXPI, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_fPRI
+mng_retcode MNG_DECL mng_putchunk_fpri (mng_handle hHandle,
+                                        mng_uint8  iDeltatype,
+                                        mng_uint8  iPriority)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_fPRI, mng_init_general, mng_free_general, mng_read_fpri, mng_write_fpri, mng_assign_general, 0, 0, sizeof(mng_fpri)};
+#else
+          {MNG_UINT_fPRI, mng_init_fpri, mng_free_fpri, mng_read_fpri, mng_write_fpri, mng_assign_fpri, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_FPRI, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_fPRI))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_fpri (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_fPRI, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_fprip)pChunk)->iDeltatype = iDeltatype;
+  ((mng_fprip)pChunk)->iPriority  = iPriority;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_FPRI, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_nEED
+mng_retcode MNG_DECL mng_putchunk_need (mng_handle hHandle,
+                                        mng_uint32 iKeywordssize,
+                                        mng_pchar  zKeywords)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_nEED, mng_init_general, mng_free_need, mng_read_need, mng_write_need, mng_assign_need, 0, 0, sizeof(mng_need)};
+#else
+          {MNG_UINT_nEED, mng_init_need, mng_free_need, mng_read_need, mng_write_need, mng_assign_need, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_NEED, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_nEED))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_need (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_nEED, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_needp)pChunk)->iKeywordssize = iKeywordssize;
+
+  if (iKeywordssize)
+  {
+    MNG_ALLOC (pData, ((mng_needp)pChunk)->zKeywords, iKeywordssize + 1);
+    MNG_COPY (((mng_needp)pChunk)->zKeywords, zKeywords, iKeywordssize);
+  }
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_NEED, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_pHYg
+mng_retcode MNG_DECL mng_putchunk_phyg (mng_handle hHandle,
+                                        mng_bool   bEmpty,
+                                        mng_uint32 iSizex,
+                                        mng_uint32 iSizey,
+                                        mng_uint8  iUnit)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_pHYg, mng_init_general, mng_free_general, mng_read_phyg, mng_write_phyg, mng_assign_general, 0, 0, sizeof(mng_phyg)};
+#else
+          {MNG_UINT_pHYg, mng_init_phyg, mng_free_phyg, mng_read_phyg, mng_write_phyg, mng_assign_phyg, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PHYG, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_pHYg))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_phyg (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_pHYg, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_phygp)pChunk)->bEmpty = bEmpty;
+  ((mng_phygp)pChunk)->iSizex = iSizex;
+  ((mng_phygp)pChunk)->iSizey = iSizey;
+  ((mng_phygp)pChunk)->iUnit  = iUnit;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PHYG, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifdef MNG_INCLUDE_JNG
+
+mng_retcode MNG_DECL mng_putchunk_jhdr (mng_handle hHandle,
+                                        mng_uint32 iWidth,
+                                        mng_uint32 iHeight,
+                                        mng_uint8  iColortype,
+                                        mng_uint8  iImagesampledepth,
+                                        mng_uint8  iImagecompression,
+                                        mng_uint8  iImageinterlace,
+                                        mng_uint8  iAlphasampledepth,
+                                        mng_uint8  iAlphacompression,
+                                        mng_uint8  iAlphafilter,
+                                        mng_uint8  iAlphainterlace)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_JHDR, mng_init_general, mng_free_general, mng_read_jhdr, mng_write_jhdr, mng_assign_general, 0, 0, sizeof(mng_jhdr)};
+#else
+          {MNG_UINT_JHDR, mng_init_jhdr, mng_free_jhdr, mng_read_jhdr, mng_write_jhdr, mng_assign_jhdr, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_JHDR, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_JHDR))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_jhdr (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_JHDR, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_jhdrp)pChunk)->iWidth            = iWidth;
+  ((mng_jhdrp)pChunk)->iHeight           = iHeight;
+  ((mng_jhdrp)pChunk)->iColortype        = iColortype;
+  ((mng_jhdrp)pChunk)->iImagesampledepth = iImagesampledepth;
+  ((mng_jhdrp)pChunk)->iImagecompression = iImagecompression;
+  ((mng_jhdrp)pChunk)->iImageinterlace   = iImageinterlace;
+  ((mng_jhdrp)pChunk)->iAlphasampledepth = iAlphasampledepth;
+  ((mng_jhdrp)pChunk)->iAlphacompression = iAlphacompression;
+  ((mng_jhdrp)pChunk)->iAlphafilter      = iAlphafilter;
+  ((mng_jhdrp)pChunk)->iAlphainterlace   = iAlphainterlace;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_JHDR, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+#endif /* MNG_INCLUDE_JNG */
+
+/* ************************************************************************** */
+
+#ifdef MNG_INCLUDE_JNG
+
+mng_retcode MNG_DECL mng_putchunk_jdat (mng_handle hHandle,
+                                        mng_uint32 iRawlen,
+                                        mng_ptr    pRawdata)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_JDAT, mng_init_general, mng_free_jdat, mng_read_jdat, mng_write_jdat, mng_assign_jdat, 0, 0, sizeof(mng_jdat)};
+#else
+          {MNG_UINT_JDAT, mng_init_jdat, mng_free_jdat, mng_read_jdat, mng_write_jdat, mng_assign_jdat, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_JDAT, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR or JHDR first! */
+  if ((pData->iFirstchunkadded != MNG_UINT_MHDR) &&
+      (pData->iFirstchunkadded != MNG_UINT_JHDR)    )
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_JDAT))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_jdat (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_JDAT, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_jdatp)pChunk)->iDatasize = iRawlen;
+
+  if (iRawlen)
+  {
+    MNG_ALLOC (pData, ((mng_jdatp)pChunk)->pData, iRawlen);
+    MNG_COPY (((mng_jdatp)pChunk)->pData, pRawdata, iRawlen);
+  }
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_JDAT, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+#endif /*  MNG_INCLUDE_JNG */
+
+/* ************************************************************************** */
+
+#ifdef MNG_INCLUDE_JNG
+
+mng_retcode MNG_DECL mng_putchunk_jdaa (mng_handle hHandle,
+                                        mng_uint32 iRawlen,
+                                        mng_ptr    pRawdata)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_JDAA, mng_init_general, mng_free_jdaa, mng_read_jdaa, mng_write_jdaa, mng_assign_jdaa, 0, 0, sizeof(mng_jdaa)};
+#else
+          {MNG_UINT_JDAA, mng_init_jdaa, mng_free_jdaa, mng_read_jdaa, mng_write_jdaa, mng_assign_jdaa, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_JDAA, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR or JHDR first! */
+  if ((pData->iFirstchunkadded != MNG_UINT_MHDR) &&
+      (pData->iFirstchunkadded != MNG_UINT_JHDR)    )
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_JDAA))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_jdaa (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_JDAA, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_jdaap)pChunk)->iDatasize = iRawlen;
+
+  if (iRawlen)
+  {
+    MNG_ALLOC (pData, ((mng_jdaap)pChunk)->pData, iRawlen);
+    MNG_COPY (((mng_jdaap)pChunk)->pData, pRawdata, iRawlen);
+  }
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_JDAA, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+#endif /*  MNG_INCLUDE_JNG */
+
+/* ************************************************************************** */
+
+#ifdef MNG_INCLUDE_JNG
+
+mng_retcode MNG_DECL mng_putchunk_jsep (mng_handle hHandle)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_JSEP, mng_init_general, mng_free_general, mng_read_jsep, mng_write_jsep, mng_assign_general, 0, 0, sizeof(mng_jsep)};
+#else
+          {MNG_UINT_JSEP, mng_init_jsep, mng_free_jsep, mng_read_jsep, mng_write_jsep, mng_assign_jsep, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_JSEP, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR or JHDR first! */
+  if ((pData->iFirstchunkadded != MNG_UINT_MHDR) &&
+      (pData->iFirstchunkadded != MNG_UINT_JHDR)    )
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_JSEP))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_jsep (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_JSEP, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_JSEP, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+#endif /* MNG_INCLUDE_JNG */
+
+/* ************************************************************************** */
+
+#ifndef MNG_NO_DELTA_PNG
+mng_retcode MNG_DECL mng_putchunk_dhdr (mng_handle hHandle,
+                                        mng_uint16 iObjectid,
+                                        mng_uint8  iImagetype,
+                                        mng_uint8  iDeltatype,
+                                        mng_uint32 iBlockwidth,
+                                        mng_uint32 iBlockheight,
+                                        mng_uint32 iBlockx,
+                                        mng_uint32 iBlocky)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_DHDR, mng_init_general, mng_free_general, mng_read_dhdr, mng_write_dhdr, mng_assign_general, 0, 0, sizeof(mng_dhdr)};
+#else
+          {MNG_UINT_DHDR, mng_init_dhdr, mng_free_dhdr, mng_read_dhdr, mng_write_dhdr, mng_assign_dhdr, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_DHDR, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_DHDR))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_dhdr (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_DHDR, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_dhdrp)pChunk)->iObjectid    = iObjectid;
+  ((mng_dhdrp)pChunk)->iImagetype   = iImagetype;
+  ((mng_dhdrp)pChunk)->iDeltatype   = iDeltatype;
+  ((mng_dhdrp)pChunk)->iBlockwidth  = iBlockwidth;
+  ((mng_dhdrp)pChunk)->iBlockheight = iBlockheight;
+  ((mng_dhdrp)pChunk)->iBlockx      = iBlockx;
+  ((mng_dhdrp)pChunk)->iBlocky      = iBlocky;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_DHDR, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_NO_DELTA_PNG
+mng_retcode MNG_DECL mng_putchunk_prom (mng_handle hHandle,
+                                        mng_uint8  iColortype,
+                                        mng_uint8  iSampledepth,
+                                        mng_uint8  iFilltype)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_PROM, mng_init_general, mng_free_general, mng_read_prom, mng_write_prom, mng_assign_general, 0, 0, sizeof(mng_prom)};
+#else
+          {MNG_UINT_PROM, mng_init_prom, mng_free_prom, mng_read_prom, mng_write_prom, mng_assign_prom, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PROM, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_PROM))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_prom (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_PROM, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_promp)pChunk)->iColortype   = iColortype;
+  ((mng_promp)pChunk)->iSampledepth = iSampledepth;
+  ((mng_promp)pChunk)->iFilltype    = iFilltype;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PROM, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_NO_DELTA_PNG
+mng_retcode MNG_DECL mng_putchunk_ipng (mng_handle hHandle)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_IPNG, mng_init_general, mng_free_general, mng_read_ipng, mng_write_ipng, mng_assign_general, 0, 0, sizeof(mng_ipng)};
+#else
+          {MNG_UINT_IPNG, mng_init_ipng, mng_free_ipng, mng_read_ipng, mng_write_ipng, mng_assign_ipng, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_IPNG, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_IPNG))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_ipng (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_IPNG, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_IPNG, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_NO_DELTA_PNG
+mng_retcode MNG_DECL mng_putchunk_pplt (mng_handle hHandle,
+                                        mng_uint8  iDeltatype,
+                                        mng_uint32 iCount)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_PPLT, mng_init_general, mng_free_general, mng_read_pplt, mng_write_pplt, mng_assign_general, 0, 0, sizeof(mng_pplt)};
+#else
+          {MNG_UINT_PPLT, mng_init_pplt, mng_free_pplt, mng_read_pplt, mng_write_pplt, mng_assign_pplt, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PPLT, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_PPLT))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_pplt (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_PPLT, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_ppltp)pChunk)->iDeltatype = iDeltatype;
+  ((mng_ppltp)pChunk)->iCount     = iCount;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PPLT, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_NO_DELTA_PNG
+mng_retcode MNG_DECL mng_putchunk_pplt_entry (mng_handle hHandle,
+                                              mng_uint32 iEntry,
+                                              mng_uint16 iRed,
+                                              mng_uint16 iGreen,
+                                              mng_uint16 iBlue,
+                                              mng_uint16 iAlpha)
+{
+  mng_datap       pData;
+  mng_chunkp      pChunk;
+  mng_pplt_entryp pEntry;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PPLT_ENTRY, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+
+  pChunk = pData->pLastchunk;          /* last one must have been PPLT ! */
+
+  if (((mng_chunk_headerp)pChunk)->iChunkname != MNG_UINT_PPLT)
+    MNG_ERROR (pData, MNG_NOCORRCHUNK)
+
+                                       /* index out of bounds ? */
+  if (iEntry >= ((mng_ppltp)pChunk)->iCount)
+    MNG_ERROR (pData, MNG_INVALIDENTRYIX)
+                                       /* address proper entry */
+  pEntry = (mng_pplt_entryp)(((mng_ppltp)pChunk)->aEntries) + iEntry;
+
+  pEntry->iRed   = (mng_uint8)iRed;    /* fill the entry */
+  pEntry->iGreen = (mng_uint8)iGreen;
+  pEntry->iBlue  = (mng_uint8)iBlue;
+  pEntry->iAlpha = (mng_uint8)iAlpha;
+  pEntry->bUsed  = MNG_TRUE;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_PPLT_ENTRY, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_NO_DELTA_PNG
+#ifdef MNG_INCLUDE_JNG
+mng_retcode MNG_DECL mng_putchunk_ijng (mng_handle hHandle)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_IJNG, mng_init_general, mng_free_general, mng_read_ijng, mng_write_ijng, mng_assign_general, 0, 0, sizeof(mng_ijng)};
+#else
+          {MNG_UINT_IJNG, mng_init_ijng, mng_free_ijng, mng_read_ijng, mng_write_ijng, mng_assign_ijng, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_IJNG, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_IJNG))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_ijng (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_IJNG, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_IJNG, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_NO_DELTA_PNG
+mng_retcode MNG_DECL mng_putchunk_drop (mng_handle   hHandle,
+                                        mng_uint32   iCount,
+                                        mng_chunkidp pChunknames)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_DROP, mng_init_general, mng_free_drop, mng_read_drop, mng_write_drop, mng_assign_drop, 0, 0, sizeof(mng_drop)};
+#else
+          {MNG_UINT_DROP, mng_init_drop, mng_free_drop, mng_read_drop, mng_write_drop, mng_assign_drop, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_DROP, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_DROP))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_drop (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_DROP, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_dropp)pChunk)->iCount = iCount;
+
+  if (iCount)
+  {
+    mng_uint32 iSize = iCount * sizeof (mng_chunkid);
+
+    MNG_ALLOC (pData, ((mng_dropp)pChunk)->pChunknames, iSize);
+    MNG_COPY (((mng_dropp)pChunk)->pChunknames, pChunknames, iSize);
+  }
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_DROP, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_NO_DELTA_PNG
+#ifndef MNG_SKIPCHUNK_DBYK
+mng_retcode MNG_DECL mng_putchunk_dbyk (mng_handle  hHandle,
+                                        mng_chunkid iChunkname,
+                                        mng_uint8   iPolarity,
+                                        mng_uint32  iKeywordssize,
+                                        mng_pchar   zKeywords)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_DBYK, mng_init_general, mng_free_dbyk, mng_read_dbyk, mng_write_dbyk, mng_assign_dbyk, 0, 0, sizeof(mng_dbyk)};
+#else
+          {MNG_UINT_DBYK, mng_init_dbyk, mng_free_dbyk, mng_read_dbyk, mng_write_dbyk, mng_assign_dbyk, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_DBYK, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_DBYK))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_dbyk (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_DBYK, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_dbykp)pChunk)->iChunkname    = iChunkname;
+  ((mng_dbykp)pChunk)->iPolarity     = iPolarity;
+  ((mng_dbykp)pChunk)->iKeywordssize = iKeywordssize;
+
+  if (iKeywordssize)
+  {
+    MNG_ALLOC (pData, ((mng_dbykp)pChunk)->zKeywords, iKeywordssize + 1);
+    MNG_COPY (((mng_dbykp)pChunk)->zKeywords, zKeywords, iKeywordssize);
+  }
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_DBYK, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_NO_DELTA_PNG
+#ifndef MNG_SKIPCHUNK_ORDR
+mng_retcode MNG_DECL mng_putchunk_ordr (mng_handle hHandle,
+                                        mng_uint32 iCount)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_ORDR, mng_init_general, mng_free_ordr, mng_read_ordr, mng_write_ordr, mng_assign_ordr, 0, 0, sizeof(mng_ordr)};
+#else
+          {MNG_UINT_ORDR, mng_init_ordr, mng_free_ordr, mng_read_ordr, mng_write_ordr, mng_assign_ordr, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ORDR, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_ORDR))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_ordr (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_ORDR, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_ordrp)pChunk)->iCount = iCount;
+
+  if (iCount)
+    MNG_ALLOC (pData, ((mng_ordrp)pChunk)->pEntries, iCount * sizeof (mng_ordr_entry));
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ORDR, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_NO_DELTA_PNG
+#ifndef MNG_SKIPCHUNK_ORDR
+mng_retcode MNG_DECL mng_putchunk_ordr_entry (mng_handle  hHandle,
+                                              mng_uint32  iEntry,
+                                              mng_chunkid iChunkname,
+                                              mng_uint8   iOrdertype)
+{
+  mng_datap       pData;
+  mng_chunkp      pChunk;
+  mng_ordr_entryp pEntry;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ORDR_ENTRY, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+
+  pChunk = pData->pLastchunk;          /* last one must have been ORDR ! */
+
+  if (((mng_chunk_headerp)pChunk)->iChunkname != MNG_UINT_ORDR)
+    MNG_ERROR (pData, MNG_NOCORRCHUNK)
+                                       /* index out of bounds ? */
+  if (iEntry >= ((mng_ordrp)pChunk)->iCount)
+    MNG_ERROR (pData, MNG_INVALIDENTRYIX)
+                                       /* address proper entry */
+  pEntry = ((mng_ordrp)pChunk)->pEntries + iEntry;
+
+  pEntry->iChunkname = iChunkname;     /* fill the entry */
+  pEntry->iOrdertype = iOrdertype;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_ORDR_ENTRY, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_MAGN
+mng_retcode MNG_DECL mng_putchunk_magn (mng_handle hHandle,
+                                        mng_uint16 iFirstid,
+                                        mng_uint16 iLastid,
+                                        mng_uint16 iMethodX,
+                                        mng_uint16 iMX,
+                                        mng_uint16 iMY,
+                                        mng_uint16 iML,
+                                        mng_uint16 iMR,
+                                        mng_uint16 iMT,
+                                        mng_uint16 iMB,
+                                        mng_uint16 iMethodY)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_MAGN, mng_init_general, mng_free_general, mng_read_magn, mng_write_magn, mng_assign_general, 0, 0, sizeof(mng_magn)};
+#else
+          {MNG_UINT_MAGN, mng_init_magn, mng_free_magn, mng_read_magn, mng_write_magn, mng_assign_magn, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MAGN, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_MAGN))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_magn (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_MAGN, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_magnp)pChunk)->iFirstid = iFirstid;
+  ((mng_magnp)pChunk)->iLastid  = iLastid;
+  ((mng_magnp)pChunk)->iMethodX = (mng_uint8)iMethodX;
+  ((mng_magnp)pChunk)->iMX      = iMX;
+  ((mng_magnp)pChunk)->iMY      = iMY;
+  ((mng_magnp)pChunk)->iML      = iML;
+  ((mng_magnp)pChunk)->iMR      = iMR;
+  ((mng_magnp)pChunk)->iMT      = iMT;
+  ((mng_magnp)pChunk)->iMB      = iMB;
+  ((mng_magnp)pChunk)->iMethodY = (mng_uint8)iMethodY;
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MAGN, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifdef MNG_INCLUDE_MPNG_PROPOSAL
+MNG_EXT mng_retcode MNG_DECL mng_putchunk_mpng (mng_handle hHandle,
+                                                mng_uint32 iFramewidth,
+                                                mng_uint32 iFrameheight,
+                                                mng_uint16 iNumplays,
+                                                mng_uint16 iTickspersec,
+                                                mng_uint8  iCompressionmethod,
+                                                mng_uint32 iCount)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_mpNG, mng_init_general, mng_free_mpng, mng_read_mpng, mng_write_mpng, mng_assign_mpng, 0, 0, sizeof(mng_mpng)};
+#else
+          {MNG_UINT_mpNG, mng_init_mpng, mng_free_mpng, mng_read_mpng, mng_write_mpng, mng_assign_mpng, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MPNG, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a IHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_IHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_mpng (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_mpNG, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_mpngp)pChunk)->iFramewidth        = iFramewidth;
+  ((mng_mpngp)pChunk)->iFrameheight       = iFrameheight;
+  ((mng_mpngp)pChunk)->iNumplays          = iNumplays;
+  ((mng_mpngp)pChunk)->iTickspersec       = iTickspersec;
+  ((mng_mpngp)pChunk)->iCompressionmethod = iCompressionmethod;
+  ((mng_mpngp)pChunk)->iFramessize        = iCount * sizeof (mng_mpng_frame);
+
+  if (iCount)
+    MNG_ALLOC (pData, ((mng_mpngp)pChunk)->pFrames, ((mng_mpngp)pChunk)->iFramessize);
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MPNG, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifdef MNG_INCLUDE_MPNG_PROPOSAL
+MNG_EXT mng_retcode MNG_DECL mng_putchunk_mpng_frame (mng_handle hHandle,
+                                                      mng_uint32 iEntry,
+                                                      mng_uint32 iX,
+                                                      mng_uint32 iY,
+                                                      mng_uint32 iWidth,
+                                                      mng_uint32 iHeight,
+                                                      mng_int32  iXoffset,
+                                                      mng_int32  iYoffset,
+                                                      mng_uint16 iTicks)
+{
+  mng_datap       pData;
+  mng_chunkp      pChunk;
+  mng_mpng_framep pFrame;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MPNG_FRAME, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a IHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_IHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+
+  pChunk = pData->pLastchunk;          /* last one must have been mpNG ! */
+
+  if (((mng_chunk_headerp)pChunk)->iChunkname != MNG_UINT_mpNG)
+    MNG_ERROR (pData, MNG_NOCORRCHUNK)
+                                       /* index out of bounds ? */
+  if (iEntry >= (((mng_mpngp)pChunk)->iFramessize / sizeof (mng_mpng_frame)))
+    MNG_ERROR (pData, MNG_INVALIDENTRYIX)
+                                       /* address proper entry */
+  pFrame = ((mng_mpngp)pChunk)->pFrames + iEntry;
+                                       /* fill entry */
+  pFrame->iX        = iX;
+  pFrame->iY        = iY;
+  pFrame->iWidth    = iWidth;
+  pFrame->iHeight   = iHeight;
+  pFrame->iXoffset  = iXoffset;
+  pFrame->iYoffset  = iYoffset;
+  pFrame->iTicks    = iTicks;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_MPNG_FRAME, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+#ifndef MNG_SKIPCHUNK_evNT
+mng_retcode MNG_DECL mng_putchunk_evnt (mng_handle hHandle,
+                                        mng_uint32 iCount)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_evNT, mng_init_general, mng_free_evnt, mng_read_evnt, mng_write_evnt, mng_assign_evnt, 0, 0, sizeof(mng_evnt)};
+#else
+          {MNG_UINT_evNT, mng_init_evnt, mng_free_evnt, mng_read_evnt, mng_write_evnt, mng_assign_evnt, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_EVNT, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, MNG_UINT_evNT))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_evnt (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_evNT, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_evntp)pChunk)->iCount = iCount;
+
+  if (iCount)
+    MNG_ALLOC (pData, ((mng_evntp)pChunk)->pEntries, iCount * sizeof (mng_evnt_entry));
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_EVNT, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+/* ************************************************************************** */
+
+mng_retcode MNG_DECL mng_putchunk_evnt_entry (mng_handle hHandle,
+                                              mng_uint32 iEntry,
+                                              mng_uint8  iEventtype,
+                                              mng_uint8  iMasktype,
+                                              mng_int32  iLeft,
+                                              mng_int32  iRight,
+                                              mng_int32  iTop,
+                                              mng_int32  iBottom,
+                                              mng_uint16 iObjectid,
+                                              mng_uint8  iIndex,
+                                              mng_uint32 iSegmentnamesize,
+                                              mng_pchar  zSegmentname)
+{
+  mng_datap       pData;
+  mng_chunkp      pChunk;
+  mng_evnt_entryp pEntry;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_EVNT_ENTRY, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a MHDR first! */
+  if (pData->iFirstchunkadded != MNG_UINT_MHDR)
+    MNG_ERROR (pData, MNG_NOHEADER)
+
+  pChunk = pData->pLastchunk;          /* last one must have been evNT ! */
+
+  if (((mng_chunk_headerp)pChunk)->iChunkname != MNG_UINT_evNT)
+    MNG_ERROR (pData, MNG_NOCORRCHUNK)
+                                       /* index out of bounds ? */
+  if (iEntry >= ((mng_evntp)pChunk)->iCount)
+    MNG_ERROR (pData, MNG_INVALIDENTRYIX)
+                                       /* address proper entry */
+  pEntry = ((mng_evntp)pChunk)->pEntries + iEntry;
+                                       /* fill entry */
+  pEntry->iEventtype       = iEventtype;
+  pEntry->iMasktype        = iMasktype;
+  pEntry->iLeft            = iLeft;
+  pEntry->iRight           = iRight;
+  pEntry->iTop             = iTop;
+  pEntry->iBottom          = iBottom;
+  pEntry->iObjectid        = iObjectid;
+  pEntry->iIndex           = iIndex;
+  pEntry->iSegmentnamesize = iSegmentnamesize;
+
+  if (iSegmentnamesize)
+  {
+    MNG_ALLOC (pData, pEntry->zSegmentname, iSegmentnamesize + 1);
+    MNG_COPY (pEntry->zSegmentname, zSegmentname, iSegmentnamesize);
+  }
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_EVNT_ENTRY, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+#endif
+
+/* ************************************************************************** */
+
+mng_retcode MNG_DECL mng_putchunk_unknown (mng_handle  hHandle,
+                                           mng_chunkid iChunkname,
+                                           mng_uint32  iRawlen,
+                                           mng_ptr     pRawdata)
+{
+  mng_datap        pData;
+  mng_chunkp       pChunk;
+  mng_retcode      iRetcode;
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+  mng_chunk_header sChunkheader =
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+          {MNG_UINT_HUH, mng_init_general, mng_free_unknown, mng_read_unknown, mng_write_unknown, mng_assign_unknown, 0, 0, sizeof(mng_unknown_chunk)};
+#else
+          {MNG_UINT_HUH, mng_init_unknown, mng_free_unknown, mng_read_unknown, mng_write_unknown, mng_assign_unknown, 0, 0};
+#endif
+#else
+  mng_chunk_header sChunkheader;
+#endif
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_UNKNOWN, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must have had a header first! */
+  if (pData->iFirstchunkadded == 0)
+    MNG_ERROR (pData, MNG_NOHEADER)
+                                       /* prevent misplaced TERM ! */
+  if (!check_term (pData, iChunkname))
+    MNG_ERROR (pData, MNG_TERMSEQERROR)
+                                       /* create the chunk */
+#ifndef MNG_OPTIMIZE_CHUNKREADER
+#ifdef MNG_OPTIMIZE_CHUNKINITFREE
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#else
+  iRetcode = mng_init_unknown (pData, &sChunkheader, &pChunk);
+#endif
+#else
+  mng_get_chunkheader(MNG_UINT_HUH, &sChunkheader);
+  iRetcode = mng_init_general (pData, &sChunkheader, &pChunk);
+#endif
+
+  if (iRetcode)                        /* on error bail out */
+    return iRetcode;
+                                       /* fill the chunk */
+  ((mng_unknown_chunkp)pChunk)->sHeader.iChunkname = iChunkname;
+  ((mng_unknown_chunkp)pChunk)->iDatasize          = iRawlen;
+
+  if (iRawlen)
+  {
+    MNG_ALLOC (pData, ((mng_unknown_chunkp)pChunk)->pData, iRawlen);
+    MNG_COPY (((mng_unknown_chunkp)pChunk)->pData, pRawdata, iRawlen);
+  }
+
+  mng_add_chunk (pData, pChunk);       /* add it to the list */
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTCHUNK_UNKNOWN, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+/* ************************************************************************** */
+
+#endif /* MNG_INCLUDE_WRITE_PROCS */
+
+/* ************************************************************************** */
+/* ************************************************************************** */
+
+mng_retcode MNG_DECL mng_getimgdata_seq (mng_handle        hHandle,
+                                         mng_uint32        iSeqnr,
+                                         mng_uint32        iCanvasstyle,
+                                         mng_getcanvasline fGetcanvasline)
+{
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETIMGDATA_SEQ, MNG_LC_START);
+#endif
+
+
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETIMGDATA_SEQ, MNG_LC_END);
+#endif
+
+  return MNG_FNNOTIMPLEMENTED;
+}
+
+/* ************************************************************************** */
+
+mng_retcode MNG_DECL mng_getimgdata_chunkseq (mng_handle        hHandle,
+                                              mng_uint32        iSeqnr,
+                                              mng_uint32        iCanvasstyle,
+                                              mng_getcanvasline fGetcanvasline)
+{
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETIMGDATA_CHUNKSEQ, MNG_LC_START);
+#endif
+
+
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETIMGDATA_CHUNKSEQ, MNG_LC_END);
+#endif
+
+  return MNG_FNNOTIMPLEMENTED;
+}
+
+/* ************************************************************************** */
+
+mng_retcode MNG_DECL mng_getimgdata_chunk (mng_handle        hHandle,
+                                           mng_handle        hChunk,
+                                           mng_uint32        iCanvasstyle,
+                                           mng_getcanvasline fGetcanvasline)
+{
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETIMGDATA_CHUNK, MNG_LC_START);
+#endif
+
+
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_GETIMGDATA_CHUNK, MNG_LC_END);
+#endif
+
+  return MNG_FNNOTIMPLEMENTED;
+}
+
+/* ************************************************************************** */
+/* ************************************************************************** */
+
+#ifdef MNG_INCLUDE_WRITE_PROCS
+
+/* ************************************************************************** */
+
+mng_retcode MNG_DECL mng_putimgdata_ihdr (mng_handle        hHandle,
+                                          mng_uint32        iWidth,
+                                          mng_uint32        iHeight,
+                                          mng_uint8         iColortype,
+                                          mng_uint8         iBitdepth,
+                                          mng_uint8         iCompression,
+                                          mng_uint8         iFilter,
+                                          mng_uint8         iInterlace,
+                                          mng_uint32        iCanvasstyle,
+                                          mng_getcanvasline fGetcanvasline)
+{
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTIMGDATA_IHDR, MNG_LC_START);
+#endif
+
+
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTIMGDATA_IHDR, MNG_LC_END);
+#endif
+
+  return MNG_FNNOTIMPLEMENTED;
+}
+
+/* ************************************************************************** */
+
+#ifdef MNG_INCLUDE_JNG
+mng_retcode MNG_DECL mng_putimgdata_jhdr (mng_handle        hHandle,
+                                          mng_uint32        iWidth,
+                                          mng_uint32        iHeight,
+                                          mng_uint8         iColortype,
+                                          mng_uint8         iBitdepth,
+                                          mng_uint8         iCompression,
+                                          mng_uint8         iInterlace,
+                                          mng_uint8         iAlphaBitdepth,
+                                          mng_uint8         iAlphaCompression,
+                                          mng_uint8         iAlphaFilter,
+                                          mng_uint8         iAlphaInterlace,
+                                          mng_uint32        iCanvasstyle,
+                                          mng_getcanvasline fGetcanvasline)
+{
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTIMGDATA_JHDR, MNG_LC_START);
+#endif
+
+
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_PUTIMGDATA_JHDR, MNG_LC_END);
+#endif
+
+  return MNG_FNNOTIMPLEMENTED;
+}
+#endif
+
+/* ************************************************************************** */
+
+mng_retcode MNG_DECL mng_updatemngheader (mng_handle hHandle,
+                                          mng_uint32 iFramecount,
+                                          mng_uint32 iLayercount,
+                                          mng_uint32 iPlaytime)
+{
+  mng_datap  pData;
+  mng_chunkp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_UPDATEMNGHEADER, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must be a MNG animation! */
+  if ((pData->eImagetype != mng_it_mng) || (pData->iFirstchunkadded != MNG_UINT_MHDR))
+    MNG_ERROR (pData, MNG_NOMHDR)
+
+  pChunk = pData->pFirstchunk;         /* get the first chunk */
+                                       /* and update the variables */
+  ((mng_mhdrp)pChunk)->iFramecount = iFramecount;
+  ((mng_mhdrp)pChunk)->iLayercount = iLayercount;
+  ((mng_mhdrp)pChunk)->iPlaytime   = iPlaytime;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_UPDATEMNGHEADER, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+/* ************************************************************************** */
+
+mng_retcode MNG_DECL mng_updatemngsimplicity (mng_handle hHandle,
+                                              mng_uint32 iSimplicity)
+{
+  mng_datap  pData;
+  mng_chunkp pChunk;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_UPDATEMNGSIMPLICITY, MNG_LC_START);
+#endif
+
+  MNG_VALIDHANDLE (hHandle)            /* check validity handle */
+  pData = (mng_datap)hHandle;          /* and make it addressable */
+
+  if (!pData->bCreating)               /* aren't we creating a new file ? */
+    MNG_ERROR (pData, MNG_FUNCTIONINVALID)
+                                       /* must be a MNG animation! */
+  if ((pData->eImagetype != mng_it_mng) || (pData->iFirstchunkadded != MNG_UINT_MHDR))
+    MNG_ERROR (pData, MNG_NOMHDR)
+
+  pChunk = pData->pFirstchunk;         /* get the first chunk */
+                                       /* and update the variable */
+  ((mng_mhdrp)pChunk)->iSimplicity = iSimplicity;
+
+#ifdef MNG_SUPPORT_TRACE
+  MNG_TRACE (((mng_datap)hHandle), MNG_FN_UPDATEMNGSIMPLICITY, MNG_LC_END);
+#endif
+
+  return MNG_NOERROR;
+}
+
+/* ************************************************************************** */
+
+#endif /* MNG_INCLUDE_WRITE_PROCS */
+
+/* ************************************************************************** */
+
+#endif /* MNG_ACCESS_CHUNKS */
+
+/* ************************************************************************** */
+/* * end of file                                                            * */
+/* ************************************************************************** */
+
+
+