1
/** ************************************************************************* */
2
/* * For conditions of distribution and use, * */
3
/* * see copyright notice in libmng.h * */
4
/* ************************************************************************** */
6
/* * project : libmng * */
7
/* * file : libmng_chunk_io.c copyright (c) 2000-2004 G.Juyn * */
8
/* * version : 1.0.8 * */
10
/* * purpose : Chunk I/O routines (implementation) * */
12
/* * author : G.Juyn * */
14
/* * comment : implementation of chunk input/output routines * */
16
/* * changes : 0.5.1 - 05/01/2000 - G.Juyn * */
17
/* * - cleaned up left-over teststuff in the BACK chunk routine * */
18
/* * 0.5.1 - 05/04/2000 - G.Juyn * */
19
/* * - changed CRC initialization to use dynamic structure * */
20
/* * (wasn't thread-safe the old way !) * */
21
/* * 0.5.1 - 05/06/2000 - G.Juyn * */
22
/* * - filled in many missing sequence&length checks * */
23
/* * - filled in many missing chunk-store snippets * */
24
/* * 0.5.1 - 05/08/2000 - G.Juyn * */
25
/* * - added checks for running animations * */
26
/* * - filled some write routines * */
27
/* * - changed strict-ANSI stuff * */
28
/* * 0.5.1 - 05/10/2000 - G.Juyn * */
29
/* * - filled some more write routines * */
30
/* * 0.5.1 - 05/11/2000 - G.Juyn * */
31
/* * - filled remaining write routines * */
32
/* * - fixed read_pplt with regard to deltatype * */
33
/* * - added callback error-reporting support * */
34
/* * - added pre-draft48 support (short MHDR, frame_mode, LOOP) * */
35
/* * 0.5.1 - 05/12/2000 - G.Juyn * */
36
/* * - changed trace to macro for callback error-reporting * */
37
/* * - fixed chunk-storage bit in several routines * */
38
/* * 0.5.1 - 05/13/2000 - G.Juyn * */
39
/* * - added eMNGma hack (will be removed in 1.0.0 !!!) * */
40
/* * - added TERM animation object pointer (easier reference) * */
41
/* * - supplemented the SAVE & SEEK display processing * */
43
/* * 0.5.2 - 05/18/2000 - G.Juyn * */
44
/* * - B004 - fixed problem with MNG_SUPPORT_WRITE not defined * */
45
/* * also for MNG_SUPPORT_WRITE without MNG_INCLUDE_JNG * */
46
/* * 0.5.2 - 05/19/2000 - G.Juyn * */
47
/* * - cleaned up some code regarding mixed support * */
48
/* * 0.5.2 - 05/20/2000 - G.Juyn * */
49
/* * - implemented JNG support * */
50
/* * 0.5.2 - 05/24/2000 - G.Juyn * */
51
/* * - added support for global color-chunks in animation * */
52
/* * - added support for global PLTE,tRNS,bKGD in animation * */
53
/* * - added support for SAVE & SEEK in animation * */
54
/* * 0.5.2 - 05/29/2000 - G.Juyn * */
55
/* * - changed ani_create calls not returning object pointer * */
56
/* * - create ani objects always (not just inside TERM/LOOP) * */
57
/* * 0.5.2 - 05/30/2000 - G.Juyn * */
58
/* * - added support for delta-image processing * */
59
/* * 0.5.2 - 05/31/2000 - G.Juyn * */
60
/* * - fixed up punctuation (contributed by Tim Rowley) * */
61
/* * 0.5.2 - 06/02/2000 - G.Juyn * */
62
/* * - changed SWAP_ENDIAN to BIGENDIAN_SUPPORTED * */
63
/* * 0.5.2 - 06/03/2000 - G.Juyn * */
64
/* * - fixed makeup for Linux gcc compile * */
66
/* * 0.5.3 - 06/12/2000 - G.Juyn * */
67
/* * - added processing of color-info on delta-image * */
68
/* * 0.5.3 - 06/13/2000 - G.Juyn * */
69
/* * - fixed handling of empty SAVE chunk * */
70
/* * 0.5.3 - 06/17/2000 - G.Juyn * */
71
/* * - changed to support delta-images * */
72
/* * - added extra checks for delta-images * */
73
/* * 0.5.3 - 06/20/2000 - G.Juyn * */
74
/* * - fixed possible trouble if IEND display-process got * */
76
/* * 0.5.3 - 06/21/2000 - G.Juyn * */
77
/* * - added processing of PLTE & tRNS for delta-images * */
78
/* * - added administration of imagelevel parameter * */
79
/* * 0.5.3 - 06/22/2000 - G.Juyn * */
80
/* * - implemented support for PPLT chunk * */
81
/* * 0.5.3 - 06/26/2000 - G.Juyn * */
82
/* * - added precaution against faulty iCCP chunks from PS * */
83
/* * 0.5.3 - 06/29/2000 - G.Juyn * */
84
/* * - fixed some 64-bit warnings * */
86
/* * 0.9.1 - 07/14/2000 - G.Juyn * */
87
/* * - changed pre-draft48 frame_mode=3 to frame_mode=1 * */
88
/* * 0.9.1 - 07/16/2000 - G.Juyn * */
89
/* * - fixed storage of images during mng_read() * */
90
/* * - fixed support for mng_display() after mng_read() * */
91
/* * 0.9.1 - 07/19/2000 - G.Juyn * */
92
/* * - fixed several chunk-writing routines * */
93
/* * 0.9.1 - 07/24/2000 - G.Juyn * */
94
/* * - fixed reading of still-images * */
96
/* * 0.9.2 - 08/05/2000 - G.Juyn * */
97
/* * - changed file-prefixes * */
99
/* * 0.9.3 - 08/07/2000 - G.Juyn * */
100
/* * - B111300 - fixup for improved portability * */
101
/* * 0.9.3 - 08/08/2000 - G.Juyn * */
102
/* * - fixed compiler-warnings from Mozilla * */
103
/* * 0.9.3 - 08/09/2000 - G.Juyn * */
104
/* * - added check for simplicity-bits in MHDR * */
105
/* * 0.9.3 - 08/12/2000 - G.Juyn * */
106
/* * - fixed check for simplicity-bits in MHDR (JNG) * */
107
/* * 0.9.3 - 08/12/2000 - G.Juyn * */
108
/* * - added workaround for faulty PhotoShop iCCP chunk * */
109
/* * 0.9.3 - 08/22/2000 - G.Juyn * */
110
/* * - fixed write-code for zTXt & iTXt * */
111
/* * - fixed read-code for iTXt * */
112
/* * 0.9.3 - 08/26/2000 - G.Juyn * */
113
/* * - added MAGN chunk * */
114
/* * 0.9.3 - 09/07/2000 - G.Juyn * */
115
/* * - added support for new filter_types * */
116
/* * 0.9.3 - 09/10/2000 - G.Juyn * */
117
/* * - fixed DEFI behavior * */
118
/* * 0.9.3 - 10/02/2000 - G.Juyn * */
119
/* * - fixed simplicity-check in compliance with draft 81/0.98a * */
120
/* * 0.9.3 - 10/10/2000 - G.Juyn * */
121
/* * - added support for alpha-depth prediction * */
122
/* * 0.9.3 - 10/11/2000 - G.Juyn * */
123
/* * - added support for nEED * */
124
/* * 0.9.3 - 10/16/2000 - G.Juyn * */
125
/* * - added support for JDAA * */
126
/* * 0.9.3 - 10/17/2000 - G.Juyn * */
127
/* * - fixed support for MAGN * */
128
/* * - implemented nEED "xxxx" (where "xxxx" is a chunkid) * */
129
/* * - added callback to process non-critical unknown chunks * */
130
/* * - fixed support for bKGD * */
131
/* * 0.9.3 - 10/23/2000 - G.Juyn * */
132
/* * - fixed bug in empty PLTE handling * */
134
/* * 0.9.4 - 11/20/2000 - G.Juyn * */
135
/* * - changed IHDR filter_method check for PNGs * */
136
/* * 0.9.4 - 1/18/2001 - G.Juyn * */
137
/* * - added errorchecking for MAGN methods * */
138
/* * - removed test filter-methods 1 & 65 * */
140
/* * 0.9.5 - 1/25/2001 - G.Juyn * */
141
/* * - fixed some small compiler warnings (thanks Nikki) * */
143
/* * 1.0.2 - 05/05/2000 - G.Juyn * */
144
/* * - B421427 - writes wrong format in bKGD and tRNS * */
145
/* * 1.0.2 - 06/20/2000 - G.Juyn * */
146
/* * - B434583 - compiler-warning if MNG_STORE_CHUNKS undefined * */
148
/* * 1.0.5 - 07/08/2002 - G.Juyn * */
149
/* * - B578572 - removed eMNGma hack (thanks Dimitri!) * */
150
/* * 1.0.5 - 08/07/2002 - G.Juyn * */
151
/* * - added test-option for PNG filter method 193 (=no filter) * */
152
/* * 1.0.5 - 08/15/2002 - G.Juyn * */
153
/* * - completed PROM support * */
154
/* * 1.0.5 - 08/19/2002 - G.Juyn * */
155
/* * - B597134 - libmng pollutes the linker namespace * */
156
/* * 1.0.5 - 09/07/2002 - G.Juyn * */
157
/* * - fixed reading of FRAM with just frame_mode and name * */
158
/* * 1.0.5 - 09/13/2002 - G.Juyn * */
159
/* * - fixed read/write of MAGN chunk * */
160
/* * 1.0.5 - 09/14/2002 - G.Juyn * */
161
/* * - added event handling for dynamic MNG * */
162
/* * 1.0.5 - 09/15/2002 - G.Juyn * */
163
/* * - fixed LOOP iteration=0 special case * */
164
/* * 1.0.5 - 09/19/2002 - G.Juyn * */
165
/* * - misplaced TERM is now treated as warning * */
166
/* * 1.0.5 - 09/20/2002 - G.Juyn * */
167
/* * - added support for PAST * */
168
/* * 1.0.5 - 10/03/2002 - G.Juyn * */
169
/* * - fixed chunk-storage for evNT chunk * */
170
/* * 1.0.5 - 10/07/2002 - G.Juyn * */
171
/* * - fixed DISC support * */
172
/* * - added another fix for misplaced TERM chunk * */
173
/* * 1.0.5 - 10/17/2002 - G.Juyn * */
174
/* * - fixed initializtion of pIds in dISC read routine * */
175
/* * 1.0.5 - 11/06/2002 - G.Juyn * */
176
/* * - added support for nEED "MNG 1.1" * */
177
/* * - added support for nEED "CACHEOFF" * */
179
/* * 1.0.6 - 05/25/2003 - G.R-P * */
180
/* * - added MNG_SKIPCHUNK_cHNK footprint optimizations * */
181
/* * 1.0.6 - 06/02/2003 - G.R-P * */
182
/* * - removed some redundant checks for iRawlen==0 * */
183
/* * 1.0.6 - 06/22/2003 - G.R-P * */
184
/* * - added MNG_NO_16BIT_SUPPORT, MNG_NO_DELTA_PNG reductions * */
185
/* * - optionally use zlib's crc32 function instead of * */
186
/* * local mng_update_crc * */
187
/* * 1.0.6 - 07/14/2003 - G.R-P * */
188
/* * - added MNG_NO_LOOP_SIGNALS_SUPPORTED conditional * */
189
/* * 1.0.6 - 07/29/2003 - G.R-P * */
190
/* * - added conditionals around PAST chunk support * */
191
/* * 1.0.6 - 08/17/2003 - G.R-P * */
192
/* * - added conditionals around non-VLC chunk support * */
194
/* * 1.0.7 - 10/29/2003 - G.R-P * */
195
/* * - revised JDAA and JDAT readers to avoid compiler bug * */
196
/* * 1.0.7 - 01/25/2004 - J.S * */
197
/* * - added premultiplied alpha canvas' for RGBA, ARGB, ABGR * */
198
/* * 1.0.7 - 01/27/2004 - J.S * */
199
/* * - fixed inclusion of IJNG chunk for non-JNG use * */
200
/* * 1.0.7 - 02/26/2004 - G.Juyn * */
201
/* * - fixed bug in chunk-storage of SHOW chunk (from == to) * */
203
/* * 1.0.8 - 04/02/2004 - G.Juyn * */
204
/* * - added CRC existence & checking flags * */
205
/* * 1.0.8 - 07/07/2004 - G.R-P * */
206
/* * - change worst-case iAlphadepth to 1 for standalone PNGs * */
208
/* ************************************************************************** */
211
#include "libmng_data.h"
212
#include "libmng_error.h"
213
#include "libmng_trace.h"
217
#include "libmng_objects.h"
218
#include "libmng_object_prc.h"
219
#include "libmng_chunks.h"
220
#ifdef MNG_CHECK_BAD_ICCP
221
#include "libmng_chunk_prc.h"
223
#include "libmng_memory.h"
224
#include "libmng_display.h"
225
#include "libmng_zlib.h"
226
#include "libmng_pixels.h"
227
#include "libmng_chunk_io.h"
229
#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI)
230
#pragma option -A /* force ANSI-C */
233
/* ************************************************************************** */
235
/* * CRC - Cyclic Redundancy Check * */
237
/* * The code below is taken directly from the sample provided with the * */
238
/* * PNG specification. * */
239
/* * (it is only adapted to the library's internal data-definitions) * */
241
/* ************************************************************************** */
242
/* Make the table for a fast CRC. */
243
#ifndef MNG_USE_ZLIB_CRC
244
MNG_LOCAL void make_crc_table (mng_datap pData)
249
for (iN = 0; iN < 256; iN++)
251
iC = (mng_uint32) iN;
253
for (iK = 0; iK < 8; iK++)
256
iC = 0xedb88320U ^ (iC >> 1);
261
pData->aCRCtable [iN] = iC;
264
pData->bCRCcomputed = MNG_TRUE;
268
/* Update a running CRC with the bytes buf[0..len-1]--the CRC
269
should be initialized to all 1's, and the transmitted value
270
is the 1's complement of the final running CRC (see the
271
crc() routine below). */
273
MNG_LOCAL mng_uint32 update_crc (mng_datap pData,
278
#ifdef MNG_USE_ZLIB_CRC
279
return crc32 (iCrc, pBuf, iLen);
281
mng_uint32 iC = iCrc;
284
if (!pData->bCRCcomputed)
285
make_crc_table (pData);
287
for (iN = 0; iN < iLen; iN++)
288
iC = pData->aCRCtable [(iC ^ pBuf [iN]) & 0xff] ^ (iC >> 8);
294
/* Return the CRC of the bytes buf[0..len-1]. */
295
mng_uint32 mng_crc (mng_datap pData,
299
#ifdef MNG_USE_ZLIB_CRC
300
return update_crc (pData, 0, pBuf, iLen);
302
return update_crc (pData, 0xffffffffU, pBuf, iLen) ^ 0xffffffffU;
306
/* ************************************************************************** */
308
/* * Routines for swapping byte-order from and to graphic files * */
309
/* * (This code is adapted from the libpng package) * */
311
/* ************************************************************************** */
313
#ifndef MNG_BIGENDIAN_SUPPORTED
315
/* ************************************************************************** */
317
mng_uint32 mng_get_uint32 (mng_uint8p pBuf)
319
mng_uint32 i = ((mng_uint32)(*pBuf) << 24) +
320
((mng_uint32)(*(pBuf + 1)) << 16) +
321
((mng_uint32)(*(pBuf + 2)) << 8) +
322
(mng_uint32)(*(pBuf + 3));
326
/* ************************************************************************** */
328
mng_int32 mng_get_int32 (mng_uint8p pBuf)
330
mng_int32 i = ((mng_int32)(*pBuf) << 24) +
331
((mng_int32)(*(pBuf + 1)) << 16) +
332
((mng_int32)(*(pBuf + 2)) << 8) +
333
(mng_int32)(*(pBuf + 3));
337
/* ************************************************************************** */
339
mng_uint16 mng_get_uint16 (mng_uint8p pBuf)
341
mng_uint16 i = (mng_uint16)(((mng_uint16)(*pBuf) << 8) +
342
(mng_uint16)(*(pBuf + 1)));
346
/* ************************************************************************** */
348
void mng_put_uint32 (mng_uint8p pBuf,
351
*pBuf = (mng_uint8)((i >> 24) & 0xff);
352
*(pBuf+1) = (mng_uint8)((i >> 16) & 0xff);
353
*(pBuf+2) = (mng_uint8)((i >> 8) & 0xff);
354
*(pBuf+3) = (mng_uint8)(i & 0xff);
357
/* ************************************************************************** */
359
void mng_put_int32 (mng_uint8p pBuf,
362
*pBuf = (mng_uint8)((i >> 24) & 0xff);
363
*(pBuf+1) = (mng_uint8)((i >> 16) & 0xff);
364
*(pBuf+2) = (mng_uint8)((i >> 8) & 0xff);
365
*(pBuf+3) = (mng_uint8)(i & 0xff);
368
/* ************************************************************************** */
370
void mng_put_uint16 (mng_uint8p pBuf,
373
*pBuf = (mng_uint8)((i >> 8) & 0xff);
374
*(pBuf+1) = (mng_uint8)(i & 0xff);
377
/* ************************************************************************** */
379
#endif /* !MNG_BIGENDIAN_SUPPORTED */
381
/* ************************************************************************** */
383
/* * Helper routines to simplify chunk-data extraction * */
385
/* ************************************************************************** */
387
#ifdef MNG_INCLUDE_READ_PROCS
389
/* ************************************************************************** */
391
MNG_LOCAL mng_uint8p find_null (mng_uint8p pIn)
393
mng_uint8p pOut = pIn;
395
while (*pOut) /* the read_graphic routine has made sure there's */
396
pOut++; /* always at least 1 zero-byte in the buffer */
401
/* ************************************************************************** */
403
#if !defined(MNG_SKIPCHUNK_iCCP) && !defined(MNG_SKIPCHUNK_zTXt) && !defined(MNG_SKIPCHUNK_iTXt)
404
MNG_LOCAL mng_retcode inflate_buffer (mng_datap pData,
408
mng_uint32 *iOutsize,
409
mng_uint32 *iRealsize)
411
mng_retcode iRetcode = MNG_NOERROR;
413
#ifdef MNG_SUPPORT_TRACE
414
MNG_TRACE (pData, MNG_FN_INFLATE_BUFFER, MNG_LC_START)
417
if (iInsize) /* anything to do ? */
419
*iOutsize = iInsize * 3; /* estimate uncompressed size */
420
/* and allocate a temporary buffer */
421
MNG_ALLOC (pData, *pOutbuf, *iOutsize)
425
mngzlib_inflateinit (pData); /* initialize zlib */
426
/* let zlib know where to store the output */
427
pData->sZlib.next_out = *pOutbuf;
428
/* "size - 1" so we've got space for the
429
zero-termination of a possible string */
430
pData->sZlib.avail_out = *iOutsize - 1;
431
/* ok; let's inflate... */
432
iRetcode = mngzlib_inflatedata (pData, iInsize, pInbuf);
433
/* determine actual output size */
434
*iRealsize = (mng_uint32)pData->sZlib.total_out;
436
mngzlib_inflatefree (pData); /* zlib's done */
438
if (iRetcode == MNG_BUFOVERFLOW) /* not enough space ? */
439
{ /* then get some more */
440
MNG_FREEX (pData, *pOutbuf, *iOutsize)
441
*iOutsize = *iOutsize + iInsize;
442
MNG_ALLOC (pData, *pOutbuf, *iOutsize)
444
} /* repeat if we didn't have enough space */
445
while ((iRetcode == MNG_BUFOVERFLOW) &&
446
(*iOutsize < 20 * iInsize));
448
if (!iRetcode) /* if oke ? */
449
*((*pOutbuf) + *iRealsize) = 0; /* then put terminator zero */
454
*pOutbuf = 0; /* nothing to do; then there's no output */
459
#ifdef MNG_SUPPORT_TRACE
460
MNG_TRACE (pData, MNG_FN_INFLATE_BUFFER, MNG_LC_END)
467
/* ************************************************************************** */
469
#endif /* MNG_INCLUDE_READ_PROCS */
471
/* ************************************************************************** */
473
/* * Helper routines to simplify chunk writing * */
475
/* ************************************************************************** */
476
#ifdef MNG_INCLUDE_WRITE_PROCS
477
/* ************************************************************************** */
479
#if !defined(MNG_SKIPCHUNK_iCCP) && !defined(MNG_SKIPCHUNK_zTXt) && !defined(MNG_SKIPCHUNK_iTXt)
480
MNG_LOCAL mng_retcode deflate_buffer (mng_datap pData,
484
mng_uint32 *iOutsize,
485
mng_uint32 *iRealsize)
487
mng_retcode iRetcode = MNG_NOERROR;
489
#ifdef MNG_SUPPORT_TRACE
490
MNG_TRACE (pData, MNG_FN_DEFLATE_BUFFER, MNG_LC_START)
493
if (iInsize) /* anything to do ? */
495
*iOutsize = (iInsize * 5) >> 2; /* estimate compressed size */
496
/* and allocate a temporary buffer */
497
MNG_ALLOC (pData, *pOutbuf, *iOutsize)
501
mngzlib_deflateinit (pData); /* initialize zlib */
502
/* let zlib know where to store the output */
503
pData->sZlib.next_out = *pOutbuf;
504
pData->sZlib.avail_out = *iOutsize;
505
/* ok; let's deflate... */
506
iRetcode = mngzlib_deflatedata (pData, iInsize, pInbuf);
507
/* determine actual output size */
508
*iRealsize = pData->sZlib.total_out;
510
mngzlib_deflatefree (pData); /* zlib's done */
512
if (iRetcode == MNG_BUFOVERFLOW) /* not enough space ? */
513
{ /* then get some more */
514
MNG_FREEX (pData, *pOutbuf, *iOutsize)
515
*iOutsize = *iOutsize + (iInsize >> 1);
516
MNG_ALLOC (pData, *pOutbuf, *iOutsize)
518
} /* repeat if we didn't have enough space */
519
while (iRetcode == MNG_BUFOVERFLOW);
523
*pOutbuf = 0; /* nothing to do; then there's no output */
528
#ifdef MNG_SUPPORT_TRACE
529
MNG_TRACE (pData, MNG_FN_DEFLATE_BUFFER, MNG_LC_END)
536
/* ************************************************************************** */
538
MNG_LOCAL mng_retcode write_raw_chunk (mng_datap pData,
539
mng_chunkid iChunkname,
546
#ifdef MNG_SUPPORT_TRACE
547
MNG_TRACE (pData, MNG_FN_WRITE_RAW_CHUNK, MNG_LC_START)
549
/* temporary buffer ? */
550
if ((pRawdata != 0) && (pRawdata != pData->pWritebuf+8))
551
{ /* store length & chunktype in default buffer */
552
mng_put_uint32 (pData->pWritebuf, iRawlen);
553
mng_put_uint32 (pData->pWritebuf+4, (mng_uint32)iChunkname);
555
if (pData->iCrcmode & MNG_CRC_OUTPUT)
557
if ((pData->iCrcmode & MNG_CRC_OUTPUT) == MNG_CRC_OUTPUT_GENERATE)
558
{ /* calculate the crc */
559
iCrc = update_crc (pData, 0xffffffffL, pData->pWritebuf+4, 4);
560
iCrc = update_crc (pData, iCrc, pRawdata, iRawlen) ^ 0xffffffffL;
562
iCrc = 0; /* dummy crc */
563
} /* store in default buffer */
564
mng_put_uint32 (pData->pWritebuf+8, iCrc);
566
/* write the length & chunktype */
567
if (!pData->fWritedata ((mng_handle)pData, pData->pWritebuf, 8, &iWritten))
568
MNG_ERROR (pData, MNG_APPIOERROR)
570
if (iWritten != 8) /* disk full ? */
571
MNG_ERROR (pData, MNG_OUTPUTERROR)
572
/* write the temporary buffer */
573
if (!pData->fWritedata ((mng_handle)pData, pRawdata, iRawlen, &iWritten))
574
MNG_ERROR (pData, MNG_APPIOERROR)
576
if (iWritten != iRawlen) /* disk full ? */
577
MNG_ERROR (pData, MNG_OUTPUTERROR)
579
if (pData->iCrcmode & MNG_CRC_OUTPUT)
580
{ /* write the crc */
581
if (!pData->fWritedata ((mng_handle)pData, pData->pWritebuf+8, 4, &iWritten))
582
MNG_ERROR (pData, MNG_APPIOERROR)
584
if (iWritten != 4) /* disk full ? */
585
MNG_ERROR (pData, MNG_OUTPUTERROR)
589
{ /* prefix with length & chunktype */
590
mng_put_uint32 (pData->pWritebuf, iRawlen);
591
mng_put_uint32 (pData->pWritebuf+4, (mng_uint32)iChunkname);
593
if (pData->iCrcmode & MNG_CRC_OUTPUT)
595
if ((pData->iCrcmode & MNG_CRC_OUTPUT) == MNG_CRC_OUTPUT_GENERATE)
596
/* calculate the crc */
597
iCrc = mng_crc (pData, pData->pWritebuf+4, iRawlen + 4);
599
iCrc = 0; /* dummy crc */
600
/* add it to the buffer */
601
mng_put_uint32 (pData->pWritebuf + iRawlen + 8, iCrc);
602
/* write it in a single pass */
603
if (!pData->fWritedata ((mng_handle)pData, pData->pWritebuf, iRawlen + 12, &iWritten))
604
MNG_ERROR (pData, MNG_APPIOERROR)
606
if (iWritten != iRawlen + 12) /* disk full ? */
607
MNG_ERROR (pData, MNG_OUTPUTERROR)
609
if (!pData->fWritedata ((mng_handle)pData, pData->pWritebuf, iRawlen + 8, &iWritten))
610
MNG_ERROR (pData, MNG_APPIOERROR)
612
if (iWritten != iRawlen + 8) /* disk full ? */
613
MNG_ERROR (pData, MNG_OUTPUTERROR)
617
#ifdef MNG_SUPPORT_TRACE
618
MNG_TRACE (pData, MNG_FN_WRITE_RAW_CHUNK, MNG_LC_END)
624
/* ************************************************************************** */
626
#endif /* MNG_INCLUDE_WRITE_PROCS */
628
/* ************************************************************************** */
630
/* * chunk read functions * */
632
/* ************************************************************************** */
634
#ifdef MNG_INCLUDE_READ_PROCS
636
/* ************************************************************************** */
638
READ_CHUNK (mng_read_ihdr)
640
#ifdef MNG_SUPPORT_TRACE
641
MNG_TRACE (pData, MNG_FN_READ_IHDR, MNG_LC_START)
644
if (iRawlen != 13) /* length oke ? */
645
MNG_ERROR (pData, MNG_INVALIDLENGTH)
646
/* only allowed inside PNG or MNG */
647
if ((pData->eSigtype != mng_it_png) && (pData->eSigtype != mng_it_mng))
648
MNG_ERROR (pData, MNG_CHUNKNOTALLOWED)
649
/* sequence checks */
650
if ((pData->eSigtype == mng_it_png) && (pData->iChunkseq > 1))
651
MNG_ERROR (pData, MNG_SEQUENCEERROR)
653
#ifdef MNG_INCLUDE_JNG
654
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasIDAT) || (pData->bHasJHDR))
656
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasIDAT))
658
MNG_ERROR (pData, MNG_SEQUENCEERROR)
660
pData->bHasIHDR = MNG_TRUE; /* indicate IHDR is present */
661
/* and store interesting fields */
662
if ((!pData->bHasDHDR) || (pData->iDeltatype == MNG_DELTATYPE_NOCHANGE))
664
pData->iDatawidth = mng_get_uint32 (pRawdata);
665
pData->iDataheight = mng_get_uint32 (pRawdata+4);
668
pData->iBitdepth = *(pRawdata+8);
669
pData->iColortype = *(pRawdata+9);
670
pData->iCompression = *(pRawdata+10);
671
pData->iFilter = *(pRawdata+11);
672
pData->iInterlace = *(pRawdata+12);
674
#if defined(MNG_NO_16BIT_SUPPORT)
676
pData->iPNGdepth = pData->iBitdepth;
678
if (pData->iBitdepth > 8)
680
pData->iBitdepth = 8;
685
if ((pData->iBitdepth != 8) /* parameter validity checks */
686
&& (pData->iBitdepth != 1) &&
687
(pData->iBitdepth != 2) &&
688
(pData->iBitdepth != 4)
689
#ifndef MNG_NO_16BIT_SUPPORT
690
&& (pData->iBitdepth != 16)
693
MNG_ERROR (pData, MNG_INVALIDBITDEPTH)
695
if ((pData->iColortype != MNG_COLORTYPE_GRAY ) &&
696
(pData->iColortype != MNG_COLORTYPE_RGB ) &&
697
(pData->iColortype != MNG_COLORTYPE_INDEXED) &&
698
(pData->iColortype != MNG_COLORTYPE_GRAYA ) &&
699
(pData->iColortype != MNG_COLORTYPE_RGBA ) )
700
MNG_ERROR (pData, MNG_INVALIDCOLORTYPE)
702
if ((pData->iColortype == MNG_COLORTYPE_INDEXED) && (pData->iBitdepth > 8))
703
MNG_ERROR (pData, MNG_INVALIDBITDEPTH)
705
if (((pData->iColortype == MNG_COLORTYPE_RGB ) ||
706
(pData->iColortype == MNG_COLORTYPE_GRAYA ) ||
707
(pData->iColortype == MNG_COLORTYPE_RGBA ) ) &&
708
(pData->iBitdepth < 8 ) )
709
MNG_ERROR (pData, MNG_INVALIDBITDEPTH)
711
if (pData->iCompression != MNG_COMPRESSION_DEFLATE)
712
MNG_ERROR (pData, MNG_INVALIDCOMPRESS)
714
#if defined(FILTER192) || defined(FILTER193)
715
if ((pData->iFilter != MNG_FILTER_ADAPTIVE ) &&
716
#if defined(FILTER192) && defined(FILTER193)
717
(pData->iFilter != MNG_FILTER_DIFFERING) &&
718
(pData->iFilter != MNG_FILTER_NOFILTER ) )
721
(pData->iFilter != MNG_FILTER_DIFFERING) )
723
(pData->iFilter != MNG_FILTER_NOFILTER ) )
726
MNG_ERROR (pData, MNG_INVALIDFILTER)
729
MNG_ERROR (pData, MNG_INVALIDFILTER)
732
if ((pData->iInterlace != MNG_INTERLACE_NONE ) &&
733
(pData->iInterlace != MNG_INTERLACE_ADAM7) )
734
MNG_ERROR (pData, MNG_INVALIDINTERLACE)
736
#ifdef MNG_SUPPORT_DISPLAY
737
#ifndef MNG_NO_DELTA_PNG
738
if (pData->bHasDHDR) /* check the colortype for delta-images ! */
740
mng_imagedatap pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf;
742
if (pData->iColortype != pBuf->iColortype)
744
if ( ( (pData->iColortype != MNG_COLORTYPE_INDEXED) ||
745
(pBuf->iColortype == MNG_COLORTYPE_GRAY ) ) &&
746
( (pData->iColortype != MNG_COLORTYPE_GRAY ) ||
747
(pBuf->iColortype == MNG_COLORTYPE_INDEXED) ) )
748
MNG_ERROR (pData, MNG_INVALIDCOLORTYPE)
754
if (!pData->bHasheader) /* first chunk ? */
756
pData->bHasheader = MNG_TRUE; /* we've got a header */
757
pData->eImagetype = mng_it_png; /* then this must be a PNG */
758
pData->iWidth = pData->iDatawidth;
759
pData->iHeight = pData->iDataheight;
760
/* predict alpha-depth ! */
761
if ((pData->iColortype == MNG_COLORTYPE_GRAYA ) ||
762
(pData->iColortype == MNG_COLORTYPE_RGBA ) )
763
pData->iAlphadepth = pData->iBitdepth;
765
if (pData->iColortype == MNG_COLORTYPE_INDEXED)
766
pData->iAlphadepth = 8; /* worst case scenario */
768
pData->iAlphadepth = 1; /* Possible tRNS cheap binary transparency */
769
/* fits on maximum canvas ? */
770
if ((pData->iWidth > pData->iMaxwidth) || (pData->iHeight > pData->iMaxheight))
771
MNG_WARNING (pData, MNG_IMAGETOOLARGE)
773
if (pData->fProcessheader) /* inform the app ? */
774
if (!pData->fProcessheader (((mng_handle)pData), pData->iWidth, pData->iHeight))
775
MNG_ERROR (pData, MNG_APPMISCERROR)
778
if (!pData->bHasDHDR)
779
pData->iImagelevel++; /* one level deeper */
781
#ifdef MNG_SUPPORT_DISPLAY
783
mng_retcode iRetcode = mng_process_display_ihdr (pData);
785
if (iRetcode) /* on error bail out */
788
#endif /* MNG_SUPPORT_DISPLAY */
790
#ifdef MNG_STORE_CHUNKS
791
if (pData->bStorechunks)
792
{ /* initialize storage */
793
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
795
if (iRetcode) /* on error bail out */
797
/* fill the fields */
798
((mng_ihdrp)*ppChunk)->iWidth = mng_get_uint32 (pRawdata);
799
((mng_ihdrp)*ppChunk)->iHeight = mng_get_uint32 (pRawdata+4);
800
((mng_ihdrp)*ppChunk)->iBitdepth = pData->iBitdepth;
801
((mng_ihdrp)*ppChunk)->iColortype = pData->iColortype;
802
((mng_ihdrp)*ppChunk)->iCompression = pData->iCompression;
803
((mng_ihdrp)*ppChunk)->iFilter = pData->iFilter;
804
((mng_ihdrp)*ppChunk)->iInterlace = pData->iInterlace;
806
#endif /* MNG_STORE_CHUNKS */
808
#ifdef MNG_SUPPORT_TRACE
809
MNG_TRACE (pData, MNG_FN_READ_IHDR, MNG_LC_END)
812
return MNG_NOERROR; /* done */
815
/* ************************************************************************** */
817
READ_CHUNK (mng_read_plte)
819
#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS)
821
mng_uint8p pRawdata2;
823
#ifdef MNG_SUPPORT_DISPLAY
827
#ifdef MNG_SUPPORT_TRACE
828
MNG_TRACE (pData, MNG_FN_READ_PLTE, MNG_LC_START)
830
/* sequence checks */
831
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
832
(!pData->bHasBASI) && (!pData->bHasDHDR) )
833
MNG_ERROR (pData, MNG_SEQUENCEERROR)
835
#ifdef MNG_INCLUDE_JNG
836
if ((pData->bHasIDAT) || (pData->bHasJHDR))
840
MNG_ERROR (pData, MNG_SEQUENCEERROR)
841
/* multiple PLTE only inside BASI */
842
if ((pData->bHasPLTE) && (!pData->bHasBASI))
843
MNG_ERROR (pData, MNG_MULTIPLEERROR)
844
/* length must be multiple of 3 */
845
if (((iRawlen % 3) != 0) || (iRawlen > 768))
846
MNG_ERROR (pData, MNG_INVALIDLENGTH)
848
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
849
{ /* only allowed for indexed-color or
851
if ((pData->iColortype != 2) && (pData->iColortype != 3) && (pData->iColortype != 6))
852
MNG_ERROR (pData, MNG_CHUNKNOTALLOWED)
853
/* empty only allowed if global present */
854
if ((iRawlen == 0) && (!pData->bHasglobalPLTE))
855
MNG_ERROR (pData, MNG_CANNOTBEEMPTY)
859
if (iRawlen == 0) /* cannot be empty as global! */
860
MNG_ERROR (pData, MNG_CANNOTBEEMPTY)
863
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
864
pData->bHasPLTE = MNG_TRUE; /* got it! */
866
pData->bHasglobalPLTE = MNG_TRUE;
868
pData->iPLTEcount = iRawlen / 3;
870
#ifdef MNG_SUPPORT_DISPLAY
871
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
876
#ifndef MNG_NO_DELTA_PNG
877
if (pData->bHasDHDR) /* processing delta-image ? */
878
{ /* store in object 0 !!! */
879
pImage = (mng_imagep)pData->pObjzero;
880
pBuf = pImage->pImgbuf;
881
pBuf->bHasPLTE = MNG_TRUE; /* it's definitely got a PLTE now */
882
pBuf->iPLTEcount = iRawlen / 3; /* this is the exact length */
883
pRawdata2 = pRawdata; /* copy the entries */
885
for (iX = 0; iX < iRawlen / 3; iX++)
887
pBuf->aPLTEentries[iX].iRed = *pRawdata2;
888
pBuf->aPLTEentries[iX].iGreen = *(pRawdata2+1);
889
pBuf->aPLTEentries[iX].iBlue = *(pRawdata2+2);
896
{ /* get the current object */
897
pImage = (mng_imagep)pData->pCurrentobj;
899
if (!pImage) /* no object then dump it in obj 0 */
900
pImage = (mng_imagep)pData->pObjzero;
902
pBuf = pImage->pImgbuf; /* address the object buffer */
903
pBuf->bHasPLTE = MNG_TRUE; /* and tell it it's got a PLTE now */
905
if (!iRawlen) /* if empty, inherit from global */
907
pBuf->iPLTEcount = pData->iGlobalPLTEcount;
908
MNG_COPY (pBuf->aPLTEentries, pData->aGlobalPLTEentries,
909
sizeof (pBuf->aPLTEentries))
911
if (pData->bHasglobalTRNS) /* also copy global tRNS ? */
912
{ /* indicate tRNS available */
913
pBuf->bHasTRNS = MNG_TRUE;
915
iRawlen2 = pData->iGlobalTRNSrawlen;
916
pRawdata2 = (mng_uint8p)(pData->aGlobalTRNSrawdata);
917
/* global length oke ? */
918
if ((iRawlen2 == 0) || (iRawlen2 > pBuf->iPLTEcount))
919
MNG_ERROR (pData, MNG_GLOBALLENGTHERR)
921
pBuf->iTRNScount = iRawlen2;
922
MNG_COPY (pBuf->aTRNSentries, pRawdata2, iRawlen2)
926
{ /* store fields for future reference */
927
pBuf->iPLTEcount = iRawlen / 3;
928
pRawdata2 = pRawdata;
930
for (iX = 0; iX < pBuf->iPLTEcount; iX++)
932
pBuf->aPLTEentries[iX].iRed = *pRawdata2;
933
pBuf->aPLTEentries[iX].iGreen = *(pRawdata2+1);
934
pBuf->aPLTEentries[iX].iBlue = *(pRawdata2+2);
941
else /* store as global */
943
pData->iGlobalPLTEcount = iRawlen / 3;
944
pRawdata2 = pRawdata;
946
for (iX = 0; iX < pData->iGlobalPLTEcount; iX++)
948
pData->aGlobalPLTEentries[iX].iRed = *pRawdata2;
949
pData->aGlobalPLTEentries[iX].iGreen = *(pRawdata2+1);
950
pData->aGlobalPLTEentries[iX].iBlue = *(pRawdata2+2);
955
{ /* create an animation object */
956
mng_retcode iRetcode = mng_create_ani_plte (pData, pData->iGlobalPLTEcount,
957
pData->aGlobalPLTEentries);
959
if (iRetcode) /* on error bail out */
963
#endif /* MNG_SUPPORT_DISPLAY */
965
#ifdef MNG_STORE_CHUNKS
966
if (pData->bStorechunks)
967
{ /* initialize storage */
968
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
970
if (iRetcode) /* on error bail out */
972
/* store the fields */
973
((mng_pltep)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
974
((mng_pltep)*ppChunk)->iEntrycount = iRawlen / 3;
975
pRawdata2 = pRawdata;
977
for (iX = 0; iX < ((mng_pltep)*ppChunk)->iEntrycount; iX++)
979
((mng_pltep)*ppChunk)->aEntries[iX].iRed = *pRawdata2;
980
((mng_pltep)*ppChunk)->aEntries[iX].iGreen = *(pRawdata2+1);
981
((mng_pltep)*ppChunk)->aEntries[iX].iBlue = *(pRawdata2+2);
986
#endif /* MNG_STORE_CHUNKS */
988
#ifdef MNG_SUPPORT_TRACE
989
MNG_TRACE (pData, MNG_FN_READ_PLTE, MNG_LC_END)
992
return MNG_NOERROR; /* done */
995
/* ************************************************************************** */
997
READ_CHUNK (mng_read_idat)
999
#ifdef MNG_SUPPORT_TRACE
1000
MNG_TRACE (pData, MNG_FN_READ_IDAT, MNG_LC_START)
1003
#ifdef MNG_INCLUDE_JNG /* sequence checks */
1004
if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
1006
if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR))
1008
MNG_ERROR (pData, MNG_SEQUENCEERROR)
1010
#ifdef MNG_INCLUDE_JNG
1011
if ((pData->bHasJHDR) &&
1012
(pData->iJHDRalphacompression != MNG_COMPRESSION_DEFLATE))
1013
MNG_ERROR (pData, MNG_SEQUENCEERROR)
1015
if (pData->bHasJSEP)
1016
MNG_ERROR (pData, MNG_SEQUENCEERROR)
1018
/* not allowed for deltatype NO_CHANGE */
1019
#ifndef MNG_NO_DELTA_PNG
1020
if ((pData->bHasDHDR) && ((pData->iDeltatype == MNG_DELTATYPE_NOCHANGE)))
1021
MNG_ERROR (pData, MNG_CHUNKNOTALLOWED)
1023
/* can only be empty in BASI-block! */
1024
if ((iRawlen == 0) && (!pData->bHasBASI))
1025
MNG_ERROR (pData, MNG_INVALIDLENGTH)
1026
/* indexed-color requires PLTE */
1027
if ((pData->bHasIHDR) && (pData->iColortype == 3) && (!pData->bHasPLTE))
1028
MNG_ERROR (pData, MNG_PLTEMISSING)
1030
pData->bHasIDAT = MNG_TRUE; /* got some IDAT now, don't we */
1032
#ifdef MNG_SUPPORT_DISPLAY
1034
{ /* display processing */
1035
mng_retcode iRetcode = mng_process_display_idat (pData, iRawlen, pRawdata);
1037
if (iRetcode) /* on error bail out */
1040
#endif /* MNG_SUPPORT_DISPLAY */
1042
#ifdef MNG_STORE_CHUNKS
1043
if (pData->bStorechunks)
1044
{ /* initialize storage */
1045
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
1047
if (iRetcode) /* on error bail out */
1049
/* store the fields */
1050
((mng_idatp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
1051
((mng_idatp)*ppChunk)->iDatasize = iRawlen;
1053
if (iRawlen != 0) /* is there any data ? */
1055
MNG_ALLOC (pData, ((mng_idatp)*ppChunk)->pData, iRawlen)
1056
MNG_COPY (((mng_idatp)*ppChunk)->pData, pRawdata, iRawlen)
1059
#endif /* MNG_STORE_CHUNKS */
1061
#ifdef MNG_SUPPORT_TRACE
1062
MNG_TRACE (pData, MNG_FN_READ_IDAT, MNG_LC_END)
1065
return MNG_NOERROR; /* done */
1068
/* ************************************************************************** */
1070
READ_CHUNK (mng_read_iend)
1072
#ifdef MNG_SUPPORT_TRACE
1073
MNG_TRACE (pData, MNG_FN_READ_IEND, MNG_LC_START)
1076
if (iRawlen > 0) /* must not contain data! */
1077
MNG_ERROR (pData, MNG_INVALIDLENGTH);
1079
#ifdef MNG_INCLUDE_JNG /* sequence checks */
1080
if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
1082
if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR))
1084
MNG_ERROR (pData, MNG_SEQUENCEERROR)
1085
/* IHDR-block requires IDAT */
1086
if ((pData->bHasIHDR) && (!pData->bHasIDAT))
1087
MNG_ERROR (pData, MNG_IDATMISSING)
1089
pData->iImagelevel--; /* one level up */
1091
#ifdef MNG_SUPPORT_DISPLAY
1092
{ /* create an animation object */
1093
mng_retcode iRetcode = mng_create_ani_image (pData);
1095
if (iRetcode) /* on error bail out */
1097
/* display processing */
1098
iRetcode = mng_process_display_iend (pData);
1100
if (iRetcode) /* on error bail out */
1103
#endif /* MNG_SUPPORT_DISPLAY */
1105
#ifdef MNG_SUPPORT_DISPLAY
1106
if (!pData->bTimerset) /* reset only if not broken !!! */
1109
/* IEND signals the end for most ... */
1110
pData->bHasIHDR = MNG_FALSE;
1111
pData->bHasBASI = MNG_FALSE;
1112
pData->bHasDHDR = MNG_FALSE;
1113
#ifdef MNG_INCLUDE_JNG
1114
pData->bHasJHDR = MNG_FALSE;
1115
pData->bHasJSEP = MNG_FALSE;
1116
pData->bHasJDAA = MNG_FALSE;
1117
pData->bHasJDAT = MNG_FALSE;
1119
pData->bHasPLTE = MNG_FALSE;
1120
pData->bHasTRNS = MNG_FALSE;
1121
pData->bHasGAMA = MNG_FALSE;
1122
pData->bHasCHRM = MNG_FALSE;
1123
pData->bHasSRGB = MNG_FALSE;
1124
pData->bHasICCP = MNG_FALSE;
1125
pData->bHasBKGD = MNG_FALSE;
1126
pData->bHasIDAT = MNG_FALSE;
1127
#ifdef MNG_SUPPORT_DISPLAY
1131
#ifdef MNG_STORE_CHUNKS
1132
if (pData->bStorechunks)
1133
{ /* initialize storage */
1134
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
1136
if (iRetcode) /* on error bail out */
1139
#endif /* MNG_STORE_CHUNKS */
1141
#ifdef MNG_SUPPORT_TRACE
1142
MNG_TRACE (pData, MNG_FN_READ_IEND, MNG_LC_END)
1145
return MNG_NOERROR; /* done */
1148
/* ************************************************************************** */
1150
READ_CHUNK (mng_read_trns)
1152
#ifdef MNG_SUPPORT_TRACE
1153
MNG_TRACE (pData, MNG_FN_READ_TRNS, MNG_LC_START)
1155
/* sequence checks */
1156
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
1157
(!pData->bHasBASI) && (!pData->bHasDHDR) )
1158
MNG_ERROR (pData, MNG_SEQUENCEERROR)
1160
#ifdef MNG_INCLUDE_JNG
1161
if ((pData->bHasIDAT) || (pData->bHasJHDR))
1163
if (pData->bHasIDAT)
1165
MNG_ERROR (pData, MNG_SEQUENCEERROR)
1166
/* multiple tRNS only inside BASI */
1167
if ((pData->bHasTRNS) && (!pData->bHasBASI))
1168
MNG_ERROR (pData, MNG_MULTIPLEERROR)
1170
if (iRawlen > 256) /* it just can't be bigger than that! */
1171
MNG_ERROR (pData, MNG_INVALIDLENGTH)
1173
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1174
{ /* not allowed with full alpha-channel */
1175
if ((pData->iColortype == 4) || (pData->iColortype == 6))
1176
MNG_ERROR (pData, MNG_CHUNKNOTALLOWED)
1178
if (iRawlen != 0) /* filled ? */
1179
{ /* length checks */
1180
if ((pData->iColortype == 0) && (iRawlen != 2))
1181
MNG_ERROR (pData, MNG_INVALIDLENGTH)
1183
if ((pData->iColortype == 2) && (iRawlen != 6))
1184
MNG_ERROR (pData, MNG_INVALIDLENGTH)
1186
#ifdef MNG_SUPPORT_DISPLAY
1187
if (pData->iColortype == 3)
1189
mng_imagep pImage = (mng_imagep)pData->pCurrentobj;
1190
mng_imagedatap pBuf;
1192
if (!pImage) /* no object then check obj 0 */
1193
pImage = (mng_imagep)pData->pObjzero;
1195
pBuf = pImage->pImgbuf; /* address object buffer */
1197
if (iRawlen > pBuf->iPLTEcount)
1198
MNG_ERROR (pData, MNG_INVALIDLENGTH)
1202
else /* if empty there must be global stuff! */
1204
if (!pData->bHasglobalTRNS)
1205
MNG_ERROR (pData, MNG_CANNOTBEEMPTY)
1209
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1210
pData->bHasTRNS = MNG_TRUE; /* indicate tRNS available */
1212
pData->bHasglobalTRNS = MNG_TRUE;
1214
#ifdef MNG_SUPPORT_DISPLAY
1215
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1218
mng_imagedatap pBuf;
1219
mng_uint8p pRawdata2;
1220
mng_uint32 iRawlen2;
1222
#ifndef MNG_NO_DELTA_PNG
1223
if (pData->bHasDHDR) /* processing delta-image ? */
1224
{ /* store in object 0 !!! */
1225
pImage = (mng_imagep)pData->pObjzero;
1226
pBuf = pImage->pImgbuf; /* address object buffer */
1228
switch (pData->iColortype) /* store fields for future reference */
1230
case 0: { /* gray */
1231
pBuf->iTRNSgray = mng_get_uint16 (pRawdata);
1233
pBuf->iTRNSgreen = 0;
1234
pBuf->iTRNSblue = 0;
1235
pBuf->iTRNScount = 0;
1239
pBuf->iTRNSgray = 0;
1240
pBuf->iTRNSred = mng_get_uint16 (pRawdata);
1241
pBuf->iTRNSgreen = mng_get_uint16 (pRawdata+2);
1242
pBuf->iTRNSblue = mng_get_uint16 (pRawdata+4);
1243
pBuf->iTRNScount = 0;
1246
case 3: { /* indexed */
1247
pBuf->iTRNSgray = 0;
1249
pBuf->iTRNSgreen = 0;
1250
pBuf->iTRNSblue = 0;
1251
pBuf->iTRNScount = iRawlen;
1252
MNG_COPY (pBuf->aTRNSentries, pRawdata, iRawlen)
1257
pBuf->bHasTRNS = MNG_TRUE; /* tell it it's got a tRNS now */
1261
{ /* address current object */
1262
pImage = (mng_imagep)pData->pCurrentobj;
1264
if (!pImage) /* no object then dump it in obj 0 */
1265
pImage = (mng_imagep)pData->pObjzero;
1267
pBuf = pImage->pImgbuf; /* address object buffer */
1268
pBuf->bHasTRNS = MNG_TRUE; /* and tell it it's got a tRNS now */
1270
if (iRawlen == 0) /* if empty, inherit from global */
1272
iRawlen2 = pData->iGlobalTRNSrawlen;
1273
pRawdata2 = (mng_ptr)(pData->aGlobalTRNSrawdata);
1274
/* global length oke ? */
1275
if ((pData->iColortype == 0) && (iRawlen2 != 2))
1276
MNG_ERROR (pData, MNG_GLOBALLENGTHERR)
1278
if ((pData->iColortype == 2) && (iRawlen2 != 6))
1279
MNG_ERROR (pData, MNG_GLOBALLENGTHERR)
1281
if ((pData->iColortype == 3) && ((iRawlen2 == 0) || (iRawlen2 > pBuf->iPLTEcount)))
1282
MNG_ERROR (pData, MNG_GLOBALLENGTHERR)
1287
pRawdata2 = pRawdata;
1290
switch (pData->iColortype) /* store fields for future reference */
1292
case 0: { /* gray */
1293
pBuf->iTRNSgray = mng_get_uint16 (pRawdata2);
1295
pBuf->iTRNSgreen = 0;
1296
pBuf->iTRNSblue = 0;
1297
pBuf->iTRNScount = 0;
1301
pBuf->iTRNSgray = 0;
1302
pBuf->iTRNSred = mng_get_uint16 (pRawdata2);
1303
pBuf->iTRNSgreen = mng_get_uint16 (pRawdata2+2);
1304
pBuf->iTRNSblue = mng_get_uint16 (pRawdata2+4);
1305
pBuf->iTRNScount = 0;
1308
case 3: { /* indexed */
1309
pBuf->iTRNSgray = 0;
1311
pBuf->iTRNSgreen = 0;
1312
pBuf->iTRNSblue = 0;
1313
pBuf->iTRNScount = iRawlen2;
1314
MNG_COPY (pBuf->aTRNSentries, pRawdata2, iRawlen2)
1320
else /* store as global */
1322
pData->iGlobalTRNSrawlen = iRawlen;
1323
MNG_COPY (pData->aGlobalTRNSrawdata, pRawdata, iRawlen)
1325
{ /* create an animation object */
1326
mng_retcode iRetcode = mng_create_ani_trns (pData, pData->iGlobalTRNSrawlen,
1327
pData->aGlobalTRNSrawdata);
1329
if (iRetcode) /* on error bail out */
1333
#endif /* MNG_SUPPORT_DISPLAY */
1335
#ifdef MNG_STORE_CHUNKS
1336
if (pData->bStorechunks)
1337
{ /* initialize storage */
1338
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
1340
if (iRetcode) /* on error bail out */
1343
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1345
((mng_trnsp)*ppChunk)->bGlobal = MNG_FALSE;
1346
((mng_trnsp)*ppChunk)->iType = pData->iColortype;
1348
if (iRawlen == 0) /* if empty, indicate so */
1349
((mng_trnsp)*ppChunk)->bEmpty = MNG_TRUE;
1352
((mng_trnsp)*ppChunk)->bEmpty = MNG_FALSE;
1354
switch (pData->iColortype) /* store fields */
1356
case 0: { /* gray */
1357
((mng_trnsp)*ppChunk)->iGray = mng_get_uint16 (pRawdata);
1361
((mng_trnsp)*ppChunk)->iRed = mng_get_uint16 (pRawdata);
1362
((mng_trnsp)*ppChunk)->iGreen = mng_get_uint16 (pRawdata+2);
1363
((mng_trnsp)*ppChunk)->iBlue = mng_get_uint16 (pRawdata+4);
1366
case 3: { /* indexed */
1367
((mng_trnsp)*ppChunk)->iCount = iRawlen;
1368
MNG_COPY (((mng_trnsp)*ppChunk)->aEntries, pRawdata, iRawlen)
1374
else /* it's global! */
1376
((mng_trnsp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
1377
((mng_trnsp)*ppChunk)->bGlobal = MNG_TRUE;
1378
((mng_trnsp)*ppChunk)->iType = 0;
1379
((mng_trnsp)*ppChunk)->iRawlen = iRawlen;
1381
MNG_COPY (((mng_trnsp)*ppChunk)->aRawdata, pRawdata, iRawlen)
1384
#endif /* MNG_STORE_CHUNKS */
1386
#ifdef MNG_SUPPORT_TRACE
1387
MNG_TRACE (pData, MNG_FN_READ_TRNS, MNG_LC_END)
1390
return MNG_NOERROR; /* done */
1393
/* ************************************************************************** */
1395
READ_CHUNK (mng_read_gama)
1397
#ifdef MNG_SUPPORT_TRACE
1398
MNG_TRACE (pData, MNG_FN_READ_GAMA, MNG_LC_START)
1400
/* sequence checks */
1401
#ifdef MNG_INCLUDE_JNG
1402
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
1403
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
1405
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
1406
(!pData->bHasBASI) && (!pData->bHasDHDR) )
1408
MNG_ERROR (pData, MNG_SEQUENCEERROR)
1410
#ifdef MNG_INCLUDE_JNG
1411
if ((pData->bHasIDAT) || (pData->bHasPLTE) || (pData->bHasJDAT) || (pData->bHasJDAA))
1413
if ((pData->bHasIDAT) || (pData->bHasPLTE))
1415
MNG_ERROR (pData, MNG_SEQUENCEERROR)
1417
#ifdef MNG_INCLUDE_JNG
1418
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
1420
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1422
{ /* length must be exactly 4 */
1424
MNG_ERROR (pData, MNG_INVALIDLENGTH)
1427
{ /* length must be empty or exactly 4 */
1428
if ((iRawlen != 0) && (iRawlen != 4))
1429
MNG_ERROR (pData, MNG_INVALIDLENGTH)
1432
#ifdef MNG_INCLUDE_JNG
1433
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
1435
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1437
pData->bHasGAMA = MNG_TRUE; /* indicate we've got it */
1439
pData->bHasglobalGAMA = (mng_bool)(iRawlen != 0);
1441
#ifdef MNG_SUPPORT_DISPLAY
1442
#ifdef MNG_INCLUDE_JNG
1443
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
1445
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1450
#ifndef MNG_NO_DELTA_PNG
1451
if (pData->bHasDHDR) /* update delta image ? */
1452
{ /* store in object 0 ! */
1453
pImage = (mng_imagep)pData->pObjzero;
1454
/* store for color-processing routines */
1455
pImage->pImgbuf->iGamma = mng_get_uint32 (pRawdata);
1456
pImage->pImgbuf->bHasGAMA = MNG_TRUE;
1461
pImage = (mng_imagep)pData->pCurrentobj;
1463
if (!pImage) /* no object then dump it in obj 0 */
1464
pImage = (mng_imagep)pData->pObjzero;
1465
/* store for color-processing routines */
1466
pImage->pImgbuf->iGamma = mng_get_uint32 (pRawdata);
1467
pImage->pImgbuf->bHasGAMA = MNG_TRUE;
1471
{ /* store as global */
1473
pData->iGlobalGamma = mng_get_uint32 (pRawdata);
1475
{ /* create an animation object */
1476
mng_retcode iRetcode = mng_create_ani_gama (pData, (mng_bool)(iRawlen == 0),
1477
pData->iGlobalGamma);
1479
if (iRetcode) /* on error bail out */
1483
#endif /* MNG_SUPPORT_DISPLAY */
1485
#ifdef MNG_STORE_CHUNKS
1486
if (pData->bStorechunks)
1487
{ /* initialize storage */
1488
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
1490
if (iRetcode) /* on error bail out */
1492
/* store the fields */
1493
((mng_gamap)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
1496
((mng_gamap)*ppChunk)->iGamma = mng_get_uint32 (pRawdata);
1499
#endif /* MNG_STORE_CHUNKS */
1501
#ifdef MNG_SUPPORT_TRACE
1502
MNG_TRACE (pData, MNG_FN_READ_GAMA, MNG_LC_END)
1505
return MNG_NOERROR; /* done */
1508
/* ************************************************************************** */
1510
#ifndef MNG_SKIPCHUNK_cHRM
1511
READ_CHUNK (mng_read_chrm)
1513
#ifdef MNG_SUPPORT_TRACE
1514
MNG_TRACE (pData, MNG_FN_READ_CHRM, MNG_LC_START)
1516
/* sequence checks */
1517
#ifdef MNG_INCLUDE_JNG
1518
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
1519
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
1521
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
1522
(!pData->bHasBASI) && (!pData->bHasDHDR) )
1524
MNG_ERROR (pData, MNG_SEQUENCEERROR)
1526
#ifdef MNG_INCLUDE_JNG
1527
if ((pData->bHasIDAT) || (pData->bHasPLTE) || (pData->bHasJDAT) || (pData->bHasJDAA))
1529
if ((pData->bHasIDAT) || (pData->bHasPLTE))
1531
MNG_ERROR (pData, MNG_SEQUENCEERROR)
1533
#ifdef MNG_INCLUDE_JNG
1534
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
1536
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1538
{ /* length must be exactly 32 */
1540
MNG_ERROR (pData, MNG_INVALIDLENGTH)
1543
{ /* length must be empty or exactly 32 */
1544
if ((iRawlen != 0) && (iRawlen != 32))
1545
MNG_ERROR (pData, MNG_INVALIDLENGTH)
1548
#ifdef MNG_INCLUDE_JNG
1549
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
1551
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1553
pData->bHasCHRM = MNG_TRUE; /* indicate we've got it */
1555
pData->bHasglobalCHRM = (mng_bool)(iRawlen != 0);
1557
#ifdef MNG_SUPPORT_DISPLAY
1559
mng_uint32 iWhitepointx, iWhitepointy;
1560
mng_uint32 iPrimaryredx, iPrimaryredy;
1561
mng_uint32 iPrimarygreenx, iPrimarygreeny;
1562
mng_uint32 iPrimarybluex, iPrimarybluey;
1564
iWhitepointx = mng_get_uint32 (pRawdata);
1565
iWhitepointy = mng_get_uint32 (pRawdata+4);
1566
iPrimaryredx = mng_get_uint32 (pRawdata+8);
1567
iPrimaryredy = mng_get_uint32 (pRawdata+12);
1568
iPrimarygreenx = mng_get_uint32 (pRawdata+16);
1569
iPrimarygreeny = mng_get_uint32 (pRawdata+20);
1570
iPrimarybluex = mng_get_uint32 (pRawdata+24);
1571
iPrimarybluey = mng_get_uint32 (pRawdata+28);
1573
#ifdef MNG_INCLUDE_JNG
1574
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
1576
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1580
mng_imagedatap pBuf;
1582
#ifndef MNG_NO_DELTA_PNG
1583
if (pData->bHasDHDR) /* update delta image ? */
1584
{ /* store it in object 0 ! */
1585
pImage = (mng_imagep)pData->pObjzero;
1587
pBuf = pImage->pImgbuf; /* address object buffer */
1588
pBuf->bHasCHRM = MNG_TRUE; /* and tell it it's got a CHRM now */
1589
/* store for color-processing routines */
1590
pBuf->iWhitepointx = iWhitepointx;
1591
pBuf->iWhitepointy = iWhitepointy;
1592
pBuf->iPrimaryredx = iPrimaryredx;
1593
pBuf->iPrimaryredy = iPrimaryredy;
1594
pBuf->iPrimarygreenx = iPrimarygreenx;
1595
pBuf->iPrimarygreeny = iPrimarygreeny;
1596
pBuf->iPrimarybluex = iPrimarybluex;
1597
pBuf->iPrimarybluey = iPrimarybluey;
1602
pImage = (mng_imagep)pData->pCurrentobj;
1604
if (!pImage) /* no object then dump it in obj 0 */
1605
pImage = (mng_imagep)pData->pObjzero;
1607
pBuf = pImage->pImgbuf; /* address object buffer */
1608
pBuf->bHasCHRM = MNG_TRUE; /* and tell it it's got a CHRM now */
1609
/* store for color-processing routines */
1610
pBuf->iWhitepointx = iWhitepointx;
1611
pBuf->iWhitepointy = iWhitepointy;
1612
pBuf->iPrimaryredx = iPrimaryredx;
1613
pBuf->iPrimaryredy = iPrimaryredy;
1614
pBuf->iPrimarygreenx = iPrimarygreenx;
1615
pBuf->iPrimarygreeny = iPrimarygreeny;
1616
pBuf->iPrimarybluex = iPrimarybluex;
1617
pBuf->iPrimarybluey = iPrimarybluey;
1621
{ /* store as global */
1624
pData->iGlobalWhitepointx = iWhitepointx;
1625
pData->iGlobalWhitepointy = iWhitepointy;
1626
pData->iGlobalPrimaryredx = iPrimaryredx;
1627
pData->iGlobalPrimaryredy = iPrimaryredy;
1628
pData->iGlobalPrimarygreenx = iPrimarygreenx;
1629
pData->iGlobalPrimarygreeny = iPrimarygreeny;
1630
pData->iGlobalPrimarybluex = iPrimarybluex;
1631
pData->iGlobalPrimarybluey = iPrimarybluey;
1634
{ /* create an animation object */
1635
mng_retcode iRetcode = mng_create_ani_chrm (pData, (mng_bool)(iRawlen == 0),
1636
iWhitepointx, iWhitepointy,
1637
iPrimaryredx, iPrimaryredy,
1638
iPrimarygreenx, iPrimarygreeny,
1639
iPrimarybluex, iPrimarybluey);
1641
if (iRetcode) /* on error bail out */
1646
#endif /* MNG_SUPPORT_DISPLAY */
1648
#ifdef MNG_STORE_CHUNKS
1649
if (pData->bStorechunks)
1650
{ /* initialize storage */
1651
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
1653
if (iRetcode) /* on error bail out */
1655
/* store the fields */
1656
((mng_chrmp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
1660
((mng_chrmp)*ppChunk)->iWhitepointx = mng_get_uint32 (pRawdata);
1661
((mng_chrmp)*ppChunk)->iWhitepointy = mng_get_uint32 (pRawdata+4);
1662
((mng_chrmp)*ppChunk)->iRedx = mng_get_uint32 (pRawdata+8);
1663
((mng_chrmp)*ppChunk)->iRedy = mng_get_uint32 (pRawdata+12);
1664
((mng_chrmp)*ppChunk)->iGreenx = mng_get_uint32 (pRawdata+16);
1665
((mng_chrmp)*ppChunk)->iGreeny = mng_get_uint32 (pRawdata+20);
1666
((mng_chrmp)*ppChunk)->iBluex = mng_get_uint32 (pRawdata+24);
1667
((mng_chrmp)*ppChunk)->iBluey = mng_get_uint32 (pRawdata+28);
1670
#endif /* MNG_STORE_CHUNKS */
1672
#ifdef MNG_SUPPORT_TRACE
1673
MNG_TRACE (pData, MNG_FN_READ_CHRM, MNG_LC_END)
1676
return MNG_NOERROR; /* done */
1680
/* ************************************************************************** */
1682
READ_CHUNK (mng_read_srgb)
1684
#ifdef MNG_SUPPORT_TRACE
1685
MNG_TRACE (pData, MNG_FN_READ_SRGB, MNG_LC_START)
1687
/* sequence checks */
1688
#ifdef MNG_INCLUDE_JNG
1689
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
1690
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
1692
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
1693
(!pData->bHasBASI) && (!pData->bHasDHDR) )
1695
MNG_ERROR (pData, MNG_SEQUENCEERROR)
1697
#ifdef MNG_INCLUDE_JNG
1698
if ((pData->bHasIDAT) || (pData->bHasPLTE) || (pData->bHasJDAT) || (pData->bHasJDAA))
1700
if ((pData->bHasIDAT) || (pData->bHasPLTE))
1702
MNG_ERROR (pData, MNG_SEQUENCEERROR)
1704
#ifdef MNG_INCLUDE_JNG
1705
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
1707
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1709
{ /* length must be exactly 1 */
1711
MNG_ERROR (pData, MNG_INVALIDLENGTH)
1714
{ /* length must be empty or exactly 1 */
1715
if ((iRawlen != 0) && (iRawlen != 1))
1716
MNG_ERROR (pData, MNG_INVALIDLENGTH)
1719
#ifdef MNG_INCLUDE_JNG
1720
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
1722
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1724
pData->bHasSRGB = MNG_TRUE; /* indicate we've got it */
1726
pData->bHasglobalSRGB = (mng_bool)(iRawlen != 0);
1728
#ifdef MNG_SUPPORT_DISPLAY
1729
#ifdef MNG_INCLUDE_JNG
1730
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
1732
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1737
#ifndef MNG_NO_DELTA_PNG
1738
if (pData->bHasDHDR) /* update delta image ? */
1739
{ /* store in object 0 ! */
1740
pImage = (mng_imagep)pData->pObjzero;
1741
/* store for color-processing routines */
1742
pImage->pImgbuf->iRenderingintent = *pRawdata;
1743
pImage->pImgbuf->bHasSRGB = MNG_TRUE;
1748
pImage = (mng_imagep)pData->pCurrentobj;
1750
if (!pImage) /* no object then dump it in obj 0 */
1751
pImage = (mng_imagep)pData->pObjzero;
1752
/* store for color-processing routines */
1753
pImage->pImgbuf->iRenderingintent = *pRawdata;
1754
pImage->pImgbuf->bHasSRGB = MNG_TRUE;
1758
{ /* store as global */
1760
pData->iGlobalRendintent = *pRawdata;
1762
{ /* create an animation object */
1763
mng_retcode iRetcode = mng_create_ani_srgb (pData, (mng_bool)(iRawlen == 0),
1764
pData->iGlobalRendintent);
1766
if (iRetcode) /* on error bail out */
1770
#endif /* MNG_SUPPORT_DISPLAY */
1772
#ifdef MNG_STORE_CHUNKS
1773
if (pData->bStorechunks)
1774
{ /* initialize storage */
1775
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
1777
if (iRetcode) /* on error bail out */
1779
/* store the fields */
1780
((mng_srgbp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
1783
((mng_srgbp)*ppChunk)->iRenderingintent = *pRawdata;
1786
#endif /* MNG_STORE_CHUNKS */
1788
#ifdef MNG_SUPPORT_TRACE
1789
MNG_TRACE (pData, MNG_FN_READ_SRGB, MNG_LC_END)
1792
return MNG_NOERROR; /* done */
1795
/* ************************************************************************** */
1797
#ifndef MNG_SKIPCHUNK_iCCP
1798
READ_CHUNK (mng_read_iccp)
1800
mng_retcode iRetcode;
1802
mng_uint32 iCompressedsize;
1803
mng_uint32 iProfilesize;
1804
mng_uint32 iBufsize = 0;
1805
mng_uint8p pBuf = 0;
1807
#ifdef MNG_SUPPORT_TRACE
1808
MNG_TRACE (pData, MNG_FN_READ_ICCP, MNG_LC_START)
1810
/* sequence checks */
1811
#ifdef MNG_INCLUDE_JNG
1812
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
1813
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
1815
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
1816
(!pData->bHasBASI) && (!pData->bHasDHDR) )
1818
MNG_ERROR (pData, MNG_SEQUENCEERROR)
1820
#ifdef MNG_INCLUDE_JNG
1821
if ((pData->bHasIDAT) || (pData->bHasPLTE) || (pData->bHasJDAT) || (pData->bHasJDAA))
1823
if ((pData->bHasIDAT) || (pData->bHasPLTE))
1825
MNG_ERROR (pData, MNG_SEQUENCEERROR)
1827
#ifdef MNG_INCLUDE_JNG
1828
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
1830
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1832
{ /* length must be at least 2 */
1834
MNG_ERROR (pData, MNG_INVALIDLENGTH)
1837
{ /* length must be empty or at least 2 */
1838
if ((iRawlen != 0) && (iRawlen < 2))
1839
MNG_ERROR (pData, MNG_INVALIDLENGTH)
1842
pTemp = find_null (pRawdata); /* find null-separator */
1843
/* not found inside input-data ? */
1844
if ((pTemp - pRawdata) > (mng_int32)iRawlen)
1845
MNG_ERROR (pData, MNG_NULLNOTFOUND)
1846
/* determine size of compressed profile */
1847
iCompressedsize = (mng_uint32)(iRawlen - (pTemp - pRawdata) - 2);
1848
/* decompress the profile */
1849
iRetcode = inflate_buffer (pData, pTemp+2, iCompressedsize,
1850
&pBuf, &iBufsize, &iProfilesize);
1852
#ifdef MNG_CHECK_BAD_ICCP /* Check for bad iCCP chunk */
1853
if ((iRetcode) && (!strncmp ((char *)pRawdata, "Photoshop ICC profile", 21)))
1855
if (iRawlen == 2615) /* is it the sRGB profile ? */
1857
mng_chunk_header chunk_srgb = {MNG_UINT_sRGB, mng_init_srgb, mng_free_srgb,
1858
mng_read_srgb, mng_write_srgb, mng_assign_srgb,
1860
/* pretend it's an sRGB chunk then ! */
1861
iRetcode = mng_read_srgb (pData, &chunk_srgb, 1, (mng_ptr)"0", ppChunk);
1863
if (iRetcode) /* on error bail out */
1864
{ /* don't forget to drop the temp buffer */
1865
MNG_FREEX (pData, pBuf, iBufsize)
1872
#endif /* MNG_CHECK_BAD_ICCP */
1874
if (iRetcode) /* on error bail out */
1875
{ /* don't forget to drop the temp buffer */
1876
MNG_FREEX (pData, pBuf, iBufsize)
1880
#ifdef MNG_INCLUDE_JNG
1881
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
1883
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1885
pData->bHasICCP = MNG_TRUE; /* indicate we've got it */
1887
pData->bHasglobalICCP = (mng_bool)(iRawlen != 0);
1889
#ifdef MNG_SUPPORT_DISPLAY
1890
#ifdef MNG_INCLUDE_JNG
1891
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
1893
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1898
#ifndef MNG_NO_DELTA_PNG
1899
if (pData->bHasDHDR) /* update delta image ? */
1900
{ /* store in object 0 ! */
1901
pImage = (mng_imagep)pData->pObjzero;
1903
if (pImage->pImgbuf->pProfile) /* profile existed ? */
1904
MNG_FREEX (pData, pImage->pImgbuf->pProfile, pImage->pImgbuf->iProfilesize)
1905
/* allocate a buffer & copy it */
1906
MNG_ALLOC (pData, pImage->pImgbuf->pProfile, iProfilesize)
1907
MNG_COPY (pImage->pImgbuf->pProfile, pBuf, iProfilesize)
1908
/* store it's length as well */
1909
pImage->pImgbuf->iProfilesize = iProfilesize;
1910
pImage->pImgbuf->bHasICCP = MNG_TRUE;
1915
pImage = (mng_imagep)pData->pCurrentobj;
1917
if (!pImage) /* no object then dump it in obj 0 */
1918
pImage = (mng_imagep)pData->pObjzero;
1920
if (pImage->pImgbuf->pProfile) /* profile existed ? */
1921
MNG_FREEX (pData, pImage->pImgbuf->pProfile, pImage->pImgbuf->iProfilesize)
1922
/* allocate a buffer & copy it */
1923
MNG_ALLOC (pData, pImage->pImgbuf->pProfile, iProfilesize)
1924
MNG_COPY (pImage->pImgbuf->pProfile, pBuf, iProfilesize)
1925
/* store it's length as well */
1926
pImage->pImgbuf->iProfilesize = iProfilesize;
1927
pImage->pImgbuf->bHasICCP = MNG_TRUE;
1931
{ /* store as global */
1932
if (iRawlen == 0) /* empty chunk ? */
1934
if (pData->pGlobalProfile) /* did we have a global profile ? */
1935
MNG_FREEX (pData, pData->pGlobalProfile, pData->iGlobalProfilesize)
1937
pData->iGlobalProfilesize = 0; /* reset to null */
1938
pData->pGlobalProfile = MNG_NULL;
1941
{ /* allocate a global buffer & copy it */
1942
MNG_ALLOC (pData, pData->pGlobalProfile, iProfilesize)
1943
MNG_COPY (pData->pGlobalProfile, pBuf, iProfilesize)
1944
/* store it's length as well */
1945
pData->iGlobalProfilesize = iProfilesize;
1948
/* create an animation object */
1949
iRetcode = mng_create_ani_iccp (pData, (mng_bool)(iRawlen == 0),
1950
pData->iGlobalProfilesize,
1951
pData->pGlobalProfile);
1953
if (iRetcode) /* on error bail out */
1956
#endif /* MNG_SUPPORT_DISPLAY */
1958
#ifdef MNG_STORE_CHUNKS
1959
if (pData->bStorechunks)
1960
{ /* initialize storage */
1961
iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
1963
if (iRetcode) /* on error bail out */
1964
{ /* don't forget to drop the temp buffer */
1965
MNG_FREEX (pData, pBuf, iBufsize)
1968
/* store the fields */
1969
((mng_iccpp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
1971
if (iRawlen) /* not empty ? */
1973
if (!pBuf) /* hasn't been unpuzzled it yet ? */
1974
{ /* find null-separator */
1975
pTemp = find_null (pRawdata);
1976
/* not found inside input-data ? */
1977
if ((pTemp - pRawdata) > (mng_int32)iRawlen)
1978
MNG_ERROR (pData, MNG_NULLNOTFOUND)
1979
/* determine size of compressed profile */
1980
iCompressedsize = iRawlen - (pTemp - pRawdata) - 2;
1981
/* decompress the profile */
1982
iRetcode = inflate_buffer (pData, pTemp+2, iCompressedsize,
1983
&pBuf, &iBufsize, &iProfilesize);
1985
if (iRetcode) /* on error bail out */
1986
{ /* don't forget to drop the temp buffer */
1987
MNG_FREEX (pData, pBuf, iBufsize)
1992
((mng_iccpp)*ppChunk)->iNamesize = (mng_uint32)(pTemp - pRawdata);
1994
if (((mng_iccpp)*ppChunk)->iNamesize)
1996
MNG_ALLOC (pData, ((mng_iccpp)*ppChunk)->zName,
1997
((mng_iccpp)*ppChunk)->iNamesize + 1)
1998
MNG_COPY (((mng_iccpp)*ppChunk)->zName, pRawdata,
1999
((mng_iccpp)*ppChunk)->iNamesize)
2002
((mng_iccpp)*ppChunk)->iCompression = *(pTemp+1);
2003
((mng_iccpp)*ppChunk)->iProfilesize = iProfilesize;
2005
MNG_ALLOC (pData, ((mng_iccpp)*ppChunk)->pProfile, iProfilesize)
2006
MNG_COPY (((mng_iccpp)*ppChunk)->pProfile, pBuf, iProfilesize)
2009
#endif /* MNG_STORE_CHUNKS */
2011
if (pBuf) /* free the temporary buffer */
2012
MNG_FREEX (pData, pBuf, iBufsize)
2014
#ifdef MNG_CHECK_BAD_ICCP
2018
#ifdef MNG_SUPPORT_TRACE
2019
MNG_TRACE (pData, MNG_FN_READ_ICCP, MNG_LC_END)
2022
return MNG_NOERROR; /* done */
2026
/* ************************************************************************** */
2028
#ifndef MNG_SKIPCHUNK_tEXt
2029
READ_CHUNK (mng_read_text)
2031
mng_uint32 iKeywordlen, iTextlen;
2032
mng_pchar zKeyword, zText;
2035
#ifdef MNG_SUPPORT_TRACE
2036
MNG_TRACE (pData, MNG_FN_READ_TEXT, MNG_LC_START)
2038
/* sequence checks */
2039
#ifdef MNG_INCLUDE_JNG
2040
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2041
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
2043
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2044
(!pData->bHasBASI) && (!pData->bHasDHDR) )
2046
MNG_ERROR (pData, MNG_SEQUENCEERROR)
2048
if (iRawlen < 2) /* length must be at least 2 */
2049
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2051
pTemp = find_null (pRawdata); /* find the null separator */
2052
/* not found inside input-data ? */
2053
if ((pTemp - pRawdata) > (mng_int32)iRawlen)
2054
MNG_ERROR (pData, MNG_NULLNOTFOUND)
2056
if (pTemp == pRawdata) /* there must be at least 1 char for keyword */
2057
MNG_ERROR (pData, MNG_KEYWORDNULL)
2059
iKeywordlen = (mng_uint32)(pTemp - pRawdata);
2060
iTextlen = iRawlen - iKeywordlen - 1;
2062
if (pData->fProcesstext) /* inform the application ? */
2066
MNG_ALLOC (pData, zKeyword, iKeywordlen + 1)
2067
MNG_COPY (zKeyword, pRawdata, iKeywordlen)
2069
MNG_ALLOCX (pData, zText, iTextlen + 1)
2071
if (!zText) /* on error bail out */
2073
MNG_FREEX (pData, zKeyword, iKeywordlen + 1)
2074
MNG_ERROR (pData, MNG_OUTOFMEMORY)
2078
MNG_COPY (zText, pTemp+1, iTextlen)
2080
bOke = pData->fProcesstext ((mng_handle)pData, MNG_TYPE_TEXT, zKeyword, zText, 0, 0);
2082
MNG_FREEX (pData, zText, iTextlen + 1)
2083
MNG_FREEX (pData, zKeyword, iKeywordlen + 1)
2086
MNG_ERROR (pData, MNG_APPMISCERROR)
2090
#ifdef MNG_STORE_CHUNKS
2091
if (pData->bStorechunks)
2092
{ /* initialize storage */
2093
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
2095
if (iRetcode) /* on error bail out */
2097
/* store the fields */
2098
((mng_textp)*ppChunk)->iKeywordsize = iKeywordlen;
2099
((mng_textp)*ppChunk)->iTextsize = iTextlen;
2103
MNG_ALLOC (pData, ((mng_textp)*ppChunk)->zKeyword, iKeywordlen+1)
2104
MNG_COPY (((mng_textp)*ppChunk)->zKeyword, pRawdata, iKeywordlen)
2109
MNG_ALLOC (pData, ((mng_textp)*ppChunk)->zText, iTextlen+1)
2110
MNG_COPY (((mng_textp)*ppChunk)->zText, pTemp+1, iTextlen)
2113
#endif /* MNG_STORE_CHUNKS */
2115
#ifdef MNG_SUPPORT_TRACE
2116
MNG_TRACE (pData, MNG_FN_READ_TEXT, MNG_LC_END)
2119
return MNG_NOERROR; /* done */
2123
/* ************************************************************************** */
2125
#ifndef MNG_SKIPCHUNK_zTXt
2126
READ_CHUNK (mng_read_ztxt)
2128
mng_retcode iRetcode;
2129
mng_uint32 iKeywordlen, iTextlen;
2132
mng_uint32 iCompressedsize;
2133
mng_uint32 iBufsize;
2136
#ifdef MNG_SUPPORT_TRACE
2137
MNG_TRACE (pData, MNG_FN_READ_ZTXT, MNG_LC_START)
2139
/* sequence checks */
2140
#ifdef MNG_INCLUDE_JNG
2141
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2142
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
2144
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2145
(!pData->bHasBASI) && (!pData->bHasDHDR) )
2147
MNG_ERROR (pData, MNG_SEQUENCEERROR)
2149
if (iRawlen < 3) /* length must be at least 3 */
2150
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2152
pTemp = find_null (pRawdata); /* find the null separator */
2153
/* not found inside input-data ? */
2154
if ((pTemp - pRawdata) > (mng_int32)iRawlen)
2155
MNG_ERROR (pData, MNG_NULLNOTFOUND)
2157
if (pTemp == pRawdata) /* there must be at least 1 char for keyword */
2158
MNG_ERROR (pData, MNG_KEYWORDNULL)
2160
if (*(pTemp+1) != 0) /* only deflate compression-method allowed */
2161
MNG_ERROR (pData, MNG_INVALIDCOMPRESS)
2163
iKeywordlen = (mng_uint32)(pTemp - pRawdata);
2164
iCompressedsize = (mng_uint32)(iRawlen - iKeywordlen - 2);
2166
zKeyword = 0; /* there's no keyword buffer yet */
2167
pBuf = 0; /* or a temporary buffer ! */
2169
if (pData->fProcesstext) /* inform the application ? */
2170
{ /* decompress the text */
2171
iRetcode = inflate_buffer (pData, pTemp+2, iCompressedsize,
2172
&pBuf, &iBufsize, &iTextlen);
2174
if (iRetcode) /* on error bail out */
2175
{ /* don't forget to drop the temp buffers */
2176
MNG_FREEX (pData, pBuf, iBufsize)
2180
MNG_ALLOCX (pData, zKeyword, iKeywordlen+1)
2182
if (!zKeyword) /* on error bail out */
2183
{ /* don't forget to drop the temp buffers */
2184
MNG_FREEX (pData, pBuf, iBufsize)
2185
MNG_ERROR (pData, MNG_OUTOFMEMORY);
2188
MNG_COPY (zKeyword, pRawdata, iKeywordlen)
2190
if (!pData->fProcesstext ((mng_handle)pData, MNG_TYPE_ZTXT, zKeyword, (mng_pchar)pBuf, 0, 0))
2191
{ /* don't forget to drop the temp buffers */
2192
MNG_FREEX (pData, pBuf, iBufsize)
2193
MNG_FREEX (pData, zKeyword, iKeywordlen+1)
2194
MNG_ERROR (pData, MNG_APPMISCERROR)
2198
#ifdef MNG_STORE_CHUNKS
2199
if (pData->bStorechunks)
2200
{ /* initialize storage */
2201
iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
2203
if (iRetcode) /* on error bail out */
2204
{ /* don't forget to drop the temp buffers */
2205
MNG_FREEX (pData, pBuf, iBufsize)
2206
MNG_FREEX (pData, zKeyword, iKeywordlen+1)
2209
/* store the fields */
2210
((mng_ztxtp)*ppChunk)->iKeywordsize = iKeywordlen;
2211
((mng_ztxtp)*ppChunk)->iCompression = *(pTemp+1);
2213
if ((!pBuf) && (iCompressedsize)) /* did we not get a text-buffer yet ? */
2214
{ /* decompress the text */
2215
iRetcode = inflate_buffer (pData, pTemp+2, iCompressedsize,
2216
&pBuf, &iBufsize, &iTextlen);
2218
if (iRetcode) /* on error bail out */
2219
{ /* don't forget to drop the temp buffers */
2220
MNG_FREEX (pData, pBuf, iBufsize)
2221
MNG_FREEX (pData, zKeyword, iKeywordlen+1)
2226
MNG_ALLOCX (pData, ((mng_ztxtp)*ppChunk)->zKeyword, iKeywordlen + 1)
2227
/* on error bail out */
2228
if (!((mng_ztxtp)*ppChunk)->zKeyword)
2229
{ /* don't forget to drop the temp buffers */
2230
MNG_FREEX (pData, pBuf, iBufsize)
2231
MNG_FREEX (pData, zKeyword, iKeywordlen+1)
2232
MNG_ERROR (pData, MNG_OUTOFMEMORY);
2235
MNG_COPY (((mng_ztxtp)*ppChunk)->zKeyword, pRawdata, iKeywordlen)
2237
((mng_ztxtp)*ppChunk)->iTextsize = iTextlen;
2239
if (iCompressedsize)
2241
MNG_ALLOCX (pData, ((mng_ztxtp)*ppChunk)->zText, iTextlen + 1)
2242
/* on error bail out */
2243
if (!((mng_ztxtp)*ppChunk)->zText)
2244
{ /* don't forget to drop the temp buffers */
2245
MNG_FREEX (pData, pBuf, iBufsize)
2246
MNG_FREEX (pData, zKeyword, iKeywordlen+1)
2247
MNG_ERROR (pData, MNG_OUTOFMEMORY);
2250
MNG_COPY (((mng_ztxtp)*ppChunk)->zText, pBuf, iTextlen)
2253
#endif /* MNG_STORE_CHUNKS */
2255
MNG_FREEX (pData, pBuf, iBufsize) /* free the temporary buffers */
2256
MNG_FREEX (pData, zKeyword, iKeywordlen+1)
2258
#ifdef MNG_SUPPORT_TRACE
2259
MNG_TRACE (pData, MNG_FN_READ_ZTXT, MNG_LC_END)
2262
return MNG_NOERROR; /* done */
2266
/* ************************************************************************** */
2268
#ifndef MNG_SKIPCHUNK_iTXt
2269
READ_CHUNK (mng_read_itxt)
2271
mng_retcode iRetcode;
2272
mng_uint32 iKeywordlen, iTextlen, iLanguagelen, iTranslationlen;
2273
mng_pchar zKeyword, zLanguage, zTranslation;
2274
mng_uint8p pNull1, pNull2, pNull3;
2275
mng_uint32 iCompressedsize;
2276
mng_uint8 iCompressionflag;
2277
mng_uint32 iBufsize;
2280
#ifdef MNG_SUPPORT_TRACE
2281
MNG_TRACE (pData, MNG_FN_READ_ITXT, MNG_LC_START)
2283
/* sequence checks */
2284
#ifdef MNG_INCLUDE_JNG
2285
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2286
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
2288
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2289
(!pData->bHasBASI) && (!pData->bHasDHDR) )
2291
MNG_ERROR (pData, MNG_SEQUENCEERROR)
2293
if (iRawlen < 6) /* length must be at least 6 */
2294
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2296
pNull1 = find_null (pRawdata); /* find the null separators */
2297
pNull2 = find_null (pNull1+3);
2298
pNull3 = find_null (pNull2+1);
2299
/* not found inside input-data ? */
2300
if (((pNull1 - pRawdata) > (mng_int32)iRawlen) ||
2301
((pNull2 - pRawdata) > (mng_int32)iRawlen) ||
2302
((pNull3 - pRawdata) > (mng_int32)iRawlen) )
2303
MNG_ERROR (pData, MNG_NULLNOTFOUND)
2305
if (pNull1 == pRawdata) /* there must be at least 1 char for keyword */
2306
MNG_ERROR (pData, MNG_KEYWORDNULL)
2307
/* compression or not ? */
2308
if ((*(pNull1+1) != 0) && (*(pNull1+1) != 1))
2309
MNG_ERROR (pData, MNG_INVALIDCOMPRESS)
2311
if (*(pNull1+2) != 0) /* only deflate compression-method allowed */
2312
MNG_ERROR (pData, MNG_INVALIDCOMPRESS)
2314
iKeywordlen = (mng_uint32)(pNull1 - pRawdata);
2315
iLanguagelen = (mng_uint32)(pNull2 - pNull1 - 3);
2316
iTranslationlen = (mng_uint32)(pNull3 - pNull2 - 1);
2317
iCompressedsize = (mng_uint32)(iRawlen - iKeywordlen - iLanguagelen - iTranslationlen - 5);
2318
iCompressionflag = *(pNull1+1);
2320
zKeyword = 0; /* no buffers acquired yet */
2326
if (pData->fProcesstext) /* inform the application ? */
2328
if (iCompressionflag) /* decompress the text ? */
2330
iRetcode = inflate_buffer (pData, pNull3+1, iCompressedsize,
2331
&pBuf, &iBufsize, &iTextlen);
2333
if (iRetcode) /* on error bail out */
2334
{ /* don't forget to drop the temp buffer */
2335
MNG_FREEX (pData, pBuf, iBufsize)
2341
iTextlen = iCompressedsize;
2342
iBufsize = iTextlen+1; /* plus 1 for terminator byte!!! */
2344
MNG_ALLOC (pData, pBuf, iBufsize);
2345
MNG_COPY (pBuf, pNull3+1, iTextlen);
2348
MNG_ALLOCX (pData, zKeyword, iKeywordlen + 1)
2349
MNG_ALLOCX (pData, zLanguage, iLanguagelen + 1)
2350
MNG_ALLOCX (pData, zTranslation, iTranslationlen + 1)
2351
/* on error bail out */
2352
if ((!zKeyword) || (!zLanguage) || (!zTranslation))
2353
{ /* don't forget to drop the temp buffers */
2354
MNG_FREEX (pData, zTranslation, iTranslationlen + 1)
2355
MNG_FREEX (pData, zLanguage, iLanguagelen + 1)
2356
MNG_FREEX (pData, zKeyword, iKeywordlen + 1)
2357
MNG_FREEX (pData, pBuf, iBufsize)
2358
MNG_ERROR (pData, MNG_OUTOFMEMORY)
2361
MNG_COPY (zKeyword, pRawdata, iKeywordlen)
2362
MNG_COPY (zLanguage, pNull1+3, iLanguagelen)
2363
MNG_COPY (zTranslation, pNull2+1, iTranslationlen)
2365
if (!pData->fProcesstext ((mng_handle)pData, MNG_TYPE_ITXT, zKeyword, (mng_pchar)pBuf,
2366
zLanguage, zTranslation))
2367
{ /* don't forget to drop the temp buffers */
2368
MNG_FREEX (pData, zTranslation, iTranslationlen + 1)
2369
MNG_FREEX (pData, zLanguage, iLanguagelen + 1)
2370
MNG_FREEX (pData, zKeyword, iKeywordlen + 1)
2371
MNG_FREEX (pData, pBuf, iBufsize)
2373
MNG_ERROR (pData, MNG_APPMISCERROR)
2377
#ifdef MNG_STORE_CHUNKS
2378
if (pData->bStorechunks)
2379
{ /* initialize storage */
2380
iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
2382
if (iRetcode) /* on error bail out */
2383
{ /* don't forget to drop the temp buffers */
2384
MNG_FREEX (pData, zTranslation, iTranslationlen + 1)
2385
MNG_FREEX (pData, zLanguage, iLanguagelen + 1)
2386
MNG_FREEX (pData, zKeyword, iKeywordlen + 1)
2387
MNG_FREEX (pData, pBuf, iBufsize)
2390
/* store the fields */
2391
((mng_itxtp)*ppChunk)->iKeywordsize = iKeywordlen;
2392
((mng_itxtp)*ppChunk)->iLanguagesize = iLanguagelen;
2393
((mng_itxtp)*ppChunk)->iTranslationsize = iTranslationlen;
2394
((mng_itxtp)*ppChunk)->iCompressionflag = *(pNull1+1);
2395
((mng_itxtp)*ppChunk)->iCompressionmethod = *(pNull1+2);
2397
if ((!pBuf) && (iCompressedsize)) /* did we not get a text-buffer yet ? */
2399
if (iCompressionflag) /* decompress the text ? */
2401
iRetcode = inflate_buffer (pData, pNull3+1, iCompressedsize,
2402
&pBuf, &iBufsize, &iTextlen);
2404
if (iRetcode) /* on error bail out */
2405
{ /* don't forget to drop the temp buffers */
2406
MNG_FREEX (pData, zTranslation, iTranslationlen + 1)
2407
MNG_FREEX (pData, zLanguage, iLanguagelen + 1)
2408
MNG_FREEX (pData, zKeyword, iKeywordlen + 1)
2409
MNG_FREEX (pData, pBuf, iBufsize)
2415
iTextlen = iCompressedsize;
2416
iBufsize = iTextlen+1; /* plus 1 for terminator byte!!! */
2418
MNG_ALLOC (pData, pBuf, iBufsize);
2419
MNG_COPY (pBuf, pNull3+1, iTextlen);
2423
MNG_ALLOCX (pData, ((mng_itxtp)*ppChunk)->zKeyword, iKeywordlen + 1)
2424
MNG_ALLOCX (pData, ((mng_itxtp)*ppChunk)->zLanguage, iLanguagelen + 1)
2425
MNG_ALLOCX (pData, ((mng_itxtp)*ppChunk)->zTranslation, iTranslationlen + 1)
2426
/* on error bail out */
2427
if ((!((mng_itxtp)*ppChunk)->zKeyword ) ||
2428
(!((mng_itxtp)*ppChunk)->zLanguage ) ||
2429
(!((mng_itxtp)*ppChunk)->zTranslation) )
2430
{ /* don't forget to drop the temp buffers */
2431
MNG_FREEX (pData, zTranslation, iTranslationlen + 1)
2432
MNG_FREEX (pData, zLanguage, iLanguagelen + 1)
2433
MNG_FREEX (pData, zKeyword, iKeywordlen + 1)
2434
MNG_FREEX (pData, pBuf, iBufsize)
2435
MNG_ERROR (pData, MNG_OUTOFMEMORY)
2438
MNG_COPY (((mng_itxtp)*ppChunk)->zKeyword, pRawdata, iKeywordlen)
2439
MNG_COPY (((mng_itxtp)*ppChunk)->zLanguage, pNull1+3, iLanguagelen)
2440
MNG_COPY (((mng_itxtp)*ppChunk)->zTranslation, pNull2+1, iTranslationlen)
2442
((mng_itxtp)*ppChunk)->iTextsize = iTextlen;
2446
MNG_ALLOCX (pData, ((mng_itxtp)*ppChunk)->zText, iTextlen + 1)
2448
if (!((mng_itxtp)*ppChunk)->zText)
2449
{ /* don't forget to drop the temp buffers */
2450
MNG_FREEX (pData, zTranslation, iTranslationlen + 1)
2451
MNG_FREEX (pData, zLanguage, iLanguagelen + 1)
2452
MNG_FREEX (pData, zKeyword, iKeywordlen + 1)
2453
MNG_FREEX (pData, pBuf, iBufsize)
2454
MNG_ERROR (pData, MNG_OUTOFMEMORY)
2457
MNG_COPY (((mng_itxtp)*ppChunk)->zText, pBuf, iTextlen)
2460
#endif /* MNG_STORE_CHUNKS */
2461
/* free the temporary buffers */
2462
MNG_FREEX (pData, zTranslation, iTranslationlen + 1)
2463
MNG_FREEX (pData, zLanguage, iLanguagelen + 1)
2464
MNG_FREEX (pData, zKeyword, iKeywordlen + 1)
2465
MNG_FREEX (pData, pBuf, iBufsize)
2467
#ifdef MNG_SUPPORT_TRACE
2468
MNG_TRACE (pData, MNG_FN_READ_ITXT, MNG_LC_END)
2471
return MNG_NOERROR; /* done */
2475
/* ************************************************************************** */
2477
#ifndef MNG_SKIPCHUNK_bKGD
2478
READ_CHUNK (mng_read_bkgd)
2480
#ifdef MNG_SUPPORT_DISPLAY
2481
mng_imagep pImage = (mng_imagep)pData->pCurrentobj;
2482
mng_imagedatap pBuf;
2485
#ifdef MNG_SUPPORT_TRACE
2486
MNG_TRACE (pData, MNG_FN_READ_BKGD, MNG_LC_START)
2488
/* sequence checks */
2489
#ifdef MNG_INCLUDE_JNG
2490
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2491
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
2493
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2494
(!pData->bHasBASI) && (!pData->bHasDHDR) )
2496
MNG_ERROR (pData, MNG_SEQUENCEERROR)
2498
#ifdef MNG_INCLUDE_JNG
2499
if ((pData->bHasIDAT) || (pData->bHasJDAT) || (pData->bHasJDAA))
2501
if (pData->bHasIDAT)
2503
MNG_ERROR (pData, MNG_SEQUENCEERROR)
2505
if (iRawlen > 6) /* it just can't be bigger than that! */
2506
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2508
#ifdef MNG_INCLUDE_JNG /* length checks */
2509
if (pData->bHasJHDR)
2511
if (((pData->iJHDRcolortype == 8) || (pData->iJHDRcolortype == 12)) && (iRawlen != 2))
2512
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2514
if (((pData->iJHDRcolortype == 10) || (pData->iJHDRcolortype == 14)) && (iRawlen != 6))
2515
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2518
#endif /* MNG_INCLUDE_JNG */
2519
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
2521
if (((pData->iColortype == 0) || (pData->iColortype == 4)) && (iRawlen != 2))
2522
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2524
if (((pData->iColortype == 2) || (pData->iColortype == 6)) && (iRawlen != 6))
2525
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2527
if ((pData->iColortype == 3) && (iRawlen != 1))
2528
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2532
if (iRawlen != 6) /* global is always 16-bit RGB ! */
2533
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2536
#ifdef MNG_INCLUDE_JNG
2537
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
2539
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
2541
pData->bHasBKGD = MNG_TRUE; /* indicate bKGD available */
2543
pData->bHasglobalBKGD = (mng_bool)(iRawlen != 0);
2545
#ifdef MNG_SUPPORT_DISPLAY
2546
if (!pImage) /* if no object dump it in obj 0 */
2547
pImage = (mng_imagep)pData->pObjzero;
2549
pBuf = pImage->pImgbuf; /* address object buffer */
2551
#ifdef MNG_INCLUDE_JNG
2552
if (pData->bHasJHDR)
2554
pBuf->bHasBKGD = MNG_TRUE; /* tell the object it's got bKGD now */
2556
switch (pData->iJHDRcolortype) /* store fields for future reference */
2558
case 8 : ; /* gray */
2559
case 12 : { /* graya */
2560
pBuf->iBKGDgray = mng_get_uint16 (pRawdata);
2563
case 10 : ; /* rgb */
2564
case 14 : { /* rgba */
2565
pBuf->iBKGDred = mng_get_uint16 (pRawdata);
2566
pBuf->iBKGDgreen = mng_get_uint16 (pRawdata+2);
2567
pBuf->iBKGDblue = mng_get_uint16 (pRawdata+4);
2573
#endif /* MNG_INCLUDE_JNG */
2574
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
2576
pBuf->bHasBKGD = MNG_TRUE; /* tell the object it's got bKGD now */
2578
switch (pData->iColortype) /* store fields for future reference */
2580
case 0 : ; /* gray */
2581
case 4 : { /* graya */
2582
pBuf->iBKGDgray = mng_get_uint16 (pRawdata);
2585
case 2 : ; /* rgb */
2586
case 6 : { /* rgba */
2587
pBuf->iBKGDred = mng_get_uint16 (pRawdata);
2588
pBuf->iBKGDgreen = mng_get_uint16 (pRawdata+2);
2589
pBuf->iBKGDblue = mng_get_uint16 (pRawdata+4);
2592
case 3 : { /* indexed */
2593
pBuf->iBKGDindex = *pRawdata;
2598
else /* store as global */
2602
pData->iGlobalBKGDred = mng_get_uint16 (pRawdata);
2603
pData->iGlobalBKGDgreen = mng_get_uint16 (pRawdata+2);
2604
pData->iGlobalBKGDblue = mng_get_uint16 (pRawdata+4);
2607
{ /* create an animation object */
2608
mng_retcode iRetcode = mng_create_ani_bkgd (pData, pData->iGlobalBKGDred,
2609
pData->iGlobalBKGDgreen,
2610
pData->iGlobalBKGDblue);
2612
if (iRetcode) /* on error bail out */
2616
#endif /* MNG_SUPPORT_DISPLAY */
2618
#ifdef MNG_STORE_CHUNKS
2619
if (pData->bStorechunks)
2620
{ /* initialize storage */
2621
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
2623
if (iRetcode) /* on error bail out */
2625
/* store the fields */
2626
((mng_bkgdp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
2627
((mng_bkgdp)*ppChunk)->iType = pData->iColortype;
2631
switch (iRawlen) /* guess from length */
2633
case 1 : { /* indexed */
2634
((mng_bkgdp)*ppChunk)->iType = 3;
2635
((mng_bkgdp)*ppChunk)->iIndex = *pRawdata;
2638
case 2 : { /* gray */
2639
((mng_bkgdp)*ppChunk)->iType = 0;
2640
((mng_bkgdp)*ppChunk)->iGray = mng_get_uint16 (pRawdata);
2643
case 6 : { /* rgb */
2644
((mng_bkgdp)*ppChunk)->iType = 2;
2645
((mng_bkgdp)*ppChunk)->iRed = mng_get_uint16 (pRawdata);
2646
((mng_bkgdp)*ppChunk)->iGreen = mng_get_uint16 (pRawdata+2);
2647
((mng_bkgdp)*ppChunk)->iBlue = mng_get_uint16 (pRawdata+4);
2653
#endif /* MNG_STORE_CHUNKS */
2655
#ifdef MNG_SUPPORT_TRACE
2656
MNG_TRACE (pData, MNG_FN_READ_BKGD, MNG_LC_END)
2659
return MNG_NOERROR; /* done */
2663
/* ************************************************************************** */
2665
#ifndef MNG_SKIPCHUNK_pHYs
2666
READ_CHUNK (mng_read_phys)
2668
#ifdef MNG_SUPPORT_TRACE
2669
MNG_TRACE (pData, MNG_FN_READ_PHYS, MNG_LC_START)
2671
/* sequence checks */
2672
#ifdef MNG_INCLUDE_JNG
2673
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2674
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
2676
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2677
(!pData->bHasBASI) && (!pData->bHasDHDR) )
2679
MNG_ERROR (pData, MNG_SEQUENCEERROR)
2681
#ifdef MNG_INCLUDE_JNG
2682
if ((pData->bHasIDAT) || (pData->bHasJDAT) || (pData->bHasJDAA))
2684
if (pData->bHasIDAT)
2686
MNG_ERROR (pData, MNG_SEQUENCEERROR)
2687
/* it's 9 bytes or empty; no more, no less! */
2688
if ((iRawlen != 9) && (iRawlen != 0))
2689
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2691
#ifdef MNG_SUPPORT_DISPLAY
2695
/* TODO: something !!! */
2699
#endif /* MNG_SUPPORT_DISPLAY */
2701
#ifdef MNG_STORE_CHUNKS
2702
if (pData->bStorechunks)
2703
{ /* initialize storage */
2704
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
2706
if (iRetcode) /* on error bail out */
2708
/* store the fields */
2709
((mng_physp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
2713
((mng_physp)*ppChunk)->iSizex = mng_get_uint32 (pRawdata);
2714
((mng_physp)*ppChunk)->iSizey = mng_get_uint32 (pRawdata+4);
2715
((mng_physp)*ppChunk)->iUnit = *(pRawdata+8);
2718
#endif /* MNG_STORE_CHUNKS */
2720
#ifdef MNG_SUPPORT_TRACE
2721
MNG_TRACE (pData, MNG_FN_READ_PHYS, MNG_LC_END)
2724
return MNG_NOERROR; /* done */
2728
/* ************************************************************************** */
2730
#ifndef MNG_SKIPCHUNK_sBIT
2731
READ_CHUNK (mng_read_sbit)
2733
#ifdef MNG_SUPPORT_TRACE
2734
MNG_TRACE (pData, MNG_FN_READ_SBIT, MNG_LC_START)
2736
/* sequence checks */
2737
#ifdef MNG_INCLUDE_JNG
2738
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2739
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
2741
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2742
(!pData->bHasBASI) && (!pData->bHasDHDR) )
2744
MNG_ERROR (pData, MNG_SEQUENCEERROR)
2746
#ifdef MNG_INCLUDE_JNG
2747
if ((pData->bHasPLTE) || (pData->bHasIDAT) || (pData->bHasJDAT) || (pData->bHasJDAA))
2749
if ((pData->bHasPLTE) || (pData->bHasIDAT))
2751
MNG_ERROR (pData, MNG_SEQUENCEERROR)
2753
if (iRawlen > 4) /* it just can't be bigger than that! */
2754
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2756
#ifdef MNG_INCLUDE_JNG /* length checks */
2757
if (pData->bHasJHDR)
2759
if ((pData->iJHDRcolortype == 8) && (iRawlen != 1))
2760
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2762
if ((pData->iJHDRcolortype == 10) && (iRawlen != 3))
2763
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2765
if ((pData->iJHDRcolortype == 12) && (iRawlen != 2))
2766
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2768
if ((pData->iJHDRcolortype == 14) && (iRawlen != 4))
2769
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2772
#endif /* MNG_INCLUDE_JNG */
2773
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
2775
if ((pData->iColortype == 0) && (iRawlen != 1))
2776
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2778
if ((pData->iColortype == 2) && (iRawlen != 3))
2779
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2781
if ((pData->iColortype == 3) && (iRawlen != 3))
2782
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2784
if ((pData->iColortype == 4) && (iRawlen != 2))
2785
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2787
if ((pData->iColortype == 6) && (iRawlen != 4))
2788
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2791
{ /* global = empty or RGBA */
2792
if ((iRawlen != 0) && (iRawlen != 4))
2793
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2796
#ifdef MNG_SUPPORT_DISPLAY
2800
/* TODO: something !!! */
2804
#endif /* MNG_SUPPORT_DISPLAY */
2806
#ifdef MNG_STORE_CHUNKS
2807
if (pData->bStorechunks)
2808
{ /* initialize storage */
2809
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
2811
if (iRetcode) /* on error bail out */
2813
/* store the fields */
2814
((mng_sbitp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
2818
#ifdef MNG_INCLUDE_JNG
2819
if (pData->bHasJHDR)
2820
((mng_sbitp)*ppChunk)->iType = pData->iJHDRcolortype;
2823
if (pData->bHasIHDR)
2824
((mng_sbitp)*ppChunk)->iType = pData->iColortype;
2826
((mng_sbitp)*ppChunk)->iType = 6;
2829
((mng_sbitp)*ppChunk)->aBits [0] = *pRawdata;
2831
((mng_sbitp)*ppChunk)->aBits [1] = *(pRawdata+1);
2833
((mng_sbitp)*ppChunk)->aBits [2] = *(pRawdata+2);
2835
((mng_sbitp)*ppChunk)->aBits [3] = *(pRawdata+3);
2839
#endif /* MNG_STORE_CHUNKS */
2841
#ifdef MNG_SUPPORT_TRACE
2842
MNG_TRACE (pData, MNG_FN_READ_SBIT, MNG_LC_END)
2845
return MNG_NOERROR; /* done */
2849
/* ************************************************************************** */
2851
#ifndef MNG_SKIPCHUNK_sPLT
2852
READ_CHUNK (mng_read_splt)
2855
mng_uint32 iNamelen;
2856
mng_uint8 iSampledepth;
2859
#ifdef MNG_SUPPORT_TRACE
2860
MNG_TRACE (pData, MNG_FN_READ_SPLT, MNG_LC_START)
2862
/* sequence checks */
2863
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2864
(!pData->bHasBASI) && (!pData->bHasDHDR) )
2865
MNG_ERROR (pData, MNG_SEQUENCEERROR)
2867
if (pData->bHasIDAT)
2868
MNG_ERROR (pData, MNG_SEQUENCEERROR)
2872
pTemp = find_null (pRawdata); /* find null-separator */
2873
/* not found inside input-data ? */
2874
if ((pTemp - pRawdata) > (mng_int32)iRawlen)
2875
MNG_ERROR (pData, MNG_NULLNOTFOUND)
2877
iNamelen = (mng_uint32)(pTemp - pRawdata);
2878
iSampledepth = *(pTemp+1);
2879
iRemain = (iRawlen - 2 - iNamelen);
2881
if ((iSampledepth != 1) && (iSampledepth != 2))
2882
MNG_ERROR (pData, MNG_INVSAMPLEDEPTH)
2883
/* check remaining length */
2884
if ( ((iSampledepth == 1) && (iRemain % 6 != 0)) ||
2885
((iSampledepth == 2) && (iRemain % 10 != 0)) )
2886
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2897
#ifdef MNG_SUPPORT_DISPLAY
2901
/* TODO: something !!! */
2905
#endif /* MNG_SUPPORT_DISPLAY */
2907
#ifdef MNG_STORE_CHUNKS
2908
if (pData->bStorechunks)
2909
{ /* initialize storage */
2910
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
2912
if (iRetcode) /* on error bail out */
2914
/* store the fields */
2915
((mng_spltp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
2919
((mng_spltp)*ppChunk)->iNamesize = iNamelen;
2920
((mng_spltp)*ppChunk)->iSampledepth = iSampledepth;
2922
if (iSampledepth == 1)
2923
((mng_spltp)*ppChunk)->iEntrycount = iRemain / 6;
2925
((mng_spltp)*ppChunk)->iEntrycount = iRemain / 10;
2929
MNG_ALLOC (pData, ((mng_spltp)*ppChunk)->zName, iNamelen+1)
2930
MNG_COPY (((mng_spltp)*ppChunk)->zName, pRawdata, iNamelen)
2935
MNG_ALLOC (pData, ((mng_spltp)*ppChunk)->pEntries, iRemain)
2936
MNG_COPY (((mng_spltp)*ppChunk)->pEntries, pTemp+2, iRemain)
2940
#endif /* MNG_STORE_CHUNKS */
2942
#ifdef MNG_SUPPORT_TRACE
2943
MNG_TRACE (pData, MNG_FN_READ_SPLT, MNG_LC_END)
2946
return MNG_NOERROR; /* done */
2950
/* ************************************************************************** */
2952
#ifndef MNG_SKIPCHUNK_hIST
2953
READ_CHUNK (mng_read_hist)
2955
#ifdef MNG_SUPPORT_TRACE
2956
MNG_TRACE (pData, MNG_FN_READ_HIST, MNG_LC_START)
2958
/* sequence checks */
2959
if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR) )
2960
MNG_ERROR (pData, MNG_SEQUENCEERROR)
2962
if ((!pData->bHasPLTE) || (pData->bHasIDAT))
2963
MNG_ERROR (pData, MNG_SEQUENCEERROR)
2965
if ( ((iRawlen & 0x01) != 0) || ((iRawlen >> 1) != pData->iPLTEcount) )
2966
MNG_ERROR (pData, MNG_INVALIDLENGTH)
2968
#ifdef MNG_SUPPORT_DISPLAY
2972
/* TODO: something !!! */
2976
#endif /* MNG_SUPPORT_DISPLAY */
2978
#ifdef MNG_STORE_CHUNKS
2979
if (pData->bStorechunks)
2982
/* initialize storage */
2983
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
2985
if (iRetcode) /* on error bail out */
2987
/* store the fields */
2988
((mng_histp)*ppChunk)->iEntrycount = iRawlen >> 1;
2990
for (iX = 0; iX < (iRawlen >> 1); iX++)
2992
((mng_histp)*ppChunk)->aEntries [iX] = mng_get_uint16 (pRawdata);
2996
#endif /* MNG_STORE_CHUNKS */
2998
#ifdef MNG_SUPPORT_TRACE
2999
MNG_TRACE (pData, MNG_FN_READ_HIST, MNG_LC_END)
3002
return MNG_NOERROR; /* done */
3006
/* ************************************************************************** */
3008
#ifndef MNG_SKIPCHUNK_tIME
3009
READ_CHUNK (mng_read_time)
3011
#ifdef MNG_SUPPORT_TRACE
3012
MNG_TRACE (pData, MNG_FN_READ_TIME, MNG_LC_START)
3014
/* sequence checks */
3015
#ifdef MNG_INCLUDE_JNG
3016
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
3017
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
3019
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
3020
(!pData->bHasBASI) && (!pData->bHasDHDR) )
3022
MNG_ERROR (pData, MNG_SEQUENCEERROR)
3024
if (iRawlen != 7) /* length must be exactly 7 */
3025
MNG_ERROR (pData, MNG_INVALIDLENGTH)
3027
/* if (pData->fProcesstime) */ /* inform the application ? */
3030
pData->fProcesstime ((mng_handle)pData, );
3033
#ifdef MNG_STORE_CHUNKS
3034
if (pData->bStorechunks)
3035
{ /* initialize storage */
3036
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
3038
if (iRetcode) /* on error bail out */
3040
/* store the fields */
3041
((mng_timep)*ppChunk)->iYear = mng_get_uint16 (pRawdata);
3042
((mng_timep)*ppChunk)->iMonth = *(pRawdata+2);
3043
((mng_timep)*ppChunk)->iDay = *(pRawdata+3);
3044
((mng_timep)*ppChunk)->iHour = *(pRawdata+4);
3045
((mng_timep)*ppChunk)->iMinute = *(pRawdata+5);
3046
((mng_timep)*ppChunk)->iSecond = *(pRawdata+6);
3048
#endif /* MNG_STORE_CHUNKS */
3050
#ifdef MNG_SUPPORT_TRACE
3051
MNG_TRACE (pData, MNG_FN_READ_TIME, MNG_LC_END)
3054
return MNG_NOERROR; /* done */
3058
/* ************************************************************************** */
3060
READ_CHUNK (mng_read_mhdr)
3062
#ifdef MNG_SUPPORT_TRACE
3063
MNG_TRACE (pData, MNG_FN_READ_MHDR, MNG_LC_START)
3066
if (pData->eSigtype != mng_it_mng) /* sequence checks */
3067
MNG_ERROR (pData, MNG_CHUNKNOTALLOWED)
3069
if (pData->bHasheader) /* can only be the first chunk! */
3070
MNG_ERROR (pData, MNG_SEQUENCEERROR)
3071
/* correct length ? */
3072
#ifndef MNG_NO_OLD_VERSIONS
3073
if ((iRawlen != 28) && (iRawlen != 12))
3075
if ((iRawlen != 28))
3077
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3079
pData->bHasMHDR = MNG_TRUE; /* oh boy, a real MNG */
3080
pData->bHasheader = MNG_TRUE; /* we've got a header */
3081
pData->eImagetype = mng_it_mng; /* fill header fields */
3082
pData->iWidth = mng_get_uint32 (pRawdata);
3083
pData->iHeight = mng_get_uint32 (pRawdata+4);
3084
pData->iTicks = mng_get_uint32 (pRawdata+8);
3086
#ifndef MNG_NO_OLD_VERSIONS
3087
if (iRawlen == 28) /* proper MHDR ? */
3090
pData->iLayercount = mng_get_uint32 (pRawdata+12);
3091
pData->iFramecount = mng_get_uint32 (pRawdata+16);
3092
pData->iPlaytime = mng_get_uint32 (pRawdata+20);
3093
pData->iSimplicity = mng_get_uint32 (pRawdata+24);
3095
#ifndef MNG_NO_OLD_VERSIONS
3096
pData->bPreDraft48 = MNG_FALSE;
3098
else /* probably pre-draft48 then */
3100
pData->iLayercount = 0;
3101
pData->iFramecount = 0;
3102
pData->iPlaytime = 0;
3103
pData->iSimplicity = 0;
3105
pData->bPreDraft48 = MNG_TRUE;
3108
/* predict alpha-depth */
3109
if ((pData->iSimplicity & 0x00000001) == 0)
3110
#ifndef MNG_NO_16BIT_SUPPORT
3111
pData->iAlphadepth = 16; /* no indicators = assume the worst */
3113
pData->iAlphadepth = 8; /* anything else = assume the worst */
3116
if ((pData->iSimplicity & 0x00000008) == 0)
3117
pData->iAlphadepth = 0; /* no transparency at all */
3119
if ((pData->iSimplicity & 0x00000140) == 0x00000040)
3120
pData->iAlphadepth = 1; /* no semi-transparency guaranteed */
3122
#ifndef MNG_NO_16BIT_SUPPORT
3123
pData->iAlphadepth = 16; /* anything else = assume the worst */
3125
pData->iAlphadepth = 8; /* anything else = assume the worst */
3128
#ifdef MNG_INCLUDE_JNG /* can we handle the complexity ? */
3129
if (pData->iSimplicity & 0x0000FC00)
3131
if (pData->iSimplicity & 0x0000FC10)
3133
MNG_ERROR (pData, MNG_MNGTOOCOMPLEX)
3134
/* fits on maximum canvas ? */
3135
if ((pData->iWidth > pData->iMaxwidth) || (pData->iHeight > pData->iMaxheight))
3136
MNG_WARNING (pData, MNG_IMAGETOOLARGE)
3138
if (pData->fProcessheader) /* inform the app ? */
3139
if (!pData->fProcessheader (((mng_handle)pData), pData->iWidth, pData->iHeight))
3140
MNG_ERROR (pData, MNG_APPMISCERROR)
3142
pData->iImagelevel++; /* one level deeper */
3144
#ifdef MNG_STORE_CHUNKS
3145
if (pData->bStorechunks)
3146
{ /* initialize storage */
3147
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
3149
if (iRetcode) /* on error bail out */
3151
/* store the fields */
3152
((mng_mhdrp)*ppChunk)->iWidth = pData->iWidth;
3153
((mng_mhdrp)*ppChunk)->iHeight = pData->iHeight;
3154
((mng_mhdrp)*ppChunk)->iTicks = pData->iTicks;
3155
((mng_mhdrp)*ppChunk)->iLayercount = pData->iLayercount;
3156
((mng_mhdrp)*ppChunk)->iFramecount = pData->iFramecount;
3157
((mng_mhdrp)*ppChunk)->iPlaytime = pData->iPlaytime;
3158
((mng_mhdrp)*ppChunk)->iSimplicity = pData->iSimplicity;
3160
#endif /* MNG_STORE_CHUNKS */
3162
#ifdef MNG_SUPPORT_TRACE
3163
MNG_TRACE (pData, MNG_FN_READ_MHDR, MNG_LC_END)
3166
return MNG_NOERROR; /* done */
3169
/* ************************************************************************** */
3171
READ_CHUNK (mng_read_mend)
3173
#ifdef MNG_SUPPORT_TRACE
3174
MNG_TRACE (pData, MNG_FN_READ_MEND, MNG_LC_START)
3177
if (!pData->bHasMHDR) /* sequence checks */
3178
MNG_ERROR (pData, MNG_SEQUENCEERROR)
3180
if (iRawlen > 0) /* must not contain data! */
3181
MNG_ERROR (pData, MNG_INVALIDLENGTH)
3183
#ifdef MNG_SUPPORT_DISPLAY
3184
{ /* do something */
3185
mng_retcode iRetcode = mng_process_display_mend (pData);
3187
if (iRetcode) /* on error bail out */
3190
if (!pData->iTotalframes) /* save totals */
3191
pData->iTotalframes = pData->iFrameseq;
3192
if (!pData->iTotallayers)
3193
pData->iTotallayers = pData->iLayerseq;
3194
if (!pData->iTotalplaytime)
3195
pData->iTotalplaytime = pData->iFrametime;
3197
#endif /* MNG_SUPPORT_DISPLAY */
3199
pData->bHasMHDR = MNG_FALSE; /* end of the line, bro! */
3201
#ifdef MNG_STORE_CHUNKS
3202
if (pData->bStorechunks)
3203
{ /* initialize storage */
3204
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
3206
if (iRetcode) /* on error bail out */
3209
#endif /* MNG_STORE_CHUNKS */
3211
#ifdef MNG_SUPPORT_TRACE
3212
MNG_TRACE (pData, MNG_FN_READ_MEND, MNG_LC_END)
3215
return MNG_NOERROR; /* done */
3218
/* ************************************************************************** */
3220
#ifndef MNG_SKIPCHUNK_LOOP
3221
READ_CHUNK (mng_read_loop)
3223
#ifdef MNG_SUPPORT_TRACE
3224
MNG_TRACE (pData, MNG_FN_READ_LOOP, MNG_LC_START)
3227
if (!pData->bHasMHDR) /* sequence checks */
3228
MNG_ERROR (pData, MNG_SEQUENCEERROR)
3230
if (!pData->bCacheplayback) /* must store playback info to work!! */
3231
MNG_ERROR (pData, MNG_LOOPWITHCACHEOFF)
3233
#ifdef MNG_INCLUDE_JNG
3234
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
3236
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
3238
MNG_ERROR (pData, MNG_SEQUENCEERROR)
3240
if (iRawlen >= 5) /* length checks */
3244
if ((iRawlen - 6) % 4 != 0)
3245
MNG_ERROR (pData, MNG_INVALIDLENGTH)
3249
MNG_ERROR (pData, MNG_INVALIDLENGTH)
3251
#ifdef MNG_SUPPORT_DISPLAY
3255
mng_uint8 iTermination = 0;
3256
mng_uint32 iItermin = 1;
3257
mng_uint32 iItermax = 0x7fffffffL;
3258
mng_retcode iRetcode;
3260
pData->bHasLOOP = MNG_TRUE; /* indicate we're inside a loop */
3262
iLevel = *pRawdata; /* determine the fields for processing */
3264
#ifndef MNG_NO_OLD_VERSIONS
3265
if (pData->bPreDraft48)
3267
iTermination = *(pRawdata+1);
3269
iRepeat = mng_get_uint32 (pRawdata+2);
3273
iRepeat = mng_get_uint32 (pRawdata+1);
3277
#ifndef MNG_NO_OLD_VERSIONS
3278
if (!pData->bPreDraft48)
3280
iTermination = *(pRawdata+5);
3284
iItermin = mng_get_uint32 (pRawdata+6);
3288
iItermax = mng_get_uint32 (pRawdata+10);
3290
/* TODO: process signals */
3295
/* create the LOOP ani-object */
3296
iRetcode = mng_create_ani_loop (pData, iLevel, iRepeat, iTermination,
3297
iItermin, iItermax, 0, 0);
3299
if (iRetcode) /* on error bail out */
3301
/* skip till matching ENDL if iteration=0 */
3302
if ((!pData->bSkipping) && (iRepeat == 0))
3303
pData->bSkipping = MNG_TRUE;
3305
#endif /* MNG_SUPPORT_DISPLAY */
3307
#ifdef MNG_STORE_CHUNKS
3308
if (pData->bStorechunks)
3309
{ /* initialize storage */
3310
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
3312
if (iRetcode) /* on error bail out */
3315
if (iRawlen >= 5) /* store the fields */
3317
((mng_loopp)*ppChunk)->iLevel = *pRawdata;
3319
#ifndef MNG_NO_OLD_VERSIONS
3320
if (pData->bPreDraft48)
3322
((mng_loopp)*ppChunk)->iTermination = *(pRawdata+1);
3323
((mng_loopp)*ppChunk)->iRepeat = mng_get_uint32 (pRawdata+2);
3328
((mng_loopp)*ppChunk)->iRepeat = mng_get_uint32 (pRawdata+1);
3333
#ifndef MNG_NO_OLD_VERSIONS
3334
if (!pData->bPreDraft48)
3336
((mng_loopp)*ppChunk)->iTermination = *(pRawdata+5);
3340
((mng_loopp)*ppChunk)->iItermin = mng_get_uint32 (pRawdata+6);
3342
#ifndef MNG_NO_LOOP_SIGNALS_SUPPORTED
3345
((mng_loopp)*ppChunk)->iItermax = mng_get_uint32 (pRawdata+10);
3346
((mng_loopp)*ppChunk)->iCount = (iRawlen - 14) / 4;
3348
if (((mng_loopp)*ppChunk)->iCount)
3350
MNG_ALLOC (pData, ((mng_loopp)*ppChunk)->pSignals,
3351
((mng_loopp)*ppChunk)->iCount << 2)
3353
#ifndef MNG_BIGENDIAN_SUPPORTED
3356
mng_uint8p pIn = pRawdata + 14;
3357
mng_uint32p pOut = (mng_uint32p)((mng_loopp)*ppChunk)->pSignals;
3359
for (iX = 0; iX < ((mng_loopp)*ppChunk)->iCount; iX++)
3361
*pOut++ = mng_get_uint32 (pIn);
3366
MNG_COPY (((mng_loopp)*ppChunk)->pSignals, pRawdata + 14,
3367
((mng_loopp)*ppChunk)->iCount << 2)
3368
#endif /* !MNG_BIGENDIAN_SUPPORTED */
3376
#endif /* MNG_STORE_CHUNKS */
3378
#ifdef MNG_SUPPORT_TRACE
3379
MNG_TRACE (pData, MNG_FN_READ_LOOP, MNG_LC_END)
3382
return MNG_NOERROR; /* done */
3386
/* ************************************************************************** */
3388
#ifndef MNG_SKIPCHUNK_LOOP
3389
READ_CHUNK (mng_read_endl)
3391
#ifdef MNG_SUPPORT_TRACE
3392
MNG_TRACE (pData, MNG_FN_READ_ENDL, MNG_LC_START)
3395
if (!pData->bHasMHDR) /* sequence checks */
3396
MNG_ERROR (pData, MNG_SEQUENCEERROR)
3398
#ifdef MNG_INCLUDE_JNG
3399
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
3401
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
3403
MNG_ERROR (pData, MNG_SEQUENCEERROR)
3405
if (iRawlen != 1) /* length must be exactly 1 */
3406
MNG_ERROR (pData, MNG_INVALIDLENGTH)
3408
#ifdef MNG_SUPPORT_DISPLAY
3410
if (pData->bHasLOOP) /* are we really processing a loop ? */
3412
mng_uint8 iLevel = *pRawdata; /* get the nest level */
3413
/* create an ENDL animation object */
3414
mng_retcode iRetcode = mng_create_ani_endl (pData, iLevel);
3416
if (iRetcode) /* on error bail out */
3420
mng_ani_endlp pENDL = (mng_ani_endlp)pData->pLastaniobj;
3422
iRetcode = pENDL->sHeader.fProcess (pData, pENDL);
3424
if (iRetcode) /* on error bail out */
3429
MNG_ERROR (pData, MNG_NOMATCHINGLOOP)
3432
#endif /* MNG_SUPPORT_DISPLAY */
3434
#ifdef MNG_STORE_CHUNKS
3435
if (pData->bStorechunks)
3436
{ /* initialize storage */
3437
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
3439
if (iRetcode) /* on error bail out */
3441
/* store the fields */
3442
((mng_endlp)*ppChunk)->iLevel = *pRawdata;
3444
#endif /* MNG_STORE_CHUNKS */
3446
#ifdef MNG_SUPPORT_TRACE
3447
MNG_TRACE (pData, MNG_FN_READ_ENDL, MNG_LC_END)
3450
return MNG_NOERROR; /* done */
3454
/* ************************************************************************** */
3456
#ifndef MNG_SKIPCHUNK_DEFI
3457
READ_CHUNK (mng_read_defi)
3459
#ifdef MNG_SUPPORT_TRACE
3460
MNG_TRACE (pData, MNG_FN_READ_DEFI, MNG_LC_START)
3463
if (!pData->bHasMHDR) /* sequence checks */
3464
MNG_ERROR (pData, MNG_SEQUENCEERROR)
3466
#ifdef MNG_INCLUDE_JNG
3467
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
3469
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
3471
MNG_ERROR (pData, MNG_SEQUENCEERROR)
3472
/* check the length */
3473
if ((iRawlen != 2) && (iRawlen != 3) && (iRawlen != 4) &&
3474
(iRawlen != 12) && (iRawlen != 28))
3475
MNG_ERROR (pData, MNG_INVALIDLENGTH)
3477
#ifdef MNG_SUPPORT_DISPLAY
3479
mng_retcode iRetcode;
3481
pData->iDEFIobjectid = mng_get_uint16 (pRawdata);
3485
pData->bDEFIhasdonotshow = MNG_TRUE;
3486
pData->iDEFIdonotshow = *(pRawdata+2);
3490
pData->bDEFIhasdonotshow = MNG_FALSE;
3491
pData->iDEFIdonotshow = 0;
3496
pData->bDEFIhasconcrete = MNG_TRUE;
3497
pData->iDEFIconcrete = *(pRawdata+3);
3501
pData->bDEFIhasconcrete = MNG_FALSE;
3502
pData->iDEFIconcrete = 0;
3507
pData->bDEFIhasloca = MNG_TRUE;
3508
pData->iDEFIlocax = mng_get_int32 (pRawdata+4);
3509
pData->iDEFIlocay = mng_get_int32 (pRawdata+8);
3513
pData->bDEFIhasloca = MNG_FALSE;
3514
pData->iDEFIlocax = 0;
3515
pData->iDEFIlocay = 0;
3520
pData->bDEFIhasclip = MNG_TRUE;
3521
pData->iDEFIclipl = mng_get_int32 (pRawdata+12);
3522
pData->iDEFIclipr = mng_get_int32 (pRawdata+16);
3523
pData->iDEFIclipt = mng_get_int32 (pRawdata+20);
3524
pData->iDEFIclipb = mng_get_int32 (pRawdata+24);
3528
pData->bDEFIhasclip = MNG_FALSE;
3529
pData->iDEFIclipl = 0;
3530
pData->iDEFIclipr = 0;
3531
pData->iDEFIclipt = 0;
3532
pData->iDEFIclipb = 0;
3534
/* create an animation object */
3535
iRetcode = mng_create_ani_defi (pData);
3537
if (!iRetcode) /* do display processing */
3538
iRetcode = mng_process_display_defi (pData);
3540
if (iRetcode) /* on error bail out */
3544
#endif /* MNG_SUPPORT_DISPLAY */
3546
#ifdef MNG_STORE_CHUNKS
3547
if (pData->bStorechunks)
3548
{ /* initialize storage */
3549
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
3551
if (iRetcode) /* on error bail out */
3553
/* store the fields */
3554
((mng_defip)*ppChunk)->iObjectid = mng_get_uint16 (pRawdata);
3558
((mng_defip)*ppChunk)->bHasdonotshow = MNG_TRUE;
3559
((mng_defip)*ppChunk)->iDonotshow = *(pRawdata+2);
3562
((mng_defip)*ppChunk)->bHasdonotshow = MNG_FALSE;
3566
((mng_defip)*ppChunk)->bHasconcrete = MNG_TRUE;
3567
((mng_defip)*ppChunk)->iConcrete = *(pRawdata+3);
3570
((mng_defip)*ppChunk)->bHasconcrete = MNG_FALSE;
3574
((mng_defip)*ppChunk)->bHasloca = MNG_TRUE;
3575
((mng_defip)*ppChunk)->iXlocation = mng_get_int32 (pRawdata+4);
3576
((mng_defip)*ppChunk)->iYlocation = mng_get_int32 (pRawdata+8);
3579
((mng_defip)*ppChunk)->bHasloca = MNG_FALSE;
3583
((mng_defip)*ppChunk)->bHasclip = MNG_TRUE;
3584
((mng_defip)*ppChunk)->iLeftcb = mng_get_int32 (pRawdata+12);
3585
((mng_defip)*ppChunk)->iRightcb = mng_get_int32 (pRawdata+16);
3586
((mng_defip)*ppChunk)->iTopcb = mng_get_int32 (pRawdata+20);
3587
((mng_defip)*ppChunk)->iBottomcb = mng_get_int32 (pRawdata+24);
3590
((mng_defip)*ppChunk)->bHasclip = MNG_FALSE;
3593
#endif /* MNG_STORE_CHUNKS */
3595
#ifdef MNG_SUPPORT_TRACE
3596
MNG_TRACE (pData, MNG_FN_READ_DEFI, MNG_LC_END)
3599
return MNG_NOERROR; /* done */
3603
/* ************************************************************************** */
3605
#ifndef MNG_SKIPCHUNK_BASI
3606
READ_CHUNK (mng_read_basi)
3608
#ifdef MNG_SUPPORT_TRACE
3609
MNG_TRACE (pData, MNG_FN_READ_BASI, MNG_LC_START)
3612
if (!pData->bHasMHDR) /* sequence checks */
3613
MNG_ERROR (pData, MNG_SEQUENCEERROR)
3615
#ifdef MNG_INCLUDE_JNG
3616
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
3618
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
3620
MNG_ERROR (pData, MNG_SEQUENCEERROR)
3621
/* check the length */
3622
if ((iRawlen != 13) && (iRawlen != 19) && (iRawlen != 21) && (iRawlen != 22))
3623
MNG_ERROR (pData, MNG_INVALIDLENGTH)
3625
pData->bHasBASI = MNG_TRUE; /* inside a BASI-IEND block now */
3626
/* store interesting fields */
3627
pData->iDatawidth = mng_get_uint32 (pRawdata);
3628
pData->iDataheight = mng_get_uint32 (pRawdata+4);
3629
pData->iBitdepth = *(pRawdata+8);
3630
pData->iColortype = *(pRawdata+9);
3631
pData->iCompression = *(pRawdata+10);
3632
pData->iFilter = *(pRawdata+11);
3633
pData->iInterlace = *(pRawdata+12);
3636
#if defined(MNG_NO_16BIT_SUPPORT)
3637
pData->iPNGmult = 1;
3638
pData->iPNGdepth = pData->iBitdepth;
3639
if (pData->iBitdepth > 8)
3641
pData->iBitdepth = 8;
3642
pData->iPNGmult = 2;
3646
if ((pData->iBitdepth != 8) /* parameter validity checks */
3647
&& (pData->iBitdepth != 1) &&
3648
(pData->iBitdepth != 2) &&
3649
(pData->iBitdepth != 4)
3650
#ifndef MNG_NO_16BIT_SUPPORT
3651
&& (pData->iBitdepth != 16)
3654
MNG_ERROR (pData, MNG_INVALIDBITDEPTH)
3656
if ((pData->iColortype != MNG_COLORTYPE_GRAY ) &&
3657
(pData->iColortype != MNG_COLORTYPE_RGB ) &&
3658
(pData->iColortype != MNG_COLORTYPE_INDEXED) &&
3659
(pData->iColortype != MNG_COLORTYPE_GRAYA ) &&
3660
(pData->iColortype != MNG_COLORTYPE_RGBA ) )
3661
MNG_ERROR (pData, MNG_INVALIDCOLORTYPE)
3663
if ((pData->iColortype == MNG_COLORTYPE_INDEXED) && (pData->iBitdepth > 8))
3664
MNG_ERROR (pData, MNG_INVALIDBITDEPTH)
3666
if (((pData->iColortype == MNG_COLORTYPE_RGB ) ||
3667
(pData->iColortype == MNG_COLORTYPE_GRAYA ) ||
3668
(pData->iColortype == MNG_COLORTYPE_RGBA ) ) &&
3669
(pData->iBitdepth < 8 ) )
3670
MNG_ERROR (pData, MNG_INVALIDBITDEPTH)
3672
if (pData->iCompression != MNG_COMPRESSION_DEFLATE)
3673
MNG_ERROR (pData, MNG_INVALIDCOMPRESS)
3675
#if defined(FILTER192) || defined(FILTER193)
3676
if ((pData->iFilter != MNG_FILTER_ADAPTIVE ) &&
3677
#if defined(FILTER192) && defined(FILTER193)
3678
(pData->iFilter != MNG_FILTER_DIFFERING) &&
3679
(pData->iFilter != MNG_FILTER_NOFILTER ) )
3682
(pData->iFilter != MNG_FILTER_DIFFERING) )
3684
(pData->iFilter != MNG_FILTER_NOFILTER ) )
3687
MNG_ERROR (pData, MNG_INVALIDFILTER)
3690
MNG_ERROR (pData, MNG_INVALIDFILTER)
3693
if ((pData->iInterlace != MNG_INTERLACE_NONE ) &&
3694
(pData->iInterlace != MNG_INTERLACE_ADAM7) )
3695
MNG_ERROR (pData, MNG_INVALIDINTERLACE)
3697
pData->iImagelevel++; /* one level deeper */
3699
#ifdef MNG_SUPPORT_DISPLAY
3701
mng_uint16 iRed = 0;
3702
mng_uint16 iGreen = 0;
3703
mng_uint16 iBlue = 0;
3704
mng_bool bHasalpha = MNG_FALSE;
3705
mng_uint16 iAlpha = 0xFFFF;
3706
mng_uint8 iViewable = 0;
3707
mng_retcode iRetcode;
3709
if (iRawlen > 13) /* get remaining fields, if any */
3711
iRed = mng_get_uint16 (pRawdata+13);
3712
iGreen = mng_get_uint16 (pRawdata+15);
3713
iBlue = mng_get_uint16 (pRawdata+17);
3718
bHasalpha = MNG_TRUE;
3719
iAlpha = mng_get_uint16 (pRawdata+19);
3723
iViewable = *(pRawdata+21);
3724
/* create an animation object */
3725
iRetcode = mng_create_ani_basi (pData, iRed, iGreen, iBlue,
3726
bHasalpha, iAlpha, iViewable);
3728
if (!iRetcode) /* display-processing... */
3729
iRetcode = mng_process_display_basi (pData, iRed, iGreen, iBlue,
3730
bHasalpha, iAlpha, iViewable);
3732
if (iRetcode) /* on error bail out */
3736
#endif /* MNG_SUPPORT_DISPLAY */
3738
#ifdef MNG_STORE_CHUNKS
3739
if (pData->bStorechunks)
3740
{ /* initialize storage */
3741
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
3743
if (iRetcode) /* on error bail out */
3745
/* store the fields */
3746
((mng_basip)*ppChunk)->iWidth = mng_get_uint32 (pRawdata);
3747
((mng_basip)*ppChunk)->iHeight = mng_get_uint32 (pRawdata+4);
3748
#ifdef MNG_NO_16BIT_SUPPORT
3749
if (*(pRawdata+8) > 8)
3750
((mng_basip)*ppChunk)->iBitdepth = 8;
3753
((mng_basip)*ppChunk)->iBitdepth = *(pRawdata+8);
3754
((mng_basip)*ppChunk)->iColortype = *(pRawdata+9);
3755
((mng_basip)*ppChunk)->iCompression = *(pRawdata+10);
3756
((mng_basip)*ppChunk)->iFilter = *(pRawdata+11);
3757
((mng_basip)*ppChunk)->iInterlace = *(pRawdata+12);
3761
((mng_basip)*ppChunk)->iRed = mng_get_uint16 (pRawdata+13);
3762
((mng_basip)*ppChunk)->iGreen = mng_get_uint16 (pRawdata+15);
3763
((mng_basip)*ppChunk)->iBlue = mng_get_uint16 (pRawdata+17);
3767
((mng_basip)*ppChunk)->iAlpha = mng_get_uint16 (pRawdata+19);
3770
((mng_basip)*ppChunk)->iViewable = *(pRawdata+21);
3773
#endif /* MNG_STORE_CHUNKS */
3775
#ifdef MNG_SUPPORT_TRACE
3776
MNG_TRACE (pData, MNG_FN_READ_BASI, MNG_LC_END)
3779
return MNG_NOERROR; /* done */
3782
/* ************************************************************************** */
3784
READ_CHUNK (mng_read_clon)
3786
#ifdef MNG_SUPPORT_TRACE
3787
MNG_TRACE (pData, MNG_FN_READ_CLON, MNG_LC_START)
3790
if (!pData->bHasMHDR) /* sequence checks */
3791
MNG_ERROR (pData, MNG_SEQUENCEERROR)
3793
#ifdef MNG_INCLUDE_JNG
3794
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
3796
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
3798
MNG_ERROR (pData, MNG_SEQUENCEERROR)
3799
/* check the length */
3800
if ((iRawlen != 4) && (iRawlen != 5) && (iRawlen != 6) &&
3801
(iRawlen != 7) && (iRawlen != 16))
3802
MNG_ERROR (pData, MNG_INVALIDLENGTH)
3804
#ifdef MNG_SUPPORT_DISPLAY
3806
mng_uint16 iSourceid, iCloneid;
3807
mng_uint8 iClonetype = 0;
3808
mng_bool bHasdonotshow = MNG_FALSE;
3809
mng_uint8 iDonotshow = 0;
3810
mng_uint8 iConcrete = 0;
3811
mng_bool bHasloca = MNG_FALSE;
3812
mng_uint8 iLocationtype = 0;
3813
mng_int32 iLocationx = 0;
3814
mng_int32 iLocationy = 0;
3815
mng_retcode iRetcode;
3817
iSourceid = mng_get_uint16 (pRawdata);
3818
iCloneid = mng_get_uint16 (pRawdata+2);
3821
iClonetype = *(pRawdata+4);
3825
bHasdonotshow = MNG_TRUE;
3826
iDonotshow = *(pRawdata+5);
3830
iConcrete = *(pRawdata+6);
3834
bHasloca = MNG_TRUE;
3835
iLocationtype = *(pRawdata+7);
3836
iLocationx = mng_get_int32 (pRawdata+8);
3837
iLocationy = mng_get_int32 (pRawdata+12);
3840
iRetcode = mng_create_ani_clon (pData, iSourceid, iCloneid, iClonetype,
3841
bHasdonotshow, iDonotshow, iConcrete,
3842
bHasloca, iLocationtype, iLocationx, iLocationy);
3844
if (!iRetcode) /* do display processing */
3845
iRetcode = mng_process_display_clon (pData, iSourceid, iCloneid, iClonetype,
3846
bHasdonotshow, iDonotshow, iConcrete,
3847
bHasloca, iLocationtype, iLocationx,
3850
if (iRetcode) /* on error bail out */
3854
#endif /* MNG_SUPPORT_DISPLAY */
3856
#ifdef MNG_STORE_CHUNKS
3857
if (pData->bStorechunks)
3858
{ /* initialize storage */
3859
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
3861
if (iRetcode) /* on error bail out */
3863
/* store the fields */
3864
((mng_clonp)*ppChunk)->iSourceid = mng_get_uint16 (pRawdata);
3865
((mng_clonp)*ppChunk)->iCloneid = mng_get_uint16 (pRawdata+2);
3868
((mng_clonp)*ppChunk)->iClonetype = *(pRawdata+4);
3871
((mng_clonp)*ppChunk)->iDonotshow = *(pRawdata+5);
3874
((mng_clonp)*ppChunk)->iConcrete = *(pRawdata+6);
3878
((mng_clonp)*ppChunk)->bHasloca = MNG_TRUE;
3879
((mng_clonp)*ppChunk)->iLocationtype = *(pRawdata+7);
3880
((mng_clonp)*ppChunk)->iLocationx = mng_get_int32 (pRawdata+8);
3881
((mng_clonp)*ppChunk)->iLocationy = mng_get_int32 (pRawdata+12);
3885
((mng_clonp)*ppChunk)->bHasloca = MNG_FALSE;
3888
#endif /* MNG_STORE_CHUNKS */
3890
#ifdef MNG_SUPPORT_TRACE
3891
MNG_TRACE (pData, MNG_FN_READ_CLON, MNG_LC_END)
3894
return MNG_NOERROR; /* done */
3898
/* ************************************************************************** */
3900
#ifndef MNG_SKIPCHUNK_PAST
3901
READ_CHUNK (mng_read_past)
3903
#if defined(MNG_STORE_CHUNKS) || defined(MNG_SUPPORT_DISPLAY)
3904
mng_retcode iRetcode;
3905
mng_uint16 iTargetid;
3906
mng_uint8 iTargettype;
3913
mng_past_sourcep pSource;
3916
#ifdef MNG_SUPPORT_TRACE
3917
MNG_TRACE (pData, MNG_FN_READ_PAST, MNG_LC_START)
3920
if (!pData->bHasMHDR) /* sequence checks */
3921
MNG_ERROR (pData, MNG_SEQUENCEERROR)
3923
#ifdef MNG_INCLUDE_JNG
3924
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
3926
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
3928
MNG_ERROR (pData, MNG_SEQUENCEERROR)
3930
/* check the length */
3931
if ((iRawlen < 41) || (((iRawlen - 11) % 30) != 0))
3932
MNG_ERROR (pData, MNG_INVALIDLENGTH)
3934
#if defined(MNG_STORE_CHUNKS) || defined(MNG_SUPPORT_DISPLAY)
3935
iTargetid = mng_get_uint16 (pRawdata);
3936
iTargettype = *(pRawdata+2);
3937
iTargetx = mng_get_int32 (pRawdata+3);
3938
iTargety = mng_get_int32 (pRawdata+7);
3939
iCount = ((iRawlen - 11) / 30); /* how many entries again? */
3940
iSize = iCount * sizeof (mng_past_source);
3943
/* get a buffer for all the source blocks */
3944
MNG_ALLOC (pData, pSources, iSize)
3946
pSource = (mng_past_sourcep)pSources;
3948
for (iX = 0; iX < iCount; iX++) /* now copy the source blocks */
3950
pSource->iSourceid = mng_get_uint16 (pRawdata);
3951
pSource->iComposition = *(pRawdata+2);
3952
pSource->iOrientation = *(pRawdata+3);
3953
pSource->iOffsettype = *(pRawdata+4);
3954
pSource->iOffsetx = mng_get_int32 (pRawdata+5);
3955
pSource->iOffsety = mng_get_int32 (pRawdata+9);
3956
pSource->iBoundarytype = *(pRawdata+13);
3957
pSource->iBoundaryl = mng_get_int32 (pRawdata+14);
3958
pSource->iBoundaryr = mng_get_int32 (pRawdata+18);
3959
pSource->iBoundaryt = mng_get_int32 (pRawdata+22);
3960
pSource->iBoundaryb = mng_get_int32 (pRawdata+26);
3967
#ifdef MNG_SUPPORT_DISPLAY
3968
{ /* create playback object */
3969
iRetcode = mng_create_ani_past (pData, iTargetid, iTargettype, iTargetx,
3970
iTargety, iCount, pSources);
3972
if (!iRetcode) /* do display processing */
3973
iRetcode = mng_process_display_past (pData, iTargetid, iTargettype, iTargetx,
3974
iTargety, iCount, pSources);
3976
if (iRetcode) /* on error bail out */
3978
MNG_FREEX (pData, pSources, iSize)
3982
#endif /* MNG_SUPPORT_DISPLAY */
3984
#ifdef MNG_STORE_CHUNKS
3985
if (pData->bStorechunks)
3986
{ /* initialize storage */
3987
iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
3989
if (iRetcode) /* on error bail out */
3991
MNG_FREEX (pData, pSources, iSize)
3994
/* store the fields */
3995
((mng_pastp)*ppChunk)->iDestid = iTargetid;
3996
((mng_pastp)*ppChunk)->iTargettype = iTargettype;
3997
((mng_pastp)*ppChunk)->iTargetx = iTargetx;
3998
((mng_pastp)*ppChunk)->iTargety = iTargety;
3999
((mng_pastp)*ppChunk)->iCount = iCount;
4000
/* get a buffer & copy the source blocks */
4001
MNG_ALLOC (pData, ((mng_pastp)*ppChunk)->pSources, iSize)
4002
MNG_COPY (((mng_pastp)*ppChunk)->pSources, pSources, iSize)
4004
#endif /* MNG_STORE_CHUNKS */
4006
#if defined(MNG_STORE_CHUNKS) || defined(MNG_SUPPORT_DISPLAY)
4007
/* free the source block buffer */
4008
MNG_FREEX (pData, pSources, iSize)
4011
#ifdef MNG_SUPPORT_TRACE
4012
MNG_TRACE (pData, MNG_FN_READ_PAST, MNG_LC_END)
4015
return MNG_NOERROR; /* done */
4019
/* ************************************************************************** */
4021
#ifndef MNG_SKIPCHUNK_DISC
4022
READ_CHUNK (mng_read_disc)
4024
#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS)
4026
mng_uint16p pIds = MNG_NULL;
4027
mng_retcode iRetcode;
4030
#ifdef MNG_SUPPORT_TRACE
4031
MNG_TRACE (pData, MNG_FN_READ_DISC, MNG_LC_START)
4034
if (!pData->bHasMHDR) /* sequence checks */
4035
MNG_ERROR (pData, MNG_SEQUENCEERROR)
4037
#ifdef MNG_INCLUDE_JNG
4038
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
4040
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
4042
MNG_ERROR (pData, MNG_SEQUENCEERROR)
4044
if ((iRawlen % 2) != 0) /* check the length */
4045
MNG_ERROR (pData, MNG_INVALIDLENGTH)
4047
#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS)
4048
iCount = (iRawlen / sizeof (mng_uint16));
4052
MNG_ALLOC (pData, pIds, iRawlen)
4054
#ifndef MNG_BIGENDIAN_SUPPORTED
4057
mng_uint8p pIn = pRawdata;
4058
mng_uint16p pOut = pIds;
4060
for (iX = 0; iX < iCount; iX++)
4062
*pOut++ = mng_get_uint16 (pIn);
4067
MNG_COPY (pIds, pRawdata, iRawlen)
4068
#endif /* !MNG_BIGENDIAN_SUPPORTED */
4072
#ifdef MNG_SUPPORT_DISPLAY
4073
{ /* create playback object */
4074
iRetcode = mng_create_ani_disc (pData, iCount, pIds);
4076
if (iRetcode) /* on error bail out */
4078
/* now process it */
4079
iRetcode = mng_process_display_disc (pData, iCount, pIds);
4081
if (iRetcode) /* on error bail out */
4084
#endif /* MNG_SUPPORT_DISPLAY */
4086
#ifdef MNG_STORE_CHUNKS
4087
if (pData->bStorechunks)
4088
{ /* initialize storage */
4089
iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
4091
if (iRetcode) /* on error bail out */
4093
/* store the fields */
4094
((mng_discp)*ppChunk)->iCount = iCount;
4098
MNG_ALLOC (pData, ((mng_discp)*ppChunk)->pObjectids, iRawlen)
4099
MNG_COPY (((mng_discp)*ppChunk)->pObjectids, pIds, iRawlen)
4102
#endif /* MNG_STORE_CHUNKS */
4104
#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS)
4106
MNG_FREEX (pData, pIds, iRawlen)
4109
#ifdef MNG_SUPPORT_TRACE
4110
MNG_TRACE (pData, MNG_FN_READ_DISC, MNG_LC_END)
4113
return MNG_NOERROR; /* done */
4117
/* ************************************************************************** */
4119
#ifndef MNG_SKIPCHUNK_BACK
4120
READ_CHUNK (mng_read_back)
4122
#ifdef MNG_SUPPORT_TRACE
4123
MNG_TRACE (pData, MNG_FN_READ_BACK, MNG_LC_START)
4126
if (!pData->bHasMHDR) /* sequence checks */
4127
MNG_ERROR (pData, MNG_SEQUENCEERROR)
4129
#ifdef MNG_INCLUDE_JNG
4130
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
4132
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
4134
MNG_ERROR (pData, MNG_SEQUENCEERROR)
4135
/* check the length */
4136
if ((iRawlen != 6) && (iRawlen != 7) && (iRawlen != 9) && (iRawlen != 10))
4137
MNG_ERROR (pData, MNG_INVALIDLENGTH)
4139
#ifdef MNG_SUPPORT_DISPLAY
4141
mng_retcode iRetcode;
4142
/* retrieve the fields */
4143
pData->bHasBACK = MNG_TRUE;
4144
pData->iBACKred = mng_get_uint16 (pRawdata);
4145
pData->iBACKgreen = mng_get_uint16 (pRawdata+2);
4146
pData->iBACKblue = mng_get_uint16 (pRawdata+4);
4149
pData->iBACKmandatory = *(pRawdata+6);
4151
pData->iBACKmandatory = 0;
4154
pData->iBACKimageid = mng_get_uint16 (pRawdata+7);
4156
pData->iBACKimageid = 0;
4159
pData->iBACKtile = *(pRawdata+9);
4161
pData->iBACKtile = 0;
4163
iRetcode = mng_create_ani_back (pData, pData->iBACKred, pData->iBACKgreen,
4164
pData->iBACKblue, pData->iBACKmandatory,
4165
pData->iBACKimageid, pData->iBACKtile);
4167
if (iRetcode) /* on error bail out */
4170
#endif /* MNG_SUPPORT_DISPLAY */
4172
#ifdef MNG_STORE_CHUNKS
4173
if (pData->bStorechunks)
4174
{ /* initialize storage */
4175
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
4177
if (iRetcode) /* on error bail out */
4179
/* store the fields */
4180
((mng_backp)*ppChunk)->iRed = mng_get_uint16 (pRawdata);
4181
((mng_backp)*ppChunk)->iGreen = mng_get_uint16 (pRawdata+2);
4182
((mng_backp)*ppChunk)->iBlue = mng_get_uint16 (pRawdata+4);
4185
((mng_backp)*ppChunk)->iMandatory = *(pRawdata+6);
4188
((mng_backp)*ppChunk)->iImageid = mng_get_uint16 (pRawdata+7);
4191
((mng_backp)*ppChunk)->iTile = *(pRawdata+9);
4194
#endif /* MNG_STORE_CHUNKS */
4196
#ifdef MNG_SUPPORT_TRACE
4197
MNG_TRACE (pData, MNG_FN_READ_BACK, MNG_LC_END)
4200
return MNG_NOERROR; /* done */
4204
/* ************************************************************************** */
4206
#ifndef MNG_SKIPCHUNK_FRAM
4207
READ_CHUNK (mng_read_fram)
4210
#ifdef MNG_STORE_CHUNKS
4211
mng_uint32 iNamelen;
4214
mng_uint32 iRequired = 0;
4216
#ifdef MNG_SUPPORT_TRACE
4217
MNG_TRACE (pData, MNG_FN_READ_FRAM, MNG_LC_START)
4220
if (!pData->bHasMHDR) /* sequence checks */
4221
MNG_ERROR (pData, MNG_SEQUENCEERROR)
4223
#ifdef MNG_INCLUDE_JNG
4224
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
4226
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
4228
MNG_ERROR (pData, MNG_SEQUENCEERROR)
4230
if (iRawlen <= 1) /* only framing-mode ? */
4232
#ifdef MNG_STORE_CHUNKS
4233
iNamelen = 0; /* indicate so */
4240
pTemp = find_null (pRawdata+1); /* find null-separator */
4241
/* not found inside input-data ? */
4242
if ((pTemp - pRawdata) > (mng_int32)iRawlen)
4243
pTemp = pRawdata + iRawlen; /* than remainder is name */
4245
#ifdef MNG_STORE_CHUNKS
4246
iNamelen = (mng_uint32)((pTemp - pRawdata) - 1);
4248
iRemain = (mng_uint32)(iRawlen - (pTemp - pRawdata));
4250
if (iRemain) /* if there is remaining data it's less 1 byte */
4253
if ((iRemain) && (iRemain < 4)) /* remains must be empty or at least 4 bytes */
4254
MNG_ERROR (pData, MNG_INVALIDLENGTH)
4258
iRequired = 4; /* calculate and check required remaining length */
4260
if (*(pTemp+1)) { iRequired += 4; }
4261
if (*(pTemp+2)) { iRequired += 4; }
4262
if (*(pTemp+3)) { iRequired += 17; }
4266
if ((iRemain - iRequired) % 4 != 0)
4267
MNG_ERROR (pData, MNG_INVALIDLENGTH)
4271
if (iRemain != iRequired)
4272
MNG_ERROR (pData, MNG_INVALIDLENGTH)
4277
#ifdef MNG_SUPPORT_DISPLAY
4279
mng_uint8p pWork = pTemp;
4280
mng_uint8 iFramemode = 0;
4281
mng_uint8 iChangedelay = 0;
4282
mng_uint32 iDelay = 0;
4283
mng_uint8 iChangetimeout = 0;
4284
mng_uint32 iTimeout = 0;
4285
mng_uint8 iChangeclipping = 0;
4286
mng_uint8 iCliptype = 0;
4287
mng_int32 iClipl = 0;
4288
mng_int32 iClipr = 0;
4289
mng_int32 iClipt = 0;
4290
mng_int32 iClipb = 0;
4291
mng_retcode iRetcode;
4293
if (iRawlen) /* any data specified ? */
4295
if (*(pRawdata)) /* save the new framing mode ? */
4297
iFramemode = *(pRawdata);
4299
#ifndef MNG_NO_OLD_VERSIONS
4300
if (pData->bPreDraft48) /* old style input-stream ? */
4305
case 1: { iFramemode = 3; break; }
4306
case 2: { iFramemode = 4; break; }
4307
case 3: { iFramemode = 1; break; }
4308
case 4: { iFramemode = 1; break; }
4309
case 5: { iFramemode = 2; break; }
4310
default: { iFramemode = 1; break; }
4318
iChangedelay = *(pWork+1);
4319
iChangetimeout = *(pWork+2);
4320
iChangeclipping = *(pWork+3);
4323
if (iChangedelay) /* delay changed ? */
4325
iDelay = mng_get_uint32 (pWork);
4329
if (iChangetimeout) /* timeout changed ? */
4331
iTimeout = mng_get_uint32 (pWork);
4335
if (iChangeclipping) /* clipping changed ? */
4338
iClipl = mng_get_int32 (pWork+1);
4339
iClipr = mng_get_int32 (pWork+5);
4340
iClipt = mng_get_int32 (pWork+9);
4341
iClipb = mng_get_int32 (pWork+13);
4346
iRetcode = mng_create_ani_fram (pData, iFramemode, iChangedelay, iDelay,
4347
iChangetimeout, iTimeout,
4348
iChangeclipping, iCliptype,
4349
iClipl, iClipr, iClipt, iClipb);
4351
if (!iRetcode) /* now go and do something */
4352
iRetcode = mng_process_display_fram (pData, iFramemode, iChangedelay, iDelay,
4353
iChangetimeout, iTimeout,
4354
iChangeclipping, iCliptype,
4355
iClipl, iClipr, iClipt, iClipb);
4357
if (iRetcode) /* on error bail out */
4361
#endif /* MNG_SUPPORT_DISPLAY */
4363
#ifdef MNG_STORE_CHUNKS
4364
if (pData->bStorechunks)
4365
{ /* initialize storage */
4366
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
4368
if (iRetcode) /* on error bail out */
4370
/* store the fields */
4371
((mng_framp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
4375
mng_uint8 iFramemode = *(pRawdata);
4377
#ifndef MNG_NO_OLD_VERSIONS
4378
if (pData->bPreDraft48) /* old style input-stream ? */
4382
case 1: { iFramemode = 3; break; }
4383
case 2: { iFramemode = 4; break; }
4384
case 3: { iFramemode = 5; break; } /* TODO: provision for mode=5 ??? */
4385
case 4: { iFramemode = 1; break; }
4386
case 5: { iFramemode = 2; break; }
4387
default: { iFramemode = 1; break; }
4392
((mng_framp)*ppChunk)->iMode = iFramemode;
4393
((mng_framp)*ppChunk)->iNamesize = iNamelen;
4397
MNG_ALLOC (pData, ((mng_framp)*ppChunk)->zName, iNamelen+1)
4398
MNG_COPY (((mng_framp)*ppChunk)->zName, pRawdata+1, iNamelen)
4403
((mng_framp)*ppChunk)->iChangedelay = *(pTemp+1);
4404
((mng_framp)*ppChunk)->iChangetimeout = *(pTemp+2);
4405
((mng_framp)*ppChunk)->iChangeclipping = *(pTemp+3);
4406
((mng_framp)*ppChunk)->iChangesyncid = *(pTemp+4);
4410
if (((mng_framp)*ppChunk)->iChangedelay)
4412
((mng_framp)*ppChunk)->iDelay = mng_get_uint32 (pTemp);
4416
if (((mng_framp)*ppChunk)->iChangetimeout)
4418
((mng_framp)*ppChunk)->iTimeout = mng_get_uint32 (pTemp);
4422
if (((mng_framp)*ppChunk)->iChangeclipping)
4424
((mng_framp)*ppChunk)->iBoundarytype = *pTemp;
4425
((mng_framp)*ppChunk)->iBoundaryl = mng_get_int32 (pTemp+1);
4426
((mng_framp)*ppChunk)->iBoundaryr = mng_get_int32 (pTemp+5);
4427
((mng_framp)*ppChunk)->iBoundaryt = mng_get_int32 (pTemp+9);
4428
((mng_framp)*ppChunk)->iBoundaryb = mng_get_int32 (pTemp+13);
4432
if (((mng_framp)*ppChunk)->iChangesyncid)
4434
((mng_framp)*ppChunk)->iCount = (iRemain - iRequired) / 4;
4436
if (((mng_framp)*ppChunk)->iCount)
4438
MNG_ALLOC (pData, ((mng_framp)*ppChunk)->pSyncids,
4439
((mng_framp)*ppChunk)->iCount * 4);
4441
#ifndef MNG_BIGENDIAN_SUPPORTED
4444
mng_uint32p pOut = ((mng_framp)*ppChunk)->pSyncids;
4446
for (iX = 0; iX < ((mng_framp)*ppChunk)->iCount; iX++)
4448
*pOut++ = mng_get_uint32 (pTemp);
4453
MNG_COPY (((mng_framp)*ppChunk)->pSyncids, pTemp,
4454
((mng_framp)*ppChunk)->iCount * 4)
4455
#endif /* !MNG_BIGENDIAN_SUPPORTED */
4461
#endif /* MNG_STORE_CHUNKS */
4463
#ifdef MNG_SUPPORT_TRACE
4464
MNG_TRACE (pData, MNG_FN_READ_FRAM, MNG_LC_END)
4467
return MNG_NOERROR; /* done */
4471
/* ************************************************************************** */
4473
#ifndef MNG_SKIPCHUNK_MOVE
4474
READ_CHUNK (mng_read_move)
4476
#ifdef MNG_SUPPORT_TRACE
4477
MNG_TRACE (pData, MNG_FN_READ_MOVE, MNG_LC_START)
4480
if (!pData->bHasMHDR) /* sequence checks */
4481
MNG_ERROR (pData, MNG_SEQUENCEERROR)
4483
#ifdef MNG_INCLUDE_JNG
4484
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
4486
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
4488
MNG_ERROR (pData, MNG_SEQUENCEERROR)
4490
if (iRawlen != 13) /* check the length */
4491
MNG_ERROR (pData, MNG_INVALIDLENGTH)
4493
#ifdef MNG_SUPPORT_DISPLAY
4495
mng_retcode iRetcode;
4496
/* create a MOVE animation object */
4497
iRetcode = mng_create_ani_move (pData, mng_get_uint16 (pRawdata),
4498
mng_get_uint16 (pRawdata+2),
4500
mng_get_int32 (pRawdata+5),
4501
mng_get_int32 (pRawdata+9));
4503
if (!iRetcode) /* process the move */
4504
iRetcode = mng_process_display_move (pData,
4505
mng_get_uint16 (pRawdata),
4506
mng_get_uint16 (pRawdata+2),
4508
mng_get_int32 (pRawdata+5),
4509
mng_get_int32 (pRawdata+9));
4511
if (iRetcode) /* on error bail out */
4515
#endif /* MNG_SUPPORT_DISPLAY */
4517
#ifdef MNG_STORE_CHUNKS
4518
if (pData->bStorechunks)
4519
{ /* initialize storage */
4520
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
4522
if (iRetcode) /* on error bail out */
4524
/* store the fields */
4525
((mng_movep)*ppChunk)->iFirstid = mng_get_uint16 (pRawdata);
4526
((mng_movep)*ppChunk)->iLastid = mng_get_uint16 (pRawdata+2);
4527
((mng_movep)*ppChunk)->iMovetype = *(pRawdata+4);
4528
((mng_movep)*ppChunk)->iMovex = mng_get_int32 (pRawdata+5);
4529
((mng_movep)*ppChunk)->iMovey = mng_get_int32 (pRawdata+9);
4531
#endif /* MNG_STORE_CHUNKS */
4533
#ifdef MNG_SUPPORT_TRACE
4534
MNG_TRACE (pData, MNG_FN_READ_MOVE, MNG_LC_END)
4537
return MNG_NOERROR; /* done */
4541
/* ************************************************************************** */
4543
#ifndef MNG_SKIPCHUNK_CLIP
4544
READ_CHUNK (mng_read_clip)
4546
#ifdef MNG_SUPPORT_TRACE
4547
MNG_TRACE (pData, MNG_FN_READ_CLIP, MNG_LC_START)
4550
if (!pData->bHasMHDR) /* sequence checks */
4551
MNG_ERROR (pData, MNG_SEQUENCEERROR)
4553
#ifdef MNG_INCLUDE_JNG
4554
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
4556
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
4558
MNG_ERROR (pData, MNG_SEQUENCEERROR)
4560
if (iRawlen != 21) /* check the length */
4561
MNG_ERROR (pData, MNG_INVALIDLENGTH)
4563
#ifdef MNG_SUPPORT_DISPLAY
4565
mng_retcode iRetcode;
4566
/* create a CLIP animation object */
4567
iRetcode = mng_create_ani_clip (pData, mng_get_uint16 (pRawdata),
4568
mng_get_uint16 (pRawdata+2),
4570
mng_get_int32 (pRawdata+5),
4571
mng_get_int32 (pRawdata+9),
4572
mng_get_int32 (pRawdata+13),
4573
mng_get_int32 (pRawdata+17));
4575
if (!iRetcode) /* process the clipping */
4576
iRetcode = mng_process_display_clip (pData,
4577
mng_get_uint16 (pRawdata),
4578
mng_get_uint16 (pRawdata+2),
4580
mng_get_int32 (pRawdata+5),
4581
mng_get_int32 (pRawdata+9),
4582
mng_get_int32 (pRawdata+13),
4583
mng_get_int32 (pRawdata+17));
4585
if (iRetcode) /* on error bail out */
4589
#endif /* MNG_SUPPORT_DISPLAY */
4591
#ifdef MNG_STORE_CHUNKS
4592
if (pData->bStorechunks)
4593
{ /* initialize storage */
4594
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
4596
if (iRetcode) /* on error bail out */
4598
/* store the fields */
4599
((mng_clipp)*ppChunk)->iFirstid = mng_get_uint16 (pRawdata);
4600
((mng_clipp)*ppChunk)->iLastid = mng_get_uint16 (pRawdata+2);
4601
((mng_clipp)*ppChunk)->iCliptype = *(pRawdata+4);
4602
((mng_clipp)*ppChunk)->iClipl = mng_get_int32 (pRawdata+5);
4603
((mng_clipp)*ppChunk)->iClipr = mng_get_int32 (pRawdata+9);
4604
((mng_clipp)*ppChunk)->iClipt = mng_get_int32 (pRawdata+13);
4605
((mng_clipp)*ppChunk)->iClipb = mng_get_int32 (pRawdata+17);
4607
#endif /* MNG_STORE_CHUNKS */
4609
#ifdef MNG_SUPPORT_TRACE
4610
MNG_TRACE (pData, MNG_FN_READ_CLIP, MNG_LC_END)
4613
return MNG_NOERROR; /* done */
4617
/* ************************************************************************** */
4619
#ifndef MNG_SKIPCHUNK_SHOW
4620
READ_CHUNK (mng_read_show)
4622
#ifdef MNG_SUPPORT_TRACE
4623
MNG_TRACE (pData, MNG_FN_READ_SHOW, MNG_LC_START)
4626
if (!pData->bHasMHDR) /* sequence checks */
4627
MNG_ERROR (pData, MNG_SEQUENCEERROR)
4629
#ifdef MNG_INCLUDE_JNG
4630
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
4632
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
4634
MNG_ERROR (pData, MNG_SEQUENCEERROR)
4635
/* check the length */
4636
if ((iRawlen != 0) && (iRawlen != 2) && (iRawlen != 4) && (iRawlen != 5))
4637
MNG_ERROR (pData, MNG_INVALIDLENGTH)
4639
#ifdef MNG_SUPPORT_DISPLAY
4641
mng_retcode iRetcode;
4643
if (iRawlen) /* determine parameters if any */
4645
pData->iSHOWfromid = mng_get_uint16 (pRawdata);
4648
pData->iSHOWtoid = mng_get_uint16 (pRawdata+2);
4650
pData->iSHOWtoid = pData->iSHOWfromid;
4653
pData->iSHOWmode = *(pRawdata+4);
4655
pData->iSHOWmode = 0;
4657
else /* use defaults then */
4659
pData->iSHOWmode = 2;
4660
pData->iSHOWfromid = 1;
4661
pData->iSHOWtoid = 65535;
4663
/* create a SHOW animation object */
4664
iRetcode = mng_create_ani_show (pData, pData->iSHOWfromid,
4665
pData->iSHOWtoid, pData->iSHOWmode);
4667
if (!iRetcode) /* go and do it! */
4668
iRetcode = mng_process_display_show (pData);
4670
if (iRetcode) /* on error bail out */
4674
#endif /* MNG_SUPPORT_DISPLAY */
4676
#ifdef MNG_STORE_CHUNKS
4677
if (pData->bStorechunks)
4678
{ /* initialize storage */
4679
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
4681
if (iRetcode) /* on error bail out */
4683
/* store the fields */
4684
((mng_showp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
4688
((mng_showp)*ppChunk)->iFirstid = mng_get_uint16 (pRawdata);
4691
((mng_showp)*ppChunk)->iLastid = mng_get_uint16 (pRawdata+2);
4693
((mng_showp)*ppChunk)->iLastid = ((mng_showp)*ppChunk)->iFirstid;
4696
((mng_showp)*ppChunk)->iMode = *(pRawdata+4);
4699
#endif /* MNG_STORE_CHUNKS */
4701
#ifdef MNG_SUPPORT_TRACE
4702
MNG_TRACE (pData, MNG_FN_READ_SHOW, MNG_LC_END)
4705
return MNG_NOERROR; /* done */
4709
/* ************************************************************************** */
4711
#ifndef MNG_SKIPCHUNK_TERM
4712
READ_CHUNK (mng_read_term)
4714
mng_uint8 iTermaction;
4715
mng_uint8 iIteraction = 0;
4716
mng_uint32 iDelay = 0;
4717
mng_uint32 iItermax = 0;
4719
#ifdef MNG_SUPPORT_TRACE
4720
MNG_TRACE (pData, MNG_FN_READ_TERM, MNG_LC_START)
4723
if (!pData->bHasMHDR) /* sequence checks */
4724
MNG_ERROR (pData, MNG_SEQUENCEERROR)
4726
#ifdef MNG_INCLUDE_JNG
4727
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
4729
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
4731
MNG_ERROR (pData, MNG_SEQUENCEERROR)
4733
/* should be behind MHDR or SAVE !! */
4734
if ((!pData->bHasSAVE) && (pData->iChunkseq > 2))
4736
pData->bMisplacedTERM = MNG_TRUE; /* indicate we found a misplaced TERM */
4737
/* and send a warning signal!!! */
4738
MNG_WARNING (pData, MNG_SEQUENCEERROR)
4741
if (pData->bHasLOOP) /* no way, jose! */
4742
MNG_ERROR (pData, MNG_SEQUENCEERROR)
4744
if (pData->bHasTERM) /* only 1 allowed! */
4745
MNG_ERROR (pData, MNG_MULTIPLEERROR)
4746
/* check the length */
4747
if ((iRawlen != 1) && (iRawlen != 10))
4748
MNG_ERROR (pData, MNG_INVALIDLENGTH)
4750
pData->bHasTERM = MNG_TRUE;
4752
iTermaction = *pRawdata; /* get the fields */
4756
iIteraction = *(pRawdata+1);
4757
iDelay = mng_get_uint32 (pRawdata+2);
4758
iItermax = mng_get_uint32 (pRawdata+6);
4761
if (pData->fProcessterm) /* inform the app ? */
4762
if (!pData->fProcessterm (((mng_handle)pData), iTermaction, iIteraction,
4764
MNG_ERROR (pData, MNG_APPMISCERROR)
4766
#ifdef MNG_SUPPORT_DISPLAY
4767
{ /* create the TERM ani-object */
4768
mng_retcode iRetcode = mng_create_ani_term (pData, iTermaction, iIteraction,
4771
if (iRetcode) /* on error bail out */
4773
/* save for future reference */
4774
pData->pTermaniobj = pData->pLastaniobj;
4776
#endif /* MNG_SUPPORT_DISPLAY */
4778
#ifdef MNG_STORE_CHUNKS
4779
if (pData->bStorechunks)
4780
{ /* initialize storage */
4781
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
4783
if (iRetcode) /* on error bail out */
4785
/* store the fields */
4786
((mng_termp)*ppChunk)->iTermaction = iTermaction;
4787
((mng_termp)*ppChunk)->iIteraction = iIteraction;
4788
((mng_termp)*ppChunk)->iDelay = iDelay;
4789
((mng_termp)*ppChunk)->iItermax = iItermax;
4791
#endif /* MNG_STORE_CHUNKS */
4793
#ifdef MNG_SUPPORT_TRACE
4794
MNG_TRACE (pData, MNG_FN_READ_TERM, MNG_LC_END)
4797
return MNG_NOERROR; /* done */
4801
/* ************************************************************************** */
4803
#ifndef MNG_SKIPCHUNK_SAVE
4804
READ_CHUNK (mng_read_save)
4806
#ifdef MNG_SUPPORT_TRACE
4807
MNG_TRACE (pData, MNG_FN_READ_SAVE, MNG_LC_START)
4809
/* sequence checks */
4810
if ((!pData->bHasMHDR) || (pData->bHasSAVE))
4811
MNG_ERROR (pData, MNG_SEQUENCEERROR)
4813
#ifdef MNG_INCLUDE_JNG
4814
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
4816
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
4818
MNG_ERROR (pData, MNG_SEQUENCEERROR)
4820
pData->bHasSAVE = MNG_TRUE;
4822
if (pData->fProcesssave) /* inform the application ? */
4824
mng_bool bOke = pData->fProcesssave ((mng_handle)pData);
4827
MNG_ERROR (pData, MNG_APPMISCERROR)
4830
#ifdef MNG_SUPPORT_DISPLAY
4832
mng_retcode iRetcode;
4835
/* TODO: something with the parameters */
4838
/* create a SAVE animation object */
4839
iRetcode = mng_create_ani_save (pData);
4841
if (!iRetcode) /* process it */
4842
iRetcode = mng_process_display_save (pData);
4844
if (iRetcode) /* on error bail out */
4848
#endif /* MNG_SUPPORT_DISPLAY */
4850
#ifdef MNG_STORE_CHUNKS
4851
if (pData->bStorechunks)
4852
{ /* initialize storage */
4853
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
4855
if (iRetcode) /* on error bail out */
4857
/* store the fields */
4858
((mng_savep)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
4860
if (iRawlen) /* not empty ? */
4862
mng_uint8 iOtype = *pRawdata;
4864
mng_uint32 iCount = 0;
4868
mng_uint32 iOffset[2];
4869
mng_uint32 iStarttime[2];
4870
mng_uint32 iFramenr;
4871
mng_uint32 iLayernr;
4873
mng_save_entryp pEntry = MNG_NULL;
4874
mng_uint32 iNamesize;
4876
if ((iOtype != 4) && (iOtype != 8))
4877
MNG_ERROR (pData, MNG_INVOFFSETSIZE);
4879
((mng_savep)*ppChunk)->iOffsettype = iOtype;
4881
for (iX = 0; iX < 2; iX++) /* do this twice to get the count first ! */
4883
pTemp = pRawdata + 1;
4886
if (iX) /* second run ? */
4888
MNG_ALLOC (pData, pEntry, (iCount * sizeof (mng_save_entry)))
4890
((mng_savep)*ppChunk)->iCount = iCount;
4891
((mng_savep)*ppChunk)->pEntries = pEntry;
4894
while (iLen) /* anything left ? */
4896
iEtype = *pTemp; /* entrytype */
4898
if ((iEtype != 0) && (iEtype != 1) && (iEtype != 2) && (iEtype != 3))
4899
MNG_ERROR (pData, MNG_INVENTRYTYPE);
4917
iOffset [1] = mng_get_uint32 (pTemp);
4923
iOffset [0] = mng_get_uint32 (pTemp);
4924
iOffset [1] = mng_get_uint32 (pTemp+4);
4941
iStarttime [1] = mng_get_uint32 (pTemp+0);
4942
iLayernr = mng_get_uint32 (pTemp+4);
4943
iFramenr = mng_get_uint32 (pTemp+8);
4949
iStarttime [0] = mng_get_uint32 (pTemp+0);
4950
iStarttime [1] = mng_get_uint32 (pTemp+4);
4951
iLayernr = mng_get_uint32 (pTemp+8);
4952
iFramenr = mng_get_uint32 (pTemp+12);
4959
pNull = find_null (pTemp); /* get the name length */
4961
if ((pNull - pRawdata) > (mng_int32)iRawlen)
4963
iNamesize = iLen; /* no null found; so end of SAVE */
4968
iNamesize = pNull - pTemp; /* should be another entry */
4971
if (!iLen) /* must not end with a null ! */
4972
MNG_ERROR (pData, MNG_ENDWITHNULL)
4981
pEntry->iEntrytype = iEtype;
4982
pEntry->iOffset [0] = iOffset [0];
4983
pEntry->iOffset [1] = iOffset [1];
4984
pEntry->iStarttime [0] = iStarttime [0];
4985
pEntry->iStarttime [1] = iStarttime [1];
4986
pEntry->iLayernr = iLayernr;
4987
pEntry->iFramenr = iFramenr;
4988
pEntry->iNamesize = iNamesize;
4992
MNG_ALLOC (pData, pEntry->zName, iNamesize+1)
4993
MNG_COPY (pEntry->zName, pTemp, iNamesize)
5004
#endif /* MNG_STORE_CHUNKS */
5006
#ifdef MNG_SUPPORT_TRACE
5007
MNG_TRACE (pData, MNG_FN_READ_SAVE, MNG_LC_END)
5010
return MNG_NOERROR; /* done */
5014
/* ************************************************************************** */
5016
#ifndef MNG_SKIPCHUNK_SEEK
5017
READ_CHUNK (mng_read_seek)
5019
mng_retcode iRetcode;
5021
#ifdef MNG_SUPPORT_TRACE
5022
MNG_TRACE (pData, MNG_FN_READ_SEEK, MNG_LC_START)
5024
/* sequence checks */
5025
if ((!pData->bHasMHDR) || (!pData->bHasSAVE))
5026
MNG_ERROR (pData, MNG_SEQUENCEERROR)
5028
#ifdef MNG_INCLUDE_JNG
5029
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
5031
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
5033
MNG_ERROR (pData, MNG_SEQUENCEERROR)
5035
#ifdef MNG_SUPPORT_DISPLAY
5036
/* create a SEEK animation object */
5037
iRetcode = mng_create_ani_seek (pData, iRawlen, (mng_pchar)pRawdata);
5039
if (iRetcode) /* on error bail out */
5042
#endif /* MNG_SUPPORT_DISPLAY */
5044
if (pData->fProcessseek) /* inform the app ? */
5049
MNG_ALLOC (pData, zName, iRawlen + 1)
5052
MNG_COPY (zName, pRawdata, iRawlen)
5054
bOke = pData->fProcessseek ((mng_handle)pData, zName);
5056
MNG_FREEX (pData, zName, iRawlen + 1)
5059
MNG_ERROR (pData, MNG_APPMISCERROR)
5062
#ifdef MNG_SUPPORT_DISPLAY
5063
/* do display processing of the SEEK */
5064
iRetcode = mng_process_display_seek (pData);
5066
if (iRetcode) /* on error bail out */
5068
#endif /* MNG_SUPPORT_DISPLAY */
5070
#ifdef MNG_STORE_CHUNKS
5071
if (pData->bStorechunks)
5072
{ /* initialize storage */
5073
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
5075
if (iRetcode) /* on error bail out */
5077
/* store the fields */
5078
((mng_seekp)*ppChunk)->iNamesize = iRawlen;
5082
MNG_ALLOC (pData, ((mng_seekp)*ppChunk)->zName, iRawlen+1)
5083
MNG_COPY (((mng_seekp)*ppChunk)->zName, pRawdata, iRawlen)
5086
#endif /* MNG_STORE_CHUNKS */
5088
#ifdef MNG_SUPPORT_TRACE
5089
MNG_TRACE (pData, MNG_FN_READ_SEEK, MNG_LC_END)
5092
return MNG_NOERROR; /* done */
5096
/* ************************************************************************** */
5098
#ifndef MNG_SKIPCHUNK_eXPI
5099
READ_CHUNK (mng_read_expi)
5101
#ifdef MNG_SUPPORT_TRACE
5102
MNG_TRACE (pData, MNG_FN_READ_EXPI, MNG_LC_START)
5105
if (!pData->bHasMHDR) /* sequence checks */
5106
MNG_ERROR (pData, MNG_SEQUENCEERROR)
5108
#ifdef MNG_INCLUDE_JNG
5109
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
5111
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
5113
MNG_ERROR (pData, MNG_SEQUENCEERROR)
5115
if (iRawlen < 3) /* check the length */
5116
MNG_ERROR (pData, MNG_INVALIDLENGTH)
5118
#ifdef MNG_SUPPORT_DISPLAY
5122
/* TODO: something !!! */
5126
#endif /* MNG_SUPPORT_DISPLAY */
5128
#ifdef MNG_STORE_CHUNKS
5129
if (pData->bStorechunks)
5130
{ /* initialize storage */
5131
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
5133
if (iRetcode) /* on error bail out */
5135
/* store the fields */
5136
((mng_expip)*ppChunk)->iSnapshotid = mng_get_uint16 (pRawdata);
5137
((mng_expip)*ppChunk)->iNamesize = iRawlen - 2;
5139
if (((mng_expip)*ppChunk)->iNamesize)
5141
MNG_ALLOC (pData, ((mng_expip)*ppChunk)->zName,
5142
((mng_expip)*ppChunk)->iNamesize + 1)
5143
MNG_COPY (((mng_expip)*ppChunk)->zName, pRawdata+2,
5144
((mng_expip)*ppChunk)->iNamesize)
5147
#endif /* MNG_STORE_CHUNKS */
5149
#ifdef MNG_SUPPORT_TRACE
5150
MNG_TRACE (pData, MNG_FN_READ_EXPI, MNG_LC_END)
5153
return MNG_NOERROR; /* done */
5157
/* ************************************************************************** */
5159
#ifndef MNG_SKIPCHUNK_fPRI
5160
READ_CHUNK (mng_read_fpri)
5162
#ifdef MNG_SUPPORT_TRACE
5163
MNG_TRACE (pData, MNG_FN_READ_FPRI, MNG_LC_START)
5166
if (!pData->bHasMHDR) /* sequence checks */
5167
MNG_ERROR (pData, MNG_SEQUENCEERROR)
5169
#ifdef MNG_INCLUDE_JNG
5170
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
5172
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
5174
MNG_ERROR (pData, MNG_SEQUENCEERROR)
5176
if (iRawlen != 2) /* must be two bytes long */
5177
MNG_ERROR (pData, MNG_INVALIDLENGTH)
5179
#ifdef MNG_SUPPORT_DISPLAY
5183
/* TODO: something !!! */
5187
#endif /* MNG_SUPPORT_DISPLAY */
5189
#ifdef MNG_STORE_CHUNKS
5190
if (pData->bStorechunks)
5191
{ /* initialize storage */
5192
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
5194
if (iRetcode) /* on error bail out */
5196
/* store the fields */
5197
((mng_fprip)*ppChunk)->iDeltatype = *pRawdata;
5198
((mng_fprip)*ppChunk)->iPriority = *(pRawdata+1);
5200
#endif /* MNG_STORE_CHUNKS */
5202
#ifdef MNG_SUPPORT_TRACE
5203
MNG_TRACE (pData, MNG_FN_READ_FPRI, MNG_LC_END)
5206
return MNG_NOERROR; /* done */
5210
/* ************************************************************************** */
5212
#ifndef MNG_SKIPCHUNK_nEED
5213
MNG_LOCAL mng_bool CheckKeyword (mng_datap pData,
5214
mng_uint8p pKeyword)
5216
mng_chunkid handled_chunks [] =
5218
MNG_UINT_BACK, /* keep it sorted !!!! */
5222
#ifndef MNG_NO_DELTA_PNG
5223
/* TODO: MNG_UINT_DBYK, */
5226
#ifndef MNG_NO_DELTA_PNG
5230
#ifndef MNG_NO_DELTA_PNG
5231
/* TODO: MNG_UINT_DROP, */
5238
#ifndef MNG_NO_DELTA_PNG
5239
#ifdef MNG_INCLUDE_JNG
5244
#ifdef MNG_INCLUDE_JNG
5248
/* TODO: MNG_UINT_JSEP, */
5256
/* TODO: MNG_UINT_ORDR, */
5259
#ifndef MNG_NO_DELTA_PNG
5269
/* TODO: MNG_UINT_eXPI, */
5271
/* TODO: MNG_UINT_fPRI, */
5273
/* TODO: MNG_UINT_hIST, */
5277
/* TODO: MNG_UINT_oFFs, */
5278
/* TODO: MNG_UINT_pCAL, */
5279
/* TODO: MNG_UINT_pHYg, */
5280
/* TODO: MNG_UINT_pHYs, */
5281
/* TODO: MNG_UINT_sBIT, */
5282
/* TODO: MNG_UINT_sCAL, */
5283
/* TODO: MNG_UINT_sPLT, */
5291
mng_bool bOke = MNG_FALSE;
5293
if (pData->fProcessneed) /* does the app handle it ? */
5294
bOke = pData->fProcessneed ((mng_handle)pData, (mng_pchar)pKeyword);
5297
{ /* find the keyword length */
5298
mng_uint8p pNull = find_null (pKeyword);
5300
if (pNull - pKeyword == 4) /* test a chunk ? */
5301
{ /* get the chunk-id */
5302
mng_chunkid iChunkid = (*pKeyword << 24) + (*(pKeyword+1) << 16) +
5303
(*(pKeyword+2) << 8) + (*(pKeyword+3) );
5304
/* binary search variables */
5305
mng_int32 iTop, iLower, iUpper, iMiddle;
5306
/* determine max index of table */
5307
iTop = (sizeof (handled_chunks) / sizeof (handled_chunks [0])) - 1;
5309
/* binary search; with 52 chunks, worst-case is 7 comparisons */
5311
iMiddle = iTop >> 1;
5314
do /* the binary search itself */
5316
if (handled_chunks [iMiddle] < iChunkid)
5317
iLower = iMiddle + 1;
5318
else if (handled_chunks [iMiddle] > iChunkid)
5319
iUpper = iMiddle - 1;
5326
iMiddle = (iLower + iUpper) >> 1;
5328
while (iLower <= iUpper);
5331
if ((!bOke) && (pNull - pKeyword == 8) &&
5332
(*pKeyword == 'd') && (*(pKeyword+1) == 'r') &&
5333
(*(pKeyword+2) == 'a') && (*(pKeyword+3) == 'f') &&
5334
(*(pKeyword+4) == 't') && (*(pKeyword+5) == ' '))
5338
iDraft = (*(pKeyword+6) - '0') * 10 + (*(pKeyword+7) - '0');
5339
bOke = (mng_bool)(iDraft <= MNG_MNG_DRAFT);
5341
/* test MNG 1.0/1.1 ? */
5342
if ((!bOke) && (pNull - pKeyword == 7) &&
5343
(*pKeyword == 'M') && (*(pKeyword+1) == 'N') &&
5344
(*(pKeyword+2) == 'G') && (*(pKeyword+3) == '-') &&
5345
(*(pKeyword+4) == '1') && (*(pKeyword+5) == '.') &&
5346
((*(pKeyword+6) == '0') || (*(pKeyword+6) == '1')))
5348
/* test CACHEOFF ? */
5349
if ((!bOke) && (pNull - pKeyword == 8) &&
5350
(*pKeyword == 'C') && (*(pKeyword+1) == 'A') &&
5351
(*(pKeyword+2) == 'C') && (*(pKeyword+3) == 'H') &&
5352
(*(pKeyword+4) == 'E') && (*(pKeyword+5) == 'O') &&
5353
(*(pKeyword+6) == 'F') && (*(pKeyword+7) == 'F'))
5355
if (!pData->pFirstaniobj) /* only if caching hasn't started yet ! */
5358
pData->bCacheplayback = MNG_FALSE;
5359
pData->bStorechunks = MNG_FALSE;
5368
/* ************************************************************************** */
5370
#ifndef MNG_SKIPCHUNK_nEED
5371
READ_CHUNK (mng_read_need)
5373
#ifdef MNG_SUPPORT_TRACE
5374
MNG_TRACE (pData, MNG_FN_READ_NEED, MNG_LC_START)
5377
if (!pData->bHasMHDR) /* sequence checks */
5378
MNG_ERROR (pData, MNG_SEQUENCEERROR)
5380
#ifdef MNG_INCLUDE_JNG
5381
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
5383
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
5385
MNG_ERROR (pData, MNG_SEQUENCEERROR)
5387
if (iRawlen < 1) /* check the length */
5388
MNG_ERROR (pData, MNG_INVALIDLENGTH)
5390
{ /* let's check it */
5391
mng_bool bOke = MNG_TRUE;
5392
mng_pchar zKeywords;
5393
mng_uint8p pNull, pTemp;
5395
MNG_ALLOC (pData, zKeywords, iRawlen + 1)
5398
MNG_COPY (zKeywords, pRawdata, iRawlen)
5400
pTemp = (mng_uint8p)zKeywords;
5401
pNull = find_null (pTemp);
5403
while ((bOke) && (pNull < (mng_uint8p)zKeywords + iRawlen))
5405
bOke = CheckKeyword (pData, pTemp);
5407
pNull = find_null (pTemp);
5411
bOke = CheckKeyword (pData, pTemp);
5413
MNG_FREEX (pData, zKeywords, iRawlen + 1)
5416
MNG_ERROR (pData, MNG_UNSUPPORTEDNEED)
5419
#ifdef MNG_STORE_CHUNKS
5420
if (pData->bStorechunks)
5421
{ /* initialize storage */
5422
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
5424
if (iRetcode) /* on error bail out */
5426
/* store the fields */
5427
((mng_needp)*ppChunk)->iKeywordssize = iRawlen;
5431
MNG_ALLOC (pData, ((mng_needp)*ppChunk)->zKeywords, iRawlen+1)
5432
MNG_COPY (((mng_needp)*ppChunk)->zKeywords, pRawdata, iRawlen)
5435
#endif /* MNG_STORE_CHUNKS */
5437
#ifdef MNG_SUPPORT_TRACE
5438
MNG_TRACE (pData, MNG_FN_READ_NEED, MNG_LC_END)
5441
return MNG_NOERROR; /* done */
5445
/* ************************************************************************** */
5447
#ifndef MNG_SKIPCHUNK_pHYg
5448
READ_CHUNK (mng_read_phyg)
5450
#ifdef MNG_SUPPORT_TRACE
5451
MNG_TRACE (pData, MNG_FN_READ_PHYG, MNG_LC_START)
5454
if (!pData->bHasMHDR) /* sequence checks */
5455
MNG_ERROR (pData, MNG_SEQUENCEERROR)
5457
#ifdef MNG_INCLUDE_JNG
5458
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
5460
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
5462
MNG_ERROR (pData, MNG_SEQUENCEERROR)
5463
/* it's 9 bytes or empty; no more, no less! */
5464
if ((iRawlen != 9) && (iRawlen != 0))
5465
MNG_ERROR (pData, MNG_INVALIDLENGTH)
5467
#ifdef MNG_SUPPORT_DISPLAY
5471
/* TODO: something !!! */
5475
#endif /* MNG_SUPPORT_DISPLAY */
5477
#ifdef MNG_STORE_CHUNKS
5478
if (pData->bStorechunks)
5479
{ /* initialize storage */
5480
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
5482
if (iRetcode) /* on error bail out */
5484
/* store the fields */
5485
((mng_phygp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
5489
((mng_phygp)*ppChunk)->iSizex = mng_get_uint32 (pRawdata);
5490
((mng_phygp)*ppChunk)->iSizey = mng_get_uint32 (pRawdata+4);
5491
((mng_phygp)*ppChunk)->iUnit = *(pRawdata+8);
5494
#endif /* MNG_STORE_CHUNKS */
5496
#ifdef MNG_SUPPORT_TRACE
5497
MNG_TRACE (pData, MNG_FN_READ_PHYG, MNG_LC_END)
5500
return MNG_NOERROR; /* done */
5504
/* ************************************************************************** */
5506
#ifdef MNG_INCLUDE_JNG
5507
READ_CHUNK (mng_read_jhdr)
5509
#ifdef MNG_SUPPORT_TRACE
5510
MNG_TRACE (pData, MNG_FN_READ_JHDR, MNG_LC_START)
5512
/* sequence checks */
5513
if ((pData->eSigtype != mng_it_jng) && (pData->eSigtype != mng_it_mng))
5514
MNG_ERROR (pData, MNG_CHUNKNOTALLOWED)
5516
if ((pData->eSigtype == mng_it_jng) && (pData->iChunkseq > 1))
5517
MNG_ERROR (pData, MNG_SEQUENCEERROR)
5519
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
5520
MNG_ERROR (pData, MNG_SEQUENCEERROR)
5522
if (iRawlen != 16) /* length oke ? */
5523
MNG_ERROR (pData, MNG_INVALIDLENGTH)
5524
/* inside a JHDR-IEND block now */
5525
pData->bHasJHDR = MNG_TRUE;
5526
/* and store interesting fields */
5527
pData->iDatawidth = mng_get_uint32 (pRawdata);
5528
pData->iDataheight = mng_get_uint32 (pRawdata+4);
5529
pData->iJHDRcolortype = *(pRawdata+8);
5530
pData->iJHDRimgbitdepth = *(pRawdata+9);
5531
pData->iJHDRimgcompression = *(pRawdata+10);
5532
pData->iJHDRimginterlace = *(pRawdata+11);
5533
pData->iJHDRalphabitdepth = *(pRawdata+12);
5534
pData->iJHDRalphacompression = *(pRawdata+13);
5535
pData->iJHDRalphafilter = *(pRawdata+14);
5536
pData->iJHDRalphainterlace = *(pRawdata+15);
5539
#if defined(MNG_NO_16BIT_SUPPORT)
5540
pData->iPNGmult = 1;
5541
pData->iPNGdepth = pData->iJHDRalphabitdepth;
5544
#ifdef MNG_NO_16BIT_SUPPORT
5545
if (pData->iJHDRalphabitdepth > 8)
5547
pData->iPNGmult = 2;
5548
pData->iJHDRalphabitdepth = 8;
5551
/* parameter validity checks */
5552
if ((pData->iJHDRcolortype != MNG_COLORTYPE_JPEGGRAY ) &&
5553
(pData->iJHDRcolortype != MNG_COLORTYPE_JPEGCOLOR ) &&
5554
(pData->iJHDRcolortype != MNG_COLORTYPE_JPEGGRAYA ) &&
5555
(pData->iJHDRcolortype != MNG_COLORTYPE_JPEGCOLORA) )
5556
MNG_ERROR (pData, MNG_INVALIDCOLORTYPE)
5558
if ((pData->iJHDRimgbitdepth != MNG_BITDEPTH_JPEG8 ) &&
5559
(pData->iJHDRimgbitdepth != MNG_BITDEPTH_JPEG12 ) &&
5560
(pData->iJHDRimgbitdepth != MNG_BITDEPTH_JPEG8AND12) )
5561
MNG_ERROR (pData, MNG_INVALIDBITDEPTH)
5563
if (pData->iJHDRimgcompression != MNG_COMPRESSION_BASELINEJPEG)
5564
MNG_ERROR (pData, MNG_INVALIDCOMPRESS)
5566
if ((pData->iJHDRimginterlace != MNG_INTERLACE_SEQUENTIAL ) &&
5567
(pData->iJHDRimginterlace != MNG_INTERLACE_PROGRESSIVE) )
5568
MNG_ERROR (pData, MNG_INVALIDINTERLACE)
5570
if ((pData->iJHDRcolortype == MNG_COLORTYPE_JPEGGRAYA ) ||
5571
(pData->iJHDRcolortype == MNG_COLORTYPE_JPEGCOLORA) )
5573
if ((pData->iJHDRalphabitdepth != MNG_BITDEPTH_8 )
5574
&& (pData->iJHDRalphabitdepth != MNG_BITDEPTH_1 ) &&
5575
(pData->iJHDRalphabitdepth != MNG_BITDEPTH_2 ) &&
5576
(pData->iJHDRalphabitdepth != MNG_BITDEPTH_4 )
5577
#ifndef MNG_NO_16BIT_SUPPORT
5578
&& (pData->iJHDRalphabitdepth != MNG_BITDEPTH_16)
5581
MNG_ERROR (pData, MNG_INVALIDBITDEPTH)
5583
if ((pData->iJHDRalphacompression != MNG_COMPRESSION_DEFLATE ) &&
5584
(pData->iJHDRalphacompression != MNG_COMPRESSION_BASELINEJPEG) )
5585
MNG_ERROR (pData, MNG_INVALIDCOMPRESS)
5587
if ((pData->iJHDRalphacompression == MNG_COMPRESSION_BASELINEJPEG) &&
5588
(pData->iJHDRalphabitdepth != MNG_BITDEPTH_8 ) )
5589
MNG_ERROR (pData, MNG_INVALIDBITDEPTH)
5591
#if defined(FILTER192) || defined(FILTER193)
5592
if ((pData->iJHDRalphafilter != MNG_FILTER_ADAPTIVE ) &&
5593
#if defined(FILTER192) && defined(FILTER193)
5594
(pData->iJHDRalphafilter != MNG_FILTER_DIFFERING) &&
5595
(pData->iJHDRalphafilter != MNG_FILTER_NOFILTER ) )
5598
(pData->iJHDRalphafilter != MNG_FILTER_DIFFERING) )
5600
(pData->iJHDRalphafilter != MNG_FILTER_NOFILTER ) )
5603
MNG_ERROR (pData, MNG_INVALIDFILTER)
5605
if (pData->iJHDRalphafilter)
5606
MNG_ERROR (pData, MNG_INVALIDFILTER)
5609
if ((pData->iJHDRalphainterlace != MNG_INTERLACE_NONE ) &&
5610
(pData->iJHDRalphainterlace != MNG_INTERLACE_ADAM7) )
5611
MNG_ERROR (pData, MNG_INVALIDINTERLACE)
5616
if (pData->iJHDRalphabitdepth)
5617
MNG_ERROR (pData, MNG_INVALIDBITDEPTH)
5619
if (pData->iJHDRalphacompression)
5620
MNG_ERROR (pData, MNG_INVALIDCOMPRESS)
5622
if (pData->iJHDRalphafilter)
5623
MNG_ERROR (pData, MNG_INVALIDFILTER)
5625
if (pData->iJHDRalphainterlace)
5626
MNG_ERROR (pData, MNG_INVALIDINTERLACE)
5630
if (!pData->bHasheader) /* first chunk ? */
5632
pData->bHasheader = MNG_TRUE; /* we've got a header */
5633
pData->eImagetype = mng_it_jng; /* then this must be a JNG */
5634
pData->iWidth = mng_get_uint32 (pRawdata);
5635
pData->iHeight = mng_get_uint32 (pRawdata+4);
5636
/* predict alpha-depth ! */
5637
if ((pData->iJHDRcolortype == MNG_COLORTYPE_JPEGGRAYA ) ||
5638
(pData->iJHDRcolortype == MNG_COLORTYPE_JPEGCOLORA) )
5639
pData->iAlphadepth = pData->iJHDRalphabitdepth;
5641
pData->iAlphadepth = 0;
5642
/* fits on maximum canvas ? */
5643
if ((pData->iWidth > pData->iMaxwidth) || (pData->iHeight > pData->iMaxheight))
5644
MNG_WARNING (pData, MNG_IMAGETOOLARGE)
5646
if (pData->fProcessheader) /* inform the app ? */
5647
if (!pData->fProcessheader (((mng_handle)pData), pData->iWidth, pData->iHeight))
5648
MNG_ERROR (pData, MNG_APPMISCERROR)
5652
pData->iColortype = 0; /* fake grayscale for other routines */
5653
pData->iImagelevel++; /* one level deeper */
5655
#ifdef MNG_SUPPORT_DISPLAY
5657
mng_retcode iRetcode = mng_process_display_jhdr (pData);
5659
if (iRetcode) /* on error bail out */
5662
#endif /* MNG_SUPPORT_DISPLAY */
5664
#ifdef MNG_STORE_CHUNKS
5665
if (pData->bStorechunks)
5666
{ /* initialize storage */
5667
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
5669
if (iRetcode) /* on error bail out */
5671
/* store the fields */
5672
((mng_jhdrp)*ppChunk)->iWidth = mng_get_uint32 (pRawdata);
5673
((mng_jhdrp)*ppChunk)->iHeight = mng_get_uint32 (pRawdata+4);
5674
((mng_jhdrp)*ppChunk)->iColortype = *(pRawdata+8);
5675
((mng_jhdrp)*ppChunk)->iImagesampledepth = *(pRawdata+9);
5676
((mng_jhdrp)*ppChunk)->iImagecompression = *(pRawdata+10);
5677
((mng_jhdrp)*ppChunk)->iImageinterlace = *(pRawdata+11);
5678
((mng_jhdrp)*ppChunk)->iAlphasampledepth = *(pRawdata+12);
5679
#ifdef MNG_NO_16BIT_SUPPORT
5680
if (*(pRawdata+12) > 8)
5681
((mng_jhdrp)*ppChunk)->iAlphasampledepth = 8;
5683
((mng_jhdrp)*ppChunk)->iAlphacompression = *(pRawdata+13);
5684
((mng_jhdrp)*ppChunk)->iAlphafilter = *(pRawdata+14);
5685
((mng_jhdrp)*ppChunk)->iAlphainterlace = *(pRawdata+15);
5687
#endif /* MNG_STORE_CHUNKS */
5689
#ifdef MNG_SUPPORT_TRACE
5690
MNG_TRACE (pData, MNG_FN_READ_JHDR, MNG_LC_END)
5693
return MNG_NOERROR; /* done */
5697
#endif /* MNG_INCLUDE_JNG */
5699
/* ************************************************************************** */
5701
#ifdef MNG_INCLUDE_JNG
5702
READ_CHUNK (mng_read_jdaa)
5704
#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS)
5705
volatile mng_retcode iRetcode;
5707
iRetcode=MNG_NOERROR;
5710
#ifdef MNG_SUPPORT_TRACE
5711
MNG_TRACE (pData, MNG_FN_READ_JDAA, MNG_LC_START)
5713
/* sequence checks */
5714
if ((!pData->bHasJHDR) && (!pData->bHasDHDR))
5715
MNG_ERROR (pData, MNG_SEQUENCEERROR)
5717
if (pData->bHasJSEP)
5718
MNG_ERROR (pData, MNG_SEQUENCEERROR)
5720
if (pData->iJHDRalphacompression != MNG_COMPRESSION_BASELINEJPEG)
5721
MNG_ERROR (pData, MNG_SEQUENCEERROR)
5723
if (iRawlen == 0) /* can never be empty */
5724
MNG_ERROR (pData, MNG_INVALIDLENGTH)
5726
pData->bHasJDAA = MNG_TRUE; /* got some JDAA now, don't we */
5728
#ifdef MNG_SUPPORT_DISPLAY
5729
iRetcode = mng_process_display_jdaa (pData, iRawlen, pRawdata);
5731
if (iRetcode) /* on error bail out */
5733
#endif /* MNG_SUPPORT_DISPLAY */
5735
#ifdef MNG_STORE_CHUNKS
5736
if (pData->bStorechunks)
5737
{ /* initialize storage */
5738
iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
5740
if (iRetcode) /* on error bail out */
5742
/* store the fields */
5743
((mng_jdaap)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
5744
((mng_jdaap)*ppChunk)->iDatasize = iRawlen;
5746
if (iRawlen != 0) /* is there any data ? */
5748
MNG_ALLOC (pData, ((mng_jdaap)*ppChunk)->pData, iRawlen)
5749
MNG_COPY (((mng_jdaap)*ppChunk)->pData, pRawdata, iRawlen)
5752
#endif /* MNG_STORE_CHUNKS */
5754
#ifdef MNG_SUPPORT_TRACE
5755
MNG_TRACE (pData, MNG_FN_READ_JDAA, MNG_LC_END)
5758
return MNG_NOERROR; /* done */
5762
#endif /* MNG_INCLUDE_JNG */
5764
/* ************************************************************************** */
5766
#ifdef MNG_INCLUDE_JNG
5767
READ_CHUNK (mng_read_jdat)
5769
#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS)
5770
volatile mng_retcode iRetcode;
5772
iRetcode=MNG_NOERROR;
5775
#ifdef MNG_SUPPORT_TRACE
5776
MNG_TRACE (pData, MNG_FN_READ_JDAT, MNG_LC_START)
5778
/* sequence checks */
5779
if ((!pData->bHasJHDR) && (!pData->bHasDHDR))
5780
MNG_ERROR (pData, MNG_SEQUENCEERROR)
5782
if (iRawlen == 0) /* can never be empty */
5783
MNG_ERROR (pData, MNG_INVALIDLENGTH)
5785
pData->bHasJDAT = MNG_TRUE; /* got some JDAT now, don't we */
5787
#ifdef MNG_SUPPORT_DISPLAY
5788
iRetcode = mng_process_display_jdat (pData, iRawlen, pRawdata);
5790
if (iRetcode) /* on error bail out */
5792
#endif /* MNG_SUPPORT_DISPLAY */
5794
#ifdef MNG_STORE_CHUNKS
5795
if (pData->bStorechunks)
5796
{ /* initialize storage */
5797
iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
5799
if (iRetcode) /* on error bail out */
5801
/* store the fields */
5802
((mng_jdatp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
5803
((mng_jdatp)*ppChunk)->iDatasize = iRawlen;
5805
if (iRawlen != 0) /* is there any data ? */
5807
MNG_ALLOC (pData, ((mng_jdatp)*ppChunk)->pData, iRawlen)
5808
MNG_COPY (((mng_jdatp)*ppChunk)->pData, pRawdata, iRawlen)
5811
#endif /* MNG_STORE_CHUNKS */
5813
#ifdef MNG_SUPPORT_TRACE
5814
MNG_TRACE (pData, MNG_FN_READ_JDAT, MNG_LC_END)
5817
return MNG_NOERROR; /* done */
5821
#endif /* MNG_INCLUDE_JNG */
5823
/* ************************************************************************** */
5825
#ifdef MNG_INCLUDE_JNG
5826
READ_CHUNK (mng_read_jsep)
5828
#ifdef MNG_SUPPORT_TRACE
5829
MNG_TRACE (pData, MNG_FN_READ_JSEP, MNG_LC_START)
5832
if (!pData->bHasJHDR) /* sequence checks */
5833
MNG_ERROR (pData, MNG_SEQUENCEERROR)
5835
if (iRawlen != 0) /* must be empty ! */
5836
MNG_ERROR (pData, MNG_INVALIDLENGTH)
5838
pData->bHasJSEP = MNG_TRUE; /* indicate we've had the 8-/12-bit separator */
5840
#ifdef MNG_STORE_CHUNKS
5841
if (pData->bStorechunks)
5842
{ /* initialize storage */
5843
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
5845
if (iRetcode) /* on error bail out */
5849
#endif /* MNG_STORE_CHUNKS */
5851
#ifdef MNG_SUPPORT_TRACE
5852
MNG_TRACE (pData, MNG_FN_READ_JSEP, MNG_LC_END)
5855
return MNG_NOERROR; /* done */
5859
#endif /* MNG_INCLUDE_JNG */
5861
/* ************************************************************************** */
5863
#ifndef MNG_NO_DELTA_PNG
5864
READ_CHUNK (mng_read_dhdr)
5866
mng_uint8 iImagetype, iDeltatype;
5867
#ifdef MNG_SUPPORT_TRACE
5868
MNG_TRACE (pData, MNG_FN_READ_DHDR, MNG_LC_START)
5871
if (!pData->bHasMHDR) /* sequence checks */
5872
MNG_ERROR (pData, MNG_SEQUENCEERROR)
5874
#ifdef MNG_INCLUDE_JNG
5875
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
5877
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
5879
MNG_ERROR (pData, MNG_SEQUENCEERROR)
5880
/* check for valid length */
5881
if ((iRawlen != 4) && (iRawlen != 12) && (iRawlen != 20))
5882
MNG_ERROR (pData, MNG_INVALIDLENGTH)
5884
iImagetype = *(pRawdata+2); /* check fields for validity */
5885
iDeltatype = *(pRawdata+3);
5887
if (iImagetype > MNG_IMAGETYPE_JNG)
5888
MNG_ERROR (pData, MNG_INVIMAGETYPE)
5890
if (iDeltatype > MNG_DELTATYPE_NOCHANGE)
5891
MNG_ERROR (pData, MNG_INVDELTATYPE)
5893
if ((iDeltatype == MNG_DELTATYPE_REPLACE) && (iRawlen > 12))
5894
MNG_ERROR (pData, MNG_INVALIDLENGTH)
5896
if ((iDeltatype == MNG_DELTATYPE_NOCHANGE) && (iRawlen > 4))
5897
MNG_ERROR (pData, MNG_INVALIDLENGTH)
5899
pData->bHasDHDR = MNG_TRUE; /* inside a DHDR-IEND block now */
5900
pData->iDeltatype = iDeltatype;
5902
pData->iImagelevel++; /* one level deeper */
5904
#ifdef MNG_SUPPORT_DISPLAY
5906
mng_uint16 iObjectid = mng_get_uint16 (pRawdata);
5907
mng_uint32 iBlockwidth = 0;
5908
mng_uint32 iBlockheight = 0;
5909
mng_uint32 iBlockx = 0;
5910
mng_uint32 iBlocky = 0;
5911
mng_retcode iRetcode;
5915
iBlockwidth = mng_get_uint32 (pRawdata+4);
5916
iBlockheight = mng_get_uint32 (pRawdata+8);
5921
iBlockx = mng_get_uint32 (pRawdata+12);
5922
iBlocky = mng_get_uint32 (pRawdata+16);
5925
iRetcode = mng_create_ani_dhdr (pData, iObjectid, iImagetype, iDeltatype,
5926
iBlockwidth, iBlockheight, iBlockx, iBlocky);
5928
if (!iRetcode) /* display processing ? */
5929
iRetcode = mng_process_display_dhdr (pData, iObjectid, iImagetype, iDeltatype,
5930
iBlockwidth, iBlockheight, iBlockx, iBlocky);
5932
if (iRetcode) /* on error bail out */
5936
#endif /* MNG_SUPPORT_DISPLAY */
5938
#ifdef MNG_STORE_CHUNKS
5939
if (pData->bStorechunks)
5940
{ /* initialize storage */
5941
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
5943
if (iRetcode) /* on error bail out */
5945
/* store the fields */
5946
((mng_dhdrp)*ppChunk)->iObjectid = mng_get_uint16 (pRawdata);
5947
((mng_dhdrp)*ppChunk)->iImagetype = iImagetype;
5948
((mng_dhdrp)*ppChunk)->iDeltatype = iDeltatype;
5952
((mng_dhdrp)*ppChunk)->iBlockwidth = mng_get_uint32 (pRawdata+4);
5953
((mng_dhdrp)*ppChunk)->iBlockheight = mng_get_uint32 (pRawdata+8);
5958
((mng_dhdrp)*ppChunk)->iBlockx = mng_get_uint32 (pRawdata+12);
5959
((mng_dhdrp)*ppChunk)->iBlocky = mng_get_uint32 (pRawdata+16);
5962
#endif /* MNG_STORE_CHUNKS */
5964
#ifdef MNG_SUPPORT_TRACE
5965
MNG_TRACE (pData, MNG_FN_READ_DHDR, MNG_LC_END)
5968
return MNG_NOERROR; /* done */
5972
/* ************************************************************************** */
5974
#ifndef MNG_NO_DELTA_PNG
5975
READ_CHUNK (mng_read_prom)
5977
mng_uint8 iColortype;
5978
mng_uint8 iSampledepth;
5979
mng_uint8 iFilltype;
5981
#ifdef MNG_SUPPORT_TRACE
5982
MNG_TRACE (pData, MNG_FN_READ_PROM, MNG_LC_START)
5984
/* sequence checks */
5985
if ((!pData->bHasMHDR) || (!pData->bHasDHDR))
5986
MNG_ERROR (pData, MNG_SEQUENCEERROR)
5988
if (iRawlen != 3) /* gotta be exactly 3 bytes */
5989
MNG_ERROR (pData, MNG_INVALIDLENGTH)
5991
iColortype = *pRawdata; /* check fields for validity */
5992
iSampledepth = *(pRawdata+1);
5993
iFilltype = *(pRawdata+2);
5995
if ((iColortype != MNG_COLORTYPE_GRAY ) &&
5996
(iColortype != MNG_COLORTYPE_RGB ) &&
5997
(iColortype != MNG_COLORTYPE_INDEXED) &&
5998
(iColortype != MNG_COLORTYPE_GRAYA ) &&
5999
(iColortype != MNG_COLORTYPE_RGBA ) )
6000
MNG_ERROR (pData, MNG_INVALIDCOLORTYPE)
6002
#ifdef MNG_NO_16BIT_SUPPORT
6003
if (iSampledepth == MNG_BITDEPTH_16 )
6004
iSampledepth = MNG_BITDEPTH_8;
6007
if ((iSampledepth != MNG_BITDEPTH_1 ) &&
6008
(iSampledepth != MNG_BITDEPTH_2 ) &&
6009
(iSampledepth != MNG_BITDEPTH_4 ) &&
6010
(iSampledepth != MNG_BITDEPTH_8 )
6011
#ifndef MNG_NO_16BIT_SUPPORT
6012
&& (iSampledepth != MNG_BITDEPTH_16)
6015
MNG_ERROR (pData, MNG_INVSAMPLEDEPTH)
6017
if ((iFilltype != MNG_FILLMETHOD_LEFTBITREPLICATE) &&
6018
(iFilltype != MNG_FILLMETHOD_ZEROFILL ) )
6019
MNG_ERROR (pData, MNG_INVFILLMETHOD)
6021
#ifdef MNG_SUPPORT_DISPLAY
6023
mng_retcode iRetcode = mng_create_ani_prom (pData, iSampledepth,
6024
iColortype, iFilltype);
6026
if (!iRetcode) /* display processing ? */
6027
iRetcode = mng_process_display_prom (pData, iSampledepth,
6028
iColortype, iFilltype);
6029
if (iRetcode) /* on error bail out */
6032
#endif /* MNG_SUPPORT_DISPLAY */
6034
#ifdef MNG_STORE_CHUNKS
6035
if (pData->bStorechunks)
6036
{ /* initialize storage */
6037
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
6039
if (iRetcode) /* on error bail out */
6041
/* store the fields */
6042
((mng_promp)*ppChunk)->iColortype = iColortype;
6043
((mng_promp)*ppChunk)->iSampledepth = iSampledepth;
6044
((mng_promp)*ppChunk)->iFilltype = iFilltype;
6046
#endif /* MNG_STORE_CHUNKS */
6048
#ifdef MNG_SUPPORT_TRACE
6049
MNG_TRACE (pData, MNG_FN_READ_PROM, MNG_LC_END)
6052
return MNG_NOERROR; /* done */
6056
/* ************************************************************************** */
6058
#ifndef MNG_NO_DELTA_PNG
6059
READ_CHUNK (mng_read_ipng)
6061
#ifdef MNG_SUPPORT_TRACE
6062
MNG_TRACE (pData, MNG_FN_READ_IPNG, MNG_LC_START)
6064
/* sequence checks */
6065
if ((!pData->bHasMHDR) || (!pData->bHasDHDR))
6066
MNG_ERROR (pData, MNG_SEQUENCEERROR)
6068
if (iRawlen != 0) /* gotta be empty */
6069
MNG_ERROR (pData, MNG_INVALIDLENGTH)
6071
#ifdef MNG_SUPPORT_DISPLAY
6073
mng_retcode iRetcode = mng_create_ani_ipng (pData);
6075
if (!iRetcode) /* process it */
6076
iRetcode = mng_process_display_ipng (pData);
6078
if (iRetcode) /* on error bail out */
6082
#endif /* MNG_SUPPORT_DISPLAY */
6084
#ifdef MNG_STORE_CHUNKS
6085
if (pData->bStorechunks)
6086
{ /* initialize storage */
6087
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
6089
if (iRetcode) /* on error bail out */
6092
#endif /* MNG_STORE_CHUNKS */
6094
#ifdef MNG_SUPPORT_TRACE
6095
MNG_TRACE (pData, MNG_FN_READ_IPNG, MNG_LC_END)
6098
return MNG_NOERROR; /* done */
6102
/* ************************************************************************** */
6104
#ifndef MNG_NO_DELTA_PNG
6105
READ_CHUNK (mng_read_pplt)
6107
mng_uint8 iDeltatype;
6113
mng_rgbpaltab aIndexentries;
6114
mng_uint8arr aAlphaentries;
6115
mng_uint8arr aUsedentries;
6117
#ifdef MNG_SUPPORT_TRACE
6118
MNG_TRACE (pData, MNG_FN_READ_PPLT, MNG_LC_START)
6120
/* sequence checks */
6121
if ((!pData->bHasMHDR) && (!pData->bHasDHDR))
6122
MNG_ERROR (pData, MNG_SEQUENCEERROR)
6124
if (iRawlen < 1) /* must have at least 1 byte */
6125
MNG_ERROR (pData, MNG_INVALIDLENGTH)
6127
iDeltatype = *pRawdata;
6129
if (iDeltatype > MNG_DELTATYPE_DELTARGBA)
6130
MNG_ERROR (pData, MNG_INVDELTATYPE)
6131
/* must be indexed color ! */
6132
if (pData->iColortype != MNG_COLORTYPE_INDEXED)
6133
MNG_ERROR (pData, MNG_INVALIDCOLORTYPE)
6135
pTemp = pRawdata + 1;
6139
for (iY = 0; iY < 256; iY++) /* reset arrays */
6141
aIndexentries [iY].iRed = 0;
6142
aIndexentries [iY].iGreen = 0;
6143
aIndexentries [iY].iBlue = 0;
6144
aAlphaentries [iY] = 255;
6145
aUsedentries [iY] = 0;
6148
while (iLen) /* as long as there are entries left ... */
6153
MNG_ERROR (pData, MNG_INVALIDLENGTH)
6155
iX = *pTemp; /* get start and end index */
6159
MNG_ERROR (pData, MNG_INVALIDINDEX)
6161
if ((mng_uint32)iM >= iMax) /* determine highest used index */
6162
iMax = (mng_uint32)iM + 1;
6167
if ((iDeltatype == MNG_DELTATYPE_REPLACERGB ) ||
6168
(iDeltatype == MNG_DELTATYPE_DELTARGB ) )
6169
iDiff = (iM - iX + 1) * 3;
6171
if ((iDeltatype == MNG_DELTATYPE_REPLACEALPHA) ||
6172
(iDeltatype == MNG_DELTATYPE_DELTAALPHA ) )
6173
iDiff = (iM - iX + 1);
6175
iDiff = (iM - iX + 1) * 4;
6178
MNG_ERROR (pData, MNG_INVALIDLENGTH)
6180
if ((iDeltatype == MNG_DELTATYPE_REPLACERGB ) ||
6181
(iDeltatype == MNG_DELTATYPE_DELTARGB ) )
6183
for (iY = (mng_uint32)iX; iY <= (mng_uint32)iM; iY++)
6185
aIndexentries [iY].iRed = *pTemp;
6186
aIndexentries [iY].iGreen = *(pTemp+1);
6187
aIndexentries [iY].iBlue = *(pTemp+2);
6188
aUsedentries [iY] = 1;
6195
if ((iDeltatype == MNG_DELTATYPE_REPLACEALPHA) ||
6196
(iDeltatype == MNG_DELTATYPE_DELTAALPHA ) )
6198
for (iY = (mng_uint32)iX; iY <= (mng_uint32)iM; iY++)
6200
aAlphaentries [iY] = *pTemp;
6201
aUsedentries [iY] = 1;
6209
for (iY = (mng_uint32)iX; iY <= (mng_uint32)iM; iY++)
6211
aIndexentries [iY].iRed = *pTemp;
6212
aIndexentries [iY].iGreen = *(pTemp+1);
6213
aIndexentries [iY].iBlue = *(pTemp+2);
6214
aAlphaentries [iY] = *(pTemp+3);
6215
aUsedentries [iY] = 1;
6223
switch (pData->iBitdepth) /* check maximum allowed entries for bitdepth */
6225
case MNG_BITDEPTH_1 : {
6227
MNG_ERROR (pData, MNG_INVALIDINDEX)
6230
case MNG_BITDEPTH_2 : {
6232
MNG_ERROR (pData, MNG_INVALIDINDEX)
6235
case MNG_BITDEPTH_4 : {
6237
MNG_ERROR (pData, MNG_INVALIDINDEX)
6242
#ifdef MNG_SUPPORT_DISPLAY
6243
{ /* create animation object */
6244
mng_retcode iRetcode = mng_create_ani_pplt (pData, iDeltatype, iMax,
6245
aIndexentries, aAlphaentries,
6248
if (!iRetcode) /* execute it now ? */
6249
iRetcode = mng_process_display_pplt (pData, iDeltatype, iMax, aIndexentries,
6250
aAlphaentries, aUsedentries);
6252
if (iRetcode) /* on error bail out */
6256
#endif /* MNG_SUPPORT_DISPLAY */
6258
#ifdef MNG_STORE_CHUNKS
6259
if (pData->bStorechunks)
6260
{ /* initialize storage */
6261
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
6263
if (iRetcode) /* on error bail out */
6265
/* store the fields */
6266
((mng_ppltp)*ppChunk)->iDeltatype = iDeltatype;
6267
((mng_ppltp)*ppChunk)->iCount = iMax;
6269
for (iY = 0; iY < 256; iY++)
6271
((mng_ppltp)*ppChunk)->aEntries [iY].iRed = aIndexentries [iY].iRed;
6272
((mng_ppltp)*ppChunk)->aEntries [iY].iGreen = aIndexentries [iY].iGreen;
6273
((mng_ppltp)*ppChunk)->aEntries [iY].iBlue = aIndexentries [iY].iBlue;
6274
((mng_ppltp)*ppChunk)->aEntries [iY].iAlpha = aAlphaentries [iY];
6275
((mng_ppltp)*ppChunk)->aEntries [iY].bUsed = (mng_bool)(aUsedentries [iY]);
6278
#endif /* MNG_STORE_CHUNKS */
6280
#ifdef MNG_SUPPORT_TRACE
6281
MNG_TRACE (pData, MNG_FN_READ_PPLT, MNG_LC_END)
6284
return MNG_NOERROR; /* done */
6288
/* ************************************************************************** */
6290
#ifndef MNG_NO_DELTA_PNG
6291
#ifdef MNG_INCLUDE_JNG
6292
READ_CHUNK (mng_read_ijng)
6294
#ifdef MNG_SUPPORT_TRACE
6295
MNG_TRACE (pData, MNG_FN_READ_IJNG, MNG_LC_START)
6297
/* sequence checks */
6298
if ((!pData->bHasMHDR) || (!pData->bHasDHDR))
6299
MNG_ERROR (pData, MNG_SEQUENCEERROR)
6301
if (iRawlen != 0) /* gotta be empty */
6302
MNG_ERROR (pData, MNG_INVALIDLENGTH)
6304
#ifdef MNG_SUPPORT_DISPLAY
6306
mng_retcode iRetcode = mng_create_ani_ijng (pData);
6308
if (!iRetcode) /* process it */
6309
iRetcode = mng_process_display_ijng (pData);
6311
if (iRetcode) /* on error bail out */
6315
#endif /* MNG_SUPPORT_DISPLAY */
6317
#ifdef MNG_STORE_CHUNKS
6318
if (pData->bStorechunks)
6319
{ /* initialize storage */
6320
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
6322
if (iRetcode) /* on error bail out */
6325
#endif /* MNG_STORE_CHUNKS */
6327
#ifdef MNG_SUPPORT_TRACE
6328
MNG_TRACE (pData, MNG_FN_READ_IJNG, MNG_LC_END)
6331
return MNG_NOERROR; /* done */
6336
/* ************************************************************************** */
6338
#ifndef MNG_NO_DELTA_PNG
6339
READ_CHUNK (mng_read_drop)
6341
#ifdef MNG_SUPPORT_TRACE
6342
MNG_TRACE (pData, MNG_FN_READ_DROP, MNG_LC_START)
6344
/* sequence checks */
6345
if ((!pData->bHasMHDR) || (!pData->bHasDHDR))
6346
MNG_ERROR (pData, MNG_SEQUENCEERROR)
6348
if ((iRawlen < 4) || ((iRawlen % 4) != 0))
6349
MNG_ERROR (pData, MNG_INVALIDLENGTH)
6351
#ifdef MNG_SUPPORT_DISPLAY
6355
/* TODO: something !!! */
6359
#endif /* MNG_SUPPORT_DISPLAY */
6361
#ifdef MNG_STORE_CHUNKS
6362
if (pData->bStorechunks)
6363
{ /* initialize storage */
6364
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
6366
if (iRetcode) /* on error bail out */
6368
/* store the fields */
6369
((mng_dropp)*ppChunk)->iCount = iRawlen / 4;
6374
mng_uint8p pTemp = pRawdata;
6377
MNG_ALLOC (pData, pEntry, iRawlen)
6379
((mng_dropp)*ppChunk)->pChunknames = (mng_ptr)pEntry;
6381
for (iX = 0; iX < iRawlen / 4; iX++)
6383
*pEntry = mng_get_uint32 (pTemp);
6390
#endif /* MNG_STORE_CHUNKS */
6392
#ifdef MNG_SUPPORT_TRACE
6393
MNG_TRACE (pData, MNG_FN_READ_DROP, MNG_LC_END)
6396
return MNG_NOERROR; /* done */
6400
/* ************************************************************************** */
6402
#ifndef MNG_NO_DELTA_PNG
6403
#ifndef MNG_SKIPCHUNK_DBYK
6404
READ_CHUNK (mng_read_dbyk)
6406
#ifdef MNG_SUPPORT_TRACE
6407
MNG_TRACE (pData, MNG_FN_READ_DBYK, MNG_LC_START)
6409
/* sequence checks */
6410
if ((!pData->bHasMHDR) || (!pData->bHasDHDR))
6411
MNG_ERROR (pData, MNG_SEQUENCEERROR)
6413
if (iRawlen < 6) /* must be at least 6 long */
6414
MNG_ERROR (pData, MNG_INVALIDLENGTH)
6416
#ifdef MNG_SUPPORT_DISPLAY
6420
/* TODO: something !!! */
6424
#endif /* MNG_SUPPORT_DISPLAY */
6426
#ifdef MNG_STORE_CHUNKS
6427
if (pData->bStorechunks)
6428
{ /* initialize storage */
6429
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
6431
if (iRetcode) /* on error bail out */
6433
/* store the fields */
6434
((mng_dbykp)*ppChunk)->iChunkname = mng_get_uint32 (pRawdata);
6435
((mng_dbykp)*ppChunk)->iPolarity = *(pRawdata+4);
6436
((mng_dbykp)*ppChunk)->iKeywordssize = iRawlen - 5;
6440
MNG_ALLOC (pData, ((mng_dbykp)*ppChunk)->zKeywords, iRawlen-4)
6441
MNG_COPY (((mng_dbykp)*ppChunk)->zKeywords, pRawdata+5, iRawlen-5)
6444
#endif /* MNG_STORE_CHUNKS */
6446
#ifdef MNG_SUPPORT_TRACE
6447
MNG_TRACE (pData, MNG_FN_READ_DBYK, MNG_LC_END)
6450
return MNG_NOERROR; /* done */
6455
/* ************************************************************************** */
6457
#ifndef MNG_NO_DELTA_PNG
6458
#ifndef MNG_SKIPCHUNK_ORDR
6459
READ_CHUNK (mng_read_ordr)
6461
#ifdef MNG_SUPPORT_TRACE
6462
MNG_TRACE (pData, MNG_FN_READ_ORDR, MNG_LC_START)
6464
/* sequence checks */
6465
if ((!pData->bHasMHDR) || (!pData->bHasDHDR))
6466
MNG_ERROR (pData, MNG_SEQUENCEERROR)
6468
if ((iRawlen < 5) || ((iRawlen % 5) != 0))
6469
MNG_ERROR (pData, MNG_INVALIDLENGTH)
6471
#ifdef MNG_SUPPORT_DISPLAY
6475
/* TODO: something !!! */
6479
#endif /* MNG_SUPPORT_DISPLAY */
6481
#ifdef MNG_STORE_CHUNKS
6482
if (pData->bStorechunks)
6483
{ /* initialize storage */
6484
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
6486
if (iRetcode) /* on error bail out */
6488
/* store the fields */
6489
((mng_ordrp)*ppChunk)->iCount = iRawlen / 5;
6494
mng_ordr_entryp pEntry;
6495
mng_uint8p pTemp = pRawdata;
6497
MNG_ALLOC (pData, pEntry, iRawlen)
6499
((mng_ordrp)*ppChunk)->pEntries = pEntry;
6501
for (iX = 0; iX < iRawlen / 5; iX++)
6503
pEntry->iChunkname = mng_get_uint32 (pTemp);
6504
pEntry->iOrdertype = *(pTemp+4);
6511
#endif /* MNG_STORE_CHUNKS */
6513
#ifdef MNG_SUPPORT_TRACE
6514
MNG_TRACE (pData, MNG_FN_READ_ORDR, MNG_LC_END)
6517
return MNG_NOERROR; /* done */
6522
/* ************************************************************************** */
6524
#ifndef MNG_SKIPCHUNK_MAGN
6525
READ_CHUNK (mng_read_magn)
6527
mng_uint16 iFirstid, iLastid;
6528
mng_uint8 iMethodX, iMethodY;
6529
mng_uint16 iMX, iMY, iML, iMR, iMT, iMB;
6532
#ifdef MNG_SUPPORT_TRACE
6533
MNG_TRACE (pData, MNG_FN_READ_MAGN, MNG_LC_START)
6535
/* sequence checks */
6536
#ifdef MNG_SUPPORT_JNG
6537
if ((!pData->bHasMHDR) || (pData->bHasIHDR) || (pData->bHasDHDR) || (pData->bHasJHDR))
6539
if ((!pData->bHasMHDR) || (pData->bHasIHDR) || (pData->bHasDHDR))
6541
MNG_ERROR (pData, MNG_SEQUENCEERROR)
6544
MNG_ERROR (pData, MNG_INVALIDLENGTH)
6546
/* following is an ugly hack to allow faulty layout caused by previous
6547
versions of libmng and MNGeye, which wrote MAGN with a 16-bit
6548
MethodX/MethodY (as opposed to the proper 8-bit as defined in the spec!) */
6550
if ((iRawlen == 6) || (iRawlen == 8) || (iRawlen == 10) || (iRawlen == 12) ||
6551
(iRawlen == 14) || (iRawlen == 16) || (iRawlen == 20))
6552
bFaulty = MNG_TRUE; /* these lengths are all wrong */
6553
else /* length 18 can be right or wrong !!! */
6554
if ((iRawlen == 18) && (mng_get_uint16 (pRawdata+4) <= 5) &&
6555
(mng_get_uint16 (pRawdata+6) < 256) &&
6556
(mng_get_uint16 (pRawdata+8) < 256) &&
6557
(mng_get_uint16 (pRawdata+10) < 256) &&
6558
(mng_get_uint16 (pRawdata+12) < 256) &&
6559
(mng_get_uint16 (pRawdata+14) < 256) &&
6560
(mng_get_uint16 (pRawdata+16) < 256))
6561
bFaulty = MNG_TRUE; /* this is very likely the wrong layout */
6563
bFaulty = MNG_FALSE; /* all other cases are handled as right */
6565
if (bFaulty) /* wrong layout ? */
6567
if (iRawlen > 0) /* get the fields */
6568
iFirstid = mng_get_uint16 (pRawdata);
6573
iLastid = mng_get_uint16 (pRawdata+2);
6578
iMethodX = (mng_uint8)(mng_get_uint16 (pRawdata+4));
6583
iMX = mng_get_uint16 (pRawdata+6);
6588
iMY = mng_get_uint16 (pRawdata+8);
6593
iML = mng_get_uint16 (pRawdata+10);
6598
iMR = mng_get_uint16 (pRawdata+12);
6603
iMT = mng_get_uint16 (pRawdata+14);
6608
iMB = mng_get_uint16 (pRawdata+16);
6613
iMethodY = (mng_uint8)(mng_get_uint16 (pRawdata+18));
6615
iMethodY = iMethodX;
6617
else /* proper layout !!!! */
6619
if (iRawlen > 0) /* get the fields */
6620
iFirstid = mng_get_uint16 (pRawdata);
6625
iLastid = mng_get_uint16 (pRawdata+2);
6630
iMethodX = *(pRawdata+4);
6635
iMX = mng_get_uint16 (pRawdata+5);
6640
iMY = mng_get_uint16 (pRawdata+7);
6645
iML = mng_get_uint16 (pRawdata+9);
6650
iMR = mng_get_uint16 (pRawdata+11);
6655
iMT = mng_get_uint16 (pRawdata+13);
6660
iMB = mng_get_uint16 (pRawdata+15);
6665
iMethodY = *(pRawdata+17);
6667
iMethodY = iMethodX;
6669
/* check field validity */
6670
if ((iMethodX > 5) || (iMethodY > 5))
6671
MNG_ERROR (pData, MNG_INVALIDMETHOD)
6673
#ifdef MNG_SUPPORT_DISPLAY
6675
mng_retcode iRetcode;
6677
iRetcode = mng_create_ani_magn (pData, iFirstid, iLastid, iMethodX,
6678
iMX, iMY, iML, iMR, iMT, iMB, iMethodY);
6680
if (!iRetcode) /* display processing ? */
6681
iRetcode = mng_process_display_magn (pData, iFirstid, iLastid, iMethodX,
6682
iMX, iMY, iML, iMR, iMT, iMB, iMethodY);
6684
if (iRetcode) /* on error bail out */
6688
#endif /* MNG_SUPPORT_DISPLAY */
6690
#ifdef MNG_STORE_CHUNKS
6691
if (pData->bStorechunks)
6692
{ /* initialize storage */
6693
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
6695
if (iRetcode) /* on error bail out */
6697
/* store the fields */
6698
((mng_magnp)*ppChunk)->iFirstid = iFirstid;
6699
((mng_magnp)*ppChunk)->iLastid = iLastid;
6700
((mng_magnp)*ppChunk)->iMethodX = iMethodX;
6701
((mng_magnp)*ppChunk)->iMX = iMX;
6702
((mng_magnp)*ppChunk)->iMY = iMY;
6703
((mng_magnp)*ppChunk)->iML = iML;
6704
((mng_magnp)*ppChunk)->iMR = iMR;
6705
((mng_magnp)*ppChunk)->iMT = iMT;
6706
((mng_magnp)*ppChunk)->iMB = iMB;
6707
((mng_magnp)*ppChunk)->iMethodY = iMethodY;
6709
#endif /* MNG_STORE_CHUNKS */
6711
#ifdef MNG_SUPPORT_TRACE
6712
MNG_TRACE (pData, MNG_FN_READ_MAGN, MNG_LC_END)
6715
return MNG_NOERROR; /* done */
6719
/* ************************************************************************** */
6721
#ifndef MNG_SKIPCHUNK_evNT
6722
READ_CHUNK (mng_read_evnt)
6724
#ifdef MNG_SUPPORT_TRACE
6725
MNG_TRACE (pData, MNG_FN_READ_EVNT, MNG_LC_START)
6727
/* sequence checks */
6728
if ((!pData->bHasMHDR) || (pData->bHasSAVE))
6729
MNG_ERROR (pData, MNG_SEQUENCEERROR)
6731
if (iRawlen < 2) /* must have at least 1 entry ! */
6732
MNG_ERROR (pData, MNG_INVALIDLENGTH)
6734
#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_SUPPORT_DYNAMICMNG)
6736
if (iRawlen) /* not empty ? */
6738
mng_retcode iRetcode;
6742
mng_uint8 iEventtype;
6743
mng_uint8 iMasktype;
6748
mng_uint16 iObjectid;
6750
mng_uint32 iNamesize;
6755
while (iLen) /* anything left ? */
6757
iEventtype = *pTemp; /* eventtype */
6759
MNG_ERROR (pData, MNG_INVALIDEVENT);
6763
iMasktype = *pTemp; /* masktype */
6765
MNG_ERROR (pData, MNG_INVALIDMASK);
6783
iLeft = mng_get_int32 (pTemp);
6784
iRight = mng_get_int32 (pTemp+4);
6785
iTop = mng_get_int32 (pTemp+8);
6786
iBottom = mng_get_int32 (pTemp+12);
6791
MNG_ERROR (pData, MNG_INVALIDLENGTH)
6798
iObjectid = mng_get_uint16 (pTemp);
6803
MNG_ERROR (pData, MNG_INVALIDLENGTH)
6810
iObjectid = mng_get_uint16 (pTemp);
6811
iIndex = *(pTemp+2);
6816
MNG_ERROR (pData, MNG_INVALIDLENGTH)
6823
iLeft = mng_get_int32 (pTemp);
6824
iRight = mng_get_int32 (pTemp+4);
6825
iTop = mng_get_int32 (pTemp+8);
6826
iBottom = mng_get_int32 (pTemp+12);
6827
iObjectid = mng_get_uint16 (pTemp+16);
6832
MNG_ERROR (pData, MNG_INVALIDLENGTH)
6839
iLeft = mng_get_int32 (pTemp);
6840
iRight = mng_get_int32 (pTemp+4);
6841
iTop = mng_get_int32 (pTemp+8);
6842
iBottom = mng_get_int32 (pTemp+12);
6843
iObjectid = mng_get_uint16 (pTemp+16);
6844
iIndex = *(pTemp+18);
6849
MNG_ERROR (pData, MNG_INVALIDLENGTH)
6854
pNull = find_null (pTemp); /* get the name length */
6856
if ((pNull - pTemp) > (mng_int32)iLen)
6858
iNamesize = iLen; /* no null found; so end of evNT */
6863
iNamesize = pNull - pTemp; /* should be another entry */
6864
iLen = iLen - iNamesize - 1;
6866
if (!iLen) /* must not end with a null ! */
6867
MNG_ERROR (pData, MNG_ENDWITHNULL)
6870
iRetcode = mng_create_event (pData, iEventtype, iMasktype, iLeft, iRight,
6871
iTop, iBottom, iObjectid, iIndex,
6872
iNamesize, (mng_pchar)pTemp);
6874
if (iRetcode) /* on error bail out */
6877
pTemp = pTemp + iNamesize + 1;
6881
#endif /* MNG_SUPPORT_DISPLAY && MNG_SUPPORT_DYNAMICMNG */
6883
#ifdef MNG_STORE_CHUNKS
6884
if (pData->bStorechunks)
6885
{ /* initialize storage */
6886
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
6888
if (iRetcode) /* on error bail out */
6891
if (iRawlen) /* not empty ? */
6894
mng_uint32 iCount = 0;
6898
mng_uint8 iEventtype;
6899
mng_uint8 iMasktype;
6904
mng_uint16 iObjectid;
6906
mng_uint32 iNamesize;
6907
mng_evnt_entryp pEntry = MNG_NULL;
6909
for (iX = 0; iX < 2; iX++) /* do this twice to get the count first ! */
6914
if (iX) /* second run ? */
6916
MNG_ALLOC (pData, pEntry, (iCount * sizeof (mng_evnt_entry)))
6918
((mng_evntp)*ppChunk)->iCount = iCount;
6919
((mng_evntp)*ppChunk)->pEntries = pEntry;
6922
while (iLen) /* anything left ? */
6924
iEventtype = *pTemp; /* eventtype */
6926
MNG_ERROR (pData, MNG_INVALIDEVENT);
6930
iMasktype = *pTemp; /* masktype */
6932
MNG_ERROR (pData, MNG_INVALIDMASK);
6950
iLeft = mng_get_int32 (pTemp);
6951
iRight = mng_get_int32 (pTemp+4);
6952
iTop = mng_get_int32 (pTemp+8);
6953
iBottom = mng_get_int32 (pTemp+12);
6958
MNG_ERROR (pData, MNG_INVALIDLENGTH)
6965
iObjectid = mng_get_uint16 (pTemp);
6970
MNG_ERROR (pData, MNG_INVALIDLENGTH)
6977
iObjectid = mng_get_uint16 (pTemp);
6978
iIndex = *(pTemp+2);
6983
MNG_ERROR (pData, MNG_INVALIDLENGTH)
6990
iLeft = mng_get_int32 (pTemp);
6991
iRight = mng_get_int32 (pTemp+4);
6992
iTop = mng_get_int32 (pTemp+8);
6993
iBottom = mng_get_int32 (pTemp+12);
6994
iObjectid = mng_get_uint16 (pTemp+16);
6999
MNG_ERROR (pData, MNG_INVALIDLENGTH)
7006
iLeft = mng_get_int32 (pTemp);
7007
iRight = mng_get_int32 (pTemp+4);
7008
iTop = mng_get_int32 (pTemp+8);
7009
iBottom = mng_get_int32 (pTemp+12);
7010
iObjectid = mng_get_uint16 (pTemp+16);
7011
iIndex = *(pTemp+18);
7016
MNG_ERROR (pData, MNG_INVALIDLENGTH)
7021
pNull = find_null (pTemp); /* get the name length */
7023
if ((pNull - pTemp) > (mng_int32)iLen)
7025
iNamesize = iLen; /* no null found; so end of evNT */
7030
iNamesize = pNull - pTemp; /* should be another entry */
7031
iLen = iLen - iNamesize - 1;
7033
if (!iLen) /* must not end with a null ! */
7034
MNG_ERROR (pData, MNG_ENDWITHNULL)
7043
pEntry->iEventtype = iEventtype;
7044
pEntry->iMasktype = iMasktype;
7045
pEntry->iLeft = iLeft;
7046
pEntry->iRight = iRight;
7047
pEntry->iTop = iTop;
7048
pEntry->iBottom = iBottom;
7049
pEntry->iObjectid = iObjectid;
7050
pEntry->iIndex = iIndex;
7051
pEntry->iSegmentnamesize = iNamesize;
7055
MNG_ALLOC (pData, pEntry->zSegmentname, iNamesize+1)
7056
MNG_COPY (pEntry->zSegmentname, pTemp, iNamesize)
7062
pTemp = pTemp + iNamesize + 1;
7067
#endif /* MNG_STORE_CHUNKS */
7069
#ifdef MNG_SUPPORT_TRACE
7070
MNG_TRACE (pData, MNG_FN_READ_EVNT, MNG_LC_END)
7073
return MNG_NOERROR; /* done */
7077
/* ************************************************************************** */
7079
READ_CHUNK (mng_read_unknown)
7081
#ifdef MNG_SUPPORT_TRACE
7082
MNG_TRACE (pData, MNG_FN_READ_UNKNOWN, MNG_LC_START)
7084
/* sequence checks */
7085
#ifdef MNG_INCLUDE_JNG
7086
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
7087
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
7089
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
7090
(!pData->bHasBASI) && (!pData->bHasDHDR) )
7092
MNG_ERROR (pData, MNG_SEQUENCEERROR)
7093
/* critical chunk ? */
7094
if ((((mng_uint32)pData->iChunkname & 0x20000000) == 0)
7095
#ifdef MNG_SKIPCHUNK_SAVE
7096
&& (pData->iChunkname != MNG_UINT_SAVE)
7098
#ifdef MNG_SKIPCHUNK_SEEK
7099
&& (pData->iChunkname != MNG_UINT_SEEK)
7101
#ifdef MNG_SKIPCHUNK_DBYK
7102
&& (pData->iChunkname != MNG_UINT_DBYK)
7104
#ifdef MNG_SKIPCHUNK_ORDR
7105
&& (pData->iChunkname != MNG_UINT_ORDR)
7108
MNG_ERROR (pData, MNG_UNKNOWNCRITICAL)
7110
if (pData->fProcessunknown) /* let the app handle it ? */
7112
mng_bool bOke = pData->fProcessunknown ((mng_handle)pData, pData->iChunkname,
7113
iRawlen, (mng_ptr)pRawdata);
7116
MNG_ERROR (pData, MNG_APPMISCERROR)
7119
#ifdef MNG_STORE_CHUNKS
7120
if (pData->bStorechunks)
7121
{ /* initialize storage */
7122
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
7124
if (iRetcode) /* on error bail out */
7126
/* store the length */
7127
((mng_chunk_headerp)*ppChunk)->iChunkname = pData->iChunkname;
7128
((mng_unknown_chunkp)*ppChunk)->iDatasize = iRawlen;
7130
if (iRawlen == 0) /* any data at all ? */
7131
((mng_unknown_chunkp)*ppChunk)->pData = 0;
7133
{ /* then store it */
7134
MNG_ALLOC (pData, ((mng_unknown_chunkp)*ppChunk)->pData, iRawlen)
7135
MNG_COPY (((mng_unknown_chunkp)*ppChunk)->pData, pRawdata, iRawlen)
7138
#endif /* MNG_STORE_CHUNKS */
7140
#ifdef MNG_SUPPORT_TRACE
7141
MNG_TRACE (pData, MNG_FN_READ_UNKNOWN, MNG_LC_END)
7144
return MNG_NOERROR; /* done */
7147
/* ************************************************************************** */
7149
#endif /* MNG_INCLUDE_READ_PROCS */
7151
/* ************************************************************************** */
7153
/* * chunk write functions * */
7155
/* ************************************************************************** */
7157
#ifdef MNG_INCLUDE_WRITE_PROCS
7159
/* ************************************************************************** */
7161
WRITE_CHUNK (mng_write_ihdr)
7164
mng_uint8p pRawdata;
7166
mng_retcode iRetcode;
7168
#ifdef MNG_SUPPORT_TRACE
7169
MNG_TRACE (pData, MNG_FN_WRITE_IHDR, MNG_LC_START)
7172
pIHDR = (mng_ihdrp)pChunk; /* address the proper chunk */
7173
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
7175
/* fill the output buffer */
7176
mng_put_uint32 (pRawdata, pIHDR->iWidth);
7177
mng_put_uint32 (pRawdata+4, pIHDR->iHeight);
7179
*(pRawdata+8) = pIHDR->iBitdepth;
7180
*(pRawdata+9) = pIHDR->iColortype;
7181
*(pRawdata+10) = pIHDR->iCompression;
7182
*(pRawdata+11) = pIHDR->iFilter;
7183
*(pRawdata+12) = pIHDR->iInterlace;
7185
iRetcode = write_raw_chunk (pData, pIHDR->sHeader.iChunkname, iRawlen, pRawdata);
7187
#ifdef MNG_SUPPORT_TRACE
7188
MNG_TRACE (pData, MNG_FN_WRITE_IHDR, MNG_LC_END)
7194
/* ************************************************************************** */
7196
WRITE_CHUNK (mng_write_plte)
7199
mng_uint8p pRawdata;
7201
mng_retcode iRetcode;
7205
#ifdef MNG_SUPPORT_TRACE
7206
MNG_TRACE (pData, MNG_FN_WRITE_PLTE, MNG_LC_START)
7209
pPLTE = (mng_pltep)pChunk; /* address the proper chunk */
7211
if (pPLTE->bEmpty) /* write empty chunk ? */
7212
iRetcode = write_raw_chunk (pData, pPLTE->sHeader.iChunkname, 0, 0);
7215
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
7216
iRawlen = pPLTE->iEntrycount * 3;
7217
/* fill the output buffer */
7220
for (iX = 0; iX < pPLTE->iEntrycount; iX++)
7222
*pTemp = pPLTE->aEntries [iX].iRed;
7223
*(pTemp+1) = pPLTE->aEntries [iX].iGreen;
7224
*(pTemp+2) = pPLTE->aEntries [iX].iBlue;
7229
iRetcode = write_raw_chunk (pData, pPLTE->sHeader.iChunkname, iRawlen, pRawdata);
7232
#ifdef MNG_SUPPORT_TRACE
7233
MNG_TRACE (pData, MNG_FN_WRITE_PLTE, MNG_LC_END)
7239
/* ************************************************************************** */
7241
WRITE_CHUNK (mng_write_idat)
7244
mng_retcode iRetcode;
7246
#ifdef MNG_SUPPORT_TRACE
7247
MNG_TRACE (pData, MNG_FN_WRITE_IDAT, MNG_LC_START)
7250
pIDAT = (mng_idatp)pChunk; /* address the proper chunk */
7252
if (pIDAT->bEmpty) /* and write it */
7253
iRetcode = write_raw_chunk (pData, pIDAT->sHeader.iChunkname, 0, 0);
7255
iRetcode = write_raw_chunk (pData, pIDAT->sHeader.iChunkname,
7256
pIDAT->iDatasize, pIDAT->pData);
7258
#ifdef MNG_SUPPORT_TRACE
7259
MNG_TRACE (pData, MNG_FN_WRITE_IDAT, MNG_LC_END)
7265
/* ************************************************************************** */
7267
WRITE_CHUNK (mng_write_iend)
7270
mng_retcode iRetcode;
7272
#ifdef MNG_SUPPORT_TRACE
7273
MNG_TRACE (pData, MNG_FN_WRITE_IEND, MNG_LC_START)
7276
pIEND = (mng_iendp)pChunk; /* address the proper chunk */
7278
iRetcode = write_raw_chunk (pData, pIEND->sHeader.iChunkname, 0, 0);
7280
#ifdef MNG_SUPPORT_TRACE
7281
MNG_TRACE (pData, MNG_FN_WRITE_IEND, MNG_LC_END)
7287
/* ************************************************************************** */
7289
WRITE_CHUNK (mng_write_trns)
7292
mng_uint8p pRawdata;
7294
mng_retcode iRetcode;
7298
#ifdef MNG_SUPPORT_TRACE
7299
MNG_TRACE (pData, MNG_FN_WRITE_TRNS, MNG_LC_START)
7302
pTRNS = (mng_trnsp)pChunk; /* address the proper chunk */
7304
if (pTRNS->bEmpty) /* write empty chunk ? */
7305
iRetcode = write_raw_chunk (pData, pTRNS->sHeader.iChunkname, 0, 0);
7307
if (pTRNS->bGlobal) /* write global chunk ? */
7308
iRetcode = write_raw_chunk (pData, pTRNS->sHeader.iChunkname,
7309
pTRNS->iRawlen, (mng_uint8p)pTRNS->aRawdata);
7312
pRawdata = pData->pWritebuf+8; /* init output buffer */
7313
iRawlen = 0; /* and default size */
7315
switch (pTRNS->iType)
7318
iRawlen = 2; /* fill the size & output buffer */
7319
mng_put_uint16 (pRawdata, pTRNS->iGray);
7324
iRawlen = 6; /* fill the size & output buffer */
7325
mng_put_uint16 (pRawdata, pTRNS->iRed);
7326
mng_put_uint16 (pRawdata+2, pTRNS->iGreen);
7327
mng_put_uint16 (pRawdata+4, pTRNS->iBlue);
7331
case 3: { /* init output buffer size */
7332
iRawlen = pTRNS->iCount;
7334
pTemp = pRawdata; /* fill the output buffer */
7336
for (iX = 0; iX < pTRNS->iCount; iX++)
7338
*pTemp = pTRNS->aEntries[iX];
7345
/* write the chunk */
7346
iRetcode = write_raw_chunk (pData, pTRNS->sHeader.iChunkname,
7350
#ifdef MNG_SUPPORT_TRACE
7351
MNG_TRACE (pData, MNG_FN_WRITE_TRNS, MNG_LC_END)
7357
/* ************************************************************************** */
7359
WRITE_CHUNK (mng_write_gama)
7362
mng_uint8p pRawdata;
7364
mng_retcode iRetcode;
7366
#ifdef MNG_SUPPORT_TRACE
7367
MNG_TRACE (pData, MNG_FN_WRITE_GAMA, MNG_LC_START)
7370
pGAMA = (mng_gamap)pChunk; /* address the proper chunk */
7372
if (pGAMA->bEmpty) /* write empty ? */
7373
iRetcode = write_raw_chunk (pData, pGAMA->sHeader.iChunkname, 0, 0);
7376
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
7378
/* fill the buffer */
7379
mng_put_uint32 (pRawdata, pGAMA->iGamma);
7381
iRetcode = write_raw_chunk (pData, pGAMA->sHeader.iChunkname,
7385
#ifdef MNG_SUPPORT_TRACE
7386
MNG_TRACE (pData, MNG_FN_WRITE_GAMA, MNG_LC_END)
7392
/* ************************************************************************** */
7394
#ifndef MNG_SKIPCHUNK_cHRM
7395
WRITE_CHUNK (mng_write_chrm)
7398
mng_uint8p pRawdata;
7400
mng_retcode iRetcode;
7402
#ifdef MNG_SUPPORT_TRACE
7403
MNG_TRACE (pData, MNG_FN_WRITE_CHRM, MNG_LC_START)
7406
pCHRM = (mng_chrmp)pChunk; /* address the proper chunk */
7408
if (pCHRM->bEmpty) /* write empty ? */
7409
iRetcode = write_raw_chunk (pData, pCHRM->sHeader.iChunkname, 0, 0);
7412
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
7414
/* fill the buffer */
7415
mng_put_uint32 (pRawdata, pCHRM->iWhitepointx);
7416
mng_put_uint32 (pRawdata+4, pCHRM->iWhitepointy);
7417
mng_put_uint32 (pRawdata+8, pCHRM->iRedx);
7418
mng_put_uint32 (pRawdata+12, pCHRM->iRedy);
7419
mng_put_uint32 (pRawdata+16, pCHRM->iGreenx);
7420
mng_put_uint32 (pRawdata+20, pCHRM->iGreeny);
7421
mng_put_uint32 (pRawdata+24, pCHRM->iBluex);
7422
mng_put_uint32 (pRawdata+28, pCHRM->iBluey);
7424
iRetcode = write_raw_chunk (pData, pCHRM->sHeader.iChunkname,
7428
#ifdef MNG_SUPPORT_TRACE
7429
MNG_TRACE (pData, MNG_FN_WRITE_CHRM, MNG_LC_END)
7436
/* ************************************************************************** */
7438
WRITE_CHUNK (mng_write_srgb)
7441
mng_uint8p pRawdata;
7443
mng_retcode iRetcode;
7445
#ifdef MNG_SUPPORT_TRACE
7446
MNG_TRACE (pData, MNG_FN_WRITE_SRGB, MNG_LC_START)
7449
pSRGB = (mng_srgbp)pChunk; /* address the proper chunk */
7451
if (pSRGB->bEmpty) /* write empty ? */
7452
iRetcode = write_raw_chunk (pData, pSRGB->sHeader.iChunkname, 0, 0);
7455
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
7457
/* fill the buffer */
7458
*pRawdata = pSRGB->iRenderingintent;
7460
iRetcode = write_raw_chunk (pData, pSRGB->sHeader.iChunkname,
7464
#ifdef MNG_SUPPORT_TRACE
7465
MNG_TRACE (pData, MNG_FN_WRITE_SRGB, MNG_LC_END)
7471
/* ************************************************************************** */
7473
#ifndef MNG_SKIPCHUNK_iCCP
7474
WRITE_CHUNK (mng_write_iccp)
7477
mng_uint8p pRawdata;
7479
mng_retcode iRetcode;
7481
mng_uint8p pBuf = 0;
7483
mng_uint32 iReallen;
7485
#ifdef MNG_SUPPORT_TRACE
7486
MNG_TRACE (pData, MNG_FN_WRITE_ICCP, MNG_LC_START)
7489
pICCP = (mng_iccpp)pChunk; /* address the proper chunk */
7491
if (pICCP->bEmpty) /* write empty ? */
7492
iRetcode = write_raw_chunk (pData, pICCP->sHeader.iChunkname, 0, 0);
7494
{ /* compress the profile */
7495
iRetcode = deflate_buffer (pData, pICCP->pProfile, pICCP->iProfilesize,
7496
&pBuf, &iBuflen, &iReallen);
7498
if (!iRetcode) /* still oke ? */
7500
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
7501
iRawlen = pICCP->iNamesize + 2 + iReallen;
7502
/* requires large buffer ? */
7503
if (iRawlen > pData->iWritebufsize)
7504
MNG_ALLOC (pData, pRawdata, iRawlen)
7506
pTemp = pRawdata; /* fill the buffer */
7508
if (pICCP->iNamesize)
7510
MNG_COPY (pTemp, pICCP->zName, pICCP->iNamesize)
7511
pTemp += pICCP->iNamesize;
7515
*(pTemp+1) = pICCP->iCompression;
7519
MNG_COPY (pTemp, pBuf, iReallen)
7521
iRetcode = write_raw_chunk (pData, pICCP->sHeader.iChunkname,
7523
/* drop the temp buffer ? */
7524
if (iRawlen > pData->iWritebufsize)
7525
MNG_FREEX (pData, pRawdata, iRawlen)
7529
MNG_FREEX (pData, pBuf, iBuflen) /* always drop the extra buffer */
7532
#ifdef MNG_SUPPORT_TRACE
7533
MNG_TRACE (pData, MNG_FN_WRITE_ICCP, MNG_LC_END)
7540
/* ************************************************************************** */
7542
#ifndef MNG_SKIPCHUNK_tEXt
7543
WRITE_CHUNK (mng_write_text)
7546
mng_uint8p pRawdata;
7548
mng_retcode iRetcode;
7551
#ifdef MNG_SUPPORT_TRACE
7552
MNG_TRACE (pData, MNG_FN_WRITE_TEXT, MNG_LC_START)
7555
pTEXT = (mng_textp)pChunk; /* address the proper chunk */
7557
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
7558
iRawlen = pTEXT->iKeywordsize + 1 + pTEXT->iTextsize;
7559
/* requires large buffer ? */
7560
if (iRawlen > pData->iWritebufsize)
7561
MNG_ALLOC (pData, pRawdata, iRawlen)
7563
pTemp = pRawdata; /* fill the buffer */
7565
if (pTEXT->iKeywordsize)
7567
MNG_COPY (pTemp, pTEXT->zKeyword, pTEXT->iKeywordsize)
7568
pTemp += pTEXT->iKeywordsize;
7574
if (pTEXT->iTextsize)
7575
MNG_COPY (pTemp, pTEXT->zText, pTEXT->iTextsize)
7577
iRetcode = write_raw_chunk (pData, pTEXT->sHeader.iChunkname,
7580
if (iRawlen > pData->iWritebufsize) /* drop the temp buffer ? */
7581
MNG_FREEX (pData, pRawdata, iRawlen)
7583
#ifdef MNG_SUPPORT_TRACE
7584
MNG_TRACE (pData, MNG_FN_WRITE_TEXT, MNG_LC_END)
7591
/* ************************************************************************** */
7593
#ifndef MNG_SKIPCHUNK_zTXt
7594
WRITE_CHUNK (mng_write_ztxt)
7597
mng_uint8p pRawdata;
7599
mng_retcode iRetcode;
7601
mng_uint8p pBuf = 0;
7603
mng_uint32 iReallen;
7605
#ifdef MNG_SUPPORT_TRACE
7606
MNG_TRACE (pData, MNG_FN_WRITE_ZTXT, MNG_LC_START)
7609
pZTXT = (mng_ztxtp)pChunk; /* address the proper chunk */
7610
/* compress the text */
7611
iRetcode = deflate_buffer (pData, (mng_uint8p)pZTXT->zText, pZTXT->iTextsize,
7612
&pBuf, &iBuflen, &iReallen);
7614
if (!iRetcode) /* all ok ? */
7616
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
7617
iRawlen = pZTXT->iKeywordsize + 2 + iReallen;
7618
/* requires large buffer ? */
7619
if (iRawlen > pData->iWritebufsize)
7620
MNG_ALLOC (pData, pRawdata, iRawlen)
7622
pTemp = pRawdata; /* fill the buffer */
7624
if (pZTXT->iKeywordsize)
7626
MNG_COPY (pTemp, pZTXT->zKeyword, pZTXT->iKeywordsize)
7627
pTemp += pZTXT->iKeywordsize;
7630
*pTemp = 0; /* terminator zero */
7632
*pTemp = 0; /* compression type */
7636
MNG_COPY (pTemp, pBuf, iReallen)
7638
iRetcode = write_raw_chunk (pData, pZTXT->sHeader.iChunkname,
7640
/* drop the temp buffer ? */
7641
if (iRawlen > pData->iWritebufsize)
7642
MNG_FREEX (pData, pRawdata, iRawlen)
7646
MNG_FREEX (pData, pBuf, iBuflen); /* always drop the compression buffer */
7648
#ifdef MNG_SUPPORT_TRACE
7649
MNG_TRACE (pData, MNG_FN_WRITE_ZTXT, MNG_LC_END)
7656
/* ************************************************************************** */
7658
#ifndef MNG_SKIPCHUNK_iTXt
7659
WRITE_CHUNK (mng_write_itxt)
7662
mng_uint8p pRawdata;
7664
mng_retcode iRetcode;
7666
mng_uint8p pBuf = 0;
7668
mng_uint32 iReallen;
7670
#ifdef MNG_SUPPORT_TRACE
7671
MNG_TRACE (pData, MNG_FN_WRITE_ITXT, MNG_LC_START)
7674
pITXT = (mng_itxtp)pChunk; /* address the proper chunk */
7676
if (pITXT->iCompressionflag) /* compress the text */
7677
iRetcode = deflate_buffer (pData, (mng_uint8p)pITXT->zText, pITXT->iTextsize,
7678
&pBuf, &iBuflen, &iReallen);
7680
iRetcode = MNG_NOERROR;
7682
if (!iRetcode) /* all ok ? */
7684
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
7685
iRawlen = pITXT->iKeywordsize + pITXT->iLanguagesize +
7686
pITXT->iTranslationsize + 5;
7688
if (pITXT->iCompressionflag)
7689
iRawlen = iRawlen + iReallen;
7691
iRawlen = iRawlen + pITXT->iTextsize;
7692
/* requires large buffer ? */
7693
if (iRawlen > pData->iWritebufsize)
7694
MNG_ALLOC (pData, pRawdata, iRawlen)
7696
pTemp = pRawdata; /* fill the buffer */
7698
if (pITXT->iKeywordsize)
7700
MNG_COPY (pTemp, pITXT->zKeyword, pITXT->iKeywordsize)
7701
pTemp += pITXT->iKeywordsize;
7706
*pTemp = pITXT->iCompressionflag;
7708
*pTemp = pITXT->iCompressionmethod;
7711
if (pITXT->iLanguagesize)
7713
MNG_COPY (pTemp, pITXT->zLanguage, pITXT->iLanguagesize)
7714
pTemp += pITXT->iLanguagesize;
7720
if (pITXT->iTranslationsize)
7722
MNG_COPY (pTemp, pITXT->zTranslation, pITXT->iTranslationsize)
7723
pTemp += pITXT->iTranslationsize;
7729
if (pITXT->iCompressionflag)
7732
MNG_COPY (pTemp, pBuf, iReallen)
7736
if (pITXT->iTextsize)
7737
MNG_COPY (pTemp, pITXT->zText, pITXT->iTextsize)
7740
iRetcode = write_raw_chunk (pData, pITXT->sHeader.iChunkname,
7742
/* drop the temp buffer ? */
7743
if (iRawlen > pData->iWritebufsize)
7744
MNG_FREEX (pData, pRawdata, iRawlen)
7748
MNG_FREEX (pData, pBuf, iBuflen); /* always drop the compression buffer */
7750
if (iRetcode) /* on error bail out */
7753
#ifdef MNG_SUPPORT_TRACE
7754
MNG_TRACE (pData, MNG_FN_WRITE_ITXT, MNG_LC_END)
7761
/* ************************************************************************** */
7763
#ifndef MNG_SKIPCHUNK_bKGD
7764
WRITE_CHUNK (mng_write_bkgd)
7767
mng_uint8p pRawdata;
7769
mng_retcode iRetcode;
7771
#ifdef MNG_SUPPORT_TRACE
7772
MNG_TRACE (pData, MNG_FN_WRITE_BKGD, MNG_LC_START)
7775
pBKGD = (mng_bkgdp)pChunk; /* address the proper chunk */
7777
if (pBKGD->bEmpty) /* write empty ? */
7778
iRetcode = write_raw_chunk (pData, pBKGD->sHeader.iChunkname, 0, 0);
7781
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
7782
iRawlen = 0; /* and default size */
7784
switch (pBKGD->iType)
7786
case 0: { /* gray */
7787
iRawlen = 2; /* fill the size & output buffer */
7788
mng_put_uint16 (pRawdata, pBKGD->iGray);
7793
iRawlen = 6; /* fill the size & output buffer */
7794
mng_put_uint16 (pRawdata, pBKGD->iRed);
7795
mng_put_uint16 (pRawdata+2, pBKGD->iGreen);
7796
mng_put_uint16 (pRawdata+4, pBKGD->iBlue);
7800
case 3: { /* indexed */
7801
iRawlen = 1; /* fill the size & output buffer */
7802
*pRawdata = pBKGD->iIndex;
7808
iRetcode = write_raw_chunk (pData, pBKGD->sHeader.iChunkname,
7812
#ifdef MNG_SUPPORT_TRACE
7813
MNG_TRACE (pData, MNG_FN_WRITE_BKGD, MNG_LC_END)
7820
/* ************************************************************************** */
7822
#ifndef MNG_SKIPCHUNK_pHYs
7823
WRITE_CHUNK (mng_write_phys)
7826
mng_uint8p pRawdata;
7828
mng_retcode iRetcode;
7830
#ifdef MNG_SUPPORT_TRACE
7831
MNG_TRACE (pData, MNG_FN_WRITE_PHYS, MNG_LC_START)
7834
pPHYS = (mng_physp)pChunk; /* address the proper chunk */
7836
if (pPHYS->bEmpty) /* write empty ? */
7837
iRetcode = write_raw_chunk (pData, pPHYS->sHeader.iChunkname, 0, 0);
7840
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
7842
/* fill the output buffer */
7843
mng_put_uint32 (pRawdata, pPHYS->iSizex);
7844
mng_put_uint32 (pRawdata+4, pPHYS->iSizey);
7846
*(pRawdata+8) = pPHYS->iUnit;
7848
iRetcode = write_raw_chunk (pData, pPHYS->sHeader.iChunkname,
7852
#ifdef MNG_SUPPORT_TRACE
7853
MNG_TRACE (pData, MNG_FN_WRITE_PHYS, MNG_LC_END)
7860
/* ************************************************************************** */
7862
#ifndef MNG_SKIPCHUNK_sBIT
7863
WRITE_CHUNK (mng_write_sbit)
7866
mng_uint8p pRawdata;
7868
mng_retcode iRetcode;
7870
#ifdef MNG_SUPPORT_TRACE
7871
MNG_TRACE (pData, MNG_FN_WRITE_SBIT, MNG_LC_START)
7874
pSBIT = (mng_sbitp)pChunk; /* address the proper chunk */
7876
if (pSBIT->bEmpty) /* write empty ? */
7877
iRetcode = write_raw_chunk (pData, pSBIT->sHeader.iChunkname, 0, 0);
7880
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
7881
iRawlen = 0; /* and default size */
7883
switch (pSBIT->iType)
7885
case 0: { /* gray */
7886
iRawlen = 1; /* fill the size & output buffer */
7887
*pRawdata = pSBIT->aBits[0];
7892
iRawlen = 3; /* fill the size & output buffer */
7893
*pRawdata = pSBIT->aBits[0];
7894
*(pRawdata+1) = pSBIT->aBits[1];
7895
*(pRawdata+2) = pSBIT->aBits[2];
7899
case 3: { /* indexed */
7900
iRawlen = 1; /* fill the size & output buffer */
7901
*pRawdata = pSBIT->aBits[0];
7905
case 4: { /* gray + alpha */
7906
iRawlen = 2; /* fill the size & output buffer */
7907
*pRawdata = pSBIT->aBits[0];
7908
*(pRawdata+1) = pSBIT->aBits[1];
7912
case 6: { /* rgb + alpha */
7913
iRawlen = 4; /* fill the size & output buffer */
7914
*pRawdata = pSBIT->aBits[0];
7915
*(pRawdata+1) = pSBIT->aBits[1];
7916
*(pRawdata+2) = pSBIT->aBits[2];
7917
*(pRawdata+3) = pSBIT->aBits[3];
7921
case 10: { /* jpeg gray */
7922
iRawlen = 1; /* fill the size & output buffer */
7923
*pRawdata = pSBIT->aBits[0];
7927
case 12: { /* jpeg rgb */
7928
iRawlen = 3; /* fill the size & output buffer */
7929
*pRawdata = pSBIT->aBits[0];
7930
*(pRawdata+1) = pSBIT->aBits[1];
7931
*(pRawdata+2) = pSBIT->aBits[2];
7935
case 14: { /* jpeg gray + alpha */
7936
iRawlen = 2; /* fill the size & output buffer */
7937
*pRawdata = pSBIT->aBits[0];
7938
*(pRawdata+1) = pSBIT->aBits[1];
7942
case 16: { /* jpeg rgb + alpha */
7943
iRawlen = 4; /* fill the size & output buffer */
7944
*pRawdata = pSBIT->aBits[0];
7945
*(pRawdata+1) = pSBIT->aBits[1];
7946
*(pRawdata+2) = pSBIT->aBits[2];
7947
*(pRawdata+3) = pSBIT->aBits[3];
7953
iRetcode = write_raw_chunk (pData, pSBIT->sHeader.iChunkname,
7957
#ifdef MNG_SUPPORT_TRACE
7958
MNG_TRACE (pData, MNG_FN_WRITE_SBIT, MNG_LC_END)
7965
/* ************************************************************************** */
7967
#ifndef MNG_SKIPCHUNK_sPLT
7968
WRITE_CHUNK (mng_write_splt)
7971
mng_uint8p pRawdata;
7973
mng_retcode iRetcode;
7974
mng_uint32 iEntrieslen;
7977
#ifdef MNG_SUPPORT_TRACE
7978
MNG_TRACE (pData, MNG_FN_WRITE_SPLT, MNG_LC_START)
7981
pSPLT = (mng_spltp)pChunk; /* address the proper chunk */
7983
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
7984
iEntrieslen = ((pSPLT->iSampledepth >> 3) * 4 + 2) * pSPLT->iEntrycount;
7985
iRawlen = pSPLT->iNamesize + 2 + iEntrieslen;
7986
/* requires large buffer ? */
7987
if (iRawlen > pData->iWritebufsize)
7988
MNG_ALLOC (pData, pRawdata, iRawlen)
7990
pTemp = pRawdata; /* fill the buffer */
7992
if (pSPLT->iNamesize)
7994
MNG_COPY (pTemp, pSPLT->zName, pSPLT->iNamesize)
7995
pTemp += pSPLT->iNamesize;
7999
*(pTemp+1) = pSPLT->iSampledepth;
8002
if (pSPLT->iEntrycount)
8003
MNG_COPY (pTemp, pSPLT->pEntries, iEntrieslen)
8005
iRetcode = write_raw_chunk (pData, pSPLT->sHeader.iChunkname,
8008
if (iRawlen > pData->iWritebufsize) /* drop the temp buffer ? */
8009
MNG_FREEX (pData, pRawdata, iRawlen)
8011
#ifdef MNG_SUPPORT_TRACE
8012
MNG_TRACE (pData, MNG_FN_WRITE_SPLT, MNG_LC_END)
8019
/* ************************************************************************** */
8021
#ifndef MNG_SKIPCHUNK_hIST
8022
WRITE_CHUNK (mng_write_hist)
8025
mng_uint8p pRawdata;
8027
mng_retcode iRetcode;
8031
#ifdef MNG_SUPPORT_TRACE
8032
MNG_TRACE (pData, MNG_FN_WRITE_HIST, MNG_LC_START)
8035
pHIST = (mng_histp)pChunk; /* address the proper chunk */
8037
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8038
iRawlen = pHIST->iEntrycount << 1;
8040
pTemp = pRawdata; /* fill the output buffer */
8042
for (iX = 0; iX < pHIST->iEntrycount; iX++)
8044
mng_put_uint16 (pTemp, pHIST->aEntries [iX]);
8048
iRetcode = write_raw_chunk (pData, pHIST->sHeader.iChunkname,
8051
#ifdef MNG_SUPPORT_TRACE
8052
MNG_TRACE (pData, MNG_FN_WRITE_HIST, MNG_LC_END)
8059
/* ************************************************************************** */
8061
#ifndef MNG_SKIPCHUNK_tIME
8062
WRITE_CHUNK (mng_write_time)
8065
mng_uint8p pRawdata;
8067
mng_retcode iRetcode;
8069
#ifdef MNG_SUPPORT_TRACE
8070
MNG_TRACE (pData, MNG_FN_WRITE_TIME, MNG_LC_START)
8073
pTIME = (mng_timep)pChunk; /* address the proper chunk */
8075
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8077
/* fill the output buffer */
8078
mng_put_uint16 (pRawdata, pTIME->iYear);
8080
*(pRawdata+2) = pTIME->iMonth;
8081
*(pRawdata+3) = pTIME->iDay;
8082
*(pRawdata+4) = pTIME->iHour;
8083
*(pRawdata+5) = pTIME->iMinute;
8084
*(pRawdata+6) = pTIME->iSecond;
8086
iRetcode = write_raw_chunk (pData, pTIME->sHeader.iChunkname,
8089
#ifdef MNG_SUPPORT_TRACE
8090
MNG_TRACE (pData, MNG_FN_WRITE_TIME, MNG_LC_END)
8097
/* ************************************************************************** */
8099
WRITE_CHUNK (mng_write_mhdr)
8102
mng_uint8p pRawdata;
8104
mng_retcode iRetcode;
8106
#ifdef MNG_SUPPORT_TRACE
8107
MNG_TRACE (pData, MNG_FN_WRITE_MHDR, MNG_LC_START)
8110
pMHDR = (mng_mhdrp)pChunk; /* address the proper chunk */
8112
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8114
/* fill the output buffer */
8115
mng_put_uint32 (pRawdata, pMHDR->iWidth);
8116
mng_put_uint32 (pRawdata+4, pMHDR->iHeight);
8117
mng_put_uint32 (pRawdata+8, pMHDR->iTicks);
8118
mng_put_uint32 (pRawdata+12, pMHDR->iLayercount);
8119
mng_put_uint32 (pRawdata+16, pMHDR->iFramecount);
8120
mng_put_uint32 (pRawdata+20, pMHDR->iPlaytime);
8121
mng_put_uint32 (pRawdata+24, pMHDR->iSimplicity);
8124
iRetcode = write_raw_chunk (pData, pMHDR->sHeader.iChunkname,
8127
#ifdef MNG_SUPPORT_TRACE
8128
MNG_TRACE (pData, MNG_FN_WRITE_MHDR, MNG_LC_END)
8134
/* ************************************************************************** */
8136
WRITE_CHUNK (mng_write_mend)
8139
mng_retcode iRetcode;
8141
#ifdef MNG_SUPPORT_TRACE
8142
MNG_TRACE (pData, MNG_FN_WRITE_MEND, MNG_LC_START)
8145
pMEND = (mng_mendp)pChunk; /* address the proper chunk */
8147
iRetcode = write_raw_chunk (pData, pMEND->sHeader.iChunkname, 0, 0);
8149
#ifdef MNG_SUPPORT_TRACE
8150
MNG_TRACE (pData, MNG_FN_WRITE_MEND, MNG_LC_END)
8156
/* ************************************************************************** */
8158
WRITE_CHUNK (mng_write_loop)
8161
mng_uint8p pRawdata;
8163
mng_retcode iRetcode;
8164
#ifndef MNG_NO_LOOP_SIGNALS_SUPPORTED
8170
#ifdef MNG_SUPPORT_TRACE
8171
MNG_TRACE (pData, MNG_FN_WRITE_LOOP, MNG_LC_START)
8174
pLOOP = (mng_loopp)pChunk; /* address the proper chunk */
8176
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8178
/* fill the output buffer */
8179
*pRawdata = pLOOP->iLevel;
8180
mng_put_uint32 (pRawdata+1, pLOOP->iRepeat);
8182
if (pLOOP->iTermination)
8185
*(pRawdata+5) = pLOOP->iTermination;
8187
if ((pLOOP->iCount) ||
8188
(pLOOP->iItermin != 1) || (pLOOP->iItermax != 0x7FFFFFFFL))
8192
mng_put_uint32 (pRawdata+6, pLOOP->iItermin);
8193
mng_put_uint32 (pRawdata+10, pLOOP->iItermax);
8195
#ifndef MNG_NO_LOOP_SIGNALS_SUPPORTED
8198
iRawlen += pLOOP->iCount * 4;
8200
pTemp1 = pRawdata+14;
8201
pTemp2 = pLOOP->pSignals;
8203
for (iX = 0; iX < pLOOP->iCount; iX++)
8205
mng_put_uint32 (pTemp1, *pTemp2);
8215
iRetcode = write_raw_chunk (pData, pLOOP->sHeader.iChunkname,
8218
#ifdef MNG_SUPPORT_TRACE
8219
MNG_TRACE (pData, MNG_FN_WRITE_LOOP, MNG_LC_END)
8225
/* ************************************************************************** */
8227
WRITE_CHUNK (mng_write_endl)
8230
mng_uint8p pRawdata;
8232
mng_retcode iRetcode;
8234
#ifdef MNG_SUPPORT_TRACE
8235
MNG_TRACE (pData, MNG_FN_WRITE_ENDL, MNG_LC_START)
8238
pENDL = (mng_endlp)pChunk; /* address the proper chunk */
8240
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8243
*pRawdata = pENDL->iLevel; /* fill the output buffer */
8245
iRetcode = write_raw_chunk (pData, pENDL->sHeader.iChunkname,
8248
#ifdef MNG_SUPPORT_TRACE
8249
MNG_TRACE (pData, MNG_FN_WRITE_ENDL, MNG_LC_END)
8255
/* ************************************************************************** */
8257
WRITE_CHUNK (mng_write_defi)
8260
mng_uint8p pRawdata;
8262
mng_retcode iRetcode;
8264
#ifdef MNG_SUPPORT_TRACE
8265
MNG_TRACE (pData, MNG_FN_WRITE_DEFI, MNG_LC_START)
8268
pDEFI = (mng_defip)pChunk; /* address the proper chunk */
8270
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8272
/* fill the output buffer */
8273
mng_put_uint16 (pRawdata, pDEFI->iObjectid);
8275
if ((pDEFI->iDonotshow) || (pDEFI->iConcrete) || (pDEFI->bHasloca) || (pDEFI->bHasclip))
8278
*(pRawdata+2) = pDEFI->iDonotshow;
8280
if ((pDEFI->iConcrete) || (pDEFI->bHasloca) || (pDEFI->bHasclip))
8283
*(pRawdata+3) = pDEFI->iConcrete;
8285
if ((pDEFI->bHasloca) || (pDEFI->bHasclip))
8289
mng_put_uint32 (pRawdata+4, pDEFI->iXlocation);
8290
mng_put_uint32 (pRawdata+8, pDEFI->iYlocation);
8292
if (pDEFI->bHasclip)
8296
mng_put_uint32 (pRawdata+12, pDEFI->iLeftcb);
8297
mng_put_uint32 (pRawdata+16, pDEFI->iRightcb);
8298
mng_put_uint32 (pRawdata+20, pDEFI->iTopcb);
8299
mng_put_uint32 (pRawdata+24, pDEFI->iBottomcb);
8305
iRetcode = write_raw_chunk (pData, pDEFI->sHeader.iChunkname,
8308
#ifdef MNG_SUPPORT_TRACE
8309
MNG_TRACE (pData, MNG_FN_WRITE_DEFI, MNG_LC_END)
8315
/* ************************************************************************** */
8317
WRITE_CHUNK (mng_write_basi)
8320
mng_uint8p pRawdata;
8322
mng_retcode iRetcode;
8325
#ifdef MNG_SUPPORT_TRACE
8326
MNG_TRACE (pData, MNG_FN_WRITE_BASI, MNG_LC_START)
8329
pBASI = (mng_basip)pChunk; /* address the proper chunk */
8331
#ifndef MNG_NO_16BIT_SUPPORT
8332
if (pBASI->iBitdepth <= 8) /* determine opacity alpha-field */
8334
bOpaque = (mng_bool)(pBASI->iAlpha == 0xFF);
8335
#ifndef MNG_NO_16BIT_SUPPORT
8337
bOpaque = (mng_bool)(pBASI->iAlpha == 0xFFFF);
8340
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8342
/* fill the output buffer */
8343
mng_put_uint32 (pRawdata, pBASI->iWidth);
8344
mng_put_uint32 (pRawdata+4, pBASI->iHeight);
8346
*(pRawdata+8) = pBASI->iBitdepth;
8347
*(pRawdata+9) = pBASI->iColortype;
8348
*(pRawdata+10) = pBASI->iCompression;
8349
*(pRawdata+11) = pBASI->iFilter;
8350
*(pRawdata+12) = pBASI->iInterlace;
8352
if ((pBASI->iRed) || (pBASI->iGreen) || (pBASI->iBlue) ||
8353
(!bOpaque) || (pBASI->iViewable))
8356
mng_put_uint16 (pRawdata+13, pBASI->iRed);
8357
mng_put_uint16 (pRawdata+15, pBASI->iGreen);
8358
mng_put_uint16 (pRawdata+17, pBASI->iBlue);
8360
if ((!bOpaque) || (pBASI->iViewable))
8363
mng_put_uint16 (pRawdata+19, pBASI->iAlpha);
8365
if (pBASI->iViewable)
8368
*(pRawdata+21) = pBASI->iViewable;
8373
iRetcode = write_raw_chunk (pData, pBASI->sHeader.iChunkname,
8376
#ifdef MNG_SUPPORT_TRACE
8377
MNG_TRACE (pData, MNG_FN_WRITE_BASI, MNG_LC_END)
8383
/* ************************************************************************** */
8385
WRITE_CHUNK (mng_write_clon)
8388
mng_uint8p pRawdata;
8390
mng_retcode iRetcode;
8392
#ifdef MNG_SUPPORT_TRACE
8393
MNG_TRACE (pData, MNG_FN_WRITE_CLON, MNG_LC_START)
8396
pCLON = (mng_clonp)pChunk; /* address the proper chunk */
8398
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8400
/* fill the output buffer */
8401
mng_put_uint16 (pRawdata, pCLON->iSourceid);
8402
mng_put_uint16 (pRawdata+2, pCLON->iCloneid);
8404
if ((pCLON->iClonetype) || (pCLON->iDonotshow) || (pCLON->iConcrete) || (pCLON->bHasloca))
8407
*(pRawdata+4) = pCLON->iClonetype;
8409
if ((pCLON->iDonotshow) || (pCLON->iConcrete) || (pCLON->bHasloca))
8412
*(pRawdata+5) = pCLON->iDonotshow;
8414
if ((pCLON->iConcrete) || (pCLON->bHasloca))
8417
*(pRawdata+6) = pCLON->iConcrete;
8419
if (pCLON->bHasloca)
8422
*(pRawdata+7) = pCLON->iLocationtype;
8423
mng_put_int32 (pRawdata+8, pCLON->iLocationx);
8424
mng_put_int32 (pRawdata+12, pCLON->iLocationy);
8430
iRetcode = write_raw_chunk (pData, pCLON->sHeader.iChunkname,
8433
#ifdef MNG_SUPPORT_TRACE
8434
MNG_TRACE (pData, MNG_FN_WRITE_CLON, MNG_LC_END)
8440
/* ************************************************************************** */
8442
#ifndef MNG_SKIPCHUNK_PAST
8443
WRITE_CHUNK (mng_write_past)
8446
mng_uint8p pRawdata;
8448
mng_retcode iRetcode;
8449
mng_past_sourcep pSource;
8453
#ifdef MNG_SUPPORT_TRACE
8454
MNG_TRACE (pData, MNG_FN_WRITE_PAST, MNG_LC_START)
8457
pPAST = (mng_pastp)pChunk; /* address the proper chunk */
8459
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8460
iRawlen = 11 + (30 * pPAST->iCount);
8461
/* requires large buffer ? */
8462
if (iRawlen > pData->iWritebufsize)
8463
MNG_ALLOC (pData, pRawdata, iRawlen)
8464
/* fill the output buffer */
8465
mng_put_uint16 (pRawdata, pPAST->iDestid);
8467
*(pRawdata+2) = pPAST->iTargettype;
8469
mng_put_int32 (pRawdata+3, pPAST->iTargetx);
8470
mng_put_int32 (pRawdata+7, pPAST->iTargety);
8472
pTemp = pRawdata+11;
8473
pSource = pPAST->pSources;
8475
for (iX = 0; iX < pPAST->iCount; iX++)
8477
mng_put_uint16 (pTemp, pSource->iSourceid);
8479
*(pTemp+2) = pSource->iComposition;
8480
*(pTemp+3) = pSource->iOrientation;
8481
*(pTemp+4) = pSource->iOffsettype;
8483
mng_put_int32 (pTemp+5, pSource->iOffsetx);
8484
mng_put_int32 (pTemp+9, pSource->iOffsety);
8486
*(pTemp+13) = pSource->iBoundarytype;
8488
mng_put_int32 (pTemp+14, pSource->iBoundaryl);
8489
mng_put_int32 (pTemp+18, pSource->iBoundaryr);
8490
mng_put_int32 (pTemp+22, pSource->iBoundaryt);
8491
mng_put_int32 (pTemp+26, pSource->iBoundaryb);
8497
iRetcode = write_raw_chunk (pData, pPAST->sHeader.iChunkname,
8499
/* free temporary buffer ? */
8500
if (iRawlen > pData->iWritebufsize)
8501
MNG_FREEX (pData, pRawdata, iRawlen)
8503
#ifdef MNG_SUPPORT_TRACE
8504
MNG_TRACE (pData, MNG_FN_WRITE_PAST, MNG_LC_END)
8511
/* ************************************************************************** */
8513
WRITE_CHUNK (mng_write_disc)
8516
mng_uint8p pRawdata;
8518
mng_retcode iRetcode;
8523
#ifdef MNG_SUPPORT_TRACE
8524
MNG_TRACE (pData, MNG_FN_WRITE_DISC, MNG_LC_START)
8527
pDISC = (mng_discp)pChunk; /* address the proper chunk */
8529
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8530
iRawlen = pDISC->iCount << 1;
8532
pTemp1 = pRawdata; /* fill the output buffer */
8533
pTemp2 = pDISC->pObjectids;
8535
for (iX = 0; iX < pDISC->iCount; iX++)
8537
mng_put_uint16 (pTemp1, *pTemp2);
8543
iRetcode = write_raw_chunk (pData, pDISC->sHeader.iChunkname,
8546
#ifdef MNG_SUPPORT_TRACE
8547
MNG_TRACE (pData, MNG_FN_WRITE_DISC, MNG_LC_END)
8553
/* ************************************************************************** */
8555
WRITE_CHUNK (mng_write_back)
8558
mng_uint8p pRawdata;
8560
mng_retcode iRetcode;
8562
#ifdef MNG_SUPPORT_TRACE
8563
MNG_TRACE (pData, MNG_FN_WRITE_BACK, MNG_LC_START)
8566
pBACK = (mng_backp)pChunk; /* address the proper chunk */
8568
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8570
/* fill the output buffer */
8571
mng_put_uint16 (pRawdata, pBACK->iRed);
8572
mng_put_uint16 (pRawdata+2, pBACK->iGreen);
8573
mng_put_uint16 (pRawdata+4, pBACK->iBlue);
8575
if ((pBACK->iMandatory) || (pBACK->iImageid) || (pBACK->iTile))
8578
*(pRawdata+6) = pBACK->iMandatory;
8580
if ((pBACK->iImageid) || (pBACK->iTile))
8583
mng_put_uint16 (pRawdata+7, pBACK->iImageid);
8588
*(pRawdata+9) = pBACK->iTile;
8593
iRetcode = write_raw_chunk (pData, pBACK->sHeader.iChunkname,
8596
#ifdef MNG_SUPPORT_TRACE
8597
MNG_TRACE (pData, MNG_FN_WRITE_BACK, MNG_LC_END)
8603
/* ************************************************************************** */
8605
WRITE_CHUNK (mng_write_fram)
8608
mng_uint8p pRawdata;
8610
mng_retcode iRetcode;
8615
#ifdef MNG_SUPPORT_TRACE
8616
MNG_TRACE (pData, MNG_FN_WRITE_FRAM, MNG_LC_START)
8619
pFRAM = (mng_framp)pChunk; /* address the proper chunk */
8621
if (pFRAM->bEmpty) /* empty ? */
8622
iRetcode = write_raw_chunk (pData, pFRAM->sHeader.iChunkname, 0, 0);
8625
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8627
/* fill the output buffer */
8628
*pRawdata = pFRAM->iMode;
8630
if ((pFRAM->iNamesize ) ||
8631
(pFRAM->iChangedelay ) || (pFRAM->iChangetimeout) ||
8632
(pFRAM->iChangeclipping) || (pFRAM->iChangesyncid ) )
8634
if (pFRAM->iNamesize)
8635
MNG_COPY (pRawdata+1, pFRAM->zName, pFRAM->iNamesize)
8637
iRawlen += pFRAM->iNamesize;
8638
pTemp = pRawdata + pFRAM->iNamesize + 1;
8640
if ((pFRAM->iChangedelay ) || (pFRAM->iChangetimeout) ||
8641
(pFRAM->iChangeclipping) || (pFRAM->iChangesyncid ) )
8644
*(pTemp+1) = pFRAM->iChangedelay;
8645
*(pTemp+2) = pFRAM->iChangetimeout;
8646
*(pTemp+3) = pFRAM->iChangeclipping;
8647
*(pTemp+4) = pFRAM->iChangesyncid;
8652
if (pFRAM->iChangedelay)
8654
mng_put_uint32 (pTemp, pFRAM->iDelay);
8659
if (pFRAM->iChangetimeout)
8661
mng_put_uint32 (pTemp, pFRAM->iTimeout);
8666
if (pFRAM->iChangeclipping)
8668
*pTemp = pFRAM->iBoundarytype;
8670
mng_put_uint32 (pTemp+1, pFRAM->iBoundaryl);
8671
mng_put_uint32 (pTemp+5, pFRAM->iBoundaryr);
8672
mng_put_uint32 (pTemp+9, pFRAM->iBoundaryt);
8673
mng_put_uint32 (pTemp+13, pFRAM->iBoundaryb);
8679
if (pFRAM->iChangesyncid)
8681
iRawlen += pFRAM->iCount * 4;
8682
pTemp2 = pFRAM->pSyncids;
8684
for (iX = 0; iX < pFRAM->iCount; iX++)
8686
mng_put_uint32 (pTemp, *pTemp2);
8695
iRetcode = write_raw_chunk (pData, pFRAM->sHeader.iChunkname,
8699
#ifdef MNG_SUPPORT_TRACE
8700
MNG_TRACE (pData, MNG_FN_WRITE_FRAM, MNG_LC_END)
8706
/* ************************************************************************** */
8708
WRITE_CHUNK (mng_write_move)
8711
mng_uint8p pRawdata;
8713
mng_retcode iRetcode;
8715
#ifdef MNG_SUPPORT_TRACE
8716
MNG_TRACE (pData, MNG_FN_WRITE_MOVE, MNG_LC_START)
8719
pMOVE = (mng_movep)pChunk; /* address the proper chunk */
8721
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8723
/* fill the output buffer */
8724
mng_put_uint16 (pRawdata, pMOVE->iFirstid);
8725
mng_put_uint16 (pRawdata+2, pMOVE->iLastid);
8727
*(pRawdata+4) = pMOVE->iMovetype;
8729
mng_put_int32 (pRawdata+5, pMOVE->iMovex);
8730
mng_put_int32 (pRawdata+9, pMOVE->iMovey);
8732
iRetcode = write_raw_chunk (pData, pMOVE->sHeader.iChunkname,
8735
#ifdef MNG_SUPPORT_TRACE
8736
MNG_TRACE (pData, MNG_FN_WRITE_MOVE, MNG_LC_END)
8742
/* ************************************************************************** */
8744
WRITE_CHUNK (mng_write_clip)
8747
mng_uint8p pRawdata;
8749
mng_retcode iRetcode;
8751
#ifdef MNG_SUPPORT_TRACE
8752
MNG_TRACE (pData, MNG_FN_WRITE_CLIP, MNG_LC_START)
8755
pCLIP = (mng_clipp)pChunk; /* address the proper chunk */
8757
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8759
/* fill the output buffer */
8760
mng_put_uint16 (pRawdata, pCLIP->iFirstid);
8761
mng_put_uint16 (pRawdata+2, pCLIP->iLastid);
8763
*(pRawdata+4) = pCLIP->iCliptype;
8765
mng_put_int32 (pRawdata+5, pCLIP->iClipl);
8766
mng_put_int32 (pRawdata+9, pCLIP->iClipr);
8767
mng_put_int32 (pRawdata+13, pCLIP->iClipt);
8768
mng_put_int32 (pRawdata+17, pCLIP->iClipb);
8770
iRetcode = write_raw_chunk (pData, pCLIP->sHeader.iChunkname,
8773
#ifdef MNG_SUPPORT_TRACE
8774
MNG_TRACE (pData, MNG_FN_WRITE_CLIP, MNG_LC_END)
8780
/* ************************************************************************** */
8782
WRITE_CHUNK (mng_write_show)
8785
mng_uint8p pRawdata;
8787
mng_retcode iRetcode;
8789
#ifdef MNG_SUPPORT_TRACE
8790
MNG_TRACE (pData, MNG_FN_WRITE_SHOW, MNG_LC_START)
8793
pSHOW = (mng_showp)pChunk; /* address the proper chunk */
8795
if (pSHOW->bEmpty) /* empty ? */
8796
iRetcode = write_raw_chunk (pData, pSHOW->sHeader.iChunkname, 0, 0);
8799
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8801
/* fill the output buffer */
8802
mng_put_uint16 (pRawdata, pSHOW->iFirstid);
8804
if ((pSHOW->iLastid != pSHOW->iFirstid) || (pSHOW->iMode))
8807
mng_put_uint16 (pRawdata+2, pSHOW->iLastid);
8812
*(pRawdata+4) = pSHOW->iMode;
8816
iRetcode = write_raw_chunk (pData, pSHOW->sHeader.iChunkname,
8820
#ifdef MNG_SUPPORT_TRACE
8821
MNG_TRACE (pData, MNG_FN_WRITE_SHOW, MNG_LC_END)
8827
/* ************************************************************************** */
8829
WRITE_CHUNK (mng_write_term)
8832
mng_uint8p pRawdata;
8834
mng_retcode iRetcode;
8836
#ifdef MNG_SUPPORT_TRACE
8837
MNG_TRACE (pData, MNG_FN_WRITE_TERM, MNG_LC_START)
8840
pTERM = (mng_termp)pChunk; /* address the proper chunk */
8842
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8845
*pRawdata = pTERM->iTermaction; /* fill the output buffer */
8847
if (pTERM->iTermaction == 3)
8850
*(pRawdata+1) = pTERM->iIteraction;
8852
mng_put_uint32 (pRawdata+2, pTERM->iDelay);
8853
mng_put_uint32 (pRawdata+6, pTERM->iItermax);
8856
iRetcode = write_raw_chunk (pData, pTERM->sHeader.iChunkname,
8859
#ifdef MNG_SUPPORT_TRACE
8860
MNG_TRACE (pData, MNG_FN_WRITE_TERM, MNG_LC_END)
8866
/* ************************************************************************** */
8868
#ifndef MNG_SKIPCHUNK_SAVE
8869
WRITE_CHUNK (mng_write_save)
8872
mng_uint8p pRawdata;
8874
mng_retcode iRetcode;
8875
mng_save_entryp pEntry;
8876
mng_uint32 iEntrysize;
8880
#ifdef MNG_SUPPORT_TRACE
8881
MNG_TRACE (pData, MNG_FN_WRITE_SAVE, MNG_LC_START)
8884
pSAVE = (mng_savep)pChunk; /* address the proper chunk */
8886
if (pSAVE->bEmpty) /* empty ? */
8887
iRetcode = write_raw_chunk (pData, pSAVE->sHeader.iChunkname, 0, 0);
8890
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8893
*pRawdata = pSAVE->iOffsettype; /* fill the output buffer */
8895
if (pSAVE->iOffsettype == 16)
8901
pEntry = pSAVE->pEntries;
8903
for (iX = 0; iX < pSAVE->iCount; iX++)
8905
if (iX) /* put separator null-byte, except the first */
8912
iRawlen += iEntrysize + pEntry->iNamesize;
8913
*pTemp = pEntry->iEntrytype;
8915
if (pSAVE->iOffsettype == 16)
8917
mng_put_uint32 (pTemp+1, pEntry->iOffset[0]);
8918
mng_put_uint32 (pTemp+5, pEntry->iOffset[1]);
8919
mng_put_uint32 (pTemp+9, pEntry->iStarttime[0]);
8920
mng_put_uint32 (pTemp+13, pEntry->iStarttime[1]);
8921
mng_put_uint32 (pTemp+17, pEntry->iLayernr);
8922
mng_put_uint32 (pTemp+21, pEntry->iFramenr);
8928
mng_put_uint32 (pTemp+1, pEntry->iOffset[1]);
8929
mng_put_uint32 (pTemp+5, pEntry->iStarttime[1]);
8930
mng_put_uint32 (pTemp+9, pEntry->iLayernr);
8931
mng_put_uint32 (pTemp+13, pEntry->iFramenr);
8936
if (pEntry->iNamesize)
8938
MNG_COPY (pTemp, pEntry->zName, pEntry->iNamesize);
8939
pTemp += pEntry->iNamesize;
8945
iRetcode = write_raw_chunk (pData, pSAVE->sHeader.iChunkname,
8949
#ifdef MNG_SUPPORT_TRACE
8950
MNG_TRACE (pData, MNG_FN_WRITE_SAVE, MNG_LC_END)
8957
/* ************************************************************************** */
8959
#ifndef MNG_SKIPCHUNK_SEEK
8960
WRITE_CHUNK (mng_write_seek)
8963
mng_uint8p pRawdata;
8965
mng_retcode iRetcode;
8967
#ifdef MNG_SUPPORT_TRACE
8968
MNG_TRACE (pData, MNG_FN_WRITE_SEEK, MNG_LC_START)
8971
pSEEK = (mng_seekp)pChunk; /* address the proper chunk */
8973
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8974
iRawlen = pSEEK->iNamesize;
8976
if (iRawlen) /* fill the output buffer */
8977
MNG_COPY (pRawdata, pSEEK->zName, iRawlen)
8979
iRetcode = write_raw_chunk (pData, pSEEK->sHeader.iChunkname,
8982
#ifdef MNG_SUPPORT_TRACE
8983
MNG_TRACE (pData, MNG_FN_WRITE_SEEK, MNG_LC_END)
8990
/* ************************************************************************** */
8992
#ifndef MNG_SKIPCHUNK_eXPI
8993
WRITE_CHUNK (mng_write_expi)
8996
mng_uint8p pRawdata;
8998
mng_retcode iRetcode;
9000
#ifdef MNG_SUPPORT_TRACE
9001
MNG_TRACE (pData, MNG_FN_WRITE_EXPI, MNG_LC_START)
9004
pEXPI = (mng_expip)pChunk; /* address the proper chunk */
9006
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9007
iRawlen = 2 + pEXPI->iNamesize;
9008
/* fill the output buffer */
9009
mng_put_uint16 (pRawdata, pEXPI->iSnapshotid);
9011
if (pEXPI->iNamesize)
9012
MNG_COPY (pRawdata+2, pEXPI->zName, pEXPI->iNamesize)
9014
iRetcode = write_raw_chunk (pData, pEXPI->sHeader.iChunkname,
9017
#ifdef MNG_SUPPORT_TRACE
9018
MNG_TRACE (pData, MNG_FN_WRITE_EXPI, MNG_LC_END)
9025
/* ************************************************************************** */
9027
#ifndef MNG_SKIPCHUNK_fPRI
9028
WRITE_CHUNK (mng_write_fpri)
9031
mng_uint8p pRawdata;
9033
mng_retcode iRetcode;
9035
#ifdef MNG_SUPPORT_TRACE
9036
MNG_TRACE (pData, MNG_FN_WRITE_FPRI, MNG_LC_START)
9039
pFPRI = (mng_fprip)pChunk; /* address the proper chunk */
9041
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9044
*pRawdata = pFPRI->iDeltatype; /* fill the output buffer */
9045
*(pRawdata+1) = pFPRI->iPriority;
9047
iRetcode = write_raw_chunk (pData, pFPRI->sHeader.iChunkname,
9050
#ifdef MNG_SUPPORT_TRACE
9051
MNG_TRACE (pData, MNG_FN_WRITE_FPRI, MNG_LC_END)
9058
/* ************************************************************************** */
9060
#ifndef MNG_SKIPCHUNK_nEED
9061
WRITE_CHUNK (mng_write_need)
9064
mng_uint8p pRawdata;
9066
mng_retcode iRetcode;
9068
#ifdef MNG_SUPPORT_TRACE
9069
MNG_TRACE (pData, MNG_FN_WRITE_NEED, MNG_LC_START)
9072
pNEED = (mng_needp)pChunk; /* address the proper chunk */
9074
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9075
iRawlen = pNEED->iKeywordssize;
9076
/* fill the output buffer */
9077
if (pNEED->iKeywordssize)
9078
MNG_COPY (pRawdata, pNEED->zKeywords, pNEED->iKeywordssize)
9080
iRetcode = write_raw_chunk (pData, pNEED->sHeader.iChunkname,
9083
#ifdef MNG_SUPPORT_TRACE
9084
MNG_TRACE (pData, MNG_FN_WRITE_NEED, MNG_LC_END)
9091
/* ************************************************************************** */
9093
#ifndef MNG_SKIPCHUNK_pHYg
9094
WRITE_CHUNK (mng_write_phyg)
9097
mng_uint8p pRawdata;
9099
mng_retcode iRetcode;
9101
#ifdef MNG_SUPPORT_TRACE
9102
MNG_TRACE (pData, MNG_FN_WRITE_PHYG, MNG_LC_START)
9105
pPHYG = (mng_phygp)pChunk; /* address the proper chunk */
9107
if (pPHYG->bEmpty) /* write empty ? */
9108
iRetcode = write_raw_chunk (pData, pPHYG->sHeader.iChunkname, 0, 0);
9111
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9113
/* fill the output buffer */
9114
mng_put_uint32 (pRawdata, pPHYG->iSizex);
9115
mng_put_uint32 (pRawdata+4, pPHYG->iSizey);
9117
*(pRawdata+8) = pPHYG->iUnit;
9119
iRetcode = write_raw_chunk (pData, pPHYG->sHeader.iChunkname,
9123
#ifdef MNG_SUPPORT_TRACE
9124
MNG_TRACE (pData, MNG_FN_WRITE_PHYG, MNG_LC_END)
9131
/* ************************************************************************** */
9134
#ifdef MNG_INCLUDE_JNG
9136
WRITE_CHUNK (mng_write_jhdr)
9139
mng_uint8p pRawdata;
9141
mng_retcode iRetcode;
9143
#ifdef MNG_SUPPORT_TRACE
9144
MNG_TRACE (pData, MNG_FN_WRITE_JHDR, MNG_LC_START)
9147
pJHDR = (mng_jhdrp)pChunk; /* address the proper chunk */
9148
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9150
/* fill the output buffer */
9151
mng_put_uint32 (pRawdata, pJHDR->iWidth);
9152
mng_put_uint32 (pRawdata+4, pJHDR->iHeight);
9154
*(pRawdata+8) = pJHDR->iColortype;
9155
*(pRawdata+9) = pJHDR->iImagesampledepth;
9156
*(pRawdata+10) = pJHDR->iImagecompression;
9157
*(pRawdata+11) = pJHDR->iImageinterlace;
9158
*(pRawdata+12) = pJHDR->iAlphasampledepth;
9159
*(pRawdata+13) = pJHDR->iAlphacompression;
9160
*(pRawdata+14) = pJHDR->iAlphafilter;
9161
*(pRawdata+15) = pJHDR->iAlphainterlace;
9163
iRetcode = write_raw_chunk (pData, pJHDR->sHeader.iChunkname, iRawlen, pRawdata);
9165
#ifdef MNG_SUPPORT_TRACE
9166
MNG_TRACE (pData, MNG_FN_WRITE_JHDR, MNG_LC_END)
9172
#define write_jhdr 0
9174
#endif /* MNG_INCLUDE_JNG */
9177
/* ************************************************************************** */
9179
#ifdef MNG_INCLUDE_JNG
9180
WRITE_CHUNK (mng_write_jdaa)
9183
mng_retcode iRetcode;
9185
#ifdef MNG_SUPPORT_TRACE
9186
MNG_TRACE (pData, MNG_FN_WRITE_JDAA, MNG_LC_START)
9189
pJDAA = (mng_jdaap)pChunk; /* address the proper chunk */
9191
if (pJDAA->bEmpty) /* and write it */
9192
iRetcode = write_raw_chunk (pData, pJDAA->sHeader.iChunkname, 0, 0);
9194
iRetcode = write_raw_chunk (pData, pJDAA->sHeader.iChunkname,
9195
pJDAA->iDatasize, pJDAA->pData);
9197
#ifdef MNG_SUPPORT_TRACE
9198
MNG_TRACE (pData, MNG_FN_WRITE_JDAA, MNG_LC_END)
9204
#define write_jdaa 0
9205
#endif /* MNG_INCLUDE_JNG */
9207
/* ************************************************************************** */
9210
#ifdef MNG_INCLUDE_JNG
9212
WRITE_CHUNK (mng_write_jdat)
9215
mng_retcode iRetcode;
9217
#ifdef MNG_SUPPORT_TRACE
9218
MNG_TRACE (pData, MNG_FN_WRITE_JDAT, MNG_LC_START)
9221
pJDAT = (mng_jdatp)pChunk; /* address the proper chunk */
9223
if (pJDAT->bEmpty) /* and write it */
9224
iRetcode = write_raw_chunk (pData, pJDAT->sHeader.iChunkname, 0, 0);
9226
iRetcode = write_raw_chunk (pData, pJDAT->sHeader.iChunkname,
9227
pJDAT->iDatasize, pJDAT->pData);
9229
#ifdef MNG_SUPPORT_TRACE
9230
MNG_TRACE (pData, MNG_FN_WRITE_JDAT, MNG_LC_END)
9236
#define write_jdat 0
9238
#endif /* MNG_INCLUDE_JNG */
9241
/* ************************************************************************** */
9244
#ifdef MNG_INCLUDE_JNG
9246
WRITE_CHUNK (mng_write_jsep)
9249
mng_retcode iRetcode;
9251
#ifdef MNG_SUPPORT_TRACE
9252
MNG_TRACE (pData, MNG_FN_WRITE_JSEP, MNG_LC_START)
9255
pJSEP = (mng_jsepp)pChunk; /* address the proper chunk */
9257
iRetcode = write_raw_chunk (pData, pJSEP->sHeader.iChunkname, 0, 0);
9259
#ifdef MNG_SUPPORT_TRACE
9260
MNG_TRACE (pData, MNG_FN_WRITE_JSEP, MNG_LC_END)
9266
#define write_jsep 0
9268
#endif /* MNG_INCLUDE_JNG */
9271
/* ************************************************************************** */
9273
#ifndef MNG_NO_DELTA_PNG
9274
WRITE_CHUNK (mng_write_dhdr)
9277
mng_uint8p pRawdata;
9279
mng_retcode iRetcode;
9281
#ifdef MNG_SUPPORT_TRACE
9282
MNG_TRACE (pData, MNG_FN_WRITE_DHDR, MNG_LC_START)
9285
pDHDR = (mng_dhdrp)pChunk; /* address the proper chunk */
9287
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9289
/* fill the output buffer */
9290
mng_put_uint16 (pRawdata, pDHDR->iObjectid);
9292
*(pRawdata+2) = pDHDR->iImagetype;
9293
*(pRawdata+3) = pDHDR->iDeltatype;
9295
if (pDHDR->iDeltatype != 7)
9298
mng_put_uint32 (pRawdata+4, pDHDR->iBlockwidth);
9299
mng_put_uint32 (pRawdata+8, pDHDR->iBlockheight);
9301
if (pDHDR->iDeltatype != 0)
9304
mng_put_uint32 (pRawdata+12, pDHDR->iBlockx);
9305
mng_put_uint32 (pRawdata+16, pDHDR->iBlocky);
9309
iRetcode = write_raw_chunk (pData, pDHDR->sHeader.iChunkname,
9312
#ifdef MNG_SUPPORT_TRACE
9313
MNG_TRACE (pData, MNG_FN_WRITE_DHDR, MNG_LC_END)
9320
/* ************************************************************************** */
9322
#ifndef MNG_NO_DELTA_PNG
9323
WRITE_CHUNK (mng_write_prom)
9326
mng_uint8p pRawdata;
9328
mng_retcode iRetcode;
9330
#ifdef MNG_SUPPORT_TRACE
9331
MNG_TRACE (pData, MNG_FN_WRITE_PROM, MNG_LC_START)
9334
pPROM = (mng_promp)pChunk; /* address the proper chunk */
9336
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9339
*pRawdata = pPROM->iColortype; /* fill the output buffer */
9340
*(pRawdata+1) = pPROM->iSampledepth;
9341
*(pRawdata+2) = pPROM->iFilltype;
9343
iRetcode = write_raw_chunk (pData, pPROM->sHeader.iChunkname,
9346
#ifdef MNG_SUPPORT_TRACE
9347
MNG_TRACE (pData, MNG_FN_WRITE_PROM, MNG_LC_END)
9354
/* ************************************************************************** */
9356
#ifndef MNG_NO_DELTA_PNG
9357
WRITE_CHUNK (mng_write_ipng)
9360
mng_retcode iRetcode;
9362
#ifdef MNG_SUPPORT_TRACE
9363
MNG_TRACE (pData, MNG_FN_WRITE_IPNG, MNG_LC_START)
9366
pIPNG = (mng_ipngp)pChunk; /* address the proper chunk */
9368
iRetcode = write_raw_chunk (pData, pIPNG->sHeader.iChunkname, 0, 0);
9370
#ifdef MNG_SUPPORT_TRACE
9371
MNG_TRACE (pData, MNG_FN_WRITE_IPNG, MNG_LC_END)
9378
/* ************************************************************************** */
9380
#ifndef MNG_NO_DELTA_PNG
9381
WRITE_CHUNK (mng_write_pplt)
9384
mng_uint8p pRawdata;
9386
mng_retcode iRetcode;
9387
mng_pplt_entryp pEntry;
9391
mng_uint8p pLastid = 0;
9393
#ifdef MNG_SUPPORT_TRACE
9394
MNG_TRACE (pData, MNG_FN_WRITE_PPLT, MNG_LC_START)
9397
pPPLT = (mng_ppltp)pChunk; /* address the proper chunk */
9399
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9402
*pRawdata = pPPLT->iDeltatype; /* fill the output buffer */
9405
bHasgroup = MNG_FALSE;
9407
for (iX = 0; iX < pPPLT->iCount; iX++)
9409
pEntry = &pPPLT->aEntries[iX];
9411
if (pEntry->bUsed) /* valid entry ? */
9413
if (!bHasgroup) /* start a new group ? */
9415
bHasgroup = MNG_TRUE;
9418
*pTemp = (mng_uint8)iX;
9424
switch (pPPLT->iDeltatype) /* add group-entry depending on type */
9428
*pTemp = pEntry->iRed;
9429
*(pTemp+1) = pEntry->iGreen;
9430
*(pTemp+2) = pEntry->iBlue;
9439
*pTemp = pEntry->iAlpha;
9448
*pTemp = pEntry->iRed;
9449
*(pTemp+1) = pEntry->iGreen;
9450
*(pTemp+2) = pEntry->iBlue;
9451
*(pTemp+3) = pEntry->iAlpha;
9462
if (bHasgroup) /* finish off a group ? */
9463
*pLastid = (mng_uint8)(iX-1);
9465
bHasgroup = MNG_FALSE;
9469
if (bHasgroup) /* last group unfinished ? */
9470
*pLastid = (mng_uint8)(pPPLT->iCount-1);
9471
/* write the output buffer */
9472
iRetcode = write_raw_chunk (pData, pPPLT->sHeader.iChunkname,
9475
#ifdef MNG_SUPPORT_TRACE
9476
MNG_TRACE (pData, MNG_FN_WRITE_PPLT, MNG_LC_END)
9483
/* ************************************************************************** */
9485
#ifndef MNG_NO_DELTA_PNG
9486
#ifdef MNG_INCLUDE_JNG
9487
WRITE_CHUNK (mng_write_ijng)
9490
mng_retcode iRetcode;
9492
#ifdef MNG_SUPPORT_TRACE
9493
MNG_TRACE (pData, MNG_FN_WRITE_IJNG, MNG_LC_START)
9496
pIJNG = (mng_ijngp)pChunk; /* address the proper chunk */
9498
iRetcode = write_raw_chunk (pData, pIJNG->sHeader.iChunkname, 0, 0);
9500
#ifdef MNG_SUPPORT_TRACE
9501
MNG_TRACE (pData, MNG_FN_WRITE_IJNG, MNG_LC_END)
9509
/* ************************************************************************** */
9511
#ifndef MNG_NO_DELTA_PNG
9512
WRITE_CHUNK (mng_write_drop)
9515
mng_uint8p pRawdata;
9517
mng_retcode iRetcode;
9520
mng_chunkidp pTemp2;
9522
#ifdef MNG_SUPPORT_TRACE
9523
MNG_TRACE (pData, MNG_FN_WRITE_DROP, MNG_LC_START)
9526
pDROP = (mng_dropp)pChunk; /* address the proper chunk */
9528
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9529
iRawlen = pDROP->iCount << 2;
9531
pTemp1 = pRawdata; /* fill the output buffer */
9532
pTemp2 = pDROP->pChunknames;
9534
for (iX = 0; iX < pDROP->iCount; iX++)
9536
mng_put_uint32 (pTemp1, (mng_uint32)*pTemp2);
9542
iRetcode = write_raw_chunk (pData, pDROP->sHeader.iChunkname,
9545
#ifdef MNG_SUPPORT_TRACE
9546
MNG_TRACE (pData, MNG_FN_WRITE_DROP, MNG_LC_END)
9553
/* ************************************************************************** */
9555
#ifndef MNG_NO_DELTA_PNG
9556
#ifndef MNG_SKIPCHUNK_DBYK
9557
WRITE_CHUNK (mng_write_dbyk)
9560
mng_uint8p pRawdata;
9562
mng_retcode iRetcode;
9564
#ifdef MNG_SUPPORT_TRACE
9565
MNG_TRACE (pData, MNG_FN_WRITE_DBYK, MNG_LC_START)
9568
pDBYK = (mng_dbykp)pChunk; /* address the proper chunk */
9570
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9571
iRawlen = 5 + pDBYK->iKeywordssize;
9572
/* fill the output buffer */
9573
mng_put_uint32 (pRawdata, pDBYK->iChunkname);
9574
*(pRawdata+4) = pDBYK->iPolarity;
9576
if (pDBYK->iKeywordssize)
9577
MNG_COPY (pRawdata+5, pDBYK->zKeywords, pDBYK->iKeywordssize)
9579
iRetcode = write_raw_chunk (pData, pDBYK->sHeader.iChunkname,
9582
#ifdef MNG_SUPPORT_TRACE
9583
MNG_TRACE (pData, MNG_FN_WRITE_DBYK, MNG_LC_END)
9591
/* ************************************************************************** */
9593
#ifndef MNG_NO_DELTA_PNG
9594
#ifndef MNG_SKIPCHUNK_ORDR
9595
WRITE_CHUNK (mng_write_ordr)
9598
mng_uint8p pRawdata;
9600
mng_retcode iRetcode;
9602
mng_ordr_entryp pEntry;
9605
#ifdef MNG_SUPPORT_TRACE
9606
MNG_TRACE (pData, MNG_FN_WRITE_ORDR, MNG_LC_START)
9609
pORDR = (mng_ordrp)pChunk; /* address the proper chunk */
9611
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9612
iRawlen = pORDR->iCount * 5;
9614
pTemp = pRawdata; /* fill the output buffer */
9615
pEntry = pORDR->pEntries;
9617
for (iX = 0; iX < pORDR->iCount; iX++)
9619
mng_put_uint32 (pTemp, pEntry->iChunkname);
9620
*(pTemp+4) = pEntry->iOrdertype;
9625
iRetcode = write_raw_chunk (pData, pORDR->sHeader.iChunkname,
9628
#ifdef MNG_SUPPORT_TRACE
9629
MNG_TRACE (pData, MNG_FN_WRITE_ORDR, MNG_LC_END)
9637
/* ************************************************************************** */
9639
WRITE_CHUNK (mng_write_magn)
9642
mng_uint8p pRawdata;
9644
mng_retcode iRetcode;
9646
#ifdef MNG_SUPPORT_TRACE
9647
MNG_TRACE (pData, MNG_FN_WRITE_MAGN, MNG_LC_START)
9650
pMAGN = (mng_magnp)pChunk; /* address the proper chunk */
9652
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9654
/* fill the output buffer */
9655
mng_put_uint16 (pRawdata, pMAGN->iFirstid);
9656
mng_put_uint16 (pRawdata+2, pMAGN->iLastid);
9657
*(pRawdata+4) = pMAGN->iMethodX;
9658
mng_put_uint16 (pRawdata+5, pMAGN->iMX);
9659
mng_put_uint16 (pRawdata+7, pMAGN->iMY);
9660
mng_put_uint16 (pRawdata+9, pMAGN->iML);
9661
mng_put_uint16 (pRawdata+11, pMAGN->iMR);
9662
mng_put_uint16 (pRawdata+13, pMAGN->iMT);
9663
mng_put_uint16 (pRawdata+15, pMAGN->iMB);
9664
*(pRawdata+17) = pMAGN->iMethodY;
9665
/* optimize length */
9666
if (pMAGN->iMethodY == pMAGN->iMethodX)
9670
if (pMAGN->iMB == pMAGN->iMY)
9674
if (pMAGN->iMT == pMAGN->iMY)
9678
if (pMAGN->iMR == pMAGN->iMX)
9682
if (pMAGN->iML == pMAGN->iMX)
9686
if (pMAGN->iMY == pMAGN->iMX)
9690
if (pMAGN->iMX == 1)
9694
if (pMAGN->iMethodX == 0)
9698
if (pMAGN->iLastid == pMAGN->iFirstid)
9702
if (pMAGN->iFirstid == 0)
9715
iRetcode = write_raw_chunk (pData, pMAGN->sHeader.iChunkname,
9718
#ifdef MNG_SUPPORT_TRACE
9719
MNG_TRACE (pData, MNG_FN_WRITE_MAGN, MNG_LC_END)
9725
/* ************************************************************************** */
9727
#ifndef MNG_SKIPCHUNK_evNT
9728
WRITE_CHUNK (mng_write_evnt)
9731
mng_uint8p pRawdata;
9733
mng_retcode iRetcode;
9734
mng_evnt_entryp pEntry;
9737
mng_uint32 iNamesize;
9739
#ifdef MNG_SUPPORT_TRACE
9740
MNG_TRACE (pData, MNG_FN_WRITE_EVNT, MNG_LC_START)
9743
pEVNT = (mng_evntp)pChunk; /* address the proper chunk */
9745
if (!pEVNT->iCount) /* empty ? */
9746
iRetcode = write_raw_chunk (pData, pEVNT->sHeader.iChunkname, 0, 0);
9749
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9752
pEntry = pEVNT->pEntries;
9754
for (iX = 0; iX < pEVNT->iCount; iX++)
9756
if (iX) /* put separator null-byte, except the first */
9763
*pTemp = pEntry->iEventtype;
9764
*(pTemp+1) = pEntry->iMasktype;
9768
switch (pEntry->iMasktype)
9772
mng_put_int32 (pTemp, pEntry->iLeft);
9773
mng_put_int32 (pTemp+4, pEntry->iRight);
9774
mng_put_int32 (pTemp+8, pEntry->iTop);
9775
mng_put_int32 (pTemp+12, pEntry->iBottom);
9782
mng_put_uint16 (pTemp, pEntry->iObjectid);
9789
mng_put_uint16 (pTemp, pEntry->iObjectid);
9790
*(pTemp+2) = pEntry->iIndex;
9797
mng_put_int32 (pTemp, pEntry->iLeft);
9798
mng_put_int32 (pTemp+4, pEntry->iRight);
9799
mng_put_int32 (pTemp+8, pEntry->iTop);
9800
mng_put_int32 (pTemp+12, pEntry->iBottom);
9801
mng_put_uint16 (pTemp+16, pEntry->iObjectid);
9808
mng_put_int32 (pTemp, pEntry->iLeft);
9809
mng_put_int32 (pTemp+4, pEntry->iRight);
9810
mng_put_int32 (pTemp+8, pEntry->iTop);
9811
mng_put_int32 (pTemp+12, pEntry->iBottom);
9812
mng_put_uint16 (pTemp+16, pEntry->iObjectid);
9813
*(pTemp+18) = pEntry->iIndex;
9820
iNamesize = pEntry->iSegmentnamesize;
9824
MNG_COPY (pTemp, pEntry->zSegmentname, iNamesize);
9826
iRawlen += iNamesize;
9832
iRetcode = write_raw_chunk (pData, pEVNT->sHeader.iChunkname,
9836
#ifdef MNG_SUPPORT_TRACE
9837
MNG_TRACE (pData, MNG_FN_WRITE_EVNT, MNG_LC_END)
9844
/* ************************************************************************** */
9846
WRITE_CHUNK (mng_write_unknown)
9848
mng_unknown_chunkp pUnknown;
9849
mng_retcode iRetcode;
9851
#ifdef MNG_SUPPORT_TRACE
9852
MNG_TRACE (pData, MNG_FN_WRITE_UNKNOWN, MNG_LC_START)
9854
/* address the proper chunk */
9855
pUnknown = (mng_unknown_chunkp)pChunk;
9857
iRetcode = write_raw_chunk (pData, pUnknown->sHeader.iChunkname,
9858
pUnknown->iDatasize, pUnknown->pData);
9860
#ifdef MNG_SUPPORT_TRACE
9861
MNG_TRACE (pData, MNG_FN_WRITE_UNKNOWN, MNG_LC_END)
9867
/* ************************************************************************** */
9869
#endif /* MNG_INCLUDE_WRITE_PROCS */
9871
/* ************************************************************************** */
9872
/* * end of file * */
9873
/* ************************************************************************** */
1
/** ************************************************************************* */
2
/* * For conditions of distribution and use, * */
3
/* * see copyright notice in libmng.h * */
4
/* ************************************************************************** */
6
/* * project : libmng * */
7
/* * file : libmng_chunk_io.c copyright (c) 2000-2004 G.Juyn * */
8
/* * version : 1.0.9 * */
10
/* * purpose : Chunk I/O routines (implementation) * */
12
/* * author : G.Juyn * */
14
/* * comment : implementation of chunk input/output routines * */
16
/* * changes : 0.5.1 - 05/01/2000 - G.Juyn * */
17
/* * - cleaned up left-over teststuff in the BACK chunk routine * */
18
/* * 0.5.1 - 05/04/2000 - G.Juyn * */
19
/* * - changed CRC initialization to use dynamic structure * */
20
/* * (wasn't thread-safe the old way !) * */
21
/* * 0.5.1 - 05/06/2000 - G.Juyn * */
22
/* * - filled in many missing sequence&length checks * */
23
/* * - filled in many missing chunk-store snippets * */
24
/* * 0.5.1 - 05/08/2000 - G.Juyn * */
25
/* * - added checks for running animations * */
26
/* * - filled some write routines * */
27
/* * - changed strict-ANSI stuff * */
28
/* * 0.5.1 - 05/10/2000 - G.Juyn * */
29
/* * - filled some more write routines * */
30
/* * 0.5.1 - 05/11/2000 - G.Juyn * */
31
/* * - filled remaining write routines * */
32
/* * - fixed read_pplt with regard to deltatype * */
33
/* * - added callback error-reporting support * */
34
/* * - added pre-draft48 support (short MHDR, frame_mode, LOOP) * */
35
/* * 0.5.1 - 05/12/2000 - G.Juyn * */
36
/* * - changed trace to macro for callback error-reporting * */
37
/* * - fixed chunk-storage bit in several routines * */
38
/* * 0.5.1 - 05/13/2000 - G.Juyn * */
39
/* * - added eMNGma hack (will be removed in 1.0.0 !!!) * */
40
/* * - added TERM animation object pointer (easier reference) * */
41
/* * - supplemented the SAVE & SEEK display processing * */
43
/* * 0.5.2 - 05/18/2000 - G.Juyn * */
44
/* * - B004 - fixed problem with MNG_SUPPORT_WRITE not defined * */
45
/* * also for MNG_SUPPORT_WRITE without MNG_INCLUDE_JNG * */
46
/* * 0.5.2 - 05/19/2000 - G.Juyn * */
47
/* * - cleaned up some code regarding mixed support * */
48
/* * 0.5.2 - 05/20/2000 - G.Juyn * */
49
/* * - implemented JNG support * */
50
/* * 0.5.2 - 05/24/2000 - G.Juyn * */
51
/* * - added support for global color-chunks in animation * */
52
/* * - added support for global PLTE,tRNS,bKGD in animation * */
53
/* * - added support for SAVE & SEEK in animation * */
54
/* * 0.5.2 - 05/29/2000 - G.Juyn * */
55
/* * - changed ani_create calls not returning object pointer * */
56
/* * - create ani objects always (not just inside TERM/LOOP) * */
57
/* * 0.5.2 - 05/30/2000 - G.Juyn * */
58
/* * - added support for delta-image processing * */
59
/* * 0.5.2 - 05/31/2000 - G.Juyn * */
60
/* * - fixed up punctuation (contributed by Tim Rowley) * */
61
/* * 0.5.2 - 06/02/2000 - G.Juyn * */
62
/* * - changed SWAP_ENDIAN to BIGENDIAN_SUPPORTED * */
63
/* * 0.5.2 - 06/03/2000 - G.Juyn * */
64
/* * - fixed makeup for Linux gcc compile * */
66
/* * 0.5.3 - 06/12/2000 - G.Juyn * */
67
/* * - added processing of color-info on delta-image * */
68
/* * 0.5.3 - 06/13/2000 - G.Juyn * */
69
/* * - fixed handling of empty SAVE chunk * */
70
/* * 0.5.3 - 06/17/2000 - G.Juyn * */
71
/* * - changed to support delta-images * */
72
/* * - added extra checks for delta-images * */
73
/* * 0.5.3 - 06/20/2000 - G.Juyn * */
74
/* * - fixed possible trouble if IEND display-process got * */
76
/* * 0.5.3 - 06/21/2000 - G.Juyn * */
77
/* * - added processing of PLTE & tRNS for delta-images * */
78
/* * - added administration of imagelevel parameter * */
79
/* * 0.5.3 - 06/22/2000 - G.Juyn * */
80
/* * - implemented support for PPLT chunk * */
81
/* * 0.5.3 - 06/26/2000 - G.Juyn * */
82
/* * - added precaution against faulty iCCP chunks from PS * */
83
/* * 0.5.3 - 06/29/2000 - G.Juyn * */
84
/* * - fixed some 64-bit warnings * */
86
/* * 0.9.1 - 07/14/2000 - G.Juyn * */
87
/* * - changed pre-draft48 frame_mode=3 to frame_mode=1 * */
88
/* * 0.9.1 - 07/16/2000 - G.Juyn * */
89
/* * - fixed storage of images during mng_read() * */
90
/* * - fixed support for mng_display() after mng_read() * */
91
/* * 0.9.1 - 07/19/2000 - G.Juyn * */
92
/* * - fixed several chunk-writing routines * */
93
/* * 0.9.1 - 07/24/2000 - G.Juyn * */
94
/* * - fixed reading of still-images * */
96
/* * 0.9.2 - 08/05/2000 - G.Juyn * */
97
/* * - changed file-prefixes * */
99
/* * 0.9.3 - 08/07/2000 - G.Juyn * */
100
/* * - B111300 - fixup for improved portability * */
101
/* * 0.9.3 - 08/08/2000 - G.Juyn * */
102
/* * - fixed compiler-warnings from Mozilla * */
103
/* * 0.9.3 - 08/09/2000 - G.Juyn * */
104
/* * - added check for simplicity-bits in MHDR * */
105
/* * 0.9.3 - 08/12/2000 - G.Juyn * */
106
/* * - fixed check for simplicity-bits in MHDR (JNG) * */
107
/* * 0.9.3 - 08/12/2000 - G.Juyn * */
108
/* * - added workaround for faulty PhotoShop iCCP chunk * */
109
/* * 0.9.3 - 08/22/2000 - G.Juyn * */
110
/* * - fixed write-code for zTXt & iTXt * */
111
/* * - fixed read-code for iTXt * */
112
/* * 0.9.3 - 08/26/2000 - G.Juyn * */
113
/* * - added MAGN chunk * */
114
/* * 0.9.3 - 09/07/2000 - G.Juyn * */
115
/* * - added support for new filter_types * */
116
/* * 0.9.3 - 09/10/2000 - G.Juyn * */
117
/* * - fixed DEFI behavior * */
118
/* * 0.9.3 - 10/02/2000 - G.Juyn * */
119
/* * - fixed simplicity-check in compliance with draft 81/0.98a * */
120
/* * 0.9.3 - 10/10/2000 - G.Juyn * */
121
/* * - added support for alpha-depth prediction * */
122
/* * 0.9.3 - 10/11/2000 - G.Juyn * */
123
/* * - added support for nEED * */
124
/* * 0.9.3 - 10/16/2000 - G.Juyn * */
125
/* * - added support for JDAA * */
126
/* * 0.9.3 - 10/17/2000 - G.Juyn * */
127
/* * - fixed support for MAGN * */
128
/* * - implemented nEED "xxxx" (where "xxxx" is a chunkid) * */
129
/* * - added callback to process non-critical unknown chunks * */
130
/* * - fixed support for bKGD * */
131
/* * 0.9.3 - 10/23/2000 - G.Juyn * */
132
/* * - fixed bug in empty PLTE handling * */
134
/* * 0.9.4 - 11/20/2000 - G.Juyn * */
135
/* * - changed IHDR filter_method check for PNGs * */
136
/* * 0.9.4 - 1/18/2001 - G.Juyn * */
137
/* * - added errorchecking for MAGN methods * */
138
/* * - removed test filter-methods 1 & 65 * */
140
/* * 0.9.5 - 1/25/2001 - G.Juyn * */
141
/* * - fixed some small compiler warnings (thanks Nikki) * */
143
/* * 1.0.2 - 05/05/2000 - G.Juyn * */
144
/* * - B421427 - writes wrong format in bKGD and tRNS * */
145
/* * 1.0.2 - 06/20/2000 - G.Juyn * */
146
/* * - B434583 - compiler-warning if MNG_STORE_CHUNKS undefined * */
148
/* * 1.0.5 - 07/08/2002 - G.Juyn * */
149
/* * - B578572 - removed eMNGma hack (thanks Dimitri!) * */
150
/* * 1.0.5 - 08/07/2002 - G.Juyn * */
151
/* * - added test-option for PNG filter method 193 (=no filter) * */
152
/* * 1.0.5 - 08/15/2002 - G.Juyn * */
153
/* * - completed PROM support * */
154
/* * 1.0.5 - 08/19/2002 - G.Juyn * */
155
/* * - B597134 - libmng pollutes the linker namespace * */
156
/* * 1.0.5 - 09/07/2002 - G.Juyn * */
157
/* * - fixed reading of FRAM with just frame_mode and name * */
158
/* * 1.0.5 - 09/13/2002 - G.Juyn * */
159
/* * - fixed read/write of MAGN chunk * */
160
/* * 1.0.5 - 09/14/2002 - G.Juyn * */
161
/* * - added event handling for dynamic MNG * */
162
/* * 1.0.5 - 09/15/2002 - G.Juyn * */
163
/* * - fixed LOOP iteration=0 special case * */
164
/* * 1.0.5 - 09/19/2002 - G.Juyn * */
165
/* * - misplaced TERM is now treated as warning * */
166
/* * 1.0.5 - 09/20/2002 - G.Juyn * */
167
/* * - added support for PAST * */
168
/* * 1.0.5 - 10/03/2002 - G.Juyn * */
169
/* * - fixed chunk-storage for evNT chunk * */
170
/* * 1.0.5 - 10/07/2002 - G.Juyn * */
171
/* * - fixed DISC support * */
172
/* * - added another fix for misplaced TERM chunk * */
173
/* * 1.0.5 - 10/17/2002 - G.Juyn * */
174
/* * - fixed initializtion of pIds in dISC read routine * */
175
/* * 1.0.5 - 11/06/2002 - G.Juyn * */
176
/* * - added support for nEED "MNG 1.1" * */
177
/* * - added support for nEED "CACHEOFF" * */
179
/* * 1.0.6 - 05/25/2003 - G.R-P * */
180
/* * - added MNG_SKIPCHUNK_cHNK footprint optimizations * */
181
/* * 1.0.6 - 06/02/2003 - G.R-P * */
182
/* * - removed some redundant checks for iRawlen==0 * */
183
/* * 1.0.6 - 06/22/2003 - G.R-P * */
184
/* * - added MNG_NO_16BIT_SUPPORT, MNG_NO_DELTA_PNG reductions * */
185
/* * - optionally use zlib's crc32 function instead of * */
186
/* * local mng_update_crc * */
187
/* * 1.0.6 - 07/14/2003 - G.R-P * */
188
/* * - added MNG_NO_LOOP_SIGNALS_SUPPORTED conditional * */
189
/* * 1.0.6 - 07/29/2003 - G.R-P * */
190
/* * - added conditionals around PAST chunk support * */
191
/* * 1.0.6 - 08/17/2003 - G.R-P * */
192
/* * - added conditionals around non-VLC chunk support * */
194
/* * 1.0.7 - 10/29/2003 - G.R-P * */
195
/* * - revised JDAA and JDAT readers to avoid compiler bug * */
196
/* * 1.0.7 - 01/25/2004 - J.S * */
197
/* * - added premultiplied alpha canvas' for RGBA, ARGB, ABGR * */
198
/* * 1.0.7 - 01/27/2004 - J.S * */
199
/* * - fixed inclusion of IJNG chunk for non-JNG use * */
200
/* * 1.0.7 - 02/26/2004 - G.Juyn * */
201
/* * - fixed bug in chunk-storage of SHOW chunk (from == to) * */
203
/* * 1.0.8 - 04/02/2004 - G.Juyn * */
204
/* * - added CRC existence & checking flags * */
205
/* * 1.0.8 - 07/07/2004 - G.R-P * */
206
/* * - change worst-case iAlphadepth to 1 for standalone PNGs * */
208
/* * 1.0.9 - 09/28/2004 - G.R-P * */
209
/* * - improved handling of cheap transparency when 16-bit * */
210
/* * support is disabled * */
211
/* * 1.0.9 - 10/04/2004 - G.Juyn * */
212
/* * - fixed bug in writing sBIT for indexed color * */
213
/* * 1.0.9 - 10/10/2004 - G.R-P. * */
214
/* * - added MNG_NO_1_2_4BIT_SUPPORT * */
215
/* * 1.0.9 - 12/05/2004 - G.Juyn * */
216
/* * - added conditional MNG_OPTIMIZE_CHUNKINITFREE * */
217
/* * 1.0.9 - 12/06/2004 - G.Juyn * */
218
/* * - added conditional MNG_OPTIMIZE_CHUNKASSIGN * */
219
/* * 1.0.9 - 12/07/2004 - G.Juyn * */
220
/* * - added conditional MNG_OPTIMIZE_CHUNKREADER * */
221
/* * 1.0.9 - 12/11/2004 - G.Juyn * */
222
/* * - added conditional MNG_OPTIMIZE_DISPLAYCALLS * */
223
/* * 1.0.9 - 12/20/2004 - G.Juyn * */
224
/* * - cleaned up macro-invocations (thanks to D. Airlie) * */
225
/* * 1.0.9 - 01/17/2005 - G.Juyn * */
226
/* * - fixed problem with global PLTE/tRNS * */
228
/* ************************************************************************** */
231
#include "libmng_data.h"
232
#include "libmng_error.h"
233
#include "libmng_trace.h"
237
#include "libmng_objects.h"
238
#include "libmng_object_prc.h"
239
#include "libmng_chunks.h"
240
#ifdef MNG_CHECK_BAD_ICCP
241
#include "libmng_chunk_prc.h"
243
#include "libmng_memory.h"
244
#include "libmng_display.h"
245
#include "libmng_zlib.h"
246
#include "libmng_pixels.h"
247
#include "libmng_chunk_io.h"
249
#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI)
250
#pragma option -A /* force ANSI-C */
253
/* ************************************************************************** */
255
/* * CRC - Cyclic Redundancy Check * */
257
/* * The code below is taken directly from the sample provided with the * */
258
/* * PNG specification. * */
259
/* * (it is only adapted to the library's internal data-definitions) * */
261
/* ************************************************************************** */
262
/* Make the table for a fast CRC. */
263
#ifndef MNG_USE_ZLIB_CRC
264
MNG_LOCAL void make_crc_table (mng_datap pData)
269
for (iN = 0; iN < 256; iN++)
271
iC = (mng_uint32) iN;
273
for (iK = 0; iK < 8; iK++)
276
iC = 0xedb88320U ^ (iC >> 1);
281
pData->aCRCtable [iN] = iC;
284
pData->bCRCcomputed = MNG_TRUE;
288
/* Update a running CRC with the bytes buf[0..len-1]--the CRC
289
should be initialized to all 1's, and the transmitted value
290
is the 1's complement of the final running CRC (see the
291
crc() routine below). */
293
MNG_LOCAL mng_uint32 update_crc (mng_datap pData,
298
#ifdef MNG_USE_ZLIB_CRC
299
return crc32 (iCrc, pBuf, iLen);
301
mng_uint32 iC = iCrc;
304
if (!pData->bCRCcomputed)
305
make_crc_table (pData);
307
for (iN = 0; iN < iLen; iN++)
308
iC = pData->aCRCtable [(iC ^ pBuf [iN]) & 0xff] ^ (iC >> 8);
314
/* Return the CRC of the bytes buf[0..len-1]. */
315
mng_uint32 mng_crc (mng_datap pData,
319
#ifdef MNG_USE_ZLIB_CRC
320
return update_crc (pData, 0, pBuf, iLen);
322
return update_crc (pData, 0xffffffffU, pBuf, iLen) ^ 0xffffffffU;
326
/* ************************************************************************** */
328
/* * Routines for swapping byte-order from and to graphic files * */
329
/* * (This code is adapted from the libpng package) * */
331
/* ************************************************************************** */
333
#ifndef MNG_BIGENDIAN_SUPPORTED
335
/* ************************************************************************** */
337
mng_uint32 mng_get_uint32 (mng_uint8p pBuf)
339
mng_uint32 i = ((mng_uint32)(*pBuf) << 24) +
340
((mng_uint32)(*(pBuf + 1)) << 16) +
341
((mng_uint32)(*(pBuf + 2)) << 8) +
342
(mng_uint32)(*(pBuf + 3));
346
/* ************************************************************************** */
348
mng_int32 mng_get_int32 (mng_uint8p pBuf)
350
mng_int32 i = ((mng_int32)(*pBuf) << 24) +
351
((mng_int32)(*(pBuf + 1)) << 16) +
352
((mng_int32)(*(pBuf + 2)) << 8) +
353
(mng_int32)(*(pBuf + 3));
357
/* ************************************************************************** */
359
mng_uint16 mng_get_uint16 (mng_uint8p pBuf)
361
mng_uint16 i = (mng_uint16)(((mng_uint16)(*pBuf) << 8) +
362
(mng_uint16)(*(pBuf + 1)));
366
/* ************************************************************************** */
368
void mng_put_uint32 (mng_uint8p pBuf,
371
*pBuf = (mng_uint8)((i >> 24) & 0xff);
372
*(pBuf+1) = (mng_uint8)((i >> 16) & 0xff);
373
*(pBuf+2) = (mng_uint8)((i >> 8) & 0xff);
374
*(pBuf+3) = (mng_uint8)(i & 0xff);
377
/* ************************************************************************** */
379
void mng_put_int32 (mng_uint8p pBuf,
382
*pBuf = (mng_uint8)((i >> 24) & 0xff);
383
*(pBuf+1) = (mng_uint8)((i >> 16) & 0xff);
384
*(pBuf+2) = (mng_uint8)((i >> 8) & 0xff);
385
*(pBuf+3) = (mng_uint8)(i & 0xff);
388
/* ************************************************************************** */
390
void mng_put_uint16 (mng_uint8p pBuf,
393
*pBuf = (mng_uint8)((i >> 8) & 0xff);
394
*(pBuf+1) = (mng_uint8)(i & 0xff);
397
/* ************************************************************************** */
399
#endif /* !MNG_BIGENDIAN_SUPPORTED */
401
/* ************************************************************************** */
403
/* * Helper routines to simplify chunk-data extraction * */
405
/* ************************************************************************** */
407
#ifdef MNG_INCLUDE_READ_PROCS
409
/* ************************************************************************** */
411
#ifndef MNG_OPTIMIZE_CHUNKREADER
412
MNG_LOCAL mng_uint8p find_null (mng_uint8p pIn)
414
mng_uint8p pOut = pIn;
415
while (*pOut) /* the read_graphic routine has made sure there's */
416
pOut++; /* always at least 1 zero-byte in the buffer */
421
/* ************************************************************************** */
423
#if !defined(MNG_SKIPCHUNK_iCCP) || !defined(MNG_SKIPCHUNK_zTXt) || !defined(MNG_SKIPCHUNK_iTXt)
424
mng_retcode mng_inflate_buffer (mng_datap pData,
428
mng_uint32 *iOutsize,
429
mng_uint32 *iRealsize)
431
mng_retcode iRetcode = MNG_NOERROR;
433
#ifdef MNG_SUPPORT_TRACE
434
MNG_TRACE (pData, MNG_FN_INFLATE_BUFFER, MNG_LC_START);
437
if (iInsize) /* anything to do ? */
439
*iOutsize = iInsize * 3; /* estimate uncompressed size */
440
/* and allocate a temporary buffer */
441
MNG_ALLOC (pData, *pOutbuf, *iOutsize);
445
mngzlib_inflateinit (pData); /* initialize zlib */
446
/* let zlib know where to store the output */
447
pData->sZlib.next_out = *pOutbuf;
448
/* "size - 1" so we've got space for the
449
zero-termination of a possible string */
450
pData->sZlib.avail_out = *iOutsize - 1;
451
/* ok; let's inflate... */
452
iRetcode = mngzlib_inflatedata (pData, iInsize, pInbuf);
453
/* determine actual output size */
454
*iRealsize = (mng_uint32)pData->sZlib.total_out;
456
mngzlib_inflatefree (pData); /* zlib's done */
458
if (iRetcode == MNG_BUFOVERFLOW) /* not enough space ? */
459
{ /* then get some more */
460
MNG_FREEX (pData, *pOutbuf, *iOutsize);
461
*iOutsize = *iOutsize + iInsize;
462
MNG_ALLOC (pData, *pOutbuf, *iOutsize);
464
} /* repeat if we didn't have enough space */
465
while ((iRetcode == MNG_BUFOVERFLOW) &&
466
(*iOutsize < 20 * iInsize));
468
if (!iRetcode) /* if oke ? */
469
*((*pOutbuf) + *iRealsize) = 0; /* then put terminator zero */
474
*pOutbuf = 0; /* nothing to do; then there's no output */
479
#ifdef MNG_SUPPORT_TRACE
480
MNG_TRACE (pData, MNG_FN_INFLATE_BUFFER, MNG_LC_END);
487
/* ************************************************************************** */
489
#endif /* MNG_INCLUDE_READ_PROCS */
491
/* ************************************************************************** */
493
/* * Helper routines to simplify chunk writing * */
495
/* ************************************************************************** */
496
#ifdef MNG_INCLUDE_WRITE_PROCS
497
/* ************************************************************************** */
499
#if !defined(MNG_SKIPCHUNK_iCCP) || !defined(MNG_SKIPCHUNK_zTXt) || !defined(MNG_SKIPCHUNK_iTXt)
500
MNG_LOCAL mng_retcode deflate_buffer (mng_datap pData,
504
mng_uint32 *iOutsize,
505
mng_uint32 *iRealsize)
507
mng_retcode iRetcode = MNG_NOERROR;
509
#ifdef MNG_SUPPORT_TRACE
510
MNG_TRACE (pData, MNG_FN_DEFLATE_BUFFER, MNG_LC_START);
513
if (iInsize) /* anything to do ? */
515
*iOutsize = (iInsize * 5) >> 2; /* estimate compressed size */
516
/* and allocate a temporary buffer */
517
MNG_ALLOC (pData, *pOutbuf, *iOutsize);
521
mngzlib_deflateinit (pData); /* initialize zlib */
522
/* let zlib know where to store the output */
523
pData->sZlib.next_out = *pOutbuf;
524
pData->sZlib.avail_out = *iOutsize;
525
/* ok; let's deflate... */
526
iRetcode = mngzlib_deflatedata (pData, iInsize, pInbuf);
527
/* determine actual output size */
528
*iRealsize = pData->sZlib.total_out;
530
mngzlib_deflatefree (pData); /* zlib's done */
532
if (iRetcode == MNG_BUFOVERFLOW) /* not enough space ? */
533
{ /* then get some more */
534
MNG_FREEX (pData, *pOutbuf, *iOutsize);
535
*iOutsize = *iOutsize + (iInsize >> 1);
536
MNG_ALLOC (pData, *pOutbuf, *iOutsize);
538
} /* repeat if we didn't have enough space */
539
while (iRetcode == MNG_BUFOVERFLOW);
543
*pOutbuf = 0; /* nothing to do; then there's no output */
548
#ifdef MNG_SUPPORT_TRACE
549
MNG_TRACE (pData, MNG_FN_DEFLATE_BUFFER, MNG_LC_END);
556
/* ************************************************************************** */
558
MNG_LOCAL mng_retcode write_raw_chunk (mng_datap pData,
559
mng_chunkid iChunkname,
566
#ifdef MNG_SUPPORT_TRACE
567
MNG_TRACE (pData, MNG_FN_WRITE_RAW_CHUNK, MNG_LC_START);
569
/* temporary buffer ? */
570
if ((pRawdata != 0) && (pRawdata != pData->pWritebuf+8))
571
{ /* store length & chunktype in default buffer */
572
mng_put_uint32 (pData->pWritebuf, iRawlen);
573
mng_put_uint32 (pData->pWritebuf+4, (mng_uint32)iChunkname);
575
if (pData->iCrcmode & MNG_CRC_OUTPUT)
577
if ((pData->iCrcmode & MNG_CRC_OUTPUT) == MNG_CRC_OUTPUT_GENERATE)
578
{ /* calculate the crc */
579
iCrc = update_crc (pData, 0xffffffffL, pData->pWritebuf+4, 4);
580
iCrc = update_crc (pData, iCrc, pRawdata, iRawlen) ^ 0xffffffffL;
582
iCrc = 0; /* dummy crc */
583
} /* store in default buffer */
584
mng_put_uint32 (pData->pWritebuf+8, iCrc);
586
/* write the length & chunktype */
587
if (!pData->fWritedata ((mng_handle)pData, pData->pWritebuf, 8, &iWritten))
588
MNG_ERROR (pData, MNG_APPIOERROR);
590
if (iWritten != 8) /* disk full ? */
591
MNG_ERROR (pData, MNG_OUTPUTERROR);
592
/* write the temporary buffer */
593
if (!pData->fWritedata ((mng_handle)pData, pRawdata, iRawlen, &iWritten))
594
MNG_ERROR (pData, MNG_APPIOERROR);
596
if (iWritten != iRawlen) /* disk full ? */
597
MNG_ERROR (pData, MNG_OUTPUTERROR);
599
if (pData->iCrcmode & MNG_CRC_OUTPUT)
600
{ /* write the crc */
601
if (!pData->fWritedata ((mng_handle)pData, pData->pWritebuf+8, 4, &iWritten))
602
MNG_ERROR (pData, MNG_APPIOERROR);
604
if (iWritten != 4) /* disk full ? */
605
MNG_ERROR (pData, MNG_OUTPUTERROR);
609
{ /* prefix with length & chunktype */
610
mng_put_uint32 (pData->pWritebuf, iRawlen);
611
mng_put_uint32 (pData->pWritebuf+4, (mng_uint32)iChunkname);
613
if (pData->iCrcmode & MNG_CRC_OUTPUT)
615
if ((pData->iCrcmode & MNG_CRC_OUTPUT) == MNG_CRC_OUTPUT_GENERATE)
616
/* calculate the crc */
617
iCrc = mng_crc (pData, pData->pWritebuf+4, iRawlen + 4);
619
iCrc = 0; /* dummy crc */
620
/* add it to the buffer */
621
mng_put_uint32 (pData->pWritebuf + iRawlen + 8, iCrc);
622
/* write it in a single pass */
623
if (!pData->fWritedata ((mng_handle)pData, pData->pWritebuf, iRawlen + 12, &iWritten))
624
MNG_ERROR (pData, MNG_APPIOERROR);
626
if (iWritten != iRawlen + 12) /* disk full ? */
627
MNG_ERROR (pData, MNG_OUTPUTERROR);
629
if (!pData->fWritedata ((mng_handle)pData, pData->pWritebuf, iRawlen + 8, &iWritten))
630
MNG_ERROR (pData, MNG_APPIOERROR);
632
if (iWritten != iRawlen + 8) /* disk full ? */
633
MNG_ERROR (pData, MNG_OUTPUTERROR);
637
#ifdef MNG_SUPPORT_TRACE
638
MNG_TRACE (pData, MNG_FN_WRITE_RAW_CHUNK, MNG_LC_END);
644
/* ************************************************************************** */
646
#endif /* MNG_INCLUDE_WRITE_PROCS */
648
/* ************************************************************************** */
650
/* * chunk read functions * */
652
/* ************************************************************************** */
654
#ifdef MNG_INCLUDE_READ_PROCS
656
/* ************************************************************************** */
658
#ifdef MNG_OPTIMIZE_CHUNKREADER
660
/* ************************************************************************** */
662
MNG_LOCAL mng_retcode create_chunk_storage (mng_datap pData,
666
mng_field_descp pField,
671
mng_field_descp pTempfield = pField;
672
mng_uint16 iFieldcount = iFields;
673
mng_uint8p pTempdata = pRawdata;
674
mng_uint32 iTemplen = iRawlen;
675
mng_uint16 iLastgroup = 0;
676
mng_uint8p pChunkdata;
678
mng_uint8 iColortype;
680
/* initialize storage */
681
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
682
if (iRetcode) /* on error bail out */
685
if (((mng_chunk_headerp)(*ppChunk))->iChunkname == MNG_UINT_HUH)
686
((mng_chunk_headerp)(*ppChunk))->iChunkname = pData->iChunkname;
689
((((mng_chunk_headerp)pHeader)->iChunkname != MNG_UINT_IDAT) &&
690
(((mng_chunk_headerp)pHeader)->iChunkname != MNG_UINT_JDAT) &&
691
(((mng_chunk_headerp)pHeader)->iChunkname != MNG_UINT_JDAA) ))
693
pChunkdata = (mng_uint8p)(*ppChunk);
695
#ifdef MNG_INCLUDE_JNG /* determine current colortype */
697
iColortype = (mng_uint8)(pData->iJHDRcolortype - 8);
699
#endif /* MNG_INCLUDE_JNG */
700
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
701
iColortype = pData->iColortype;
705
if (iTemplen) /* not empty ? */
706
{ /* then go fill the fields */
707
while ((iFieldcount) && (iTemplen))
709
if (pTempfield->iOffsetchunk)
711
if (pTempfield->iFlags & MNG_FIELD_PUTIMGTYPE)
713
*(pChunkdata+pTempfield->iOffsetchunk) = iColortype;
714
bProcess = MNG_FALSE;
717
if (pTempfield->iFlags & MNG_FIELD_IFIMGTYPES)
718
bProcess = (mng_bool)(((pTempfield->iFlags & MNG_FIELD_IFIMGTYPE0) && (iColortype == 0)) ||
719
((pTempfield->iFlags & MNG_FIELD_IFIMGTYPE2) && (iColortype == 2)) ||
720
((pTempfield->iFlags & MNG_FIELD_IFIMGTYPE3) && (iColortype == 3)) ||
721
((pTempfield->iFlags & MNG_FIELD_IFIMGTYPE4) && (iColortype == 4)) ||
722
((pTempfield->iFlags & MNG_FIELD_IFIMGTYPE6) && (iColortype == 6)) );
728
iLastgroup = (mng_uint16)(pTempfield->iFlags & MNG_FIELD_GROUPMASK);
729
/* numeric field ? */
730
if (pTempfield->iFlags & MNG_FIELD_INT)
732
if (iTemplen < pTempfield->iLengthmax)
733
MNG_ERROR (pData, MNG_INVALIDLENGTH);
735
switch (pTempfield->iLengthmax)
737
case 1 : { mng_uint8 iNum = *pTempdata;
738
if (((mng_uint16)iNum < pTempfield->iMinvalue) ||
739
((mng_uint16)iNum > pTempfield->iMaxvalue) )
740
MNG_ERROR (pData, MNG_INVALIDFIELDVAL);
741
*(pChunkdata+pTempfield->iOffsetchunk) = iNum;
743
case 2 : { mng_uint16 iNum = mng_get_uint16 (pTempdata);
744
if ((iNum < pTempfield->iMinvalue) || (iNum > pTempfield->iMaxvalue))
745
MNG_ERROR (pData, MNG_INVALIDFIELDVAL);
746
*((mng_uint16p)(pChunkdata+pTempfield->iOffsetchunk)) = iNum;
748
case 4 : { mng_uint32 iNum = mng_get_uint32 (pTempdata);
749
if ((iNum < pTempfield->iMinvalue) ||
750
((pTempfield->iFlags & MNG_FIELD_NOHIGHBIT) && (iNum & 0x80000000)) )
751
MNG_ERROR (pData, MNG_INVALIDFIELDVAL);
752
*((mng_uint32p)(pChunkdata+pTempfield->iOffsetchunk)) = iNum;
756
pTempdata += pTempfield->iLengthmax;
757
iTemplen -= pTempfield->iLengthmax;
759
} else { /* not numeric so it's a bunch of bytes */
761
if (!pTempfield->iOffsetchunklen) /* big fat NONO */
762
MNG_ERROR (pData, MNG_INTERNALERROR);
763
/* with terminating 0 ? */
764
if (pTempfield->iFlags & MNG_FIELD_TERMINATOR)
766
mng_uint8p pWork = pTempdata;
767
while (*pWork) /* find the zero */
769
iDatalen = (mng_uint32)(pWork - pTempdata);
770
} else { /* no terminator, so everything that's left ! */
774
if ((pTempfield->iLengthmax) && (iDatalen > pTempfield->iLengthmax))
775
MNG_ERROR (pData, MNG_INVALIDLENGTH);
776
/* needs decompression ? */
777
if (pTempfield->iFlags & MNG_FIELD_DEFLATED)
780
mng_uint32 iBufsize = 0;
781
mng_uint32 iRealsize;
784
iRetcode = mng_inflate_buffer (pData, pTempdata, iDatalen,
785
&pBuf, &iBufsize, &iRealsize);
787
#ifdef MNG_CHECK_BAD_ICCP /* Check for bad iCCP chunk */
788
if ((iRetcode) && (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_iCCP))
790
*((mng_ptr *)(pChunkdata+pTempfield->iOffsetchunk)) = MNG_NULL;
791
*((mng_uint32p)(pChunkdata+pTempfield->iOffsetchunklen)) = iDatalen;
798
/* don't forget to generate null terminator */
799
MNG_ALLOC (pData, pWork, iRealsize+1);
800
MNG_COPY (pWork, pBuf, iRealsize);
802
*((mng_ptr *)(pChunkdata+pTempfield->iOffsetchunk)) = pWork;
803
*((mng_uint32p)(pChunkdata+pTempfield->iOffsetchunklen)) = iRealsize;
806
if (pBuf) /* free the temporary buffer */
807
MNG_FREEX (pData, pBuf, iBufsize);
809
} else { /* no decompression, so just copy */
812
/* don't forget to generate null terminator */
813
MNG_ALLOC (pData, pWork, iDatalen+1);
814
MNG_COPY (pWork, pTempdata, iDatalen);
816
*((mng_ptr *)(pChunkdata+pTempfield->iOffsetchunk)) = pWork;
817
*((mng_uint32p)(pChunkdata+pTempfield->iOffsetchunklen)) = iDatalen;
820
if (pTempfield->iFlags & MNG_FIELD_TERMINATOR)
821
iDatalen++; /* skip the terminating zero as well !!! */
823
iTemplen -= iDatalen;
824
pTempdata += iDatalen;
826
/* need to set an indicator ? */
827
if (pTempfield->iOffsetchunkind)
828
*((mng_uint8p)(pChunkdata+pTempfield->iOffsetchunkind)) = MNG_TRUE;
832
if (pTempfield->pSpecialfunc) /* special function required ? */
834
iRetcode = pTempfield->pSpecialfunc(pData, *ppChunk, &iTemplen, &pTempdata);
835
if (iRetcode) /* on error bail out */
839
pTempfield++; /* Neeeeeeexxxtt */
843
if (iTemplen) /* extra data ??? */
844
MNG_ERROR (pData, MNG_INVALIDLENGTH);
846
while (iFieldcount) /* not enough data ??? */
848
if (pTempfield->iFlags & MNG_FIELD_IFIMGTYPES)
849
bProcess = (mng_bool)(((pTempfield->iFlags & MNG_FIELD_IFIMGTYPE0) && (iColortype == 0)) ||
850
((pTempfield->iFlags & MNG_FIELD_IFIMGTYPE2) && (iColortype == 2)) ||
851
((pTempfield->iFlags & MNG_FIELD_IFIMGTYPE3) && (iColortype == 3)) ||
852
((pTempfield->iFlags & MNG_FIELD_IFIMGTYPE4) && (iColortype == 4)) ||
853
((pTempfield->iFlags & MNG_FIELD_IFIMGTYPE6) && (iColortype == 6)) );
859
if (!(pTempfield->iFlags & MNG_FIELD_OPTIONAL))
860
MNG_ERROR (pData, MNG_INVALIDLENGTH);
861
if ((pTempfield->iFlags & MNG_FIELD_GROUPMASK) &&
862
((mng_uint16)(pTempfield->iFlags & MNG_FIELD_GROUPMASK) == iLastgroup))
863
MNG_ERROR (pData, MNG_INVALIDLENGTH);
875
/* ************************************************************************** */
877
READ_CHUNK (mng_read_general)
879
mng_chunk_descp pDescr = ((mng_chunk_headerp)pHeader)->pChunkdescr;
880
mng_field_descp pField = pDescr->pFielddesc;
881
mng_uint16 iFields = pDescr->iFielddesc;
882
mng_retcode iRetcode = MNG_NOERROR;
884
if (!pDescr) /* this is a bad booboo !!! */
885
MNG_ERROR (pData, MNG_INTERNALERROR);
886
/* check chunk against signature */
887
if ((pDescr->eImgtype == mng_it_mng) && (pData->eSigtype != mng_it_mng))
888
MNG_ERROR (pData, MNG_CHUNKNOTALLOWED);
890
if ((pDescr->eImgtype == mng_it_jng) && (pData->eSigtype == mng_it_png))
891
MNG_ERROR (pData, MNG_CHUNKNOTALLOWED);
892
/* empties allowed ? */
893
if ((iRawlen == 0) && (!(pDescr->iAllowed & MNG_DESCR_EMPTY)))
894
MNG_ERROR (pData, MNG_INVALIDLENGTH);
896
if ((pData->eImagetype != mng_it_mng) || (!(pDescr->iAllowed & MNG_DESCR_GLOBAL)))
897
{ /* *a* header required ? */
898
if ((pDescr->iMusthaves & MNG_DESCR_GenHDR) &&
899
#ifdef MNG_INCLUDE_JNG
900
(!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
902
(!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR))
904
MNG_ERROR (pData, MNG_SEQUENCEERROR);
906
#ifdef MNG_INCLUDE_JNG
907
if ((pDescr->iMusthaves & MNG_DESCR_JngHDR) &&
908
(!pData->bHasDHDR) && (!pData->bHasJHDR))
909
MNG_ERROR (pData, MNG_SEQUENCEERROR);
912
/* specific chunk pre-requisite ? */
913
if (((pDescr->iMusthaves & MNG_DESCR_IHDR) && (!pData->bHasIHDR)) ||
914
#ifdef MNG_INCLUDE_JNG
915
((pDescr->iMusthaves & MNG_DESCR_JHDR) && (!pData->bHasJHDR)) ||
917
((pDescr->iMusthaves & MNG_DESCR_DHDR) && (!pData->bHasDHDR)) ||
918
((pDescr->iMusthaves & MNG_DESCR_LOOP) && (!pData->bHasLOOP)) ||
919
((pDescr->iMusthaves & MNG_DESCR_PLTE) && (!pData->bHasPLTE)) ||
920
((pDescr->iMusthaves & MNG_DESCR_MHDR) && (!pData->bHasMHDR)) ||
921
((pDescr->iMusthaves & MNG_DESCR_SAVE) && (!pData->bHasSAVE)) )
922
MNG_ERROR (pData, MNG_SEQUENCEERROR);
923
/* specific chunk undesired ? */
924
if (((pDescr->iMustNOThaves & MNG_DESCR_NOIHDR) && (pData->bHasIHDR)) ||
925
((pDescr->iMustNOThaves & MNG_DESCR_NOBASI) && (pData->bHasBASI)) ||
926
((pDescr->iMustNOThaves & MNG_DESCR_NODHDR) && (pData->bHasDHDR)) ||
927
((pDescr->iMustNOThaves & MNG_DESCR_NOIDAT) && (pData->bHasIDAT)) ||
928
((pDescr->iMustNOThaves & MNG_DESCR_NOPLTE) && (pData->bHasPLTE)) ||
929
#ifdef MNG_INCLUDE_JNG
930
((pDescr->iMustNOThaves & MNG_DESCR_NOJHDR) && (pData->bHasJHDR)) ||
931
((pDescr->iMustNOThaves & MNG_DESCR_NOJDAT) && (pData->bHasJDAT)) ||
932
((pDescr->iMustNOThaves & MNG_DESCR_NOJDAA) && (pData->bHasJDAA)) ||
933
((pDescr->iMustNOThaves & MNG_DESCR_NOJSEP) && (pData->bHasJSEP)) ||
935
((pDescr->iMustNOThaves & MNG_DESCR_NOMHDR) && (pData->bHasMHDR)) ||
936
((pDescr->iMustNOThaves & MNG_DESCR_NOLOOP) && (pData->bHasLOOP)) ||
937
((pDescr->iMustNOThaves & MNG_DESCR_NOTERM) && (pData->bHasTERM)) ||
938
((pDescr->iMustNOThaves & MNG_DESCR_NOSAVE) && (pData->bHasSAVE)) )
939
MNG_ERROR (pData, MNG_SEQUENCEERROR);
941
if (pData->eSigtype == mng_it_mng) /* check global and embedded empty chunks */
943
#ifdef MNG_INCLUDE_JNG
944
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
946
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
949
if ((iRawlen == 0) && (!(pDescr->iAllowed & MNG_DESCR_EMPTYEMBED)))
950
MNG_ERROR (pData, MNG_INVALIDLENGTH);
952
if ((iRawlen == 0) && (!(pDescr->iAllowed & MNG_DESCR_EMPTYGLOBAL)))
953
MNG_ERROR (pData, MNG_INVALIDLENGTH);
957
if (pDescr->pSpecialfunc) /* need special processing ? */
959
iRetcode = create_chunk_storage (pData, pHeader, iRawlen, pRawdata,
960
pField, iFields, ppChunk, MNG_TRUE);
961
if (iRetcode) /* on error bail out */
963
/* empty indicator ? */
964
if ((!iRawlen) && (pDescr->iOffsetempty))
965
*(((mng_uint8p)*ppChunk)+pDescr->iOffsetempty) = MNG_TRUE;
967
iRetcode = pDescr->pSpecialfunc(pData, *ppChunk);
968
if (iRetcode) /* on error bail out */
971
if ((((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_IDAT) ||
972
(((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_JDAT) ||
973
(((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_JDAA) )
975
iRetcode = ((mng_chunk_headerp)*ppChunk)->fCleanup (pData, *ppChunk);
976
if (iRetcode) /* on error bail out */
980
#ifdef MNG_STORE_CHUNKS
981
if (!pData->bStorechunks)
984
iRetcode = ((mng_chunk_headerp)*ppChunk)->fCleanup (pData, *ppChunk);
985
if (iRetcode) /* on error bail out */
992
#ifdef MNG_SUPPORT_DISPLAY
995
#ifdef MNG_OPTIMIZE_DISPLAYCALLS
996
pData->iRawlen = iRawlen;
997
pData->pRawdata = pRawdata;
1000
/* display processing */
1001
#ifndef MNG_OPTIMIZE_DISPLAYCALLS
1002
if (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_IDAT)
1003
iRetcode = mng_process_display_idat (pData, iRawlen, pRawdata);
1004
#ifdef MNG_INCLUDE_JNG
1006
if (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_JDAT)
1007
iRetcode = mng_process_display_jdat (pData, iRawlen, pRawdata);
1009
if (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_JDAA)
1010
iRetcode = mng_process_display_jdaa (pData, iRawlen, pRawdata);
1013
if (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_IDAT)
1014
iRetcode = mng_process_display_idat (pData);
1015
#ifdef MNG_INCLUDE_JNG
1017
if (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_JDAT)
1018
iRetcode = mng_process_display_jdat (pData);
1020
if (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_JDAA)
1021
iRetcode = mng_process_display_jdaa (pData);
1028
#endif /* MNG_SUPPORT_DISPLAY */
1030
#ifdef MNG_STORE_CHUNKS
1031
if ((pData->bStorechunks) && (!(*ppChunk)))
1033
iRetcode = create_chunk_storage (pData, pHeader, iRawlen, pRawdata,
1034
pField, iFields, ppChunk, MNG_FALSE);
1035
if (iRetcode) /* on error bail out */
1037
/* empty indicator ? */
1038
if ((!iRawlen) && (pDescr->iOffsetempty))
1039
*(((mng_uint8p)*ppChunk)+pDescr->iOffsetempty) = MNG_TRUE;
1041
#endif /* MNG_STORE_CHUNKS */
1046
/* ************************************************************************** */
1048
#endif /* MNG_OPTIMIZE_CHUNKREADER */
1050
/* ************************************************************************** */
1052
#ifndef MNG_OPTIMIZE_CHUNKREADER
1053
READ_CHUNK (mng_read_ihdr)
1055
#ifdef MNG_SUPPORT_TRACE
1056
MNG_TRACE (pData, MNG_FN_READ_IHDR, MNG_LC_START);
1059
if (iRawlen != 13) /* length oke ? */
1060
MNG_ERROR (pData, MNG_INVALIDLENGTH);
1061
/* only allowed inside PNG or MNG */
1062
if ((pData->eSigtype != mng_it_png) && (pData->eSigtype != mng_it_mng))
1063
MNG_ERROR (pData, MNG_CHUNKNOTALLOWED);
1064
/* sequence checks */
1065
if ((pData->eSigtype == mng_it_png) && (pData->iChunkseq > 1))
1066
MNG_ERROR (pData, MNG_SEQUENCEERROR);
1068
#ifdef MNG_INCLUDE_JNG
1069
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasIDAT) || (pData->bHasJHDR))
1071
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasIDAT))
1073
MNG_ERROR (pData, MNG_SEQUENCEERROR);
1075
pData->bHasIHDR = MNG_TRUE; /* indicate IHDR is present */
1076
/* and store interesting fields */
1077
if ((!pData->bHasDHDR) || (pData->iDeltatype == MNG_DELTATYPE_NOCHANGE))
1079
pData->iDatawidth = mng_get_uint32 (pRawdata);
1080
pData->iDataheight = mng_get_uint32 (pRawdata+4);
1083
pData->iBitdepth = *(pRawdata+8);
1084
pData->iColortype = *(pRawdata+9);
1085
pData->iCompression = *(pRawdata+10);
1086
pData->iFilter = *(pRawdata+11);
1087
pData->iInterlace = *(pRawdata+12);
1089
#if defined(MNG_NO_1_2_4BIT_SUPPORT) || defined(MNG_NO_16BIT_SUPPORT)
1090
pData->iPNGmult = 1;
1091
pData->iPNGdepth = pData->iBitdepth;
1094
#ifdef MNG_NO_1_2_4BIT_SUPPORT
1095
if (pData->iBitdepth < 8)
1096
pData->iBitdepth = 8;
1099
#ifdef MNG_NO_16BIT_SUPPORT
1100
if (pData->iBitdepth > 8)
1102
pData->iBitdepth = 8;
1103
pData->iPNGmult = 2;
1107
if ((pData->iBitdepth != 8) /* parameter validity checks */
1108
#ifndef MNG_NO_1_2_4BIT_SUPPORT
1109
&& (pData->iBitdepth != 1) &&
1110
(pData->iBitdepth != 2) &&
1111
(pData->iBitdepth != 4)
1113
#ifndef MNG_NO_16BIT_SUPPORT
1114
&& (pData->iBitdepth != 16)
1117
MNG_ERROR (pData, MNG_INVALIDBITDEPTH);
1119
if ((pData->iColortype != MNG_COLORTYPE_GRAY ) &&
1120
(pData->iColortype != MNG_COLORTYPE_RGB ) &&
1121
(pData->iColortype != MNG_COLORTYPE_INDEXED) &&
1122
(pData->iColortype != MNG_COLORTYPE_GRAYA ) &&
1123
(pData->iColortype != MNG_COLORTYPE_RGBA ) )
1124
MNG_ERROR (pData, MNG_INVALIDCOLORTYPE);
1126
if ((pData->iColortype == MNG_COLORTYPE_INDEXED) && (pData->iBitdepth > 8))
1127
MNG_ERROR (pData, MNG_INVALIDBITDEPTH);
1129
if (((pData->iColortype == MNG_COLORTYPE_RGB ) ||
1130
(pData->iColortype == MNG_COLORTYPE_GRAYA ) ||
1131
(pData->iColortype == MNG_COLORTYPE_RGBA ) ) &&
1132
(pData->iBitdepth < 8 ) )
1133
MNG_ERROR (pData, MNG_INVALIDBITDEPTH);
1135
if (pData->iCompression != MNG_COMPRESSION_DEFLATE)
1136
MNG_ERROR (pData, MNG_INVALIDCOMPRESS);
1138
#if defined(FILTER192) || defined(FILTER193)
1139
if ((pData->iFilter != MNG_FILTER_ADAPTIVE ) &&
1140
#if defined(FILTER192) && defined(FILTER193)
1141
(pData->iFilter != MNG_FILTER_DIFFERING) &&
1142
(pData->iFilter != MNG_FILTER_NOFILTER ) )
1145
(pData->iFilter != MNG_FILTER_DIFFERING) )
1147
(pData->iFilter != MNG_FILTER_NOFILTER ) )
1150
MNG_ERROR (pData, MNG_INVALIDFILTER);
1153
MNG_ERROR (pData, MNG_INVALIDFILTER);
1156
if ((pData->iInterlace != MNG_INTERLACE_NONE ) &&
1157
(pData->iInterlace != MNG_INTERLACE_ADAM7) )
1158
MNG_ERROR (pData, MNG_INVALIDINTERLACE);
1160
#ifdef MNG_SUPPORT_DISPLAY
1161
#ifndef MNG_NO_DELTA_PNG
1162
if (pData->bHasDHDR) /* check the colortype for delta-images ! */
1164
mng_imagedatap pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf;
1166
if (pData->iColortype != pBuf->iColortype)
1168
if ( ( (pData->iColortype != MNG_COLORTYPE_INDEXED) ||
1169
(pBuf->iColortype == MNG_COLORTYPE_GRAY ) ) &&
1170
( (pData->iColortype != MNG_COLORTYPE_GRAY ) ||
1171
(pBuf->iColortype == MNG_COLORTYPE_INDEXED) ) )
1172
MNG_ERROR (pData, MNG_INVALIDCOLORTYPE);
1178
if (!pData->bHasheader) /* first chunk ? */
1180
pData->bHasheader = MNG_TRUE; /* we've got a header */
1181
pData->eImagetype = mng_it_png; /* then this must be a PNG */
1182
pData->iWidth = pData->iDatawidth;
1183
pData->iHeight = pData->iDataheight;
1184
/* predict alpha-depth ! */
1185
if ((pData->iColortype == MNG_COLORTYPE_GRAYA ) ||
1186
(pData->iColortype == MNG_COLORTYPE_RGBA ) )
1187
pData->iAlphadepth = pData->iBitdepth;
1189
if (pData->iColortype == MNG_COLORTYPE_INDEXED)
1190
pData->iAlphadepth = 8; /* worst case scenario */
1192
pData->iAlphadepth = 1; /* Possible tRNS cheap binary transparency */
1193
/* fits on maximum canvas ? */
1194
if ((pData->iWidth > pData->iMaxwidth) || (pData->iHeight > pData->iMaxheight))
1195
MNG_WARNING (pData, MNG_IMAGETOOLARGE);
1197
if (pData->fProcessheader) /* inform the app ? */
1198
if (!pData->fProcessheader (((mng_handle)pData), pData->iWidth, pData->iHeight))
1199
MNG_ERROR (pData, MNG_APPMISCERROR);
1202
if (!pData->bHasDHDR)
1203
pData->iImagelevel++; /* one level deeper */
1205
#ifdef MNG_SUPPORT_DISPLAY
1207
mng_retcode iRetcode = mng_process_display_ihdr (pData);
1209
if (iRetcode) /* on error bail out */
1212
#endif /* MNG_SUPPORT_DISPLAY */
1214
#ifdef MNG_STORE_CHUNKS
1215
if (pData->bStorechunks)
1216
{ /* initialize storage */
1217
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
1219
if (iRetcode) /* on error bail out */
1221
/* fill the fields */
1222
((mng_ihdrp)*ppChunk)->iWidth = mng_get_uint32 (pRawdata);
1223
((mng_ihdrp)*ppChunk)->iHeight = mng_get_uint32 (pRawdata+4);
1224
((mng_ihdrp)*ppChunk)->iBitdepth = pData->iBitdepth;
1225
((mng_ihdrp)*ppChunk)->iColortype = pData->iColortype;
1226
((mng_ihdrp)*ppChunk)->iCompression = pData->iCompression;
1227
((mng_ihdrp)*ppChunk)->iFilter = pData->iFilter;
1228
((mng_ihdrp)*ppChunk)->iInterlace = pData->iInterlace;
1230
#endif /* MNG_STORE_CHUNKS */
1232
#ifdef MNG_SUPPORT_TRACE
1233
MNG_TRACE (pData, MNG_FN_READ_IHDR, MNG_LC_END);
1236
return MNG_NOERROR; /* done */
1238
#endif /* MNG_OPTIMIZE_CHUNKREADER */
1240
/* ************************************************************************** */
1242
#ifndef MNG_OPTIMIZE_CHUNKREADER
1243
READ_CHUNK (mng_read_plte)
1245
#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS)
1247
mng_uint8p pRawdata2;
1249
#ifdef MNG_SUPPORT_DISPLAY
1250
mng_uint32 iRawlen2;
1253
#ifdef MNG_SUPPORT_TRACE
1254
MNG_TRACE (pData, MNG_FN_READ_PLTE, MNG_LC_START);
1256
/* sequence checks */
1257
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
1258
(!pData->bHasBASI) && (!pData->bHasDHDR) )
1259
MNG_ERROR (pData, MNG_SEQUENCEERROR);
1261
#ifdef MNG_INCLUDE_JNG
1262
if ((pData->bHasIDAT) || (pData->bHasJHDR))
1264
if (pData->bHasIDAT)
1266
MNG_ERROR (pData, MNG_SEQUENCEERROR);
1267
/* multiple PLTE only inside BASI */
1268
if ((pData->bHasPLTE) && (!pData->bHasBASI))
1269
MNG_ERROR (pData, MNG_MULTIPLEERROR);
1270
/* length must be multiple of 3 */
1271
if (((iRawlen % 3) != 0) || (iRawlen > 768))
1272
MNG_ERROR (pData, MNG_INVALIDLENGTH);
1274
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1275
{ /* only allowed for indexed-color or
1277
if ((pData->iColortype != 2) && (pData->iColortype != 3) && (pData->iColortype != 6))
1278
MNG_ERROR (pData, MNG_CHUNKNOTALLOWED);
1279
/* empty only allowed if global present */
1280
if ((iRawlen == 0) && (!pData->bHasglobalPLTE))
1281
MNG_ERROR (pData, MNG_CANNOTBEEMPTY);
1285
if (iRawlen == 0) /* cannot be empty as global! */
1286
MNG_ERROR (pData, MNG_CANNOTBEEMPTY);
1289
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1290
pData->bHasPLTE = MNG_TRUE; /* got it! */
1292
pData->bHasglobalPLTE = MNG_TRUE;
1294
pData->iPLTEcount = iRawlen / 3;
1296
#ifdef MNG_SUPPORT_DISPLAY
1297
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1300
mng_imagedatap pBuf;
1302
#ifndef MNG_NO_DELTA_PNG
1303
if (pData->bHasDHDR) /* processing delta-image ? */
1304
{ /* store in object 0 !!! */
1305
pImage = (mng_imagep)pData->pObjzero;
1306
pBuf = pImage->pImgbuf;
1307
pBuf->bHasPLTE = MNG_TRUE; /* it's definitely got a PLTE now */
1308
pBuf->iPLTEcount = iRawlen / 3; /* this is the exact length */
1309
pRawdata2 = pRawdata; /* copy the entries */
1311
for (iX = 0; iX < iRawlen / 3; iX++)
1313
pBuf->aPLTEentries[iX].iRed = *pRawdata2;
1314
pBuf->aPLTEentries[iX].iGreen = *(pRawdata2+1);
1315
pBuf->aPLTEentries[iX].iBlue = *(pRawdata2+2);
1322
{ /* get the current object */
1323
pImage = (mng_imagep)pData->pCurrentobj;
1325
if (!pImage) /* no object then dump it in obj 0 */
1326
pImage = (mng_imagep)pData->pObjzero;
1328
pBuf = pImage->pImgbuf; /* address the object buffer */
1329
pBuf->bHasPLTE = MNG_TRUE; /* and tell it it's got a PLTE now */
1331
if (!iRawlen) /* if empty, inherit from global */
1333
pBuf->iPLTEcount = pData->iGlobalPLTEcount;
1334
MNG_COPY (pBuf->aPLTEentries, pData->aGlobalPLTEentries,
1335
sizeof (pBuf->aPLTEentries));
1337
if (pData->bHasglobalTRNS) /* also copy global tRNS ? */
1338
{ /* indicate tRNS available */
1339
pBuf->bHasTRNS = MNG_TRUE;
1341
iRawlen2 = pData->iGlobalTRNSrawlen;
1342
pRawdata2 = (mng_uint8p)(pData->aGlobalTRNSrawdata);
1343
/* global length oke ? */
1344
if ((iRawlen2 == 0) || (iRawlen2 > pBuf->iPLTEcount))
1345
MNG_ERROR (pData, MNG_GLOBALLENGTHERR);
1347
pBuf->iTRNScount = iRawlen2;
1348
MNG_COPY (pBuf->aTRNSentries, pRawdata2, iRawlen2);
1352
{ /* store fields for future reference */
1353
pBuf->iPLTEcount = iRawlen / 3;
1354
pRawdata2 = pRawdata;
1356
for (iX = 0; iX < pBuf->iPLTEcount; iX++)
1358
pBuf->aPLTEentries[iX].iRed = *pRawdata2;
1359
pBuf->aPLTEentries[iX].iGreen = *(pRawdata2+1);
1360
pBuf->aPLTEentries[iX].iBlue = *(pRawdata2+2);
1367
else /* store as global */
1369
pData->iGlobalPLTEcount = iRawlen / 3;
1370
pRawdata2 = pRawdata;
1372
for (iX = 0; iX < pData->iGlobalPLTEcount; iX++)
1374
pData->aGlobalPLTEentries[iX].iRed = *pRawdata2;
1375
pData->aGlobalPLTEentries[iX].iGreen = *(pRawdata2+1);
1376
pData->aGlobalPLTEentries[iX].iBlue = *(pRawdata2+2);
1381
{ /* create an animation object */
1382
mng_retcode iRetcode = mng_create_ani_plte (pData, pData->iGlobalPLTEcount,
1383
pData->aGlobalPLTEentries);
1384
if (iRetcode) /* on error bail out */
1388
#endif /* MNG_SUPPORT_DISPLAY */
1390
#ifdef MNG_STORE_CHUNKS
1391
if (pData->bStorechunks)
1392
{ /* initialize storage */
1393
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
1395
if (iRetcode) /* on error bail out */
1397
/* store the fields */
1398
((mng_pltep)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
1399
((mng_pltep)*ppChunk)->iEntrycount = iRawlen / 3;
1400
pRawdata2 = pRawdata;
1402
for (iX = 0; iX < ((mng_pltep)*ppChunk)->iEntrycount; iX++)
1404
((mng_pltep)*ppChunk)->aEntries[iX].iRed = *pRawdata2;
1405
((mng_pltep)*ppChunk)->aEntries[iX].iGreen = *(pRawdata2+1);
1406
((mng_pltep)*ppChunk)->aEntries[iX].iBlue = *(pRawdata2+2);
1411
#endif /* MNG_STORE_CHUNKS */
1413
#ifdef MNG_SUPPORT_TRACE
1414
MNG_TRACE (pData, MNG_FN_READ_PLTE, MNG_LC_END);
1417
return MNG_NOERROR; /* done */
1419
#endif /* MNG_OPTIMIZE_CHUNKREADER */
1421
/* ************************************************************************** */
1423
#ifndef MNG_OPTIMIZE_CHUNKREADER
1424
READ_CHUNK (mng_read_idat)
1426
#ifdef MNG_SUPPORT_TRACE
1427
MNG_TRACE (pData, MNG_FN_READ_IDAT, MNG_LC_START);
1430
#ifdef MNG_INCLUDE_JNG /* sequence checks */
1431
if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
1433
if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR))
1435
MNG_ERROR (pData, MNG_SEQUENCEERROR);
1437
#ifdef MNG_INCLUDE_JNG
1438
if ((pData->bHasJHDR) &&
1439
(pData->iJHDRalphacompression != MNG_COMPRESSION_DEFLATE))
1440
MNG_ERROR (pData, MNG_SEQUENCEERROR);
1442
if (pData->bHasJSEP)
1443
MNG_ERROR (pData, MNG_SEQUENCEERROR);
1445
/* not allowed for deltatype NO_CHANGE */
1446
#ifndef MNG_NO_DELTA_PNG
1447
if ((pData->bHasDHDR) && ((pData->iDeltatype == MNG_DELTATYPE_NOCHANGE)))
1448
MNG_ERROR (pData, MNG_CHUNKNOTALLOWED);
1450
/* can only be empty in BASI-block! */
1451
if ((iRawlen == 0) && (!pData->bHasBASI))
1452
MNG_ERROR (pData, MNG_INVALIDLENGTH);
1453
/* indexed-color requires PLTE */
1454
if ((pData->bHasIHDR) && (pData->iColortype == 3) && (!pData->bHasPLTE))
1455
MNG_ERROR (pData, MNG_PLTEMISSING);
1457
pData->bHasIDAT = MNG_TRUE; /* got some IDAT now, don't we */
1459
#ifdef MNG_SUPPORT_DISPLAY
1461
{ /* display processing */
1462
mng_retcode iRetcode = mng_process_display_idat (pData, iRawlen, pRawdata);
1464
if (iRetcode) /* on error bail out */
1467
#endif /* MNG_SUPPORT_DISPLAY */
1469
#ifdef MNG_STORE_CHUNKS
1470
if (pData->bStorechunks)
1471
{ /* initialize storage */
1472
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
1474
if (iRetcode) /* on error bail out */
1476
/* store the fields */
1477
((mng_idatp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
1478
((mng_idatp)*ppChunk)->iDatasize = iRawlen;
1480
if (iRawlen != 0) /* is there any data ? */
1482
MNG_ALLOC (pData, ((mng_idatp)*ppChunk)->pData, iRawlen);
1483
MNG_COPY (((mng_idatp)*ppChunk)->pData, pRawdata, iRawlen);
1486
#endif /* MNG_STORE_CHUNKS */
1488
#ifdef MNG_SUPPORT_TRACE
1489
MNG_TRACE (pData, MNG_FN_READ_IDAT, MNG_LC_END);
1492
return MNG_NOERROR; /* done */
1496
/* ************************************************************************** */
1498
#ifndef MNG_OPTIMIZE_CHUNKREADER
1499
READ_CHUNK (mng_read_iend)
1501
#ifdef MNG_SUPPORT_TRACE
1502
MNG_TRACE (pData, MNG_FN_READ_IEND, MNG_LC_START);
1505
if (iRawlen > 0) /* must not contain data! */
1506
MNG_ERROR (pData, MNG_INVALIDLENGTH);
1508
#ifdef MNG_INCLUDE_JNG /* sequence checks */
1509
if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
1511
if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR))
1513
MNG_ERROR (pData, MNG_SEQUENCEERROR);
1514
/* IHDR-block requires IDAT */
1515
if ((pData->bHasIHDR) && (!pData->bHasIDAT))
1516
MNG_ERROR (pData, MNG_IDATMISSING);
1518
pData->iImagelevel--; /* one level up */
1520
#ifdef MNG_SUPPORT_DISPLAY
1521
{ /* create an animation object */
1522
mng_retcode iRetcode = mng_create_ani_image (pData);
1523
if (iRetcode) /* on error bail out */
1525
/* display processing */
1526
iRetcode = mng_process_display_iend (pData);
1527
if (iRetcode) /* on error bail out */
1530
#endif /* MNG_SUPPORT_DISPLAY */
1532
#ifdef MNG_SUPPORT_DISPLAY
1533
if (!pData->bTimerset) /* reset only if not broken !!! */
1536
/* IEND signals the end for most ... */
1537
pData->bHasIHDR = MNG_FALSE;
1538
pData->bHasBASI = MNG_FALSE;
1539
pData->bHasDHDR = MNG_FALSE;
1540
#ifdef MNG_INCLUDE_JNG
1541
pData->bHasJHDR = MNG_FALSE;
1542
pData->bHasJSEP = MNG_FALSE;
1543
pData->bHasJDAA = MNG_FALSE;
1544
pData->bHasJDAT = MNG_FALSE;
1546
pData->bHasPLTE = MNG_FALSE;
1547
pData->bHasTRNS = MNG_FALSE;
1548
pData->bHasGAMA = MNG_FALSE;
1549
pData->bHasCHRM = MNG_FALSE;
1550
pData->bHasSRGB = MNG_FALSE;
1551
pData->bHasICCP = MNG_FALSE;
1552
pData->bHasBKGD = MNG_FALSE;
1553
pData->bHasIDAT = MNG_FALSE;
1554
#ifdef MNG_SUPPORT_DISPLAY
1558
#ifdef MNG_STORE_CHUNKS
1559
if (pData->bStorechunks)
1560
{ /* initialize storage */
1561
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
1563
if (iRetcode) /* on error bail out */
1566
#endif /* MNG_STORE_CHUNKS */
1568
#ifdef MNG_SUPPORT_TRACE
1569
MNG_TRACE (pData, MNG_FN_READ_IEND, MNG_LC_END);
1572
return MNG_NOERROR; /* done */
1576
/* ************************************************************************** */
1578
#ifndef MNG_OPTIMIZE_CHUNKREADER
1579
READ_CHUNK (mng_read_trns)
1581
#ifdef MNG_SUPPORT_TRACE
1582
MNG_TRACE (pData, MNG_FN_READ_TRNS, MNG_LC_START);
1584
/* sequence checks */
1585
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
1586
(!pData->bHasBASI) && (!pData->bHasDHDR) )
1587
MNG_ERROR (pData, MNG_SEQUENCEERROR);
1589
#ifdef MNG_INCLUDE_JNG
1590
if ((pData->bHasIDAT) || (pData->bHasJHDR))
1592
if (pData->bHasIDAT)
1594
MNG_ERROR (pData, MNG_SEQUENCEERROR);
1595
/* multiple tRNS only inside BASI */
1596
if ((pData->bHasTRNS) && (!pData->bHasBASI))
1597
MNG_ERROR (pData, MNG_MULTIPLEERROR);
1599
if (iRawlen > 256) /* it just can't be bigger than that! */
1600
MNG_ERROR (pData, MNG_INVALIDLENGTH);
1602
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1603
{ /* not allowed with full alpha-channel */
1604
if ((pData->iColortype == 4) || (pData->iColortype == 6))
1605
MNG_ERROR (pData, MNG_CHUNKNOTALLOWED);
1607
if (iRawlen != 0) /* filled ? */
1608
{ /* length checks */
1609
if ((pData->iColortype == 0) && (iRawlen != 2))
1610
MNG_ERROR (pData, MNG_INVALIDLENGTH);
1612
if ((pData->iColortype == 2) && (iRawlen != 6))
1613
MNG_ERROR (pData, MNG_INVALIDLENGTH);
1615
#ifdef MNG_SUPPORT_DISPLAY
1616
if (pData->iColortype == 3)
1618
mng_imagep pImage = (mng_imagep)pData->pCurrentobj;
1619
mng_imagedatap pBuf;
1621
if (!pImage) /* no object then check obj 0 */
1622
pImage = (mng_imagep)pData->pObjzero;
1624
pBuf = pImage->pImgbuf; /* address object buffer */
1626
if (iRawlen > pBuf->iPLTEcount)
1627
MNG_ERROR (pData, MNG_INVALIDLENGTH);
1631
else /* if empty there must be global stuff! */
1633
if (!pData->bHasglobalTRNS)
1634
MNG_ERROR (pData, MNG_CANNOTBEEMPTY);
1638
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1639
pData->bHasTRNS = MNG_TRUE; /* indicate tRNS available */
1641
pData->bHasglobalTRNS = MNG_TRUE;
1643
#ifdef MNG_SUPPORT_DISPLAY
1644
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1647
mng_imagedatap pBuf;
1648
mng_uint8p pRawdata2;
1649
mng_uint32 iRawlen2;
1651
#ifndef MNG_NO_DELTA_PNG
1652
if (pData->bHasDHDR) /* processing delta-image ? */
1653
{ /* store in object 0 !!! */
1654
pImage = (mng_imagep)pData->pObjzero;
1655
pBuf = pImage->pImgbuf; /* address object buffer */
1657
switch (pData->iColortype) /* store fields for future reference */
1659
case 0: { /* gray */
1660
#if defined(MNG_NO_1_2_4BIT_SUPPORT)
1661
mng_uint8 multiplier[]={0,255,85,0,17,0,0,0,1,
1664
pBuf->iTRNSgray = mng_get_uint16 (pRawdata);
1666
pBuf->iTRNSgreen = 0;
1667
pBuf->iTRNSblue = 0;
1668
pBuf->iTRNScount = 0;
1669
#if defined(MNG_NO_1_2_4BIT_SUPPORT)
1670
pBuf->iTRNSgray *= multiplier[pData->iPNGdepth];
1672
#if defined(MNG_NO_16BIT_SUPPORT)
1673
if (pData->iPNGmult == 2)
1674
pBuf->iTRNSgray >>= 8;
1679
pBuf->iTRNSgray = 0;
1680
pBuf->iTRNSred = mng_get_uint16 (pRawdata);
1681
pBuf->iTRNSgreen = mng_get_uint16 (pRawdata+2);
1682
pBuf->iTRNSblue = mng_get_uint16 (pRawdata+4);
1683
pBuf->iTRNScount = 0;
1684
#if defined(MNG_NO_16BIT_SUPPORT)
1685
if (pData->iPNGmult == 2)
1687
pBuf->iTRNSred >>= 8;
1688
pBuf->iTRNSgreen >>= 8;
1689
pBuf->iTRNSblue >>= 8;
1694
case 3: { /* indexed */
1695
pBuf->iTRNSgray = 0;
1697
pBuf->iTRNSgreen = 0;
1698
pBuf->iTRNSblue = 0;
1699
pBuf->iTRNScount = iRawlen;
1700
MNG_COPY (pBuf->aTRNSentries, pRawdata, iRawlen);
1705
pBuf->bHasTRNS = MNG_TRUE; /* tell it it's got a tRNS now */
1709
{ /* address current object */
1710
pImage = (mng_imagep)pData->pCurrentobj;
1712
if (!pImage) /* no object then dump it in obj 0 */
1713
pImage = (mng_imagep)pData->pObjzero;
1715
pBuf = pImage->pImgbuf; /* address object buffer */
1716
pBuf->bHasTRNS = MNG_TRUE; /* and tell it it's got a tRNS now */
1718
if (iRawlen == 0) /* if empty, inherit from global */
1720
iRawlen2 = pData->iGlobalTRNSrawlen;
1721
pRawdata2 = (mng_ptr)(pData->aGlobalTRNSrawdata);
1722
/* global length oke ? */
1723
if ((pData->iColortype == 0) && (iRawlen2 != 2))
1724
MNG_ERROR (pData, MNG_GLOBALLENGTHERR);
1726
if ((pData->iColortype == 2) && (iRawlen2 != 6))
1727
MNG_ERROR (pData, MNG_GLOBALLENGTHERR);
1729
if ((pData->iColortype == 3) && ((iRawlen2 == 0) || (iRawlen2 > pBuf->iPLTEcount)))
1730
MNG_ERROR (pData, MNG_GLOBALLENGTHERR);
1735
pRawdata2 = pRawdata;
1738
switch (pData->iColortype) /* store fields for future reference */
1740
case 0: { /* gray */
1741
pBuf->iTRNSgray = mng_get_uint16 (pRawdata2);
1743
pBuf->iTRNSgreen = 0;
1744
pBuf->iTRNSblue = 0;
1745
pBuf->iTRNScount = 0;
1746
#if defined(MNG_NO_16BIT_SUPPORT)
1747
if (pData->iPNGmult == 2)
1748
pBuf->iTRNSgray >>= 8;
1753
pBuf->iTRNSgray = 0;
1754
pBuf->iTRNSred = mng_get_uint16 (pRawdata2);
1755
pBuf->iTRNSgreen = mng_get_uint16 (pRawdata2+2);
1756
pBuf->iTRNSblue = mng_get_uint16 (pRawdata2+4);
1757
pBuf->iTRNScount = 0;
1758
#if defined(MNG_NO_16BIT_SUPPORT)
1759
if (pData->iPNGmult == 2)
1761
pBuf->iTRNSred >>= 8;
1762
pBuf->iTRNSgreen >>= 8;
1763
pBuf->iTRNSblue >>= 8;
1768
case 3: { /* indexed */
1769
pBuf->iTRNSgray = 0;
1771
pBuf->iTRNSgreen = 0;
1772
pBuf->iTRNSblue = 0;
1773
pBuf->iTRNScount = iRawlen2;
1774
MNG_COPY (pBuf->aTRNSentries, pRawdata2, iRawlen2);
1780
else /* store as global */
1782
pData->iGlobalTRNSrawlen = iRawlen;
1783
MNG_COPY (pData->aGlobalTRNSrawdata, pRawdata, iRawlen);
1785
{ /* create an animation object */
1786
mng_retcode iRetcode = mng_create_ani_trns (pData, pData->iGlobalTRNSrawlen,
1787
pData->aGlobalTRNSrawdata);
1789
if (iRetcode) /* on error bail out */
1793
#endif /* MNG_SUPPORT_DISPLAY */
1795
#ifdef MNG_STORE_CHUNKS
1796
if (pData->bStorechunks)
1797
{ /* initialize storage */
1798
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
1800
if (iRetcode) /* on error bail out */
1803
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1805
((mng_trnsp)*ppChunk)->bGlobal = MNG_FALSE;
1806
((mng_trnsp)*ppChunk)->iType = pData->iColortype;
1808
if (iRawlen == 0) /* if empty, indicate so */
1809
((mng_trnsp)*ppChunk)->bEmpty = MNG_TRUE;
1812
((mng_trnsp)*ppChunk)->bEmpty = MNG_FALSE;
1814
switch (pData->iColortype) /* store fields */
1816
case 0: { /* gray */
1817
((mng_trnsp)*ppChunk)->iGray = mng_get_uint16 (pRawdata);
1821
((mng_trnsp)*ppChunk)->iRed = mng_get_uint16 (pRawdata);
1822
((mng_trnsp)*ppChunk)->iGreen = mng_get_uint16 (pRawdata+2);
1823
((mng_trnsp)*ppChunk)->iBlue = mng_get_uint16 (pRawdata+4);
1826
case 3: { /* indexed */
1827
((mng_trnsp)*ppChunk)->iCount = iRawlen;
1828
MNG_COPY (((mng_trnsp)*ppChunk)->aEntries, pRawdata, iRawlen);
1834
else /* it's global! */
1836
((mng_trnsp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
1837
((mng_trnsp)*ppChunk)->bGlobal = MNG_TRUE;
1838
((mng_trnsp)*ppChunk)->iType = 0;
1839
((mng_trnsp)*ppChunk)->iRawlen = iRawlen;
1841
MNG_COPY (((mng_trnsp)*ppChunk)->aRawdata, pRawdata, iRawlen);
1844
#endif /* MNG_STORE_CHUNKS */
1846
#ifdef MNG_SUPPORT_TRACE
1847
MNG_TRACE (pData, MNG_FN_READ_TRNS, MNG_LC_END);
1850
return MNG_NOERROR; /* done */
1854
/* ************************************************************************** */
1856
#ifndef MNG_OPTIMIZE_CHUNKREADER
1857
READ_CHUNK (mng_read_gama)
1859
#ifdef MNG_SUPPORT_TRACE
1860
MNG_TRACE (pData, MNG_FN_READ_GAMA, MNG_LC_START);
1862
/* sequence checks */
1863
#ifdef MNG_INCLUDE_JNG
1864
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
1865
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
1867
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
1868
(!pData->bHasBASI) && (!pData->bHasDHDR) )
1870
MNG_ERROR (pData, MNG_SEQUENCEERROR);
1872
#ifdef MNG_INCLUDE_JNG
1873
if ((pData->bHasIDAT) || (pData->bHasPLTE) || (pData->bHasJDAT) || (pData->bHasJDAA))
1875
if ((pData->bHasIDAT) || (pData->bHasPLTE))
1877
MNG_ERROR (pData, MNG_SEQUENCEERROR);
1879
#ifdef MNG_INCLUDE_JNG
1880
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
1882
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1884
{ /* length must be exactly 4 */
1886
MNG_ERROR (pData, MNG_INVALIDLENGTH);
1889
{ /* length must be empty or exactly 4 */
1890
if ((iRawlen != 0) && (iRawlen != 4))
1891
MNG_ERROR (pData, MNG_INVALIDLENGTH);
1894
#ifdef MNG_INCLUDE_JNG
1895
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
1897
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1899
pData->bHasGAMA = MNG_TRUE; /* indicate we've got it */
1901
pData->bHasglobalGAMA = (mng_bool)(iRawlen != 0);
1903
#ifdef MNG_SUPPORT_DISPLAY
1904
#ifdef MNG_INCLUDE_JNG
1905
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
1907
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
1912
#ifndef MNG_NO_DELTA_PNG
1913
if (pData->bHasDHDR) /* update delta image ? */
1914
{ /* store in object 0 ! */
1915
pImage = (mng_imagep)pData->pObjzero;
1916
/* store for color-processing routines */
1917
pImage->pImgbuf->iGamma = mng_get_uint32 (pRawdata);
1918
pImage->pImgbuf->bHasGAMA = MNG_TRUE;
1923
pImage = (mng_imagep)pData->pCurrentobj;
1925
if (!pImage) /* no object then dump it in obj 0 */
1926
pImage = (mng_imagep)pData->pObjzero;
1927
/* store for color-processing routines */
1928
pImage->pImgbuf->iGamma = mng_get_uint32 (pRawdata);
1929
pImage->pImgbuf->bHasGAMA = MNG_TRUE;
1933
{ /* store as global */
1935
pData->iGlobalGamma = mng_get_uint32 (pRawdata);
1937
{ /* create an animation object */
1938
mng_retcode iRetcode = mng_create_ani_gama (pData, (mng_bool)(iRawlen == 0),
1939
pData->iGlobalGamma);
1941
if (iRetcode) /* on error bail out */
1945
#endif /* MNG_SUPPORT_DISPLAY */
1947
#ifdef MNG_STORE_CHUNKS
1948
if (pData->bStorechunks)
1949
{ /* initialize storage */
1950
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
1952
if (iRetcode) /* on error bail out */
1954
/* store the fields */
1955
((mng_gamap)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
1958
((mng_gamap)*ppChunk)->iGamma = mng_get_uint32 (pRawdata);
1961
#endif /* MNG_STORE_CHUNKS */
1963
#ifdef MNG_SUPPORT_TRACE
1964
MNG_TRACE (pData, MNG_FN_READ_GAMA, MNG_LC_END);
1967
return MNG_NOERROR; /* done */
1971
/* ************************************************************************** */
1973
#ifndef MNG_OPTIMIZE_CHUNKREADER
1974
#ifndef MNG_SKIPCHUNK_cHRM
1975
READ_CHUNK (mng_read_chrm)
1977
#ifdef MNG_SUPPORT_TRACE
1978
MNG_TRACE (pData, MNG_FN_READ_CHRM, MNG_LC_START);
1980
/* sequence checks */
1981
#ifdef MNG_INCLUDE_JNG
1982
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
1983
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
1985
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
1986
(!pData->bHasBASI) && (!pData->bHasDHDR) )
1988
MNG_ERROR (pData, MNG_SEQUENCEERROR);
1990
#ifdef MNG_INCLUDE_JNG
1991
if ((pData->bHasIDAT) || (pData->bHasPLTE) || (pData->bHasJDAT) || (pData->bHasJDAA))
1993
if ((pData->bHasIDAT) || (pData->bHasPLTE))
1995
MNG_ERROR (pData, MNG_SEQUENCEERROR);
1997
#ifdef MNG_INCLUDE_JNG
1998
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
2000
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
2002
{ /* length must be exactly 32 */
2004
MNG_ERROR (pData, MNG_INVALIDLENGTH);
2007
{ /* length must be empty or exactly 32 */
2008
if ((iRawlen != 0) && (iRawlen != 32))
2009
MNG_ERROR (pData, MNG_INVALIDLENGTH);
2012
#ifdef MNG_INCLUDE_JNG
2013
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
2015
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
2017
pData->bHasCHRM = MNG_TRUE; /* indicate we've got it */
2019
pData->bHasglobalCHRM = (mng_bool)(iRawlen != 0);
2021
#ifdef MNG_SUPPORT_DISPLAY
2023
mng_uint32 iWhitepointx, iWhitepointy;
2024
mng_uint32 iPrimaryredx, iPrimaryredy;
2025
mng_uint32 iPrimarygreenx, iPrimarygreeny;
2026
mng_uint32 iPrimarybluex, iPrimarybluey;
2028
iWhitepointx = mng_get_uint32 (pRawdata);
2029
iWhitepointy = mng_get_uint32 (pRawdata+4);
2030
iPrimaryredx = mng_get_uint32 (pRawdata+8);
2031
iPrimaryredy = mng_get_uint32 (pRawdata+12);
2032
iPrimarygreenx = mng_get_uint32 (pRawdata+16);
2033
iPrimarygreeny = mng_get_uint32 (pRawdata+20);
2034
iPrimarybluex = mng_get_uint32 (pRawdata+24);
2035
iPrimarybluey = mng_get_uint32 (pRawdata+28);
2037
#ifdef MNG_INCLUDE_JNG
2038
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
2040
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
2044
mng_imagedatap pBuf;
2046
#ifndef MNG_NO_DELTA_PNG
2047
if (pData->bHasDHDR) /* update delta image ? */
2048
{ /* store it in object 0 ! */
2049
pImage = (mng_imagep)pData->pObjzero;
2051
pBuf = pImage->pImgbuf; /* address object buffer */
2052
pBuf->bHasCHRM = MNG_TRUE; /* and tell it it's got a CHRM now */
2053
/* store for color-processing routines */
2054
pBuf->iWhitepointx = iWhitepointx;
2055
pBuf->iWhitepointy = iWhitepointy;
2056
pBuf->iPrimaryredx = iPrimaryredx;
2057
pBuf->iPrimaryredy = iPrimaryredy;
2058
pBuf->iPrimarygreenx = iPrimarygreenx;
2059
pBuf->iPrimarygreeny = iPrimarygreeny;
2060
pBuf->iPrimarybluex = iPrimarybluex;
2061
pBuf->iPrimarybluey = iPrimarybluey;
2066
pImage = (mng_imagep)pData->pCurrentobj;
2068
if (!pImage) /* no object then dump it in obj 0 */
2069
pImage = (mng_imagep)pData->pObjzero;
2071
pBuf = pImage->pImgbuf; /* address object buffer */
2072
pBuf->bHasCHRM = MNG_TRUE; /* and tell it it's got a CHRM now */
2073
/* store for color-processing routines */
2074
pBuf->iWhitepointx = iWhitepointx;
2075
pBuf->iWhitepointy = iWhitepointy;
2076
pBuf->iPrimaryredx = iPrimaryredx;
2077
pBuf->iPrimaryredy = iPrimaryredy;
2078
pBuf->iPrimarygreenx = iPrimarygreenx;
2079
pBuf->iPrimarygreeny = iPrimarygreeny;
2080
pBuf->iPrimarybluex = iPrimarybluex;
2081
pBuf->iPrimarybluey = iPrimarybluey;
2085
{ /* store as global */
2088
pData->iGlobalWhitepointx = iWhitepointx;
2089
pData->iGlobalWhitepointy = iWhitepointy;
2090
pData->iGlobalPrimaryredx = iPrimaryredx;
2091
pData->iGlobalPrimaryredy = iPrimaryredy;
2092
pData->iGlobalPrimarygreenx = iPrimarygreenx;
2093
pData->iGlobalPrimarygreeny = iPrimarygreeny;
2094
pData->iGlobalPrimarybluex = iPrimarybluex;
2095
pData->iGlobalPrimarybluey = iPrimarybluey;
2098
{ /* create an animation object */
2099
mng_retcode iRetcode = mng_create_ani_chrm (pData, (mng_bool)(iRawlen == 0),
2100
iWhitepointx, iWhitepointy,
2101
iPrimaryredx, iPrimaryredy,
2102
iPrimarygreenx, iPrimarygreeny,
2103
iPrimarybluex, iPrimarybluey);
2105
if (iRetcode) /* on error bail out */
2110
#endif /* MNG_SUPPORT_DISPLAY */
2112
#ifdef MNG_STORE_CHUNKS
2113
if (pData->bStorechunks)
2114
{ /* initialize storage */
2115
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
2117
if (iRetcode) /* on error bail out */
2119
/* store the fields */
2120
((mng_chrmp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
2124
((mng_chrmp)*ppChunk)->iWhitepointx = mng_get_uint32 (pRawdata);
2125
((mng_chrmp)*ppChunk)->iWhitepointy = mng_get_uint32 (pRawdata+4);
2126
((mng_chrmp)*ppChunk)->iRedx = mng_get_uint32 (pRawdata+8);
2127
((mng_chrmp)*ppChunk)->iRedy = mng_get_uint32 (pRawdata+12);
2128
((mng_chrmp)*ppChunk)->iGreenx = mng_get_uint32 (pRawdata+16);
2129
((mng_chrmp)*ppChunk)->iGreeny = mng_get_uint32 (pRawdata+20);
2130
((mng_chrmp)*ppChunk)->iBluex = mng_get_uint32 (pRawdata+24);
2131
((mng_chrmp)*ppChunk)->iBluey = mng_get_uint32 (pRawdata+28);
2134
#endif /* MNG_STORE_CHUNKS */
2136
#ifdef MNG_SUPPORT_TRACE
2137
MNG_TRACE (pData, MNG_FN_READ_CHRM, MNG_LC_END);
2140
return MNG_NOERROR; /* done */
2145
/* ************************************************************************** */
2147
#ifndef MNG_OPTIMIZE_CHUNKREADER
2148
READ_CHUNK (mng_read_srgb)
2150
#ifdef MNG_SUPPORT_TRACE
2151
MNG_TRACE (pData, MNG_FN_READ_SRGB, MNG_LC_START);
2153
/* sequence checks */
2154
#ifdef MNG_INCLUDE_JNG
2155
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2156
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
2158
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2159
(!pData->bHasBASI) && (!pData->bHasDHDR) )
2161
MNG_ERROR (pData, MNG_SEQUENCEERROR);
2163
#ifdef MNG_INCLUDE_JNG
2164
if ((pData->bHasIDAT) || (pData->bHasPLTE) || (pData->bHasJDAT) || (pData->bHasJDAA))
2166
if ((pData->bHasIDAT) || (pData->bHasPLTE))
2168
MNG_ERROR (pData, MNG_SEQUENCEERROR);
2170
#ifdef MNG_INCLUDE_JNG
2171
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
2173
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
2175
{ /* length must be exactly 1 */
2177
MNG_ERROR (pData, MNG_INVALIDLENGTH);
2180
{ /* length must be empty or exactly 1 */
2181
if ((iRawlen != 0) && (iRawlen != 1))
2182
MNG_ERROR (pData, MNG_INVALIDLENGTH);
2185
#ifdef MNG_INCLUDE_JNG
2186
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
2188
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
2190
pData->bHasSRGB = MNG_TRUE; /* indicate we've got it */
2192
pData->bHasglobalSRGB = (mng_bool)(iRawlen != 0);
2194
#ifdef MNG_SUPPORT_DISPLAY
2195
#ifdef MNG_INCLUDE_JNG
2196
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
2198
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
2203
#ifndef MNG_NO_DELTA_PNG
2204
if (pData->bHasDHDR) /* update delta image ? */
2205
{ /* store in object 0 ! */
2206
pImage = (mng_imagep)pData->pObjzero;
2207
/* store for color-processing routines */
2208
pImage->pImgbuf->iRenderingintent = *pRawdata;
2209
pImage->pImgbuf->bHasSRGB = MNG_TRUE;
2214
pImage = (mng_imagep)pData->pCurrentobj;
2216
if (!pImage) /* no object then dump it in obj 0 */
2217
pImage = (mng_imagep)pData->pObjzero;
2218
/* store for color-processing routines */
2219
pImage->pImgbuf->iRenderingintent = *pRawdata;
2220
pImage->pImgbuf->bHasSRGB = MNG_TRUE;
2224
{ /* store as global */
2226
pData->iGlobalRendintent = *pRawdata;
2228
{ /* create an animation object */
2229
mng_retcode iRetcode = mng_create_ani_srgb (pData, (mng_bool)(iRawlen == 0),
2230
pData->iGlobalRendintent);
2232
if (iRetcode) /* on error bail out */
2236
#endif /* MNG_SUPPORT_DISPLAY */
2238
#ifdef MNG_STORE_CHUNKS
2239
if (pData->bStorechunks)
2240
{ /* initialize storage */
2241
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
2243
if (iRetcode) /* on error bail out */
2245
/* store the fields */
2246
((mng_srgbp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
2249
((mng_srgbp)*ppChunk)->iRenderingintent = *pRawdata;
2252
#endif /* MNG_STORE_CHUNKS */
2254
#ifdef MNG_SUPPORT_TRACE
2255
MNG_TRACE (pData, MNG_FN_READ_SRGB, MNG_LC_END);
2258
return MNG_NOERROR; /* done */
2262
/* ************************************************************************** */
2264
#ifndef MNG_OPTIMIZE_CHUNKREADER
2265
#ifndef MNG_SKIPCHUNK_iCCP
2266
READ_CHUNK (mng_read_iccp)
2268
mng_retcode iRetcode;
2270
mng_uint32 iCompressedsize;
2271
mng_uint32 iProfilesize;
2272
mng_uint32 iBufsize = 0;
2273
mng_uint8p pBuf = 0;
2275
#ifdef MNG_SUPPORT_TRACE
2276
MNG_TRACE (pData, MNG_FN_READ_ICCP, MNG_LC_START);
2278
/* sequence checks */
2279
#ifdef MNG_INCLUDE_JNG
2280
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2281
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
2283
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2284
(!pData->bHasBASI) && (!pData->bHasDHDR) )
2286
MNG_ERROR (pData, MNG_SEQUENCEERROR);
2288
#ifdef MNG_INCLUDE_JNG
2289
if ((pData->bHasIDAT) || (pData->bHasPLTE) || (pData->bHasJDAT) || (pData->bHasJDAA))
2291
if ((pData->bHasIDAT) || (pData->bHasPLTE))
2293
MNG_ERROR (pData, MNG_SEQUENCEERROR);
2295
#ifdef MNG_INCLUDE_JNG
2296
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
2298
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
2300
{ /* length must be at least 2 */
2302
MNG_ERROR (pData, MNG_INVALIDLENGTH);
2305
{ /* length must be empty or at least 2 */
2306
if ((iRawlen != 0) && (iRawlen < 2))
2307
MNG_ERROR (pData, MNG_INVALIDLENGTH);
2310
pTemp = find_null (pRawdata); /* find null-separator */
2311
/* not found inside input-data ? */
2312
if ((pTemp - pRawdata) > (mng_int32)iRawlen)
2313
MNG_ERROR (pData, MNG_NULLNOTFOUND);
2314
/* determine size of compressed profile */
2315
iCompressedsize = (mng_uint32)(iRawlen - (pTemp - pRawdata) - 2);
2316
/* decompress the profile */
2317
iRetcode = mng_inflate_buffer (pData, pTemp+2, iCompressedsize,
2318
&pBuf, &iBufsize, &iProfilesize);
2320
#ifdef MNG_CHECK_BAD_ICCP /* Check for bad iCCP chunk */
2321
if ((iRetcode) && (!strncmp ((char *)pRawdata, "Photoshop ICC profile", 21)))
2323
if (iRawlen == 2615) /* is it the sRGB profile ? */
2325
mng_chunk_header chunk_srgb =
2326
#ifdef MNG_OPTIMIZE_CHUNKINITFREE
2327
{MNG_UINT_sRGB, mng_init_general, mng_free_general, mng_read_srgb, mng_write_srgb, mng_assign_general, 0, 0, sizeof(mng_srgb)};
2329
{MNG_UINT_sRGB, mng_init_srgb, mng_free_srgb, mng_read_srgb, mng_write_srgb, mng_assign_srgb, 0, 0};
2331
/* pretend it's an sRGB chunk then ! */
2332
iRetcode = mng_read_srgb (pData, &chunk_srgb, 1, (mng_ptr)"0", ppChunk);
2334
if (iRetcode) /* on error bail out */
2335
{ /* don't forget to drop the temp buffer */
2336
MNG_FREEX (pData, pBuf, iBufsize);
2343
#endif /* MNG_CHECK_BAD_ICCP */
2345
if (iRetcode) /* on error bail out */
2346
{ /* don't forget to drop the temp buffer */
2347
MNG_FREEX (pData, pBuf, iBufsize);
2351
#ifdef MNG_INCLUDE_JNG
2352
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
2354
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
2356
pData->bHasICCP = MNG_TRUE; /* indicate we've got it */
2358
pData->bHasglobalICCP = (mng_bool)(iRawlen != 0);
2360
#ifdef MNG_SUPPORT_DISPLAY
2361
#ifdef MNG_INCLUDE_JNG
2362
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
2364
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
2369
#ifndef MNG_NO_DELTA_PNG
2370
if (pData->bHasDHDR) /* update delta image ? */
2371
{ /* store in object 0 ! */
2372
pImage = (mng_imagep)pData->pObjzero;
2374
if (pImage->pImgbuf->pProfile) /* profile existed ? */
2375
MNG_FREEX (pData, pImage->pImgbuf->pProfile, pImage->pImgbuf->iProfilesize);
2376
/* allocate a buffer & copy it */
2377
MNG_ALLOC (pData, pImage->pImgbuf->pProfile, iProfilesize);
2378
MNG_COPY (pImage->pImgbuf->pProfile, pBuf, iProfilesize);
2379
/* store it's length as well */
2380
pImage->pImgbuf->iProfilesize = iProfilesize;
2381
pImage->pImgbuf->bHasICCP = MNG_TRUE;
2386
pImage = (mng_imagep)pData->pCurrentobj;
2388
if (!pImage) /* no object then dump it in obj 0 */
2389
pImage = (mng_imagep)pData->pObjzero;
2391
if (pImage->pImgbuf->pProfile) /* profile existed ? */
2392
MNG_FREEX (pData, pImage->pImgbuf->pProfile, pImage->pImgbuf->iProfilesize);
2393
/* allocate a buffer & copy it */
2394
MNG_ALLOC (pData, pImage->pImgbuf->pProfile, iProfilesize);
2395
MNG_COPY (pImage->pImgbuf->pProfile, pBuf, iProfilesize);
2396
/* store it's length as well */
2397
pImage->pImgbuf->iProfilesize = iProfilesize;
2398
pImage->pImgbuf->bHasICCP = MNG_TRUE;
2402
{ /* store as global */
2403
if (iRawlen == 0) /* empty chunk ? */
2405
if (pData->pGlobalProfile) /* did we have a global profile ? */
2406
MNG_FREEX (pData, pData->pGlobalProfile, pData->iGlobalProfilesize);
2408
pData->iGlobalProfilesize = 0; /* reset to null */
2409
pData->pGlobalProfile = MNG_NULL;
2412
{ /* allocate a global buffer & copy it */
2413
MNG_ALLOC (pData, pData->pGlobalProfile, iProfilesize);
2414
MNG_COPY (pData->pGlobalProfile, pBuf, iProfilesize);
2415
/* store it's length as well */
2416
pData->iGlobalProfilesize = iProfilesize;
2419
/* create an animation object */
2420
iRetcode = mng_create_ani_iccp (pData, (mng_bool)(iRawlen == 0),
2421
pData->iGlobalProfilesize,
2422
pData->pGlobalProfile);
2424
if (iRetcode) /* on error bail out */
2427
#endif /* MNG_SUPPORT_DISPLAY */
2429
#ifdef MNG_STORE_CHUNKS
2430
if (pData->bStorechunks)
2431
{ /* initialize storage */
2432
iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
2434
if (iRetcode) /* on error bail out */
2435
{ /* don't forget to drop the temp buffer */
2436
MNG_FREEX (pData, pBuf, iBufsize);
2439
/* store the fields */
2440
((mng_iccpp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
2442
if (iRawlen) /* not empty ? */
2444
if (!pBuf) /* hasn't been unpuzzled it yet ? */
2445
{ /* find null-separator */
2446
pTemp = find_null (pRawdata);
2447
/* not found inside input-data ? */
2448
if ((pTemp - pRawdata) > (mng_int32)iRawlen)
2449
MNG_ERROR (pData, MNG_NULLNOTFOUND);
2450
/* determine size of compressed profile */
2451
iCompressedsize = iRawlen - (pTemp - pRawdata) - 2;
2452
/* decompress the profile */
2453
iRetcode = mng_inflate_buffer (pData, pTemp+2, iCompressedsize,
2454
&pBuf, &iBufsize, &iProfilesize);
2456
if (iRetcode) /* on error bail out */
2457
{ /* don't forget to drop the temp buffer */
2458
MNG_FREEX (pData, pBuf, iBufsize);
2463
((mng_iccpp)*ppChunk)->iNamesize = (mng_uint32)(pTemp - pRawdata);
2465
if (((mng_iccpp)*ppChunk)->iNamesize)
2467
MNG_ALLOC (pData, ((mng_iccpp)*ppChunk)->zName,
2468
((mng_iccpp)*ppChunk)->iNamesize + 1);
2469
MNG_COPY (((mng_iccpp)*ppChunk)->zName, pRawdata,
2470
((mng_iccpp)*ppChunk)->iNamesize);
2473
((mng_iccpp)*ppChunk)->iCompression = *(pTemp+1);
2474
((mng_iccpp)*ppChunk)->iProfilesize = iProfilesize;
2476
MNG_ALLOC (pData, ((mng_iccpp)*ppChunk)->pProfile, iProfilesize);
2477
MNG_COPY (((mng_iccpp)*ppChunk)->pProfile, pBuf, iProfilesize);
2480
#endif /* MNG_STORE_CHUNKS */
2482
if (pBuf) /* free the temporary buffer */
2483
MNG_FREEX (pData, pBuf, iBufsize);
2485
#ifdef MNG_CHECK_BAD_ICCP
2489
#ifdef MNG_SUPPORT_TRACE
2490
MNG_TRACE (pData, MNG_FN_READ_ICCP, MNG_LC_END);
2493
return MNG_NOERROR; /* done */
2498
/* ************************************************************************** */
2500
#ifndef MNG_OPTIMIZE_CHUNKREADER
2501
#ifndef MNG_SKIPCHUNK_tEXt
2502
READ_CHUNK (mng_read_text)
2504
mng_uint32 iKeywordlen, iTextlen;
2505
mng_pchar zKeyword, zText;
2508
#ifdef MNG_SUPPORT_TRACE
2509
MNG_TRACE (pData, MNG_FN_READ_TEXT, MNG_LC_START);
2511
/* sequence checks */
2512
#ifdef MNG_INCLUDE_JNG
2513
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2514
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
2516
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2517
(!pData->bHasBASI) && (!pData->bHasDHDR) )
2519
MNG_ERROR (pData, MNG_SEQUENCEERROR);
2521
if (iRawlen < 2) /* length must be at least 2 */
2522
MNG_ERROR (pData, MNG_INVALIDLENGTH);
2524
pTemp = find_null (pRawdata); /* find the null separator */
2525
/* not found inside input-data ? */
2526
if ((pTemp - pRawdata) > (mng_int32)iRawlen)
2527
MNG_ERROR (pData, MNG_NULLNOTFOUND);
2529
if (pTemp == pRawdata) /* there must be at least 1 char for keyword */
2530
MNG_ERROR (pData, MNG_KEYWORDNULL);
2532
iKeywordlen = (mng_uint32)(pTemp - pRawdata);
2533
iTextlen = iRawlen - iKeywordlen - 1;
2535
if (pData->fProcesstext) /* inform the application ? */
2539
MNG_ALLOC (pData, zKeyword, iKeywordlen + 1);
2540
MNG_COPY (zKeyword, pRawdata, iKeywordlen);
2542
MNG_ALLOCX (pData, zText, iTextlen + 1);
2544
if (!zText) /* on error bail out */
2546
MNG_FREEX (pData, zKeyword, iKeywordlen + 1);
2547
MNG_ERROR (pData, MNG_OUTOFMEMORY);
2551
MNG_COPY (zText, pTemp+1, iTextlen);
2553
bOke = pData->fProcesstext ((mng_handle)pData, MNG_TYPE_TEXT, zKeyword, zText, 0, 0);
2555
MNG_FREEX (pData, zText, iTextlen + 1);
2556
MNG_FREEX (pData, zKeyword, iKeywordlen + 1);
2559
MNG_ERROR (pData, MNG_APPMISCERROR);
2563
#ifdef MNG_STORE_CHUNKS
2564
if (pData->bStorechunks)
2565
{ /* initialize storage */
2566
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
2568
if (iRetcode) /* on error bail out */
2570
/* store the fields */
2571
((mng_textp)*ppChunk)->iKeywordsize = iKeywordlen;
2572
((mng_textp)*ppChunk)->iTextsize = iTextlen;
2576
MNG_ALLOC (pData, ((mng_textp)*ppChunk)->zKeyword, iKeywordlen+1);
2577
MNG_COPY (((mng_textp)*ppChunk)->zKeyword, pRawdata, iKeywordlen);
2582
MNG_ALLOC (pData, ((mng_textp)*ppChunk)->zText, iTextlen+1);
2583
MNG_COPY (((mng_textp)*ppChunk)->zText, pTemp+1, iTextlen);
2586
#endif /* MNG_STORE_CHUNKS */
2588
#ifdef MNG_SUPPORT_TRACE
2589
MNG_TRACE (pData, MNG_FN_READ_TEXT, MNG_LC_END);
2592
return MNG_NOERROR; /* done */
2597
/* ************************************************************************** */
2599
#ifndef MNG_OPTIMIZE_CHUNKREADER
2600
#ifndef MNG_SKIPCHUNK_zTXt
2601
READ_CHUNK (mng_read_ztxt)
2603
mng_retcode iRetcode;
2604
mng_uint32 iKeywordlen, iTextlen;
2607
mng_uint32 iCompressedsize;
2608
mng_uint32 iBufsize;
2611
#ifdef MNG_SUPPORT_TRACE
2612
MNG_TRACE (pData, MNG_FN_READ_ZTXT, MNG_LC_START);
2614
/* sequence checks */
2615
#ifdef MNG_INCLUDE_JNG
2616
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2617
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
2619
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2620
(!pData->bHasBASI) && (!pData->bHasDHDR) )
2622
MNG_ERROR (pData, MNG_SEQUENCEERROR);
2624
if (iRawlen < 3) /* length must be at least 3 */
2625
MNG_ERROR (pData, MNG_INVALIDLENGTH);
2627
pTemp = find_null (pRawdata); /* find the null separator */
2628
/* not found inside input-data ? */
2629
if ((pTemp - pRawdata) > (mng_int32)iRawlen)
2630
MNG_ERROR (pData, MNG_NULLNOTFOUND);
2632
if (pTemp == pRawdata) /* there must be at least 1 char for keyword */
2633
MNG_ERROR (pData, MNG_KEYWORDNULL);
2635
if (*(pTemp+1) != 0) /* only deflate compression-method allowed */
2636
MNG_ERROR (pData, MNG_INVALIDCOMPRESS);
2638
iKeywordlen = (mng_uint32)(pTemp - pRawdata);
2639
iCompressedsize = (mng_uint32)(iRawlen - iKeywordlen - 2);
2641
zKeyword = 0; /* there's no keyword buffer yet */
2642
pBuf = 0; /* or a temporary buffer ! */
2644
if (pData->fProcesstext) /* inform the application ? */
2645
{ /* decompress the text */
2646
iRetcode = mng_inflate_buffer (pData, pTemp+2, iCompressedsize,
2647
&pBuf, &iBufsize, &iTextlen);
2649
if (iRetcode) /* on error bail out */
2650
{ /* don't forget to drop the temp buffers */
2651
MNG_FREEX (pData, pBuf, iBufsize);
2655
MNG_ALLOCX (pData, zKeyword, iKeywordlen+1);
2657
if (!zKeyword) /* on error bail out */
2658
{ /* don't forget to drop the temp buffers */
2659
MNG_FREEX (pData, pBuf, iBufsize);
2660
MNG_ERROR (pData, MNG_OUTOFMEMORY);
2663
MNG_COPY (zKeyword, pRawdata, iKeywordlen);
2665
if (!pData->fProcesstext ((mng_handle)pData, MNG_TYPE_ZTXT, zKeyword, (mng_pchar)pBuf, 0, 0))
2666
{ /* don't forget to drop the temp buffers */
2667
MNG_FREEX (pData, pBuf, iBufsize);
2668
MNG_FREEX (pData, zKeyword, iKeywordlen+1);
2669
MNG_ERROR (pData, MNG_APPMISCERROR);
2673
#ifdef MNG_STORE_CHUNKS
2674
if (pData->bStorechunks)
2675
{ /* initialize storage */
2676
iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
2678
if (iRetcode) /* on error bail out */
2679
{ /* don't forget to drop the temp buffers */
2680
MNG_FREEX (pData, pBuf, iBufsize);
2681
MNG_FREEX (pData, zKeyword, iKeywordlen+1);
2684
/* store the fields */
2685
((mng_ztxtp)*ppChunk)->iKeywordsize = iKeywordlen;
2686
((mng_ztxtp)*ppChunk)->iCompression = *(pTemp+1);
2688
if ((!pBuf) && (iCompressedsize)) /* did we not get a text-buffer yet ? */
2689
{ /* decompress the text */
2690
iRetcode = mng_inflate_buffer (pData, pTemp+2, iCompressedsize,
2691
&pBuf, &iBufsize, &iTextlen);
2693
if (iRetcode) /* on error bail out */
2694
{ /* don't forget to drop the temp buffers */
2695
MNG_FREEX (pData, pBuf, iBufsize);
2696
MNG_FREEX (pData, zKeyword, iKeywordlen+1);
2701
MNG_ALLOCX (pData, ((mng_ztxtp)*ppChunk)->zKeyword, iKeywordlen + 1);
2702
/* on error bail out */
2703
if (!((mng_ztxtp)*ppChunk)->zKeyword)
2704
{ /* don't forget to drop the temp buffers */
2705
MNG_FREEX (pData, pBuf, iBufsize);
2706
MNG_FREEX (pData, zKeyword, iKeywordlen+1);
2707
MNG_ERROR (pData, MNG_OUTOFMEMORY);
2710
MNG_COPY (((mng_ztxtp)*ppChunk)->zKeyword, pRawdata, iKeywordlen);
2712
((mng_ztxtp)*ppChunk)->iTextsize = iTextlen;
2714
if (iCompressedsize)
2716
MNG_ALLOCX (pData, ((mng_ztxtp)*ppChunk)->zText, iTextlen + 1);
2717
/* on error bail out */
2718
if (!((mng_ztxtp)*ppChunk)->zText)
2719
{ /* don't forget to drop the temp buffers */
2720
MNG_FREEX (pData, pBuf, iBufsize);
2721
MNG_FREEX (pData, zKeyword, iKeywordlen+1);
2722
MNG_ERROR (pData, MNG_OUTOFMEMORY);
2725
MNG_COPY (((mng_ztxtp)*ppChunk)->zText, pBuf, iTextlen);
2728
#endif /* MNG_STORE_CHUNKS */
2730
MNG_FREEX (pData, pBuf, iBufsize); /* free the temporary buffers */
2731
MNG_FREEX (pData, zKeyword, iKeywordlen+1);
2733
#ifdef MNG_SUPPORT_TRACE
2734
MNG_TRACE (pData, MNG_FN_READ_ZTXT, MNG_LC_END);
2737
return MNG_NOERROR; /* done */
2742
/* ************************************************************************** */
2744
#ifndef MNG_OPTIMIZE_CHUNKREADER
2745
#ifndef MNG_SKIPCHUNK_iTXt
2746
READ_CHUNK (mng_read_itxt)
2748
mng_retcode iRetcode;
2749
mng_uint32 iKeywordlen, iTextlen, iLanguagelen, iTranslationlen;
2750
mng_pchar zKeyword, zLanguage, zTranslation;
2751
mng_uint8p pNull1, pNull2, pNull3;
2752
mng_uint32 iCompressedsize;
2753
mng_uint8 iCompressionflag;
2754
mng_uint32 iBufsize;
2757
#ifdef MNG_SUPPORT_TRACE
2758
MNG_TRACE (pData, MNG_FN_READ_ITXT, MNG_LC_START);
2760
/* sequence checks */
2761
#ifdef MNG_INCLUDE_JNG
2762
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2763
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
2765
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2766
(!pData->bHasBASI) && (!pData->bHasDHDR) )
2768
MNG_ERROR (pData, MNG_SEQUENCEERROR);
2770
if (iRawlen < 6) /* length must be at least 6 */
2771
MNG_ERROR (pData, MNG_INVALIDLENGTH);
2773
pNull1 = find_null (pRawdata); /* find the null separators */
2774
pNull2 = find_null (pNull1+3);
2775
pNull3 = find_null (pNull2+1);
2776
/* not found inside input-data ? */
2777
if (((pNull1 - pRawdata) > (mng_int32)iRawlen) ||
2778
((pNull2 - pRawdata) > (mng_int32)iRawlen) ||
2779
((pNull3 - pRawdata) > (mng_int32)iRawlen) )
2780
MNG_ERROR (pData, MNG_NULLNOTFOUND);
2782
if (pNull1 == pRawdata) /* there must be at least 1 char for keyword */
2783
MNG_ERROR (pData, MNG_KEYWORDNULL);
2784
/* compression or not ? */
2785
if ((*(pNull1+1) != 0) && (*(pNull1+1) != 1))
2786
MNG_ERROR (pData, MNG_INVALIDCOMPRESS);
2788
if (*(pNull1+2) != 0) /* only deflate compression-method allowed */
2789
MNG_ERROR (pData, MNG_INVALIDCOMPRESS);
2791
iKeywordlen = (mng_uint32)(pNull1 - pRawdata);
2792
iLanguagelen = (mng_uint32)(pNull2 - pNull1 - 3);
2793
iTranslationlen = (mng_uint32)(pNull3 - pNull2 - 1);
2794
iCompressedsize = (mng_uint32)(iRawlen - iKeywordlen - iLanguagelen - iTranslationlen - 5);
2795
iCompressionflag = *(pNull1+1);
2797
zKeyword = 0; /* no buffers acquired yet */
2803
if (pData->fProcesstext) /* inform the application ? */
2805
if (iCompressionflag) /* decompress the text ? */
2807
iRetcode = mng_inflate_buffer (pData, pNull3+1, iCompressedsize,
2808
&pBuf, &iBufsize, &iTextlen);
2810
if (iRetcode) /* on error bail out */
2811
{ /* don't forget to drop the temp buffer */
2812
MNG_FREEX (pData, pBuf, iBufsize);
2818
iTextlen = iCompressedsize;
2819
iBufsize = iTextlen+1; /* plus 1 for terminator byte!!! */
2821
MNG_ALLOC (pData, pBuf, iBufsize);
2822
MNG_COPY (pBuf, pNull3+1, iTextlen);
2825
MNG_ALLOCX (pData, zKeyword, iKeywordlen + 1);
2826
MNG_ALLOCX (pData, zLanguage, iLanguagelen + 1);
2827
MNG_ALLOCX (pData, zTranslation, iTranslationlen + 1);
2828
/* on error bail out */
2829
if ((!zKeyword) || (!zLanguage) || (!zTranslation))
2830
{ /* don't forget to drop the temp buffers */
2831
MNG_FREEX (pData, zTranslation, iTranslationlen + 1);
2832
MNG_FREEX (pData, zLanguage, iLanguagelen + 1);
2833
MNG_FREEX (pData, zKeyword, iKeywordlen + 1);
2834
MNG_FREEX (pData, pBuf, iBufsize);
2835
MNG_ERROR (pData, MNG_OUTOFMEMORY);
2838
MNG_COPY (zKeyword, pRawdata, iKeywordlen);
2839
MNG_COPY (zLanguage, pNull1+3, iLanguagelen);
2840
MNG_COPY (zTranslation, pNull2+1, iTranslationlen);
2842
if (!pData->fProcesstext ((mng_handle)pData, MNG_TYPE_ITXT, zKeyword, (mng_pchar)pBuf,
2843
zLanguage, zTranslation))
2844
{ /* don't forget to drop the temp buffers */
2845
MNG_FREEX (pData, zTranslation, iTranslationlen + 1);
2846
MNG_FREEX (pData, zLanguage, iLanguagelen + 1);
2847
MNG_FREEX (pData, zKeyword, iKeywordlen + 1);
2848
MNG_FREEX (pData, pBuf, iBufsize);
2850
MNG_ERROR (pData, MNG_APPMISCERROR);
2854
#ifdef MNG_STORE_CHUNKS
2855
if (pData->bStorechunks)
2856
{ /* initialize storage */
2857
iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
2859
if (iRetcode) /* on error bail out */
2860
{ /* don't forget to drop the temp buffers */
2861
MNG_FREEX (pData, zTranslation, iTranslationlen + 1);
2862
MNG_FREEX (pData, zLanguage, iLanguagelen + 1);
2863
MNG_FREEX (pData, zKeyword, iKeywordlen + 1);
2864
MNG_FREEX (pData, pBuf, iBufsize);
2867
/* store the fields */
2868
((mng_itxtp)*ppChunk)->iKeywordsize = iKeywordlen;
2869
((mng_itxtp)*ppChunk)->iLanguagesize = iLanguagelen;
2870
((mng_itxtp)*ppChunk)->iTranslationsize = iTranslationlen;
2871
((mng_itxtp)*ppChunk)->iCompressionflag = *(pNull1+1);
2872
((mng_itxtp)*ppChunk)->iCompressionmethod = *(pNull1+2);
2874
if ((!pBuf) && (iCompressedsize)) /* did we not get a text-buffer yet ? */
2876
if (iCompressionflag) /* decompress the text ? */
2878
iRetcode = mng_inflate_buffer (pData, pNull3+1, iCompressedsize,
2879
&pBuf, &iBufsize, &iTextlen);
2881
if (iRetcode) /* on error bail out */
2882
{ /* don't forget to drop the temp buffers */
2883
MNG_FREEX (pData, zTranslation, iTranslationlen + 1);
2884
MNG_FREEX (pData, zLanguage, iLanguagelen + 1);
2885
MNG_FREEX (pData, zKeyword, iKeywordlen + 1);
2886
MNG_FREEX (pData, pBuf, iBufsize);
2892
iTextlen = iCompressedsize;
2893
iBufsize = iTextlen+1; /* plus 1 for terminator byte!!! */
2895
MNG_ALLOC (pData, pBuf, iBufsize);
2896
MNG_COPY (pBuf, pNull3+1, iTextlen);
2900
MNG_ALLOCX (pData, ((mng_itxtp)*ppChunk)->zKeyword, iKeywordlen + 1);
2901
MNG_ALLOCX (pData, ((mng_itxtp)*ppChunk)->zLanguage, iLanguagelen + 1);
2902
MNG_ALLOCX (pData, ((mng_itxtp)*ppChunk)->zTranslation, iTranslationlen + 1);
2903
/* on error bail out */
2904
if ((!((mng_itxtp)*ppChunk)->zKeyword ) ||
2905
(!((mng_itxtp)*ppChunk)->zLanguage ) ||
2906
(!((mng_itxtp)*ppChunk)->zTranslation) )
2907
{ /* don't forget to drop the temp buffers */
2908
MNG_FREEX (pData, zTranslation, iTranslationlen + 1);
2909
MNG_FREEX (pData, zLanguage, iLanguagelen + 1);
2910
MNG_FREEX (pData, zKeyword, iKeywordlen + 1);
2911
MNG_FREEX (pData, pBuf, iBufsize);
2912
MNG_ERROR (pData, MNG_OUTOFMEMORY);
2915
MNG_COPY (((mng_itxtp)*ppChunk)->zKeyword, pRawdata, iKeywordlen);
2916
MNG_COPY (((mng_itxtp)*ppChunk)->zLanguage, pNull1+3, iLanguagelen);
2917
MNG_COPY (((mng_itxtp)*ppChunk)->zTranslation, pNull2+1, iTranslationlen);
2919
((mng_itxtp)*ppChunk)->iTextsize = iTextlen;
2923
MNG_ALLOCX (pData, ((mng_itxtp)*ppChunk)->zText, iTextlen + 1);
2925
if (!((mng_itxtp)*ppChunk)->zText)
2926
{ /* don't forget to drop the temp buffers */
2927
MNG_FREEX (pData, zTranslation, iTranslationlen + 1);
2928
MNG_FREEX (pData, zLanguage, iLanguagelen + 1);
2929
MNG_FREEX (pData, zKeyword, iKeywordlen + 1);
2930
MNG_FREEX (pData, pBuf, iBufsize);
2931
MNG_ERROR (pData, MNG_OUTOFMEMORY);
2934
MNG_COPY (((mng_itxtp)*ppChunk)->zText, pBuf, iTextlen);
2937
#endif /* MNG_STORE_CHUNKS */
2938
/* free the temporary buffers */
2939
MNG_FREEX (pData, zTranslation, iTranslationlen + 1);
2940
MNG_FREEX (pData, zLanguage, iLanguagelen + 1);
2941
MNG_FREEX (pData, zKeyword, iKeywordlen + 1);
2942
MNG_FREEX (pData, pBuf, iBufsize);
2944
#ifdef MNG_SUPPORT_TRACE
2945
MNG_TRACE (pData, MNG_FN_READ_ITXT, MNG_LC_END);
2948
return MNG_NOERROR; /* done */
2953
/* ************************************************************************** */
2955
#ifndef MNG_OPTIMIZE_CHUNKREADER
2956
#ifndef MNG_SKIPCHUNK_bKGD
2957
READ_CHUNK (mng_read_bkgd)
2959
#ifdef MNG_SUPPORT_DISPLAY
2960
mng_imagep pImage = (mng_imagep)pData->pCurrentobj;
2961
mng_imagedatap pBuf;
2964
#ifdef MNG_SUPPORT_TRACE
2965
MNG_TRACE (pData, MNG_FN_READ_BKGD, MNG_LC_START);
2967
/* sequence checks */
2968
#ifdef MNG_INCLUDE_JNG
2969
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2970
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
2972
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
2973
(!pData->bHasBASI) && (!pData->bHasDHDR) )
2975
MNG_ERROR (pData, MNG_SEQUENCEERROR);
2977
#ifdef MNG_INCLUDE_JNG
2978
if ((pData->bHasIDAT) || (pData->bHasJDAT) || (pData->bHasJDAA))
2980
if (pData->bHasIDAT)
2982
MNG_ERROR (pData, MNG_SEQUENCEERROR);
2984
if (iRawlen > 6) /* it just can't be bigger than that! */
2985
MNG_ERROR (pData, MNG_INVALIDLENGTH);
2987
#ifdef MNG_INCLUDE_JNG /* length checks */
2988
if (pData->bHasJHDR)
2990
if (((pData->iJHDRcolortype == 8) || (pData->iJHDRcolortype == 12)) && (iRawlen != 2))
2991
MNG_ERROR (pData, MNG_INVALIDLENGTH);
2993
if (((pData->iJHDRcolortype == 10) || (pData->iJHDRcolortype == 14)) && (iRawlen != 6))
2994
MNG_ERROR (pData, MNG_INVALIDLENGTH);
2997
#endif /* MNG_INCLUDE_JNG */
2998
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
3000
if (((pData->iColortype == 0) || (pData->iColortype == 4)) && (iRawlen != 2))
3001
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3003
if (((pData->iColortype == 2) || (pData->iColortype == 6)) && (iRawlen != 6))
3004
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3006
if ((pData->iColortype == 3) && (iRawlen != 1))
3007
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3011
if (iRawlen != 6) /* global is always 16-bit RGB ! */
3012
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3015
#ifdef MNG_INCLUDE_JNG
3016
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
3018
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
3020
pData->bHasBKGD = MNG_TRUE; /* indicate bKGD available */
3022
pData->bHasglobalBKGD = (mng_bool)(iRawlen != 0);
3024
#ifdef MNG_SUPPORT_DISPLAY
3025
if (!pImage) /* if no object dump it in obj 0 */
3026
pImage = (mng_imagep)pData->pObjzero;
3028
pBuf = pImage->pImgbuf; /* address object buffer */
3030
#ifdef MNG_INCLUDE_JNG
3031
if (pData->bHasJHDR)
3033
pBuf->bHasBKGD = MNG_TRUE; /* tell the object it's got bKGD now */
3035
switch (pData->iJHDRcolortype) /* store fields for future reference */
3037
case 8 : ; /* gray */
3038
case 12 : { /* graya */
3039
pBuf->iBKGDgray = mng_get_uint16 (pRawdata);
3042
case 10 : ; /* rgb */
3043
case 14 : { /* rgba */
3044
pBuf->iBKGDred = mng_get_uint16 (pRawdata);
3045
pBuf->iBKGDgreen = mng_get_uint16 (pRawdata+2);
3046
pBuf->iBKGDblue = mng_get_uint16 (pRawdata+4);
3052
#endif /* MNG_INCLUDE_JNG */
3053
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
3055
pBuf->bHasBKGD = MNG_TRUE; /* tell the object it's got bKGD now */
3057
switch (pData->iColortype) /* store fields for future reference */
3059
case 0 : ; /* gray */
3060
case 4 : { /* graya */
3061
pBuf->iBKGDgray = mng_get_uint16 (pRawdata);
3064
case 2 : ; /* rgb */
3065
case 6 : { /* rgba */
3066
pBuf->iBKGDred = mng_get_uint16 (pRawdata);
3067
pBuf->iBKGDgreen = mng_get_uint16 (pRawdata+2);
3068
pBuf->iBKGDblue = mng_get_uint16 (pRawdata+4);
3071
case 3 : { /* indexed */
3072
pBuf->iBKGDindex = *pRawdata;
3077
else /* store as global */
3081
pData->iGlobalBKGDred = mng_get_uint16 (pRawdata);
3082
pData->iGlobalBKGDgreen = mng_get_uint16 (pRawdata+2);
3083
pData->iGlobalBKGDblue = mng_get_uint16 (pRawdata+4);
3086
{ /* create an animation object */
3087
mng_retcode iRetcode = mng_create_ani_bkgd (pData, pData->iGlobalBKGDred,
3088
pData->iGlobalBKGDgreen,
3089
pData->iGlobalBKGDblue);
3091
if (iRetcode) /* on error bail out */
3095
#endif /* MNG_SUPPORT_DISPLAY */
3097
#ifdef MNG_STORE_CHUNKS
3098
if (pData->bStorechunks)
3099
{ /* initialize storage */
3100
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
3102
if (iRetcode) /* on error bail out */
3104
/* store the fields */
3105
((mng_bkgdp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
3106
((mng_bkgdp)*ppChunk)->iType = pData->iColortype;
3110
switch (iRawlen) /* guess from length */
3112
case 1 : { /* indexed */
3113
((mng_bkgdp)*ppChunk)->iType = 3;
3114
((mng_bkgdp)*ppChunk)->iIndex = *pRawdata;
3117
case 2 : { /* gray */
3118
((mng_bkgdp)*ppChunk)->iType = 0;
3119
((mng_bkgdp)*ppChunk)->iGray = mng_get_uint16 (pRawdata);
3122
case 6 : { /* rgb */
3123
((mng_bkgdp)*ppChunk)->iType = 2;
3124
((mng_bkgdp)*ppChunk)->iRed = mng_get_uint16 (pRawdata);
3125
((mng_bkgdp)*ppChunk)->iGreen = mng_get_uint16 (pRawdata+2);
3126
((mng_bkgdp)*ppChunk)->iBlue = mng_get_uint16 (pRawdata+4);
3132
#endif /* MNG_STORE_CHUNKS */
3134
#ifdef MNG_SUPPORT_TRACE
3135
MNG_TRACE (pData, MNG_FN_READ_BKGD, MNG_LC_END);
3138
return MNG_NOERROR; /* done */
3143
/* ************************************************************************** */
3145
#ifndef MNG_OPTIMIZE_CHUNKREADER
3146
#ifndef MNG_SKIPCHUNK_pHYs
3147
READ_CHUNK (mng_read_phys)
3149
#ifdef MNG_SUPPORT_TRACE
3150
MNG_TRACE (pData, MNG_FN_READ_PHYS, MNG_LC_START);
3152
/* sequence checks */
3153
#ifdef MNG_INCLUDE_JNG
3154
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
3155
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
3157
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
3158
(!pData->bHasBASI) && (!pData->bHasDHDR) )
3160
MNG_ERROR (pData, MNG_SEQUENCEERROR);
3162
#ifdef MNG_INCLUDE_JNG
3163
if ((pData->bHasIDAT) || (pData->bHasJDAT) || (pData->bHasJDAA))
3165
if (pData->bHasIDAT)
3167
MNG_ERROR (pData, MNG_SEQUENCEERROR);
3168
/* it's 9 bytes or empty; no more, no less! */
3169
if ((iRawlen != 9) && (iRawlen != 0))
3170
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3172
#ifdef MNG_SUPPORT_DISPLAY
3176
/* TODO: something !!! */
3180
#endif /* MNG_SUPPORT_DISPLAY */
3182
#ifdef MNG_STORE_CHUNKS
3183
if (pData->bStorechunks)
3184
{ /* initialize storage */
3185
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
3187
if (iRetcode) /* on error bail out */
3189
/* store the fields */
3190
((mng_physp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
3194
((mng_physp)*ppChunk)->iSizex = mng_get_uint32 (pRawdata);
3195
((mng_physp)*ppChunk)->iSizey = mng_get_uint32 (pRawdata+4);
3196
((mng_physp)*ppChunk)->iUnit = *(pRawdata+8);
3199
#endif /* MNG_STORE_CHUNKS */
3201
#ifdef MNG_SUPPORT_TRACE
3202
MNG_TRACE (pData, MNG_FN_READ_PHYS, MNG_LC_END);
3205
return MNG_NOERROR; /* done */
3210
/* ************************************************************************** */
3212
#ifndef MNG_OPTIMIZE_CHUNKREADER
3213
#ifndef MNG_SKIPCHUNK_sBIT
3214
READ_CHUNK (mng_read_sbit)
3216
#ifdef MNG_SUPPORT_TRACE
3217
MNG_TRACE (pData, MNG_FN_READ_SBIT, MNG_LC_START);
3219
/* sequence checks */
3220
#ifdef MNG_INCLUDE_JNG
3221
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
3222
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
3224
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
3225
(!pData->bHasBASI) && (!pData->bHasDHDR) )
3227
MNG_ERROR (pData, MNG_SEQUENCEERROR);
3229
#ifdef MNG_INCLUDE_JNG
3230
if ((pData->bHasPLTE) || (pData->bHasIDAT) || (pData->bHasJDAT) || (pData->bHasJDAA))
3232
if ((pData->bHasPLTE) || (pData->bHasIDAT))
3234
MNG_ERROR (pData, MNG_SEQUENCEERROR);
3236
if (iRawlen > 4) /* it just can't be bigger than that! */
3237
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3239
#ifdef MNG_INCLUDE_JNG /* length checks */
3240
if (pData->bHasJHDR)
3242
if ((pData->iJHDRcolortype == 8) && (iRawlen != 1))
3243
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3245
if ((pData->iJHDRcolortype == 10) && (iRawlen != 3))
3246
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3248
if ((pData->iJHDRcolortype == 12) && (iRawlen != 2))
3249
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3251
if ((pData->iJHDRcolortype == 14) && (iRawlen != 4))
3252
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3255
#endif /* MNG_INCLUDE_JNG */
3256
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
3258
if ((pData->iColortype == 0) && (iRawlen != 1))
3259
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3261
if ((pData->iColortype == 2) && (iRawlen != 3))
3262
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3264
if ((pData->iColortype == 3) && (iRawlen != 3))
3265
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3267
if ((pData->iColortype == 4) && (iRawlen != 2))
3268
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3270
if ((pData->iColortype == 6) && (iRawlen != 4))
3271
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3274
{ /* global = empty or RGBA */
3275
if ((iRawlen != 0) && (iRawlen != 4))
3276
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3279
#ifdef MNG_SUPPORT_DISPLAY
3283
/* TODO: something !!! */
3287
#endif /* MNG_SUPPORT_DISPLAY */
3289
#ifdef MNG_STORE_CHUNKS
3290
if (pData->bStorechunks)
3291
{ /* initialize storage */
3292
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
3294
if (iRetcode) /* on error bail out */
3296
/* store the fields */
3297
((mng_sbitp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
3301
#ifdef MNG_INCLUDE_JNG
3302
if (pData->bHasJHDR)
3303
((mng_sbitp)*ppChunk)->iType = pData->iJHDRcolortype;
3306
if (pData->bHasIHDR)
3307
((mng_sbitp)*ppChunk)->iType = pData->iColortype;
3309
((mng_sbitp)*ppChunk)->iType = 6;
3312
((mng_sbitp)*ppChunk)->aBits [0] = *pRawdata;
3314
((mng_sbitp)*ppChunk)->aBits [1] = *(pRawdata+1);
3316
((mng_sbitp)*ppChunk)->aBits [2] = *(pRawdata+2);
3318
((mng_sbitp)*ppChunk)->aBits [3] = *(pRawdata+3);
3322
#endif /* MNG_STORE_CHUNKS */
3324
#ifdef MNG_SUPPORT_TRACE
3325
MNG_TRACE (pData, MNG_FN_READ_SBIT, MNG_LC_END);
3328
return MNG_NOERROR; /* done */
3333
/* ************************************************************************** */
3335
#ifndef MNG_OPTIMIZE_CHUNKREADER
3336
#ifndef MNG_SKIPCHUNK_sPLT
3337
READ_CHUNK (mng_read_splt)
3340
mng_uint32 iNamelen;
3341
mng_uint8 iSampledepth;
3344
#ifdef MNG_SUPPORT_TRACE
3345
MNG_TRACE (pData, MNG_FN_READ_SPLT, MNG_LC_START);
3347
/* sequence checks */
3348
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
3349
(!pData->bHasBASI) && (!pData->bHasDHDR) )
3350
MNG_ERROR (pData, MNG_SEQUENCEERROR);
3352
if (pData->bHasIDAT)
3353
MNG_ERROR (pData, MNG_SEQUENCEERROR);
3357
pTemp = find_null (pRawdata); /* find null-separator */
3358
/* not found inside input-data ? */
3359
if ((pTemp - pRawdata) > (mng_int32)iRawlen)
3360
MNG_ERROR (pData, MNG_NULLNOTFOUND);
3362
iNamelen = (mng_uint32)(pTemp - pRawdata);
3363
iSampledepth = *(pTemp+1);
3364
iRemain = (iRawlen - 2 - iNamelen);
3366
if ((iSampledepth != 1) && (iSampledepth != 2))
3367
MNG_ERROR (pData, MNG_INVSAMPLEDEPTH);
3368
/* check remaining length */
3369
if ( ((iSampledepth == 1) && (iRemain % 6 != 0)) ||
3370
((iSampledepth == 2) && (iRemain % 10 != 0)) )
3371
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3382
#ifdef MNG_SUPPORT_DISPLAY
3386
/* TODO: something !!! */
3390
#endif /* MNG_SUPPORT_DISPLAY */
3392
#ifdef MNG_STORE_CHUNKS
3393
if (pData->bStorechunks)
3394
{ /* initialize storage */
3395
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
3397
if (iRetcode) /* on error bail out */
3399
/* store the fields */
3400
((mng_spltp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
3404
((mng_spltp)*ppChunk)->iNamesize = iNamelen;
3405
((mng_spltp)*ppChunk)->iSampledepth = iSampledepth;
3407
if (iSampledepth == 1)
3408
((mng_spltp)*ppChunk)->iEntrycount = iRemain / 6;
3410
((mng_spltp)*ppChunk)->iEntrycount = iRemain / 10;
3414
MNG_ALLOC (pData, ((mng_spltp)*ppChunk)->zName, iNamelen+1);
3415
MNG_COPY (((mng_spltp)*ppChunk)->zName, pRawdata, iNamelen);
3420
MNG_ALLOC (pData, ((mng_spltp)*ppChunk)->pEntries, iRemain);
3421
MNG_COPY (((mng_spltp)*ppChunk)->pEntries, pTemp+2, iRemain);
3425
#endif /* MNG_STORE_CHUNKS */
3427
#ifdef MNG_SUPPORT_TRACE
3428
MNG_TRACE (pData, MNG_FN_READ_SPLT, MNG_LC_END);
3431
return MNG_NOERROR; /* done */
3436
/* ************************************************************************** */
3438
#ifndef MNG_OPTIMIZE_CHUNKREADER
3439
#ifndef MNG_SKIPCHUNK_hIST
3440
READ_CHUNK (mng_read_hist)
3442
#ifdef MNG_SUPPORT_TRACE
3443
MNG_TRACE (pData, MNG_FN_READ_HIST, MNG_LC_START);
3445
/* sequence checks */
3446
if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR) )
3447
MNG_ERROR (pData, MNG_SEQUENCEERROR);
3449
if ((!pData->bHasPLTE) || (pData->bHasIDAT))
3450
MNG_ERROR (pData, MNG_SEQUENCEERROR);
3452
if ( ((iRawlen & 0x01) != 0) || ((iRawlen >> 1) != pData->iPLTEcount) )
3453
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3455
#ifdef MNG_SUPPORT_DISPLAY
3459
/* TODO: something !!! */
3463
#endif /* MNG_SUPPORT_DISPLAY */
3465
#ifdef MNG_STORE_CHUNKS
3466
if (pData->bStorechunks)
3469
/* initialize storage */
3470
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
3472
if (iRetcode) /* on error bail out */
3474
/* store the fields */
3475
((mng_histp)*ppChunk)->iEntrycount = iRawlen >> 1;
3477
for (iX = 0; iX < (iRawlen >> 1); iX++)
3479
((mng_histp)*ppChunk)->aEntries [iX] = mng_get_uint16 (pRawdata);
3483
#endif /* MNG_STORE_CHUNKS */
3485
#ifdef MNG_SUPPORT_TRACE
3486
MNG_TRACE (pData, MNG_FN_READ_HIST, MNG_LC_END);
3489
return MNG_NOERROR; /* done */
3494
/* ************************************************************************** */
3496
#ifndef MNG_OPTIMIZE_CHUNKREADER
3497
#ifndef MNG_SKIPCHUNK_tIME
3498
READ_CHUNK (mng_read_time)
3500
#ifdef MNG_SUPPORT_TRACE
3501
MNG_TRACE (pData, MNG_FN_READ_TIME, MNG_LC_START);
3503
/* sequence checks */
3504
#ifdef MNG_INCLUDE_JNG
3505
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
3506
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
3508
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
3509
(!pData->bHasBASI) && (!pData->bHasDHDR) )
3511
MNG_ERROR (pData, MNG_SEQUENCEERROR);
3513
if (iRawlen != 7) /* length must be exactly 7 */
3514
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3516
/* if (pData->fProcesstime) */ /* inform the application ? */
3519
pData->fProcesstime ((mng_handle)pData, );
3522
#ifdef MNG_STORE_CHUNKS
3523
if (pData->bStorechunks)
3524
{ /* initialize storage */
3525
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
3527
if (iRetcode) /* on error bail out */
3529
/* store the fields */
3530
((mng_timep)*ppChunk)->iYear = mng_get_uint16 (pRawdata);
3531
((mng_timep)*ppChunk)->iMonth = *(pRawdata+2);
3532
((mng_timep)*ppChunk)->iDay = *(pRawdata+3);
3533
((mng_timep)*ppChunk)->iHour = *(pRawdata+4);
3534
((mng_timep)*ppChunk)->iMinute = *(pRawdata+5);
3535
((mng_timep)*ppChunk)->iSecond = *(pRawdata+6);
3537
#endif /* MNG_STORE_CHUNKS */
3539
#ifdef MNG_SUPPORT_TRACE
3540
MNG_TRACE (pData, MNG_FN_READ_TIME, MNG_LC_END);
3543
return MNG_NOERROR; /* done */
3548
/* ************************************************************************** */
3550
#ifndef MNG_OPTIMIZE_CHUNKREADER
3551
READ_CHUNK (mng_read_mhdr)
3553
#ifdef MNG_SUPPORT_TRACE
3554
MNG_TRACE (pData, MNG_FN_READ_MHDR, MNG_LC_START);
3557
if (pData->eSigtype != mng_it_mng) /* sequence checks */
3558
MNG_ERROR (pData, MNG_CHUNKNOTALLOWED);
3560
if (pData->bHasheader) /* can only be the first chunk! */
3561
MNG_ERROR (pData, MNG_SEQUENCEERROR);
3562
/* correct length ? */
3563
#ifndef MNG_NO_OLD_VERSIONS
3564
if ((iRawlen != 28) && (iRawlen != 12))
3566
if ((iRawlen != 28))
3568
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3570
pData->bHasMHDR = MNG_TRUE; /* oh boy, a real MNG */
3571
pData->bHasheader = MNG_TRUE; /* we've got a header */
3572
pData->eImagetype = mng_it_mng; /* fill header fields */
3573
pData->iWidth = mng_get_uint32 (pRawdata);
3574
pData->iHeight = mng_get_uint32 (pRawdata+4);
3575
pData->iTicks = mng_get_uint32 (pRawdata+8);
3577
#ifndef MNG_NO_OLD_VERSIONS
3578
if (iRawlen == 28) /* proper MHDR ? */
3581
pData->iLayercount = mng_get_uint32 (pRawdata+12);
3582
pData->iFramecount = mng_get_uint32 (pRawdata+16);
3583
pData->iPlaytime = mng_get_uint32 (pRawdata+20);
3584
pData->iSimplicity = mng_get_uint32 (pRawdata+24);
3586
#ifndef MNG_NO_OLD_VERSIONS
3587
pData->bPreDraft48 = MNG_FALSE;
3589
else /* probably pre-draft48 then */
3591
pData->iLayercount = 0;
3592
pData->iFramecount = 0;
3593
pData->iPlaytime = 0;
3594
pData->iSimplicity = 0;
3596
pData->bPreDraft48 = MNG_TRUE;
3599
/* predict alpha-depth */
3600
if ((pData->iSimplicity & 0x00000001) == 0)
3601
#ifndef MNG_NO_16BIT_SUPPORT
3602
pData->iAlphadepth = 16; /* no indicators = assume the worst */
3604
pData->iAlphadepth = 8; /* anything else = assume the worst */
3607
if ((pData->iSimplicity & 0x00000008) == 0)
3608
pData->iAlphadepth = 0; /* no transparency at all */
3610
if ((pData->iSimplicity & 0x00000140) == 0x00000040)
3611
pData->iAlphadepth = 1; /* no semi-transparency guaranteed */
3613
#ifndef MNG_NO_16BIT_SUPPORT
3614
pData->iAlphadepth = 16; /* anything else = assume the worst */
3616
pData->iAlphadepth = 8; /* anything else = assume the worst */
3619
#ifdef MNG_INCLUDE_JNG /* can we handle the complexity ? */
3620
if (pData->iSimplicity & 0x0000FC00)
3622
if (pData->iSimplicity & 0x0000FC10)
3624
MNG_ERROR (pData, MNG_MNGTOOCOMPLEX);
3625
/* fits on maximum canvas ? */
3626
if ((pData->iWidth > pData->iMaxwidth) || (pData->iHeight > pData->iMaxheight))
3627
MNG_WARNING (pData, MNG_IMAGETOOLARGE);
3629
if (pData->fProcessheader) /* inform the app ? */
3630
if (!pData->fProcessheader (((mng_handle)pData), pData->iWidth, pData->iHeight))
3631
MNG_ERROR (pData, MNG_APPMISCERROR);
3633
pData->iImagelevel++; /* one level deeper */
3635
#ifdef MNG_STORE_CHUNKS
3636
if (pData->bStorechunks)
3637
{ /* initialize storage */
3638
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
3640
if (iRetcode) /* on error bail out */
3642
/* store the fields */
3643
((mng_mhdrp)*ppChunk)->iWidth = pData->iWidth;
3644
((mng_mhdrp)*ppChunk)->iHeight = pData->iHeight;
3645
((mng_mhdrp)*ppChunk)->iTicks = pData->iTicks;
3646
((mng_mhdrp)*ppChunk)->iLayercount = pData->iLayercount;
3647
((mng_mhdrp)*ppChunk)->iFramecount = pData->iFramecount;
3648
((mng_mhdrp)*ppChunk)->iPlaytime = pData->iPlaytime;
3649
((mng_mhdrp)*ppChunk)->iSimplicity = pData->iSimplicity;
3651
#endif /* MNG_STORE_CHUNKS */
3653
#ifdef MNG_SUPPORT_TRACE
3654
MNG_TRACE (pData, MNG_FN_READ_MHDR, MNG_LC_END);
3657
return MNG_NOERROR; /* done */
3661
/* ************************************************************************** */
3663
#ifndef MNG_OPTIMIZE_CHUNKREADER
3664
READ_CHUNK (mng_read_mend)
3666
#ifdef MNG_SUPPORT_TRACE
3667
MNG_TRACE (pData, MNG_FN_READ_MEND, MNG_LC_START);
3670
if (!pData->bHasMHDR) /* sequence checks */
3671
MNG_ERROR (pData, MNG_SEQUENCEERROR);
3673
if (iRawlen > 0) /* must not contain data! */
3674
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3676
#ifdef MNG_SUPPORT_DISPLAY
3677
{ /* do something */
3678
mng_retcode iRetcode = mng_process_display_mend (pData);
3680
if (iRetcode) /* on error bail out */
3683
if (!pData->iTotalframes) /* save totals */
3684
pData->iTotalframes = pData->iFrameseq;
3685
if (!pData->iTotallayers)
3686
pData->iTotallayers = pData->iLayerseq;
3687
if (!pData->iTotalplaytime)
3688
pData->iTotalplaytime = pData->iFrametime;
3690
#endif /* MNG_SUPPORT_DISPLAY */
3692
pData->bHasMHDR = MNG_FALSE; /* end of the line, bro! */
3694
#ifdef MNG_STORE_CHUNKS
3695
if (pData->bStorechunks)
3696
{ /* initialize storage */
3697
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
3699
if (iRetcode) /* on error bail out */
3702
#endif /* MNG_STORE_CHUNKS */
3704
#ifdef MNG_SUPPORT_TRACE
3705
MNG_TRACE (pData, MNG_FN_READ_MEND, MNG_LC_END);
3708
return MNG_NOERROR; /* done */
3712
/* ************************************************************************** */
3714
#ifndef MNG_OPTIMIZE_CHUNKREADER
3715
#ifndef MNG_SKIPCHUNK_LOOP
3716
READ_CHUNK (mng_read_loop)
3718
#ifdef MNG_SUPPORT_TRACE
3719
MNG_TRACE (pData, MNG_FN_READ_LOOP, MNG_LC_START);
3722
if (!pData->bHasMHDR) /* sequence checks */
3723
MNG_ERROR (pData, MNG_SEQUENCEERROR);
3725
if (!pData->bCacheplayback) /* must store playback info to work!! */
3726
MNG_ERROR (pData, MNG_LOOPWITHCACHEOFF);
3728
#ifdef MNG_INCLUDE_JNG
3729
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
3731
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
3733
MNG_ERROR (pData, MNG_SEQUENCEERROR);
3735
if (iRawlen >= 5) /* length checks */
3739
if ((iRawlen - 6) % 4 != 0)
3740
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3744
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3746
#ifdef MNG_SUPPORT_DISPLAY
3750
mng_uint8 iTermination = 0;
3751
mng_uint32 iItermin = 1;
3752
mng_uint32 iItermax = 0x7fffffffL;
3753
mng_retcode iRetcode;
3755
pData->bHasLOOP = MNG_TRUE; /* indicate we're inside a loop */
3757
iLevel = *pRawdata; /* determine the fields for processing */
3759
#ifndef MNG_NO_OLD_VERSIONS
3760
if (pData->bPreDraft48)
3762
iTermination = *(pRawdata+1);
3764
iRepeat = mng_get_uint32 (pRawdata+2);
3768
iRepeat = mng_get_uint32 (pRawdata+1);
3772
#ifndef MNG_NO_OLD_VERSIONS
3773
if (!pData->bPreDraft48)
3775
iTermination = *(pRawdata+5);
3779
iItermin = mng_get_uint32 (pRawdata+6);
3783
iItermax = mng_get_uint32 (pRawdata+10);
3785
/* TODO: process signals */
3790
/* create the LOOP ani-object */
3791
iRetcode = mng_create_ani_loop (pData, iLevel, iRepeat, iTermination,
3792
iItermin, iItermax, 0, 0);
3794
if (iRetcode) /* on error bail out */
3796
/* skip till matching ENDL if iteration=0 */
3797
if ((!pData->bSkipping) && (iRepeat == 0))
3798
pData->bSkipping = MNG_TRUE;
3800
#endif /* MNG_SUPPORT_DISPLAY */
3802
#ifdef MNG_STORE_CHUNKS
3803
if (pData->bStorechunks)
3804
{ /* initialize storage */
3805
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
3807
if (iRetcode) /* on error bail out */
3810
if (iRawlen >= 5) /* store the fields */
3812
((mng_loopp)*ppChunk)->iLevel = *pRawdata;
3814
#ifndef MNG_NO_OLD_VERSIONS
3815
if (pData->bPreDraft48)
3817
((mng_loopp)*ppChunk)->iTermination = *(pRawdata+1);
3818
((mng_loopp)*ppChunk)->iRepeat = mng_get_uint32 (pRawdata+2);
3823
((mng_loopp)*ppChunk)->iRepeat = mng_get_uint32 (pRawdata+1);
3828
#ifndef MNG_NO_OLD_VERSIONS
3829
if (!pData->bPreDraft48)
3831
((mng_loopp)*ppChunk)->iTermination = *(pRawdata+5);
3835
((mng_loopp)*ppChunk)->iItermin = mng_get_uint32 (pRawdata+6);
3837
#ifndef MNG_NO_LOOP_SIGNALS_SUPPORTED
3840
((mng_loopp)*ppChunk)->iItermax = mng_get_uint32 (pRawdata+10);
3841
((mng_loopp)*ppChunk)->iCount = (iRawlen - 14) / 4;
3843
if (((mng_loopp)*ppChunk)->iCount)
3845
MNG_ALLOC (pData, ((mng_loopp)*ppChunk)->pSignals,
3846
((mng_loopp)*ppChunk)->iCount << 2);
3848
#ifndef MNG_BIGENDIAN_SUPPORTED
3851
mng_uint8p pIn = pRawdata + 14;
3852
mng_uint32p pOut = (mng_uint32p)((mng_loopp)*ppChunk)->pSignals;
3854
for (iX = 0; iX < ((mng_loopp)*ppChunk)->iCount; iX++)
3856
*pOut++ = mng_get_uint32 (pIn);
3861
MNG_COPY (((mng_loopp)*ppChunk)->pSignals, pRawdata + 14,
3862
((mng_loopp)*ppChunk)->iCount << 2);
3863
#endif /* !MNG_BIGENDIAN_SUPPORTED */
3871
#endif /* MNG_STORE_CHUNKS */
3873
#ifdef MNG_SUPPORT_TRACE
3874
MNG_TRACE (pData, MNG_FN_READ_LOOP, MNG_LC_END);
3877
return MNG_NOERROR; /* done */
3882
/* ************************************************************************** */
3884
#ifndef MNG_OPTIMIZE_CHUNKREADER
3885
#ifndef MNG_SKIPCHUNK_LOOP
3886
READ_CHUNK (mng_read_endl)
3888
#ifdef MNG_SUPPORT_TRACE
3889
MNG_TRACE (pData, MNG_FN_READ_ENDL, MNG_LC_START);
3892
if (!pData->bHasMHDR) /* sequence checks */
3893
MNG_ERROR (pData, MNG_SEQUENCEERROR);
3895
#ifdef MNG_INCLUDE_JNG
3896
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
3898
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
3900
MNG_ERROR (pData, MNG_SEQUENCEERROR);
3902
if (iRawlen != 1) /* length must be exactly 1 */
3903
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3905
#ifdef MNG_SUPPORT_DISPLAY
3907
if (pData->bHasLOOP) /* are we really processing a loop ? */
3909
mng_uint8 iLevel = *pRawdata; /* get the nest level */
3910
/* create an ENDL animation object */
3911
mng_retcode iRetcode = mng_create_ani_endl (pData, iLevel);
3913
if (iRetcode) /* on error bail out */
3917
mng_ani_endlp pENDL = (mng_ani_endlp)pData->pLastaniobj;
3919
iRetcode = pENDL->sHeader.fProcess (pData, pENDL);
3921
if (iRetcode) /* on error bail out */
3926
MNG_ERROR (pData, MNG_NOMATCHINGLOOP);
3929
#endif /* MNG_SUPPORT_DISPLAY */
3931
#ifdef MNG_STORE_CHUNKS
3932
if (pData->bStorechunks)
3933
{ /* initialize storage */
3934
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
3936
if (iRetcode) /* on error bail out */
3938
/* store the fields */
3939
((mng_endlp)*ppChunk)->iLevel = *pRawdata;
3941
#endif /* MNG_STORE_CHUNKS */
3943
#ifdef MNG_SUPPORT_TRACE
3944
MNG_TRACE (pData, MNG_FN_READ_ENDL, MNG_LC_END);
3947
return MNG_NOERROR; /* done */
3952
/* ************************************************************************** */
3954
#ifndef MNG_OPTIMIZE_CHUNKREADER
3955
#ifndef MNG_SKIPCHUNK_DEFI
3956
READ_CHUNK (mng_read_defi)
3958
#ifdef MNG_SUPPORT_TRACE
3959
MNG_TRACE (pData, MNG_FN_READ_DEFI, MNG_LC_START);
3962
if (!pData->bHasMHDR) /* sequence checks */
3963
MNG_ERROR (pData, MNG_SEQUENCEERROR);
3965
#ifdef MNG_INCLUDE_JNG
3966
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
3968
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
3970
MNG_ERROR (pData, MNG_SEQUENCEERROR);
3971
/* check the length */
3972
if ((iRawlen != 2) && (iRawlen != 3) && (iRawlen != 4) &&
3973
(iRawlen != 12) && (iRawlen != 28))
3974
MNG_ERROR (pData, MNG_INVALIDLENGTH);
3976
#ifdef MNG_SUPPORT_DISPLAY
3978
mng_retcode iRetcode;
3980
pData->iDEFIobjectid = mng_get_uint16 (pRawdata);
3984
pData->bDEFIhasdonotshow = MNG_TRUE;
3985
pData->iDEFIdonotshow = *(pRawdata+2);
3989
pData->bDEFIhasdonotshow = MNG_FALSE;
3990
pData->iDEFIdonotshow = 0;
3995
pData->bDEFIhasconcrete = MNG_TRUE;
3996
pData->iDEFIconcrete = *(pRawdata+3);
4000
pData->bDEFIhasconcrete = MNG_FALSE;
4001
pData->iDEFIconcrete = 0;
4006
pData->bDEFIhasloca = MNG_TRUE;
4007
pData->iDEFIlocax = mng_get_int32 (pRawdata+4);
4008
pData->iDEFIlocay = mng_get_int32 (pRawdata+8);
4012
pData->bDEFIhasloca = MNG_FALSE;
4013
pData->iDEFIlocax = 0;
4014
pData->iDEFIlocay = 0;
4019
pData->bDEFIhasclip = MNG_TRUE;
4020
pData->iDEFIclipl = mng_get_int32 (pRawdata+12);
4021
pData->iDEFIclipr = mng_get_int32 (pRawdata+16);
4022
pData->iDEFIclipt = mng_get_int32 (pRawdata+20);
4023
pData->iDEFIclipb = mng_get_int32 (pRawdata+24);
4027
pData->bDEFIhasclip = MNG_FALSE;
4028
pData->iDEFIclipl = 0;
4029
pData->iDEFIclipr = 0;
4030
pData->iDEFIclipt = 0;
4031
pData->iDEFIclipb = 0;
4033
/* create an animation object */
4034
iRetcode = mng_create_ani_defi (pData);
4036
if (!iRetcode) /* do display processing */
4037
iRetcode = mng_process_display_defi (pData);
4039
if (iRetcode) /* on error bail out */
4043
#endif /* MNG_SUPPORT_DISPLAY */
4045
#ifdef MNG_STORE_CHUNKS
4046
if (pData->bStorechunks)
4047
{ /* initialize storage */
4048
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
4050
if (iRetcode) /* on error bail out */
4052
/* store the fields */
4053
((mng_defip)*ppChunk)->iObjectid = mng_get_uint16 (pRawdata);
4057
((mng_defip)*ppChunk)->bHasdonotshow = MNG_TRUE;
4058
((mng_defip)*ppChunk)->iDonotshow = *(pRawdata+2);
4061
((mng_defip)*ppChunk)->bHasdonotshow = MNG_FALSE;
4065
((mng_defip)*ppChunk)->bHasconcrete = MNG_TRUE;
4066
((mng_defip)*ppChunk)->iConcrete = *(pRawdata+3);
4069
((mng_defip)*ppChunk)->bHasconcrete = MNG_FALSE;
4073
((mng_defip)*ppChunk)->bHasloca = MNG_TRUE;
4074
((mng_defip)*ppChunk)->iXlocation = mng_get_int32 (pRawdata+4);
4075
((mng_defip)*ppChunk)->iYlocation = mng_get_int32 (pRawdata+8);
4078
((mng_defip)*ppChunk)->bHasloca = MNG_FALSE;
4082
((mng_defip)*ppChunk)->bHasclip = MNG_TRUE;
4083
((mng_defip)*ppChunk)->iLeftcb = mng_get_int32 (pRawdata+12);
4084
((mng_defip)*ppChunk)->iRightcb = mng_get_int32 (pRawdata+16);
4085
((mng_defip)*ppChunk)->iTopcb = mng_get_int32 (pRawdata+20);
4086
((mng_defip)*ppChunk)->iBottomcb = mng_get_int32 (pRawdata+24);
4089
((mng_defip)*ppChunk)->bHasclip = MNG_FALSE;
4092
#endif /* MNG_STORE_CHUNKS */
4094
#ifdef MNG_SUPPORT_TRACE
4095
MNG_TRACE (pData, MNG_FN_READ_DEFI, MNG_LC_END);
4098
return MNG_NOERROR; /* done */
4103
/* ************************************************************************** */
4105
#ifndef MNG_OPTIMIZE_CHUNKREADER
4106
#ifndef MNG_SKIPCHUNK_BASI
4107
READ_CHUNK (mng_read_basi)
4109
#ifdef MNG_SUPPORT_TRACE
4110
MNG_TRACE (pData, MNG_FN_READ_BASI, MNG_LC_START);
4113
if (!pData->bHasMHDR) /* sequence checks */
4114
MNG_ERROR (pData, MNG_SEQUENCEERROR);
4116
#ifdef MNG_INCLUDE_JNG
4117
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
4119
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
4121
MNG_ERROR (pData, MNG_SEQUENCEERROR);
4122
/* check the length */
4123
if ((iRawlen != 13) && (iRawlen != 19) && (iRawlen != 21) && (iRawlen != 22))
4124
MNG_ERROR (pData, MNG_INVALIDLENGTH);
4126
pData->bHasBASI = MNG_TRUE; /* inside a BASI-IEND block now */
4127
/* store interesting fields */
4128
pData->iDatawidth = mng_get_uint32 (pRawdata);
4129
pData->iDataheight = mng_get_uint32 (pRawdata+4);
4130
pData->iBitdepth = *(pRawdata+8);
4131
pData->iColortype = *(pRawdata+9);
4132
pData->iCompression = *(pRawdata+10);
4133
pData->iFilter = *(pRawdata+11);
4134
pData->iInterlace = *(pRawdata+12);
4137
#if defined(MNG_NO_1_2_4BIT_SUPPORT) || defined(MNG_NO_16BIT_SUPPORT)
4138
pData->iPNGmult = 1;
4139
pData->iPNGdepth = pData->iBitdepth;
4142
#ifdef MNG_NO_1_2_4BIT_SUPPORT
4143
if (pData->iBitdepth < 8)
4144
pData->iBitdepth = 8;
4146
#ifdef MNG_NO_16BIT_SUPPORT
4147
if (pData->iBitdepth > 8)
4149
pData->iBitdepth = 8;
4150
pData->iPNGmult = 2;
4154
if ((pData->iBitdepth != 8) /* parameter validity checks */
4155
#ifndef MNG_NO_1_2_4BIT_SUPPORT
4156
&& (pData->iBitdepth != 1) &&
4157
(pData->iBitdepth != 2) &&
4158
(pData->iBitdepth != 4)
4160
#ifndef MNG_NO_16BIT_SUPPORT
4161
&& (pData->iBitdepth != 16)
4164
MNG_ERROR (pData, MNG_INVALIDBITDEPTH);
4166
if ((pData->iColortype != MNG_COLORTYPE_GRAY ) &&
4167
(pData->iColortype != MNG_COLORTYPE_RGB ) &&
4168
(pData->iColortype != MNG_COLORTYPE_INDEXED) &&
4169
(pData->iColortype != MNG_COLORTYPE_GRAYA ) &&
4170
(pData->iColortype != MNG_COLORTYPE_RGBA ) )
4171
MNG_ERROR (pData, MNG_INVALIDCOLORTYPE);
4173
if ((pData->iColortype == MNG_COLORTYPE_INDEXED) && (pData->iBitdepth > 8))
4174
MNG_ERROR (pData, MNG_INVALIDBITDEPTH);
4176
if (((pData->iColortype == MNG_COLORTYPE_RGB ) ||
4177
(pData->iColortype == MNG_COLORTYPE_GRAYA ) ||
4178
(pData->iColortype == MNG_COLORTYPE_RGBA ) ) &&
4179
(pData->iBitdepth < 8 ) )
4180
MNG_ERROR (pData, MNG_INVALIDBITDEPTH);
4182
if (pData->iCompression != MNG_COMPRESSION_DEFLATE)
4183
MNG_ERROR (pData, MNG_INVALIDCOMPRESS);
4185
#if defined(FILTER192) || defined(FILTER193)
4186
if ((pData->iFilter != MNG_FILTER_ADAPTIVE ) &&
4187
#if defined(FILTER192) && defined(FILTER193)
4188
(pData->iFilter != MNG_FILTER_DIFFERING) &&
4189
(pData->iFilter != MNG_FILTER_NOFILTER ) )
4192
(pData->iFilter != MNG_FILTER_DIFFERING) )
4194
(pData->iFilter != MNG_FILTER_NOFILTER ) )
4197
MNG_ERROR (pData, MNG_INVALIDFILTER);
4200
MNG_ERROR (pData, MNG_INVALIDFILTER);
4203
if ((pData->iInterlace != MNG_INTERLACE_NONE ) &&
4204
(pData->iInterlace != MNG_INTERLACE_ADAM7) )
4205
MNG_ERROR (pData, MNG_INVALIDINTERLACE);
4207
pData->iImagelevel++; /* one level deeper */
4209
#ifdef MNG_SUPPORT_DISPLAY
4211
mng_uint16 iRed = 0;
4212
mng_uint16 iGreen = 0;
4213
mng_uint16 iBlue = 0;
4214
mng_bool bHasalpha = MNG_FALSE;
4215
mng_uint16 iAlpha = 0xFFFF;
4216
mng_uint8 iViewable = 0;
4217
mng_retcode iRetcode;
4219
if (iRawlen > 13) /* get remaining fields, if any */
4221
iRed = mng_get_uint16 (pRawdata+13);
4222
iGreen = mng_get_uint16 (pRawdata+15);
4223
iBlue = mng_get_uint16 (pRawdata+17);
4228
bHasalpha = MNG_TRUE;
4229
iAlpha = mng_get_uint16 (pRawdata+19);
4233
iViewable = *(pRawdata+21);
4234
/* create an animation object */
4235
iRetcode = mng_create_ani_basi (pData, iRed, iGreen, iBlue,
4236
bHasalpha, iAlpha, iViewable);
4238
if (!iRetcode) /* display-processing... */
4239
iRetcode = mng_process_display_basi (pData, iRed, iGreen, iBlue,
4240
bHasalpha, iAlpha, iViewable);
4242
if (iRetcode) /* on error bail out */
4246
#endif /* MNG_SUPPORT_DISPLAY */
4248
#ifdef MNG_STORE_CHUNKS
4249
if (pData->bStorechunks)
4250
{ /* initialize storage */
4251
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
4253
if (iRetcode) /* on error bail out */
4255
/* store the fields */
4256
((mng_basip)*ppChunk)->iWidth = mng_get_uint32 (pRawdata);
4257
((mng_basip)*ppChunk)->iHeight = mng_get_uint32 (pRawdata+4);
4258
#ifdef MNG_NO_16BIT_SUPPORT
4259
if (*(pRawdata+8) > 8)
4260
((mng_basip)*ppChunk)->iBitdepth = 8;
4263
((mng_basip)*ppChunk)->iBitdepth = *(pRawdata+8);
4264
((mng_basip)*ppChunk)->iColortype = *(pRawdata+9);
4265
((mng_basip)*ppChunk)->iCompression = *(pRawdata+10);
4266
((mng_basip)*ppChunk)->iFilter = *(pRawdata+11);
4267
((mng_basip)*ppChunk)->iInterlace = *(pRawdata+12);
4271
((mng_basip)*ppChunk)->iRed = mng_get_uint16 (pRawdata+13);
4272
((mng_basip)*ppChunk)->iGreen = mng_get_uint16 (pRawdata+15);
4273
((mng_basip)*ppChunk)->iBlue = mng_get_uint16 (pRawdata+17);
4277
((mng_basip)*ppChunk)->iAlpha = mng_get_uint16 (pRawdata+19);
4280
((mng_basip)*ppChunk)->iViewable = *(pRawdata+21);
4283
#endif /* MNG_STORE_CHUNKS */
4285
#ifdef MNG_SUPPORT_TRACE
4286
MNG_TRACE (pData, MNG_FN_READ_BASI, MNG_LC_END);
4289
return MNG_NOERROR; /* done */
4294
/* ************************************************************************** */
4296
#ifndef MNG_OPTIMIZE_CHUNKREADER
4297
#ifndef MNG_SKIPCHUNK_CLON
4298
READ_CHUNK (mng_read_clon)
4300
#ifdef MNG_SUPPORT_TRACE
4301
MNG_TRACE (pData, MNG_FN_READ_CLON, MNG_LC_START);
4304
if (!pData->bHasMHDR) /* sequence checks */
4305
MNG_ERROR (pData, MNG_SEQUENCEERROR);
4307
#ifdef MNG_INCLUDE_JNG
4308
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
4310
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
4312
MNG_ERROR (pData, MNG_SEQUENCEERROR);
4313
/* check the length */
4314
if ((iRawlen != 4) && (iRawlen != 5) && (iRawlen != 6) &&
4315
(iRawlen != 7) && (iRawlen != 16))
4316
MNG_ERROR (pData, MNG_INVALIDLENGTH);
4318
#ifdef MNG_SUPPORT_DISPLAY
4320
mng_uint16 iSourceid, iCloneid;
4321
mng_uint8 iClonetype = 0;
4322
mng_bool bHasdonotshow = MNG_FALSE;
4323
mng_uint8 iDonotshow = 0;
4324
mng_uint8 iConcrete = 0;
4325
mng_bool bHasloca = MNG_FALSE;
4326
mng_uint8 iLocationtype = 0;
4327
mng_int32 iLocationx = 0;
4328
mng_int32 iLocationy = 0;
4329
mng_retcode iRetcode;
4331
iSourceid = mng_get_uint16 (pRawdata);
4332
iCloneid = mng_get_uint16 (pRawdata+2);
4335
iClonetype = *(pRawdata+4);
4339
bHasdonotshow = MNG_TRUE;
4340
iDonotshow = *(pRawdata+5);
4344
iConcrete = *(pRawdata+6);
4348
bHasloca = MNG_TRUE;
4349
iLocationtype = *(pRawdata+7);
4350
iLocationx = mng_get_int32 (pRawdata+8);
4351
iLocationy = mng_get_int32 (pRawdata+12);
4354
iRetcode = mng_create_ani_clon (pData, iSourceid, iCloneid, iClonetype,
4355
bHasdonotshow, iDonotshow, iConcrete,
4356
bHasloca, iLocationtype, iLocationx, iLocationy);
4358
if (!iRetcode) /* do display processing */
4359
iRetcode = mng_process_display_clon (pData, iSourceid, iCloneid, iClonetype,
4360
bHasdonotshow, iDonotshow, iConcrete,
4361
bHasloca, iLocationtype, iLocationx,
4364
if (iRetcode) /* on error bail out */
4368
#endif /* MNG_SUPPORT_DISPLAY */
4370
#ifdef MNG_STORE_CHUNKS
4371
if (pData->bStorechunks)
4372
{ /* initialize storage */
4373
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
4375
if (iRetcode) /* on error bail out */
4377
/* store the fields */
4378
((mng_clonp)*ppChunk)->iSourceid = mng_get_uint16 (pRawdata);
4379
((mng_clonp)*ppChunk)->iCloneid = mng_get_uint16 (pRawdata+2);
4382
((mng_clonp)*ppChunk)->iClonetype = *(pRawdata+4);
4385
((mng_clonp)*ppChunk)->iDonotshow = *(pRawdata+5);
4388
((mng_clonp)*ppChunk)->iConcrete = *(pRawdata+6);
4392
((mng_clonp)*ppChunk)->bHasloca = MNG_TRUE;
4393
((mng_clonp)*ppChunk)->iLocationtype = *(pRawdata+7);
4394
((mng_clonp)*ppChunk)->iLocationx = mng_get_int32 (pRawdata+8);
4395
((mng_clonp)*ppChunk)->iLocationy = mng_get_int32 (pRawdata+12);
4399
((mng_clonp)*ppChunk)->bHasloca = MNG_FALSE;
4402
#endif /* MNG_STORE_CHUNKS */
4404
#ifdef MNG_SUPPORT_TRACE
4405
MNG_TRACE (pData, MNG_FN_READ_CLON, MNG_LC_END);
4408
return MNG_NOERROR; /* done */
4413
/* ************************************************************************** */
4415
#ifndef MNG_OPTIMIZE_CHUNKREADER
4416
#ifndef MNG_SKIPCHUNK_PAST
4417
READ_CHUNK (mng_read_past)
4419
#if defined(MNG_STORE_CHUNKS) || defined(MNG_SUPPORT_DISPLAY)
4420
mng_retcode iRetcode;
4421
mng_uint16 iTargetid;
4422
mng_uint8 iTargettype;
4429
mng_past_sourcep pSource;
4432
#ifdef MNG_SUPPORT_TRACE
4433
MNG_TRACE (pData, MNG_FN_READ_PAST, MNG_LC_START);
4436
if (!pData->bHasMHDR) /* sequence checks */
4437
MNG_ERROR (pData, MNG_SEQUENCEERROR);
4439
#ifdef MNG_INCLUDE_JNG
4440
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
4442
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
4444
MNG_ERROR (pData, MNG_SEQUENCEERROR);
4446
/* check the length */
4447
if ((iRawlen < 41) || (((iRawlen - 11) % 30) != 0))
4448
MNG_ERROR (pData, MNG_INVALIDLENGTH);
4450
#if defined(MNG_STORE_CHUNKS) || defined(MNG_SUPPORT_DISPLAY)
4451
iTargetid = mng_get_uint16 (pRawdata);
4452
iTargettype = *(pRawdata+2);
4453
iTargetx = mng_get_int32 (pRawdata+3);
4454
iTargety = mng_get_int32 (pRawdata+7);
4455
iCount = ((iRawlen - 11) / 30); /* how many entries again? */
4456
iSize = iCount * sizeof (mng_past_source);
4459
/* get a buffer for all the source blocks */
4460
MNG_ALLOC (pData, pSources, iSize);
4462
pSource = (mng_past_sourcep)pSources;
4464
for (iX = 0; iX < iCount; iX++) /* now copy the source blocks */
4466
pSource->iSourceid = mng_get_uint16 (pRawdata);
4467
pSource->iComposition = *(pRawdata+2);
4468
pSource->iOrientation = *(pRawdata+3);
4469
pSource->iOffsettype = *(pRawdata+4);
4470
pSource->iOffsetx = mng_get_int32 (pRawdata+5);
4471
pSource->iOffsety = mng_get_int32 (pRawdata+9);
4472
pSource->iBoundarytype = *(pRawdata+13);
4473
pSource->iBoundaryl = mng_get_int32 (pRawdata+14);
4474
pSource->iBoundaryr = mng_get_int32 (pRawdata+18);
4475
pSource->iBoundaryt = mng_get_int32 (pRawdata+22);
4476
pSource->iBoundaryb = mng_get_int32 (pRawdata+26);
4483
#ifdef MNG_SUPPORT_DISPLAY
4484
{ /* create playback object */
4485
iRetcode = mng_create_ani_past (pData, iTargetid, iTargettype, iTargetx,
4486
iTargety, iCount, pSources);
4488
if (!iRetcode) /* do display processing */
4489
iRetcode = mng_process_display_past (pData, iTargetid, iTargettype, iTargetx,
4490
iTargety, iCount, pSources);
4492
if (iRetcode) /* on error bail out */
4494
MNG_FREEX (pData, pSources, iSize);
4498
#endif /* MNG_SUPPORT_DISPLAY */
4500
#ifdef MNG_STORE_CHUNKS
4501
if (pData->bStorechunks)
4502
{ /* initialize storage */
4503
iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
4505
if (iRetcode) /* on error bail out */
4507
MNG_FREEX (pData, pSources, iSize);
4510
/* store the fields */
4511
((mng_pastp)*ppChunk)->iDestid = iTargetid;
4512
((mng_pastp)*ppChunk)->iTargettype = iTargettype;
4513
((mng_pastp)*ppChunk)->iTargetx = iTargetx;
4514
((mng_pastp)*ppChunk)->iTargety = iTargety;
4515
((mng_pastp)*ppChunk)->iCount = iCount;
4516
/* get a buffer & copy the source blocks */
4517
MNG_ALLOC (pData, ((mng_pastp)*ppChunk)->pSources, iSize);
4518
MNG_COPY (((mng_pastp)*ppChunk)->pSources, pSources, iSize);
4520
#endif /* MNG_STORE_CHUNKS */
4522
#if defined(MNG_STORE_CHUNKS) || defined(MNG_SUPPORT_DISPLAY)
4523
/* free the source block buffer */
4524
MNG_FREEX (pData, pSources, iSize);
4527
#ifdef MNG_SUPPORT_TRACE
4528
MNG_TRACE (pData, MNG_FN_READ_PAST, MNG_LC_END);
4531
return MNG_NOERROR; /* done */
4536
/* ************************************************************************** */
4538
#ifndef MNG_OPTIMIZE_CHUNKREADER
4539
#ifndef MNG_SKIPCHUNK_DISC
4540
READ_CHUNK (mng_read_disc)
4542
#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS)
4544
mng_uint16p pIds = MNG_NULL;
4545
mng_retcode iRetcode;
4548
#ifdef MNG_SUPPORT_TRACE
4549
MNG_TRACE (pData, MNG_FN_READ_DISC, MNG_LC_START);
4552
if (!pData->bHasMHDR) /* sequence checks */
4553
MNG_ERROR (pData, MNG_SEQUENCEERROR);
4555
#ifdef MNG_INCLUDE_JNG
4556
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
4558
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
4560
MNG_ERROR (pData, MNG_SEQUENCEERROR);
4562
if ((iRawlen % 2) != 0) /* check the length */
4563
MNG_ERROR (pData, MNG_INVALIDLENGTH);
4565
#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS)
4566
iCount = (iRawlen / sizeof (mng_uint16));
4570
MNG_ALLOC (pData, pIds, iRawlen);
4572
#ifndef MNG_BIGENDIAN_SUPPORTED
4575
mng_uint8p pIn = pRawdata;
4576
mng_uint16p pOut = pIds;
4578
for (iX = 0; iX < iCount; iX++)
4580
*pOut++ = mng_get_uint16 (pIn);
4585
MNG_COPY (pIds, pRawdata, iRawlen);
4586
#endif /* !MNG_BIGENDIAN_SUPPORTED */
4590
#ifdef MNG_SUPPORT_DISPLAY
4591
{ /* create playback object */
4592
iRetcode = mng_create_ani_disc (pData, iCount, pIds);
4594
if (iRetcode) /* on error bail out */
4596
/* now process it */
4597
iRetcode = mng_process_display_disc (pData, iCount, pIds);
4599
if (iRetcode) /* on error bail out */
4602
#endif /* MNG_SUPPORT_DISPLAY */
4604
#ifdef MNG_STORE_CHUNKS
4605
if (pData->bStorechunks)
4606
{ /* initialize storage */
4607
iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
4609
if (iRetcode) /* on error bail out */
4611
/* store the fields */
4612
((mng_discp)*ppChunk)->iCount = iCount;
4616
MNG_ALLOC (pData, ((mng_discp)*ppChunk)->pObjectids, iRawlen);
4617
MNG_COPY (((mng_discp)*ppChunk)->pObjectids, pIds, iRawlen);
4620
#endif /* MNG_STORE_CHUNKS */
4622
#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS)
4624
MNG_FREEX (pData, pIds, iRawlen);
4627
#ifdef MNG_SUPPORT_TRACE
4628
MNG_TRACE (pData, MNG_FN_READ_DISC, MNG_LC_END);
4631
return MNG_NOERROR; /* done */
4636
/* ************************************************************************** */
4638
#ifndef MNG_OPTIMIZE_CHUNKREADER
4639
#ifndef MNG_SKIPCHUNK_BACK
4640
READ_CHUNK (mng_read_back)
4642
#ifdef MNG_SUPPORT_TRACE
4643
MNG_TRACE (pData, MNG_FN_READ_BACK, MNG_LC_START);
4646
if (!pData->bHasMHDR) /* sequence checks */
4647
MNG_ERROR (pData, MNG_SEQUENCEERROR);
4649
#ifdef MNG_INCLUDE_JNG
4650
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
4652
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
4654
MNG_ERROR (pData, MNG_SEQUENCEERROR);
4655
/* check the length */
4656
if ((iRawlen != 6) && (iRawlen != 7) && (iRawlen != 9) && (iRawlen != 10))
4657
MNG_ERROR (pData, MNG_INVALIDLENGTH);
4659
#ifdef MNG_SUPPORT_DISPLAY
4661
mng_retcode iRetcode;
4662
/* retrieve the fields */
4663
pData->bHasBACK = MNG_TRUE;
4664
pData->iBACKred = mng_get_uint16 (pRawdata);
4665
pData->iBACKgreen = mng_get_uint16 (pRawdata+2);
4666
pData->iBACKblue = mng_get_uint16 (pRawdata+4);
4669
pData->iBACKmandatory = *(pRawdata+6);
4671
pData->iBACKmandatory = 0;
4674
pData->iBACKimageid = mng_get_uint16 (pRawdata+7);
4676
pData->iBACKimageid = 0;
4679
pData->iBACKtile = *(pRawdata+9);
4681
pData->iBACKtile = 0;
4683
iRetcode = mng_create_ani_back (pData, pData->iBACKred, pData->iBACKgreen,
4684
pData->iBACKblue, pData->iBACKmandatory,
4685
pData->iBACKimageid, pData->iBACKtile);
4687
if (iRetcode) /* on error bail out */
4690
#endif /* MNG_SUPPORT_DISPLAY */
4692
#ifdef MNG_STORE_CHUNKS
4693
if (pData->bStorechunks)
4694
{ /* initialize storage */
4695
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
4697
if (iRetcode) /* on error bail out */
4699
/* store the fields */
4700
((mng_backp)*ppChunk)->iRed = mng_get_uint16 (pRawdata);
4701
((mng_backp)*ppChunk)->iGreen = mng_get_uint16 (pRawdata+2);
4702
((mng_backp)*ppChunk)->iBlue = mng_get_uint16 (pRawdata+4);
4705
((mng_backp)*ppChunk)->iMandatory = *(pRawdata+6);
4708
((mng_backp)*ppChunk)->iImageid = mng_get_uint16 (pRawdata+7);
4711
((mng_backp)*ppChunk)->iTile = *(pRawdata+9);
4714
#endif /* MNG_STORE_CHUNKS */
4716
#ifdef MNG_SUPPORT_TRACE
4717
MNG_TRACE (pData, MNG_FN_READ_BACK, MNG_LC_END);
4720
return MNG_NOERROR; /* done */
4725
/* ************************************************************************** */
4727
#ifndef MNG_OPTIMIZE_CHUNKREADER
4728
#ifndef MNG_SKIPCHUNK_FRAM
4729
READ_CHUNK (mng_read_fram)
4732
#ifdef MNG_STORE_CHUNKS
4733
mng_uint32 iNamelen;
4736
mng_uint32 iRequired = 0;
4738
#ifdef MNG_SUPPORT_TRACE
4739
MNG_TRACE (pData, MNG_FN_READ_FRAM, MNG_LC_START);
4742
if (!pData->bHasMHDR) /* sequence checks */
4743
MNG_ERROR (pData, MNG_SEQUENCEERROR);
4745
#ifdef MNG_INCLUDE_JNG
4746
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
4748
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
4750
MNG_ERROR (pData, MNG_SEQUENCEERROR);
4752
if (iRawlen <= 1) /* only framing-mode ? */
4754
#ifdef MNG_STORE_CHUNKS
4755
iNamelen = 0; /* indicate so */
4762
pTemp = find_null (pRawdata+1); /* find null-separator */
4763
/* not found inside input-data ? */
4764
if ((pTemp - pRawdata) > (mng_int32)iRawlen)
4765
pTemp = pRawdata + iRawlen; /* than remainder is name */
4767
#ifdef MNG_STORE_CHUNKS
4768
iNamelen = (mng_uint32)((pTemp - pRawdata) - 1);
4770
iRemain = (mng_uint32)(iRawlen - (pTemp - pRawdata));
4772
if (iRemain) /* if there is remaining data it's less 1 byte */
4775
if ((iRemain) && (iRemain < 4)) /* remains must be empty or at least 4 bytes */
4776
MNG_ERROR (pData, MNG_INVALIDLENGTH);
4780
iRequired = 4; /* calculate and check required remaining length */
4782
if (*(pTemp+1)) { iRequired += 4; }
4783
if (*(pTemp+2)) { iRequired += 4; }
4784
if (*(pTemp+3)) { iRequired += 17; }
4788
if ((iRemain - iRequired) % 4 != 0)
4789
MNG_ERROR (pData, MNG_INVALIDLENGTH);
4793
if (iRemain != iRequired)
4794
MNG_ERROR (pData, MNG_INVALIDLENGTH);
4799
#ifdef MNG_SUPPORT_DISPLAY
4801
mng_uint8p pWork = pTemp;
4802
mng_uint8 iFramemode = 0;
4803
mng_uint8 iChangedelay = 0;
4804
mng_uint32 iDelay = 0;
4805
mng_uint8 iChangetimeout = 0;
4806
mng_uint32 iTimeout = 0;
4807
mng_uint8 iChangeclipping = 0;
4808
mng_uint8 iCliptype = 0;
4809
mng_int32 iClipl = 0;
4810
mng_int32 iClipr = 0;
4811
mng_int32 iClipt = 0;
4812
mng_int32 iClipb = 0;
4813
mng_retcode iRetcode;
4815
if (iRawlen) /* any data specified ? */
4817
if (*(pRawdata)) /* save the new framing mode ? */
4819
iFramemode = *(pRawdata);
4821
#ifndef MNG_NO_OLD_VERSIONS
4822
if (pData->bPreDraft48) /* old style input-stream ? */
4827
case 1: { iFramemode = 3; break; }
4828
case 2: { iFramemode = 4; break; }
4829
case 3: { iFramemode = 1; break; }
4830
case 4: { iFramemode = 1; break; }
4831
case 5: { iFramemode = 2; break; }
4832
default: { iFramemode = 1; break; }
4840
iChangedelay = *(pWork+1);
4841
iChangetimeout = *(pWork+2);
4842
iChangeclipping = *(pWork+3);
4845
if (iChangedelay) /* delay changed ? */
4847
iDelay = mng_get_uint32 (pWork);
4851
if (iChangetimeout) /* timeout changed ? */
4853
iTimeout = mng_get_uint32 (pWork);
4857
if (iChangeclipping) /* clipping changed ? */
4860
iClipl = mng_get_int32 (pWork+1);
4861
iClipr = mng_get_int32 (pWork+5);
4862
iClipt = mng_get_int32 (pWork+9);
4863
iClipb = mng_get_int32 (pWork+13);
4868
iRetcode = mng_create_ani_fram (pData, iFramemode, iChangedelay, iDelay,
4869
iChangetimeout, iTimeout,
4870
iChangeclipping, iCliptype,
4871
iClipl, iClipr, iClipt, iClipb);
4873
if (!iRetcode) /* now go and do something */
4874
iRetcode = mng_process_display_fram (pData, iFramemode, iChangedelay, iDelay,
4875
iChangetimeout, iTimeout,
4876
iChangeclipping, iCliptype,
4877
iClipl, iClipr, iClipt, iClipb);
4879
if (iRetcode) /* on error bail out */
4883
#endif /* MNG_SUPPORT_DISPLAY */
4885
#ifdef MNG_STORE_CHUNKS
4886
if (pData->bStorechunks)
4887
{ /* initialize storage */
4888
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
4890
if (iRetcode) /* on error bail out */
4892
/* store the fields */
4893
((mng_framp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
4897
mng_uint8 iFramemode = *(pRawdata);
4899
#ifndef MNG_NO_OLD_VERSIONS
4900
if (pData->bPreDraft48) /* old style input-stream ? */
4904
case 1: { iFramemode = 3; break; }
4905
case 2: { iFramemode = 4; break; }
4906
case 3: { iFramemode = 5; break; } /* TODO: provision for mode=5 ??? */
4907
case 4: { iFramemode = 1; break; }
4908
case 5: { iFramemode = 2; break; }
4909
default: { iFramemode = 1; break; }
4914
((mng_framp)*ppChunk)->iMode = iFramemode;
4915
((mng_framp)*ppChunk)->iNamesize = iNamelen;
4919
MNG_ALLOC (pData, ((mng_framp)*ppChunk)->zName, iNamelen+1);
4920
MNG_COPY (((mng_framp)*ppChunk)->zName, pRawdata+1, iNamelen);
4925
((mng_framp)*ppChunk)->iChangedelay = *(pTemp+1);
4926
((mng_framp)*ppChunk)->iChangetimeout = *(pTemp+2);
4927
((mng_framp)*ppChunk)->iChangeclipping = *(pTemp+3);
4928
((mng_framp)*ppChunk)->iChangesyncid = *(pTemp+4);
4932
if (((mng_framp)*ppChunk)->iChangedelay)
4934
((mng_framp)*ppChunk)->iDelay = mng_get_uint32 (pTemp);
4938
if (((mng_framp)*ppChunk)->iChangetimeout)
4940
((mng_framp)*ppChunk)->iTimeout = mng_get_uint32 (pTemp);
4944
if (((mng_framp)*ppChunk)->iChangeclipping)
4946
((mng_framp)*ppChunk)->iBoundarytype = *pTemp;
4947
((mng_framp)*ppChunk)->iBoundaryl = mng_get_int32 (pTemp+1);
4948
((mng_framp)*ppChunk)->iBoundaryr = mng_get_int32 (pTemp+5);
4949
((mng_framp)*ppChunk)->iBoundaryt = mng_get_int32 (pTemp+9);
4950
((mng_framp)*ppChunk)->iBoundaryb = mng_get_int32 (pTemp+13);
4954
if (((mng_framp)*ppChunk)->iChangesyncid)
4956
((mng_framp)*ppChunk)->iCount = (iRemain - iRequired) / 4;
4958
if (((mng_framp)*ppChunk)->iCount)
4960
MNG_ALLOC (pData, ((mng_framp)*ppChunk)->pSyncids,
4961
((mng_framp)*ppChunk)->iCount * 4);
4963
#ifndef MNG_BIGENDIAN_SUPPORTED
4966
mng_uint32p pOut = ((mng_framp)*ppChunk)->pSyncids;
4968
for (iX = 0; iX < ((mng_framp)*ppChunk)->iCount; iX++)
4970
*pOut++ = mng_get_uint32 (pTemp);
4975
MNG_COPY (((mng_framp)*ppChunk)->pSyncids, pTemp,
4976
((mng_framp)*ppChunk)->iCount * 4);
4977
#endif /* !MNG_BIGENDIAN_SUPPORTED */
4983
#endif /* MNG_STORE_CHUNKS */
4985
#ifdef MNG_SUPPORT_TRACE
4986
MNG_TRACE (pData, MNG_FN_READ_FRAM, MNG_LC_END);
4989
return MNG_NOERROR; /* done */
4994
/* ************************************************************************** */
4996
#ifndef MNG_OPTIMIZE_CHUNKREADER
4997
#ifndef MNG_SKIPCHUNK_MOVE
4998
READ_CHUNK (mng_read_move)
5000
#ifdef MNG_SUPPORT_TRACE
5001
MNG_TRACE (pData, MNG_FN_READ_MOVE, MNG_LC_START);
5004
if (!pData->bHasMHDR) /* sequence checks */
5005
MNG_ERROR (pData, MNG_SEQUENCEERROR);
5007
#ifdef MNG_INCLUDE_JNG
5008
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
5010
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
5012
MNG_ERROR (pData, MNG_SEQUENCEERROR);
5014
if (iRawlen != 13) /* check the length */
5015
MNG_ERROR (pData, MNG_INVALIDLENGTH);
5017
#ifdef MNG_SUPPORT_DISPLAY
5019
mng_retcode iRetcode;
5020
/* create a MOVE animation object */
5021
iRetcode = mng_create_ani_move (pData, mng_get_uint16 (pRawdata),
5022
mng_get_uint16 (pRawdata+2),
5024
mng_get_int32 (pRawdata+5),
5025
mng_get_int32 (pRawdata+9));
5027
if (!iRetcode) /* process the move */
5028
iRetcode = mng_process_display_move (pData,
5029
mng_get_uint16 (pRawdata),
5030
mng_get_uint16 (pRawdata+2),
5032
mng_get_int32 (pRawdata+5),
5033
mng_get_int32 (pRawdata+9));
5035
if (iRetcode) /* on error bail out */
5039
#endif /* MNG_SUPPORT_DISPLAY */
5041
#ifdef MNG_STORE_CHUNKS
5042
if (pData->bStorechunks)
5043
{ /* initialize storage */
5044
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
5046
if (iRetcode) /* on error bail out */
5048
/* store the fields */
5049
((mng_movep)*ppChunk)->iFirstid = mng_get_uint16 (pRawdata);
5050
((mng_movep)*ppChunk)->iLastid = mng_get_uint16 (pRawdata+2);
5051
((mng_movep)*ppChunk)->iMovetype = *(pRawdata+4);
5052
((mng_movep)*ppChunk)->iMovex = mng_get_int32 (pRawdata+5);
5053
((mng_movep)*ppChunk)->iMovey = mng_get_int32 (pRawdata+9);
5055
#endif /* MNG_STORE_CHUNKS */
5057
#ifdef MNG_SUPPORT_TRACE
5058
MNG_TRACE (pData, MNG_FN_READ_MOVE, MNG_LC_END);
5061
return MNG_NOERROR; /* done */
5066
/* ************************************************************************** */
5068
#ifndef MNG_OPTIMIZE_CHUNKREADER
5069
#ifndef MNG_SKIPCHUNK_CLIP
5070
READ_CHUNK (mng_read_clip)
5072
#ifdef MNG_SUPPORT_TRACE
5073
MNG_TRACE (pData, MNG_FN_READ_CLIP, MNG_LC_START);
5076
if (!pData->bHasMHDR) /* sequence checks */
5077
MNG_ERROR (pData, MNG_SEQUENCEERROR);
5079
#ifdef MNG_INCLUDE_JNG
5080
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
5082
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
5084
MNG_ERROR (pData, MNG_SEQUENCEERROR);
5086
if (iRawlen != 21) /* check the length */
5087
MNG_ERROR (pData, MNG_INVALIDLENGTH);
5089
#ifdef MNG_SUPPORT_DISPLAY
5091
mng_retcode iRetcode;
5092
/* create a CLIP animation object */
5093
iRetcode = mng_create_ani_clip (pData, mng_get_uint16 (pRawdata),
5094
mng_get_uint16 (pRawdata+2),
5096
mng_get_int32 (pRawdata+5),
5097
mng_get_int32 (pRawdata+9),
5098
mng_get_int32 (pRawdata+13),
5099
mng_get_int32 (pRawdata+17));
5101
if (!iRetcode) /* process the clipping */
5102
iRetcode = mng_process_display_clip (pData,
5103
mng_get_uint16 (pRawdata),
5104
mng_get_uint16 (pRawdata+2),
5106
mng_get_int32 (pRawdata+5),
5107
mng_get_int32 (pRawdata+9),
5108
mng_get_int32 (pRawdata+13),
5109
mng_get_int32 (pRawdata+17));
5111
if (iRetcode) /* on error bail out */
5115
#endif /* MNG_SUPPORT_DISPLAY */
5117
#ifdef MNG_STORE_CHUNKS
5118
if (pData->bStorechunks)
5119
{ /* initialize storage */
5120
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
5122
if (iRetcode) /* on error bail out */
5124
/* store the fields */
5125
((mng_clipp)*ppChunk)->iFirstid = mng_get_uint16 (pRawdata);
5126
((mng_clipp)*ppChunk)->iLastid = mng_get_uint16 (pRawdata+2);
5127
((mng_clipp)*ppChunk)->iCliptype = *(pRawdata+4);
5128
((mng_clipp)*ppChunk)->iClipl = mng_get_int32 (pRawdata+5);
5129
((mng_clipp)*ppChunk)->iClipr = mng_get_int32 (pRawdata+9);
5130
((mng_clipp)*ppChunk)->iClipt = mng_get_int32 (pRawdata+13);
5131
((mng_clipp)*ppChunk)->iClipb = mng_get_int32 (pRawdata+17);
5133
#endif /* MNG_STORE_CHUNKS */
5135
#ifdef MNG_SUPPORT_TRACE
5136
MNG_TRACE (pData, MNG_FN_READ_CLIP, MNG_LC_END);
5139
return MNG_NOERROR; /* done */
5144
/* ************************************************************************** */
5146
#ifndef MNG_OPTIMIZE_CHUNKREADER
5147
#ifndef MNG_SKIPCHUNK_SHOW
5148
READ_CHUNK (mng_read_show)
5150
#ifdef MNG_SUPPORT_TRACE
5151
MNG_TRACE (pData, MNG_FN_READ_SHOW, MNG_LC_START);
5154
if (!pData->bHasMHDR) /* sequence checks */
5155
MNG_ERROR (pData, MNG_SEQUENCEERROR);
5157
#ifdef MNG_INCLUDE_JNG
5158
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
5160
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
5162
MNG_ERROR (pData, MNG_SEQUENCEERROR);
5163
/* check the length */
5164
if ((iRawlen != 0) && (iRawlen != 2) && (iRawlen != 4) && (iRawlen != 5))
5165
MNG_ERROR (pData, MNG_INVALIDLENGTH);
5167
#ifdef MNG_SUPPORT_DISPLAY
5169
mng_retcode iRetcode;
5171
if (iRawlen) /* determine parameters if any */
5173
pData->iSHOWfromid = mng_get_uint16 (pRawdata);
5176
pData->iSHOWtoid = mng_get_uint16 (pRawdata+2);
5178
pData->iSHOWtoid = pData->iSHOWfromid;
5181
pData->iSHOWmode = *(pRawdata+4);
5183
pData->iSHOWmode = 0;
5185
else /* use defaults then */
5187
pData->iSHOWmode = 2;
5188
pData->iSHOWfromid = 1;
5189
pData->iSHOWtoid = 65535;
5191
/* create a SHOW animation object */
5192
iRetcode = mng_create_ani_show (pData, pData->iSHOWfromid,
5193
pData->iSHOWtoid, pData->iSHOWmode);
5195
if (!iRetcode) /* go and do it! */
5196
iRetcode = mng_process_display_show (pData);
5198
if (iRetcode) /* on error bail out */
5202
#endif /* MNG_SUPPORT_DISPLAY */
5204
#ifdef MNG_STORE_CHUNKS
5205
if (pData->bStorechunks)
5206
{ /* initialize storage */
5207
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
5209
if (iRetcode) /* on error bail out */
5211
/* store the fields */
5212
((mng_showp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
5216
((mng_showp)*ppChunk)->iFirstid = mng_get_uint16 (pRawdata);
5219
((mng_showp)*ppChunk)->iLastid = mng_get_uint16 (pRawdata+2);
5221
((mng_showp)*ppChunk)->iLastid = ((mng_showp)*ppChunk)->iFirstid;
5224
((mng_showp)*ppChunk)->iMode = *(pRawdata+4);
5227
#endif /* MNG_STORE_CHUNKS */
5229
#ifdef MNG_SUPPORT_TRACE
5230
MNG_TRACE (pData, MNG_FN_READ_SHOW, MNG_LC_END);
5233
return MNG_NOERROR; /* done */
5238
/* ************************************************************************** */
5240
#ifndef MNG_OPTIMIZE_CHUNKREADER
5241
#ifndef MNG_SKIPCHUNK_TERM
5242
READ_CHUNK (mng_read_term)
5244
mng_uint8 iTermaction;
5245
mng_uint8 iIteraction = 0;
5246
mng_uint32 iDelay = 0;
5247
mng_uint32 iItermax = 0;
5249
#ifdef MNG_SUPPORT_TRACE
5250
MNG_TRACE (pData, MNG_FN_READ_TERM, MNG_LC_START);
5253
if (!pData->bHasMHDR) /* sequence checks */
5254
MNG_ERROR (pData, MNG_SEQUENCEERROR);
5256
#ifdef MNG_INCLUDE_JNG
5257
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
5259
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
5261
MNG_ERROR (pData, MNG_SEQUENCEERROR);
5263
/* should be behind MHDR or SAVE !! */
5264
if ((!pData->bHasSAVE) && (pData->iChunkseq > 2))
5266
pData->bMisplacedTERM = MNG_TRUE; /* indicate we found a misplaced TERM */
5267
/* and send a warning signal!!! */
5268
MNG_WARNING (pData, MNG_SEQUENCEERROR);
5271
if (pData->bHasLOOP) /* no way, jose! */
5272
MNG_ERROR (pData, MNG_SEQUENCEERROR);
5274
if (pData->bHasTERM) /* only 1 allowed! */
5275
MNG_ERROR (pData, MNG_MULTIPLEERROR);
5276
/* check the length */
5277
if ((iRawlen != 1) && (iRawlen != 10))
5278
MNG_ERROR (pData, MNG_INVALIDLENGTH);
5280
pData->bHasTERM = MNG_TRUE;
5282
iTermaction = *pRawdata; /* get the fields */
5286
iIteraction = *(pRawdata+1);
5287
iDelay = mng_get_uint32 (pRawdata+2);
5288
iItermax = mng_get_uint32 (pRawdata+6);
5291
if (pData->fProcessterm) /* inform the app ? */
5292
if (!pData->fProcessterm (((mng_handle)pData), iTermaction, iIteraction,
5294
MNG_ERROR (pData, MNG_APPMISCERROR);
5296
#ifdef MNG_SUPPORT_DISPLAY
5297
{ /* create the TERM ani-object */
5298
mng_retcode iRetcode = mng_create_ani_term (pData, iTermaction, iIteraction,
5301
if (iRetcode) /* on error bail out */
5303
/* save for future reference */
5304
pData->pTermaniobj = pData->pLastaniobj;
5306
#endif /* MNG_SUPPORT_DISPLAY */
5308
#ifdef MNG_STORE_CHUNKS
5309
if (pData->bStorechunks)
5310
{ /* initialize storage */
5311
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
5313
if (iRetcode) /* on error bail out */
5315
/* store the fields */
5316
((mng_termp)*ppChunk)->iTermaction = iTermaction;
5317
((mng_termp)*ppChunk)->iIteraction = iIteraction;
5318
((mng_termp)*ppChunk)->iDelay = iDelay;
5319
((mng_termp)*ppChunk)->iItermax = iItermax;
5321
#endif /* MNG_STORE_CHUNKS */
5323
#ifdef MNG_SUPPORT_TRACE
5324
MNG_TRACE (pData, MNG_FN_READ_TERM, MNG_LC_END);
5327
return MNG_NOERROR; /* done */
5332
/* ************************************************************************** */
5334
#ifndef MNG_OPTIMIZE_CHUNKREADER
5335
#ifndef MNG_SKIPCHUNK_SAVE
5336
READ_CHUNK (mng_read_save)
5338
#ifdef MNG_SUPPORT_TRACE
5339
MNG_TRACE (pData, MNG_FN_READ_SAVE, MNG_LC_START);
5341
/* sequence checks */
5342
if ((!pData->bHasMHDR) || (pData->bHasSAVE))
5343
MNG_ERROR (pData, MNG_SEQUENCEERROR);
5345
#ifdef MNG_INCLUDE_JNG
5346
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
5348
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
5350
MNG_ERROR (pData, MNG_SEQUENCEERROR);
5352
pData->bHasSAVE = MNG_TRUE;
5354
if (pData->fProcesssave) /* inform the application ? */
5356
mng_bool bOke = pData->fProcesssave ((mng_handle)pData);
5359
MNG_ERROR (pData, MNG_APPMISCERROR);
5362
#ifdef MNG_SUPPORT_DISPLAY
5364
mng_retcode iRetcode;
5367
/* TODO: something with the parameters */
5370
/* create a SAVE animation object */
5371
iRetcode = mng_create_ani_save (pData);
5373
if (!iRetcode) /* process it */
5374
iRetcode = mng_process_display_save (pData);
5376
if (iRetcode) /* on error bail out */
5380
#endif /* MNG_SUPPORT_DISPLAY */
5382
#ifdef MNG_STORE_CHUNKS
5383
if (pData->bStorechunks)
5384
{ /* initialize storage */
5385
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
5387
if (iRetcode) /* on error bail out */
5389
/* store the fields */
5390
((mng_savep)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
5392
if (iRawlen) /* not empty ? */
5394
mng_uint8 iOtype = *pRawdata;
5396
mng_uint32 iCount = 0;
5400
mng_uint32 iOffset[2];
5401
mng_uint32 iStarttime[2];
5402
mng_uint32 iFramenr;
5403
mng_uint32 iLayernr;
5405
mng_save_entryp pEntry = MNG_NULL;
5406
mng_uint32 iNamesize;
5408
if ((iOtype != 4) && (iOtype != 8))
5409
MNG_ERROR (pData, MNG_INVOFFSETSIZE);
5411
((mng_savep)*ppChunk)->iOffsettype = iOtype;
5413
for (iX = 0; iX < 2; iX++) /* do this twice to get the count first ! */
5415
pTemp = pRawdata + 1;
5418
if (iX) /* second run ? */
5420
MNG_ALLOC (pData, pEntry, (iCount * sizeof (mng_save_entry)));
5422
((mng_savep)*ppChunk)->iCount = iCount;
5423
((mng_savep)*ppChunk)->pEntries = pEntry;
5426
while (iLen) /* anything left ? */
5428
iEtype = *pTemp; /* entrytype */
5430
if ((iEtype != 0) && (iEtype != 1) && (iEtype != 2) && (iEtype != 3))
5431
MNG_ERROR (pData, MNG_INVENTRYTYPE);
5449
iOffset [1] = mng_get_uint32 (pTemp);
5455
iOffset [0] = mng_get_uint32 (pTemp);
5456
iOffset [1] = mng_get_uint32 (pTemp+4);
5473
iStarttime [1] = mng_get_uint32 (pTemp+0);
5474
iLayernr = mng_get_uint32 (pTemp+4);
5475
iFramenr = mng_get_uint32 (pTemp+8);
5481
iStarttime [0] = mng_get_uint32 (pTemp+0);
5482
iStarttime [1] = mng_get_uint32 (pTemp+4);
5483
iLayernr = mng_get_uint32 (pTemp+8);
5484
iFramenr = mng_get_uint32 (pTemp+12);
5491
pNull = find_null (pTemp); /* get the name length */
5493
if ((pNull - pRawdata) > (mng_int32)iRawlen)
5495
iNamesize = iLen; /* no null found; so end of SAVE */
5500
iNamesize = pNull - pTemp; /* should be another entry */
5503
if (!iLen) /* must not end with a null ! */
5504
MNG_ERROR (pData, MNG_ENDWITHNULL);
5513
pEntry->iEntrytype = iEtype;
5514
pEntry->iOffset [0] = iOffset [0];
5515
pEntry->iOffset [1] = iOffset [1];
5516
pEntry->iStarttime [0] = iStarttime [0];
5517
pEntry->iStarttime [1] = iStarttime [1];
5518
pEntry->iLayernr = iLayernr;
5519
pEntry->iFramenr = iFramenr;
5520
pEntry->iNamesize = iNamesize;
5524
MNG_ALLOC (pData, pEntry->zName, iNamesize+1);
5525
MNG_COPY (pEntry->zName, pTemp, iNamesize);
5536
#endif /* MNG_STORE_CHUNKS */
5538
#ifdef MNG_SUPPORT_TRACE
5539
MNG_TRACE (pData, MNG_FN_READ_SAVE, MNG_LC_END);
5542
return MNG_NOERROR; /* done */
5547
/* ************************************************************************** */
5549
#ifndef MNG_OPTIMIZE_CHUNKREADER
5550
#ifndef MNG_SKIPCHUNK_SEEK
5551
READ_CHUNK (mng_read_seek)
5553
mng_retcode iRetcode;
5555
#ifdef MNG_SUPPORT_TRACE
5556
MNG_TRACE (pData, MNG_FN_READ_SEEK, MNG_LC_START);
5558
/* sequence checks */
5559
if ((!pData->bHasMHDR) || (!pData->bHasSAVE))
5560
MNG_ERROR (pData, MNG_SEQUENCEERROR);
5562
#ifdef MNG_INCLUDE_JNG
5563
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
5565
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
5567
MNG_ERROR (pData, MNG_SEQUENCEERROR);
5569
#ifdef MNG_SUPPORT_DISPLAY
5570
/* create a SEEK animation object */
5571
iRetcode = mng_create_ani_seek (pData, iRawlen, (mng_pchar)pRawdata);
5573
if (iRetcode) /* on error bail out */
5576
#endif /* MNG_SUPPORT_DISPLAY */
5578
if (pData->fProcessseek) /* inform the app ? */
5583
MNG_ALLOC (pData, zName, iRawlen + 1);
5586
MNG_COPY (zName, pRawdata, iRawlen);
5588
bOke = pData->fProcessseek ((mng_handle)pData, zName);
5590
MNG_FREEX (pData, zName, iRawlen + 1);
5593
MNG_ERROR (pData, MNG_APPMISCERROR);
5596
#ifdef MNG_SUPPORT_DISPLAY
5597
/* do display processing of the SEEK */
5598
iRetcode = mng_process_display_seek (pData);
5600
if (iRetcode) /* on error bail out */
5602
#endif /* MNG_SUPPORT_DISPLAY */
5604
#ifdef MNG_STORE_CHUNKS
5605
if (pData->bStorechunks)
5606
{ /* initialize storage */
5607
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
5609
if (iRetcode) /* on error bail out */
5611
/* store the fields */
5612
((mng_seekp)*ppChunk)->iNamesize = iRawlen;
5616
MNG_ALLOC (pData, ((mng_seekp)*ppChunk)->zName, iRawlen+1);
5617
MNG_COPY (((mng_seekp)*ppChunk)->zName, pRawdata, iRawlen);
5620
#endif /* MNG_STORE_CHUNKS */
5622
#ifdef MNG_SUPPORT_TRACE
5623
MNG_TRACE (pData, MNG_FN_READ_SEEK, MNG_LC_END);
5626
return MNG_NOERROR; /* done */
5631
/* ************************************************************************** */
5633
#ifndef MNG_OPTIMIZE_CHUNKREADER
5634
#ifndef MNG_SKIPCHUNK_eXPI
5635
READ_CHUNK (mng_read_expi)
5637
#ifdef MNG_SUPPORT_TRACE
5638
MNG_TRACE (pData, MNG_FN_READ_EXPI, MNG_LC_START);
5641
if (!pData->bHasMHDR) /* sequence checks */
5642
MNG_ERROR (pData, MNG_SEQUENCEERROR);
5644
#ifdef MNG_INCLUDE_JNG
5645
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
5647
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
5649
MNG_ERROR (pData, MNG_SEQUENCEERROR);
5651
if (iRawlen < 3) /* check the length */
5652
MNG_ERROR (pData, MNG_INVALIDLENGTH);
5654
#ifdef MNG_SUPPORT_DISPLAY
5658
/* TODO: something !!! */
5662
#endif /* MNG_SUPPORT_DISPLAY */
5664
#ifdef MNG_STORE_CHUNKS
5665
if (pData->bStorechunks)
5666
{ /* initialize storage */
5667
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
5669
if (iRetcode) /* on error bail out */
5671
/* store the fields */
5672
((mng_expip)*ppChunk)->iSnapshotid = mng_get_uint16 (pRawdata);
5673
((mng_expip)*ppChunk)->iNamesize = iRawlen - 2;
5675
if (((mng_expip)*ppChunk)->iNamesize)
5677
MNG_ALLOC (pData, ((mng_expip)*ppChunk)->zName,
5678
((mng_expip)*ppChunk)->iNamesize + 1);
5679
MNG_COPY (((mng_expip)*ppChunk)->zName, pRawdata+2,
5680
((mng_expip)*ppChunk)->iNamesize);
5683
#endif /* MNG_STORE_CHUNKS */
5685
#ifdef MNG_SUPPORT_TRACE
5686
MNG_TRACE (pData, MNG_FN_READ_EXPI, MNG_LC_END);
5689
return MNG_NOERROR; /* done */
5694
/* ************************************************************************** */
5696
#ifndef MNG_OPTIMIZE_CHUNKREADER
5697
#ifndef MNG_SKIPCHUNK_fPRI
5698
READ_CHUNK (mng_read_fpri)
5700
#ifdef MNG_SUPPORT_TRACE
5701
MNG_TRACE (pData, MNG_FN_READ_FPRI, MNG_LC_START);
5704
if (!pData->bHasMHDR) /* sequence checks */
5705
MNG_ERROR (pData, MNG_SEQUENCEERROR);
5707
#ifdef MNG_INCLUDE_JNG
5708
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
5710
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
5712
MNG_ERROR (pData, MNG_SEQUENCEERROR);
5714
if (iRawlen != 2) /* must be two bytes long */
5715
MNG_ERROR (pData, MNG_INVALIDLENGTH);
5717
#ifdef MNG_SUPPORT_DISPLAY
5721
/* TODO: something !!! */
5725
#endif /* MNG_SUPPORT_DISPLAY */
5727
#ifdef MNG_STORE_CHUNKS
5728
if (pData->bStorechunks)
5729
{ /* initialize storage */
5730
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
5732
if (iRetcode) /* on error bail out */
5734
/* store the fields */
5735
((mng_fprip)*ppChunk)->iDeltatype = *pRawdata;
5736
((mng_fprip)*ppChunk)->iPriority = *(pRawdata+1);
5738
#endif /* MNG_STORE_CHUNKS */
5740
#ifdef MNG_SUPPORT_TRACE
5741
MNG_TRACE (pData, MNG_FN_READ_FPRI, MNG_LC_END);
5744
return MNG_NOERROR; /* done */
5749
/* ************************************************************************** */
5751
#ifndef MNG_OPTIMIZE_CHUNKREADER
5752
#ifndef MNG_SKIPCHUNK_nEED
5753
MNG_LOCAL mng_bool CheckKeyword (mng_datap pData,
5754
mng_uint8p pKeyword)
5756
mng_chunkid handled_chunks [] =
5758
MNG_UINT_BACK, /* keep it sorted !!!! */
5762
#ifndef MNG_NO_DELTA_PNG
5763
/* TODO: MNG_UINT_DBYK, */
5766
#ifndef MNG_NO_DELTA_PNG
5770
#ifndef MNG_NO_DELTA_PNG
5771
/* TODO: MNG_UINT_DROP, */
5778
#ifndef MNG_NO_DELTA_PNG
5779
#ifdef MNG_INCLUDE_JNG
5784
#ifdef MNG_INCLUDE_JNG
5788
/* TODO: MNG_UINT_JSEP, */
5796
/* TODO: MNG_UINT_ORDR, */
5799
#ifndef MNG_NO_DELTA_PNG
5809
/* TODO: MNG_UINT_eXPI, */
5811
/* TODO: MNG_UINT_fPRI, */
5813
/* TODO: MNG_UINT_hIST, */
5817
/* TODO: MNG_UINT_oFFs, */
5818
/* TODO: MNG_UINT_pCAL, */
5819
/* TODO: MNG_UINT_pHYg, */
5820
/* TODO: MNG_UINT_pHYs, */
5821
/* TODO: MNG_UINT_sBIT, */
5822
/* TODO: MNG_UINT_sCAL, */
5823
/* TODO: MNG_UINT_sPLT, */
5831
mng_bool bOke = MNG_FALSE;
5833
if (pData->fProcessneed) /* does the app handle it ? */
5834
bOke = pData->fProcessneed ((mng_handle)pData, (mng_pchar)pKeyword);
5837
{ /* find the keyword length */
5838
mng_uint8p pNull = find_null (pKeyword);
5840
if (pNull - pKeyword == 4) /* test a chunk ? */
5841
{ /* get the chunk-id */
5842
mng_chunkid iChunkid = (*pKeyword << 24) + (*(pKeyword+1) << 16) +
5843
(*(pKeyword+2) << 8) + (*(pKeyword+3) );
5844
/* binary search variables */
5845
mng_int32 iTop, iLower, iUpper, iMiddle;
5846
/* determine max index of table */
5847
iTop = (sizeof (handled_chunks) / sizeof (handled_chunks [0])) - 1;
5849
/* binary search; with 52 chunks, worst-case is 7 comparisons */
5851
iMiddle = iTop >> 1;
5854
do /* the binary search itself */
5856
if (handled_chunks [iMiddle] < iChunkid)
5857
iLower = iMiddle + 1;
5858
else if (handled_chunks [iMiddle] > iChunkid)
5859
iUpper = iMiddle - 1;
5866
iMiddle = (iLower + iUpper) >> 1;
5868
while (iLower <= iUpper);
5871
if ((!bOke) && (pNull - pKeyword == 8) &&
5872
(*pKeyword == 'd') && (*(pKeyword+1) == 'r') &&
5873
(*(pKeyword+2) == 'a') && (*(pKeyword+3) == 'f') &&
5874
(*(pKeyword+4) == 't') && (*(pKeyword+5) == ' '))
5878
iDraft = (*(pKeyword+6) - '0') * 10 + (*(pKeyword+7) - '0');
5879
bOke = (mng_bool)(iDraft <= MNG_MNG_DRAFT);
5881
/* test MNG 1.0/1.1 ? */
5882
if ((!bOke) && (pNull - pKeyword == 7) &&
5883
(*pKeyword == 'M') && (*(pKeyword+1) == 'N') &&
5884
(*(pKeyword+2) == 'G') && (*(pKeyword+3) == '-') &&
5885
(*(pKeyword+4) == '1') && (*(pKeyword+5) == '.') &&
5886
((*(pKeyword+6) == '0') || (*(pKeyword+6) == '1')))
5888
/* test CACHEOFF ? */
5889
if ((!bOke) && (pNull - pKeyword == 8) &&
5890
(*pKeyword == 'C') && (*(pKeyword+1) == 'A') &&
5891
(*(pKeyword+2) == 'C') && (*(pKeyword+3) == 'H') &&
5892
(*(pKeyword+4) == 'E') && (*(pKeyword+5) == 'O') &&
5893
(*(pKeyword+6) == 'F') && (*(pKeyword+7) == 'F'))
5895
if (!pData->pFirstaniobj) /* only if caching hasn't started yet ! */
5898
pData->bCacheplayback = MNG_FALSE;
5899
pData->bStorechunks = MNG_FALSE;
5909
/* ************************************************************************** */
5911
#ifndef MNG_OPTIMIZE_CHUNKREADER
5912
#ifndef MNG_SKIPCHUNK_nEED
5913
READ_CHUNK (mng_read_need)
5915
#ifdef MNG_SUPPORT_TRACE
5916
MNG_TRACE (pData, MNG_FN_READ_NEED, MNG_LC_START);
5919
if (!pData->bHasMHDR) /* sequence checks */
5920
MNG_ERROR (pData, MNG_SEQUENCEERROR);
5922
#ifdef MNG_INCLUDE_JNG
5923
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
5925
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
5927
MNG_ERROR (pData, MNG_SEQUENCEERROR);
5929
if (iRawlen < 1) /* check the length */
5930
MNG_ERROR (pData, MNG_INVALIDLENGTH);
5932
{ /* let's check it */
5933
mng_bool bOke = MNG_TRUE;
5934
mng_pchar zKeywords;
5935
mng_uint8p pNull, pTemp;
5937
MNG_ALLOC (pData, zKeywords, iRawlen + 1);
5940
MNG_COPY (zKeywords, pRawdata, iRawlen);
5942
pTemp = (mng_uint8p)zKeywords;
5943
pNull = find_null (pTemp);
5945
while ((bOke) && (pNull < (mng_uint8p)zKeywords + iRawlen))
5947
bOke = CheckKeyword (pData, pTemp);
5949
pNull = find_null (pTemp);
5953
bOke = CheckKeyword (pData, pTemp);
5955
MNG_FREEX (pData, zKeywords, iRawlen + 1);
5958
MNG_ERROR (pData, MNG_UNSUPPORTEDNEED);
5961
#ifdef MNG_STORE_CHUNKS
5962
if (pData->bStorechunks)
5963
{ /* initialize storage */
5964
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
5966
if (iRetcode) /* on error bail out */
5968
/* store the fields */
5969
((mng_needp)*ppChunk)->iKeywordssize = iRawlen;
5973
MNG_ALLOC (pData, ((mng_needp)*ppChunk)->zKeywords, iRawlen+1);
5974
MNG_COPY (((mng_needp)*ppChunk)->zKeywords, pRawdata, iRawlen);
5977
#endif /* MNG_STORE_CHUNKS */
5979
#ifdef MNG_SUPPORT_TRACE
5980
MNG_TRACE (pData, MNG_FN_READ_NEED, MNG_LC_END);
5983
return MNG_NOERROR; /* done */
5988
/* ************************************************************************** */
5990
#ifndef MNG_OPTIMIZE_CHUNKREADER
5991
#ifndef MNG_SKIPCHUNK_pHYg
5992
READ_CHUNK (mng_read_phyg)
5994
#ifdef MNG_SUPPORT_TRACE
5995
MNG_TRACE (pData, MNG_FN_READ_PHYG, MNG_LC_START);
5998
if (!pData->bHasMHDR) /* sequence checks */
5999
MNG_ERROR (pData, MNG_SEQUENCEERROR);
6001
#ifdef MNG_INCLUDE_JNG
6002
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
6004
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
6006
MNG_ERROR (pData, MNG_SEQUENCEERROR);
6007
/* it's 9 bytes or empty; no more, no less! */
6008
if ((iRawlen != 9) && (iRawlen != 0))
6009
MNG_ERROR (pData, MNG_INVALIDLENGTH);
6011
#ifdef MNG_SUPPORT_DISPLAY
6015
/* TODO: something !!! */
6019
#endif /* MNG_SUPPORT_DISPLAY */
6021
#ifdef MNG_STORE_CHUNKS
6022
if (pData->bStorechunks)
6023
{ /* initialize storage */
6024
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
6026
if (iRetcode) /* on error bail out */
6028
/* store the fields */
6029
((mng_phygp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
6033
((mng_phygp)*ppChunk)->iSizex = mng_get_uint32 (pRawdata);
6034
((mng_phygp)*ppChunk)->iSizey = mng_get_uint32 (pRawdata+4);
6035
((mng_phygp)*ppChunk)->iUnit = *(pRawdata+8);
6038
#endif /* MNG_STORE_CHUNKS */
6040
#ifdef MNG_SUPPORT_TRACE
6041
MNG_TRACE (pData, MNG_FN_READ_PHYG, MNG_LC_END);
6044
return MNG_NOERROR; /* done */
6049
/* ************************************************************************** */
6051
#ifndef MNG_OPTIMIZE_CHUNKREADER
6052
#ifdef MNG_INCLUDE_JNG
6053
READ_CHUNK (mng_read_jhdr)
6055
#ifdef MNG_SUPPORT_TRACE
6056
MNG_TRACE (pData, MNG_FN_READ_JHDR, MNG_LC_START);
6058
/* sequence checks */
6059
if ((pData->eSigtype != mng_it_jng) && (pData->eSigtype != mng_it_mng))
6060
MNG_ERROR (pData, MNG_CHUNKNOTALLOWED);
6062
if ((pData->eSigtype == mng_it_jng) && (pData->iChunkseq > 1))
6063
MNG_ERROR (pData, MNG_SEQUENCEERROR);
6065
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
6066
MNG_ERROR (pData, MNG_SEQUENCEERROR);
6068
if (iRawlen != 16) /* length oke ? */
6069
MNG_ERROR (pData, MNG_INVALIDLENGTH);
6070
/* inside a JHDR-IEND block now */
6071
pData->bHasJHDR = MNG_TRUE;
6072
/* and store interesting fields */
6073
pData->iDatawidth = mng_get_uint32 (pRawdata);
6074
pData->iDataheight = mng_get_uint32 (pRawdata+4);
6075
pData->iJHDRcolortype = *(pRawdata+8);
6076
pData->iJHDRimgbitdepth = *(pRawdata+9);
6077
pData->iJHDRimgcompression = *(pRawdata+10);
6078
pData->iJHDRimginterlace = *(pRawdata+11);
6079
pData->iJHDRalphabitdepth = *(pRawdata+12);
6080
pData->iJHDRalphacompression = *(pRawdata+13);
6081
pData->iJHDRalphafilter = *(pRawdata+14);
6082
pData->iJHDRalphainterlace = *(pRawdata+15);
6085
#if defined(MNG_NO_1_2_4BIT_SUPPORT) || defined(MNG_NO_16BIT_SUPPORT)
6086
pData->iPNGmult = 1;
6087
pData->iPNGdepth = pData->iJHDRalphabitdepth;
6090
#ifdef MNG_NO_1_2_4BIT_SUPPORT
6091
if (pData->iJHDRalphabitdepth < 8)
6092
pData->iJHDRalphabitdepth = 8;
6095
#ifdef MNG_NO_16BIT_SUPPORT
6096
if (pData->iJHDRalphabitdepth > 8)
6098
pData->iPNGmult = 2;
6099
pData->iJHDRalphabitdepth = 8;
6102
/* parameter validity checks */
6103
if ((pData->iJHDRcolortype != MNG_COLORTYPE_JPEGGRAY ) &&
6104
(pData->iJHDRcolortype != MNG_COLORTYPE_JPEGCOLOR ) &&
6105
(pData->iJHDRcolortype != MNG_COLORTYPE_JPEGGRAYA ) &&
6106
(pData->iJHDRcolortype != MNG_COLORTYPE_JPEGCOLORA) )
6107
MNG_ERROR (pData, MNG_INVALIDCOLORTYPE);
6109
if ((pData->iJHDRimgbitdepth != MNG_BITDEPTH_JPEG8 ) &&
6110
(pData->iJHDRimgbitdepth != MNG_BITDEPTH_JPEG12 ) &&
6111
(pData->iJHDRimgbitdepth != MNG_BITDEPTH_JPEG8AND12) )
6112
MNG_ERROR (pData, MNG_INVALIDBITDEPTH);
6114
if (pData->iJHDRimgcompression != MNG_COMPRESSION_BASELINEJPEG)
6115
MNG_ERROR (pData, MNG_INVALIDCOMPRESS);
6117
if ((pData->iJHDRimginterlace != MNG_INTERLACE_SEQUENTIAL ) &&
6118
(pData->iJHDRimginterlace != MNG_INTERLACE_PROGRESSIVE) )
6119
MNG_ERROR (pData, MNG_INVALIDINTERLACE);
6121
if ((pData->iJHDRcolortype == MNG_COLORTYPE_JPEGGRAYA ) ||
6122
(pData->iJHDRcolortype == MNG_COLORTYPE_JPEGCOLORA) )
6124
if ((pData->iJHDRalphabitdepth != MNG_BITDEPTH_8 )
6125
#ifndef MNG_NO_1_2_4BIT_SUPPORT
6126
&& (pData->iJHDRalphabitdepth != MNG_BITDEPTH_1 ) &&
6127
(pData->iJHDRalphabitdepth != MNG_BITDEPTH_2 ) &&
6128
(pData->iJHDRalphabitdepth != MNG_BITDEPTH_4 )
6130
#ifndef MNG_NO_16BIT_SUPPORT
6131
&& (pData->iJHDRalphabitdepth != MNG_BITDEPTH_16)
6134
MNG_ERROR (pData, MNG_INVALIDBITDEPTH);
6136
if ((pData->iJHDRalphacompression != MNG_COMPRESSION_DEFLATE ) &&
6137
(pData->iJHDRalphacompression != MNG_COMPRESSION_BASELINEJPEG) )
6138
MNG_ERROR (pData, MNG_INVALIDCOMPRESS);
6140
if ((pData->iJHDRalphacompression == MNG_COMPRESSION_BASELINEJPEG) &&
6141
(pData->iJHDRalphabitdepth != MNG_BITDEPTH_8 ) )
6142
MNG_ERROR (pData, MNG_INVALIDBITDEPTH);
6144
#if defined(FILTER192) || defined(FILTER193)
6145
if ((pData->iJHDRalphafilter != MNG_FILTER_ADAPTIVE ) &&
6146
#if defined(FILTER192) && defined(FILTER193)
6147
(pData->iJHDRalphafilter != MNG_FILTER_DIFFERING) &&
6148
(pData->iJHDRalphafilter != MNG_FILTER_NOFILTER ) )
6151
(pData->iJHDRalphafilter != MNG_FILTER_DIFFERING) )
6153
(pData->iJHDRalphafilter != MNG_FILTER_NOFILTER ) )
6156
MNG_ERROR (pData, MNG_INVALIDFILTER);
6158
if (pData->iJHDRalphafilter)
6159
MNG_ERROR (pData, MNG_INVALIDFILTER);
6162
if ((pData->iJHDRalphainterlace != MNG_INTERLACE_NONE ) &&
6163
(pData->iJHDRalphainterlace != MNG_INTERLACE_ADAM7) )
6164
MNG_ERROR (pData, MNG_INVALIDINTERLACE);
6169
if (pData->iJHDRalphabitdepth)
6170
MNG_ERROR (pData, MNG_INVALIDBITDEPTH);
6172
if (pData->iJHDRalphacompression)
6173
MNG_ERROR (pData, MNG_INVALIDCOMPRESS);
6175
if (pData->iJHDRalphafilter)
6176
MNG_ERROR (pData, MNG_INVALIDFILTER);
6178
if (pData->iJHDRalphainterlace)
6179
MNG_ERROR (pData, MNG_INVALIDINTERLACE);
6183
if (!pData->bHasheader) /* first chunk ? */
6185
pData->bHasheader = MNG_TRUE; /* we've got a header */
6186
pData->eImagetype = mng_it_jng; /* then this must be a JNG */
6187
pData->iWidth = mng_get_uint32 (pRawdata);
6188
pData->iHeight = mng_get_uint32 (pRawdata+4);
6189
/* predict alpha-depth ! */
6190
if ((pData->iJHDRcolortype == MNG_COLORTYPE_JPEGGRAYA ) ||
6191
(pData->iJHDRcolortype == MNG_COLORTYPE_JPEGCOLORA) )
6192
pData->iAlphadepth = pData->iJHDRalphabitdepth;
6194
pData->iAlphadepth = 0;
6195
/* fits on maximum canvas ? */
6196
if ((pData->iWidth > pData->iMaxwidth) || (pData->iHeight > pData->iMaxheight))
6197
MNG_WARNING (pData, MNG_IMAGETOOLARGE);
6199
if (pData->fProcessheader) /* inform the app ? */
6200
if (!pData->fProcessheader (((mng_handle)pData), pData->iWidth, pData->iHeight))
6201
MNG_ERROR (pData, MNG_APPMISCERROR);
6205
pData->iColortype = 0; /* fake grayscale for other routines */
6206
pData->iImagelevel++; /* one level deeper */
6208
#ifdef MNG_SUPPORT_DISPLAY
6210
mng_retcode iRetcode = mng_process_display_jhdr (pData);
6212
if (iRetcode) /* on error bail out */
6215
#endif /* MNG_SUPPORT_DISPLAY */
6217
#ifdef MNG_STORE_CHUNKS
6218
if (pData->bStorechunks)
6219
{ /* initialize storage */
6220
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
6222
if (iRetcode) /* on error bail out */
6224
/* store the fields */
6225
((mng_jhdrp)*ppChunk)->iWidth = mng_get_uint32 (pRawdata);
6226
((mng_jhdrp)*ppChunk)->iHeight = mng_get_uint32 (pRawdata+4);
6227
((mng_jhdrp)*ppChunk)->iColortype = *(pRawdata+8);
6228
((mng_jhdrp)*ppChunk)->iImagesampledepth = *(pRawdata+9);
6229
((mng_jhdrp)*ppChunk)->iImagecompression = *(pRawdata+10);
6230
((mng_jhdrp)*ppChunk)->iImageinterlace = *(pRawdata+11);
6231
((mng_jhdrp)*ppChunk)->iAlphasampledepth = *(pRawdata+12);
6232
#ifdef MNG_NO_16BIT_SUPPORT
6233
if (*(pRawdata+12) > 8)
6234
((mng_jhdrp)*ppChunk)->iAlphasampledepth = 8;
6236
((mng_jhdrp)*ppChunk)->iAlphacompression = *(pRawdata+13);
6237
((mng_jhdrp)*ppChunk)->iAlphafilter = *(pRawdata+14);
6238
((mng_jhdrp)*ppChunk)->iAlphainterlace = *(pRawdata+15);
6240
#endif /* MNG_STORE_CHUNKS */
6242
#ifdef MNG_SUPPORT_TRACE
6243
MNG_TRACE (pData, MNG_FN_READ_JHDR, MNG_LC_END);
6246
return MNG_NOERROR; /* done */
6250
#endif /* MNG_INCLUDE_JNG */
6253
/* ************************************************************************** */
6255
#ifndef MNG_OPTIMIZE_CHUNKREADER
6256
#ifdef MNG_INCLUDE_JNG
6257
READ_CHUNK (mng_read_jdaa)
6259
#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS)
6260
volatile mng_retcode iRetcode;
6262
iRetcode=MNG_NOERROR;
6265
#ifdef MNG_SUPPORT_TRACE
6266
MNG_TRACE (pData, MNG_FN_READ_JDAA, MNG_LC_START);
6268
/* sequence checks */
6269
if ((!pData->bHasJHDR) && (!pData->bHasDHDR))
6270
MNG_ERROR (pData, MNG_SEQUENCEERROR);
6272
if (pData->bHasJSEP)
6273
MNG_ERROR (pData, MNG_SEQUENCEERROR);
6275
if (pData->iJHDRalphacompression != MNG_COMPRESSION_BASELINEJPEG)
6276
MNG_ERROR (pData, MNG_SEQUENCEERROR);
6278
if (iRawlen == 0) /* can never be empty */
6279
MNG_ERROR (pData, MNG_INVALIDLENGTH);
6281
pData->bHasJDAA = MNG_TRUE; /* got some JDAA now, don't we */
6283
#ifdef MNG_SUPPORT_DISPLAY
6284
iRetcode = mng_process_display_jdaa (pData, iRawlen, pRawdata);
6286
if (iRetcode) /* on error bail out */
6288
#endif /* MNG_SUPPORT_DISPLAY */
6290
#ifdef MNG_STORE_CHUNKS
6291
if (pData->bStorechunks)
6292
{ /* initialize storage */
6293
iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
6295
if (iRetcode) /* on error bail out */
6297
/* store the fields */
6298
((mng_jdaap)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
6299
((mng_jdaap)*ppChunk)->iDatasize = iRawlen;
6301
if (iRawlen != 0) /* is there any data ? */
6303
MNG_ALLOC (pData, ((mng_jdaap)*ppChunk)->pData, iRawlen);
6304
MNG_COPY (((mng_jdaap)*ppChunk)->pData, pRawdata, iRawlen);
6307
#endif /* MNG_STORE_CHUNKS */
6309
#ifdef MNG_SUPPORT_TRACE
6310
MNG_TRACE (pData, MNG_FN_READ_JDAA, MNG_LC_END);
6313
return MNG_NOERROR; /* done */
6317
#endif /* MNG_INCLUDE_JNG */
6320
/* ************************************************************************** */
6322
#ifndef MNG_OPTIMIZE_CHUNKREADER
6323
#ifdef MNG_INCLUDE_JNG
6324
READ_CHUNK (mng_read_jdat)
6326
#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS)
6327
volatile mng_retcode iRetcode;
6329
iRetcode=MNG_NOERROR;
6332
#ifdef MNG_SUPPORT_TRACE
6333
MNG_TRACE (pData, MNG_FN_READ_JDAT, MNG_LC_START);
6335
/* sequence checks */
6336
if ((!pData->bHasJHDR) && (!pData->bHasDHDR))
6337
MNG_ERROR (pData, MNG_SEQUENCEERROR);
6339
if (iRawlen == 0) /* can never be empty */
6340
MNG_ERROR (pData, MNG_INVALIDLENGTH);
6342
pData->bHasJDAT = MNG_TRUE; /* got some JDAT now, don't we */
6344
#ifdef MNG_SUPPORT_DISPLAY
6345
iRetcode = mng_process_display_jdat (pData, iRawlen, pRawdata);
6347
if (iRetcode) /* on error bail out */
6349
#endif /* MNG_SUPPORT_DISPLAY */
6351
#ifdef MNG_STORE_CHUNKS
6352
if (pData->bStorechunks)
6353
{ /* initialize storage */
6354
iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
6356
if (iRetcode) /* on error bail out */
6358
/* store the fields */
6359
((mng_jdatp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
6360
((mng_jdatp)*ppChunk)->iDatasize = iRawlen;
6362
if (iRawlen != 0) /* is there any data ? */
6364
MNG_ALLOC (pData, ((mng_jdatp)*ppChunk)->pData, iRawlen);
6365
MNG_COPY (((mng_jdatp)*ppChunk)->pData, pRawdata, iRawlen);
6368
#endif /* MNG_STORE_CHUNKS */
6370
#ifdef MNG_SUPPORT_TRACE
6371
MNG_TRACE (pData, MNG_FN_READ_JDAT, MNG_LC_END);
6374
return MNG_NOERROR; /* done */
6378
#endif /* MNG_INCLUDE_JNG */
6381
/* ************************************************************************** */
6383
#ifndef MNG_OPTIMIZE_CHUNKREADER
6384
#ifdef MNG_INCLUDE_JNG
6385
READ_CHUNK (mng_read_jsep)
6387
#ifdef MNG_SUPPORT_TRACE
6388
MNG_TRACE (pData, MNG_FN_READ_JSEP, MNG_LC_START);
6391
if (!pData->bHasJHDR) /* sequence checks */
6392
MNG_ERROR (pData, MNG_SEQUENCEERROR);
6394
if (iRawlen != 0) /* must be empty ! */
6395
MNG_ERROR (pData, MNG_INVALIDLENGTH);
6397
pData->bHasJSEP = MNG_TRUE; /* indicate we've had the 8-/12-bit separator */
6399
#ifdef MNG_STORE_CHUNKS
6400
if (pData->bStorechunks)
6401
{ /* initialize storage */
6402
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
6404
if (iRetcode) /* on error bail out */
6408
#endif /* MNG_STORE_CHUNKS */
6410
#ifdef MNG_SUPPORT_TRACE
6411
MNG_TRACE (pData, MNG_FN_READ_JSEP, MNG_LC_END);
6414
return MNG_NOERROR; /* done */
6418
#endif /* MNG_INCLUDE_JNG */
6421
/* ************************************************************************** */
6423
#ifndef MNG_OPTIMIZE_CHUNKREADER
6424
#ifndef MNG_NO_DELTA_PNG
6425
READ_CHUNK (mng_read_dhdr)
6427
mng_uint8 iImagetype, iDeltatype;
6428
#ifdef MNG_SUPPORT_TRACE
6429
MNG_TRACE (pData, MNG_FN_READ_DHDR, MNG_LC_START);
6432
if (!pData->bHasMHDR) /* sequence checks */
6433
MNG_ERROR (pData, MNG_SEQUENCEERROR);
6435
#ifdef MNG_INCLUDE_JNG
6436
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))
6438
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
6440
MNG_ERROR (pData, MNG_SEQUENCEERROR);
6441
/* check for valid length */
6442
if ((iRawlen != 4) && (iRawlen != 12) && (iRawlen != 20))
6443
MNG_ERROR (pData, MNG_INVALIDLENGTH);
6445
iImagetype = *(pRawdata+2); /* check fields for validity */
6446
iDeltatype = *(pRawdata+3);
6448
if (iImagetype > MNG_IMAGETYPE_JNG)
6449
MNG_ERROR (pData, MNG_INVIMAGETYPE);
6451
if (iDeltatype > MNG_DELTATYPE_NOCHANGE)
6452
MNG_ERROR (pData, MNG_INVDELTATYPE);
6454
if ((iDeltatype == MNG_DELTATYPE_REPLACE) && (iRawlen > 12))
6455
MNG_ERROR (pData, MNG_INVALIDLENGTH);
6457
if ((iDeltatype == MNG_DELTATYPE_NOCHANGE) && (iRawlen > 4))
6458
MNG_ERROR (pData, MNG_INVALIDLENGTH);
6460
pData->bHasDHDR = MNG_TRUE; /* inside a DHDR-IEND block now */
6461
pData->iDeltatype = iDeltatype;
6463
pData->iImagelevel++; /* one level deeper */
6465
#ifdef MNG_SUPPORT_DISPLAY
6467
mng_uint16 iObjectid = mng_get_uint16 (pRawdata);
6468
mng_uint32 iBlockwidth = 0;
6469
mng_uint32 iBlockheight = 0;
6470
mng_uint32 iBlockx = 0;
6471
mng_uint32 iBlocky = 0;
6472
mng_retcode iRetcode;
6476
iBlockwidth = mng_get_uint32 (pRawdata+4);
6477
iBlockheight = mng_get_uint32 (pRawdata+8);
6482
iBlockx = mng_get_uint32 (pRawdata+12);
6483
iBlocky = mng_get_uint32 (pRawdata+16);
6486
iRetcode = mng_create_ani_dhdr (pData, iObjectid, iImagetype, iDeltatype,
6487
iBlockwidth, iBlockheight, iBlockx, iBlocky);
6489
if (!iRetcode) /* display processing ? */
6490
iRetcode = mng_process_display_dhdr (pData, iObjectid, iImagetype, iDeltatype,
6491
iBlockwidth, iBlockheight, iBlockx, iBlocky);
6493
if (iRetcode) /* on error bail out */
6497
#endif /* MNG_SUPPORT_DISPLAY */
6499
#ifdef MNG_STORE_CHUNKS
6500
if (pData->bStorechunks)
6501
{ /* initialize storage */
6502
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
6504
if (iRetcode) /* on error bail out */
6506
/* store the fields */
6507
((mng_dhdrp)*ppChunk)->iObjectid = mng_get_uint16 (pRawdata);
6508
((mng_dhdrp)*ppChunk)->iImagetype = iImagetype;
6509
((mng_dhdrp)*ppChunk)->iDeltatype = iDeltatype;
6513
((mng_dhdrp)*ppChunk)->iBlockwidth = mng_get_uint32 (pRawdata+4);
6514
((mng_dhdrp)*ppChunk)->iBlockheight = mng_get_uint32 (pRawdata+8);
6519
((mng_dhdrp)*ppChunk)->iBlockx = mng_get_uint32 (pRawdata+12);
6520
((mng_dhdrp)*ppChunk)->iBlocky = mng_get_uint32 (pRawdata+16);
6523
#endif /* MNG_STORE_CHUNKS */
6525
#ifdef MNG_SUPPORT_TRACE
6526
MNG_TRACE (pData, MNG_FN_READ_DHDR, MNG_LC_END);
6529
return MNG_NOERROR; /* done */
6534
/* ************************************************************************** */
6536
#ifndef MNG_OPTIMIZE_CHUNKREADER
6537
#ifndef MNG_NO_DELTA_PNG
6538
READ_CHUNK (mng_read_prom)
6540
mng_uint8 iColortype;
6541
mng_uint8 iSampledepth;
6542
mng_uint8 iFilltype;
6544
#ifdef MNG_SUPPORT_TRACE
6545
MNG_TRACE (pData, MNG_FN_READ_PROM, MNG_LC_START);
6547
/* sequence checks */
6548
if ((!pData->bHasMHDR) || (!pData->bHasDHDR))
6549
MNG_ERROR (pData, MNG_SEQUENCEERROR);
6551
if (iRawlen != 3) /* gotta be exactly 3 bytes */
6552
MNG_ERROR (pData, MNG_INVALIDLENGTH);
6554
iColortype = *pRawdata; /* check fields for validity */
6555
iSampledepth = *(pRawdata+1);
6556
iFilltype = *(pRawdata+2);
6558
if ((iColortype != MNG_COLORTYPE_GRAY ) &&
6559
(iColortype != MNG_COLORTYPE_RGB ) &&
6560
(iColortype != MNG_COLORTYPE_INDEXED) &&
6561
(iColortype != MNG_COLORTYPE_GRAYA ) &&
6562
(iColortype != MNG_COLORTYPE_RGBA ) )
6563
MNG_ERROR (pData, MNG_INVALIDCOLORTYPE);
6565
#ifdef MNG_NO_16BIT_SUPPORT
6566
if (iSampledepth == MNG_BITDEPTH_16 )
6567
iSampledepth = MNG_BITDEPTH_8;
6570
if ((iSampledepth != MNG_BITDEPTH_1 ) &&
6571
(iSampledepth != MNG_BITDEPTH_2 ) &&
6572
(iSampledepth != MNG_BITDEPTH_4 ) &&
6573
(iSampledepth != MNG_BITDEPTH_8 )
6574
#ifndef MNG_NO_16BIT_SUPPORT
6575
&& (iSampledepth != MNG_BITDEPTH_16)
6578
MNG_ERROR (pData, MNG_INVSAMPLEDEPTH);
6580
if ((iFilltype != MNG_FILLMETHOD_LEFTBITREPLICATE) &&
6581
(iFilltype != MNG_FILLMETHOD_ZEROFILL ) )
6582
MNG_ERROR (pData, MNG_INVFILLMETHOD);
6584
#ifdef MNG_SUPPORT_DISPLAY
6586
mng_retcode iRetcode = mng_create_ani_prom (pData, iSampledepth,
6587
iColortype, iFilltype);
6589
if (!iRetcode) /* display processing ? */
6590
iRetcode = mng_process_display_prom (pData, iSampledepth,
6591
iColortype, iFilltype);
6592
if (iRetcode) /* on error bail out */
6595
#endif /* MNG_SUPPORT_DISPLAY */
6597
#ifdef MNG_STORE_CHUNKS
6598
if (pData->bStorechunks)
6599
{ /* initialize storage */
6600
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
6602
if (iRetcode) /* on error bail out */
6604
/* store the fields */
6605
((mng_promp)*ppChunk)->iColortype = iColortype;
6606
((mng_promp)*ppChunk)->iSampledepth = iSampledepth;
6607
((mng_promp)*ppChunk)->iFilltype = iFilltype;
6609
#endif /* MNG_STORE_CHUNKS */
6611
#ifdef MNG_SUPPORT_TRACE
6612
MNG_TRACE (pData, MNG_FN_READ_PROM, MNG_LC_END);
6615
return MNG_NOERROR; /* done */
6620
/* ************************************************************************** */
6622
#ifndef MNG_OPTIMIZE_CHUNKREADER
6623
#ifndef MNG_NO_DELTA_PNG
6624
READ_CHUNK (mng_read_ipng)
6626
#ifdef MNG_SUPPORT_TRACE
6627
MNG_TRACE (pData, MNG_FN_READ_IPNG, MNG_LC_START);
6629
/* sequence checks */
6630
if ((!pData->bHasMHDR) || (!pData->bHasDHDR))
6631
MNG_ERROR (pData, MNG_SEQUENCEERROR);
6633
if (iRawlen != 0) /* gotta be empty */
6634
MNG_ERROR (pData, MNG_INVALIDLENGTH);
6636
#ifdef MNG_SUPPORT_DISPLAY
6638
mng_retcode iRetcode = mng_create_ani_ipng (pData);
6640
if (!iRetcode) /* process it */
6641
iRetcode = mng_process_display_ipng (pData);
6643
if (iRetcode) /* on error bail out */
6647
#endif /* MNG_SUPPORT_DISPLAY */
6649
#ifdef MNG_STORE_CHUNKS
6650
if (pData->bStorechunks)
6651
{ /* initialize storage */
6652
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
6654
if (iRetcode) /* on error bail out */
6657
#endif /* MNG_STORE_CHUNKS */
6659
#ifdef MNG_SUPPORT_TRACE
6660
MNG_TRACE (pData, MNG_FN_READ_IPNG, MNG_LC_END);
6663
return MNG_NOERROR; /* done */
6668
/* ************************************************************************** */
6670
#ifndef MNG_OPTIMIZE_CHUNKREADER
6671
#ifndef MNG_NO_DELTA_PNG
6672
READ_CHUNK (mng_read_pplt)
6674
mng_uint8 iDeltatype;
6680
mng_rgbpaltab aIndexentries;
6681
mng_uint8arr aAlphaentries;
6682
mng_uint8arr aUsedentries;
6684
#ifdef MNG_SUPPORT_TRACE
6685
MNG_TRACE (pData, MNG_FN_READ_PPLT, MNG_LC_START);
6687
/* sequence checks */
6688
if ((!pData->bHasMHDR) && (!pData->bHasDHDR))
6689
MNG_ERROR (pData, MNG_SEQUENCEERROR);
6691
if (iRawlen < 1) /* must have at least 1 byte */
6692
MNG_ERROR (pData, MNG_INVALIDLENGTH);
6694
iDeltatype = *pRawdata;
6696
if (iDeltatype > MNG_DELTATYPE_DELTARGBA)
6697
MNG_ERROR (pData, MNG_INVDELTATYPE);
6698
/* must be indexed color ! */
6699
if (pData->iColortype != MNG_COLORTYPE_INDEXED)
6700
MNG_ERROR (pData, MNG_INVALIDCOLORTYPE);
6702
pTemp = pRawdata + 1;
6706
for (iY = 0; iY < 256; iY++) /* reset arrays */
6708
aIndexentries [iY].iRed = 0;
6709
aIndexentries [iY].iGreen = 0;
6710
aIndexentries [iY].iBlue = 0;
6711
aAlphaentries [iY] = 255;
6712
aUsedentries [iY] = 0;
6715
while (iLen) /* as long as there are entries left ... */
6720
MNG_ERROR (pData, MNG_INVALIDLENGTH);
6722
iX = *pTemp; /* get start and end index */
6726
MNG_ERROR (pData, MNG_INVALIDINDEX);
6728
if ((mng_uint32)iM >= iMax) /* determine highest used index */
6729
iMax = (mng_uint32)iM + 1;
6733
iDiff = (iM - iX + 1);
6734
if ((iDeltatype == MNG_DELTATYPE_REPLACERGB ) ||
6735
(iDeltatype == MNG_DELTATYPE_DELTARGB ) )
6738
if ((iDeltatype == MNG_DELTATYPE_REPLACERGBA) ||
6739
(iDeltatype == MNG_DELTATYPE_DELTARGBA ) )
6743
MNG_ERROR (pData, MNG_INVALIDLENGTH);
6745
if ((iDeltatype == MNG_DELTATYPE_REPLACERGB ) ||
6746
(iDeltatype == MNG_DELTATYPE_DELTARGB ) )
6748
for (iY = (mng_uint32)iX; iY <= (mng_uint32)iM; iY++)
6750
aIndexentries [iY].iRed = *pTemp;
6751
aIndexentries [iY].iGreen = *(pTemp+1);
6752
aIndexentries [iY].iBlue = *(pTemp+2);
6753
aUsedentries [iY] = 1;
6760
if ((iDeltatype == MNG_DELTATYPE_REPLACEALPHA) ||
6761
(iDeltatype == MNG_DELTATYPE_DELTAALPHA ) )
6763
for (iY = (mng_uint32)iX; iY <= (mng_uint32)iM; iY++)
6765
aAlphaentries [iY] = *pTemp;
6766
aUsedentries [iY] = 1;
6774
for (iY = (mng_uint32)iX; iY <= (mng_uint32)iM; iY++)
6776
aIndexentries [iY].iRed = *pTemp;
6777
aIndexentries [iY].iGreen = *(pTemp+1);
6778
aIndexentries [iY].iBlue = *(pTemp+2);
6779
aAlphaentries [iY] = *(pTemp+3);
6780
aUsedentries [iY] = 1;
6788
switch (pData->iBitdepth) /* check maximum allowed entries for bitdepth */
6790
case MNG_BITDEPTH_1 : {
6792
MNG_ERROR (pData, MNG_INVALIDINDEX);
6795
case MNG_BITDEPTH_2 : {
6797
MNG_ERROR (pData, MNG_INVALIDINDEX);
6800
case MNG_BITDEPTH_4 : {
6802
MNG_ERROR (pData, MNG_INVALIDINDEX);
6807
#ifdef MNG_SUPPORT_DISPLAY
6808
{ /* create animation object */
6809
mng_retcode iRetcode = mng_create_ani_pplt (pData, iDeltatype, iMax,
6810
aIndexentries, aAlphaentries,
6813
if (!iRetcode) /* execute it now ? */
6814
iRetcode = mng_process_display_pplt (pData, iDeltatype, iMax, aIndexentries,
6815
aAlphaentries, aUsedentries);
6817
if (iRetcode) /* on error bail out */
6821
#endif /* MNG_SUPPORT_DISPLAY */
6823
#ifdef MNG_STORE_CHUNKS
6824
if (pData->bStorechunks)
6825
{ /* initialize storage */
6826
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
6828
if (iRetcode) /* on error bail out */
6830
/* store the fields */
6831
((mng_ppltp)*ppChunk)->iDeltatype = iDeltatype;
6832
((mng_ppltp)*ppChunk)->iCount = iMax;
6834
for (iY = 0; iY < 256; iY++)
6836
((mng_ppltp)*ppChunk)->aEntries [iY].iRed = aIndexentries [iY].iRed;
6837
((mng_ppltp)*ppChunk)->aEntries [iY].iGreen = aIndexentries [iY].iGreen;
6838
((mng_ppltp)*ppChunk)->aEntries [iY].iBlue = aIndexentries [iY].iBlue;
6839
((mng_ppltp)*ppChunk)->aEntries [iY].iAlpha = aAlphaentries [iY];
6840
((mng_ppltp)*ppChunk)->aEntries [iY].bUsed = (mng_bool)(aUsedentries [iY]);
6843
#endif /* MNG_STORE_CHUNKS */
6845
#ifdef MNG_SUPPORT_TRACE
6846
MNG_TRACE (pData, MNG_FN_READ_PPLT, MNG_LC_END);
6849
return MNG_NOERROR; /* done */
6854
/* ************************************************************************** */
6856
#ifndef MNG_OPTIMIZE_CHUNKREADER
6857
#ifndef MNG_NO_DELTA_PNG
6858
#ifdef MNG_INCLUDE_JNG
6859
READ_CHUNK (mng_read_ijng)
6861
#ifdef MNG_SUPPORT_TRACE
6862
MNG_TRACE (pData, MNG_FN_READ_IJNG, MNG_LC_START);
6864
/* sequence checks */
6865
if ((!pData->bHasMHDR) || (!pData->bHasDHDR))
6866
MNG_ERROR (pData, MNG_SEQUENCEERROR);
6868
if (iRawlen != 0) /* gotta be empty */
6869
MNG_ERROR (pData, MNG_INVALIDLENGTH);
6871
#ifdef MNG_SUPPORT_DISPLAY
6873
mng_retcode iRetcode = mng_create_ani_ijng (pData);
6875
if (!iRetcode) /* process it */
6876
iRetcode = mng_process_display_ijng (pData);
6878
if (iRetcode) /* on error bail out */
6882
#endif /* MNG_SUPPORT_DISPLAY */
6884
#ifdef MNG_STORE_CHUNKS
6885
if (pData->bStorechunks)
6886
{ /* initialize storage */
6887
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
6889
if (iRetcode) /* on error bail out */
6892
#endif /* MNG_STORE_CHUNKS */
6894
#ifdef MNG_SUPPORT_TRACE
6895
MNG_TRACE (pData, MNG_FN_READ_IJNG, MNG_LC_END);
6898
return MNG_NOERROR; /* done */
6904
/* ************************************************************************** */
6906
#ifndef MNG_OPTIMIZE_CHUNKREADER
6907
#ifndef MNG_NO_DELTA_PNG
6908
READ_CHUNK (mng_read_drop)
6910
#ifdef MNG_SUPPORT_TRACE
6911
MNG_TRACE (pData, MNG_FN_READ_DROP, MNG_LC_START);
6913
/* sequence checks */
6914
if ((!pData->bHasMHDR) || (!pData->bHasDHDR))
6915
MNG_ERROR (pData, MNG_SEQUENCEERROR);
6917
if ((iRawlen < 4) || ((iRawlen % 4) != 0))
6918
MNG_ERROR (pData, MNG_INVALIDLENGTH);
6920
#ifdef MNG_SUPPORT_DISPLAY
6924
/* TODO: something !!! */
6928
#endif /* MNG_SUPPORT_DISPLAY */
6930
#ifdef MNG_STORE_CHUNKS
6931
if (pData->bStorechunks)
6932
{ /* initialize storage */
6933
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
6935
if (iRetcode) /* on error bail out */
6937
/* store the fields */
6938
((mng_dropp)*ppChunk)->iCount = iRawlen / 4;
6943
mng_uint8p pTemp = pRawdata;
6946
MNG_ALLOC (pData, pEntry, iRawlen);
6948
((mng_dropp)*ppChunk)->pChunknames = (mng_ptr)pEntry;
6950
for (iX = 0; iX < iRawlen / 4; iX++)
6952
*pEntry = mng_get_uint32 (pTemp);
6959
#endif /* MNG_STORE_CHUNKS */
6961
#ifdef MNG_SUPPORT_TRACE
6962
MNG_TRACE (pData, MNG_FN_READ_DROP, MNG_LC_END);
6965
return MNG_NOERROR; /* done */
6970
/* ************************************************************************** */
6972
#ifndef MNG_OPTIMIZE_CHUNKREADER
6973
#ifndef MNG_NO_DELTA_PNG
6974
#ifndef MNG_SKIPCHUNK_DBYK
6975
READ_CHUNK (mng_read_dbyk)
6977
#ifdef MNG_SUPPORT_TRACE
6978
MNG_TRACE (pData, MNG_FN_READ_DBYK, MNG_LC_START);
6980
/* sequence checks */
6981
if ((!pData->bHasMHDR) || (!pData->bHasDHDR))
6982
MNG_ERROR (pData, MNG_SEQUENCEERROR);
6984
if (iRawlen < 6) /* must be at least 6 long */
6985
MNG_ERROR (pData, MNG_INVALIDLENGTH);
6987
#ifdef MNG_SUPPORT_DISPLAY
6991
/* TODO: something !!! */
6995
#endif /* MNG_SUPPORT_DISPLAY */
6997
#ifdef MNG_STORE_CHUNKS
6998
if (pData->bStorechunks)
6999
{ /* initialize storage */
7000
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
7002
if (iRetcode) /* on error bail out */
7004
/* store the fields */
7005
((mng_dbykp)*ppChunk)->iChunkname = mng_get_uint32 (pRawdata);
7006
((mng_dbykp)*ppChunk)->iPolarity = *(pRawdata+4);
7007
((mng_dbykp)*ppChunk)->iKeywordssize = iRawlen - 5;
7011
MNG_ALLOC (pData, ((mng_dbykp)*ppChunk)->zKeywords, iRawlen-4);
7012
MNG_COPY (((mng_dbykp)*ppChunk)->zKeywords, pRawdata+5, iRawlen-5);
7015
#endif /* MNG_STORE_CHUNKS */
7017
#ifdef MNG_SUPPORT_TRACE
7018
MNG_TRACE (pData, MNG_FN_READ_DBYK, MNG_LC_END);
7021
return MNG_NOERROR; /* done */
7027
/* ************************************************************************** */
7029
#ifndef MNG_OPTIMIZE_CHUNKREADER
7030
#ifndef MNG_NO_DELTA_PNG
7031
#ifndef MNG_SKIPCHUNK_ORDR
7032
READ_CHUNK (mng_read_ordr)
7034
#ifdef MNG_SUPPORT_TRACE
7035
MNG_TRACE (pData, MNG_FN_READ_ORDR, MNG_LC_START);
7037
/* sequence checks */
7038
if ((!pData->bHasMHDR) || (!pData->bHasDHDR))
7039
MNG_ERROR (pData, MNG_SEQUENCEERROR);
7041
if ((iRawlen < 5) || ((iRawlen % 5) != 0))
7042
MNG_ERROR (pData, MNG_INVALIDLENGTH);
7044
#ifdef MNG_SUPPORT_DISPLAY
7048
/* TODO: something !!! */
7052
#endif /* MNG_SUPPORT_DISPLAY */
7054
#ifdef MNG_STORE_CHUNKS
7055
if (pData->bStorechunks)
7056
{ /* initialize storage */
7057
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
7059
if (iRetcode) /* on error bail out */
7061
/* store the fields */
7062
((mng_ordrp)*ppChunk)->iCount = iRawlen / 5;
7067
mng_ordr_entryp pEntry;
7068
mng_uint8p pTemp = pRawdata;
7070
MNG_ALLOC (pData, pEntry, iRawlen);
7072
((mng_ordrp)*ppChunk)->pEntries = pEntry;
7074
for (iX = 0; iX < iRawlen / 5; iX++)
7076
pEntry->iChunkname = mng_get_uint32 (pTemp);
7077
pEntry->iOrdertype = *(pTemp+4);
7084
#endif /* MNG_STORE_CHUNKS */
7086
#ifdef MNG_SUPPORT_TRACE
7087
MNG_TRACE (pData, MNG_FN_READ_ORDR, MNG_LC_END);
7090
return MNG_NOERROR; /* done */
7096
/* ************************************************************************** */
7098
#ifndef MNG_OPTIMIZE_CHUNKREADER
7099
#ifndef MNG_SKIPCHUNK_MAGN
7100
READ_CHUNK (mng_read_magn)
7102
mng_uint16 iFirstid, iLastid;
7103
mng_uint8 iMethodX, iMethodY;
7104
mng_uint16 iMX, iMY, iML, iMR, iMT, iMB;
7107
#ifdef MNG_SUPPORT_TRACE
7108
MNG_TRACE (pData, MNG_FN_READ_MAGN, MNG_LC_START);
7110
/* sequence checks */
7111
#ifdef MNG_SUPPORT_JNG
7112
if ((!pData->bHasMHDR) || (pData->bHasIHDR) || (pData->bHasDHDR) || (pData->bHasJHDR))
7114
if ((!pData->bHasMHDR) || (pData->bHasIHDR) || (pData->bHasDHDR))
7116
MNG_ERROR (pData, MNG_SEQUENCEERROR);
7119
MNG_ERROR (pData, MNG_INVALIDLENGTH);
7121
/* following is an ugly hack to allow faulty layout caused by previous
7122
versions of libmng and MNGeye, which wrote MAGN with a 16-bit
7123
MethodX/MethodY (as opposed to the proper 8-bit as defined in the spec!) */
7125
if ((iRawlen == 6) || (iRawlen == 8) || (iRawlen == 10) || (iRawlen == 12) ||
7126
(iRawlen == 14) || (iRawlen == 16) || (iRawlen == 20))
7127
bFaulty = MNG_TRUE; /* these lengths are all wrong */
7128
else /* length 18 can be right or wrong !!! */
7129
if ((iRawlen == 18) && (mng_get_uint16 (pRawdata+4) <= 5) &&
7130
(mng_get_uint16 (pRawdata+6) < 256) &&
7131
(mng_get_uint16 (pRawdata+8) < 256) &&
7132
(mng_get_uint16 (pRawdata+10) < 256) &&
7133
(mng_get_uint16 (pRawdata+12) < 256) &&
7134
(mng_get_uint16 (pRawdata+14) < 256) &&
7135
(mng_get_uint16 (pRawdata+16) < 256))
7136
bFaulty = MNG_TRUE; /* this is very likely the wrong layout */
7138
bFaulty = MNG_FALSE; /* all other cases are handled as right */
7140
if (bFaulty) /* wrong layout ? */
7142
if (iRawlen > 0) /* get the fields */
7143
iFirstid = mng_get_uint16 (pRawdata);
7148
iLastid = mng_get_uint16 (pRawdata+2);
7153
iMethodX = (mng_uint8)(mng_get_uint16 (pRawdata+4));
7158
iMX = mng_get_uint16 (pRawdata+6);
7163
iMY = mng_get_uint16 (pRawdata+8);
7168
iML = mng_get_uint16 (pRawdata+10);
7173
iMR = mng_get_uint16 (pRawdata+12);
7178
iMT = mng_get_uint16 (pRawdata+14);
7183
iMB = mng_get_uint16 (pRawdata+16);
7188
iMethodY = (mng_uint8)(mng_get_uint16 (pRawdata+18));
7190
iMethodY = iMethodX;
7192
else /* proper layout !!!! */
7194
if (iRawlen > 0) /* get the fields */
7195
iFirstid = mng_get_uint16 (pRawdata);
7200
iLastid = mng_get_uint16 (pRawdata+2);
7205
iMethodX = *(pRawdata+4);
7210
iMX = mng_get_uint16 (pRawdata+5);
7215
iMY = mng_get_uint16 (pRawdata+7);
7220
iML = mng_get_uint16 (pRawdata+9);
7225
iMR = mng_get_uint16 (pRawdata+11);
7230
iMT = mng_get_uint16 (pRawdata+13);
7235
iMB = mng_get_uint16 (pRawdata+15);
7240
iMethodY = *(pRawdata+17);
7242
iMethodY = iMethodX;
7244
/* check field validity */
7245
if ((iMethodX > 5) || (iMethodY > 5))
7246
MNG_ERROR (pData, MNG_INVALIDMETHOD);
7248
#ifdef MNG_SUPPORT_DISPLAY
7250
mng_retcode iRetcode;
7252
iRetcode = mng_create_ani_magn (pData, iFirstid, iLastid, iMethodX,
7253
iMX, iMY, iML, iMR, iMT, iMB, iMethodY);
7255
if (!iRetcode) /* display processing ? */
7256
iRetcode = mng_process_display_magn (pData, iFirstid, iLastid, iMethodX,
7257
iMX, iMY, iML, iMR, iMT, iMB, iMethodY);
7259
if (iRetcode) /* on error bail out */
7263
#endif /* MNG_SUPPORT_DISPLAY */
7265
#ifdef MNG_STORE_CHUNKS
7266
if (pData->bStorechunks)
7267
{ /* initialize storage */
7268
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
7270
if (iRetcode) /* on error bail out */
7272
/* store the fields */
7273
((mng_magnp)*ppChunk)->iFirstid = iFirstid;
7274
((mng_magnp)*ppChunk)->iLastid = iLastid;
7275
((mng_magnp)*ppChunk)->iMethodX = iMethodX;
7276
((mng_magnp)*ppChunk)->iMX = iMX;
7277
((mng_magnp)*ppChunk)->iMY = iMY;
7278
((mng_magnp)*ppChunk)->iML = iML;
7279
((mng_magnp)*ppChunk)->iMR = iMR;
7280
((mng_magnp)*ppChunk)->iMT = iMT;
7281
((mng_magnp)*ppChunk)->iMB = iMB;
7282
((mng_magnp)*ppChunk)->iMethodY = iMethodY;
7284
#endif /* MNG_STORE_CHUNKS */
7286
#ifdef MNG_SUPPORT_TRACE
7287
MNG_TRACE (pData, MNG_FN_READ_MAGN, MNG_LC_END);
7290
return MNG_NOERROR; /* done */
7295
/* ************************************************************************** */
7297
#ifndef MNG_OPTIMIZE_CHUNKREADER
7298
#ifndef MNG_SKIPCHUNK_evNT
7299
READ_CHUNK (mng_read_evnt)
7301
#ifdef MNG_SUPPORT_TRACE
7302
MNG_TRACE (pData, MNG_FN_READ_EVNT, MNG_LC_START);
7304
/* sequence checks */
7305
if ((!pData->bHasMHDR) || (pData->bHasSAVE))
7306
MNG_ERROR (pData, MNG_SEQUENCEERROR);
7308
if (iRawlen < 2) /* must have at least 1 entry ! */
7309
MNG_ERROR (pData, MNG_INVALIDLENGTH);
7311
#if defined(MNG_SUPPORT_DISPLAY) && defined(MNG_SUPPORT_DYNAMICMNG)
7313
if (iRawlen) /* not empty ? */
7315
mng_retcode iRetcode;
7319
mng_uint8 iEventtype;
7320
mng_uint8 iMasktype;
7325
mng_uint16 iObjectid;
7327
mng_uint32 iNamesize;
7332
while (iLen) /* anything left ? */
7334
iEventtype = *pTemp; /* eventtype */
7336
MNG_ERROR (pData, MNG_INVALIDEVENT);
7340
iMasktype = *pTemp; /* masktype */
7342
MNG_ERROR (pData, MNG_INVALIDMASK);
7360
iLeft = mng_get_int32 (pTemp);
7361
iRight = mng_get_int32 (pTemp+4);
7362
iTop = mng_get_int32 (pTemp+8);
7363
iBottom = mng_get_int32 (pTemp+12);
7368
MNG_ERROR (pData, MNG_INVALIDLENGTH);
7375
iObjectid = mng_get_uint16 (pTemp);
7380
MNG_ERROR (pData, MNG_INVALIDLENGTH);
7387
iObjectid = mng_get_uint16 (pTemp);
7388
iIndex = *(pTemp+2);
7393
MNG_ERROR (pData, MNG_INVALIDLENGTH);
7400
iLeft = mng_get_int32 (pTemp);
7401
iRight = mng_get_int32 (pTemp+4);
7402
iTop = mng_get_int32 (pTemp+8);
7403
iBottom = mng_get_int32 (pTemp+12);
7404
iObjectid = mng_get_uint16 (pTemp+16);
7409
MNG_ERROR (pData, MNG_INVALIDLENGTH);
7416
iLeft = mng_get_int32 (pTemp);
7417
iRight = mng_get_int32 (pTemp+4);
7418
iTop = mng_get_int32 (pTemp+8);
7419
iBottom = mng_get_int32 (pTemp+12);
7420
iObjectid = mng_get_uint16 (pTemp+16);
7421
iIndex = *(pTemp+18);
7426
MNG_ERROR (pData, MNG_INVALIDLENGTH);
7431
pNull = find_null (pTemp); /* get the name length */
7433
if ((pNull - pTemp) > (mng_int32)iLen)
7435
iNamesize = iLen; /* no null found; so end of evNT */
7440
iNamesize = pNull - pTemp; /* should be another entry */
7441
iLen = iLen - iNamesize - 1;
7443
if (!iLen) /* must not end with a null ! */
7444
MNG_ERROR (pData, MNG_ENDWITHNULL);
7447
iRetcode = mng_create_event (pData, iEventtype, iMasktype, iLeft, iRight,
7448
iTop, iBottom, iObjectid, iIndex,
7449
iNamesize, (mng_pchar)pTemp);
7451
if (iRetcode) /* on error bail out */
7454
pTemp = pTemp + iNamesize + 1;
7458
#endif /* MNG_SUPPORT_DISPLAY && MNG_SUPPORT_DYNAMICMNG */
7460
#ifdef MNG_STORE_CHUNKS
7461
if (pData->bStorechunks)
7462
{ /* initialize storage */
7463
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
7465
if (iRetcode) /* on error bail out */
7468
if (iRawlen) /* not empty ? */
7471
mng_uint32 iCount = 0;
7475
mng_uint8 iEventtype;
7476
mng_uint8 iMasktype;
7481
mng_uint16 iObjectid;
7483
mng_uint32 iNamesize;
7484
mng_evnt_entryp pEntry = MNG_NULL;
7486
for (iX = 0; iX < 2; iX++) /* do this twice to get the count first ! */
7491
if (iX) /* second run ? */
7493
MNG_ALLOC (pData, pEntry, (iCount * sizeof (mng_evnt_entry)));
7495
((mng_evntp)*ppChunk)->iCount = iCount;
7496
((mng_evntp)*ppChunk)->pEntries = pEntry;
7499
while (iLen) /* anything left ? */
7501
iEventtype = *pTemp; /* eventtype */
7503
MNG_ERROR (pData, MNG_INVALIDEVENT);
7507
iMasktype = *pTemp; /* masktype */
7509
MNG_ERROR (pData, MNG_INVALIDMASK);
7527
iLeft = mng_get_int32 (pTemp);
7528
iRight = mng_get_int32 (pTemp+4);
7529
iTop = mng_get_int32 (pTemp+8);
7530
iBottom = mng_get_int32 (pTemp+12);
7535
MNG_ERROR (pData, MNG_INVALIDLENGTH);
7542
iObjectid = mng_get_uint16 (pTemp);
7547
MNG_ERROR (pData, MNG_INVALIDLENGTH);
7554
iObjectid = mng_get_uint16 (pTemp);
7555
iIndex = *(pTemp+2);
7560
MNG_ERROR (pData, MNG_INVALIDLENGTH);
7567
iLeft = mng_get_int32 (pTemp);
7568
iRight = mng_get_int32 (pTemp+4);
7569
iTop = mng_get_int32 (pTemp+8);
7570
iBottom = mng_get_int32 (pTemp+12);
7571
iObjectid = mng_get_uint16 (pTemp+16);
7576
MNG_ERROR (pData, MNG_INVALIDLENGTH);
7583
iLeft = mng_get_int32 (pTemp);
7584
iRight = mng_get_int32 (pTemp+4);
7585
iTop = mng_get_int32 (pTemp+8);
7586
iBottom = mng_get_int32 (pTemp+12);
7587
iObjectid = mng_get_uint16 (pTemp+16);
7588
iIndex = *(pTemp+18);
7593
MNG_ERROR (pData, MNG_INVALIDLENGTH);
7598
pNull = find_null (pTemp); /* get the name length */
7600
if ((pNull - pTemp) > (mng_int32)iLen)
7602
iNamesize = iLen; /* no null found; so end of evNT */
7607
iNamesize = pNull - pTemp; /* should be another entry */
7608
iLen = iLen - iNamesize - 1;
7610
if (!iLen) /* must not end with a null ! */
7611
MNG_ERROR (pData, MNG_ENDWITHNULL);
7620
pEntry->iEventtype = iEventtype;
7621
pEntry->iMasktype = iMasktype;
7622
pEntry->iLeft = iLeft;
7623
pEntry->iRight = iRight;
7624
pEntry->iTop = iTop;
7625
pEntry->iBottom = iBottom;
7626
pEntry->iObjectid = iObjectid;
7627
pEntry->iIndex = iIndex;
7628
pEntry->iSegmentnamesize = iNamesize;
7632
MNG_ALLOC (pData, pEntry->zSegmentname, iNamesize+1);
7633
MNG_COPY (pEntry->zSegmentname, pTemp, iNamesize);
7639
pTemp = pTemp + iNamesize + 1;
7644
#endif /* MNG_STORE_CHUNKS */
7646
#ifdef MNG_SUPPORT_TRACE
7647
MNG_TRACE (pData, MNG_FN_READ_EVNT, MNG_LC_END);
7650
return MNG_NOERROR; /* done */
7655
/* ************************************************************************** */
7657
#ifndef MNG_OPTIMIZE_CHUNKREADER
7658
READ_CHUNK (mng_read_unknown)
7660
#ifdef MNG_SUPPORT_TRACE
7661
MNG_TRACE (pData, MNG_FN_READ_UNKNOWN, MNG_LC_START);
7663
/* sequence checks */
7664
#ifdef MNG_INCLUDE_JNG
7665
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
7666
(!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
7668
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
7669
(!pData->bHasBASI) && (!pData->bHasDHDR) )
7671
MNG_ERROR (pData, MNG_SEQUENCEERROR);
7672
/* critical chunk ? */
7673
if ((((mng_uint32)pData->iChunkname & 0x20000000) == 0)
7674
#ifdef MNG_SKIPCHUNK_SAVE
7675
&& (pData->iChunkname != MNG_UINT_SAVE)
7677
#ifdef MNG_SKIPCHUNK_SEEK
7678
&& (pData->iChunkname != MNG_UINT_SEEK)
7680
#ifdef MNG_SKIPCHUNK_DBYK
7681
&& (pData->iChunkname != MNG_UINT_DBYK)
7683
#ifdef MNG_SKIPCHUNK_ORDR
7684
&& (pData->iChunkname != MNG_UINT_ORDR)
7687
MNG_ERROR (pData, MNG_UNKNOWNCRITICAL);
7689
if (pData->fProcessunknown) /* let the app handle it ? */
7691
mng_bool bOke = pData->fProcessunknown ((mng_handle)pData, pData->iChunkname,
7692
iRawlen, (mng_ptr)pRawdata);
7695
MNG_ERROR (pData, MNG_APPMISCERROR);
7698
#ifdef MNG_STORE_CHUNKS
7699
if (pData->bStorechunks)
7700
{ /* initialize storage */
7701
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
7703
if (iRetcode) /* on error bail out */
7705
/* store the length */
7706
((mng_chunk_headerp)*ppChunk)->iChunkname = pData->iChunkname;
7707
((mng_unknown_chunkp)*ppChunk)->iDatasize = iRawlen;
7709
if (iRawlen == 0) /* any data at all ? */
7710
((mng_unknown_chunkp)*ppChunk)->pData = 0;
7712
{ /* then store it */
7713
MNG_ALLOC (pData, ((mng_unknown_chunkp)*ppChunk)->pData, iRawlen);
7714
MNG_COPY (((mng_unknown_chunkp)*ppChunk)->pData, pRawdata, iRawlen);
7717
#endif /* MNG_STORE_CHUNKS */
7719
#ifdef MNG_SUPPORT_TRACE
7720
MNG_TRACE (pData, MNG_FN_READ_UNKNOWN, MNG_LC_END);
7723
return MNG_NOERROR; /* done */
7727
/* ************************************************************************** */
7729
#endif /* MNG_INCLUDE_READ_PROCS */
7731
/* ************************************************************************** */
7733
/* * chunk write functions * */
7735
/* ************************************************************************** */
7737
#ifdef MNG_INCLUDE_WRITE_PROCS
7739
/* ************************************************************************** */
7741
WRITE_CHUNK (mng_write_ihdr)
7744
mng_uint8p pRawdata;
7746
mng_retcode iRetcode;
7748
#ifdef MNG_SUPPORT_TRACE
7749
MNG_TRACE (pData, MNG_FN_WRITE_IHDR, MNG_LC_START);
7752
pIHDR = (mng_ihdrp)pChunk; /* address the proper chunk */
7753
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
7755
/* fill the output buffer */
7756
mng_put_uint32 (pRawdata, pIHDR->iWidth);
7757
mng_put_uint32 (pRawdata+4, pIHDR->iHeight);
7759
*(pRawdata+8) = pIHDR->iBitdepth;
7760
*(pRawdata+9) = pIHDR->iColortype;
7761
*(pRawdata+10) = pIHDR->iCompression;
7762
*(pRawdata+11) = pIHDR->iFilter;
7763
*(pRawdata+12) = pIHDR->iInterlace;
7765
iRetcode = write_raw_chunk (pData, pIHDR->sHeader.iChunkname, iRawlen, pRawdata);
7767
#ifdef MNG_SUPPORT_TRACE
7768
MNG_TRACE (pData, MNG_FN_WRITE_IHDR, MNG_LC_END);
7774
/* ************************************************************************** */
7776
WRITE_CHUNK (mng_write_plte)
7779
mng_uint8p pRawdata;
7781
mng_retcode iRetcode;
7785
#ifdef MNG_SUPPORT_TRACE
7786
MNG_TRACE (pData, MNG_FN_WRITE_PLTE, MNG_LC_START);
7789
pPLTE = (mng_pltep)pChunk; /* address the proper chunk */
7791
if (pPLTE->bEmpty) /* write empty chunk ? */
7792
iRetcode = write_raw_chunk (pData, pPLTE->sHeader.iChunkname, 0, 0);
7795
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
7796
iRawlen = pPLTE->iEntrycount * 3;
7797
/* fill the output buffer */
7800
for (iX = 0; iX < pPLTE->iEntrycount; iX++)
7802
*pTemp = pPLTE->aEntries [iX].iRed;
7803
*(pTemp+1) = pPLTE->aEntries [iX].iGreen;
7804
*(pTemp+2) = pPLTE->aEntries [iX].iBlue;
7809
iRetcode = write_raw_chunk (pData, pPLTE->sHeader.iChunkname, iRawlen, pRawdata);
7812
#ifdef MNG_SUPPORT_TRACE
7813
MNG_TRACE (pData, MNG_FN_WRITE_PLTE, MNG_LC_END);
7819
/* ************************************************************************** */
7821
WRITE_CHUNK (mng_write_idat)
7824
mng_retcode iRetcode;
7826
#ifdef MNG_SUPPORT_TRACE
7827
MNG_TRACE (pData, MNG_FN_WRITE_IDAT, MNG_LC_START);
7830
pIDAT = (mng_idatp)pChunk; /* address the proper chunk */
7832
if (pIDAT->bEmpty) /* and write it */
7833
iRetcode = write_raw_chunk (pData, pIDAT->sHeader.iChunkname, 0, 0);
7835
iRetcode = write_raw_chunk (pData, pIDAT->sHeader.iChunkname,
7836
pIDAT->iDatasize, pIDAT->pData);
7838
#ifdef MNG_SUPPORT_TRACE
7839
MNG_TRACE (pData, MNG_FN_WRITE_IDAT, MNG_LC_END);
7845
/* ************************************************************************** */
7847
WRITE_CHUNK (mng_write_iend)
7850
mng_retcode iRetcode;
7852
#ifdef MNG_SUPPORT_TRACE
7853
MNG_TRACE (pData, MNG_FN_WRITE_IEND, MNG_LC_START);
7856
pIEND = (mng_iendp)pChunk; /* address the proper chunk */
7858
iRetcode = write_raw_chunk (pData, pIEND->sHeader.iChunkname, 0, 0);
7860
#ifdef MNG_SUPPORT_TRACE
7861
MNG_TRACE (pData, MNG_FN_WRITE_IEND, MNG_LC_END);
7867
/* ************************************************************************** */
7869
WRITE_CHUNK (mng_write_trns)
7872
mng_uint8p pRawdata;
7874
mng_retcode iRetcode;
7878
#ifdef MNG_SUPPORT_TRACE
7879
MNG_TRACE (pData, MNG_FN_WRITE_TRNS, MNG_LC_START);
7882
pTRNS = (mng_trnsp)pChunk; /* address the proper chunk */
7884
if (pTRNS->bEmpty) /* write empty chunk ? */
7885
iRetcode = write_raw_chunk (pData, pTRNS->sHeader.iChunkname, 0, 0);
7887
if (pTRNS->bGlobal) /* write global chunk ? */
7888
iRetcode = write_raw_chunk (pData, pTRNS->sHeader.iChunkname,
7889
pTRNS->iRawlen, (mng_uint8p)pTRNS->aRawdata);
7892
pRawdata = pData->pWritebuf+8; /* init output buffer */
7893
iRawlen = 0; /* and default size */
7895
switch (pTRNS->iType)
7898
iRawlen = 2; /* fill the size & output buffer */
7899
mng_put_uint16 (pRawdata, pTRNS->iGray);
7904
iRawlen = 6; /* fill the size & output buffer */
7905
mng_put_uint16 (pRawdata, pTRNS->iRed);
7906
mng_put_uint16 (pRawdata+2, pTRNS->iGreen);
7907
mng_put_uint16 (pRawdata+4, pTRNS->iBlue);
7911
case 3: { /* init output buffer size */
7912
iRawlen = pTRNS->iCount;
7914
pTemp = pRawdata; /* fill the output buffer */
7916
for (iX = 0; iX < pTRNS->iCount; iX++)
7918
*pTemp = pTRNS->aEntries[iX];
7925
/* write the chunk */
7926
iRetcode = write_raw_chunk (pData, pTRNS->sHeader.iChunkname,
7930
#ifdef MNG_SUPPORT_TRACE
7931
MNG_TRACE (pData, MNG_FN_WRITE_TRNS, MNG_LC_END);
7937
/* ************************************************************************** */
7939
WRITE_CHUNK (mng_write_gama)
7942
mng_uint8p pRawdata;
7944
mng_retcode iRetcode;
7946
#ifdef MNG_SUPPORT_TRACE
7947
MNG_TRACE (pData, MNG_FN_WRITE_GAMA, MNG_LC_START);
7950
pGAMA = (mng_gamap)pChunk; /* address the proper chunk */
7952
if (pGAMA->bEmpty) /* write empty ? */
7953
iRetcode = write_raw_chunk (pData, pGAMA->sHeader.iChunkname, 0, 0);
7956
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
7958
/* fill the buffer */
7959
mng_put_uint32 (pRawdata, pGAMA->iGamma);
7961
iRetcode = write_raw_chunk (pData, pGAMA->sHeader.iChunkname,
7965
#ifdef MNG_SUPPORT_TRACE
7966
MNG_TRACE (pData, MNG_FN_WRITE_GAMA, MNG_LC_END);
7972
/* ************************************************************************** */
7974
#ifndef MNG_SKIPCHUNK_cHRM
7975
WRITE_CHUNK (mng_write_chrm)
7978
mng_uint8p pRawdata;
7980
mng_retcode iRetcode;
7982
#ifdef MNG_SUPPORT_TRACE
7983
MNG_TRACE (pData, MNG_FN_WRITE_CHRM, MNG_LC_START);
7986
pCHRM = (mng_chrmp)pChunk; /* address the proper chunk */
7988
if (pCHRM->bEmpty) /* write empty ? */
7989
iRetcode = write_raw_chunk (pData, pCHRM->sHeader.iChunkname, 0, 0);
7992
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
7994
/* fill the buffer */
7995
mng_put_uint32 (pRawdata, pCHRM->iWhitepointx);
7996
mng_put_uint32 (pRawdata+4, pCHRM->iWhitepointy);
7997
mng_put_uint32 (pRawdata+8, pCHRM->iRedx);
7998
mng_put_uint32 (pRawdata+12, pCHRM->iRedy);
7999
mng_put_uint32 (pRawdata+16, pCHRM->iGreenx);
8000
mng_put_uint32 (pRawdata+20, pCHRM->iGreeny);
8001
mng_put_uint32 (pRawdata+24, pCHRM->iBluex);
8002
mng_put_uint32 (pRawdata+28, pCHRM->iBluey);
8004
iRetcode = write_raw_chunk (pData, pCHRM->sHeader.iChunkname,
8008
#ifdef MNG_SUPPORT_TRACE
8009
MNG_TRACE (pData, MNG_FN_WRITE_CHRM, MNG_LC_END);
8016
/* ************************************************************************** */
8018
WRITE_CHUNK (mng_write_srgb)
8021
mng_uint8p pRawdata;
8023
mng_retcode iRetcode;
8025
#ifdef MNG_SUPPORT_TRACE
8026
MNG_TRACE (pData, MNG_FN_WRITE_SRGB, MNG_LC_START);
8029
pSRGB = (mng_srgbp)pChunk; /* address the proper chunk */
8031
if (pSRGB->bEmpty) /* write empty ? */
8032
iRetcode = write_raw_chunk (pData, pSRGB->sHeader.iChunkname, 0, 0);
8035
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8037
/* fill the buffer */
8038
*pRawdata = pSRGB->iRenderingintent;
8040
iRetcode = write_raw_chunk (pData, pSRGB->sHeader.iChunkname,
8044
#ifdef MNG_SUPPORT_TRACE
8045
MNG_TRACE (pData, MNG_FN_WRITE_SRGB, MNG_LC_END);
8051
/* ************************************************************************** */
8053
#ifndef MNG_SKIPCHUNK_iCCP
8054
WRITE_CHUNK (mng_write_iccp)
8057
mng_uint8p pRawdata;
8059
mng_retcode iRetcode;
8061
mng_uint8p pBuf = 0;
8063
mng_uint32 iReallen;
8065
#ifdef MNG_SUPPORT_TRACE
8066
MNG_TRACE (pData, MNG_FN_WRITE_ICCP, MNG_LC_START);
8069
pICCP = (mng_iccpp)pChunk; /* address the proper chunk */
8071
if (pICCP->bEmpty) /* write empty ? */
8072
iRetcode = write_raw_chunk (pData, pICCP->sHeader.iChunkname, 0, 0);
8074
{ /* compress the profile */
8075
iRetcode = deflate_buffer (pData, pICCP->pProfile, pICCP->iProfilesize,
8076
&pBuf, &iBuflen, &iReallen);
8078
if (!iRetcode) /* still oke ? */
8080
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8081
iRawlen = pICCP->iNamesize + 2 + iReallen;
8082
/* requires large buffer ? */
8083
if (iRawlen > pData->iWritebufsize)
8084
MNG_ALLOC (pData, pRawdata, iRawlen);
8086
pTemp = pRawdata; /* fill the buffer */
8088
if (pICCP->iNamesize)
8090
MNG_COPY (pTemp, pICCP->zName, pICCP->iNamesize);
8091
pTemp += pICCP->iNamesize;
8095
*(pTemp+1) = pICCP->iCompression;
8099
MNG_COPY (pTemp, pBuf, iReallen);
8101
iRetcode = write_raw_chunk (pData, pICCP->sHeader.iChunkname,
8103
/* drop the temp buffer ? */
8104
if (iRawlen > pData->iWritebufsize)
8105
MNG_FREEX (pData, pRawdata, iRawlen);
8109
MNG_FREEX (pData, pBuf, iBuflen); /* always drop the extra buffer */
8112
#ifdef MNG_SUPPORT_TRACE
8113
MNG_TRACE (pData, MNG_FN_WRITE_ICCP, MNG_LC_END);
8120
/* ************************************************************************** */
8122
#ifndef MNG_SKIPCHUNK_tEXt
8123
WRITE_CHUNK (mng_write_text)
8126
mng_uint8p pRawdata;
8128
mng_retcode iRetcode;
8131
#ifdef MNG_SUPPORT_TRACE
8132
MNG_TRACE (pData, MNG_FN_WRITE_TEXT, MNG_LC_START);
8135
pTEXT = (mng_textp)pChunk; /* address the proper chunk */
8137
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8138
iRawlen = pTEXT->iKeywordsize + 1 + pTEXT->iTextsize;
8139
/* requires large buffer ? */
8140
if (iRawlen > pData->iWritebufsize)
8141
MNG_ALLOC (pData, pRawdata, iRawlen);
8143
pTemp = pRawdata; /* fill the buffer */
8145
if (pTEXT->iKeywordsize)
8147
MNG_COPY (pTemp, pTEXT->zKeyword, pTEXT->iKeywordsize);
8148
pTemp += pTEXT->iKeywordsize;
8154
if (pTEXT->iTextsize)
8155
MNG_COPY (pTemp, pTEXT->zText, pTEXT->iTextsize);
8157
iRetcode = write_raw_chunk (pData, pTEXT->sHeader.iChunkname,
8160
if (iRawlen > pData->iWritebufsize) /* drop the temp buffer ? */
8161
MNG_FREEX (pData, pRawdata, iRawlen);
8163
#ifdef MNG_SUPPORT_TRACE
8164
MNG_TRACE (pData, MNG_FN_WRITE_TEXT, MNG_LC_END);
8171
/* ************************************************************************** */
8173
#ifndef MNG_SKIPCHUNK_zTXt
8174
WRITE_CHUNK (mng_write_ztxt)
8177
mng_uint8p pRawdata;
8179
mng_retcode iRetcode;
8181
mng_uint8p pBuf = 0;
8183
mng_uint32 iReallen;
8185
#ifdef MNG_SUPPORT_TRACE
8186
MNG_TRACE (pData, MNG_FN_WRITE_ZTXT, MNG_LC_START);
8189
pZTXT = (mng_ztxtp)pChunk; /* address the proper chunk */
8190
/* compress the text */
8191
iRetcode = deflate_buffer (pData, (mng_uint8p)pZTXT->zText, pZTXT->iTextsize,
8192
&pBuf, &iBuflen, &iReallen);
8194
if (!iRetcode) /* all ok ? */
8196
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8197
iRawlen = pZTXT->iKeywordsize + 2 + iReallen;
8198
/* requires large buffer ? */
8199
if (iRawlen > pData->iWritebufsize)
8200
MNG_ALLOC (pData, pRawdata, iRawlen);
8202
pTemp = pRawdata; /* fill the buffer */
8204
if (pZTXT->iKeywordsize)
8206
MNG_COPY (pTemp, pZTXT->zKeyword, pZTXT->iKeywordsize);
8207
pTemp += pZTXT->iKeywordsize;
8210
*pTemp = 0; /* terminator zero */
8212
*pTemp = 0; /* compression type */
8216
MNG_COPY (pTemp, pBuf, iReallen);
8218
iRetcode = write_raw_chunk (pData, pZTXT->sHeader.iChunkname,
8220
/* drop the temp buffer ? */
8221
if (iRawlen > pData->iWritebufsize)
8222
MNG_FREEX (pData, pRawdata, iRawlen);
8226
MNG_FREEX (pData, pBuf, iBuflen); /* always drop the compression buffer */
8228
#ifdef MNG_SUPPORT_TRACE
8229
MNG_TRACE (pData, MNG_FN_WRITE_ZTXT, MNG_LC_END);
8236
/* ************************************************************************** */
8238
#ifndef MNG_SKIPCHUNK_iTXt
8239
WRITE_CHUNK (mng_write_itxt)
8242
mng_uint8p pRawdata;
8244
mng_retcode iRetcode;
8246
mng_uint8p pBuf = 0;
8248
mng_uint32 iReallen;
8250
#ifdef MNG_SUPPORT_TRACE
8251
MNG_TRACE (pData, MNG_FN_WRITE_ITXT, MNG_LC_START);
8254
pITXT = (mng_itxtp)pChunk; /* address the proper chunk */
8256
if (pITXT->iCompressionflag) /* compress the text */
8257
iRetcode = deflate_buffer (pData, (mng_uint8p)pITXT->zText, pITXT->iTextsize,
8258
&pBuf, &iBuflen, &iReallen);
8260
iRetcode = MNG_NOERROR;
8262
if (!iRetcode) /* all ok ? */
8264
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8265
iRawlen = pITXT->iKeywordsize + pITXT->iLanguagesize +
8266
pITXT->iTranslationsize + 5;
8268
if (pITXT->iCompressionflag)
8269
iRawlen = iRawlen + iReallen;
8271
iRawlen = iRawlen + pITXT->iTextsize;
8272
/* requires large buffer ? */
8273
if (iRawlen > pData->iWritebufsize)
8274
MNG_ALLOC (pData, pRawdata, iRawlen);
8276
pTemp = pRawdata; /* fill the buffer */
8278
if (pITXT->iKeywordsize)
8280
MNG_COPY (pTemp, pITXT->zKeyword, pITXT->iKeywordsize);
8281
pTemp += pITXT->iKeywordsize;
8286
*pTemp = pITXT->iCompressionflag;
8288
*pTemp = pITXT->iCompressionmethod;
8291
if (pITXT->iLanguagesize)
8293
MNG_COPY (pTemp, pITXT->zLanguage, pITXT->iLanguagesize);
8294
pTemp += pITXT->iLanguagesize;
8300
if (pITXT->iTranslationsize)
8302
MNG_COPY (pTemp, pITXT->zTranslation, pITXT->iTranslationsize);
8303
pTemp += pITXT->iTranslationsize;
8309
if (pITXT->iCompressionflag)
8312
MNG_COPY (pTemp, pBuf, iReallen);
8316
if (pITXT->iTextsize)
8317
MNG_COPY (pTemp, pITXT->zText, pITXT->iTextsize);
8320
iRetcode = write_raw_chunk (pData, pITXT->sHeader.iChunkname,
8322
/* drop the temp buffer ? */
8323
if (iRawlen > pData->iWritebufsize)
8324
MNG_FREEX (pData, pRawdata, iRawlen);
8328
MNG_FREEX (pData, pBuf, iBuflen); /* always drop the compression buffer */
8330
if (iRetcode) /* on error bail out */
8333
#ifdef MNG_SUPPORT_TRACE
8334
MNG_TRACE (pData, MNG_FN_WRITE_ITXT, MNG_LC_END);
8341
/* ************************************************************************** */
8343
#ifndef MNG_SKIPCHUNK_bKGD
8344
WRITE_CHUNK (mng_write_bkgd)
8347
mng_uint8p pRawdata;
8349
mng_retcode iRetcode;
8351
#ifdef MNG_SUPPORT_TRACE
8352
MNG_TRACE (pData, MNG_FN_WRITE_BKGD, MNG_LC_START);
8355
pBKGD = (mng_bkgdp)pChunk; /* address the proper chunk */
8357
if (pBKGD->bEmpty) /* write empty ? */
8358
iRetcode = write_raw_chunk (pData, pBKGD->sHeader.iChunkname, 0, 0);
8361
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8362
iRawlen = 0; /* and default size */
8364
switch (pBKGD->iType)
8366
case 0: { /* gray */
8367
iRawlen = 2; /* fill the size & output buffer */
8368
mng_put_uint16 (pRawdata, pBKGD->iGray);
8373
iRawlen = 6; /* fill the size & output buffer */
8374
mng_put_uint16 (pRawdata, pBKGD->iRed);
8375
mng_put_uint16 (pRawdata+2, pBKGD->iGreen);
8376
mng_put_uint16 (pRawdata+4, pBKGD->iBlue);
8380
case 3: { /* indexed */
8381
iRawlen = 1; /* fill the size & output buffer */
8382
*pRawdata = pBKGD->iIndex;
8388
iRetcode = write_raw_chunk (pData, pBKGD->sHeader.iChunkname,
8392
#ifdef MNG_SUPPORT_TRACE
8393
MNG_TRACE (pData, MNG_FN_WRITE_BKGD, MNG_LC_END);
8400
/* ************************************************************************** */
8402
#ifndef MNG_SKIPCHUNK_pHYs
8403
WRITE_CHUNK (mng_write_phys)
8406
mng_uint8p pRawdata;
8408
mng_retcode iRetcode;
8410
#ifdef MNG_SUPPORT_TRACE
8411
MNG_TRACE (pData, MNG_FN_WRITE_PHYS, MNG_LC_START);
8414
pPHYS = (mng_physp)pChunk; /* address the proper chunk */
8416
if (pPHYS->bEmpty) /* write empty ? */
8417
iRetcode = write_raw_chunk (pData, pPHYS->sHeader.iChunkname, 0, 0);
8420
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8422
/* fill the output buffer */
8423
mng_put_uint32 (pRawdata, pPHYS->iSizex);
8424
mng_put_uint32 (pRawdata+4, pPHYS->iSizey);
8426
*(pRawdata+8) = pPHYS->iUnit;
8428
iRetcode = write_raw_chunk (pData, pPHYS->sHeader.iChunkname,
8432
#ifdef MNG_SUPPORT_TRACE
8433
MNG_TRACE (pData, MNG_FN_WRITE_PHYS, MNG_LC_END);
8440
/* ************************************************************************** */
8442
#ifndef MNG_SKIPCHUNK_sBIT
8443
WRITE_CHUNK (mng_write_sbit)
8446
mng_uint8p pRawdata;
8448
mng_retcode iRetcode;
8450
#ifdef MNG_SUPPORT_TRACE
8451
MNG_TRACE (pData, MNG_FN_WRITE_SBIT, MNG_LC_START);
8454
pSBIT = (mng_sbitp)pChunk; /* address the proper chunk */
8456
if (pSBIT->bEmpty) /* write empty ? */
8457
iRetcode = write_raw_chunk (pData, pSBIT->sHeader.iChunkname, 0, 0);
8460
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8461
iRawlen = 0; /* and default size */
8463
switch (pSBIT->iType)
8465
case 0: { /* gray */
8466
iRawlen = 1; /* fill the size & output buffer */
8467
*pRawdata = pSBIT->aBits[0];
8472
iRawlen = 3; /* fill the size & output buffer */
8473
*pRawdata = pSBIT->aBits[0];
8474
*(pRawdata+1) = pSBIT->aBits[1];
8475
*(pRawdata+2) = pSBIT->aBits[2];
8479
case 3: { /* indexed */
8480
iRawlen = 3; /* fill the size & output buffer */
8481
*pRawdata = pSBIT->aBits[0];
8482
*pRawdata = pSBIT->aBits[1];
8483
*pRawdata = pSBIT->aBits[2];
8487
case 4: { /* gray + alpha */
8488
iRawlen = 2; /* fill the size & output buffer */
8489
*pRawdata = pSBIT->aBits[0];
8490
*(pRawdata+1) = pSBIT->aBits[1];
8494
case 6: { /* rgb + alpha */
8495
iRawlen = 4; /* fill the size & output buffer */
8496
*pRawdata = pSBIT->aBits[0];
8497
*(pRawdata+1) = pSBIT->aBits[1];
8498
*(pRawdata+2) = pSBIT->aBits[2];
8499
*(pRawdata+3) = pSBIT->aBits[3];
8503
case 10: { /* jpeg gray */
8504
iRawlen = 1; /* fill the size & output buffer */
8505
*pRawdata = pSBIT->aBits[0];
8509
case 12: { /* jpeg rgb */
8510
iRawlen = 3; /* fill the size & output buffer */
8511
*pRawdata = pSBIT->aBits[0];
8512
*(pRawdata+1) = pSBIT->aBits[1];
8513
*(pRawdata+2) = pSBIT->aBits[2];
8517
case 14: { /* jpeg gray + alpha */
8518
iRawlen = 2; /* fill the size & output buffer */
8519
*pRawdata = pSBIT->aBits[0];
8520
*(pRawdata+1) = pSBIT->aBits[1];
8524
case 16: { /* jpeg rgb + alpha */
8525
iRawlen = 4; /* fill the size & output buffer */
8526
*pRawdata = pSBIT->aBits[0];
8527
*(pRawdata+1) = pSBIT->aBits[1];
8528
*(pRawdata+2) = pSBIT->aBits[2];
8529
*(pRawdata+3) = pSBIT->aBits[3];
8535
iRetcode = write_raw_chunk (pData, pSBIT->sHeader.iChunkname,
8539
#ifdef MNG_SUPPORT_TRACE
8540
MNG_TRACE (pData, MNG_FN_WRITE_SBIT, MNG_LC_END);
8547
/* ************************************************************************** */
8549
#ifndef MNG_SKIPCHUNK_sPLT
8550
WRITE_CHUNK (mng_write_splt)
8553
mng_uint8p pRawdata;
8555
mng_retcode iRetcode;
8556
mng_uint32 iEntrieslen;
8559
#ifdef MNG_SUPPORT_TRACE
8560
MNG_TRACE (pData, MNG_FN_WRITE_SPLT, MNG_LC_START);
8563
pSPLT = (mng_spltp)pChunk; /* address the proper chunk */
8565
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8566
iEntrieslen = ((pSPLT->iSampledepth >> 3) * 4 + 2) * pSPLT->iEntrycount;
8567
iRawlen = pSPLT->iNamesize + 2 + iEntrieslen;
8568
/* requires large buffer ? */
8569
if (iRawlen > pData->iWritebufsize)
8570
MNG_ALLOC (pData, pRawdata, iRawlen);
8572
pTemp = pRawdata; /* fill the buffer */
8574
if (pSPLT->iNamesize)
8576
MNG_COPY (pTemp, pSPLT->zName, pSPLT->iNamesize);
8577
pTemp += pSPLT->iNamesize;
8581
*(pTemp+1) = pSPLT->iSampledepth;
8584
if (pSPLT->iEntrycount)
8585
MNG_COPY (pTemp, pSPLT->pEntries, iEntrieslen);
8587
iRetcode = write_raw_chunk (pData, pSPLT->sHeader.iChunkname,
8590
if (iRawlen > pData->iWritebufsize) /* drop the temp buffer ? */
8591
MNG_FREEX (pData, pRawdata, iRawlen);
8593
#ifdef MNG_SUPPORT_TRACE
8594
MNG_TRACE (pData, MNG_FN_WRITE_SPLT, MNG_LC_END);
8601
/* ************************************************************************** */
8603
#ifndef MNG_SKIPCHUNK_hIST
8604
WRITE_CHUNK (mng_write_hist)
8607
mng_uint8p pRawdata;
8609
mng_retcode iRetcode;
8613
#ifdef MNG_SUPPORT_TRACE
8614
MNG_TRACE (pData, MNG_FN_WRITE_HIST, MNG_LC_START);
8617
pHIST = (mng_histp)pChunk; /* address the proper chunk */
8619
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8620
iRawlen = pHIST->iEntrycount << 1;
8622
pTemp = pRawdata; /* fill the output buffer */
8624
for (iX = 0; iX < pHIST->iEntrycount; iX++)
8626
mng_put_uint16 (pTemp, pHIST->aEntries [iX]);
8630
iRetcode = write_raw_chunk (pData, pHIST->sHeader.iChunkname,
8633
#ifdef MNG_SUPPORT_TRACE
8634
MNG_TRACE (pData, MNG_FN_WRITE_HIST, MNG_LC_END);
8641
/* ************************************************************************** */
8643
#ifndef MNG_SKIPCHUNK_tIME
8644
WRITE_CHUNK (mng_write_time)
8647
mng_uint8p pRawdata;
8649
mng_retcode iRetcode;
8651
#ifdef MNG_SUPPORT_TRACE
8652
MNG_TRACE (pData, MNG_FN_WRITE_TIME, MNG_LC_START);
8655
pTIME = (mng_timep)pChunk; /* address the proper chunk */
8657
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8659
/* fill the output buffer */
8660
mng_put_uint16 (pRawdata, pTIME->iYear);
8662
*(pRawdata+2) = pTIME->iMonth;
8663
*(pRawdata+3) = pTIME->iDay;
8664
*(pRawdata+4) = pTIME->iHour;
8665
*(pRawdata+5) = pTIME->iMinute;
8666
*(pRawdata+6) = pTIME->iSecond;
8668
iRetcode = write_raw_chunk (pData, pTIME->sHeader.iChunkname,
8671
#ifdef MNG_SUPPORT_TRACE
8672
MNG_TRACE (pData, MNG_FN_WRITE_TIME, MNG_LC_END);
8679
/* ************************************************************************** */
8681
WRITE_CHUNK (mng_write_mhdr)
8684
mng_uint8p pRawdata;
8686
mng_retcode iRetcode;
8688
#ifdef MNG_SUPPORT_TRACE
8689
MNG_TRACE (pData, MNG_FN_WRITE_MHDR, MNG_LC_START);
8692
pMHDR = (mng_mhdrp)pChunk; /* address the proper chunk */
8694
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8696
/* fill the output buffer */
8697
mng_put_uint32 (pRawdata, pMHDR->iWidth);
8698
mng_put_uint32 (pRawdata+4, pMHDR->iHeight);
8699
mng_put_uint32 (pRawdata+8, pMHDR->iTicks);
8700
mng_put_uint32 (pRawdata+12, pMHDR->iLayercount);
8701
mng_put_uint32 (pRawdata+16, pMHDR->iFramecount);
8702
mng_put_uint32 (pRawdata+20, pMHDR->iPlaytime);
8703
mng_put_uint32 (pRawdata+24, pMHDR->iSimplicity);
8706
iRetcode = write_raw_chunk (pData, pMHDR->sHeader.iChunkname,
8709
#ifdef MNG_SUPPORT_TRACE
8710
MNG_TRACE (pData, MNG_FN_WRITE_MHDR, MNG_LC_END);
8716
/* ************************************************************************** */
8718
WRITE_CHUNK (mng_write_mend)
8721
mng_retcode iRetcode;
8723
#ifdef MNG_SUPPORT_TRACE
8724
MNG_TRACE (pData, MNG_FN_WRITE_MEND, MNG_LC_START);
8727
pMEND = (mng_mendp)pChunk; /* address the proper chunk */
8729
iRetcode = write_raw_chunk (pData, pMEND->sHeader.iChunkname, 0, 0);
8731
#ifdef MNG_SUPPORT_TRACE
8732
MNG_TRACE (pData, MNG_FN_WRITE_MEND, MNG_LC_END);
8738
/* ************************************************************************** */
8740
WRITE_CHUNK (mng_write_loop)
8743
mng_uint8p pRawdata;
8745
mng_retcode iRetcode;
8746
#ifndef MNG_NO_LOOP_SIGNALS_SUPPORTED
8752
#ifdef MNG_SUPPORT_TRACE
8753
MNG_TRACE (pData, MNG_FN_WRITE_LOOP, MNG_LC_START);
8756
pLOOP = (mng_loopp)pChunk; /* address the proper chunk */
8758
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8760
/* fill the output buffer */
8761
*pRawdata = pLOOP->iLevel;
8762
mng_put_uint32 (pRawdata+1, pLOOP->iRepeat);
8764
if (pLOOP->iTermination)
8767
*(pRawdata+5) = pLOOP->iTermination;
8769
if ((pLOOP->iCount) ||
8770
(pLOOP->iItermin != 1) || (pLOOP->iItermax != 0x7FFFFFFFL))
8774
mng_put_uint32 (pRawdata+6, pLOOP->iItermin);
8775
mng_put_uint32 (pRawdata+10, pLOOP->iItermax);
8777
#ifndef MNG_NO_LOOP_SIGNALS_SUPPORTED
8780
iRawlen += pLOOP->iCount * 4;
8782
pTemp1 = pRawdata+14;
8783
pTemp2 = pLOOP->pSignals;
8785
for (iX = 0; iX < pLOOP->iCount; iX++)
8787
mng_put_uint32 (pTemp1, *pTemp2);
8797
iRetcode = write_raw_chunk (pData, pLOOP->sHeader.iChunkname,
8800
#ifdef MNG_SUPPORT_TRACE
8801
MNG_TRACE (pData, MNG_FN_WRITE_LOOP, MNG_LC_END);
8807
/* ************************************************************************** */
8809
WRITE_CHUNK (mng_write_endl)
8812
mng_uint8p pRawdata;
8814
mng_retcode iRetcode;
8816
#ifdef MNG_SUPPORT_TRACE
8817
MNG_TRACE (pData, MNG_FN_WRITE_ENDL, MNG_LC_START);
8820
pENDL = (mng_endlp)pChunk; /* address the proper chunk */
8822
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8825
*pRawdata = pENDL->iLevel; /* fill the output buffer */
8827
iRetcode = write_raw_chunk (pData, pENDL->sHeader.iChunkname,
8830
#ifdef MNG_SUPPORT_TRACE
8831
MNG_TRACE (pData, MNG_FN_WRITE_ENDL, MNG_LC_END);
8837
/* ************************************************************************** */
8839
WRITE_CHUNK (mng_write_defi)
8842
mng_uint8p pRawdata;
8844
mng_retcode iRetcode;
8846
#ifdef MNG_SUPPORT_TRACE
8847
MNG_TRACE (pData, MNG_FN_WRITE_DEFI, MNG_LC_START);
8850
pDEFI = (mng_defip)pChunk; /* address the proper chunk */
8852
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8854
/* fill the output buffer */
8855
mng_put_uint16 (pRawdata, pDEFI->iObjectid);
8857
if ((pDEFI->iDonotshow) || (pDEFI->iConcrete) || (pDEFI->bHasloca) || (pDEFI->bHasclip))
8860
*(pRawdata+2) = pDEFI->iDonotshow;
8862
if ((pDEFI->iConcrete) || (pDEFI->bHasloca) || (pDEFI->bHasclip))
8865
*(pRawdata+3) = pDEFI->iConcrete;
8867
if ((pDEFI->bHasloca) || (pDEFI->bHasclip))
8871
mng_put_uint32 (pRawdata+4, pDEFI->iXlocation);
8872
mng_put_uint32 (pRawdata+8, pDEFI->iYlocation);
8874
if (pDEFI->bHasclip)
8878
mng_put_uint32 (pRawdata+12, pDEFI->iLeftcb);
8879
mng_put_uint32 (pRawdata+16, pDEFI->iRightcb);
8880
mng_put_uint32 (pRawdata+20, pDEFI->iTopcb);
8881
mng_put_uint32 (pRawdata+24, pDEFI->iBottomcb);
8887
iRetcode = write_raw_chunk (pData, pDEFI->sHeader.iChunkname,
8890
#ifdef MNG_SUPPORT_TRACE
8891
MNG_TRACE (pData, MNG_FN_WRITE_DEFI, MNG_LC_END);
8897
/* ************************************************************************** */
8899
WRITE_CHUNK (mng_write_basi)
8902
mng_uint8p pRawdata;
8904
mng_retcode iRetcode;
8907
#ifdef MNG_SUPPORT_TRACE
8908
MNG_TRACE (pData, MNG_FN_WRITE_BASI, MNG_LC_START);
8911
pBASI = (mng_basip)pChunk; /* address the proper chunk */
8913
#ifndef MNG_NO_16BIT_SUPPORT
8914
if (pBASI->iBitdepth <= 8) /* determine opacity alpha-field */
8916
bOpaque = (mng_bool)(pBASI->iAlpha == 0xFF);
8917
#ifndef MNG_NO_16BIT_SUPPORT
8919
bOpaque = (mng_bool)(pBASI->iAlpha == 0xFFFF);
8922
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8924
/* fill the output buffer */
8925
mng_put_uint32 (pRawdata, pBASI->iWidth);
8926
mng_put_uint32 (pRawdata+4, pBASI->iHeight);
8928
*(pRawdata+8) = pBASI->iBitdepth;
8929
*(pRawdata+9) = pBASI->iColortype;
8930
*(pRawdata+10) = pBASI->iCompression;
8931
*(pRawdata+11) = pBASI->iFilter;
8932
*(pRawdata+12) = pBASI->iInterlace;
8934
if ((pBASI->iRed) || (pBASI->iGreen) || (pBASI->iBlue) ||
8935
(!bOpaque) || (pBASI->iViewable))
8938
mng_put_uint16 (pRawdata+13, pBASI->iRed);
8939
mng_put_uint16 (pRawdata+15, pBASI->iGreen);
8940
mng_put_uint16 (pRawdata+17, pBASI->iBlue);
8942
if ((!bOpaque) || (pBASI->iViewable))
8945
mng_put_uint16 (pRawdata+19, pBASI->iAlpha);
8947
if (pBASI->iViewable)
8950
*(pRawdata+21) = pBASI->iViewable;
8955
iRetcode = write_raw_chunk (pData, pBASI->sHeader.iChunkname,
8958
#ifdef MNG_SUPPORT_TRACE
8959
MNG_TRACE (pData, MNG_FN_WRITE_BASI, MNG_LC_END);
8965
/* ************************************************************************** */
8967
WRITE_CHUNK (mng_write_clon)
8970
mng_uint8p pRawdata;
8972
mng_retcode iRetcode;
8974
#ifdef MNG_SUPPORT_TRACE
8975
MNG_TRACE (pData, MNG_FN_WRITE_CLON, MNG_LC_START);
8978
pCLON = (mng_clonp)pChunk; /* address the proper chunk */
8980
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
8982
/* fill the output buffer */
8983
mng_put_uint16 (pRawdata, pCLON->iSourceid);
8984
mng_put_uint16 (pRawdata+2, pCLON->iCloneid);
8986
if ((pCLON->iClonetype) || (pCLON->iDonotshow) || (pCLON->iConcrete) || (pCLON->bHasloca))
8989
*(pRawdata+4) = pCLON->iClonetype;
8991
if ((pCLON->iDonotshow) || (pCLON->iConcrete) || (pCLON->bHasloca))
8994
*(pRawdata+5) = pCLON->iDonotshow;
8996
if ((pCLON->iConcrete) || (pCLON->bHasloca))
8999
*(pRawdata+6) = pCLON->iConcrete;
9001
if (pCLON->bHasloca)
9004
*(pRawdata+7) = pCLON->iLocationtype;
9005
mng_put_int32 (pRawdata+8, pCLON->iLocationx);
9006
mng_put_int32 (pRawdata+12, pCLON->iLocationy);
9012
iRetcode = write_raw_chunk (pData, pCLON->sHeader.iChunkname,
9015
#ifdef MNG_SUPPORT_TRACE
9016
MNG_TRACE (pData, MNG_FN_WRITE_CLON, MNG_LC_END);
9022
/* ************************************************************************** */
9024
#ifndef MNG_SKIPCHUNK_PAST
9025
WRITE_CHUNK (mng_write_past)
9028
mng_uint8p pRawdata;
9030
mng_retcode iRetcode;
9031
mng_past_sourcep pSource;
9035
#ifdef MNG_SUPPORT_TRACE
9036
MNG_TRACE (pData, MNG_FN_WRITE_PAST, MNG_LC_START);
9039
pPAST = (mng_pastp)pChunk; /* address the proper chunk */
9041
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9042
iRawlen = 11 + (30 * pPAST->iCount);
9043
/* requires large buffer ? */
9044
if (iRawlen > pData->iWritebufsize)
9045
MNG_ALLOC (pData, pRawdata, iRawlen);
9046
/* fill the output buffer */
9047
mng_put_uint16 (pRawdata, pPAST->iDestid);
9049
*(pRawdata+2) = pPAST->iTargettype;
9051
mng_put_int32 (pRawdata+3, pPAST->iTargetx);
9052
mng_put_int32 (pRawdata+7, pPAST->iTargety);
9054
pTemp = pRawdata+11;
9055
pSource = pPAST->pSources;
9057
for (iX = 0; iX < pPAST->iCount; iX++)
9059
mng_put_uint16 (pTemp, pSource->iSourceid);
9061
*(pTemp+2) = pSource->iComposition;
9062
*(pTemp+3) = pSource->iOrientation;
9063
*(pTemp+4) = pSource->iOffsettype;
9065
mng_put_int32 (pTemp+5, pSource->iOffsetx);
9066
mng_put_int32 (pTemp+9, pSource->iOffsety);
9068
*(pTemp+13) = pSource->iBoundarytype;
9070
mng_put_int32 (pTemp+14, pSource->iBoundaryl);
9071
mng_put_int32 (pTemp+18, pSource->iBoundaryr);
9072
mng_put_int32 (pTemp+22, pSource->iBoundaryt);
9073
mng_put_int32 (pTemp+26, pSource->iBoundaryb);
9079
iRetcode = write_raw_chunk (pData, pPAST->sHeader.iChunkname,
9081
/* free temporary buffer ? */
9082
if (iRawlen > pData->iWritebufsize)
9083
MNG_FREEX (pData, pRawdata, iRawlen);
9085
#ifdef MNG_SUPPORT_TRACE
9086
MNG_TRACE (pData, MNG_FN_WRITE_PAST, MNG_LC_END);
9093
/* ************************************************************************** */
9095
WRITE_CHUNK (mng_write_disc)
9098
mng_uint8p pRawdata;
9100
mng_retcode iRetcode;
9105
#ifdef MNG_SUPPORT_TRACE
9106
MNG_TRACE (pData, MNG_FN_WRITE_DISC, MNG_LC_START);
9109
pDISC = (mng_discp)pChunk; /* address the proper chunk */
9111
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9112
iRawlen = pDISC->iCount << 1;
9114
pTemp1 = pRawdata; /* fill the output buffer */
9115
pTemp2 = pDISC->pObjectids;
9117
for (iX = 0; iX < pDISC->iCount; iX++)
9119
mng_put_uint16 (pTemp1, *pTemp2);
9125
iRetcode = write_raw_chunk (pData, pDISC->sHeader.iChunkname,
9128
#ifdef MNG_SUPPORT_TRACE
9129
MNG_TRACE (pData, MNG_FN_WRITE_DISC, MNG_LC_END);
9135
/* ************************************************************************** */
9137
WRITE_CHUNK (mng_write_back)
9140
mng_uint8p pRawdata;
9142
mng_retcode iRetcode;
9144
#ifdef MNG_SUPPORT_TRACE
9145
MNG_TRACE (pData, MNG_FN_WRITE_BACK, MNG_LC_START);
9148
pBACK = (mng_backp)pChunk; /* address the proper chunk */
9150
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9152
/* fill the output buffer */
9153
mng_put_uint16 (pRawdata, pBACK->iRed);
9154
mng_put_uint16 (pRawdata+2, pBACK->iGreen);
9155
mng_put_uint16 (pRawdata+4, pBACK->iBlue);
9157
if ((pBACK->iMandatory) || (pBACK->iImageid) || (pBACK->iTile))
9160
*(pRawdata+6) = pBACK->iMandatory;
9162
if ((pBACK->iImageid) || (pBACK->iTile))
9165
mng_put_uint16 (pRawdata+7, pBACK->iImageid);
9170
*(pRawdata+9) = pBACK->iTile;
9175
iRetcode = write_raw_chunk (pData, pBACK->sHeader.iChunkname,
9178
#ifdef MNG_SUPPORT_TRACE
9179
MNG_TRACE (pData, MNG_FN_WRITE_BACK, MNG_LC_END);
9185
/* ************************************************************************** */
9187
WRITE_CHUNK (mng_write_fram)
9190
mng_uint8p pRawdata;
9192
mng_retcode iRetcode;
9197
#ifdef MNG_SUPPORT_TRACE
9198
MNG_TRACE (pData, MNG_FN_WRITE_FRAM, MNG_LC_START);
9201
pFRAM = (mng_framp)pChunk; /* address the proper chunk */
9203
if (pFRAM->bEmpty) /* empty ? */
9204
iRetcode = write_raw_chunk (pData, pFRAM->sHeader.iChunkname, 0, 0);
9207
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9209
/* fill the output buffer */
9210
*pRawdata = pFRAM->iMode;
9212
if ((pFRAM->iNamesize ) ||
9213
(pFRAM->iChangedelay ) || (pFRAM->iChangetimeout) ||
9214
(pFRAM->iChangeclipping) || (pFRAM->iChangesyncid ) )
9216
if (pFRAM->iNamesize)
9217
MNG_COPY (pRawdata+1, pFRAM->zName, pFRAM->iNamesize);
9219
iRawlen += pFRAM->iNamesize;
9220
pTemp = pRawdata + pFRAM->iNamesize + 1;
9222
if ((pFRAM->iChangedelay ) || (pFRAM->iChangetimeout) ||
9223
(pFRAM->iChangeclipping) || (pFRAM->iChangesyncid ) )
9226
*(pTemp+1) = pFRAM->iChangedelay;
9227
*(pTemp+2) = pFRAM->iChangetimeout;
9228
*(pTemp+3) = pFRAM->iChangeclipping;
9229
*(pTemp+4) = pFRAM->iChangesyncid;
9234
if (pFRAM->iChangedelay)
9236
mng_put_uint32 (pTemp, pFRAM->iDelay);
9241
if (pFRAM->iChangetimeout)
9243
mng_put_uint32 (pTemp, pFRAM->iTimeout);
9248
if (pFRAM->iChangeclipping)
9250
*pTemp = pFRAM->iBoundarytype;
9252
mng_put_uint32 (pTemp+1, pFRAM->iBoundaryl);
9253
mng_put_uint32 (pTemp+5, pFRAM->iBoundaryr);
9254
mng_put_uint32 (pTemp+9, pFRAM->iBoundaryt);
9255
mng_put_uint32 (pTemp+13, pFRAM->iBoundaryb);
9261
if (pFRAM->iChangesyncid)
9263
iRawlen += pFRAM->iCount * 4;
9264
pTemp2 = pFRAM->pSyncids;
9266
for (iX = 0; iX < pFRAM->iCount; iX++)
9268
mng_put_uint32 (pTemp, *pTemp2);
9277
iRetcode = write_raw_chunk (pData, pFRAM->sHeader.iChunkname,
9281
#ifdef MNG_SUPPORT_TRACE
9282
MNG_TRACE (pData, MNG_FN_WRITE_FRAM, MNG_LC_END);
9288
/* ************************************************************************** */
9290
WRITE_CHUNK (mng_write_move)
9293
mng_uint8p pRawdata;
9295
mng_retcode iRetcode;
9297
#ifdef MNG_SUPPORT_TRACE
9298
MNG_TRACE (pData, MNG_FN_WRITE_MOVE, MNG_LC_START);
9301
pMOVE = (mng_movep)pChunk; /* address the proper chunk */
9303
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9305
/* fill the output buffer */
9306
mng_put_uint16 (pRawdata, pMOVE->iFirstid);
9307
mng_put_uint16 (pRawdata+2, pMOVE->iLastid);
9309
*(pRawdata+4) = pMOVE->iMovetype;
9311
mng_put_int32 (pRawdata+5, pMOVE->iMovex);
9312
mng_put_int32 (pRawdata+9, pMOVE->iMovey);
9314
iRetcode = write_raw_chunk (pData, pMOVE->sHeader.iChunkname,
9317
#ifdef MNG_SUPPORT_TRACE
9318
MNG_TRACE (pData, MNG_FN_WRITE_MOVE, MNG_LC_END);
9324
/* ************************************************************************** */
9326
WRITE_CHUNK (mng_write_clip)
9329
mng_uint8p pRawdata;
9331
mng_retcode iRetcode;
9333
#ifdef MNG_SUPPORT_TRACE
9334
MNG_TRACE (pData, MNG_FN_WRITE_CLIP, MNG_LC_START);
9337
pCLIP = (mng_clipp)pChunk; /* address the proper chunk */
9339
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9341
/* fill the output buffer */
9342
mng_put_uint16 (pRawdata, pCLIP->iFirstid);
9343
mng_put_uint16 (pRawdata+2, pCLIP->iLastid);
9345
*(pRawdata+4) = pCLIP->iCliptype;
9347
mng_put_int32 (pRawdata+5, pCLIP->iClipl);
9348
mng_put_int32 (pRawdata+9, pCLIP->iClipr);
9349
mng_put_int32 (pRawdata+13, pCLIP->iClipt);
9350
mng_put_int32 (pRawdata+17, pCLIP->iClipb);
9352
iRetcode = write_raw_chunk (pData, pCLIP->sHeader.iChunkname,
9355
#ifdef MNG_SUPPORT_TRACE
9356
MNG_TRACE (pData, MNG_FN_WRITE_CLIP, MNG_LC_END);
9362
/* ************************************************************************** */
9364
WRITE_CHUNK (mng_write_show)
9367
mng_uint8p pRawdata;
9369
mng_retcode iRetcode;
9371
#ifdef MNG_SUPPORT_TRACE
9372
MNG_TRACE (pData, MNG_FN_WRITE_SHOW, MNG_LC_START);
9375
pSHOW = (mng_showp)pChunk; /* address the proper chunk */
9377
if (pSHOW->bEmpty) /* empty ? */
9378
iRetcode = write_raw_chunk (pData, pSHOW->sHeader.iChunkname, 0, 0);
9381
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9383
/* fill the output buffer */
9384
mng_put_uint16 (pRawdata, pSHOW->iFirstid);
9386
if ((pSHOW->iLastid != pSHOW->iFirstid) || (pSHOW->iMode))
9389
mng_put_uint16 (pRawdata+2, pSHOW->iLastid);
9394
*(pRawdata+4) = pSHOW->iMode;
9398
iRetcode = write_raw_chunk (pData, pSHOW->sHeader.iChunkname,
9402
#ifdef MNG_SUPPORT_TRACE
9403
MNG_TRACE (pData, MNG_FN_WRITE_SHOW, MNG_LC_END);
9409
/* ************************************************************************** */
9411
WRITE_CHUNK (mng_write_term)
9414
mng_uint8p pRawdata;
9416
mng_retcode iRetcode;
9418
#ifdef MNG_SUPPORT_TRACE
9419
MNG_TRACE (pData, MNG_FN_WRITE_TERM, MNG_LC_START);
9422
pTERM = (mng_termp)pChunk; /* address the proper chunk */
9424
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9427
*pRawdata = pTERM->iTermaction; /* fill the output buffer */
9429
if (pTERM->iTermaction == 3)
9432
*(pRawdata+1) = pTERM->iIteraction;
9434
mng_put_uint32 (pRawdata+2, pTERM->iDelay);
9435
mng_put_uint32 (pRawdata+6, pTERM->iItermax);
9438
iRetcode = write_raw_chunk (pData, pTERM->sHeader.iChunkname,
9441
#ifdef MNG_SUPPORT_TRACE
9442
MNG_TRACE (pData, MNG_FN_WRITE_TERM, MNG_LC_END);
9448
/* ************************************************************************** */
9450
#ifndef MNG_SKIPCHUNK_SAVE
9451
WRITE_CHUNK (mng_write_save)
9454
mng_uint8p pRawdata;
9456
mng_retcode iRetcode;
9457
mng_save_entryp pEntry;
9458
mng_uint32 iEntrysize;
9462
#ifdef MNG_SUPPORT_TRACE
9463
MNG_TRACE (pData, MNG_FN_WRITE_SAVE, MNG_LC_START);
9466
pSAVE = (mng_savep)pChunk; /* address the proper chunk */
9468
if (pSAVE->bEmpty) /* empty ? */
9469
iRetcode = write_raw_chunk (pData, pSAVE->sHeader.iChunkname, 0, 0);
9472
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9475
*pRawdata = pSAVE->iOffsettype; /* fill the output buffer */
9477
if (pSAVE->iOffsettype == 16)
9483
pEntry = pSAVE->pEntries;
9485
for (iX = 0; iX < pSAVE->iCount; iX++)
9487
if (iX) /* put separator null-byte, except the first */
9494
iRawlen += iEntrysize + pEntry->iNamesize;
9495
*pTemp = pEntry->iEntrytype;
9497
if (pSAVE->iOffsettype == 16)
9499
mng_put_uint32 (pTemp+1, pEntry->iOffset[0]);
9500
mng_put_uint32 (pTemp+5, pEntry->iOffset[1]);
9501
mng_put_uint32 (pTemp+9, pEntry->iStarttime[0]);
9502
mng_put_uint32 (pTemp+13, pEntry->iStarttime[1]);
9503
mng_put_uint32 (pTemp+17, pEntry->iLayernr);
9504
mng_put_uint32 (pTemp+21, pEntry->iFramenr);
9510
mng_put_uint32 (pTemp+1, pEntry->iOffset[1]);
9511
mng_put_uint32 (pTemp+5, pEntry->iStarttime[1]);
9512
mng_put_uint32 (pTemp+9, pEntry->iLayernr);
9513
mng_put_uint32 (pTemp+13, pEntry->iFramenr);
9518
if (pEntry->iNamesize)
9520
MNG_COPY (pTemp, pEntry->zName, pEntry->iNamesize);
9521
pTemp += pEntry->iNamesize;
9527
iRetcode = write_raw_chunk (pData, pSAVE->sHeader.iChunkname,
9531
#ifdef MNG_SUPPORT_TRACE
9532
MNG_TRACE (pData, MNG_FN_WRITE_SAVE, MNG_LC_END);
9539
/* ************************************************************************** */
9541
#ifndef MNG_SKIPCHUNK_SEEK
9542
WRITE_CHUNK (mng_write_seek)
9545
mng_uint8p pRawdata;
9547
mng_retcode iRetcode;
9549
#ifdef MNG_SUPPORT_TRACE
9550
MNG_TRACE (pData, MNG_FN_WRITE_SEEK, MNG_LC_START);
9553
pSEEK = (mng_seekp)pChunk; /* address the proper chunk */
9555
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9556
iRawlen = pSEEK->iNamesize;
9558
if (iRawlen) /* fill the output buffer */
9559
MNG_COPY (pRawdata, pSEEK->zName, iRawlen);
9561
iRetcode = write_raw_chunk (pData, pSEEK->sHeader.iChunkname,
9564
#ifdef MNG_SUPPORT_TRACE
9565
MNG_TRACE (pData, MNG_FN_WRITE_SEEK, MNG_LC_END);
9572
/* ************************************************************************** */
9574
#ifndef MNG_SKIPCHUNK_eXPI
9575
WRITE_CHUNK (mng_write_expi)
9578
mng_uint8p pRawdata;
9580
mng_retcode iRetcode;
9582
#ifdef MNG_SUPPORT_TRACE
9583
MNG_TRACE (pData, MNG_FN_WRITE_EXPI, MNG_LC_START);
9586
pEXPI = (mng_expip)pChunk; /* address the proper chunk */
9588
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9589
iRawlen = 2 + pEXPI->iNamesize;
9590
/* fill the output buffer */
9591
mng_put_uint16 (pRawdata, pEXPI->iSnapshotid);
9593
if (pEXPI->iNamesize)
9594
MNG_COPY (pRawdata+2, pEXPI->zName, pEXPI->iNamesize);
9596
iRetcode = write_raw_chunk (pData, pEXPI->sHeader.iChunkname,
9599
#ifdef MNG_SUPPORT_TRACE
9600
MNG_TRACE (pData, MNG_FN_WRITE_EXPI, MNG_LC_END);
9607
/* ************************************************************************** */
9609
#ifndef MNG_SKIPCHUNK_fPRI
9610
WRITE_CHUNK (mng_write_fpri)
9613
mng_uint8p pRawdata;
9615
mng_retcode iRetcode;
9617
#ifdef MNG_SUPPORT_TRACE
9618
MNG_TRACE (pData, MNG_FN_WRITE_FPRI, MNG_LC_START);
9621
pFPRI = (mng_fprip)pChunk; /* address the proper chunk */
9623
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9626
*pRawdata = pFPRI->iDeltatype; /* fill the output buffer */
9627
*(pRawdata+1) = pFPRI->iPriority;
9629
iRetcode = write_raw_chunk (pData, pFPRI->sHeader.iChunkname,
9632
#ifdef MNG_SUPPORT_TRACE
9633
MNG_TRACE (pData, MNG_FN_WRITE_FPRI, MNG_LC_END);
9640
/* ************************************************************************** */
9642
#ifndef MNG_SKIPCHUNK_nEED
9643
WRITE_CHUNK (mng_write_need)
9646
mng_uint8p pRawdata;
9648
mng_retcode iRetcode;
9650
#ifdef MNG_SUPPORT_TRACE
9651
MNG_TRACE (pData, MNG_FN_WRITE_NEED, MNG_LC_START);
9654
pNEED = (mng_needp)pChunk; /* address the proper chunk */
9656
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9657
iRawlen = pNEED->iKeywordssize;
9658
/* fill the output buffer */
9659
if (pNEED->iKeywordssize)
9660
MNG_COPY (pRawdata, pNEED->zKeywords, pNEED->iKeywordssize);
9662
iRetcode = write_raw_chunk (pData, pNEED->sHeader.iChunkname,
9665
#ifdef MNG_SUPPORT_TRACE
9666
MNG_TRACE (pData, MNG_FN_WRITE_NEED, MNG_LC_END);
9673
/* ************************************************************************** */
9675
#ifndef MNG_SKIPCHUNK_pHYg
9676
WRITE_CHUNK (mng_write_phyg)
9679
mng_uint8p pRawdata;
9681
mng_retcode iRetcode;
9683
#ifdef MNG_SUPPORT_TRACE
9684
MNG_TRACE (pData, MNG_FN_WRITE_PHYG, MNG_LC_START);
9687
pPHYG = (mng_phygp)pChunk; /* address the proper chunk */
9689
if (pPHYG->bEmpty) /* write empty ? */
9690
iRetcode = write_raw_chunk (pData, pPHYG->sHeader.iChunkname, 0, 0);
9693
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9695
/* fill the output buffer */
9696
mng_put_uint32 (pRawdata, pPHYG->iSizex);
9697
mng_put_uint32 (pRawdata+4, pPHYG->iSizey);
9699
*(pRawdata+8) = pPHYG->iUnit;
9701
iRetcode = write_raw_chunk (pData, pPHYG->sHeader.iChunkname,
9705
#ifdef MNG_SUPPORT_TRACE
9706
MNG_TRACE (pData, MNG_FN_WRITE_PHYG, MNG_LC_END);
9713
/* ************************************************************************** */
9716
#ifdef MNG_INCLUDE_JNG
9718
WRITE_CHUNK (mng_write_jhdr)
9721
mng_uint8p pRawdata;
9723
mng_retcode iRetcode;
9725
#ifdef MNG_SUPPORT_TRACE
9726
MNG_TRACE (pData, MNG_FN_WRITE_JHDR, MNG_LC_START);
9729
pJHDR = (mng_jhdrp)pChunk; /* address the proper chunk */
9730
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9732
/* fill the output buffer */
9733
mng_put_uint32 (pRawdata, pJHDR->iWidth);
9734
mng_put_uint32 (pRawdata+4, pJHDR->iHeight);
9736
*(pRawdata+8) = pJHDR->iColortype;
9737
*(pRawdata+9) = pJHDR->iImagesampledepth;
9738
*(pRawdata+10) = pJHDR->iImagecompression;
9739
*(pRawdata+11) = pJHDR->iImageinterlace;
9740
*(pRawdata+12) = pJHDR->iAlphasampledepth;
9741
*(pRawdata+13) = pJHDR->iAlphacompression;
9742
*(pRawdata+14) = pJHDR->iAlphafilter;
9743
*(pRawdata+15) = pJHDR->iAlphainterlace;
9745
iRetcode = write_raw_chunk (pData, pJHDR->sHeader.iChunkname, iRawlen, pRawdata);
9747
#ifdef MNG_SUPPORT_TRACE
9748
MNG_TRACE (pData, MNG_FN_WRITE_JHDR, MNG_LC_END);
9754
#define write_jhdr 0
9756
#endif /* MNG_INCLUDE_JNG */
9759
/* ************************************************************************** */
9761
#ifdef MNG_INCLUDE_JNG
9762
WRITE_CHUNK (mng_write_jdaa)
9765
mng_retcode iRetcode;
9767
#ifdef MNG_SUPPORT_TRACE
9768
MNG_TRACE (pData, MNG_FN_WRITE_JDAA, MNG_LC_START);
9771
pJDAA = (mng_jdaap)pChunk; /* address the proper chunk */
9773
if (pJDAA->bEmpty) /* and write it */
9774
iRetcode = write_raw_chunk (pData, pJDAA->sHeader.iChunkname, 0, 0);
9776
iRetcode = write_raw_chunk (pData, pJDAA->sHeader.iChunkname,
9777
pJDAA->iDatasize, pJDAA->pData);
9779
#ifdef MNG_SUPPORT_TRACE
9780
MNG_TRACE (pData, MNG_FN_WRITE_JDAA, MNG_LC_END);
9786
#define write_jdaa 0
9787
#endif /* MNG_INCLUDE_JNG */
9789
/* ************************************************************************** */
9792
#ifdef MNG_INCLUDE_JNG
9794
WRITE_CHUNK (mng_write_jdat)
9797
mng_retcode iRetcode;
9799
#ifdef MNG_SUPPORT_TRACE
9800
MNG_TRACE (pData, MNG_FN_WRITE_JDAT, MNG_LC_START);
9803
pJDAT = (mng_jdatp)pChunk; /* address the proper chunk */
9805
if (pJDAT->bEmpty) /* and write it */
9806
iRetcode = write_raw_chunk (pData, pJDAT->sHeader.iChunkname, 0, 0);
9808
iRetcode = write_raw_chunk (pData, pJDAT->sHeader.iChunkname,
9809
pJDAT->iDatasize, pJDAT->pData);
9811
#ifdef MNG_SUPPORT_TRACE
9812
MNG_TRACE (pData, MNG_FN_WRITE_JDAT, MNG_LC_END);
9818
#define write_jdat 0
9820
#endif /* MNG_INCLUDE_JNG */
9823
/* ************************************************************************** */
9826
#ifdef MNG_INCLUDE_JNG
9828
WRITE_CHUNK (mng_write_jsep)
9831
mng_retcode iRetcode;
9833
#ifdef MNG_SUPPORT_TRACE
9834
MNG_TRACE (pData, MNG_FN_WRITE_JSEP, MNG_LC_START);
9837
pJSEP = (mng_jsepp)pChunk; /* address the proper chunk */
9839
iRetcode = write_raw_chunk (pData, pJSEP->sHeader.iChunkname, 0, 0);
9841
#ifdef MNG_SUPPORT_TRACE
9842
MNG_TRACE (pData, MNG_FN_WRITE_JSEP, MNG_LC_END);
9848
#define write_jsep 0
9850
#endif /* MNG_INCLUDE_JNG */
9853
/* ************************************************************************** */
9855
#ifndef MNG_NO_DELTA_PNG
9856
WRITE_CHUNK (mng_write_dhdr)
9859
mng_uint8p pRawdata;
9861
mng_retcode iRetcode;
9863
#ifdef MNG_SUPPORT_TRACE
9864
MNG_TRACE (pData, MNG_FN_WRITE_DHDR, MNG_LC_START);
9867
pDHDR = (mng_dhdrp)pChunk; /* address the proper chunk */
9869
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9871
/* fill the output buffer */
9872
mng_put_uint16 (pRawdata, pDHDR->iObjectid);
9874
*(pRawdata+2) = pDHDR->iImagetype;
9875
*(pRawdata+3) = pDHDR->iDeltatype;
9877
if (pDHDR->iDeltatype != 7)
9880
mng_put_uint32 (pRawdata+4, pDHDR->iBlockwidth);
9881
mng_put_uint32 (pRawdata+8, pDHDR->iBlockheight);
9883
if (pDHDR->iDeltatype != 0)
9886
mng_put_uint32 (pRawdata+12, pDHDR->iBlockx);
9887
mng_put_uint32 (pRawdata+16, pDHDR->iBlocky);
9891
iRetcode = write_raw_chunk (pData, pDHDR->sHeader.iChunkname,
9894
#ifdef MNG_SUPPORT_TRACE
9895
MNG_TRACE (pData, MNG_FN_WRITE_DHDR, MNG_LC_END);
9902
/* ************************************************************************** */
9904
#ifndef MNG_NO_DELTA_PNG
9905
WRITE_CHUNK (mng_write_prom)
9908
mng_uint8p pRawdata;
9910
mng_retcode iRetcode;
9912
#ifdef MNG_SUPPORT_TRACE
9913
MNG_TRACE (pData, MNG_FN_WRITE_PROM, MNG_LC_START);
9916
pPROM = (mng_promp)pChunk; /* address the proper chunk */
9918
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9921
*pRawdata = pPROM->iColortype; /* fill the output buffer */
9922
*(pRawdata+1) = pPROM->iSampledepth;
9923
*(pRawdata+2) = pPROM->iFilltype;
9925
iRetcode = write_raw_chunk (pData, pPROM->sHeader.iChunkname,
9928
#ifdef MNG_SUPPORT_TRACE
9929
MNG_TRACE (pData, MNG_FN_WRITE_PROM, MNG_LC_END);
9936
/* ************************************************************************** */
9938
#ifndef MNG_NO_DELTA_PNG
9939
WRITE_CHUNK (mng_write_ipng)
9942
mng_retcode iRetcode;
9944
#ifdef MNG_SUPPORT_TRACE
9945
MNG_TRACE (pData, MNG_FN_WRITE_IPNG, MNG_LC_START);
9948
pIPNG = (mng_ipngp)pChunk; /* address the proper chunk */
9950
iRetcode = write_raw_chunk (pData, pIPNG->sHeader.iChunkname, 0, 0);
9952
#ifdef MNG_SUPPORT_TRACE
9953
MNG_TRACE (pData, MNG_FN_WRITE_IPNG, MNG_LC_END);
9960
/* ************************************************************************** */
9962
#ifndef MNG_NO_DELTA_PNG
9963
WRITE_CHUNK (mng_write_pplt)
9966
mng_uint8p pRawdata;
9968
mng_retcode iRetcode;
9969
mng_pplt_entryp pEntry;
9973
mng_uint8p pLastid = 0;
9975
#ifdef MNG_SUPPORT_TRACE
9976
MNG_TRACE (pData, MNG_FN_WRITE_PPLT, MNG_LC_START);
9979
pPPLT = (mng_ppltp)pChunk; /* address the proper chunk */
9981
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
9984
*pRawdata = pPPLT->iDeltatype; /* fill the output buffer */
9987
bHasgroup = MNG_FALSE;
9989
for (iX = 0; iX < pPPLT->iCount; iX++)
9991
pEntry = &pPPLT->aEntries[iX];
9993
if (pEntry->bUsed) /* valid entry ? */
9995
if (!bHasgroup) /* start a new group ? */
9997
bHasgroup = MNG_TRUE;
10000
*pTemp = (mng_uint8)iX;
10007
switch (pPPLT->iDeltatype) /* add group-entry depending on type */
10011
*pTemp = pEntry->iRed;
10012
*(pTemp+1) = pEntry->iGreen;
10013
*(pTemp+2) = pEntry->iBlue;
10023
*pTemp = pEntry->iAlpha;
10033
*pTemp = pEntry->iRed;
10034
*(pTemp+1) = pEntry->iGreen;
10035
*(pTemp+2) = pEntry->iBlue;
10036
*(pTemp+3) = pEntry->iAlpha;
10048
if (bHasgroup) /* finish off a group ? */
10049
*pLastid = (mng_uint8)(iX-1);
10051
bHasgroup = MNG_FALSE;
10055
if (bHasgroup) /* last group unfinished ? */
10056
*pLastid = (mng_uint8)(pPPLT->iCount-1);
10057
/* write the output buffer */
10058
iRetcode = write_raw_chunk (pData, pPPLT->sHeader.iChunkname,
10059
iRawlen, pRawdata);
10061
#ifdef MNG_SUPPORT_TRACE
10062
MNG_TRACE (pData, MNG_FN_WRITE_PPLT, MNG_LC_END);
10069
/* ************************************************************************** */
10071
#ifndef MNG_NO_DELTA_PNG
10072
#ifdef MNG_INCLUDE_JNG
10073
WRITE_CHUNK (mng_write_ijng)
10076
mng_retcode iRetcode;
10078
#ifdef MNG_SUPPORT_TRACE
10079
MNG_TRACE (pData, MNG_FN_WRITE_IJNG, MNG_LC_START);
10082
pIJNG = (mng_ijngp)pChunk; /* address the proper chunk */
10084
iRetcode = write_raw_chunk (pData, pIJNG->sHeader.iChunkname, 0, 0);
10086
#ifdef MNG_SUPPORT_TRACE
10087
MNG_TRACE (pData, MNG_FN_WRITE_IJNG, MNG_LC_END);
10095
/* ************************************************************************** */
10097
#ifndef MNG_NO_DELTA_PNG
10098
WRITE_CHUNK (mng_write_drop)
10101
mng_uint8p pRawdata;
10102
mng_uint32 iRawlen;
10103
mng_retcode iRetcode;
10106
mng_chunkidp pTemp2;
10108
#ifdef MNG_SUPPORT_TRACE
10109
MNG_TRACE (pData, MNG_FN_WRITE_DROP, MNG_LC_START);
10112
pDROP = (mng_dropp)pChunk; /* address the proper chunk */
10114
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
10115
iRawlen = pDROP->iCount << 2;
10117
pTemp1 = pRawdata; /* fill the output buffer */
10118
pTemp2 = pDROP->pChunknames;
10120
for (iX = 0; iX < pDROP->iCount; iX++)
10122
mng_put_uint32 (pTemp1, (mng_uint32)*pTemp2);
10128
iRetcode = write_raw_chunk (pData, pDROP->sHeader.iChunkname,
10129
iRawlen, pRawdata);
10131
#ifdef MNG_SUPPORT_TRACE
10132
MNG_TRACE (pData, MNG_FN_WRITE_DROP, MNG_LC_END);
10139
/* ************************************************************************** */
10141
#ifndef MNG_NO_DELTA_PNG
10142
#ifndef MNG_SKIPCHUNK_DBYK
10143
WRITE_CHUNK (mng_write_dbyk)
10146
mng_uint8p pRawdata;
10147
mng_uint32 iRawlen;
10148
mng_retcode iRetcode;
10150
#ifdef MNG_SUPPORT_TRACE
10151
MNG_TRACE (pData, MNG_FN_WRITE_DBYK, MNG_LC_START);
10154
pDBYK = (mng_dbykp)pChunk; /* address the proper chunk */
10156
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
10157
iRawlen = 5 + pDBYK->iKeywordssize;
10158
/* fill the output buffer */
10159
mng_put_uint32 (pRawdata, pDBYK->iChunkname);
10160
*(pRawdata+4) = pDBYK->iPolarity;
10162
if (pDBYK->iKeywordssize)
10163
MNG_COPY (pRawdata+5, pDBYK->zKeywords, pDBYK->iKeywordssize);
10165
iRetcode = write_raw_chunk (pData, pDBYK->sHeader.iChunkname,
10166
iRawlen, pRawdata);
10168
#ifdef MNG_SUPPORT_TRACE
10169
MNG_TRACE (pData, MNG_FN_WRITE_DBYK, MNG_LC_END);
10177
/* ************************************************************************** */
10179
#ifndef MNG_NO_DELTA_PNG
10180
#ifndef MNG_SKIPCHUNK_ORDR
10181
WRITE_CHUNK (mng_write_ordr)
10184
mng_uint8p pRawdata;
10185
mng_uint32 iRawlen;
10186
mng_retcode iRetcode;
10188
mng_ordr_entryp pEntry;
10191
#ifdef MNG_SUPPORT_TRACE
10192
MNG_TRACE (pData, MNG_FN_WRITE_ORDR, MNG_LC_START);
10195
pORDR = (mng_ordrp)pChunk; /* address the proper chunk */
10197
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
10198
iRawlen = pORDR->iCount * 5;
10200
pTemp = pRawdata; /* fill the output buffer */
10201
pEntry = pORDR->pEntries;
10203
for (iX = 0; iX < pORDR->iCount; iX++)
10205
mng_put_uint32 (pTemp, pEntry->iChunkname);
10206
*(pTemp+4) = pEntry->iOrdertype;
10211
iRetcode = write_raw_chunk (pData, pORDR->sHeader.iChunkname,
10212
iRawlen, pRawdata);
10214
#ifdef MNG_SUPPORT_TRACE
10215
MNG_TRACE (pData, MNG_FN_WRITE_ORDR, MNG_LC_END);
10223
/* ************************************************************************** */
10225
WRITE_CHUNK (mng_write_magn)
10228
mng_uint8p pRawdata;
10229
mng_uint32 iRawlen;
10230
mng_retcode iRetcode;
10232
#ifdef MNG_SUPPORT_TRACE
10233
MNG_TRACE (pData, MNG_FN_WRITE_MAGN, MNG_LC_START);
10236
pMAGN = (mng_magnp)pChunk; /* address the proper chunk */
10238
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
10240
/* fill the output buffer */
10241
mng_put_uint16 (pRawdata, pMAGN->iFirstid);
10242
mng_put_uint16 (pRawdata+2, pMAGN->iLastid);
10243
*(pRawdata+4) = pMAGN->iMethodX;
10244
mng_put_uint16 (pRawdata+5, pMAGN->iMX);
10245
mng_put_uint16 (pRawdata+7, pMAGN->iMY);
10246
mng_put_uint16 (pRawdata+9, pMAGN->iML);
10247
mng_put_uint16 (pRawdata+11, pMAGN->iMR);
10248
mng_put_uint16 (pRawdata+13, pMAGN->iMT);
10249
mng_put_uint16 (pRawdata+15, pMAGN->iMB);
10250
*(pRawdata+17) = pMAGN->iMethodY;
10251
/* optimize length */
10252
if (pMAGN->iMethodY == pMAGN->iMethodX)
10256
if (pMAGN->iMB == pMAGN->iMY)
10260
if (pMAGN->iMT == pMAGN->iMY)
10264
if (pMAGN->iMR == pMAGN->iMX)
10268
if (pMAGN->iML == pMAGN->iMX)
10272
if (pMAGN->iMY == pMAGN->iMX)
10276
if (pMAGN->iMX == 1)
10280
if (pMAGN->iMethodX == 0)
10284
if (pMAGN->iLastid == pMAGN->iFirstid)
10288
if (pMAGN->iFirstid == 0)
10301
iRetcode = write_raw_chunk (pData, pMAGN->sHeader.iChunkname,
10302
iRawlen, pRawdata);
10304
#ifdef MNG_SUPPORT_TRACE
10305
MNG_TRACE (pData, MNG_FN_WRITE_MAGN, MNG_LC_END);
10311
/* ************************************************************************** */
10313
#ifndef MNG_SKIPCHUNK_evNT
10314
WRITE_CHUNK (mng_write_evnt)
10317
mng_uint8p pRawdata;
10318
mng_uint32 iRawlen;
10319
mng_retcode iRetcode;
10320
mng_evnt_entryp pEntry;
10323
mng_uint32 iNamesize;
10325
#ifdef MNG_SUPPORT_TRACE
10326
MNG_TRACE (pData, MNG_FN_WRITE_EVNT, MNG_LC_START);
10329
pEVNT = (mng_evntp)pChunk; /* address the proper chunk */
10331
if (!pEVNT->iCount) /* empty ? */
10332
iRetcode = write_raw_chunk (pData, pEVNT->sHeader.iChunkname, 0, 0);
10335
pRawdata = pData->pWritebuf+8; /* init output buffer & size */
10338
pEntry = pEVNT->pEntries;
10340
for (iX = 0; iX < pEVNT->iCount; iX++)
10342
if (iX) /* put separator null-byte, except the first */
10349
*pTemp = pEntry->iEventtype;
10350
*(pTemp+1) = pEntry->iMasktype;
10354
switch (pEntry->iMasktype)
10358
mng_put_int32 (pTemp, pEntry->iLeft);
10359
mng_put_int32 (pTemp+4, pEntry->iRight);
10360
mng_put_int32 (pTemp+8, pEntry->iTop);
10361
mng_put_int32 (pTemp+12, pEntry->iBottom);
10368
mng_put_uint16 (pTemp, pEntry->iObjectid);
10375
mng_put_uint16 (pTemp, pEntry->iObjectid);
10376
*(pTemp+2) = pEntry->iIndex;
10383
mng_put_int32 (pTemp, pEntry->iLeft);
10384
mng_put_int32 (pTemp+4, pEntry->iRight);
10385
mng_put_int32 (pTemp+8, pEntry->iTop);
10386
mng_put_int32 (pTemp+12, pEntry->iBottom);
10387
mng_put_uint16 (pTemp+16, pEntry->iObjectid);
10394
mng_put_int32 (pTemp, pEntry->iLeft);
10395
mng_put_int32 (pTemp+4, pEntry->iRight);
10396
mng_put_int32 (pTemp+8, pEntry->iTop);
10397
mng_put_int32 (pTemp+12, pEntry->iBottom);
10398
mng_put_uint16 (pTemp+16, pEntry->iObjectid);
10399
*(pTemp+18) = pEntry->iIndex;
10406
iNamesize = pEntry->iSegmentnamesize;
10410
MNG_COPY (pTemp, pEntry->zSegmentname, iNamesize);
10411
pTemp += iNamesize;
10412
iRawlen += iNamesize;
10418
iRetcode = write_raw_chunk (pData, pEVNT->sHeader.iChunkname,
10419
iRawlen, pRawdata);
10422
#ifdef MNG_SUPPORT_TRACE
10423
MNG_TRACE (pData, MNG_FN_WRITE_EVNT, MNG_LC_END);
10430
/* ************************************************************************** */
10432
WRITE_CHUNK (mng_write_unknown)
10434
mng_unknown_chunkp pUnknown;
10435
mng_retcode iRetcode;
10437
#ifdef MNG_SUPPORT_TRACE
10438
MNG_TRACE (pData, MNG_FN_WRITE_UNKNOWN, MNG_LC_START);
10440
/* address the proper chunk */
10441
pUnknown = (mng_unknown_chunkp)pChunk;
10443
iRetcode = write_raw_chunk (pData, pUnknown->sHeader.iChunkname,
10444
pUnknown->iDatasize, pUnknown->pData);
10446
#ifdef MNG_SUPPORT_TRACE
10447
MNG_TRACE (pData, MNG_FN_WRITE_UNKNOWN, MNG_LC_END);
10453
/* ************************************************************************** */
10455
#endif /* MNG_INCLUDE_WRITE_PROCS */
10457
/* ************************************************************************** */
10458
/* * end of file * */
10459
/* ************************************************************************** */