mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-02-28 11:03:49 +00:00
6090 lines
193 KiB
C
6090 lines
193 KiB
C
/* ************************************************************************** */
|
|
/* * For conditions of distribution and use, * */
|
|
/* * see copyright notice in libmng.h * */
|
|
/* ************************************************************************** */
|
|
/* * * */
|
|
/* * project : libmng * */
|
|
/* * file : libmng_chunk_descr.c copyright (c) 2005-2007 G.Juyn * */
|
|
/* * version : 1.0.10 * */
|
|
/* * * */
|
|
/* * purpose : Chunk descriptor functions (implementation) * */
|
|
/* * * */
|
|
/* * author : G.Juyn * */
|
|
/* * * */
|
|
/* * comment : implementation of the chunk- anf field-descriptor * */
|
|
/* * routines * */
|
|
/* * * */
|
|
/* * changes : 1.0.9 - 12/06/2004 - G.Juyn * */
|
|
/* * - added conditional MNG_OPTIMIZE_CHUNKREADER * */
|
|
/* * 1.0.9 - 12/11/2004 - G.Juyn * */
|
|
/* * - made all constants 'static' * */
|
|
/* * 1.0.9 - 12/20/2004 - G.Juyn * */
|
|
/* * - cleaned up macro-invocations (thanks to D. Airlie) * */
|
|
/* * 1.0.9 - 01/17/2005 - G.Juyn * */
|
|
/* * - fixed problem with global PLTE/tRNS * */
|
|
/* * * */
|
|
/* * 1.0.10 - 01/17/2005 - G.R-P. * */
|
|
/* * - added typecast to appease the compiler * */
|
|
/* * 1.0.10 - 04/08/2007 - G.Juyn * */
|
|
/* * - added support for mPNG proposal * */
|
|
/* * 1.0.10 - 04/12/2007 - G.Juyn * */
|
|
/* * - added support for ANG proposal * */
|
|
/* * * */
|
|
/* ************************************************************************** */
|
|
|
|
#include <stddef.h> /* needed for offsetof() */
|
|
|
|
#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_objects.h"
|
|
#include "libmng_chunks.h"
|
|
#include "libmng_chunk_descr.h"
|
|
#include "libmng_object_prc.h"
|
|
#include "libmng_chunk_prc.h"
|
|
#include "libmng_chunk_io.h"
|
|
#include "libmng_display.h"
|
|
|
|
#ifdef MNG_INCLUDE_ANG_PROPOSAL
|
|
#include "libmng_pixels.h"
|
|
#include "libmng_filter.h"
|
|
#endif
|
|
|
|
#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI)
|
|
#pragma option -A /* force ANSI-C */
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifdef MNG_OPTIMIZE_CHUNKREADER
|
|
#if defined(MNG_INCLUDE_READ_PROCS) || defined(MNG_INCLUDE_WRITE_PROCS)
|
|
|
|
/* ************************************************************************** */
|
|
/* ************************************************************************** */
|
|
/* PNG chunks */
|
|
|
|
MNG_LOCAL mng_field_descriptor mng_fields_ihdr [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_NOHIGHBIT,
|
|
1, 0, 4, 4,
|
|
offsetof(mng_ihdr, iWidth), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_NOHIGHBIT,
|
|
1, 0, 4, 4,
|
|
offsetof(mng_ihdr, iHeight), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
1, 16, 1, 1,
|
|
offsetof(mng_ihdr, iBitdepth), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 6, 1, 1,
|
|
offsetof(mng_ihdr, iColortype), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 1, 1,
|
|
offsetof(mng_ihdr, iCompression), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 1, 1,
|
|
offsetof(mng_ihdr, iFilter), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 1, 1, 1,
|
|
offsetof(mng_ihdr, iInterlace), MNG_NULL, MNG_NULL}
|
|
};
|
|
|
|
/* ************************************************************************** */
|
|
|
|
MNG_LOCAL mng_field_descriptor mng_fields_plte [] =
|
|
{
|
|
{mng_debunk_plte,
|
|
MNG_NULL,
|
|
0, 0, 0, 0,
|
|
MNG_NULL, MNG_NULL, MNG_NULL}
|
|
};
|
|
|
|
/* ************************************************************************** */
|
|
|
|
MNG_LOCAL mng_field_descriptor mng_fields_idat [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_NULL,
|
|
0, 0, 0, 0,
|
|
offsetof(mng_idat, pData), MNG_NULL, offsetof(mng_idat, iDatasize)}
|
|
};
|
|
|
|
/* ************************************************************************** */
|
|
|
|
MNG_LOCAL mng_field_descriptor mng_fields_trns [] =
|
|
{
|
|
{mng_debunk_trns,
|
|
MNG_NULL,
|
|
0, 0, 0, 0,
|
|
MNG_NULL, MNG_NULL, MNG_NULL}
|
|
};
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_gAMA
|
|
MNG_LOCAL mng_field_descriptor mng_fields_gama [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_gama, iGamma), MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_cHRM
|
|
MNG_LOCAL mng_field_descriptor mng_fields_chrm [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_chrm, iWhitepointx), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_chrm, iWhitepointy), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_chrm, iRedx), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_chrm, iRedy), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_chrm, iGreeny), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_chrm, iGreeny), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_chrm, iBluex), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_chrm, iBluey), MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_sRGB
|
|
MNG_LOCAL mng_field_descriptor mng_fields_srgb [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 4, 1, 1,
|
|
offsetof(mng_srgb, iRenderingintent), MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_iCCP
|
|
MNG_LOCAL mng_field_descriptor mng_fields_iccp [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_TERMINATOR,
|
|
0, 0, 1, 79,
|
|
offsetof(mng_iccp, zName), MNG_NULL, offsetof(mng_iccp, iNamesize)},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 1, 1,
|
|
offsetof(mng_iccp, iCompression), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_DEFLATED,
|
|
0, 0, 0, 0,
|
|
offsetof(mng_iccp, pProfile), MNG_NULL, offsetof(mng_iccp, iProfilesize)}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_tEXt
|
|
MNG_LOCAL mng_field_descriptor mng_fields_text [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_TERMINATOR,
|
|
0, 0, 1, 79,
|
|
offsetof(mng_text, zKeyword), MNG_NULL, offsetof(mng_text, iKeywordsize)},
|
|
{MNG_NULL,
|
|
MNG_NULL,
|
|
0, 0, 0, 0,
|
|
offsetof(mng_text, zText), MNG_NULL, offsetof(mng_text, iTextsize)}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_zTXt
|
|
MNG_LOCAL mng_field_descriptor mng_fields_ztxt [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_TERMINATOR,
|
|
0, 0, 1, 79,
|
|
offsetof(mng_ztxt, zKeyword), MNG_NULL, offsetof(mng_ztxt, iKeywordsize)},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 1, 1,
|
|
offsetof(mng_ztxt, iCompression), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_DEFLATED,
|
|
0, 0, 0, 0,
|
|
offsetof(mng_ztxt, zText), MNG_NULL, offsetof(mng_ztxt, iTextsize)}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_iTXt
|
|
MNG_LOCAL mng_field_descriptor mng_fields_itxt [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_TERMINATOR,
|
|
0, 0, 1, 79,
|
|
offsetof(mng_itxt, zKeyword), MNG_NULL, offsetof(mng_itxt, iKeywordsize)},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 1, 1, 1,
|
|
offsetof(mng_itxt, iCompressionflag), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 1, 1,
|
|
offsetof(mng_itxt, iCompressionmethod), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_TERMINATOR,
|
|
0, 0, 0, 0,
|
|
offsetof(mng_itxt, zLanguage), MNG_NULL, offsetof(mng_itxt, iLanguagesize)},
|
|
{MNG_NULL,
|
|
MNG_FIELD_TERMINATOR,
|
|
0, 0, 0, 0,
|
|
offsetof(mng_itxt, zTranslation), MNG_NULL, offsetof(mng_itxt, iTranslationsize)},
|
|
{mng_deflate_itxt,
|
|
MNG_NULL,
|
|
0, 0, 0, 0,
|
|
MNG_NULL, MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_bKGD
|
|
MNG_LOCAL mng_field_descriptor mng_fields_bkgd [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_PUTIMGTYPE,
|
|
0, 0, 0, 0,
|
|
offsetof(mng_bkgd, iType), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_IFIMGTYPE3,
|
|
0, 0xFF, 1, 1,
|
|
offsetof(mng_bkgd, iIndex), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_IFIMGTYPE0 | MNG_FIELD_IFIMGTYPE4,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_bkgd, iGray), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_IFIMGTYPE2 | MNG_FIELD_IFIMGTYPE6,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_bkgd, iRed), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_IFIMGTYPE2 | MNG_FIELD_IFIMGTYPE6,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_bkgd, iGreen), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_IFIMGTYPE2 | MNG_FIELD_IFIMGTYPE6,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_bkgd, iBlue), MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_pHYs
|
|
MNG_LOCAL mng_field_descriptor mng_fields_phys [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_phys, iSizex), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_phys, iSizey), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 1, 1, 1,
|
|
offsetof(mng_phys, iUnit), MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_sBIT
|
|
MNG_LOCAL mng_field_descriptor mng_fields_sbit [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_PUTIMGTYPE,
|
|
0, 0, 0, 0,
|
|
offsetof(mng_sbit, iType), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_IFIMGTYPES,
|
|
0, 0xFF, 1, 1,
|
|
offsetof(mng_sbit, aBits[0]), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_IFIMGTYPE2 | MNG_FIELD_IFIMGTYPE3 | MNG_FIELD_IFIMGTYPE4 | MNG_FIELD_IFIMGTYPE6,
|
|
0, 0xFF, 1, 1,
|
|
offsetof(mng_sbit, aBits[1]), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_IFIMGTYPE2 | MNG_FIELD_IFIMGTYPE3 | MNG_FIELD_IFIMGTYPE6,
|
|
0, 0xFF, 1, 1,
|
|
offsetof(mng_sbit, aBits[2]), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_IFIMGTYPE6,
|
|
0, 0xFF, 1, 1,
|
|
offsetof(mng_sbit, aBits[3]), MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_sPLT
|
|
MNG_LOCAL mng_field_descriptor mng_fields_splt [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_NULL,
|
|
0, 0, 1, 79,
|
|
offsetof(mng_splt, zName), MNG_NULL, offsetof(mng_splt, iNamesize)},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
8, 16, 1, 1,
|
|
offsetof(mng_splt, iSampledepth), MNG_NULL, MNG_NULL},
|
|
{mng_splt_entries,
|
|
MNG_NULL,
|
|
0, 0, 0, 0,
|
|
MNG_NULL, MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_hIST
|
|
MNG_LOCAL mng_field_descriptor mng_fields_hist [] =
|
|
{
|
|
{mng_hist_entries,
|
|
MNG_NULL,
|
|
0, 0, 0, 0,
|
|
MNG_NULL, MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_tIME
|
|
MNG_LOCAL mng_field_descriptor mng_fields_time [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_time, iYear), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
1, 12, 1, 1,
|
|
offsetof(mng_time, iMonth), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
1, 31, 1, 1,
|
|
offsetof(mng_time, iDay), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 24, 1, 1,
|
|
offsetof(mng_time, iHour), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 60, 1, 1,
|
|
offsetof(mng_time, iMinute), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 60, 1, 1,
|
|
offsetof(mng_time, iSecond), MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
/* ************************************************************************** */
|
|
/* JNG chunks */
|
|
|
|
#ifdef MNG_INCLUDE_JNG
|
|
MNG_LOCAL mng_field_descriptor mng_fields_jhdr [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_NOHIGHBIT,
|
|
1, 0, 4, 4,
|
|
offsetof(mng_jhdr, iWidth), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_NOHIGHBIT,
|
|
1, 0, 4, 4,
|
|
offsetof(mng_jhdr, iHeight), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
8, 16, 1, 1,
|
|
offsetof(mng_jhdr, iColortype), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
8, 20, 1, 1,
|
|
offsetof(mng_jhdr, iImagesampledepth), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
8, 8, 1, 1,
|
|
offsetof(mng_jhdr, iImagecompression), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 8, 1, 1,
|
|
offsetof(mng_jhdr, iImageinterlace), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 16, 1, 1,
|
|
offsetof(mng_jhdr, iAlphasampledepth), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 8, 1, 1,
|
|
offsetof(mng_jhdr, iAlphacompression), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 1, 1,
|
|
offsetof(mng_jhdr, iAlphafilter), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 1, 1, 1,
|
|
offsetof(mng_jhdr, iAlphainterlace), MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifdef MNG_INCLUDE_JNG
|
|
#define mng_fields_jdaa mng_fields_idat
|
|
#define mng_fields_jdat mng_fields_idat
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
/* ************************************************************************** */
|
|
/* MNG chunks */
|
|
|
|
MNG_LOCAL mng_field_descriptor mng_fields_mhdr [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_mhdr, iWidth), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_mhdr, iHeight), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_mhdr, iTicks), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_mhdr, iLayercount), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_mhdr, iFramecount), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_mhdr, iPlaytime), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_mhdr, iSimplicity), MNG_NULL, MNG_NULL}
|
|
};
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_LOOP
|
|
MNG_LOCAL mng_field_descriptor mng_fields_loop [] =
|
|
{
|
|
{mng_debunk_loop,
|
|
MNG_NULL,
|
|
0, 0, 0, 0,
|
|
MNG_NULL, MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_LOOP
|
|
MNG_LOCAL mng_field_descriptor mng_fields_endl [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0xFF, 1, 1,
|
|
offsetof(mng_endl, iLevel), MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_DEFI
|
|
MNG_LOCAL mng_field_descriptor mng_fields_defi [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_defi, iObjectid), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL,
|
|
0, 0xFF, 1, 1,
|
|
offsetof(mng_defi, iDonotshow), offsetof(mng_defi, bHasdonotshow), MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL,
|
|
0, 0xFF, 1, 1,
|
|
offsetof(mng_defi, iConcrete), offsetof(mng_defi, bHasconcrete), MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_defi, iXlocation), offsetof(mng_defi, bHasloca), MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_defi, iYlocation), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP2,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_defi, iLeftcb), offsetof(mng_defi, bHasclip), MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP2,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_defi, iRightcb), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP2,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_defi, iTopcb), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP2,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_defi, iBottomcb), MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_BASI
|
|
MNG_LOCAL mng_field_descriptor mng_fields_basi [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_basi, iWidth), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_basi, iHeight), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
1, 16, 1, 1,
|
|
offsetof(mng_basi, iBitdepth), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 6, 1, 1,
|
|
offsetof(mng_basi, iColortype), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 1, 1,
|
|
offsetof(mng_basi, iCompression), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 1, 1,
|
|
offsetof(mng_basi, iFilter), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 1, 1, 1,
|
|
offsetof(mng_basi, iInterlace), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_basi, iRed), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_basi, iGreen), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_basi, iBlue), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_basi, iAlpha), offsetof(mng_basi, bHasalpha), MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL,
|
|
0, 1, 1, 1,
|
|
offsetof(mng_basi, iViewable), MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_CLON
|
|
MNG_LOCAL mng_field_descriptor mng_fields_clon [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_clon, iSourceid), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_clon, iCloneid), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL,
|
|
0, 2, 1, 1,
|
|
offsetof(mng_clon, iClonetype), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL,
|
|
0, 1, 1, 1,
|
|
offsetof(mng_clon, iDonotshow), offsetof(mng_clon, bHasdonotshow), MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL,
|
|
0, 1, 1, 1,
|
|
offsetof(mng_clon, iConcrete), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1,
|
|
0, 2, 1, 1,
|
|
offsetof(mng_clon, iLocationtype), offsetof(mng_clon, bHasloca), MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_clon, iLocationx), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_clon, iLocationy), MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_PAST
|
|
MNG_LOCAL mng_field_descriptor mng_fields_past [] =
|
|
{
|
|
{mng_debunk_past,
|
|
MNG_NULL,
|
|
0, 0, 0, 0,
|
|
MNG_NULL, MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_DISC
|
|
MNG_LOCAL mng_field_descriptor mng_fields_disc [] =
|
|
{
|
|
{mng_disc_entries,
|
|
MNG_NULL,
|
|
0, 0, 0, 0,
|
|
MNG_NULL, MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_BACK
|
|
MNG_LOCAL mng_field_descriptor mng_fields_back [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_back, iRed), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_back, iGreen), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_back, iBlue), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL,
|
|
0, 3, 1, 1,
|
|
offsetof(mng_back, iMandatory), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_back, iImageid), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL,
|
|
0, 1, 1, 1,
|
|
offsetof(mng_back, iTile), MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_FRAM
|
|
MNG_LOCAL mng_field_descriptor mng_fields_fram [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL,
|
|
0, 4, 1, 1,
|
|
offsetof(mng_fram, iMode), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_TERMINATOR | MNG_FIELD_OPTIONAL,
|
|
0, 0, 1, 79,
|
|
offsetof(mng_fram, zName), MNG_NULL, offsetof(mng_fram, iNamesize)},
|
|
{mng_fram_remainder,
|
|
MNG_FIELD_OPTIONAL,
|
|
0, 0, 0, 0,
|
|
MNG_NULL, MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_MOVE
|
|
MNG_LOCAL mng_field_descriptor mng_fields_move [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_move, iFirstid), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_move, iLastid), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 1, 1, 1,
|
|
offsetof(mng_move, iMovetype), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_move, iMovex), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_move, iMovey), MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_CLIP
|
|
MNG_LOCAL mng_field_descriptor mng_fields_clip [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_clip, iFirstid), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_clip, iLastid), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 1, 1, 1,
|
|
offsetof(mng_clip, iCliptype), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_clip, iClipl), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_clip, iClipr), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_clip, iClipt), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_clip, iClipb), MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_SHOW
|
|
MNG_LOCAL mng_field_descriptor mng_fields_show [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
1, 0xFFFF, 2, 2,
|
|
offsetof(mng_show, iFirstid), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL,
|
|
1, 0xFFFF, 2, 2,
|
|
offsetof(mng_show, iLastid), offsetof(mng_show, bHaslastid), MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL,
|
|
0, 7, 1, 1,
|
|
offsetof(mng_show, iMode), MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_TERM
|
|
MNG_LOCAL mng_field_descriptor mng_fields_term [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 3, 1, 1,
|
|
offsetof(mng_term, iTermaction), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1,
|
|
0, 2, 1, 1,
|
|
offsetof(mng_term, iIteraction), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_term, iDelay), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_term, iItermax), MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_SAVE
|
|
MNG_LOCAL mng_field_descriptor mng_fields_save [] =
|
|
{
|
|
{mng_save_entries,
|
|
MNG_NULL,
|
|
0, 0, 0, 0,
|
|
MNG_NULL, MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_SEEK
|
|
MNG_LOCAL mng_field_descriptor mng_fields_seek [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_NULL,
|
|
0, 0, 1, 79,
|
|
offsetof(mng_seek, zName), MNG_NULL, offsetof(mng_seek, iNamesize)}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_eXPI
|
|
MNG_LOCAL mng_field_descriptor mng_fields_expi [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_expi, iSnapshotid), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_NULL,
|
|
0, 0, 1, 79,
|
|
offsetof(mng_expi, zName), MNG_NULL, offsetof(mng_expi, iNamesize)}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_fPRI
|
|
MNG_LOCAL mng_field_descriptor mng_fields_fpri [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 1, 1, 1,
|
|
offsetof(mng_fpri, iDeltatype), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0xFF, 1, 1,
|
|
offsetof(mng_fpri, iPriority), MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_nEED
|
|
MNG_LOCAL mng_field_descriptor mng_fields_need [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_NULL,
|
|
0, 0, 1, 0,
|
|
offsetof(mng_need, zKeywords), MNG_NULL, offsetof(mng_need, iKeywordssize)}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_pHYg
|
|
#define mng_fields_phyg mng_fields_phys
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
MNG_LOCAL mng_field_descriptor mng_fields_dhdr [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_dhdr, iObjectid), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 2, 1, 1,
|
|
offsetof(mng_dhdr, iImagetype), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 7, 1, 1,
|
|
offsetof(mng_dhdr, iDeltatype), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_dhdr, iBlockwidth), offsetof(mng_dhdr, bHasblocksize), MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP1,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_dhdr, iBlockheight), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP2,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_dhdr, iBlockx), offsetof(mng_dhdr, bHasblockloc), MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT | MNG_FIELD_OPTIONAL | MNG_FIELD_GROUP2,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_dhdr, iBlocky), MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
MNG_LOCAL mng_field_descriptor mng_fields_prom [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 14, 1, 1,
|
|
offsetof(mng_prom, iColortype), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 16, 1, 1,
|
|
offsetof(mng_prom, iSampledepth), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 1, 1, 1,
|
|
offsetof(mng_prom, iFilltype), MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
MNG_LOCAL mng_field_descriptor mng_fields_pplt [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 5, 1, 1,
|
|
offsetof(mng_pplt, iDeltatype), MNG_NULL, MNG_NULL},
|
|
{mng_pplt_entries,
|
|
MNG_NULL,
|
|
0, 0, 0, 0,
|
|
MNG_NULL, MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
MNG_LOCAL mng_field_descriptor mng_fields_drop [] =
|
|
{
|
|
{mng_drop_entries,
|
|
MNG_NULL,
|
|
0, 0, 0, 0,
|
|
MNG_NULL, MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
#ifndef MNG_SKIPCHUNK_DBYK
|
|
MNG_LOCAL mng_field_descriptor mng_fields_dbyk [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_dbyk, iChunkname), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 1, 1, 1,
|
|
offsetof(mng_dbyk, iPolarity), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_NULL,
|
|
0, 0, 1, 0,
|
|
offsetof(mng_dbyk, zKeywords), MNG_NULL, offsetof(mng_dbyk, iKeywordssize)}
|
|
};
|
|
#endif
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
#ifndef MNG_SKIPCHUNK_ORDR
|
|
MNG_LOCAL mng_field_descriptor mng_fields_ordr [] =
|
|
{
|
|
{mng_drop_entries,
|
|
MNG_NULL,
|
|
0, 0, 0, 0,
|
|
MNG_NULL, MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_MAGN
|
|
MNG_LOCAL mng_field_descriptor mng_fields_magn [] =
|
|
{
|
|
{mng_debunk_magn,
|
|
MNG_NULL,
|
|
0, 0, 0, 0,
|
|
MNG_NULL, MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifdef MNG_INCLUDE_MPNG_PROPOSAL
|
|
MNG_LOCAL mng_field_descriptor mng_fields_mpng [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
1, 0, 4, 4,
|
|
offsetof(mng_mpng, iFramewidth), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
1, 0, 4, 4,
|
|
offsetof(mng_mpng, iFrameheight), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0xFFFF, 2, 2,
|
|
offsetof(mng_mpng, iNumplays), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
1, 0xFFFF, 2, 2,
|
|
offsetof(mng_mpng, iTickspersec), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 1, 1,
|
|
offsetof(mng_mpng, iCompressionmethod), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_DEFLATED,
|
|
0, 0, 1, 0,
|
|
offsetof(mng_mpng, pFrames), MNG_NULL, offsetof(mng_mpng, iFramessize)}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifdef MNG_INCLUDE_ANG_PROPOSAL
|
|
MNG_LOCAL mng_field_descriptor mng_fields_ahdr [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
1, 0, 4, 4,
|
|
offsetof(mng_ahdr, iNumframes), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_ahdr, iTickspersec), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 0, 4, 4,
|
|
offsetof(mng_ahdr, iNumplays), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
1, 0, 4, 4,
|
|
offsetof(mng_ahdr, iTilewidth), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
1, 0, 4, 4,
|
|
offsetof(mng_ahdr, iTileheight), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 1, 1, 1,
|
|
offsetof(mng_ahdr, iInterlace), MNG_NULL, MNG_NULL},
|
|
{MNG_NULL,
|
|
MNG_FIELD_INT,
|
|
0, 1, 1, 1,
|
|
offsetof(mng_ahdr, iStillused), MNG_NULL, MNG_NULL}
|
|
};
|
|
|
|
MNG_LOCAL mng_field_descriptor mng_fields_adat [] =
|
|
{
|
|
{mng_adat_tiles,
|
|
MNG_NULL,
|
|
0, 0, 0, 0,
|
|
MNG_NULL, MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_evNT
|
|
MNG_LOCAL mng_field_descriptor mng_fields_evnt [] =
|
|
{
|
|
{mng_evnt_entries,
|
|
MNG_NULL,
|
|
0, 0, 0, 0,
|
|
MNG_NULL, MNG_NULL, MNG_NULL}
|
|
};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
MNG_LOCAL mng_field_descriptor mng_fields_unknown [] =
|
|
{
|
|
{MNG_NULL,
|
|
MNG_NULL,
|
|
0, 0, 1, 0,
|
|
offsetof(mng_unknown_chunk, pData), MNG_NULL, offsetof(mng_unknown_chunk, iDatasize)}
|
|
};
|
|
|
|
/* ************************************************************************** */
|
|
/* ************************************************************************** */
|
|
/* PNG chunks */
|
|
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_ihdr =
|
|
{mng_it_png, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_ihdr,
|
|
mng_fields_ihdr, (sizeof(mng_fields_ihdr) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_GLOBAL,
|
|
MNG_NULL,
|
|
MNG_DESCR_NOIHDR | MNG_DESCR_NOJHDR | MNG_DESCR_NOBASI | MNG_DESCR_NOIDAT | MNG_DESCR_NOPLTE};
|
|
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_plte =
|
|
{mng_it_png, mng_create_none, 0, offsetof(mng_plte, bEmpty),
|
|
MNG_NULL, MNG_NULL, mng_special_plte,
|
|
mng_fields_plte, (sizeof(mng_fields_plte) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_GLOBAL | MNG_DESCR_EMPTYEMBED,
|
|
MNG_DESCR_GenHDR,
|
|
MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT | MNG_DESCR_NOJDAA};
|
|
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_idat =
|
|
{mng_it_png, mng_create_none, 0, offsetof(mng_idat, bEmpty),
|
|
MNG_NULL, MNG_NULL, mng_special_idat,
|
|
mng_fields_idat, (sizeof(mng_fields_idat) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_EMPTYEMBED,
|
|
MNG_DESCR_GenHDR,
|
|
MNG_DESCR_NOJSEP};
|
|
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_iend =
|
|
{mng_it_png, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_iend,
|
|
MNG_NULL, 0,
|
|
MNG_DESCR_EMPTY | MNG_DESCR_EMPTYEMBED,
|
|
MNG_DESCR_GenHDR,
|
|
MNG_NULL};
|
|
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_trns =
|
|
{mng_it_png, mng_create_none, 0, offsetof(mng_trns, bEmpty),
|
|
MNG_NULL, MNG_NULL, mng_special_trns,
|
|
mng_fields_trns, (sizeof(mng_fields_trns) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_GLOBAL | MNG_DESCR_EMPTYEMBED,
|
|
MNG_DESCR_GenHDR,
|
|
MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT | MNG_DESCR_NOJDAA};
|
|
|
|
#ifndef MNG_SKIPCHUNK_gAMA
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_gama =
|
|
{mng_it_png, mng_create_none, 0, offsetof(mng_gama, bEmpty),
|
|
MNG_NULL, MNG_NULL, mng_special_gama,
|
|
mng_fields_gama, (sizeof(mng_fields_gama) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_GLOBAL | MNG_DESCR_EMPTYEMBED | MNG_DESCR_EMPTYGLOBAL,
|
|
MNG_DESCR_GenHDR,
|
|
MNG_DESCR_NOPLTE | MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT | MNG_DESCR_NOJDAA};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_cHRM
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_chrm =
|
|
{mng_it_png, mng_create_none, 0, offsetof(mng_chrm, bEmpty),
|
|
MNG_NULL, MNG_NULL, mng_special_chrm,
|
|
mng_fields_chrm, (sizeof(mng_fields_chrm) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_GLOBAL | MNG_DESCR_EMPTYEMBED | MNG_DESCR_EMPTYGLOBAL,
|
|
MNG_DESCR_GenHDR,
|
|
MNG_DESCR_NOPLTE | MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT | MNG_DESCR_NOJDAA};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_sRGB
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_srgb =
|
|
{mng_it_png, mng_create_none, 0, offsetof(mng_srgb, bEmpty),
|
|
MNG_NULL, MNG_NULL, mng_special_srgb,
|
|
mng_fields_srgb, (sizeof(mng_fields_srgb) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_GLOBAL | MNG_DESCR_EMPTYEMBED | MNG_DESCR_EMPTYGLOBAL,
|
|
MNG_DESCR_GenHDR,
|
|
MNG_DESCR_NOPLTE | MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT | MNG_DESCR_NOJDAA};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_iCCP
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_iccp =
|
|
{mng_it_png, mng_create_none, 0, offsetof(mng_iccp, bEmpty),
|
|
MNG_NULL, MNG_NULL, mng_special_iccp,
|
|
mng_fields_iccp, (sizeof(mng_fields_iccp) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_GLOBAL | MNG_DESCR_EMPTYEMBED | MNG_DESCR_EMPTYGLOBAL,
|
|
MNG_DESCR_GenHDR,
|
|
MNG_DESCR_NOPLTE | MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT | MNG_DESCR_NOJDAA};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_tEXt
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_text =
|
|
{mng_it_png, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_text,
|
|
mng_fields_text, (sizeof(mng_fields_text) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_GLOBAL,
|
|
MNG_DESCR_GenHDR,
|
|
MNG_NULL};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_zTXt
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_ztxt =
|
|
{mng_it_png, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_ztxt,
|
|
mng_fields_ztxt, (sizeof(mng_fields_ztxt) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_GLOBAL,
|
|
MNG_DESCR_GenHDR,
|
|
MNG_NULL};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_iTXt
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_itxt =
|
|
{mng_it_png, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_itxt,
|
|
mng_fields_itxt, (sizeof(mng_fields_itxt) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_GLOBAL,
|
|
MNG_DESCR_GenHDR,
|
|
MNG_NULL};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_bKGD
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_bkgd =
|
|
{mng_it_png, mng_create_none, 0, offsetof(mng_bkgd, bEmpty),
|
|
MNG_NULL, MNG_NULL, mng_special_bkgd,
|
|
mng_fields_bkgd, (sizeof(mng_fields_bkgd) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_GLOBAL | MNG_DESCR_EMPTYEMBED | MNG_DESCR_EMPTYGLOBAL,
|
|
MNG_DESCR_GenHDR,
|
|
MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT | MNG_DESCR_NOJDAA};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_pHYs
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_phys =
|
|
{mng_it_png, mng_create_none, 0, offsetof(mng_phys, bEmpty),
|
|
MNG_NULL, MNG_NULL, mng_special_phys,
|
|
mng_fields_phys, (sizeof(mng_fields_phys) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_GLOBAL | MNG_DESCR_EMPTYEMBED | MNG_DESCR_EMPTYGLOBAL,
|
|
MNG_DESCR_GenHDR,
|
|
MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT | MNG_DESCR_NOJDAA};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_sBIT
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_sbit =
|
|
{mng_it_png, mng_create_none, 0, offsetof(mng_sbit, bEmpty),
|
|
MNG_NULL, MNG_NULL, mng_special_sbit,
|
|
mng_fields_sbit, (sizeof(mng_fields_sbit) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_GLOBAL | MNG_DESCR_EMPTYEMBED | MNG_DESCR_EMPTYGLOBAL,
|
|
MNG_DESCR_GenHDR,
|
|
MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT | MNG_DESCR_NOJDAA};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_sPLT
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_splt =
|
|
{mng_it_png, mng_create_none, 0, offsetof(mng_splt, bEmpty),
|
|
MNG_NULL, MNG_NULL, mng_special_splt,
|
|
mng_fields_splt, (sizeof(mng_fields_splt) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_GLOBAL | MNG_DESCR_EMPTYEMBED | MNG_DESCR_EMPTYGLOBAL,
|
|
MNG_DESCR_GenHDR,
|
|
MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT | MNG_DESCR_NOJDAA};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_hIST
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_hist =
|
|
{mng_it_png, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_hist,
|
|
mng_fields_hist, (sizeof(mng_fields_hist) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_GenHDR | MNG_DESCR_PLTE,
|
|
MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT | MNG_DESCR_NOJDAA};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_tIME
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_time =
|
|
{mng_it_png, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_time,
|
|
mng_fields_time, (sizeof(mng_fields_time) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_GLOBAL,
|
|
MNG_DESCR_GenHDR,
|
|
MNG_NULL};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
/* JNG chunks */
|
|
|
|
#ifdef MNG_INCLUDE_JNG
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_jhdr =
|
|
{mng_it_jng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_jhdr,
|
|
mng_fields_jhdr, (sizeof(mng_fields_jhdr) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_NULL,
|
|
MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR};
|
|
#endif
|
|
|
|
#ifdef MNG_INCLUDE_JNG
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_jdaa =
|
|
{mng_it_jng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_jdaa,
|
|
mng_fields_jdaa, (sizeof(mng_fields_jdaa) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_JngHDR,
|
|
MNG_DESCR_NOJSEP};
|
|
#endif
|
|
|
|
#ifdef MNG_INCLUDE_JNG
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_jdat =
|
|
{mng_it_jng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_jdat,
|
|
mng_fields_jdat, (sizeof(mng_fields_jdat) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_EMPTYEMBED,
|
|
MNG_DESCR_JngHDR,
|
|
MNG_NULL};
|
|
#endif
|
|
|
|
#ifdef MNG_INCLUDE_JNG
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_jsep =
|
|
{mng_it_jng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_jsep,
|
|
MNG_NULL, 0,
|
|
MNG_DESCR_EMPTY | MNG_DESCR_EMPTYEMBED,
|
|
MNG_DESCR_JngHDR,
|
|
MNG_DESCR_NOJSEP};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
/* MNG chunks */
|
|
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_mhdr =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_mhdr,
|
|
mng_fields_mhdr, (sizeof(mng_fields_mhdr) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_NULL,
|
|
MNG_DESCR_NOMHDR | MNG_DESCR_NOIHDR | MNG_DESCR_NOJHDR};
|
|
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_mend =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_mend,
|
|
MNG_NULL, 0,
|
|
MNG_DESCR_EMPTY | MNG_DESCR_EMPTYGLOBAL,
|
|
MNG_DESCR_MHDR,
|
|
MNG_NULL};
|
|
|
|
#ifndef MNG_SKIPCHUNK_LOOP
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_loop =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_loop,
|
|
mng_fields_loop, (sizeof(mng_fields_loop) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_MHDR,
|
|
MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR};
|
|
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_endl =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_endl,
|
|
mng_fields_endl, (sizeof(mng_fields_endl) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_MHDR,
|
|
MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_DEFI
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_defi =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_defi,
|
|
mng_fields_defi, (sizeof(mng_fields_defi) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_MHDR,
|
|
MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_BASI
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_basi =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_basi,
|
|
mng_fields_basi, (sizeof(mng_fields_basi) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_MHDR,
|
|
MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_CLON
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_clon =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_clon,
|
|
mng_fields_clon, (sizeof(mng_fields_clon) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_MHDR,
|
|
MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_PAST
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_past =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_past,
|
|
mng_fields_past, (sizeof(mng_fields_past) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_MHDR,
|
|
MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_DISC
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_disc =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_disc,
|
|
mng_fields_disc, (sizeof(mng_fields_disc) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_MHDR,
|
|
MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_BACK
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_back =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_back,
|
|
mng_fields_back, (sizeof(mng_fields_back) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_MHDR,
|
|
MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_FRAM
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_fram =
|
|
{mng_it_mng, mng_create_none, 0, offsetof(mng_fram, bEmpty),
|
|
MNG_NULL, MNG_NULL, mng_special_fram,
|
|
mng_fields_fram, (sizeof(mng_fields_fram) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_EMPTY | MNG_DESCR_EMPTYGLOBAL,
|
|
MNG_DESCR_MHDR,
|
|
MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_MOVE
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_move =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_move,
|
|
mng_fields_move, (sizeof(mng_fields_move) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_MHDR,
|
|
MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_CLIP
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_clip =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_clip,
|
|
mng_fields_clip, (sizeof(mng_fields_clip) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_MHDR,
|
|
MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_SHOW
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_show =
|
|
{mng_it_mng, mng_create_none, 0, offsetof(mng_show, bEmpty),
|
|
MNG_NULL, MNG_NULL, mng_special_show,
|
|
mng_fields_show, (sizeof(mng_fields_show) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_EMPTY | MNG_DESCR_EMPTYGLOBAL,
|
|
MNG_DESCR_MHDR,
|
|
MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_TERM
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_term =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_term,
|
|
mng_fields_term, (sizeof(mng_fields_term) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_MHDR,
|
|
MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR | MNG_DESCR_NOTERM | MNG_DESCR_NOLOOP};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_SAVE
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_save =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_save,
|
|
mng_fields_save, (sizeof(mng_fields_save) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_EMPTY | MNG_DESCR_EMPTYGLOBAL,
|
|
MNG_DESCR_MHDR,
|
|
MNG_DESCR_NOSAVE | MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_SEEK
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_seek =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_seek,
|
|
mng_fields_seek, (sizeof(mng_fields_seek) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_EMPTY | MNG_DESCR_EMPTYGLOBAL,
|
|
MNG_DESCR_MHDR | MNG_DESCR_SAVE,
|
|
MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_eXPI
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_expi =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_expi,
|
|
mng_fields_expi, (sizeof(mng_fields_expi) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_MHDR,
|
|
MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_fPRI
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_fpri =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_fpri,
|
|
mng_fields_fpri, (sizeof(mng_fields_fpri) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_MHDR,
|
|
MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_nEED
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_need =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_need,
|
|
mng_fields_need, (sizeof(mng_fields_need) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_MHDR,
|
|
MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_pHYg
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_phyg =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_phyg,
|
|
mng_fields_phyg, (sizeof(mng_fields_phyg) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_MHDR,
|
|
MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR};
|
|
#endif
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_dhdr =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_dhdr,
|
|
mng_fields_dhdr, (sizeof(mng_fields_dhdr) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_MHDR,
|
|
MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR};
|
|
#endif
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_prom =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_prom,
|
|
mng_fields_prom, (sizeof(mng_fields_prom) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_MHDR | MNG_DESCR_DHDR,
|
|
MNG_NULL};
|
|
#endif
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_ipng =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_ipng,
|
|
MNG_NULL, 0,
|
|
MNG_DESCR_EMPTY | MNG_DESCR_EMPTYEMBED,
|
|
MNG_DESCR_MHDR | MNG_DESCR_DHDR,
|
|
MNG_NULL};
|
|
#endif
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_pplt =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_pplt,
|
|
mng_fields_pplt, (sizeof(mng_fields_pplt) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_MHDR | MNG_DESCR_DHDR,
|
|
MNG_NULL};
|
|
#endif
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
#ifdef MNG_INCLUDE_JNG
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_ijng =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_ijng,
|
|
MNG_NULL, 0,
|
|
MNG_DESCR_EMPTY | MNG_DESCR_EMPTYEMBED,
|
|
MNG_DESCR_MHDR | MNG_DESCR_DHDR,
|
|
MNG_NULL};
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_drop =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_drop,
|
|
mng_fields_drop, (sizeof(mng_fields_drop) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_MHDR | MNG_DESCR_DHDR,
|
|
MNG_NULL};
|
|
#endif
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
#ifndef MNG_SKIPCHUNK_DBYK
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_dbyk =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_dbyk,
|
|
mng_fields_dbyk, (sizeof(mng_fields_dbyk) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_EMPTY | MNG_DESCR_EMPTYEMBED,
|
|
MNG_DESCR_MHDR | MNG_DESCR_DHDR,
|
|
MNG_NULL};
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
#ifndef MNG_SKIPCHUNK_ORDR
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_ordr =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_ordr,
|
|
mng_fields_ordr, (sizeof(mng_fields_ordr) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_MHDR | MNG_DESCR_DHDR,
|
|
MNG_NULL};
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_MAGN
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_magn =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_magn,
|
|
mng_fields_magn, (sizeof(mng_fields_magn) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_MHDR,
|
|
MNG_DESCR_NOIHDR | MNG_DESCR_NOBASI | MNG_DESCR_NODHDR | MNG_DESCR_NOJHDR};
|
|
#endif
|
|
|
|
#ifndef MNG_SKIPCHUNK_evNT
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_evnt =
|
|
{mng_it_mng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_evnt,
|
|
mng_fields_evnt, (sizeof(mng_fields_evnt) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_MHDR,
|
|
MNG_DESCR_NOSAVE};
|
|
#endif
|
|
|
|
#ifdef MNG_INCLUDE_MPNG_PROPOSAL
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_mpng =
|
|
{mng_it_mpng, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_mpng,
|
|
mng_fields_mpng, (sizeof(mng_fields_mpng) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_NULL,
|
|
MNG_DESCR_NOMHDR | MNG_DESCR_NOIDAT | MNG_DESCR_NOJDAT};
|
|
#endif
|
|
|
|
#ifdef MNG_INCLUDE_ANG_PROPOSAL
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_ahdr =
|
|
{mng_it_ang, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_ahdr,
|
|
mng_fields_ahdr, (sizeof(mng_fields_ahdr) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_IHDR,
|
|
MNG_DESCR_NOMHDR | MNG_DESCR_NOJHDR | MNG_DESCR_NOIDAT};
|
|
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_adat =
|
|
{mng_it_ang, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_adat,
|
|
mng_fields_adat, (sizeof(mng_fields_adat) / sizeof(mng_field_descriptor)),
|
|
MNG_NULL,
|
|
MNG_DESCR_IHDR,
|
|
MNG_DESCR_NOMHDR | MNG_DESCR_NOJHDR};
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
/* ************************************************************************** */
|
|
/* the good ol' unknown babe */
|
|
|
|
MNG_LOCAL mng_chunk_descriptor mng_chunk_descr_unknown =
|
|
{mng_it_png, mng_create_none, 0, 0,
|
|
MNG_NULL, MNG_NULL, mng_special_unknown,
|
|
mng_fields_unknown, (sizeof(mng_fields_unknown) / sizeof(mng_field_descriptor)),
|
|
MNG_DESCR_EMPTY | MNG_DESCR_EMPTYEMBED,
|
|
MNG_NULL,
|
|
MNG_NULL};
|
|
|
|
/* ************************************************************************** */
|
|
/* ************************************************************************** */
|
|
|
|
MNG_LOCAL mng_chunk_header mng_chunk_unknown =
|
|
{MNG_UINT_HUH, mng_init_general, mng_free_unknown,
|
|
mng_read_general, mng_write_unknown, mng_assign_unknown,
|
|
0, 0, sizeof(mng_unknown_chunk), &mng_chunk_descr_unknown};
|
|
|
|
/* ************************************************************************** */
|
|
|
|
/* the table-idea & binary search code was adapted from
|
|
libpng 1.1.0 (pngread.c) */
|
|
/* NOTE1: the table must remain sorted by chunkname, otherwise the binary
|
|
search will break !!! (ps. watch upper-/lower-case chunknames !!) */
|
|
/* NOTE2: the layout must remain equal to the header part of all the
|
|
chunk-structures (yes, that means even the pNext and pPrev fields;
|
|
it's wasting a bit of space, but hey, the code is a lot easier) */
|
|
|
|
MNG_LOCAL mng_chunk_header mng_chunk_table [] =
|
|
{
|
|
#ifndef MNG_SKIPCHUNK_BACK
|
|
{MNG_UINT_BACK, mng_init_general, mng_free_general, mng_read_general, mng_write_back, mng_assign_general, 0, 0, sizeof(mng_back), &mng_chunk_descr_back},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_BASI
|
|
{MNG_UINT_BASI, mng_init_general, mng_free_general, mng_read_general, mng_write_basi, mng_assign_general, 0, 0, sizeof(mng_basi), &mng_chunk_descr_basi},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_CLIP
|
|
{MNG_UINT_CLIP, mng_init_general, mng_free_general, mng_read_general, mng_write_clip, mng_assign_general, 0, 0, sizeof(mng_clip), &mng_chunk_descr_clip},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_CLON
|
|
{MNG_UINT_CLON, mng_init_general, mng_free_general, mng_read_general, mng_write_clon, mng_assign_general, 0, 0, sizeof(mng_clon), &mng_chunk_descr_clon},
|
|
#endif
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
#ifndef MNG_SKIPCHUNK_DBYK
|
|
{MNG_UINT_DBYK, mng_init_general, mng_free_dbyk, mng_read_general, mng_write_dbyk, mng_assign_dbyk, 0, 0, sizeof(mng_dbyk), &mng_chunk_descr_dbyk},
|
|
#endif
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_DEFI
|
|
{MNG_UINT_DEFI, mng_init_general, mng_free_general, mng_read_general, mng_write_defi, mng_assign_general, 0, 0, sizeof(mng_defi), &mng_chunk_descr_defi},
|
|
#endif
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
{MNG_UINT_DHDR, mng_init_general, mng_free_general, mng_read_general, mng_write_dhdr, mng_assign_general, 0, 0, sizeof(mng_dhdr), &mng_chunk_descr_dhdr},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_DISC
|
|
{MNG_UINT_DISC, mng_init_general, mng_free_disc, mng_read_general, mng_write_disc, mng_assign_disc, 0, 0, sizeof(mng_disc), &mng_chunk_descr_disc},
|
|
#endif
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
#ifndef MNG_SKIPCHUNK_DROP
|
|
{MNG_UINT_DROP, mng_init_general, mng_free_drop, mng_read_general, mng_write_drop, mng_assign_drop, 0, 0, sizeof(mng_drop), &mng_chunk_descr_drop},
|
|
#endif
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_LOOP
|
|
{MNG_UINT_ENDL, mng_init_general, mng_free_general, mng_read_general, mng_write_endl, mng_assign_general, 0, 0, sizeof(mng_endl), &mng_chunk_descr_endl},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_FRAM
|
|
{MNG_UINT_FRAM, mng_init_general, mng_free_fram, mng_read_general, mng_write_fram, mng_assign_fram, 0, 0, sizeof(mng_fram), &mng_chunk_descr_fram},
|
|
#endif
|
|
{MNG_UINT_IDAT, mng_init_general, mng_free_idat, mng_read_general, mng_write_idat, mng_assign_idat, 0, 0, sizeof(mng_idat), &mng_chunk_descr_idat}, /* 12-th element! */
|
|
{MNG_UINT_IEND, mng_init_general, mng_free_general, mng_read_general, mng_write_iend, mng_assign_general, 0, 0, sizeof(mng_iend), &mng_chunk_descr_iend},
|
|
{MNG_UINT_IHDR, mng_init_general, mng_free_general, mng_read_general, mng_write_ihdr, mng_assign_general, 0, 0, sizeof(mng_ihdr), &mng_chunk_descr_ihdr},
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
#ifdef MNG_INCLUDE_JNG
|
|
{MNG_UINT_IJNG, mng_init_general, mng_free_general, mng_read_general, mng_write_ijng, mng_assign_general, 0, 0, sizeof(mng_ijng), &mng_chunk_descr_ijng},
|
|
#endif
|
|
{MNG_UINT_IPNG, mng_init_general, mng_free_general, mng_read_general, mng_write_ipng, mng_assign_general, 0, 0, sizeof(mng_ipng), &mng_chunk_descr_ipng},
|
|
#endif
|
|
#ifdef MNG_INCLUDE_JNG
|
|
{MNG_UINT_JDAA, mng_init_general, mng_free_jdaa, mng_read_general, mng_write_jdaa, mng_assign_jdaa, 0, 0, sizeof(mng_jdaa), &mng_chunk_descr_jdaa},
|
|
{MNG_UINT_JDAT, mng_init_general, mng_free_jdat, mng_read_general, mng_write_jdat, mng_assign_jdat, 0, 0, sizeof(mng_jdat), &mng_chunk_descr_jdat},
|
|
{MNG_UINT_JHDR, mng_init_general, mng_free_general, mng_read_general, mng_write_jhdr, mng_assign_general, 0, 0, sizeof(mng_jhdr), &mng_chunk_descr_jhdr},
|
|
{MNG_UINT_JSEP, mng_init_general, mng_free_general, mng_read_general, mng_write_jsep, mng_assign_general, 0, 0, sizeof(mng_jsep), &mng_chunk_descr_jsep},
|
|
{MNG_UINT_JdAA, mng_init_general, mng_free_jdaa, mng_read_general, mng_write_jdaa, mng_assign_jdaa, 0, 0, sizeof(mng_jdaa), &mng_chunk_descr_jdaa},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_LOOP
|
|
{MNG_UINT_LOOP, mng_init_general, mng_free_loop, mng_read_general, mng_write_loop, mng_assign_loop, 0, 0, sizeof(mng_loop), &mng_chunk_descr_loop},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_MAGN
|
|
{MNG_UINT_MAGN, mng_init_general, mng_free_general, mng_read_general, mng_write_magn, mng_assign_general, 0, 0, sizeof(mng_magn), &mng_chunk_descr_magn},
|
|
#endif
|
|
{MNG_UINT_MEND, mng_init_general, mng_free_general, mng_read_general, mng_write_mend, mng_assign_general, 0, 0, sizeof(mng_mend), &mng_chunk_descr_mend},
|
|
{MNG_UINT_MHDR, mng_init_general, mng_free_general, mng_read_general, mng_write_mhdr, mng_assign_general, 0, 0, sizeof(mng_mhdr), &mng_chunk_descr_mhdr},
|
|
#ifndef MNG_SKIPCHUNK_MOVE
|
|
{MNG_UINT_MOVE, mng_init_general, mng_free_general, mng_read_general, mng_write_move, mng_assign_general, 0, 0, sizeof(mng_move), &mng_chunk_descr_move},
|
|
#endif
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
#ifndef MNG_SKIPCHUNK_ORDR
|
|
{MNG_UINT_ORDR, mng_init_general, mng_free_ordr, mng_read_general, mng_write_ordr, mng_assign_ordr, 0, 0, sizeof(mng_ordr), &mng_chunk_descr_ordr},
|
|
#endif
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_PAST
|
|
{MNG_UINT_PAST, mng_init_general, mng_free_past, mng_read_general, mng_write_past, mng_assign_past, 0, 0, sizeof(mng_past), &mng_chunk_descr_past},
|
|
#endif
|
|
{MNG_UINT_PLTE, mng_init_general, mng_free_general, mng_read_general, mng_write_plte, mng_assign_general, 0, 0, sizeof(mng_plte), &mng_chunk_descr_plte},
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
{MNG_UINT_PPLT, mng_init_general, mng_free_general, mng_read_general, mng_write_pplt, mng_assign_general, 0, 0, sizeof(mng_pplt), &mng_chunk_descr_pplt},
|
|
{MNG_UINT_PROM, mng_init_general, mng_free_general, mng_read_general, mng_write_prom, mng_assign_general, 0, 0, sizeof(mng_prom), &mng_chunk_descr_prom},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_SAVE
|
|
{MNG_UINT_SAVE, mng_init_general, mng_free_save, mng_read_general, mng_write_save, mng_assign_save, 0, 0, sizeof(mng_save), &mng_chunk_descr_save},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_SEEK
|
|
{MNG_UINT_SEEK, mng_init_general, mng_free_seek, mng_read_general, mng_write_seek, mng_assign_seek, 0, 0, sizeof(mng_seek), &mng_chunk_descr_seek},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_SHOW
|
|
{MNG_UINT_SHOW, mng_init_general, mng_free_general, mng_read_general, mng_write_show, mng_assign_general, 0, 0, sizeof(mng_show), &mng_chunk_descr_show},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_TERM
|
|
{MNG_UINT_TERM, mng_init_general, mng_free_general, mng_read_general, mng_write_term, mng_assign_general, 0, 0, sizeof(mng_term), &mng_chunk_descr_term},
|
|
#endif
|
|
#ifdef MNG_INCLUDE_ANG_PROPOSAL
|
|
{MNG_UINT_adAT, mng_init_general, mng_free_adat, mng_read_general, mng_write_adat, mng_assign_adat, 0, 0, sizeof(mng_adat), &mng_chunk_descr_adat},
|
|
{MNG_UINT_ahDR, mng_init_general, mng_free_general, mng_read_general, mng_write_ahdr, mng_assign_ahdr, 0, 0, sizeof(mng_ahdr), &mng_chunk_descr_ahdr},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_bKGD
|
|
{MNG_UINT_bKGD, mng_init_general, mng_free_general, mng_read_general, mng_write_bkgd, mng_assign_general, 0, 0, sizeof(mng_bkgd), &mng_chunk_descr_bkgd},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_cHRM
|
|
{MNG_UINT_cHRM, mng_init_general, mng_free_general, mng_read_general, mng_write_chrm, mng_assign_general, 0, 0, sizeof(mng_chrm), &mng_chunk_descr_chrm},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_eXPI
|
|
{MNG_UINT_eXPI, mng_init_general, mng_free_expi, mng_read_general, mng_write_expi, mng_assign_expi, 0, 0, sizeof(mng_expi), &mng_chunk_descr_expi},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_evNT
|
|
{MNG_UINT_evNT, mng_init_general, mng_free_evnt, mng_read_general, mng_write_evnt, mng_assign_evnt, 0, 0, sizeof(mng_evnt), &mng_chunk_descr_evnt},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_fPRI
|
|
{MNG_UINT_fPRI, mng_init_general, mng_free_general, mng_read_general, mng_write_fpri, mng_assign_general, 0, 0, sizeof(mng_fpri), &mng_chunk_descr_fpri},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_gAMA
|
|
{MNG_UINT_gAMA, mng_init_general, mng_free_general, mng_read_general, mng_write_gama, mng_assign_general, 0, 0, sizeof(mng_gama), &mng_chunk_descr_gama},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_hIST
|
|
{MNG_UINT_hIST, mng_init_general, mng_free_general, mng_read_general, mng_write_hist, mng_assign_general, 0, 0, sizeof(mng_hist), &mng_chunk_descr_hist},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_iCCP
|
|
{MNG_UINT_iCCP, mng_init_general, mng_free_iccp, mng_read_general, mng_write_iccp, mng_assign_iccp, 0, 0, sizeof(mng_iccp), &mng_chunk_descr_iccp},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_iTXt
|
|
{MNG_UINT_iTXt, mng_init_general, mng_free_itxt, mng_read_general, mng_write_itxt, mng_assign_itxt, 0, 0, sizeof(mng_itxt), &mng_chunk_descr_itxt},
|
|
#endif
|
|
#ifdef MNG_INCLUDE_MPNG_PROPOSAL
|
|
{MNG_UINT_mpNG, mng_init_general, mng_free_mpng, mng_read_general, mng_write_mpng, mng_assign_mpng, 0, 0, sizeof(mng_mpng), &mng_chunk_descr_mpng},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_nEED
|
|
{MNG_UINT_nEED, mng_init_general, mng_free_need, mng_read_general, mng_write_need, mng_assign_need, 0, 0, sizeof(mng_need), &mng_chunk_descr_need},
|
|
#endif
|
|
/* TODO: {MNG_UINT_oFFs, 0, 0, 0, 0, 0, 0}, */
|
|
/* TODO: {MNG_UINT_pCAL, 0, 0, 0, 0, 0, 0}, */
|
|
#ifndef MNG_SKIPCHUNK_pHYg
|
|
{MNG_UINT_pHYg, mng_init_general, mng_free_general, mng_read_general, mng_write_phyg, mng_assign_general, 0, 0, sizeof(mng_phyg), &mng_chunk_descr_phyg},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_pHYs
|
|
{MNG_UINT_pHYs, mng_init_general, mng_free_general, mng_read_general, mng_write_phys, mng_assign_general, 0, 0, sizeof(mng_phys), &mng_chunk_descr_phys},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_sBIT
|
|
{MNG_UINT_sBIT, mng_init_general, mng_free_general, mng_read_general, mng_write_sbit, mng_assign_general, 0, 0, sizeof(mng_sbit), &mng_chunk_descr_sbit},
|
|
#endif
|
|
/* TODO: {MNG_UINT_sCAL, 0, 0, 0, 0, 0, 0}, */
|
|
#ifndef MNG_SKIPCHUNK_sPLT
|
|
{MNG_UINT_sPLT, mng_init_general, mng_free_splt, mng_read_general, mng_write_splt, mng_assign_splt, 0, 0, sizeof(mng_splt), &mng_chunk_descr_splt},
|
|
#endif
|
|
{MNG_UINT_sRGB, mng_init_general, mng_free_general, mng_read_general, mng_write_srgb, mng_assign_general, 0, 0, sizeof(mng_srgb), &mng_chunk_descr_srgb},
|
|
#ifndef MNG_SKIPCHUNK_tEXt
|
|
{MNG_UINT_tEXt, mng_init_general, mng_free_text, mng_read_general, mng_write_text, mng_assign_text, 0, 0, sizeof(mng_text), &mng_chunk_descr_text},
|
|
#endif
|
|
#ifndef MNG_SKIPCHUNK_tIME
|
|
{MNG_UINT_tIME, mng_init_general, mng_free_general, mng_read_general, mng_write_time, mng_assign_general, 0, 0, sizeof(mng_time), &mng_chunk_descr_time},
|
|
#endif
|
|
{MNG_UINT_tRNS, mng_init_general, mng_free_general, mng_read_general, mng_write_trns, mng_assign_general, 0, 0, sizeof(mng_trns), &mng_chunk_descr_trns},
|
|
#ifndef MNG_SKIPCHUNK_zTXt
|
|
{MNG_UINT_zTXt, mng_init_general, mng_free_ztxt, mng_read_general, mng_write_ztxt, mng_assign_ztxt, 0, 0, sizeof(mng_ztxt), &mng_chunk_descr_ztxt},
|
|
#endif
|
|
};
|
|
|
|
/* ************************************************************************** */
|
|
/* ************************************************************************** */
|
|
|
|
void mng_get_chunkheader (mng_chunkid iChunkname,
|
|
mng_chunk_headerp pResult)
|
|
{
|
|
/* binary search variables */
|
|
mng_int32 iTop, iLower, iUpper, iMiddle;
|
|
mng_chunk_headerp pEntry; /* pointer to found entry */
|
|
/* determine max index of table */
|
|
iTop = (sizeof (mng_chunk_table) / sizeof (mng_chunk_table [0])) - 1;
|
|
|
|
/* binary search; with 54 chunks, worst-case is 7 comparisons */
|
|
iLower = 0;
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
iMiddle = 11; /* start with the IDAT entry */
|
|
#else
|
|
iMiddle = 8;
|
|
#endif
|
|
iUpper = iTop;
|
|
pEntry = 0; /* no goods yet! */
|
|
|
|
do /* the binary search itself */
|
|
{
|
|
if (mng_chunk_table [iMiddle].iChunkname < iChunkname)
|
|
iLower = iMiddle + 1;
|
|
else if (mng_chunk_table [iMiddle].iChunkname > iChunkname)
|
|
iUpper = iMiddle - 1;
|
|
else
|
|
{
|
|
pEntry = &mng_chunk_table [iMiddle];
|
|
break;
|
|
}
|
|
iMiddle = (iLower + iUpper) >> 1;
|
|
}
|
|
while (iLower <= iUpper);
|
|
|
|
if (!pEntry) /* unknown chunk ? */
|
|
pEntry = &mng_chunk_unknown; /* make it so! */
|
|
|
|
MNG_COPY (pResult, pEntry, sizeof(mng_chunk_header));
|
|
|
|
return;
|
|
}
|
|
|
|
/* ************************************************************************** */
|
|
/* ************************************************************************** */
|
|
/* PNG chunks */
|
|
|
|
MNG_C_SPECIALFUNC (mng_special_ihdr)
|
|
{
|
|
pData->bHasIHDR = MNG_TRUE; /* indicate IHDR is present */
|
|
/* and store interesting fields */
|
|
if ((!pData->bHasDHDR) || (pData->iDeltatype == MNG_DELTATYPE_NOCHANGE))
|
|
{
|
|
pData->iDatawidth = ((mng_ihdrp)pChunk)->iWidth;
|
|
pData->iDataheight = ((mng_ihdrp)pChunk)->iHeight;
|
|
}
|
|
|
|
pData->iBitdepth = ((mng_ihdrp)pChunk)->iBitdepth;
|
|
pData->iColortype = ((mng_ihdrp)pChunk)->iColortype;
|
|
pData->iCompression = ((mng_ihdrp)pChunk)->iCompression;
|
|
pData->iFilter = ((mng_ihdrp)pChunk)->iFilter;
|
|
pData->iInterlace = ((mng_ihdrp)pChunk)->iInterlace;
|
|
|
|
#if defined(MNG_NO_1_2_4BIT_SUPPORT) || defined(MNG_NO_16BIT_SUPPORT)
|
|
pData->iPNGmult = 1;
|
|
pData->iPNGdepth = pData->iBitdepth;
|
|
#endif
|
|
|
|
#ifdef MNG_NO_1_2_4BIT_SUPPORT
|
|
if (pData->iBitdepth < 8)
|
|
pData->iBitdepth = 8;
|
|
#endif
|
|
|
|
#ifdef MNG_NO_16BIT_SUPPORT
|
|
if (pData->iBitdepth > 8)
|
|
{
|
|
pData->iBitdepth = 8;
|
|
pData->iPNGmult = 2;
|
|
}
|
|
#endif
|
|
|
|
if ((pData->iBitdepth != 8) /* parameter validity checks */
|
|
#ifndef MNG_NO_1_2_4BIT_SUPPORT
|
|
&& (pData->iBitdepth != 1) &&
|
|
(pData->iBitdepth != 2) &&
|
|
(pData->iBitdepth != 4)
|
|
#endif
|
|
#ifndef MNG_NO_16BIT_SUPPORT
|
|
&& (pData->iBitdepth != 16)
|
|
#endif
|
|
)
|
|
MNG_ERROR (pData, MNG_INVALIDBITDEPTH);
|
|
|
|
if ((pData->iColortype != MNG_COLORTYPE_GRAY ) &&
|
|
(pData->iColortype != MNG_COLORTYPE_RGB ) &&
|
|
(pData->iColortype != MNG_COLORTYPE_INDEXED) &&
|
|
(pData->iColortype != MNG_COLORTYPE_GRAYA ) &&
|
|
(pData->iColortype != MNG_COLORTYPE_RGBA ) )
|
|
MNG_ERROR (pData, MNG_INVALIDCOLORTYPE);
|
|
|
|
if ((pData->iColortype == MNG_COLORTYPE_INDEXED) && (pData->iBitdepth > 8))
|
|
MNG_ERROR (pData, MNG_INVALIDBITDEPTH);
|
|
|
|
if (((pData->iColortype == MNG_COLORTYPE_RGB ) ||
|
|
(pData->iColortype == MNG_COLORTYPE_GRAYA ) ||
|
|
(pData->iColortype == MNG_COLORTYPE_RGBA ) ) &&
|
|
(pData->iBitdepth < 8 ) )
|
|
MNG_ERROR (pData, MNG_INVALIDBITDEPTH);
|
|
|
|
if (pData->iCompression != MNG_COMPRESSION_DEFLATE)
|
|
MNG_ERROR (pData, MNG_INVALIDCOMPRESS);
|
|
|
|
#if defined(FILTER192) || defined(FILTER193)
|
|
if ((pData->iFilter != MNG_FILTER_ADAPTIVE ) &&
|
|
#if defined(FILTER192) && defined(FILTER193)
|
|
(pData->iFilter != MNG_FILTER_DIFFERING) &&
|
|
(pData->iFilter != MNG_FILTER_NOFILTER ) )
|
|
#else
|
|
#ifdef FILTER192
|
|
(pData->iFilter != MNG_FILTER_DIFFERING) )
|
|
#else
|
|
(pData->iFilter != MNG_FILTER_NOFILTER ) )
|
|
#endif
|
|
#endif
|
|
MNG_ERROR (pData, MNG_INVALIDFILTER);
|
|
#else
|
|
if (pData->iFilter)
|
|
MNG_ERROR (pData, MNG_INVALIDFILTER);
|
|
#endif
|
|
|
|
if ((pData->iInterlace != MNG_INTERLACE_NONE ) &&
|
|
(pData->iInterlace != MNG_INTERLACE_ADAM7) )
|
|
MNG_ERROR (pData, MNG_INVALIDINTERLACE);
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
if (pData->bHasDHDR) /* check the colortype for delta-images ! */
|
|
{
|
|
mng_imagedatap pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf;
|
|
|
|
if (pData->iColortype != pBuf->iColortype)
|
|
{
|
|
if ( ( (pData->iColortype != MNG_COLORTYPE_INDEXED) ||
|
|
(pBuf->iColortype == MNG_COLORTYPE_GRAY ) ) &&
|
|
( (pData->iColortype != MNG_COLORTYPE_GRAY ) ||
|
|
(pBuf->iColortype == MNG_COLORTYPE_INDEXED) ) )
|
|
MNG_ERROR (pData, MNG_INVALIDCOLORTYPE);
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
if (!pData->bHasheader) /* first chunk ? */
|
|
{
|
|
pData->bHasheader = MNG_TRUE; /* we've got a header */
|
|
pData->eImagetype = mng_it_png; /* then this must be a PNG */
|
|
pData->iWidth = pData->iDatawidth;
|
|
pData->iHeight = pData->iDataheight;
|
|
/* predict alpha-depth ! */
|
|
if ((pData->iColortype == MNG_COLORTYPE_GRAYA ) ||
|
|
(pData->iColortype == MNG_COLORTYPE_RGBA ) )
|
|
pData->iAlphadepth = pData->iBitdepth;
|
|
else
|
|
if (pData->iColortype == MNG_COLORTYPE_INDEXED)
|
|
pData->iAlphadepth = 8; /* worst case scenario */
|
|
else
|
|
pData->iAlphadepth = 1; /* Possible tRNS cheap binary transparency */
|
|
/* fits on maximum canvas ? */
|
|
if ((pData->iWidth > pData->iMaxwidth) || (pData->iHeight > pData->iMaxheight))
|
|
MNG_WARNING (pData, MNG_IMAGETOOLARGE);
|
|
|
|
#if !defined(MNG_INCLUDE_MPNG_PROPOSAL) || !defined(MNG_SUPPORT_DISPLAY)
|
|
if (pData->fProcessheader) /* inform the app ? */
|
|
if (!pData->fProcessheader (((mng_handle)pData), pData->iWidth, pData->iHeight))
|
|
MNG_ERROR (pData, MNG_APPMISCERROR);
|
|
#endif
|
|
}
|
|
|
|
if (!pData->bHasDHDR)
|
|
pData->iImagelevel++; /* one level deeper */
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
return mng_process_display_ihdr (pData);
|
|
#else
|
|
return MNG_NOERROR;
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
}
|
|
|
|
/* ************************************************************************** */
|
|
|
|
MNG_F_SPECIALFUNC (mng_debunk_plte)
|
|
{
|
|
mng_pltep pPLTE = (mng_pltep)pChunk;
|
|
mng_uint32 iRawlen = *piRawlen;
|
|
mng_uint8p pRawdata = *ppRawdata;
|
|
/* length must be multiple of 3 */
|
|
if (((iRawlen % 3) != 0) || (iRawlen > 768))
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
/* this is the exact length */
|
|
pPLTE->iEntrycount = iRawlen / 3;
|
|
|
|
MNG_COPY (pPLTE->aEntries, pRawdata, iRawlen);
|
|
|
|
*piRawlen = 0;
|
|
|
|
return MNG_NOERROR;
|
|
}
|
|
|
|
/* ************************************************************************** */
|
|
|
|
MNG_C_SPECIALFUNC (mng_special_plte)
|
|
{ /* multiple PLTE only inside BASI */
|
|
if ((pData->bHasPLTE) && (!pData->bHasBASI))
|
|
MNG_ERROR (pData, MNG_MULTIPLEERROR);
|
|
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
|
|
{ /* only allowed for indexed-color or
|
|
rgb(a)-color! */
|
|
if ((pData->iColortype != MNG_COLORTYPE_RGB ) &&
|
|
(pData->iColortype != MNG_COLORTYPE_INDEXED) &&
|
|
(pData->iColortype != MNG_COLORTYPE_RGBA ) )
|
|
MNG_ERROR (pData, MNG_CHUNKNOTALLOWED);
|
|
/* empty only allowed if global present */
|
|
if ((((mng_pltep)pChunk)->bEmpty) && (!pData->bHasglobalPLTE))
|
|
MNG_ERROR (pData, MNG_CANNOTBEEMPTY);
|
|
}
|
|
else
|
|
{
|
|
if (((mng_pltep)pChunk)->bEmpty) /* cannot be empty as global! */
|
|
MNG_ERROR (pData, MNG_CANNOTBEEMPTY);
|
|
}
|
|
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
|
|
pData->bHasPLTE = MNG_TRUE; /* got it! */
|
|
else
|
|
pData->bHasglobalPLTE = MNG_TRUE;
|
|
|
|
pData->iPLTEcount = ((mng_pltep)pChunk)->iEntrycount;
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
|
|
{
|
|
mng_imagep pImage;
|
|
mng_imagedatap pBuf;
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
if (pData->bHasDHDR) /* processing delta-image ? */
|
|
{ /* store in object 0 !!! */
|
|
pImage = (mng_imagep)pData->pObjzero;
|
|
pBuf = pImage->pImgbuf;
|
|
pBuf->bHasPLTE = MNG_TRUE; /* it's definitely got a PLTE now */
|
|
pBuf->iPLTEcount = ((mng_pltep)pChunk)->iEntrycount;
|
|
MNG_COPY (pBuf->aPLTEentries, ((mng_pltep)pChunk)->aEntries,
|
|
sizeof (pBuf->aPLTEentries));
|
|
}
|
|
else
|
|
#endif
|
|
{ /* get the current object */
|
|
pImage = (mng_imagep)pData->pCurrentobj;
|
|
if (!pImage) /* no object then dump it in obj 0 */
|
|
pImage = (mng_imagep)pData->pObjzero;
|
|
|
|
pBuf = pImage->pImgbuf; /* address the object buffer */
|
|
pBuf->bHasPLTE = MNG_TRUE; /* and tell it it's got a PLTE now */
|
|
|
|
if (((mng_pltep)pChunk)->bEmpty) /* if empty, inherit from global */
|
|
{
|
|
pBuf->iPLTEcount = pData->iGlobalPLTEcount;
|
|
MNG_COPY (pBuf->aPLTEentries, pData->aGlobalPLTEentries,
|
|
sizeof (pBuf->aPLTEentries));
|
|
|
|
if (pData->bHasglobalTRNS) /* also copy global tRNS ? */
|
|
{
|
|
mng_uint32 iRawlen2 = pData->iGlobalTRNSrawlen;
|
|
mng_uint8p pRawdata2 = (mng_uint8p)(pData->aGlobalTRNSrawdata);
|
|
/* indicate tRNS available */
|
|
pBuf->bHasTRNS = MNG_TRUE;
|
|
/* global length oke ? */
|
|
if ((iRawlen2 == 0) || (iRawlen2 > pBuf->iPLTEcount))
|
|
MNG_ERROR (pData, MNG_GLOBALLENGTHERR);
|
|
/* copy it */
|
|
pBuf->iTRNScount = iRawlen2;
|
|
MNG_COPY (pBuf->aTRNSentries, pRawdata2, iRawlen2);
|
|
}
|
|
}
|
|
else
|
|
{ /* store fields for future reference */
|
|
pBuf->iPLTEcount = ((mng_pltep)pChunk)->iEntrycount;
|
|
MNG_COPY (pBuf->aPLTEentries, ((mng_pltep)pChunk)->aEntries,
|
|
sizeof (pBuf->aPLTEentries));
|
|
}
|
|
}
|
|
}
|
|
else /* store as global */
|
|
{
|
|
pData->iGlobalPLTEcount = ((mng_pltep)pChunk)->iEntrycount;
|
|
MNG_COPY (pData->aGlobalPLTEentries, ((mng_pltep)pChunk)->aEntries,
|
|
sizeof (pData->aGlobalPLTEentries));
|
|
/* create an animation object */
|
|
return mng_create_ani_plte (pData);
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
|
|
/* ************************************************************************** */
|
|
|
|
MNG_C_SPECIALFUNC (mng_special_idat)
|
|
{
|
|
#ifdef MNG_INCLUDE_JNG
|
|
if ((pData->bHasJHDR) &&
|
|
(pData->iJHDRalphacompression != MNG_COMPRESSION_DEFLATE))
|
|
MNG_ERROR (pData, MNG_SEQUENCEERROR);
|
|
#endif
|
|
/* not allowed for deltatype NO_CHANGE */
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
if ((pData->bHasDHDR) && ((pData->iDeltatype == MNG_DELTATYPE_NOCHANGE)))
|
|
MNG_ERROR (pData, MNG_CHUNKNOTALLOWED);
|
|
#endif
|
|
/* can only be empty in BASI-block! */
|
|
if ((((mng_idatp)pChunk)->bEmpty) && (!pData->bHasBASI))
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
/* indexed-color requires PLTE */
|
|
if ((pData->bHasIHDR) && (pData->iColortype == 3) && (!pData->bHasPLTE))
|
|
MNG_ERROR (pData, MNG_PLTEMISSING);
|
|
|
|
pData->bHasIDAT = MNG_TRUE; /* got some IDAT now, don't we */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
|
|
/* ************************************************************************** */
|
|
|
|
MNG_C_SPECIALFUNC (mng_special_iend)
|
|
{ /* IHDR-block requires IDAT */
|
|
if ((pData->bHasIHDR) && (!pData->bHasIDAT))
|
|
MNG_ERROR (pData, MNG_IDATMISSING);
|
|
|
|
pData->iImagelevel--; /* one level up */
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
{ /* create an animation object */
|
|
mng_retcode iRetcode = mng_create_ani_image (pData);
|
|
if (iRetcode) /* on error bail out */
|
|
return iRetcode;
|
|
/* display processing */
|
|
iRetcode = mng_process_display_iend (pData);
|
|
if (iRetcode) /* on error bail out */
|
|
return iRetcode;
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
if (!pData->bTimerset) /* reset only if not broken !!! */
|
|
{
|
|
#endif
|
|
/* IEND signals the end for most ... */
|
|
pData->bHasIHDR = MNG_FALSE;
|
|
pData->bHasBASI = MNG_FALSE;
|
|
pData->bHasDHDR = MNG_FALSE;
|
|
#ifdef MNG_INCLUDE_JNG
|
|
pData->bHasJHDR = MNG_FALSE;
|
|
pData->bHasJSEP = MNG_FALSE;
|
|
pData->bHasJDAA = MNG_FALSE;
|
|
pData->bHasJDAT = MNG_FALSE;
|
|
#endif
|
|
pData->bHasPLTE = MNG_FALSE;
|
|
pData->bHasTRNS = MNG_FALSE;
|
|
pData->bHasGAMA = MNG_FALSE;
|
|
pData->bHasCHRM = MNG_FALSE;
|
|
pData->bHasSRGB = MNG_FALSE;
|
|
pData->bHasICCP = MNG_FALSE;
|
|
pData->bHasBKGD = MNG_FALSE;
|
|
pData->bHasIDAT = MNG_FALSE;
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
}
|
|
#endif
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
|
|
/* ************************************************************************** */
|
|
|
|
MNG_F_SPECIALFUNC (mng_debunk_trns)
|
|
{
|
|
mng_trnsp pTRNS = (mng_trnsp)pChunk;
|
|
mng_uint32 iRawlen = *piRawlen;
|
|
mng_uint8p pRawdata = *ppRawdata;
|
|
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
|
|
{ /* not global! */
|
|
pTRNS->bGlobal = MNG_FALSE;
|
|
pTRNS->iType = pData->iColortype;
|
|
|
|
if (iRawlen != 0)
|
|
{
|
|
switch (pData->iColortype) /* store fields */
|
|
{
|
|
case 0: { /* gray */
|
|
if (iRawlen != 2)
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
pTRNS->iGray = mng_get_uint16 (pRawdata);
|
|
break;
|
|
}
|
|
case 2: { /* rgb */
|
|
if (iRawlen != 6)
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
pTRNS->iRed = mng_get_uint16 (pRawdata);
|
|
pTRNS->iGreen = mng_get_uint16 (pRawdata+2);
|
|
pTRNS->iBlue = mng_get_uint16 (pRawdata+4);
|
|
break;
|
|
}
|
|
case 3: { /* indexed */
|
|
if (iRawlen > 256)
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
pTRNS->iCount = iRawlen;
|
|
MNG_COPY (pTRNS->aEntries, pRawdata, iRawlen);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else /* it's global! */
|
|
{
|
|
if (iRawlen == 0)
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
pTRNS->bGlobal = MNG_TRUE;
|
|
pTRNS->iType = 0;
|
|
pTRNS->iRawlen = iRawlen;
|
|
MNG_COPY (pTRNS->aRawdata, pRawdata, iRawlen);
|
|
|
|
pData->iGlobalTRNSrawlen = iRawlen;
|
|
MNG_COPY (pData->aGlobalTRNSrawdata, pRawdata, iRawlen);
|
|
}
|
|
|
|
*piRawlen = 0;
|
|
|
|
return MNG_NOERROR;
|
|
}
|
|
|
|
/* ************************************************************************** */
|
|
|
|
MNG_C_SPECIALFUNC (mng_special_trns)
|
|
{ /* multiple tRNS only inside BASI */
|
|
if ((pData->bHasTRNS) && (!pData->bHasBASI))
|
|
MNG_ERROR (pData, MNG_MULTIPLEERROR);
|
|
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
|
|
{ /* not allowed with full alpha-channel */
|
|
if ((pData->iColortype == 4) || (pData->iColortype == 6))
|
|
MNG_ERROR (pData, MNG_CHUNKNOTALLOWED);
|
|
|
|
if (!((mng_trnsp)pChunk)->bEmpty) /* filled ? */
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
if (pData->iColortype == 3)
|
|
{
|
|
mng_imagep pImage = (mng_imagep)pData->pCurrentobj;
|
|
mng_imagedatap pBuf;
|
|
|
|
if (!pImage) /* no object then check obj 0 */
|
|
pImage = (mng_imagep)pData->pObjzero;
|
|
|
|
pBuf = pImage->pImgbuf; /* address object buffer */
|
|
|
|
if (((mng_trnsp)pChunk)->iCount > pBuf->iPLTEcount)
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
}
|
|
#endif
|
|
}
|
|
else /* if empty there must be global stuff! */
|
|
{
|
|
if (!pData->bHasglobalTRNS)
|
|
MNG_ERROR (pData, MNG_CANNOTBEEMPTY);
|
|
}
|
|
}
|
|
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
|
|
pData->bHasTRNS = MNG_TRUE; /* indicate tRNS available */
|
|
else
|
|
pData->bHasglobalTRNS = MNG_TRUE;
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
|
|
{
|
|
mng_imagep pImage;
|
|
mng_imagedatap pBuf;
|
|
mng_uint8p pRawdata2;
|
|
mng_uint32 iRawlen2;
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
if (pData->bHasDHDR) /* processing delta-image ? */
|
|
{ /* store in object 0 !!! */
|
|
#if defined(MNG_NO_1_2_4BIT_SUPPORT)
|
|
mng_uint8 multiplier[]={0,255,85,0,17,0,0,0,1,0,0,0,0,0,0,0,1};
|
|
#endif
|
|
pImage = (mng_imagep)pData->pObjzero;
|
|
pBuf = pImage->pImgbuf; /* address object buffer */
|
|
pBuf->bHasTRNS = MNG_TRUE; /* tell it it's got a tRNS now */
|
|
pBuf->iTRNSgray = 0;
|
|
pBuf->iTRNSred = 0;
|
|
pBuf->iTRNSgreen = 0;
|
|
pBuf->iTRNSblue = 0;
|
|
pBuf->iTRNScount = 0;
|
|
|
|
switch (pData->iColortype) /* store fields for future reference */
|
|
{
|
|
case 0: { /* gray */
|
|
pBuf->iTRNSgray = ((mng_trnsp)pChunk)->iGray;
|
|
#if defined(MNG_NO_1_2_4BIT_SUPPORT)
|
|
pBuf->iTRNSgray *= multiplier[pData->iPNGdepth];
|
|
#endif
|
|
#if defined(MNG_NO_16BIT_SUPPORT)
|
|
if (pData->iPNGmult == 2)
|
|
pBuf->iTRNSgray >>= 8;
|
|
#endif
|
|
break;
|
|
}
|
|
case 2: { /* rgb */
|
|
pBuf->iTRNSred = ((mng_trnsp)pChunk)->iRed;
|
|
pBuf->iTRNSgreen = ((mng_trnsp)pChunk)->iGreen;
|
|
pBuf->iTRNSblue = ((mng_trnsp)pChunk)->iBlue;
|
|
#if defined(MNG_NO_16BIT_SUPPORT)
|
|
if (pData->iPNGmult == 2)
|
|
{
|
|
pBuf->iTRNSred >>= 8;
|
|
pBuf->iTRNSgreen >>= 8;
|
|
pBuf->iTRNSblue >>= 8;
|
|
}
|
|
#endif
|
|
break;
|
|
}
|
|
case 3: { /* indexed */
|
|
pBuf->iTRNScount = ((mng_trnsp)pChunk)->iCount;
|
|
MNG_COPY (pBuf->aTRNSentries,
|
|
((mng_trnsp)pChunk)->aEntries,
|
|
((mng_trnsp)pChunk)->iCount);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
#endif
|
|
{ /* address current object */
|
|
pImage = (mng_imagep)pData->pCurrentobj;
|
|
|
|
if (!pImage) /* no object then dump it in obj 0 */
|
|
pImage = (mng_imagep)pData->pObjzero;
|
|
|
|
pBuf = pImage->pImgbuf; /* address object buffer */
|
|
pBuf->bHasTRNS = MNG_TRUE; /* and tell it it's got a tRNS now */
|
|
pBuf->iTRNSgray = 0;
|
|
pBuf->iTRNSred = 0;
|
|
pBuf->iTRNSgreen = 0;
|
|
pBuf->iTRNSblue = 0;
|
|
pBuf->iTRNScount = 0;
|
|
|
|
if (((mng_trnsp)pChunk)->bEmpty) /* if empty, inherit from global */
|
|
{
|
|
iRawlen2 = pData->iGlobalTRNSrawlen;
|
|
pRawdata2 = (mng_ptr)(pData->aGlobalTRNSrawdata);
|
|
/* global length oke ? */
|
|
if ((pData->iColortype == 0) && (iRawlen2 != 2))
|
|
MNG_ERROR (pData, MNG_GLOBALLENGTHERR);
|
|
|
|
if ((pData->iColortype == 2) && (iRawlen2 != 6))
|
|
MNG_ERROR (pData, MNG_GLOBALLENGTHERR);
|
|
|
|
if ((pData->iColortype == 3) && ((iRawlen2 == 0) || (iRawlen2 > pBuf->iPLTEcount)))
|
|
MNG_ERROR (pData, MNG_GLOBALLENGTHERR);
|
|
|
|
switch (pData->iColortype) /* store fields for future reference */
|
|
{
|
|
case 0: { /* gray */
|
|
pBuf->iTRNSgray = mng_get_uint16 (pRawdata2);
|
|
#if defined(MNG_NO_16BIT_SUPPORT)
|
|
if (pData->iPNGmult == 2)
|
|
pBuf->iTRNSgray >>= 8;
|
|
#endif
|
|
break;
|
|
}
|
|
case 2: { /* rgb */
|
|
pBuf->iTRNSred = mng_get_uint16 (pRawdata2);
|
|
pBuf->iTRNSgreen = mng_get_uint16 (pRawdata2+2);
|
|
pBuf->iTRNSblue = mng_get_uint16 (pRawdata2+4);
|
|
#if defined(MNG_NO_16BIT_SUPPORT)
|
|
if (pData->iPNGmult == 2)
|
|
{
|
|
pBuf->iTRNSred >>= 8;
|
|
pBuf->iTRNSgreen >>= 8;
|
|
pBuf->iTRNSblue >>= 8;
|
|
}
|
|
#endif
|
|
break;
|
|
}
|
|
case 3: { /* indexed */
|
|
pBuf->iTRNScount = iRawlen2;
|
|
MNG_COPY (pBuf->aTRNSentries, pRawdata2, iRawlen2);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch (pData->iColortype) /* store fields for future reference */
|
|
{
|
|
case 0: { /* gray */
|
|
pBuf->iTRNSgray = ((mng_trnsp)pChunk)->iGray;
|
|
#if defined(MNG_NO_16BIT_SUPPORT)
|
|
if (pData->iPNGmult == 2)
|
|
pBuf->iTRNSgray >>= 8;
|
|
#endif
|
|
break;
|
|
}
|
|
case 2: { /* rgb */
|
|
pBuf->iTRNSred = ((mng_trnsp)pChunk)->iRed;
|
|
pBuf->iTRNSgreen = ((mng_trnsp)pChunk)->iGreen;
|
|
pBuf->iTRNSblue = ((mng_trnsp)pChunk)->iBlue;
|
|
#if defined(MNG_NO_16BIT_SUPPORT)
|
|
if (pData->iPNGmult == 2)
|
|
{
|
|
pBuf->iTRNSred >>= 8;
|
|
pBuf->iTRNSgreen >>= 8;
|
|
pBuf->iTRNSblue >>= 8;
|
|
}
|
|
#endif
|
|
break;
|
|
}
|
|
case 3: { /* indexed */
|
|
pBuf->iTRNScount = ((mng_trnsp)pChunk)->iCount;
|
|
MNG_COPY (pBuf->aTRNSentries,
|
|
((mng_trnsp)pChunk)->aEntries,
|
|
((mng_trnsp)pChunk)->iCount);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{ /* create an animation object */
|
|
return mng_create_ani_trns (pData);
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
|
|
/* ************************************************************************** */
|
|
|
|
MNG_C_SPECIALFUNC (mng_special_gama)
|
|
{
|
|
#ifdef MNG_INCLUDE_JNG
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
|
|
#else
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
|
|
#endif
|
|
pData->bHasGAMA = MNG_TRUE; /* indicate we've got it */
|
|
else
|
|
pData->bHasglobalGAMA = (mng_bool)!((mng_gamap)pChunk)->bEmpty;
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
#ifdef MNG_INCLUDE_JNG
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
|
|
#else
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
|
|
#endif
|
|
{
|
|
mng_imagep pImage;
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
if (pData->bHasDHDR) /* update delta image ? */
|
|
pImage = (mng_imagep)pData->pObjzero;
|
|
else
|
|
#endif
|
|
{
|
|
pImage = (mng_imagep)pData->pCurrentobj;
|
|
if (!pImage) /* no object then dump it in obj 0 */
|
|
pImage = (mng_imagep)pData->pObjzero;
|
|
}
|
|
/* store for color-processing routines */
|
|
pImage->pImgbuf->iGamma = ((mng_gamap)pChunk)->iGamma;
|
|
pImage->pImgbuf->bHasGAMA = MNG_TRUE;
|
|
}
|
|
else
|
|
{ /* store as global */
|
|
if (!((mng_gamap)pChunk)->bEmpty)
|
|
pData->iGlobalGamma = ((mng_gamap)pChunk)->iGamma;
|
|
/* create an animation object */
|
|
return mng_create_ani_gama (pData, pChunk);
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_cHRM
|
|
MNG_C_SPECIALFUNC (mng_special_chrm)
|
|
{
|
|
#ifdef MNG_INCLUDE_JNG
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
|
|
#else
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
|
|
#endif
|
|
pData->bHasCHRM = MNG_TRUE; /* indicate we've got it */
|
|
else
|
|
pData->bHasglobalCHRM = (mng_bool)!((mng_chrmp)pChunk)->bEmpty;
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
{
|
|
#ifdef MNG_INCLUDE_JNG
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
|
|
#else
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
|
|
#endif
|
|
{
|
|
mng_imagep pImage;
|
|
mng_imagedatap pBuf;
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
if (pData->bHasDHDR) /* update delta image ? */
|
|
pImage = (mng_imagep)pData->pObjzero;
|
|
else
|
|
#endif
|
|
{
|
|
pImage = (mng_imagep)pData->pCurrentobj;
|
|
if (!pImage) /* no object then dump it in obj 0 */
|
|
pImage = (mng_imagep)pData->pObjzero;
|
|
}
|
|
|
|
pBuf = pImage->pImgbuf; /* address object buffer */
|
|
pBuf->bHasCHRM = MNG_TRUE; /* and tell it it's got a CHRM now */
|
|
/* store for color-processing routines */
|
|
pBuf->iWhitepointx = ((mng_chrmp)pChunk)->iWhitepointx;
|
|
pBuf->iWhitepointy = ((mng_chrmp)pChunk)->iWhitepointy;
|
|
pBuf->iPrimaryredx = ((mng_chrmp)pChunk)->iRedx;
|
|
pBuf->iPrimaryredy = ((mng_chrmp)pChunk)->iRedy;
|
|
pBuf->iPrimarygreenx = ((mng_chrmp)pChunk)->iGreenx;
|
|
pBuf->iPrimarygreeny = ((mng_chrmp)pChunk)->iGreeny;
|
|
pBuf->iPrimarybluex = ((mng_chrmp)pChunk)->iBluex;
|
|
pBuf->iPrimarybluey = ((mng_chrmp)pChunk)->iBluey;
|
|
}
|
|
else
|
|
{ /* store as global */
|
|
if (!((mng_chrmp)pChunk)->bEmpty)
|
|
{
|
|
pData->iGlobalWhitepointx = ((mng_chrmp)pChunk)->iWhitepointx;
|
|
pData->iGlobalWhitepointy = ((mng_chrmp)pChunk)->iWhitepointy;
|
|
pData->iGlobalPrimaryredx = ((mng_chrmp)pChunk)->iRedx;
|
|
pData->iGlobalPrimaryredy = ((mng_chrmp)pChunk)->iRedy;
|
|
pData->iGlobalPrimarygreenx = ((mng_chrmp)pChunk)->iGreenx;
|
|
pData->iGlobalPrimarygreeny = ((mng_chrmp)pChunk)->iGreeny;
|
|
pData->iGlobalPrimarybluex = ((mng_chrmp)pChunk)->iBluex;
|
|
pData->iGlobalPrimarybluey = ((mng_chrmp)pChunk)->iBluey;
|
|
}
|
|
/* create an animation object */
|
|
return mng_create_ani_chrm (pData, pChunk);
|
|
}
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
MNG_C_SPECIALFUNC (mng_special_srgb)
|
|
{
|
|
#ifdef MNG_INCLUDE_JNG
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
|
|
#else
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
|
|
#endif
|
|
pData->bHasSRGB = MNG_TRUE; /* indicate we've got it */
|
|
else
|
|
pData->bHasglobalSRGB = (mng_bool)!((mng_srgbp)pChunk)->bEmpty;
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
#ifdef MNG_INCLUDE_JNG
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
|
|
#else
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
|
|
#endif
|
|
{
|
|
mng_imagep pImage;
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
if (pData->bHasDHDR) /* update delta image ? */
|
|
pImage = (mng_imagep)pData->pObjzero;
|
|
else
|
|
#endif
|
|
{
|
|
pImage = (mng_imagep)pData->pCurrentobj;
|
|
if (!pImage) /* no object then dump it in obj 0 */
|
|
pImage = (mng_imagep)pData->pObjzero;
|
|
}
|
|
/* store for color-processing routines */
|
|
pImage->pImgbuf->iRenderingintent = ((mng_srgbp)pChunk)->iRenderingintent;
|
|
pImage->pImgbuf->bHasSRGB = MNG_TRUE;
|
|
}
|
|
else
|
|
{ /* store as global */
|
|
if (!((mng_srgbp)pChunk)->bEmpty)
|
|
pData->iGlobalRendintent = ((mng_srgbp)pChunk)->iRenderingintent;
|
|
/* create an animation object */
|
|
return mng_create_ani_srgb (pData, pChunk);
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_iCCP
|
|
MNG_C_SPECIALFUNC (mng_special_iccp)
|
|
{
|
|
mng_retcode iRetcode;
|
|
mng_chunk_headerp pDummy;
|
|
|
|
#ifdef MNG_CHECK_BAD_ICCP /* Check for bad iCCP chunk */
|
|
if (!strncmp (((mng_iccpp)pChunk)->zName, "Photoshop ICC profile", 21))
|
|
{
|
|
if (((mng_iccpp)pChunk)->iProfilesize == 2615) /* is it the sRGB profile ? */
|
|
{
|
|
mng_chunk_header chunk_srgb;
|
|
mng_get_chunkheader (MNG_UINT_sRGB, &chunk_srgb);
|
|
/* pretend it's an sRGB chunk then ! */
|
|
iRetcode = mng_read_general (pData, &chunk_srgb, 1, (mng_ptr)"0", &pDummy);
|
|
if (iRetcode) /* on error bail out */
|
|
return iRetcode;
|
|
|
|
pDummy->fCleanup (pData, pDummy);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
#endif /* MNG_CHECK_BAD_ICCP */
|
|
|
|
#ifdef MNG_INCLUDE_JNG
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
|
|
#else
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
|
|
#endif
|
|
pData->bHasICCP = MNG_TRUE; /* indicate we've got it */
|
|
else
|
|
pData->bHasglobalICCP = (mng_bool)!((mng_iccpp)pChunk)->bEmpty;
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
#ifdef MNG_INCLUDE_JNG
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
|
|
#else
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
|
|
#endif
|
|
{
|
|
mng_imagep pImage;
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
if (pData->bHasDHDR) /* update delta image ? */
|
|
{ /* store in object 0 ! */
|
|
pImage = (mng_imagep)pData->pObjzero;
|
|
|
|
if (pImage->pImgbuf->pProfile) /* profile existed ? */
|
|
MNG_FREEX (pData, pImage->pImgbuf->pProfile, pImage->pImgbuf->iProfilesize);
|
|
/* allocate a buffer & copy it */
|
|
MNG_ALLOC (pData, pImage->pImgbuf->pProfile, ((mng_iccpp)pChunk)->iProfilesize);
|
|
MNG_COPY (pImage->pImgbuf->pProfile, ((mng_iccpp)pChunk)->pProfile, ((mng_iccpp)pChunk)->iProfilesize);
|
|
/* store its length as well */
|
|
pImage->pImgbuf->iProfilesize = ((mng_iccpp)pChunk)->iProfilesize;
|
|
pImage->pImgbuf->bHasICCP = MNG_TRUE;
|
|
}
|
|
else
|
|
#endif
|
|
{
|
|
pImage = (mng_imagep)pData->pCurrentobj;
|
|
|
|
if (!pImage) /* no object then dump it in obj 0 */
|
|
pImage = (mng_imagep)pData->pObjzero;
|
|
|
|
if (pImage->pImgbuf->pProfile) /* profile existed ? */
|
|
MNG_FREEX (pData, pImage->pImgbuf->pProfile, pImage->pImgbuf->iProfilesize);
|
|
/* allocate a buffer & copy it */
|
|
MNG_ALLOC (pData, pImage->pImgbuf->pProfile, ((mng_iccpp)pChunk)->iProfilesize);
|
|
MNG_COPY (pImage->pImgbuf->pProfile, ((mng_iccpp)pChunk)->pProfile, ((mng_iccpp)pChunk)->iProfilesize);
|
|
/* store its length as well */
|
|
pImage->pImgbuf->iProfilesize = ((mng_iccpp)pChunk)->iProfilesize;
|
|
pImage->pImgbuf->bHasICCP = MNG_TRUE;
|
|
}
|
|
}
|
|
else
|
|
{ /* store as global */
|
|
if (pData->pGlobalProfile) /* did we have a global profile ? */
|
|
MNG_FREEX (pData, pData->pGlobalProfile, pData->iGlobalProfilesize);
|
|
|
|
if (((mng_iccpp)pChunk)->bEmpty) /* empty chunk ? */
|
|
{
|
|
pData->iGlobalProfilesize = 0; /* reset to null */
|
|
pData->pGlobalProfile = MNG_NULL;
|
|
}
|
|
else
|
|
{ /* allocate a global buffer & copy it */
|
|
MNG_ALLOC (pData, pData->pGlobalProfile, ((mng_iccpp)pChunk)->iProfilesize);
|
|
MNG_COPY (pData->pGlobalProfile, ((mng_iccpp)pChunk)->pProfile, ((mng_iccpp)pChunk)->iProfilesize);
|
|
/* store its length as well */
|
|
pData->iGlobalProfilesize = ((mng_iccpp)pChunk)->iProfilesize;
|
|
}
|
|
/* create an animation object */
|
|
return mng_create_ani_iccp (pData, pChunk);
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
#ifdef MNG_CHECK_BAD_ICCP
|
|
}
|
|
#endif
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_tEXt
|
|
MNG_C_SPECIALFUNC (mng_special_text)
|
|
{
|
|
if (pData->fProcesstext) /* inform the application ? */
|
|
{
|
|
mng_bool bOke = pData->fProcesstext ((mng_handle)pData, MNG_TYPE_TEXT,
|
|
((mng_textp)pChunk)->zKeyword,
|
|
((mng_textp)pChunk)->zText, 0, 0);
|
|
if (!bOke)
|
|
MNG_ERROR (pData, MNG_APPMISCERROR);
|
|
}
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_zTXt
|
|
MNG_C_SPECIALFUNC (mng_special_ztxt)
|
|
{
|
|
if (pData->fProcesstext) /* inform the application ? */
|
|
{
|
|
mng_bool bOke = pData->fProcesstext ((mng_handle)pData, MNG_TYPE_ZTXT,
|
|
((mng_ztxtp)pChunk)->zKeyword,
|
|
((mng_ztxtp)pChunk)->zText, 0, 0);
|
|
if (!bOke)
|
|
MNG_ERROR (pData, MNG_APPMISCERROR);
|
|
}
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_iTXt
|
|
MNG_F_SPECIALFUNC (mng_deflate_itxt)
|
|
{
|
|
mng_itxtp pITXT = (mng_itxtp)pChunk;
|
|
mng_uint32 iBufsize = 0;
|
|
mng_uint8p pBuf = 0;
|
|
mng_uint32 iTextlen = 0;
|
|
|
|
if (pITXT->iCompressionflag) /* decompress the text ? */
|
|
{
|
|
mng_retcode iRetcode = mng_inflate_buffer (pData, *ppRawdata, *piRawlen,
|
|
&pBuf, &iBufsize, &iTextlen);
|
|
|
|
if (iRetcode) /* on error bail out */
|
|
{ /* don't forget to drop the temp buffer */
|
|
MNG_FREEX (pData, pBuf, iBufsize);
|
|
return iRetcode;
|
|
}
|
|
|
|
MNG_ALLOC (pData, pITXT->zText, iTextlen+1);
|
|
MNG_COPY (pITXT->zText, pBuf, iTextlen);
|
|
|
|
pITXT->iTextsize = iTextlen;
|
|
|
|
MNG_FREEX (pData, pBuf, iBufsize);
|
|
|
|
} else {
|
|
|
|
MNG_ALLOC (pData, pITXT->zText, (*piRawlen)+1);
|
|
MNG_COPY (pITXT->zText, *ppRawdata, *piRawlen);
|
|
|
|
pITXT->iTextsize = *piRawlen;
|
|
}
|
|
|
|
*piRawlen = 0;
|
|
|
|
return MNG_NOERROR;
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_iTXt
|
|
MNG_C_SPECIALFUNC (mng_special_itxt)
|
|
{
|
|
if (pData->fProcesstext) /* inform the application ? */
|
|
{
|
|
mng_bool bOke = pData->fProcesstext ((mng_handle)pData, MNG_TYPE_ITXT,
|
|
((mng_itxtp)pChunk)->zKeyword,
|
|
((mng_itxtp)pChunk)->zText,
|
|
((mng_itxtp)pChunk)->zLanguage,
|
|
((mng_itxtp)pChunk)->zTranslation);
|
|
if (!bOke)
|
|
MNG_ERROR (pData, MNG_APPMISCERROR);
|
|
}
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_bKGD
|
|
MNG_C_SPECIALFUNC (mng_special_bkgd)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
mng_imagep pImage = (mng_imagep)pData->pCurrentobj;
|
|
mng_imagedatap pBuf;
|
|
#endif
|
|
|
|
#ifdef MNG_INCLUDE_JNG
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
|
|
#else
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
|
|
#endif
|
|
pData->bHasBKGD = MNG_TRUE; /* indicate bKGD available */
|
|
else
|
|
pData->bHasglobalBKGD = (mng_bool)!(((mng_bkgdp)pChunk)->bEmpty);
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
if (!pImage) /* if no object dump it in obj 0 */
|
|
pImage = (mng_imagep)pData->pObjzero;
|
|
pBuf = pImage->pImgbuf; /* address object buffer */
|
|
|
|
#ifdef MNG_INCLUDE_JNG
|
|
if (pData->bHasJHDR)
|
|
{
|
|
pBuf->bHasBKGD = MNG_TRUE; /* tell the object it's got bKGD now */
|
|
|
|
switch (pData->iJHDRcolortype) /* store fields for future reference */
|
|
{
|
|
case 8 : ; /* gray */
|
|
case 12 : { /* graya */
|
|
pBuf->iBKGDgray = ((mng_bkgdp)pChunk)->iGray;
|
|
break;
|
|
}
|
|
case 10 : ; /* rgb */
|
|
case 14 : { /* rgba */
|
|
pBuf->iBKGDred = ((mng_bkgdp)pChunk)->iRed;
|
|
pBuf->iBKGDgreen = ((mng_bkgdp)pChunk)->iGreen;
|
|
pBuf->iBKGDblue = ((mng_bkgdp)pChunk)->iBlue;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
#endif /* MNG_INCLUDE_JNG */
|
|
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
|
|
{
|
|
pBuf->bHasBKGD = MNG_TRUE; /* tell the object it's got bKGD now */
|
|
|
|
switch (pData->iColortype) /* store fields for future reference */
|
|
{
|
|
case 0 : ; /* gray */
|
|
case 4 : { /* graya */
|
|
pBuf->iBKGDgray = ((mng_bkgdp)pChunk)->iGray;
|
|
break;
|
|
}
|
|
case 2 : ; /* rgb */
|
|
case 6 : { /* rgba */
|
|
pBuf->iBKGDred = ((mng_bkgdp)pChunk)->iRed;
|
|
pBuf->iBKGDgreen = ((mng_bkgdp)pChunk)->iGreen;
|
|
pBuf->iBKGDblue = ((mng_bkgdp)pChunk)->iBlue;
|
|
break;
|
|
}
|
|
case 3 : { /* indexed */
|
|
pBuf->iBKGDindex = ((mng_bkgdp)pChunk)->iIndex;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else /* store as global */
|
|
{
|
|
if (!(((mng_bkgdp)pChunk)->bEmpty))
|
|
{
|
|
pData->iGlobalBKGDred = ((mng_bkgdp)pChunk)->iRed;
|
|
pData->iGlobalBKGDgreen = ((mng_bkgdp)pChunk)->iGreen;
|
|
pData->iGlobalBKGDblue = ((mng_bkgdp)pChunk)->iBlue;
|
|
}
|
|
/* create an animation object */
|
|
return mng_create_ani_bkgd (pData);
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_pHYs
|
|
MNG_C_SPECIALFUNC (mng_special_phys)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
{
|
|
|
|
|
|
/* TODO: something !!! */
|
|
|
|
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_sBIT
|
|
MNG_C_SPECIALFUNC (mng_special_sbit)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
{
|
|
|
|
|
|
/* TODO: something !!! */
|
|
|
|
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_sPLT
|
|
MNG_F_SPECIALFUNC (mng_splt_entries)
|
|
{
|
|
mng_spltp pSPLT = (mng_spltp)pChunk;
|
|
mng_uint32 iRawlen = *piRawlen;
|
|
mng_uint8p pRawdata = *ppRawdata;
|
|
|
|
if ((pSPLT->iSampledepth != MNG_BITDEPTH_8 ) &&
|
|
(pSPLT->iSampledepth != MNG_BITDEPTH_16) )
|
|
MNG_ERROR (pData, MNG_INVSAMPLEDEPTH);
|
|
/* check remaining length */
|
|
if ( ((pSPLT->iSampledepth == MNG_BITDEPTH_8 ) && (iRawlen % 6 != 0)) ||
|
|
((pSPLT->iSampledepth == MNG_BITDEPTH_16) && (iRawlen % 10 != 0)) )
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
|
|
if (pSPLT->iSampledepth == MNG_BITDEPTH_8)
|
|
pSPLT->iEntrycount = iRawlen / 6;
|
|
else
|
|
pSPLT->iEntrycount = iRawlen / 10;
|
|
|
|
if (iRawlen)
|
|
{
|
|
MNG_ALLOC (pData, pSPLT->pEntries, iRawlen);
|
|
MNG_COPY (pSPLT->pEntries, pRawdata, iRawlen);
|
|
}
|
|
|
|
*piRawlen = 0;
|
|
|
|
return MNG_NOERROR;
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_sPLT
|
|
MNG_C_SPECIALFUNC (mng_special_splt)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
{
|
|
|
|
|
|
/* TODO: something !!! */
|
|
|
|
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_hIST
|
|
MNG_F_SPECIALFUNC (mng_hist_entries)
|
|
{
|
|
mng_histp pHIST = (mng_histp)pChunk;
|
|
mng_uint32 iRawlen = *piRawlen;
|
|
mng_uint8p pRawdata = *ppRawdata;
|
|
mng_uint32 iX;
|
|
|
|
if ( ((iRawlen & 0x01) != 0) || ((iRawlen >> 1) != pData->iPLTEcount) )
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
|
|
pHIST->iEntrycount = iRawlen >> 1;
|
|
|
|
for (iX = 0; iX < pHIST->iEntrycount; iX++)
|
|
{
|
|
pHIST->aEntries[iX] = mng_get_uint16 (pRawdata);
|
|
pRawdata += 2;
|
|
}
|
|
|
|
*piRawlen = 0;
|
|
|
|
return MNG_NOERROR;
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_hIST
|
|
MNG_C_SPECIALFUNC (mng_special_hist)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
{
|
|
|
|
|
|
/* TODO: something !!! */
|
|
|
|
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_tIME
|
|
MNG_C_SPECIALFUNC (mng_special_time)
|
|
{
|
|
/* if (pData->fProcesstime) */ /* inform the application ? */
|
|
/* {
|
|
|
|
pData->fProcesstime ((mng_handle)pData, );
|
|
} */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
/* ************************************************************************** */
|
|
/* JNG chunks */
|
|
|
|
#ifdef MNG_INCLUDE_JNG
|
|
MNG_C_SPECIALFUNC (mng_special_jhdr)
|
|
{
|
|
if ((pData->eSigtype == mng_it_jng) && (pData->iChunkseq > 1))
|
|
MNG_ERROR (pData, MNG_SEQUENCEERROR);
|
|
/* inside a JHDR-IEND block now */
|
|
pData->bHasJHDR = MNG_TRUE;
|
|
/* and store interesting fields */
|
|
pData->iDatawidth = ((mng_jhdrp)pChunk)->iWidth;
|
|
pData->iDataheight = ((mng_jhdrp)pChunk)->iHeight;
|
|
pData->iJHDRcolortype = ((mng_jhdrp)pChunk)->iColortype;
|
|
pData->iJHDRimgbitdepth = ((mng_jhdrp)pChunk)->iImagesampledepth;
|
|
pData->iJHDRimgcompression = ((mng_jhdrp)pChunk)->iImagecompression;
|
|
pData->iJHDRimginterlace = ((mng_jhdrp)pChunk)->iImageinterlace;
|
|
pData->iJHDRalphabitdepth = ((mng_jhdrp)pChunk)->iAlphasampledepth;
|
|
pData->iJHDRalphacompression = ((mng_jhdrp)pChunk)->iAlphacompression;
|
|
pData->iJHDRalphafilter = ((mng_jhdrp)pChunk)->iAlphafilter;
|
|
pData->iJHDRalphainterlace = ((mng_jhdrp)pChunk)->iAlphainterlace;
|
|
|
|
#if defined(MNG_NO_1_2_4BIT_SUPPORT) || defined(MNG_NO_16BIT_SUPPORT)
|
|
pData->iPNGmult = 1;
|
|
pData->iPNGdepth = pData->iJHDRalphabitdepth;
|
|
#endif
|
|
|
|
#ifdef MNG_NO_1_2_4BIT_SUPPORT
|
|
if (pData->iJHDRalphabitdepth < 8)
|
|
pData->iJHDRalphabitdepth = 8;
|
|
#endif
|
|
|
|
#ifdef MNG_NO_16BIT_SUPPORT
|
|
if (pData->iJHDRalphabitdepth > 8)
|
|
{
|
|
pData->iPNGmult = 2;
|
|
pData->iJHDRalphabitdepth = 8;
|
|
}
|
|
#endif
|
|
/* parameter validity checks */
|
|
if ((pData->iJHDRcolortype != MNG_COLORTYPE_JPEGGRAY ) &&
|
|
(pData->iJHDRcolortype != MNG_COLORTYPE_JPEGCOLOR ) &&
|
|
(pData->iJHDRcolortype != MNG_COLORTYPE_JPEGGRAYA ) &&
|
|
(pData->iJHDRcolortype != MNG_COLORTYPE_JPEGCOLORA) )
|
|
MNG_ERROR (pData, MNG_INVALIDCOLORTYPE);
|
|
|
|
if ((pData->iJHDRimgbitdepth != MNG_BITDEPTH_JPEG8 ) &&
|
|
(pData->iJHDRimgbitdepth != MNG_BITDEPTH_JPEG12 ) &&
|
|
(pData->iJHDRimgbitdepth != MNG_BITDEPTH_JPEG8AND12) )
|
|
MNG_ERROR (pData, MNG_INVALIDBITDEPTH);
|
|
|
|
if ((pData->iJHDRcolortype == MNG_COLORTYPE_JPEGGRAYA ) ||
|
|
(pData->iJHDRcolortype == MNG_COLORTYPE_JPEGCOLORA) )
|
|
{
|
|
if ((pData->iJHDRalphabitdepth != MNG_BITDEPTH_8 )
|
|
#ifndef MNG_NO_1_2_4BIT_SUPPORT
|
|
&& (pData->iJHDRalphabitdepth != MNG_BITDEPTH_1 ) &&
|
|
(pData->iJHDRalphabitdepth != MNG_BITDEPTH_2 ) &&
|
|
(pData->iJHDRalphabitdepth != MNG_BITDEPTH_4 )
|
|
#endif
|
|
#ifndef MNG_NO_16BIT_SUPPORT
|
|
&& (pData->iJHDRalphabitdepth != MNG_BITDEPTH_16)
|
|
#endif
|
|
)
|
|
MNG_ERROR (pData, MNG_INVALIDBITDEPTH);
|
|
|
|
if ((pData->iJHDRalphacompression != MNG_COMPRESSION_DEFLATE ) &&
|
|
(pData->iJHDRalphacompression != MNG_COMPRESSION_BASELINEJPEG) )
|
|
MNG_ERROR (pData, MNG_INVALIDCOMPRESS);
|
|
|
|
if ((pData->iJHDRalphacompression == MNG_COMPRESSION_BASELINEJPEG) &&
|
|
(pData->iJHDRalphabitdepth != MNG_BITDEPTH_8 ) )
|
|
MNG_ERROR (pData, MNG_INVALIDBITDEPTH);
|
|
|
|
#if defined(FILTER192) || defined(FILTER193)
|
|
if ((pData->iJHDRalphafilter != MNG_FILTER_ADAPTIVE ) &&
|
|
#if defined(FILTER192) && defined(FILTER193)
|
|
(pData->iJHDRalphafilter != MNG_FILTER_DIFFERING) &&
|
|
(pData->iJHDRalphafilter != MNG_FILTER_NOFILTER ) )
|
|
#else
|
|
#ifdef FILTER192
|
|
(pData->iJHDRalphafilter != MNG_FILTER_DIFFERING) )
|
|
#else
|
|
(pData->iJHDRalphafilter != MNG_FILTER_NOFILTER ) )
|
|
#endif
|
|
#endif
|
|
MNG_ERROR (pData, MNG_INVALIDFILTER);
|
|
#else
|
|
if (pData->iJHDRalphafilter)
|
|
MNG_ERROR (pData, MNG_INVALIDFILTER);
|
|
#endif
|
|
|
|
}
|
|
else
|
|
{
|
|
if (pData->iJHDRalphabitdepth)
|
|
MNG_ERROR (pData, MNG_INVALIDBITDEPTH);
|
|
if (pData->iJHDRalphacompression)
|
|
MNG_ERROR (pData, MNG_INVALIDCOMPRESS);
|
|
if (pData->iJHDRalphafilter)
|
|
MNG_ERROR (pData, MNG_INVALIDFILTER);
|
|
if (pData->iJHDRalphainterlace)
|
|
MNG_ERROR (pData, MNG_INVALIDINTERLACE);
|
|
}
|
|
|
|
if (!pData->bHasheader) /* first chunk ? */
|
|
{
|
|
pData->bHasheader = MNG_TRUE; /* we've got a header */
|
|
pData->eImagetype = mng_it_jng; /* then this must be a JNG */
|
|
pData->iWidth = ((mng_jhdrp)pChunk)->iWidth;
|
|
pData->iHeight = ((mng_jhdrp)pChunk)->iHeight;
|
|
/* predict alpha-depth ! */
|
|
if ((pData->iJHDRcolortype == MNG_COLORTYPE_JPEGGRAYA ) ||
|
|
(pData->iJHDRcolortype == MNG_COLORTYPE_JPEGCOLORA) )
|
|
pData->iAlphadepth = pData->iJHDRalphabitdepth;
|
|
else
|
|
pData->iAlphadepth = 0;
|
|
/* fits on maximum canvas ? */
|
|
if ((pData->iWidth > pData->iMaxwidth) || (pData->iHeight > pData->iMaxheight))
|
|
MNG_WARNING (pData, MNG_IMAGETOOLARGE);
|
|
|
|
if (pData->fProcessheader) /* inform the app ? */
|
|
if (!pData->fProcessheader (((mng_handle)pData), pData->iWidth, pData->iHeight))
|
|
MNG_ERROR (pData, MNG_APPMISCERROR);
|
|
|
|
}
|
|
|
|
pData->iColortype = 0; /* fake grayscale for other routines */
|
|
pData->iImagelevel++; /* one level deeper */
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
{
|
|
mng_retcode iRetcode = mng_process_display_jhdr (pData);
|
|
if (iRetcode) /* on error bail out */
|
|
return iRetcode;
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
#ifdef MNG_NO_16BIT_SUPPORT
|
|
if (((mng_jhdrp)pChunk)->iAlphasampledepth > 8)
|
|
((mng_jhdrp)pChunk)->iAlphasampledepth = 8;
|
|
#endif
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif /* MNG_INCLUDE_JNG */
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifdef MNG_INCLUDE_JNG
|
|
MNG_C_SPECIALFUNC (mng_special_jdaa)
|
|
{
|
|
if (pData->iJHDRalphacompression != MNG_COMPRESSION_BASELINEJPEG)
|
|
MNG_ERROR (pData, MNG_SEQUENCEERROR);
|
|
|
|
pData->bHasJDAA = MNG_TRUE; /* got some JDAA now, don't we */
|
|
return MNG_NOERROR;
|
|
}
|
|
#endif /* MNG_INCLUDE_JNG */
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifdef MNG_INCLUDE_JNG
|
|
MNG_C_SPECIALFUNC (mng_special_jdat)
|
|
{
|
|
pData->bHasJDAT = MNG_TRUE; /* got some JDAT now, don't we */
|
|
return MNG_NOERROR;
|
|
}
|
|
#endif /* MNG_INCLUDE_JNG */
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifdef MNG_INCLUDE_JNG
|
|
MNG_C_SPECIALFUNC (mng_special_jsep)
|
|
{
|
|
pData->bHasJSEP = MNG_TRUE; /* indicate we've had the 8-/12-bit separator */
|
|
return MNG_NOERROR;
|
|
}
|
|
#endif /* MNG_INCLUDE_JNG */
|
|
|
|
/* ************************************************************************** */
|
|
/* ************************************************************************** */
|
|
/* MNG chunks */
|
|
|
|
MNG_C_SPECIALFUNC (mng_special_mhdr)
|
|
{
|
|
if (pData->bHasheader) /* can only be the first chunk! */
|
|
MNG_ERROR (pData, MNG_SEQUENCEERROR);
|
|
|
|
pData->bHasMHDR = MNG_TRUE; /* oh boy, a real MNG */
|
|
pData->bHasheader = MNG_TRUE; /* we've got a header */
|
|
pData->eImagetype = mng_it_mng; /* fill header fields */
|
|
pData->iWidth = ((mng_mhdrp)pChunk)->iWidth;
|
|
pData->iHeight = ((mng_mhdrp)pChunk)->iHeight;
|
|
pData->iTicks = ((mng_mhdrp)pChunk)->iTicks;
|
|
pData->iLayercount = ((mng_mhdrp)pChunk)->iLayercount;
|
|
pData->iFramecount = ((mng_mhdrp)pChunk)->iFramecount;
|
|
pData->iPlaytime = ((mng_mhdrp)pChunk)->iPlaytime;
|
|
pData->iSimplicity = ((mng_mhdrp)pChunk)->iSimplicity;
|
|
#ifndef MNG_NO_OLD_VERSIONS
|
|
pData->bPreDraft48 = MNG_FALSE;
|
|
#endif
|
|
/* predict alpha-depth */
|
|
if ((pData->iSimplicity & 0x00000001) == 0)
|
|
#ifndef MNG_NO_16BIT_SUPPORT
|
|
pData->iAlphadepth = 16; /* no indicators = assume the worst */
|
|
#else
|
|
pData->iAlphadepth = 8; /* anything else = assume the worst */
|
|
#endif
|
|
else
|
|
if ((pData->iSimplicity & 0x00000008) == 0)
|
|
pData->iAlphadepth = 0; /* no transparency at all */
|
|
else
|
|
if ((pData->iSimplicity & 0x00000140) == 0x00000040)
|
|
pData->iAlphadepth = 1; /* no semi-transparency guaranteed */
|
|
else
|
|
#ifndef MNG_NO_16BIT_SUPPORT
|
|
pData->iAlphadepth = 16; /* anything else = assume the worst */
|
|
#else
|
|
pData->iAlphadepth = 8; /* anything else = assume the worst */
|
|
#endif
|
|
|
|
#ifdef MNG_INCLUDE_JNG /* can we handle the complexity ? */
|
|
if (pData->iSimplicity & 0x0000FC00)
|
|
#else
|
|
if (pData->iSimplicity & 0x0000FC10)
|
|
#endif
|
|
MNG_ERROR (pData, MNG_MNGTOOCOMPLEX);
|
|
/* fits on maximum canvas ? */
|
|
if ((pData->iWidth > pData->iMaxwidth) || (pData->iHeight > pData->iMaxheight))
|
|
MNG_WARNING (pData, MNG_IMAGETOOLARGE);
|
|
|
|
if (pData->fProcessheader) /* inform the app ? */
|
|
if (!pData->fProcessheader (((mng_handle)pData), pData->iWidth, pData->iHeight))
|
|
MNG_ERROR (pData, MNG_APPMISCERROR);
|
|
|
|
pData->iImagelevel++; /* one level deeper */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
|
|
/* ************************************************************************** */
|
|
|
|
MNG_C_SPECIALFUNC (mng_special_mend)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
{ /* do something */
|
|
mng_retcode iRetcode = mng_process_display_mend (pData);
|
|
|
|
if (iRetcode) /* on error bail out */
|
|
return iRetcode;
|
|
|
|
if (!pData->iTotalframes) /* save totals */
|
|
pData->iTotalframes = pData->iFrameseq;
|
|
if (!pData->iTotallayers)
|
|
pData->iTotallayers = pData->iLayerseq;
|
|
if (!pData->iTotalplaytime)
|
|
pData->iTotalplaytime = pData->iFrametime;
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
pData->bHasMHDR = MNG_FALSE; /* end of the line, bro! */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_LOOP
|
|
MNG_F_SPECIALFUNC (mng_debunk_loop)
|
|
{
|
|
mng_loopp pLOOP = (mng_loopp)pChunk;
|
|
mng_uint32 iRawlen = *piRawlen;
|
|
mng_uint8p pRawdata = *ppRawdata;
|
|
|
|
if (iRawlen >= 5) /* length checks */
|
|
{
|
|
if (iRawlen >= 6)
|
|
{
|
|
if ((iRawlen - 6) % 4 != 0)
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
}
|
|
}
|
|
else
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
|
|
if (iRawlen >= 5) /* store the fields */
|
|
{
|
|
pLOOP->iLevel = *pRawdata;
|
|
|
|
#ifndef MNG_NO_OLD_VERSIONS
|
|
if (pData->bPreDraft48)
|
|
{
|
|
pLOOP->iTermination = *(pRawdata+1);
|
|
pLOOP->iRepeat = mng_get_uint32 (pRawdata+2);
|
|
}
|
|
else
|
|
#endif
|
|
{
|
|
pLOOP->iRepeat = mng_get_uint32 (pRawdata+1);
|
|
}
|
|
|
|
if (iRawlen >= 6)
|
|
{
|
|
#ifndef MNG_NO_OLD_VERSIONS
|
|
if (!pData->bPreDraft48)
|
|
#endif
|
|
pLOOP->iTermination = *(pRawdata+5);
|
|
|
|
if (iRawlen >= 10)
|
|
{
|
|
pLOOP->iItermin = mng_get_uint32 (pRawdata+6);
|
|
|
|
#ifndef MNG_NO_LOOP_SIGNALS_SUPPORTED
|
|
if (iRawlen >= 14)
|
|
{
|
|
pLOOP->iItermax = mng_get_uint32 (pRawdata+10);
|
|
pLOOP->iCount = (iRawlen - 14) / 4;
|
|
|
|
if (pLOOP->iCount)
|
|
{
|
|
MNG_ALLOC (pData, pLOOP->pSignals, pLOOP->iCount << 2);
|
|
|
|
#ifndef MNG_BIGENDIAN_SUPPORTED
|
|
{
|
|
mng_uint32 iX;
|
|
mng_uint8p pIn = pRawdata + 14;
|
|
mng_uint32p pOut = (mng_uint32p)pLOOP->pSignals;
|
|
|
|
for (iX = 0; iX < pLOOP->iCount; iX++)
|
|
{
|
|
*pOut++ = mng_get_uint32 (pIn);
|
|
pIn += 4;
|
|
}
|
|
}
|
|
#else
|
|
MNG_COPY (pLOOP->pSignals, pRawdata + 14, pLOOP->iCount << 2);
|
|
#endif /* !MNG_BIGENDIAN_SUPPORTED */
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
|
|
*piRawlen = 0;
|
|
|
|
return MNG_NOERROR;
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_LOOP
|
|
MNG_C_SPECIALFUNC (mng_special_loop)
|
|
{
|
|
if (!pData->bCacheplayback) /* must store playback info to work!! */
|
|
MNG_ERROR (pData, MNG_LOOPWITHCACHEOFF);
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
{
|
|
mng_retcode iRetcode;
|
|
|
|
pData->bHasLOOP = MNG_TRUE; /* indicate we're inside a loop */
|
|
/* create the LOOP ani-object */
|
|
iRetcode = mng_create_ani_loop (pData, pChunk);
|
|
if (iRetcode) /* on error bail out */
|
|
return iRetcode;
|
|
/* skip till matching ENDL if iteration=0 */
|
|
if ((!pData->bSkipping) && (((mng_loopp)pChunk)->iRepeat == 0))
|
|
pData->bSkipping = MNG_TRUE;
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_LOOP
|
|
MNG_C_SPECIALFUNC (mng_special_endl)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
if (pData->bHasLOOP) /* are we really processing a loop ? */
|
|
{
|
|
mng_uint8 iLevel = ((mng_endlp)pChunk)->iLevel;
|
|
/* create an ENDL animation object */
|
|
return mng_create_ani_endl (pData, iLevel);
|
|
}
|
|
else
|
|
MNG_ERROR (pData, MNG_NOMATCHINGLOOP);
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_DEFI
|
|
MNG_C_SPECIALFUNC (mng_special_defi)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
mng_retcode iRetcode;
|
|
|
|
pData->iDEFIobjectid = ((mng_defip)pChunk)->iObjectid;
|
|
pData->bDEFIhasdonotshow = ((mng_defip)pChunk)->bHasdonotshow;
|
|
pData->iDEFIdonotshow = ((mng_defip)pChunk)->iDonotshow;
|
|
pData->bDEFIhasconcrete = ((mng_defip)pChunk)->bHasconcrete;
|
|
pData->iDEFIconcrete = ((mng_defip)pChunk)->iConcrete;
|
|
pData->bDEFIhasloca = ((mng_defip)pChunk)->bHasloca;
|
|
pData->iDEFIlocax = ((mng_defip)pChunk)->iXlocation;
|
|
pData->iDEFIlocay = ((mng_defip)pChunk)->iYlocation;
|
|
pData->bDEFIhasclip = ((mng_defip)pChunk)->bHasclip;
|
|
pData->iDEFIclipl = ((mng_defip)pChunk)->iLeftcb;
|
|
pData->iDEFIclipr = ((mng_defip)pChunk)->iRightcb;
|
|
pData->iDEFIclipt = ((mng_defip)pChunk)->iTopcb;
|
|
pData->iDEFIclipb = ((mng_defip)pChunk)->iBottomcb;
|
|
/* create an animation object */
|
|
iRetcode = mng_create_ani_defi (pData);
|
|
if (!iRetcode) /* do display processing */
|
|
iRetcode = mng_process_display_defi (pData);
|
|
return iRetcode;
|
|
#else
|
|
return MNG_NOERROR; /* done */
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_BASI
|
|
MNG_C_SPECIALFUNC (mng_special_basi)
|
|
{
|
|
pData->bHasBASI = MNG_TRUE; /* inside a BASI-IEND block now */
|
|
/* store interesting fields */
|
|
pData->iDatawidth = ((mng_basip)pChunk)->iWidth;
|
|
pData->iDataheight = ((mng_basip)pChunk)->iHeight;
|
|
pData->iBitdepth = ((mng_basip)pChunk)->iBitdepth;
|
|
pData->iColortype = ((mng_basip)pChunk)->iColortype;
|
|
pData->iCompression = ((mng_basip)pChunk)->iCompression;
|
|
pData->iFilter = ((mng_basip)pChunk)->iFilter;
|
|
pData->iInterlace = ((mng_basip)pChunk)->iInterlace;
|
|
|
|
#if defined(MNG_NO_1_2_4BIT_SUPPORT) || defined(MNG_NO_16BIT_SUPPORT)
|
|
pData->iPNGmult = 1;
|
|
pData->iPNGdepth = pData->iBitdepth;
|
|
#endif
|
|
|
|
#ifdef MNG_NO_1_2_4BIT_SUPPORT
|
|
if (pData->iBitdepth < 8)
|
|
pData->iBitdepth = 8;
|
|
#endif
|
|
#ifdef MNG_NO_16BIT_SUPPORT
|
|
if (pData->iBitdepth > 8)
|
|
{
|
|
pData->iBitdepth = 8;
|
|
pData->iPNGmult = 2;
|
|
}
|
|
#endif
|
|
|
|
if ((pData->iBitdepth != 8) /* parameter validity checks */
|
|
#ifndef MNG_NO_1_2_4BIT_SUPPORT
|
|
&& (pData->iBitdepth != 1) &&
|
|
(pData->iBitdepth != 2) &&
|
|
(pData->iBitdepth != 4)
|
|
#endif
|
|
#ifndef MNG_NO_16BIT_SUPPORT
|
|
&& (pData->iBitdepth != 16)
|
|
#endif
|
|
)
|
|
MNG_ERROR (pData, MNG_INVALIDBITDEPTH);
|
|
|
|
if ((pData->iColortype != MNG_COLORTYPE_GRAY ) &&
|
|
(pData->iColortype != MNG_COLORTYPE_RGB ) &&
|
|
(pData->iColortype != MNG_COLORTYPE_INDEXED) &&
|
|
(pData->iColortype != MNG_COLORTYPE_GRAYA ) &&
|
|
(pData->iColortype != MNG_COLORTYPE_RGBA ) )
|
|
MNG_ERROR (pData, MNG_INVALIDCOLORTYPE);
|
|
|
|
if ((pData->iColortype == MNG_COLORTYPE_INDEXED) && (pData->iBitdepth > 8))
|
|
MNG_ERROR (pData, MNG_INVALIDBITDEPTH);
|
|
|
|
if (((pData->iColortype == MNG_COLORTYPE_RGB ) ||
|
|
(pData->iColortype == MNG_COLORTYPE_GRAYA ) ||
|
|
(pData->iColortype == MNG_COLORTYPE_RGBA ) ) &&
|
|
(pData->iBitdepth < 8 ) )
|
|
MNG_ERROR (pData, MNG_INVALIDBITDEPTH);
|
|
|
|
#if defined(FILTER192) || defined(FILTER193)
|
|
if ((pData->iFilter != MNG_FILTER_ADAPTIVE ) &&
|
|
#if defined(FILTER192) && defined(FILTER193)
|
|
(pData->iFilter != MNG_FILTER_DIFFERING) &&
|
|
(pData->iFilter != MNG_FILTER_NOFILTER ) )
|
|
#else
|
|
#ifdef FILTER192
|
|
(pData->iFilter != MNG_FILTER_DIFFERING) )
|
|
#else
|
|
(pData->iFilter != MNG_FILTER_NOFILTER ) )
|
|
#endif
|
|
#endif
|
|
MNG_ERROR (pData, MNG_INVALIDFILTER);
|
|
#else
|
|
if (pData->iFilter)
|
|
MNG_ERROR (pData, MNG_INVALIDFILTER);
|
|
#endif
|
|
|
|
pData->iImagelevel++; /* one level deeper */
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
{ /* create an animation object */
|
|
mng_retcode iRetcode = mng_create_ani_basi (pData, pChunk);
|
|
if (iRetcode) /* on error bail out */
|
|
return iRetcode;
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
#ifdef MNG_NO_16BIT_SUPPORT
|
|
if (((mng_basip)pChunk)->iBitdepth > 8)
|
|
((mng_basip)pChunk)->iBitdepth = 8;
|
|
#endif
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_CLON
|
|
MNG_C_SPECIALFUNC (mng_special_clon)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
return mng_create_ani_clon (pData, pChunk);
|
|
#else
|
|
return MNG_NOERROR; /* done */
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_PAST
|
|
MNG_F_SPECIALFUNC (mng_debunk_past)
|
|
{
|
|
mng_pastp pPAST = (mng_pastp)pChunk;
|
|
mng_uint32 iRawlen = *piRawlen;
|
|
mng_uint8p pRawdata = *ppRawdata;
|
|
mng_uint32 iSize;
|
|
mng_uint32 iX;
|
|
mng_past_sourcep pSource;
|
|
/* check the length */
|
|
if ((iRawlen < 41) || (((iRawlen - 11) % 30) != 0))
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
|
|
pPAST->iDestid = mng_get_uint16 (pRawdata);
|
|
pPAST->iTargettype = *(pRawdata+2);
|
|
pPAST->iTargetx = mng_get_int32 (pRawdata+3);
|
|
pPAST->iTargety = mng_get_int32 (pRawdata+7);
|
|
pPAST->iCount = ((iRawlen - 11) / 30); /* how many entries again? */
|
|
iSize = pPAST->iCount * sizeof (mng_past_source);
|
|
|
|
pRawdata += 11;
|
|
/* get a buffer for all the source blocks */
|
|
MNG_ALLOC (pData, pPAST->pSources, iSize);
|
|
|
|
pSource = (mng_past_sourcep)(pPAST->pSources);
|
|
|
|
for (iX = pPAST->iCount; iX > 0; iX--)
|
|
{ /* now copy the source blocks */
|
|
pSource->iSourceid = mng_get_uint16 (pRawdata);
|
|
pSource->iComposition = *(pRawdata+2);
|
|
pSource->iOrientation = *(pRawdata+3);
|
|
pSource->iOffsettype = *(pRawdata+4);
|
|
pSource->iOffsetx = mng_get_int32 (pRawdata+5);
|
|
pSource->iOffsety = mng_get_int32 (pRawdata+9);
|
|
pSource->iBoundarytype = *(pRawdata+13);
|
|
pSource->iBoundaryl = mng_get_int32 (pRawdata+14);
|
|
pSource->iBoundaryr = mng_get_int32 (pRawdata+18);
|
|
pSource->iBoundaryt = mng_get_int32 (pRawdata+22);
|
|
pSource->iBoundaryb = mng_get_int32 (pRawdata+26);
|
|
|
|
pSource++;
|
|
pRawdata += 30;
|
|
}
|
|
|
|
*piRawlen = 0;
|
|
|
|
return MNG_NOERROR;
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_PAST
|
|
MNG_C_SPECIALFUNC (mng_special_past)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
return mng_create_ani_past (pData, pChunk);
|
|
#else
|
|
return MNG_NOERROR;
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_DISC
|
|
MNG_F_SPECIALFUNC (mng_disc_entries)
|
|
{
|
|
mng_discp pDISC = (mng_discp)pChunk;
|
|
mng_uint32 iRawlen = *piRawlen;
|
|
mng_uint8p pRawdata = *ppRawdata;
|
|
|
|
if ((iRawlen % 2) != 0) /* check the length */
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
|
|
pDISC->iCount = (iRawlen / sizeof (mng_uint16));
|
|
|
|
if (pDISC->iCount)
|
|
{
|
|
MNG_ALLOC (pData, pDISC->pObjectids, iRawlen);
|
|
|
|
#ifndef MNG_BIGENDIAN_SUPPORTED
|
|
{
|
|
mng_uint32 iX;
|
|
mng_uint8p pIn = pRawdata;
|
|
mng_uint16p pOut = pDISC->pObjectids;
|
|
|
|
for (iX = pDISC->iCount; iX > 0; iX--)
|
|
{
|
|
*pOut++ = mng_get_uint16 (pIn);
|
|
pIn += 2;
|
|
}
|
|
}
|
|
#else
|
|
MNG_COPY (pDISC->pObjectids, pRawdata, iRawlen);
|
|
#endif /* !MNG_BIGENDIAN_SUPPORTED */
|
|
}
|
|
|
|
*piRawlen = 0;
|
|
|
|
return MNG_NOERROR;
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_DISC
|
|
MNG_C_SPECIALFUNC (mng_special_disc)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
return mng_create_ani_disc (pData, pChunk);
|
|
#else
|
|
return MNG_NOERROR;
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_BACK
|
|
MNG_C_SPECIALFUNC (mng_special_back)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
/* retrieve the fields */
|
|
pData->bHasBACK = MNG_TRUE;
|
|
pData->iBACKred = ((mng_backp)pChunk)->iRed;
|
|
pData->iBACKgreen = ((mng_backp)pChunk)->iGreen;
|
|
pData->iBACKblue = ((mng_backp)pChunk)->iBlue;
|
|
pData->iBACKmandatory = ((mng_backp)pChunk)->iMandatory;
|
|
pData->iBACKimageid = ((mng_backp)pChunk)->iImageid;
|
|
pData->iBACKtile = ((mng_backp)pChunk)->iTile;
|
|
|
|
return mng_create_ani_back (pData);
|
|
#else
|
|
return MNG_NOERROR;
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_FRAM
|
|
MNG_F_SPECIALFUNC (mng_fram_remainder)
|
|
{
|
|
mng_framp pFRAM = (mng_framp)pChunk;
|
|
mng_uint32 iRawlen = *piRawlen;
|
|
mng_uint8p pRawdata = *ppRawdata;
|
|
mng_uint32 iRequired = 0;
|
|
|
|
if (iRawlen < 4) /* must have at least 4 bytes */
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
|
|
iRequired = 4; /* calculate and check required remaining length */
|
|
|
|
pFRAM->iChangedelay = *pRawdata;
|
|
pFRAM->iChangetimeout = *(pRawdata+1);
|
|
pFRAM->iChangeclipping = *(pRawdata+2);
|
|
pFRAM->iChangesyncid = *(pRawdata+3);
|
|
|
|
if (pFRAM->iChangedelay ) { iRequired += 4; }
|
|
if (pFRAM->iChangetimeout ) { iRequired += 4; }
|
|
if (pFRAM->iChangeclipping) { iRequired += 17; }
|
|
|
|
if (pFRAM->iChangesyncid)
|
|
{
|
|
if ((iRawlen - iRequired) % 4 != 0)
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
}
|
|
else
|
|
{
|
|
if (iRawlen != iRequired)
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
}
|
|
|
|
pRawdata += 4;
|
|
|
|
if (pFRAM->iChangedelay) /* delay changed ? */
|
|
{
|
|
pFRAM->iDelay = mng_get_uint32 (pRawdata);
|
|
pRawdata += 4;
|
|
}
|
|
|
|
if (pFRAM->iChangetimeout) /* timeout changed ? */
|
|
{
|
|
pFRAM->iTimeout = mng_get_uint32 (pRawdata);
|
|
pRawdata += 4;
|
|
}
|
|
|
|
if (pFRAM->iChangeclipping) /* clipping changed ? */
|
|
{
|
|
pFRAM->iBoundarytype = *pRawdata;
|
|
pFRAM->iBoundaryl = mng_get_int32 (pRawdata+1);
|
|
pFRAM->iBoundaryr = mng_get_int32 (pRawdata+5);
|
|
pFRAM->iBoundaryt = mng_get_int32 (pRawdata+9);
|
|
pFRAM->iBoundaryb = mng_get_int32 (pRawdata+13);
|
|
pRawdata += 17;
|
|
}
|
|
|
|
if (pFRAM->iChangesyncid)
|
|
{
|
|
pFRAM->iCount = (iRawlen - iRequired) / 4;
|
|
|
|
if (pFRAM->iCount)
|
|
{
|
|
MNG_ALLOC (pData, pFRAM->pSyncids, pFRAM->iCount * 4);
|
|
|
|
#ifndef MNG_BIGENDIAN_SUPPORTED
|
|
{
|
|
mng_uint32 iX;
|
|
mng_uint32p pOut = pFRAM->pSyncids;
|
|
|
|
for (iX = pFRAM->iCount; iX > 0; iX--)
|
|
{
|
|
*pOut++ = mng_get_uint32 (pRawdata);
|
|
pRawdata += 4;
|
|
}
|
|
}
|
|
#else
|
|
MNG_COPY (pFRAM->pSyncids, pRawdata, pFRAM->iCount * 4);
|
|
#endif /* !MNG_BIGENDIAN_SUPPORTED */
|
|
}
|
|
}
|
|
|
|
#ifndef MNG_NO_OLD_VERSIONS
|
|
if (pData->bPreDraft48) /* old style input-stream ? */
|
|
{
|
|
switch (pFRAM->iMode) /* fix the framing mode then */
|
|
{
|
|
case 0: { break; }
|
|
case 1: { pFRAM->iMode = 3; break; }
|
|
case 2: { pFRAM->iMode = 4; break; }
|
|
case 3: { pFRAM->iMode = 1; break; }
|
|
case 4: { pFRAM->iMode = 1; break; }
|
|
case 5: { pFRAM->iMode = 2; break; }
|
|
default: { pFRAM->iMode = 1; break; }
|
|
}
|
|
}
|
|
#endif
|
|
|
|
*piRawlen = 0;
|
|
|
|
return MNG_NOERROR;
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_FRAM
|
|
MNG_C_SPECIALFUNC (mng_special_fram)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
return mng_create_ani_fram (pData, pChunk);
|
|
#else
|
|
return MNG_NOERROR;
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_MOVE
|
|
MNG_C_SPECIALFUNC (mng_special_move)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
return mng_create_ani_move (pData, pChunk);
|
|
#else
|
|
return MNG_NOERROR;
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_CLIP
|
|
MNG_C_SPECIALFUNC (mng_special_clip)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
return mng_create_ani_clip (pData, pChunk);
|
|
#else
|
|
return MNG_NOERROR;
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_SHOW
|
|
MNG_C_SPECIALFUNC (mng_special_show)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
mng_retcode iRetcode;
|
|
|
|
if (!((mng_showp)pChunk)->bEmpty) /* any data ? */
|
|
{
|
|
if (!((mng_showp)pChunk)->bHaslastid)
|
|
((mng_showp)pChunk)->iLastid = ((mng_showp)pChunk)->iFirstid;
|
|
|
|
pData->iSHOWfromid = ((mng_showp)pChunk)->iFirstid;
|
|
pData->iSHOWtoid = ((mng_showp)pChunk)->iLastid;
|
|
pData->iSHOWmode = ((mng_showp)pChunk)->iMode;
|
|
}
|
|
else /* use defaults then */
|
|
{
|
|
pData->iSHOWfromid = 1;
|
|
pData->iSHOWtoid = 65535;
|
|
pData->iSHOWmode = 2;
|
|
}
|
|
/* create a SHOW animation object */
|
|
iRetcode = mng_create_ani_show (pData);
|
|
if (!iRetcode) /* go and do it! */
|
|
iRetcode = mng_process_display_show (pData);
|
|
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return iRetcode;
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_TERM
|
|
MNG_C_SPECIALFUNC (mng_special_term)
|
|
{
|
|
/* should be behind MHDR or SAVE !! */
|
|
if ((!pData->bHasSAVE) && (pData->iChunkseq > 2))
|
|
{
|
|
pData->bMisplacedTERM = MNG_TRUE; /* indicate we found a misplaced TERM */
|
|
/* and send a warning signal!!! */
|
|
MNG_WARNING (pData, MNG_SEQUENCEERROR);
|
|
}
|
|
|
|
pData->bHasTERM = MNG_TRUE;
|
|
|
|
if (pData->fProcessterm) /* inform the app ? */
|
|
if (!pData->fProcessterm (((mng_handle)pData),
|
|
((mng_termp)pChunk)->iTermaction,
|
|
((mng_termp)pChunk)->iIteraction,
|
|
((mng_termp)pChunk)->iDelay,
|
|
((mng_termp)pChunk)->iItermax))
|
|
MNG_ERROR (pData, MNG_APPMISCERROR);
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
{ /* create the TERM ani-object */
|
|
mng_retcode iRetcode = mng_create_ani_term (pData, pChunk);
|
|
if (iRetcode) /* on error bail out */
|
|
return iRetcode;
|
|
/* save for future reference */
|
|
pData->pTermaniobj = pData->pLastaniobj;
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_SAVE
|
|
MNG_F_SPECIALFUNC (mng_save_entries)
|
|
{
|
|
mng_savep pSAVE = (mng_savep)pChunk;
|
|
mng_uint32 iRawlen = *piRawlen;
|
|
mng_uint8p pRawdata = *ppRawdata;
|
|
mng_save_entryp pEntry = MNG_NULL;
|
|
mng_uint32 iCount = 0;
|
|
mng_uint8 iOtype = *pRawdata;
|
|
mng_uint8 iEtype;
|
|
mng_uint8p pTemp;
|
|
mng_uint8p pNull;
|
|
mng_uint32 iLen;
|
|
mng_uint32 iOffset[2];
|
|
mng_uint32 iStarttime[2];
|
|
mng_uint32 iFramenr;
|
|
mng_uint32 iLayernr;
|
|
mng_uint32 iX;
|
|
mng_uint32 iNamesize;
|
|
|
|
if ((iOtype != 4) && (iOtype != 8))
|
|
MNG_ERROR (pData, MNG_INVOFFSETSIZE);
|
|
|
|
pSAVE->iOffsettype = iOtype;
|
|
|
|
for (iX = 0; iX < 2; iX++) /* do this twice to get the count first ! */
|
|
{
|
|
pTemp = pRawdata + 1;
|
|
iLen = iRawlen - 1;
|
|
|
|
if (iX) /* second run ? */
|
|
{
|
|
MNG_ALLOC (pData, pEntry, (iCount * sizeof (mng_save_entry)));
|
|
|
|
pSAVE->iCount = iCount;
|
|
pSAVE->pEntries = pEntry;
|
|
}
|
|
|
|
while (iLen) /* anything left ? */
|
|
{
|
|
iEtype = *pTemp; /* entrytype */
|
|
|
|
if ((iEtype != 0) && (iEtype != 1) && (iEtype != 2) && (iEtype != 3))
|
|
MNG_ERROR (pData, MNG_INVENTRYTYPE);
|
|
|
|
pTemp++;
|
|
|
|
if (iEtype > 1)
|
|
{
|
|
iOffset [0] = 0;
|
|
iOffset [1] = 0;
|
|
iStarttime [0] = 0;
|
|
iStarttime [1] = 0;
|
|
iLayernr = 0;
|
|
iFramenr = 0;
|
|
}
|
|
else
|
|
{
|
|
if (iOtype == 4)
|
|
{
|
|
iOffset [0] = 0;
|
|
iOffset [1] = mng_get_uint32 (pTemp);
|
|
|
|
pTemp += 4;
|
|
}
|
|
else
|
|
{
|
|
iOffset [0] = mng_get_uint32 (pTemp);
|
|
iOffset [1] = mng_get_uint32 (pTemp+4);
|
|
|
|
pTemp += 8;
|
|
}
|
|
|
|
if (iEtype > 0)
|
|
{
|
|
iStarttime [0] = 0;
|
|
iStarttime [1] = 0;
|
|
iLayernr = 0;
|
|
iFramenr = 0;
|
|
}
|
|
else
|
|
{
|
|
if (iOtype == 4)
|
|
{
|
|
iStarttime [0] = 0;
|
|
iStarttime [1] = mng_get_uint32 (pTemp+0);
|
|
iLayernr = mng_get_uint32 (pTemp+4);
|
|
iFramenr = mng_get_uint32 (pTemp+8);
|
|
|
|
pTemp += 12;
|
|
}
|
|
else
|
|
{
|
|
iStarttime [0] = mng_get_uint32 (pTemp+0);
|
|
iStarttime [1] = mng_get_uint32 (pTemp+4);
|
|
iLayernr = mng_get_uint32 (pTemp+8);
|
|
iFramenr = mng_get_uint32 (pTemp+12);
|
|
|
|
pTemp += 16;
|
|
}
|
|
}
|
|
}
|
|
|
|
pNull = pTemp; /* get the name length */
|
|
while (*pNull)
|
|
pNull++;
|
|
|
|
if ((pNull - pRawdata) > (mng_int32)iRawlen)
|
|
{
|
|
iNamesize = iLen; /* no null found; so end of SAVE */
|
|
iLen = 0;
|
|
}
|
|
else
|
|
{
|
|
iNamesize = pNull - pTemp; /* should be another entry */
|
|
iLen -= iNamesize;
|
|
|
|
if (!iLen) /* must not end with a null ! */
|
|
MNG_ERROR (pData, MNG_ENDWITHNULL);
|
|
}
|
|
|
|
if (!pEntry)
|
|
{
|
|
iCount++;
|
|
}
|
|
else
|
|
{
|
|
pEntry->iEntrytype = iEtype;
|
|
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, pTemp, iNamesize);
|
|
}
|
|
|
|
pEntry++;
|
|
}
|
|
|
|
pTemp += iNamesize;
|
|
}
|
|
}
|
|
|
|
*piRawlen = 0;
|
|
|
|
return MNG_NOERROR;
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_SAVE
|
|
MNG_C_SPECIALFUNC (mng_special_save)
|
|
{
|
|
pData->bHasSAVE = MNG_TRUE;
|
|
|
|
if (pData->fProcesssave) /* inform the application ? */
|
|
{
|
|
mng_bool bOke = pData->fProcesssave ((mng_handle)pData);
|
|
if (!bOke)
|
|
MNG_ERROR (pData, MNG_APPMISCERROR);
|
|
}
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
{
|
|
mng_retcode iRetcode;
|
|
|
|
/* TODO: something with the parameters */
|
|
|
|
/* create a SAVE animation object */
|
|
iRetcode = mng_create_ani_save (pData);
|
|
if (!iRetcode) /* process it */
|
|
iRetcode = mng_process_display_save (pData);
|
|
if (iRetcode) /* on error bail out */
|
|
return iRetcode;
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_SEEK
|
|
MNG_C_SPECIALFUNC (mng_special_seek)
|
|
{
|
|
mng_retcode iRetcode;
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
/* create a SEEK animation object */
|
|
iRetcode = mng_create_ani_seek (pData, pChunk);
|
|
if (iRetcode) /* on error bail out */
|
|
return iRetcode;
|
|
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
if (pData->fProcessseek) /* inform the app ? */
|
|
if (!pData->fProcessseek ((mng_handle)pData, ((mng_seekp)pChunk)->zName))
|
|
MNG_ERROR (pData, MNG_APPMISCERROR);
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
return mng_process_display_seek (pData);
|
|
#else
|
|
return MNG_NOERROR;
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_eXPI
|
|
MNG_C_SPECIALFUNC (mng_special_expi)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
{
|
|
|
|
|
|
/* TODO: something !!! */
|
|
|
|
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_fPRI
|
|
MNG_C_SPECIALFUNC (mng_special_fpri)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
{
|
|
|
|
|
|
/* TODO: something !!! */
|
|
|
|
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_nEED
|
|
MNG_LOCAL mng_bool CheckKeyword (mng_datap pData,
|
|
mng_uint8p pKeyword)
|
|
{
|
|
mng_chunkid handled_chunks [] =
|
|
{
|
|
MNG_UINT_BACK, /* keep it sorted !!!! */
|
|
MNG_UINT_BASI,
|
|
MNG_UINT_CLIP,
|
|
MNG_UINT_CLON,
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
/* TODO: MNG_UINT_DBYK, */
|
|
#endif
|
|
MNG_UINT_DEFI,
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
MNG_UINT_DHDR,
|
|
#endif
|
|
MNG_UINT_DISC,
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
/* TODO: MNG_UINT_DROP, */
|
|
#endif
|
|
MNG_UINT_ENDL,
|
|
MNG_UINT_FRAM,
|
|
MNG_UINT_IDAT,
|
|
MNG_UINT_IEND,
|
|
MNG_UINT_IHDR,
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
#ifdef MNG_INCLUDE_JNG
|
|
MNG_UINT_IJNG,
|
|
#endif
|
|
MNG_UINT_IPNG,
|
|
#endif
|
|
#ifdef MNG_INCLUDE_JNG
|
|
MNG_UINT_JDAA,
|
|
MNG_UINT_JDAT,
|
|
MNG_UINT_JHDR,
|
|
/* TODO: MNG_UINT_JSEP, */
|
|
MNG_UINT_JdAA,
|
|
#endif
|
|
MNG_UINT_LOOP,
|
|
MNG_UINT_MAGN,
|
|
MNG_UINT_MEND,
|
|
MNG_UINT_MHDR,
|
|
MNG_UINT_MOVE,
|
|
/* TODO: MNG_UINT_ORDR, */
|
|
MNG_UINT_PAST,
|
|
MNG_UINT_PLTE,
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
MNG_UINT_PPLT,
|
|
MNG_UINT_PROM,
|
|
#endif
|
|
MNG_UINT_SAVE,
|
|
MNG_UINT_SEEK,
|
|
MNG_UINT_SHOW,
|
|
MNG_UINT_TERM,
|
|
MNG_UINT_bKGD,
|
|
MNG_UINT_cHRM,
|
|
/* TODO: MNG_UINT_eXPI, */
|
|
MNG_UINT_evNT,
|
|
/* TODO: MNG_UINT_fPRI, */
|
|
MNG_UINT_gAMA,
|
|
/* TODO: MNG_UINT_hIST, */
|
|
MNG_UINT_iCCP,
|
|
MNG_UINT_iTXt,
|
|
MNG_UINT_nEED,
|
|
/* TODO: MNG_UINT_oFFs, */
|
|
/* TODO: MNG_UINT_pCAL, */
|
|
/* TODO: MNG_UINT_pHYg, */
|
|
/* TODO: MNG_UINT_pHYs, */
|
|
/* TODO: MNG_UINT_sBIT, */
|
|
/* TODO: MNG_UINT_sCAL, */
|
|
/* TODO: MNG_UINT_sPLT, */
|
|
MNG_UINT_sRGB,
|
|
MNG_UINT_tEXt,
|
|
MNG_UINT_tIME,
|
|
MNG_UINT_tRNS,
|
|
MNG_UINT_zTXt,
|
|
};
|
|
|
|
mng_bool bOke = MNG_FALSE;
|
|
|
|
if (pData->fProcessneed) /* does the app handle it ? */
|
|
bOke = pData->fProcessneed ((mng_handle)pData, (mng_pchar)pKeyword);
|
|
|
|
if (!bOke)
|
|
{ /* find the keyword length */
|
|
mng_uint8p pNull = pKeyword;
|
|
while (*pNull)
|
|
pNull++;
|
|
|
|
if ((pNull - pKeyword) == 4) /* test a chunk ? */
|
|
{ /* get the chunk-id */
|
|
mng_chunkid iChunkid = (*pKeyword << 24) + (*(pKeyword+1) << 16) +
|
|
(*(pKeyword+2) << 8) + (*(pKeyword+3) );
|
|
/* binary search variables */
|
|
mng_int32 iTop, iLower, iUpper, iMiddle;
|
|
/* determine max index of table */
|
|
iTop = (sizeof (handled_chunks) / sizeof (handled_chunks [0])) - 1;
|
|
|
|
/* binary search; with 52 chunks, worst-case is 7 comparisons */
|
|
iLower = 0;
|
|
iMiddle = iTop >> 1;
|
|
iUpper = iTop;
|
|
|
|
do /* the binary search itself */
|
|
{
|
|
if (handled_chunks [iMiddle] < iChunkid)
|
|
iLower = iMiddle + 1;
|
|
else if (handled_chunks [iMiddle] > iChunkid)
|
|
iUpper = iMiddle - 1;
|
|
else
|
|
{
|
|
bOke = MNG_TRUE;
|
|
break;
|
|
}
|
|
|
|
iMiddle = (iLower + iUpper) >> 1;
|
|
}
|
|
while (iLower <= iUpper);
|
|
}
|
|
/* test draft ? */
|
|
if ((!bOke) && ((pNull - pKeyword) == 8) &&
|
|
(*pKeyword == 'd') && (*(pKeyword+1) == 'r') &&
|
|
(*(pKeyword+2) == 'a') && (*(pKeyword+3) == 'f') &&
|
|
(*(pKeyword+4) == 't') && (*(pKeyword+5) == ' '))
|
|
{
|
|
mng_uint32 iDraft;
|
|
|
|
iDraft = (*(pKeyword+6) - '0') * 10 + (*(pKeyword+7) - '0');
|
|
bOke = (mng_bool)(iDraft <= MNG_MNG_DRAFT);
|
|
}
|
|
/* test MNG 1.0/1.1 ? */
|
|
if ((!bOke) && ((pNull - pKeyword) == 7) &&
|
|
(*pKeyword == 'M') && (*(pKeyword+1) == 'N') &&
|
|
(*(pKeyword+2) == 'G') && (*(pKeyword+3) == '-') &&
|
|
(*(pKeyword+4) == '1') && (*(pKeyword+5) == '.') &&
|
|
((*(pKeyword+6) == '0') || (*(pKeyword+6) == '1')))
|
|
bOke = MNG_TRUE;
|
|
/* test CACHEOFF ? */
|
|
if ((!bOke) && ((pNull - pKeyword) == 8) &&
|
|
(*pKeyword == 'C') && (*(pKeyword+1) == 'A') &&
|
|
(*(pKeyword+2) == 'C') && (*(pKeyword+3) == 'H') &&
|
|
(*(pKeyword+4) == 'E') && (*(pKeyword+5) == 'O') &&
|
|
(*(pKeyword+6) == 'F') && (*(pKeyword+7) == 'F'))
|
|
{
|
|
if (!pData->pFirstaniobj) /* only if caching hasn't started yet ! */
|
|
{
|
|
bOke = MNG_TRUE;
|
|
pData->bCacheplayback = MNG_FALSE;
|
|
pData->bStorechunks = MNG_FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
return bOke;
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_nEED
|
|
MNG_C_SPECIALFUNC (mng_special_need)
|
|
{
|
|
/* let's check it */
|
|
mng_bool bOke = MNG_TRUE;
|
|
mng_uint8p pNull, pTemp, pMax;
|
|
|
|
pTemp = (mng_uint8p)((mng_needp)pChunk)->zKeywords;
|
|
pMax = (mng_uint8p)(pTemp + ((mng_needp)pChunk)->iKeywordssize);
|
|
pNull = pTemp;
|
|
while (*pNull)
|
|
pNull++;
|
|
|
|
while ((bOke) && (pNull < pMax))
|
|
{
|
|
bOke = CheckKeyword (pData, pTemp);
|
|
pTemp = pNull + 1;
|
|
pNull = pTemp;
|
|
while (*pNull)
|
|
pNull++;
|
|
}
|
|
|
|
if (bOke)
|
|
bOke = CheckKeyword (pData, pTemp);
|
|
|
|
if (!bOke)
|
|
MNG_ERROR (pData, MNG_UNSUPPORTEDNEED);
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_pHYg
|
|
MNG_C_SPECIALFUNC (mng_special_phyg)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
{
|
|
|
|
|
|
/* TODO: something !!! */
|
|
|
|
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
MNG_C_SPECIALFUNC (mng_special_dhdr)
|
|
{
|
|
if ((((mng_dhdrp)pChunk)->iDeltatype == MNG_DELTATYPE_REPLACE) && (((mng_dhdrp)pChunk)->bHasblockloc))
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
if ((((mng_dhdrp)pChunk)->iDeltatype == MNG_DELTATYPE_NOCHANGE) && (((mng_dhdrp)pChunk)->bHasblocksize))
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
|
|
pData->bHasDHDR = MNG_TRUE; /* inside a DHDR-IEND block now */
|
|
pData->iDeltatype = ((mng_dhdrp)pChunk)->iDeltatype;
|
|
|
|
pData->iImagelevel++; /* one level deeper */
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
return mng_create_ani_dhdr (pData, pChunk);
|
|
#else
|
|
return MNG_NOERROR;
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
MNG_C_SPECIALFUNC (mng_special_prom)
|
|
{
|
|
if ((((mng_promp)pChunk)->iColortype != MNG_COLORTYPE_GRAY ) &&
|
|
(((mng_promp)pChunk)->iColortype != MNG_COLORTYPE_RGB ) &&
|
|
(((mng_promp)pChunk)->iColortype != MNG_COLORTYPE_INDEXED) &&
|
|
(((mng_promp)pChunk)->iColortype != MNG_COLORTYPE_GRAYA ) &&
|
|
(((mng_promp)pChunk)->iColortype != MNG_COLORTYPE_RGBA ) )
|
|
MNG_ERROR (pData, MNG_INVALIDCOLORTYPE);
|
|
|
|
#ifdef MNG_NO_16BIT_SUPPORT
|
|
if (((mng_promp)pChunk)->iSampledepth == MNG_BITDEPTH_16 )
|
|
((mng_promp)pChunk)->iSampledepth = MNG_BITDEPTH_8;
|
|
#endif
|
|
|
|
if ((((mng_promp)pChunk)->iSampledepth != MNG_BITDEPTH_1 ) &&
|
|
(((mng_promp)pChunk)->iSampledepth != MNG_BITDEPTH_2 ) &&
|
|
(((mng_promp)pChunk)->iSampledepth != MNG_BITDEPTH_4 ) &&
|
|
(((mng_promp)pChunk)->iSampledepth != MNG_BITDEPTH_8 )
|
|
#ifndef MNG_NO_16BIT_SUPPORT
|
|
&& (((mng_promp)pChunk)->iSampledepth != MNG_BITDEPTH_16)
|
|
#endif
|
|
)
|
|
MNG_ERROR (pData, MNG_INVSAMPLEDEPTH);
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
{
|
|
mng_retcode iRetcode = mng_create_ani_prom (pData, pChunk);
|
|
if (iRetcode) /* on error bail out */
|
|
return iRetcode;
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
MNG_C_SPECIALFUNC (mng_special_ipng)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
mng_retcode iRetcode = mng_create_ani_ipng (pData);
|
|
if (!iRetcode) /* process it */
|
|
iRetcode = mng_process_display_ipng (pData);
|
|
if (iRetcode) /* on error bail out */
|
|
return iRetcode;
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
MNG_F_SPECIALFUNC (mng_pplt_entries)
|
|
{
|
|
mng_ppltp pPPLT = (mng_ppltp)pChunk;
|
|
mng_uint32 iRawlen = *piRawlen;
|
|
mng_uint8p pRawdata = *ppRawdata;
|
|
mng_uint8 iDeltatype = pPPLT->iDeltatype;
|
|
mng_uint32 iMax = 0;
|
|
mng_int32 iX, iY, iM;
|
|
mng_rgbpaltab aIndexentries;
|
|
mng_uint8arr aAlphaentries;
|
|
mng_uint8arr aUsedentries;
|
|
/* must be indexed color ! */
|
|
if (pData->iColortype != MNG_COLORTYPE_INDEXED)
|
|
MNG_ERROR (pData, MNG_INVALIDCOLORTYPE);
|
|
|
|
for (iY = 255; iY >= 0; iY--) /* reset arrays */
|
|
{
|
|
aIndexentries [iY].iRed = 0;
|
|
aIndexentries [iY].iGreen = 0;
|
|
aIndexentries [iY].iBlue = 0;
|
|
aAlphaentries [iY] = 255;
|
|
aUsedentries [iY] = 0;
|
|
}
|
|
|
|
while (iRawlen) /* as long as there are entries left ... */
|
|
{
|
|
mng_uint32 iDiff;
|
|
|
|
if (iRawlen < 2)
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
|
|
iX = (mng_int32)(*pRawdata); /* get start and end index */
|
|
iM = (mng_int32)(*(pRawdata+1));
|
|
|
|
if (iM < iX)
|
|
MNG_ERROR (pData, MNG_INVALIDINDEX);
|
|
|
|
if (iM >= (mng_int32) iMax) /* determine highest used index */
|
|
iMax = iM + 1;
|
|
|
|
pRawdata += 2;
|
|
iRawlen -= 2;
|
|
iDiff = (iM - iX + 1);
|
|
if ((iDeltatype == MNG_DELTATYPE_REPLACERGB ) ||
|
|
(iDeltatype == MNG_DELTATYPE_DELTARGB ) )
|
|
iDiff = iDiff * 3;
|
|
else
|
|
if ((iDeltatype == MNG_DELTATYPE_REPLACERGBA) ||
|
|
(iDeltatype == MNG_DELTATYPE_DELTARGBA ) )
|
|
iDiff = iDiff * 4;
|
|
|
|
if (iRawlen < iDiff)
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
|
|
if ((iDeltatype == MNG_DELTATYPE_REPLACERGB ) ||
|
|
(iDeltatype == MNG_DELTATYPE_DELTARGB ) )
|
|
{
|
|
for (iY = iX; iY <= iM; iY++)
|
|
{
|
|
aIndexentries [iY].iRed = *pRawdata;
|
|
aIndexentries [iY].iGreen = *(pRawdata+1);
|
|
aIndexentries [iY].iBlue = *(pRawdata+2);
|
|
aUsedentries [iY] = 1;
|
|
|
|
pRawdata += 3;
|
|
iRawlen -= 3;
|
|
}
|
|
}
|
|
else
|
|
if ((iDeltatype == MNG_DELTATYPE_REPLACEALPHA) ||
|
|
(iDeltatype == MNG_DELTATYPE_DELTAALPHA ) )
|
|
{
|
|
for (iY = iX; iY <= iM; iY++)
|
|
{
|
|
aAlphaentries [iY] = *pRawdata;
|
|
aUsedentries [iY] = 1;
|
|
|
|
pRawdata++;
|
|
iRawlen--;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (iY = iX; iY <= iM; iY++)
|
|
{
|
|
aIndexentries [iY].iRed = *pRawdata;
|
|
aIndexentries [iY].iGreen = *(pRawdata+1);
|
|
aIndexentries [iY].iBlue = *(pRawdata+2);
|
|
aAlphaentries [iY] = *(pRawdata+3);
|
|
aUsedentries [iY] = 1;
|
|
|
|
pRawdata += 4;
|
|
iRawlen -= 4;
|
|
}
|
|
}
|
|
}
|
|
|
|
switch (pData->iBitdepth) /* check maximum allowed entries for bitdepth */
|
|
{
|
|
case MNG_BITDEPTH_1 : {
|
|
if (iMax > 2)
|
|
MNG_ERROR (pData, MNG_INVALIDINDEX);
|
|
break;
|
|
}
|
|
case MNG_BITDEPTH_2 : {
|
|
if (iMax > 4)
|
|
MNG_ERROR (pData, MNG_INVALIDINDEX);
|
|
break;
|
|
}
|
|
case MNG_BITDEPTH_4 : {
|
|
if (iMax > 16)
|
|
MNG_ERROR (pData, MNG_INVALIDINDEX);
|
|
break;
|
|
}
|
|
}
|
|
|
|
pPPLT->iCount = iMax;
|
|
|
|
for (iY = 255; iY >= 0; iY--)
|
|
{
|
|
pPPLT->aEntries [iY].iRed = aIndexentries [iY].iRed;
|
|
pPPLT->aEntries [iY].iGreen = aIndexentries [iY].iGreen;
|
|
pPPLT->aEntries [iY].iBlue = aIndexentries [iY].iBlue;
|
|
pPPLT->aEntries [iY].iAlpha = aAlphaentries [iY];
|
|
pPPLT->aEntries [iY].bUsed = (mng_bool)(aUsedentries [iY]);
|
|
}
|
|
|
|
{ /* create animation object */
|
|
mng_retcode iRetcode = mng_create_ani_pplt (pData, iDeltatype, iMax,
|
|
aIndexentries, aAlphaentries,
|
|
aUsedentries);
|
|
if (iRetcode)
|
|
return iRetcode;
|
|
}
|
|
|
|
*piRawlen = 0;
|
|
|
|
return MNG_NOERROR;
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
MNG_C_SPECIALFUNC (mng_special_pplt)
|
|
{
|
|
return MNG_NOERROR;
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
#ifdef MNG_INCLUDE_JNG
|
|
MNG_C_SPECIALFUNC (mng_special_ijng)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
mng_retcode iRetcode = mng_create_ani_ijng (pData);
|
|
if (!iRetcode) /* process it */
|
|
iRetcode = mng_process_display_ijng (pData);
|
|
return iRetcode;
|
|
#else
|
|
return MNG_NOERROR; /* done */
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
MNG_F_SPECIALFUNC (mng_drop_entries)
|
|
{
|
|
mng_dropp pDROP = (mng_dropp)pChunk;
|
|
mng_uint32 iRawlen = *piRawlen;
|
|
mng_uint8p pRawdata = *ppRawdata;
|
|
mng_uint32 iX;
|
|
mng_uint32p pEntry;
|
|
/* check length */
|
|
if ((iRawlen < 4) || ((iRawlen % 4) != 0))
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
|
|
MNG_ALLOC (pData, pEntry, iRawlen);
|
|
pDROP->iCount = iRawlen / 4;
|
|
pDROP->pChunknames = (mng_ptr)pEntry;
|
|
|
|
for (iX = pDROP->iCount; iX > 0; iX--)
|
|
{
|
|
*pEntry++ = mng_get_uint32 (pRawdata);
|
|
pRawdata += 4;
|
|
}
|
|
|
|
*piRawlen = 0;
|
|
|
|
return MNG_NOERROR;
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
MNG_C_SPECIALFUNC (mng_special_drop)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
{
|
|
|
|
|
|
/* TODO: something !!! */
|
|
|
|
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
#ifndef MNG_SKIPCHUNK_DBYK
|
|
MNG_C_SPECIALFUNC (mng_special_dbyk)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
{
|
|
|
|
|
|
/* TODO: something !!! */
|
|
|
|
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
#ifndef MNG_SKIPCHUNK_ORDR
|
|
MNG_F_SPECIALFUNC (mng_ordr_entries)
|
|
{
|
|
mng_ordrp pORDR = (mng_ordrp)pChunk;
|
|
mng_uint32 iRawlen = *piRawlen;
|
|
mng_uint8p pRawdata = *ppRawdata;
|
|
mng_uint32 iX;
|
|
mng_ordr_entryp pEntry;
|
|
/* check length */
|
|
if ((iRawlen < 5) || ((iRawlen % 5) != 0))
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
|
|
MNG_ALLOC (pData, pEntry, iRawlen);
|
|
pORDR->iCount = iRawlen / 5;
|
|
pORDR->pEntries = (mng_ptr)pEntry;
|
|
|
|
for (iX = pORDR->iCount; iX > 0; iX--)
|
|
{
|
|
pEntry->iChunkname = mng_get_uint32 (pRawdata);
|
|
pEntry->iOrdertype = *(pRawdata+4);
|
|
pEntry++;
|
|
pRawdata += 5;
|
|
}
|
|
|
|
*piRawlen = 0;
|
|
|
|
return MNG_NOERROR;
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_NO_DELTA_PNG
|
|
#ifndef MNG_SKIPCHUNK_ORDR
|
|
MNG_C_SPECIALFUNC (mng_special_ordr)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
{
|
|
|
|
|
|
/* TODO: something !!! */
|
|
|
|
|
|
}
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_MAGN
|
|
MNG_F_SPECIALFUNC (mng_debunk_magn)
|
|
{
|
|
mng_magnp pMAGN = (mng_magnp)pChunk;
|
|
mng_uint32 iRawlen = *piRawlen;
|
|
mng_uint8p pRawdata = *ppRawdata;
|
|
mng_bool bFaulty;
|
|
/* check length */
|
|
if (iRawlen > 20)
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
|
|
/* following is an ugly hack to allow faulty layout caused by previous
|
|
versions of libmng and MNGeye, which wrote MAGN with a 16-bit
|
|
MethodX/MethodY (as opposed to the proper 8-bit as defined in the spec!) */
|
|
|
|
if ((iRawlen == 6) || (iRawlen == 8) || (iRawlen == 10) || (iRawlen == 12) ||
|
|
(iRawlen == 14) || (iRawlen == 16) || (iRawlen == 20))
|
|
bFaulty = MNG_TRUE; /* these lengths are all wrong */
|
|
else /* length 18 can be right or wrong !!! */
|
|
if ((iRawlen == 18) && (mng_get_uint16 (pRawdata+4) <= 5) &&
|
|
(mng_get_uint16 (pRawdata+6) < 256) &&
|
|
(mng_get_uint16 (pRawdata+8) < 256) &&
|
|
(mng_get_uint16 (pRawdata+10) < 256) &&
|
|
(mng_get_uint16 (pRawdata+12) < 256) &&
|
|
(mng_get_uint16 (pRawdata+14) < 256) &&
|
|
(mng_get_uint16 (pRawdata+16) < 256))
|
|
bFaulty = MNG_TRUE; /* this is very likely the wrong layout */
|
|
else
|
|
bFaulty = MNG_FALSE; /* all other cases are handled as right */
|
|
|
|
if (bFaulty) /* wrong layout ? */
|
|
{
|
|
if (iRawlen > 0) /* get the fields */
|
|
pMAGN->iFirstid = mng_get_uint16 (pRawdata);
|
|
else
|
|
pMAGN->iFirstid = 0;
|
|
|
|
if (iRawlen > 2)
|
|
pMAGN->iLastid = mng_get_uint16 (pRawdata+2);
|
|
else
|
|
pMAGN->iLastid = pMAGN->iFirstid;
|
|
|
|
if (iRawlen > 4)
|
|
pMAGN->iMethodX = (mng_uint8)(mng_get_uint16 (pRawdata+4));
|
|
else
|
|
pMAGN->iMethodX = 0;
|
|
|
|
if (iRawlen > 6)
|
|
pMAGN->iMX = mng_get_uint16 (pRawdata+6);
|
|
else
|
|
pMAGN->iMX = 1;
|
|
|
|
if (iRawlen > 8)
|
|
pMAGN->iMY = mng_get_uint16 (pRawdata+8);
|
|
else
|
|
pMAGN->iMY = pMAGN->iMX;
|
|
|
|
if (iRawlen > 10)
|
|
pMAGN->iML = mng_get_uint16 (pRawdata+10);
|
|
else
|
|
pMAGN->iML = pMAGN->iMX;
|
|
|
|
if (iRawlen > 12)
|
|
pMAGN->iMR = mng_get_uint16 (pRawdata+12);
|
|
else
|
|
pMAGN->iMR = pMAGN->iMX;
|
|
|
|
if (iRawlen > 14)
|
|
pMAGN->iMT = mng_get_uint16 (pRawdata+14);
|
|
else
|
|
pMAGN->iMT = pMAGN->iMY;
|
|
|
|
if (iRawlen > 16)
|
|
pMAGN->iMB = mng_get_uint16 (pRawdata+16);
|
|
else
|
|
pMAGN->iMB = pMAGN->iMY;
|
|
|
|
if (iRawlen > 18)
|
|
pMAGN->iMethodY = (mng_uint8)(mng_get_uint16 (pRawdata+18));
|
|
else
|
|
pMAGN->iMethodY = pMAGN->iMethodX;
|
|
}
|
|
else /* proper layout !!!! */
|
|
{
|
|
if (iRawlen > 0) /* get the fields */
|
|
pMAGN->iFirstid = mng_get_uint16 (pRawdata);
|
|
else
|
|
pMAGN->iFirstid = 0;
|
|
|
|
if (iRawlen > 2)
|
|
pMAGN->iLastid = mng_get_uint16 (pRawdata+2);
|
|
else
|
|
pMAGN->iLastid = pMAGN->iFirstid;
|
|
|
|
if (iRawlen > 4)
|
|
pMAGN->iMethodX = *(pRawdata+4);
|
|
else
|
|
pMAGN->iMethodX = 0;
|
|
|
|
if (iRawlen > 5)
|
|
pMAGN->iMX = mng_get_uint16 (pRawdata+5);
|
|
else
|
|
pMAGN->iMX = 1;
|
|
|
|
if (iRawlen > 7)
|
|
pMAGN->iMY = mng_get_uint16 (pRawdata+7);
|
|
else
|
|
pMAGN->iMY = pMAGN->iMX;
|
|
|
|
if (iRawlen > 9)
|
|
pMAGN->iML = mng_get_uint16 (pRawdata+9);
|
|
else
|
|
pMAGN->iML = pMAGN->iMX;
|
|
|
|
if (iRawlen > 11)
|
|
pMAGN->iMR = mng_get_uint16 (pRawdata+11);
|
|
else
|
|
pMAGN->iMR = pMAGN->iMX;
|
|
|
|
if (iRawlen > 13)
|
|
pMAGN->iMT = mng_get_uint16 (pRawdata+13);
|
|
else
|
|
pMAGN->iMT = pMAGN->iMY;
|
|
|
|
if (iRawlen > 15)
|
|
pMAGN->iMB = mng_get_uint16 (pRawdata+15);
|
|
else
|
|
pMAGN->iMB = pMAGN->iMY;
|
|
|
|
if (iRawlen > 17)
|
|
pMAGN->iMethodY = *(pRawdata+17);
|
|
else
|
|
pMAGN->iMethodY = pMAGN->iMethodX;
|
|
}
|
|
/* check field validity */
|
|
if ((pMAGN->iMethodX > 5) || (pMAGN->iMethodY > 5))
|
|
MNG_ERROR (pData, MNG_INVALIDMETHOD);
|
|
|
|
*piRawlen = 0;
|
|
|
|
return MNG_NOERROR;
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_MAGN
|
|
MNG_C_SPECIALFUNC (mng_special_magn)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
return mng_create_ani_magn (pData, pChunk);
|
|
#else
|
|
return MNG_NOERROR;
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_evNT
|
|
MNG_F_SPECIALFUNC (mng_evnt_entries)
|
|
{
|
|
mng_evntp pEVNT = (mng_evntp)pChunk;
|
|
mng_uint32 iRawlen;
|
|
mng_uint8p pRawdata;
|
|
#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_SUPPORT_DYNAMICMNG)
|
|
mng_retcode iRetcode;
|
|
#endif
|
|
mng_uint8p pNull;
|
|
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 iNamesize;
|
|
mng_uint32 iCount = 0;
|
|
mng_evnt_entryp pEntry = MNG_NULL;
|
|
mng_uint32 iX;
|
|
|
|
for (iX = 0; iX < 2; iX++)
|
|
{
|
|
iRawlen = *piRawlen;
|
|
pRawdata = *ppRawdata;
|
|
|
|
if (iX) /* second run ? */
|
|
{
|
|
MNG_ALLOC (pData, pEntry, (iCount * sizeof (mng_evnt_entry)));
|
|
pEVNT->iCount = iCount;
|
|
pEVNT->pEntries = pEntry;
|
|
}
|
|
|
|
while (iRawlen) /* anything left ? */
|
|
{
|
|
if (iRawlen < 2) /* must have at least 2 bytes ! */
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
|
|
iEventtype = *pRawdata; /* eventtype */
|
|
if (iEventtype > 5)
|
|
MNG_ERROR (pData, MNG_INVALIDEVENT);
|
|
|
|
pRawdata++;
|
|
|
|
iMasktype = *pRawdata; /* masktype */
|
|
if (iMasktype > 5)
|
|
MNG_ERROR (pData, MNG_INVALIDMASK);
|
|
|
|
pRawdata++;
|
|
iRawlen -= 2;
|
|
|
|
iLeft = 0;
|
|
iRight = 0;
|
|
iTop = 0;
|
|
iBottom = 0;
|
|
iObjectid = 0;
|
|
iIndex = 0;
|
|
|
|
switch (iMasktype)
|
|
{
|
|
case 1 :
|
|
{
|
|
if (iRawlen > 16)
|
|
{
|
|
iLeft = mng_get_int32 (pRawdata);
|
|
iRight = mng_get_int32 (pRawdata+4);
|
|
iTop = mng_get_int32 (pRawdata+8);
|
|
iBottom = mng_get_int32 (pRawdata+12);
|
|
pRawdata += 16;
|
|
iRawlen -= 16;
|
|
}
|
|
else
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
break;
|
|
}
|
|
case 2 :
|
|
{
|
|
if (iRawlen > 2)
|
|
{
|
|
iObjectid = mng_get_uint16 (pRawdata);
|
|
pRawdata += 2;
|
|
iRawlen -= 2;
|
|
}
|
|
else
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
break;
|
|
}
|
|
case 3 :
|
|
{
|
|
if (iRawlen > 3)
|
|
{
|
|
iObjectid = mng_get_uint16 (pRawdata);
|
|
iIndex = *(pRawdata+2);
|
|
pRawdata += 3;
|
|
iRawlen -= 3;
|
|
}
|
|
else
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
break;
|
|
}
|
|
case 4 :
|
|
{
|
|
if (iRawlen > 18)
|
|
{
|
|
iLeft = mng_get_int32 (pRawdata);
|
|
iRight = mng_get_int32 (pRawdata+4);
|
|
iTop = mng_get_int32 (pRawdata+8);
|
|
iBottom = mng_get_int32 (pRawdata+12);
|
|
iObjectid = mng_get_uint16 (pRawdata+16);
|
|
pRawdata += 18;
|
|
iRawlen -= 18;
|
|
}
|
|
else
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
break;
|
|
}
|
|
case 5 :
|
|
{
|
|
if (iRawlen > 19)
|
|
{
|
|
iLeft = mng_get_int32 (pRawdata);
|
|
iRight = mng_get_int32 (pRawdata+4);
|
|
iTop = mng_get_int32 (pRawdata+8);
|
|
iBottom = mng_get_int32 (pRawdata+12);
|
|
iObjectid = mng_get_uint16 (pRawdata+16);
|
|
iIndex = *(pRawdata+18);
|
|
pRawdata += 19;
|
|
iRawlen -= 19;
|
|
}
|
|
else
|
|
MNG_ERROR (pData, MNG_INVALIDLENGTH);
|
|
break;
|
|
}
|
|
}
|
|
|
|
pNull = pRawdata; /* get the name length */
|
|
while (*pNull)
|
|
pNull++;
|
|
|
|
if ((pNull - pRawdata) > (mng_int32)iRawlen)
|
|
{
|
|
iNamesize = iRawlen; /* no null found; so end of evNT */
|
|
iRawlen = 0;
|
|
}
|
|
else
|
|
{
|
|
iNamesize = pNull - pRawdata; /* should be another entry */
|
|
iRawlen = iRawlen - iNamesize - 1;
|
|
|
|
if (!iRawlen) /* must not end with a null ! */
|
|
MNG_ERROR (pData, MNG_ENDWITHNULL);
|
|
}
|
|
|
|
if (!iX)
|
|
{
|
|
iCount++;
|
|
}
|
|
else
|
|
{
|
|
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 = iNamesize;
|
|
|
|
if (iNamesize)
|
|
{
|
|
MNG_ALLOC (pData, pEntry->zSegmentname, iNamesize+1);
|
|
MNG_COPY (pEntry->zSegmentname, pRawdata, iNamesize);
|
|
}
|
|
|
|
#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_SUPPORT_DYNAMICMNG)
|
|
iRetcode = mng_create_event (pData, (mng_ptr)pEntry);
|
|
if (iRetcode) /* on error bail out */
|
|
return iRetcode;
|
|
#endif
|
|
|
|
pEntry++;
|
|
}
|
|
|
|
pRawdata = pRawdata + iNamesize + 1;
|
|
}
|
|
}
|
|
|
|
*piRawlen = 0;
|
|
|
|
return MNG_NOERROR;
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifndef MNG_SKIPCHUNK_evNT
|
|
MNG_C_SPECIALFUNC (mng_special_evnt)
|
|
{
|
|
return MNG_NOERROR;
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifdef MNG_INCLUDE_MPNG_PROPOSAL
|
|
MNG_C_SPECIALFUNC (mng_special_mpng)
|
|
{
|
|
if ((pData->eImagetype != mng_it_png) && (pData->eImagetype != mng_it_jng))
|
|
MNG_ERROR (pData, MNG_CHUNKNOTALLOWED);
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
return mng_create_mpng_obj (pData, pChunk);
|
|
#else
|
|
return MNG_NOERROR;
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifdef MNG_INCLUDE_ANG_PROPOSAL
|
|
MNG_C_SPECIALFUNC (mng_special_ahdr)
|
|
{
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
return mng_create_ang_obj (pData, pChunk);
|
|
#else
|
|
return MNG_NOERROR;
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifdef MNG_INCLUDE_ANG_PROPOSAL
|
|
MNG_F_SPECIALFUNC (mng_adat_tiles)
|
|
{
|
|
if ((pData->eImagetype != mng_it_ang) || (!pData->pANG))
|
|
MNG_ERROR (pData, MNG_CHUNKNOTALLOWED);
|
|
|
|
{
|
|
mng_adatp pADAT = (mng_adatp)pChunk;
|
|
mng_ang_objp pANG = (mng_ang_objp)pData->pANG;
|
|
mng_uint32 iRawlen = *piRawlen;
|
|
mng_uint8p pRawdata = *ppRawdata;
|
|
mng_retcode iRetcode;
|
|
mng_uint8p pBuf;
|
|
mng_uint32 iBufsize;
|
|
mng_uint32 iRealsize;
|
|
mng_uint8p pTemp;
|
|
mng_uint8p pTemp2;
|
|
mng_int32 iX;
|
|
mng_int32 iSize;
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
mng_imagep pImage;
|
|
mng_int32 iTemplen;
|
|
mng_uint8p pSwap;
|
|
|
|
mng_processobject pProcess;
|
|
|
|
mng_uint32 iSavedatawidth;
|
|
mng_uint32 iSavedataheight;
|
|
|
|
mng_fptr fSaveinitrowproc;
|
|
mng_fptr fSavestorerow;
|
|
mng_fptr fSaveprocessrow;
|
|
mng_fptr fSavedifferrow;
|
|
mng_imagep fSavestoreobj;
|
|
mng_imagedatap fSavestorebuf;
|
|
|
|
#ifdef MNG_OPTIMIZE_FOOTPRINT_INIT
|
|
png_imgtype eSavepngimgtype;
|
|
#endif
|
|
|
|
mng_uint8 iSaveinterlace;
|
|
mng_int8 iSavepass;
|
|
mng_int32 iSaverow;
|
|
mng_int32 iSaverowinc;
|
|
mng_int32 iSavecol;
|
|
mng_int32 iSavecolinc;
|
|
mng_int32 iSaverowsamples;
|
|
mng_int32 iSavesamplemul;
|
|
mng_int32 iSavesampleofs;
|
|
mng_int32 iSavesamplediv;
|
|
mng_int32 iSaverowsize;
|
|
mng_int32 iSaverowmax;
|
|
mng_int32 iSavefilterofs;
|
|
mng_int32 iSavepixelofs;
|
|
mng_uint32 iSavelevel0;
|
|
mng_uint32 iSavelevel1;
|
|
mng_uint32 iSavelevel2;
|
|
mng_uint32 iSavelevel3;
|
|
mng_uint8p pSaveworkrow;
|
|
mng_uint8p pSaveprevrow;
|
|
mng_uint8p pSaverGBArow;
|
|
mng_bool bSaveisRGBA16;
|
|
mng_bool bSaveisOpaque;
|
|
mng_int32 iSavefilterbpp;
|
|
|
|
mng_int32 iSavedestl;
|
|
mng_int32 iSavedestt;
|
|
mng_int32 iSavedestr;
|
|
mng_int32 iSavedestb;
|
|
mng_int32 iSavesourcel;
|
|
mng_int32 iSavesourcet;
|
|
mng_int32 iSavesourcer;
|
|
mng_int32 iSavesourceb;
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
iRetcode = mng_inflate_buffer (pData, pRawdata, iRawlen,
|
|
&pBuf, &iBufsize, &iRealsize);
|
|
if (iRetcode) /* on error bail out */
|
|
{ /* don't forget to drop the temp buffer */
|
|
MNG_FREEX (pData, pBuf, iBufsize);
|
|
return iRetcode;
|
|
}
|
|
/* get buffer for tile info in ADAT chunk */
|
|
pADAT->iTilessize = pANG->iNumframes * sizeof(mng_adat_tile);
|
|
MNG_ALLOCX (pData, pADAT->pTiles, pADAT->iTilessize);
|
|
if (!pADAT->pTiles)
|
|
{
|
|
pADAT->iTilessize = 0;
|
|
MNG_FREEX (pData, pBuf, iBufsize);
|
|
MNG_ERROR (pData, MNG_OUTOFMEMORY);
|
|
}
|
|
|
|
pTemp = pBuf;
|
|
pTemp2 = (mng_uint8p)pADAT->pTiles;
|
|
|
|
if (!pANG->iStillused)
|
|
iSize = 12;
|
|
else
|
|
iSize = 13;
|
|
|
|
for (iX = 0; iX < pANG->iNumframes; iX++)
|
|
{
|
|
MNG_COPY (pTemp2, pTemp, iSize);
|
|
pTemp += iSize;
|
|
pTemp2 += sizeof(mng_adat_tile);
|
|
}
|
|
|
|
#ifdef MNG_SUPPORT_DISPLAY
|
|
/* get buffer for tile info in ANG object */
|
|
pANG->iTilessize = pADAT->iTilessize;
|
|
MNG_ALLOCX (pData, pANG->pTiles, pANG->iTilessize);
|
|
if (!pANG->pTiles)
|
|
{
|
|
pANG->iTilessize = 0;
|
|
MNG_FREEX (pData, pBuf, iBufsize);
|
|
MNG_ERROR (pData, MNG_OUTOFMEMORY);
|
|
}
|
|
/* copy it from the ADAT object */
|
|
MNG_COPY (pANG->pTiles, pADAT->pTiles, pANG->iTilessize);
|
|
|
|
/* save IDAT work-parms */
|
|
fSaveinitrowproc = pData->fInitrowproc;
|
|
fSavestorerow = pData->fDisplayrow;
|
|
fSaveprocessrow = pData->fProcessrow;
|
|
fSavedifferrow = pData->fDifferrow;
|
|
fSavestoreobj = pData->pStoreobj;
|
|
fSavestorebuf = pData->pStorebuf;
|
|
|
|
#ifdef MNG_OPTIMIZE_FOOTPRINT_INIT
|
|
eSavepngimgtype = pData->ePng_imgtype;
|
|
#endif
|
|
|
|
iSavedatawidth = pData->iDatawidth;
|
|
iSavedataheight = pData->iDataheight;
|
|
iSaveinterlace = pData->iInterlace;
|
|
iSavepass = pData->iPass;
|
|
iSaverow = pData->iRow;
|
|
iSaverowinc = pData->iRowinc;
|
|
iSavecol = pData->iCol;
|
|
iSavecolinc = pData->iColinc;
|
|
iSaverowsamples = pData->iRowsamples;
|
|
iSavesamplemul = pData->iSamplemul;
|
|
iSavesampleofs = pData->iSampleofs;
|
|
iSavesamplediv = pData->iSamplediv;
|
|
iSaverowsize = pData->iRowsize;
|
|
iSaverowmax = pData->iRowmax;
|
|
iSavefilterofs = pData->iFilterofs;
|
|
iSavepixelofs = pData->iPixelofs;
|
|
iSavelevel0 = pData->iLevel0;
|
|
iSavelevel1 = pData->iLevel1;
|
|
iSavelevel2 = pData->iLevel2;
|
|
iSavelevel3 = pData->iLevel3;
|
|
pSaveworkrow = pData->pWorkrow;
|
|
pSaveprevrow = pData->pPrevrow;
|
|
pSaverGBArow = pData->pRGBArow;
|
|
bSaveisRGBA16 = pData->bIsRGBA16;
|
|
bSaveisOpaque = pData->bIsOpaque;
|
|
iSavefilterbpp = pData->iFilterbpp;
|
|
iSavedestl = pData->iDestl;
|
|
iSavedestt = pData->iDestt;
|
|
iSavedestr = pData->iDestr;
|
|
iSavedestb = pData->iDestb;
|
|
iSavesourcel = pData->iSourcel;
|
|
iSavesourcet = pData->iSourcet;
|
|
iSavesourcer = pData->iSourcer;
|
|
iSavesourceb = pData->iSourceb;
|
|
|
|
pData->iDatawidth = pANG->iTilewidth;
|
|
pData->iDataheight = pANG->iTileheight;
|
|
|
|
pData->iDestl = 0;
|
|
pData->iDestt = 0;
|
|
pData->iDestr = pANG->iTilewidth;
|
|
pData->iDestb = pANG->iTileheight;
|
|
pData->iSourcel = 0;
|
|
pData->iSourcet = 0;
|
|
pData->iSourcer = pANG->iTilewidth;
|
|
pData->iSourceb = pANG->iTileheight;
|
|
|
|
pData->fInitrowproc = MNG_NULL;
|
|
pData->fStorerow = MNG_NULL;
|
|
pData->fProcessrow = MNG_NULL;
|
|
pData->fDifferrow = MNG_NULL;
|
|
|
|
/* clone image object to store the pixel-data from object 0 */
|
|
iRetcode = mng_clone_imageobject (pData, 1, MNG_FALSE, MNG_FALSE, MNG_FALSE,
|
|
MNG_FALSE, 0, 0, 0, pData->pObjzero, &pImage);
|
|
if (iRetcode) /* on error, drop temp buffer and bail */
|
|
{
|
|
MNG_FREEX (pData, pBuf, iBufsize);
|
|
return iRetcode;
|
|
}
|
|
|
|
/* make sure we got the right dimensions and interlacing */
|
|
iRetcode = mng_reset_object_details (pData, pImage, pANG->iTilewidth, pANG->iTileheight,
|
|
pImage->pImgbuf->iBitdepth, pImage->pImgbuf->iColortype,
|
|
pImage->pImgbuf->iCompression, pImage->pImgbuf->iFilter,
|
|
pANG->iInterlace, MNG_FALSE);
|
|
if (iRetcode) /* on error, drop temp buffer and bail */
|
|
{
|
|
MNG_FREEX (pData, pBuf, iBufsize);
|
|
return iRetcode;
|
|
}
|
|
|
|
pData->pStoreobj = pImage;
|
|
|
|
#ifdef MNG_OPTIMIZE_FOOTPRINT_INIT
|
|
pData->fInitrowproc = (mng_fptr)mng_init_rowproc;
|
|
pData->ePng_imgtype = mng_png_imgtype(pData->iColortype,pData->iBitdepth);
|
|
#else
|
|
switch (pData->iColortype) /* determine row initialization routine */
|
|
{
|
|
case 0 : { /* gray */
|
|
switch (pData->iBitdepth)
|
|
{
|
|
#ifndef MNG_NO_1_2_4BIT_SUPPORT
|
|
case 1 : {
|
|
if (!pData->iInterlace)
|
|
pData->fInitrowproc = (mng_fptr)mng_init_g1_ni;
|
|
else
|
|
pData->fInitrowproc = (mng_fptr)mng_init_g1_i;
|
|
|
|
break;
|
|
}
|
|
case 2 : {
|
|
if (!pData->iInterlace)
|
|
pData->fInitrowproc = (mng_fptr)mng_init_g2_ni;
|
|
else
|
|
pData->fInitrowproc = (mng_fptr)mng_init_g2_i;
|
|
|
|
break;
|
|
}
|
|
case 4 : {
|
|
if (!pData->iInterlace)
|
|
pData->fInitrowproc = (mng_fptr)mng_init_g4_ni;
|
|
else
|
|
pData->fInitrowproc = (mng_fptr)mng_init_g4_i;
|
|
break;
|
|
}
|
|
#endif /* MNG_NO_1_2_4BIT_SUPPORT */
|
|
case 8 : {
|
|
if (!pData->iInterlace)
|
|
pData->fInitrowproc = (mng_fptr)mng_init_g8_ni;
|
|
else
|
|
pData->fInitrowproc = (mng_fptr)mng_init_g8_i;
|
|
|
|
break;
|
|
}
|
|
#ifndef MNG_NO_16BIT_SUPPORT
|
|
case 16 : {
|
|
if (!pData->iInterlace)
|
|
pData->fInitrowproc = (mng_fptr)mng_init_g16_ni;
|
|
else
|
|
pData->fInitrowproc = (mng_fptr)mng_init_g16_i;
|
|
|
|
break;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
break;
|
|
}
|
|
case 2 : { /* rgb */
|
|
switch (pData->iBitdepth)
|
|
{
|
|
case 8 : {
|
|
if (!pData->iInterlace)
|
|
pData->fInitrowproc = (mng_fptr)mng_init_rgb8_ni;
|
|
else
|
|
pData->fInitrowproc = (mng_fptr)mng_init_rgb8_i;
|
|
break;
|
|
}
|
|
#ifndef MNG_NO_16BIT_SUPPORT
|
|
case 16 : {
|
|
if (!pData->iInterlace)
|
|
pData->fInitrowproc = (mng_fptr)mng_init_rgb16_ni;
|
|
else
|
|
pData->fInitrowproc = (mng_fptr)mng_init_rgb16_i;
|
|
|
|
break;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
break;
|
|
}
|
|
case 3 : { /* indexed */
|
|
switch (pData->iBitdepth)
|
|
{
|
|
#ifndef MNG_NO_1_2_4BIT_SUPPORT
|
|
case 1 : {
|
|
if (!pData->iInterlace)
|
|
pData->fInitrowproc = (mng_fptr)mng_init_idx1_ni;
|
|
else
|
|
pData->fInitrowproc = (mng_fptr)mng_init_idx1_i;
|
|
|
|
break;
|
|
}
|
|
case 2 : {
|
|
if (!pData->iInterlace)
|
|
pData->fInitrowproc = (mng_fptr)mng_init_idx2_ni;
|
|
else
|
|
pData->fInitrowproc = (mng_fptr)mng_init_idx2_i;
|
|
|
|
break;
|
|
}
|
|
case 4 : {
|
|
if (!pData->iInterlace)
|
|
pData->fInitrowproc = (mng_fptr)mng_init_idx4_ni;
|
|
else
|
|
pData->fInitrowproc = (mng_fptr)mng_init_idx4_i;
|
|
|
|
break;
|
|
}
|
|
#endif /* MNG_NO_1_2_4BIT_SUPPORT */
|
|
case 8 : {
|
|
if (!pData->iInterlace)
|
|
pData->fInitrowproc = (mng_fptr)mng_init_idx8_ni;
|
|
else
|
|
pData->fInitrowproc = (mng_fptr)mng_init_idx8_i;
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
case 4 : { /* gray+alpha */
|
|
switch (pData->iBitdepth)
|
|
{
|
|
case 8 : {
|
|
if (!pData->iInterlace)
|
|
pData->fInitrowproc = (mng_fptr)mng_init_ga8_ni;
|
|
else
|
|
pData->fInitrowproc = (mng_fptr)mng_init_ga8_i;
|
|
|
|
break;
|
|
}
|
|
#ifndef MNG_NO_16BIT_SUPPORT
|
|
case 16 : {
|
|
if (!pData->iInterlace)
|
|
pData->fInitrowproc = (mng_fptr)mng_init_ga16_ni;
|
|
else
|
|
pData->fInitrowproc = (mng_fptr)mng_init_ga16_i;
|
|
break;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
break;
|
|
}
|
|
case 6 : { /* rgb+alpha */
|
|
switch (pData->iBitdepth)
|
|
{
|
|
case 8 : {
|
|
if (!pData->iInterlace)
|
|
pData->fInitrowproc = (mng_fptr)mng_init_rgba8_ni;
|
|
else
|
|
pData->fInitrowproc = (mng_fptr)mng_init_rgba8_i;
|
|
|
|
break;
|
|
}
|
|
#ifndef MNG_NO_16BIT_SUPPORT
|
|
case 16 : {
|
|
if (!pData->iInterlace)
|
|
pData->fInitrowproc = (mng_fptr)mng_init_rgba16_ni;
|
|
else
|
|
pData->fInitrowproc = (mng_fptr)mng_init_rgba16_i;
|
|
|
|
break;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
#endif /* MNG_OPTIMIZE_FOOTPRINT_INIT */
|
|
|
|
pData->iFilterofs = 0; /* determine filter characteristics */
|
|
pData->iLevel0 = 0; /* default levels */
|
|
pData->iLevel1 = 0;
|
|
pData->iLevel2 = 0;
|
|
pData->iLevel3 = 0;
|
|
|
|
#ifdef FILTER192 /* leveling & differing ? */
|
|
if (pData->iFilter == MNG_FILTER_DIFFERING)
|
|
{
|
|
switch (pData->iColortype)
|
|
{
|
|
case 0 : {
|
|
if (pData->iBitdepth <= 8)
|
|
pData->iFilterofs = 1;
|
|
else
|
|
pData->iFilterofs = 2;
|
|
|
|
break;
|
|
}
|
|
case 2 : {
|
|
if (pData->iBitdepth <= 8)
|
|
pData->iFilterofs = 3;
|
|
else
|
|
pData->iFilterofs = 6;
|
|
|
|
break;
|
|
}
|
|
case 3 : {
|
|
pData->iFilterofs = 1;
|
|
break;
|
|
}
|
|
case 4 : {
|
|
if (pData->iBitdepth <= 8)
|
|
pData->iFilterofs = 2;
|
|
else
|
|
pData->iFilterofs = 4;
|
|
|
|
break;
|
|
}
|
|
case 6 : {
|
|
if (pData->iBitdepth <= 8)
|
|
pData->iFilterofs = 4;
|
|
else
|
|
pData->iFilterofs = 8;
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef FILTER193 /* no adaptive filtering ? */
|
|
if (pData->iFilter == MNG_FILTER_NOFILTER)
|
|
pData->iPixelofs = pData->iFilterofs;
|
|
else
|
|
#endif
|
|
pData->iPixelofs = pData->iFilterofs + 1;
|
|
|
|
if (pData->fInitrowproc) /* need to initialize row processing? */
|
|
{
|
|
iRetcode = ((mng_initrowproc)pData->fInitrowproc) (pData);
|
|
if (iRetcode)
|
|
{
|
|
MNG_FREEX (pData, pBuf, iBufsize);
|
|
return iRetcode;
|
|
}
|
|
}
|
|
/* calculate remainder of buffer */
|
|
pTemp = pBuf + (mng_int32)(pANG->iNumframes * iSize);
|
|
iTemplen = iRealsize - (mng_int32)(pANG->iNumframes * iSize);
|
|
|
|
do
|
|
{
|
|
if (iTemplen > pData->iRowmax) /* get a pixel-row from the temp buffer */
|
|
{
|
|
MNG_COPY (pData->pWorkrow, pTemp, pData->iRowmax);
|
|
}
|
|
else
|
|
{
|
|
MNG_COPY (pData->pWorkrow, pTemp, iTemplen);
|
|
}
|
|
|
|
{ /* image not completed yet ? */
|
|
if (pData->iRow < (mng_int32)pData->iDataheight)
|
|
{
|
|
#ifdef MNG_NO_1_2_4BIT_SUPPORT
|
|
if (pData->iPNGdepth == 1)
|
|
{
|
|
/* Inflate Workrow to 8-bit */
|
|
mng_int32 iX;
|
|
mng_uint8p pSrc = pData->pWorkrow+1;
|
|
mng_uint8p pDest = pSrc + pData->iRowsize - (pData->iRowsize+7)/8;
|
|
|
|
for (iX = ((pData->iRowsize+7)/8) ; iX > 0 ; iX--)
|
|
*pDest++ = *pSrc++;
|
|
|
|
pDest = pData->pWorkrow+1;
|
|
pSrc = pDest + pData->iRowsize - (pData->iRowsize+7)/8;
|
|
for (iX = pData->iRowsize; ;)
|
|
{
|
|
*pDest++ = (((*pSrc)>>7)&1);
|
|
if (iX-- <= 0)
|
|
break;
|
|
*pDest++ = (((*pSrc)>>6)&1);
|
|
if (iX-- <= 0)
|
|
break;
|
|
*pDest++ = (((*pSrc)>>5)&1);
|
|
if (iX-- <= 0)
|
|
break;
|
|
*pDest++ = (((*pSrc)>>4)&1);
|
|
if (iX-- <= 0)
|
|
break;
|
|
*pDest++ = (((*pSrc)>>3)&1);
|
|
if (iX-- <= 0)
|
|
break;
|
|
*pDest++ = (((*pSrc)>>2)&1);
|
|
if (iX-- <= 0)
|
|
break;
|
|
*pDest++ = (((*pSrc)>>1)&1);
|
|
if (iX-- <= 0)
|
|
break;
|
|
*pDest++ = (((*pSrc) )&1);
|
|
if (iX-- <= 0)
|
|
break;
|
|
pSrc++;
|
|
}
|
|
}
|
|
else if (pData->iPNGdepth == 2)
|
|
{
|
|
/* Inflate Workrow to 8-bit */
|
|
mng_int32 iX;
|
|
mng_uint8p pSrc = pData->pWorkrow+1;
|
|
mng_uint8p pDest = pSrc + pData->iRowsize - (2*pData->iRowsize+7)/8;
|
|
|
|
for (iX = ((2*pData->iRowsize+7)/8) ; iX > 0 ; iX--)
|
|
*pDest++ = *pSrc++;
|
|
|
|
pDest = pData->pWorkrow+1;
|
|
pSrc = pDest + pData->iRowsize - (2*pData->iRowsize+7)/8;
|
|
for (iX = pData->iRowsize; ;)
|
|
{
|
|
*pDest++ = (((*pSrc)>>6)&3);
|
|
if (iX-- <= 0)
|
|
break;
|
|
*pDest++ = (((*pSrc)>>4)&3);
|
|
if (iX-- <= 0)
|
|
break;
|
|
*pDest++ = (((*pSrc)>>2)&3);
|
|
if (iX-- <= 0)
|
|
break;
|
|
*pDest++ = (((*pSrc) )&3);
|
|
if (iX-- <= 0)
|
|
break;
|
|
pSrc++;
|
|
}
|
|
}
|
|
else if (pData->iPNGdepth == 4)
|
|
{
|
|
/* Inflate Workrow to 8-bit */
|
|
mng_int32 iX;
|
|
mng_uint8p pSrc = pData->pWorkrow+1;
|
|
mng_uint8p pDest = pSrc + pData->iRowsize - (4*pData->iRowsize+7)/8;
|
|
|
|
for (iX = ((4*pData->iRowsize+7)/8) ; iX > 0 ; iX--)
|
|
*pDest++ = *pSrc++;
|
|
|
|
pDest = pData->pWorkrow+1;
|
|
pSrc = pDest + pData->iRowsize - (4*pData->iRowsize+7)/8;
|
|
for (iX = pData->iRowsize; ;)
|
|
{
|
|
*pDest++ = (((*pSrc)>>4)&0x0f);
|
|
if (iX-- <= 0)
|
|
break;
|
|
*pDest++ = (((*pSrc) )&0x0f);
|
|
if (iX-- <= 0)
|
|
break;
|
|
pSrc++;
|
|
}
|
|
}
|
|
if (pData->iPNGdepth < 8 && pData->iColortype == 0)
|
|
{
|
|
/* Expand samples to 8-bit by LBR */
|
|
mng_int32 iX;
|
|
mng_uint8p pSrc = pData->pWorkrow+1;
|
|
mng_uint8 multiplier[]={0,255,85,0,17,0,0,0,1};
|
|
|
|
for (iX = pData->iRowsize; iX > 0; iX--)
|
|
*pSrc++ *= multiplier[pData->iPNGdepth];
|
|
}
|
|
#endif
|
|
#ifdef MNG_NO_16BIT_SUPPORT
|
|
if (pData->iPNGdepth > 8)
|
|
{
|
|
/* Reduce Workrow to 8-bit */
|
|
mng_int32 iX;
|
|
mng_uint8p pSrc = pData->pWorkrow+1;
|
|
mng_uint8p pDest = pSrc;
|
|
|
|
for (iX = pData->iRowsize; iX > 0; iX--)
|
|
{
|
|
*pDest = *pSrc;
|
|
pDest++;
|
|
pSrc+=2;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef FILTER192 /* has leveling info ? */
|
|
if (pData->iFilterofs == MNG_FILTER_DIFFERING)
|
|
iRetcode = init_rowdiffering (pData);
|
|
else
|
|
#endif
|
|
iRetcode = MNG_NOERROR;
|
|
/* filter the row if necessary */
|
|
if ((!iRetcode) && (pData->iFilterofs < pData->iPixelofs ) &&
|
|
(*(pData->pWorkrow + pData->iFilterofs)) )
|
|
iRetcode = mng_filter_a_row (pData);
|
|
|
|
/* additional leveling/differing ? */
|
|
if ((!iRetcode) && (pData->fDifferrow))
|
|
{
|
|
iRetcode = ((mng_differrow)pData->fDifferrow) (pData);
|
|
|
|
pSwap = pData->pWorkrow;
|
|
pData->pWorkrow = pData->pPrevrow;
|
|
pData->pPrevrow = pSwap; /* make sure we're processing the right data */
|
|
}
|
|
|
|
if (!iRetcode)
|
|
{
|
|
{ /* process this row */
|
|
if ((!iRetcode) && (pData->fProcessrow))
|
|
iRetcode = ((mng_processrow)pData->fProcessrow) (pData);
|
|
/* store in object ? */
|
|
if ((!iRetcode) && (pData->fStorerow))
|
|
iRetcode = ((mng_storerow)pData->fStorerow) (pData);
|
|
}
|
|
}
|
|
|
|
if (iRetcode) /* on error bail out */
|
|
{
|
|
MNG_FREEX (pData, pBuf, iBufsize);
|
|
MNG_ERROR (pData, iRetcode);
|
|
}
|
|
|
|
if (!pData->fDifferrow) /* swap row-pointers */
|
|
{
|
|
pSwap = pData->pWorkrow;
|
|
pData->pWorkrow = pData->pPrevrow;
|
|
pData->pPrevrow = pSwap; /* so prev points to the processed row! */
|
|
}
|
|
/* adjust variables for next row */
|
|
iRetcode = mng_next_row (pData);
|
|
|
|
if (iRetcode) /* on error bail out */
|
|
{
|
|
MNG_FREEX (pData, pBuf, iBufsize);
|
|
MNG_ERROR (pData, iRetcode);
|
|
}
|
|
}
|
|
}
|
|
|
|
pTemp += pData->iRowmax;
|
|
iTemplen -= pData->iRowmax;
|
|
} /* until some error or EOI
|
|
or all pixels received */
|
|
while ( (iTemplen > 0) &&
|
|
( (pData->iRow < (mng_int32)pData->iDataheight) ||
|
|
( (pData->iPass >= 0) && (pData->iPass < 7) ) ) );
|
|
|
|
mng_cleanup_rowproc (pData); /* cleanup row processing buffers !! */
|
|
|
|
/* restore saved work-parms */
|
|
pData->iDatawidth = iSavedatawidth;
|
|
pData->iDataheight = iSavedataheight;
|
|
|
|
pData->fInitrowproc = fSaveinitrowproc;
|
|
pData->fDisplayrow = fSavestorerow;
|
|
pData->fProcessrow = fSaveprocessrow;
|
|
pData->fDifferrow = fSavedifferrow;
|
|
pData->pStoreobj = fSavestoreobj;
|
|
pData->pStorebuf = fSavestorebuf;
|
|
|
|
#ifdef MNG_OPTIMIZE_FOOTPRINT_INIT
|
|
pData->ePng_imgtype = eSavepngimgtype;
|
|
#endif
|
|
|
|
pData->iInterlace = iSaveinterlace;
|
|
pData->iPass = iSavepass;
|
|
pData->iRow = iSaverow;
|
|
pData->iRowinc = iSaverowinc;
|
|
pData->iCol = iSavecol;
|
|
pData->iColinc = iSavecolinc;
|
|
pData->iRowsamples = iSaverowsamples;
|
|
pData->iSamplemul = iSavesamplemul;
|
|
pData->iSampleofs = iSavesampleofs;
|
|
pData->iSamplediv = iSavesamplediv;
|
|
pData->iRowsize = iSaverowsize;
|
|
pData->iRowmax = iSaverowmax;
|
|
pData->iFilterofs = iSavefilterofs;
|
|
pData->iPixelofs = iSavepixelofs;
|
|
pData->iLevel0 = iSavelevel0;
|
|
pData->iLevel1 = iSavelevel1;
|
|
pData->iLevel2 = iSavelevel2;
|
|
pData->iLevel3 = iSavelevel3;
|
|
pData->pWorkrow = pSaveworkrow;
|
|
pData->pPrevrow = pSaveprevrow;
|
|
pData->pRGBArow = pSaverGBArow;
|
|
pData->bIsRGBA16 = bSaveisRGBA16;
|
|
pData->bIsOpaque = bSaveisOpaque;
|
|
pData->iFilterbpp = iSavefilterbpp;
|
|
pData->iDestl = iSavedestl;
|
|
pData->iDestt = iSavedestt;
|
|
pData->iDestr = iSavedestr;
|
|
pData->iDestb = iSavedestb;
|
|
pData->iSourcel = iSavesourcel;
|
|
pData->iSourcet = iSavesourcet;
|
|
pData->iSourcer = iSavesourcer;
|
|
pData->iSourceb = iSavesourceb;
|
|
|
|
/* create the animation directives ! */
|
|
pProcess = (mng_processobject)pANG->sHeader.fProcess;
|
|
iRetcode = pProcess (pData, (mng_objectp)pData->pANG);
|
|
if (iRetcode)
|
|
return iRetcode;
|
|
|
|
#endif /* MNG_SUPPORT_DISPLAY */
|
|
|
|
MNG_FREE (pData, pBuf, iBufsize); /* always free the temp buffer ! */
|
|
}
|
|
|
|
*piRawlen = 0;
|
|
|
|
return MNG_NOERROR;
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#ifdef MNG_INCLUDE_ANG_PROPOSAL
|
|
MNG_C_SPECIALFUNC (mng_special_adat)
|
|
{
|
|
return MNG_NOERROR;
|
|
}
|
|
#endif
|
|
|
|
/* ************************************************************************** */
|
|
|
|
MNG_C_SPECIALFUNC (mng_special_unknown)
|
|
{
|
|
/* critical chunk ? */
|
|
if ((((mng_uint32)pData->iChunkname & 0x20000000) == 0)
|
|
#ifdef MNG_SKIPCHUNK_SAVE
|
|
&& (pData->iChunkname != MNG_UINT_SAVE)
|
|
#endif
|
|
#ifdef MNG_SKIPCHUNK_SEEK
|
|
&& (pData->iChunkname != MNG_UINT_SEEK)
|
|
#endif
|
|
#ifdef MNG_SKIPCHUNK_DBYK
|
|
&& (pData->iChunkname != MNG_UINT_DBYK)
|
|
#endif
|
|
#ifdef MNG_SKIPCHUNK_ORDR
|
|
&& (pData->iChunkname != MNG_UINT_ORDR)
|
|
#endif
|
|
)
|
|
MNG_ERROR (pData, MNG_UNKNOWNCRITICAL);
|
|
|
|
if (pData->fProcessunknown) /* let the app handle it ? */
|
|
{
|
|
mng_bool bOke = pData->fProcessunknown ((mng_handle)pData, pData->iChunkname,
|
|
((mng_unknown_chunkp)pChunk)->iDatasize,
|
|
((mng_unknown_chunkp)pChunk)->pData);
|
|
if (!bOke)
|
|
MNG_ERROR (pData, MNG_APPMISCERROR);
|
|
}
|
|
|
|
return MNG_NOERROR; /* done */
|
|
}
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#endif /* MNG_INCLUDE_READ_PROCS || MNG_INCLUDE_WRITE_PROCS */
|
|
#endif /* MNG_OPTIMIZE_CHUNKREADER */
|
|
|
|
/* ************************************************************************** */
|
|
/* * end of file * */
|
|
/* ************************************************************************** */
|
|
|
|
|
|
|
|
|
|
|