1 /* ************************************************************************** */
2 /* *             For conditions of distribution and use,                    * */
3 /* *                see copyright notice in libmng.h                        * */
4 /* ************************************************************************** */
5 /* *                                                                        * */
6 /* * project   : libmng                                                     * */
7 /* * file      : libmng_data.h             copyright (c) 2000-2007 G.Juyn   * */
8 /* * version   : 1.0.10                                                     * */
9 /* *                                                                        * */
10 /* * purpose   : main data structure definition                             * */
11 /* *                                                                        * */
12 /* * author    : G.Juyn                                                     * */
13 /* *                                                                        * */
14 /* * comment   : Definition of the library main data structure              * */
15 /* *                                                                        * */
16 /* * changes   : 0.5.1 - 05/04/2000 - G.Juyn                                * */
17 /* *             - added CRC table to main structure (for thread-safety)    * */
18 /* *             0.5.1 - 05/06/2000 - G.Juyn                                * */
19 /* *             - added iPLTEentries for checking hIST-length              * */
20 /* *             0.5.1 - 05/08/2000 - G.Juyn                                * */
21 /* *             - changed palette definition to exported palette-type      * */
22 /* *             - removed frozen indicator                                 * */
23 /* *             - added create/write indicators                            * */
24 /* *             - changed strict-ANSI stuff                                * */
25 /* *             0.5.1 - 05/13/2000 - G.Juyn                                * */
26 /* *             - added eMNGma hack (will be removed in 1.0.0 !!!)         * */
27 /* *             - added TERM animation object pointer (easier reference)   * */
28 /* *             - added saved-data structure for SAVE/SEEK processing      * */
29 /* *                                                                        * */
30 /* *             0.5.2 - 05/18/2000 - G.Juyn                                * */
31 /* *             - added fields for JNG support (IJG-based)                 * */
32 /* *             0.5.2 - 05/24/2000 - G.Juyn                                * */
33 /* *             - changed global tRNS definition                           * */
34 /* *             0.5.2 - 05/30/2000 - G.Juyn                                * */
35 /* *             - added delta-image fields                                 * */
36 /* *             0.5.2 - 06/01/2000 - G.Juyn                                * */
37 /* *             - added internal delta-image processing callbacks          * */
38 /* *             0.5.2 - 06/02/2000 - G.Juyn                                * */
39 /* *             - changed SWAP_ENDIAN to BIGENDIAN_SUPPORTED               * */
40 /* *               (contributed by Tim Rowley)                              * */
41 /* *             - added getalphaline callback for RGB8_A8 canvasstyle      * */
42 /* *             0.5.2 - 06/06/2000 - G.Juyn                                * */
43 /* *             - added parameter for delayed buffer-processing            * */
44 /* *                                                                        * */
45 /* *             0.5.3 - 06/16/2000 - G.Juyn                                * */
46 /* *             - added update-region parms for refresh calback            * */
47 /* *             - added Needrefresh parameter                              * */
48 /* *             0.5.3 - 06/17/2000 - G.Juyn                                * */
49 /* *             - added Deltaimmediate parm for faster delta-processing    * */
50 /* *             0.5.3 - 06/21/2000 - G.Juyn                                * */
51 /* *             - added Speed parameter to facilitate testing              * */
52 /* *             - added Imagelevel parameter for processtext callback      * */
53 /* *             0.5.3 - 06/26/2000 - G.Juyn                                * */
54 /* *             - changed userdata variable to mng_ptr                     * */
55 /* *                                                                        * */
56 /* *             0.9.1 - 07/07/2000 - G.Juyn                                * */
57 /* *             - added variables for go_xxxx processing                   * */
58 /* *             0.9.1 - 07/08/2000 - G.Juyn                                * */
59 /* *             - added variables for improved timing support              * */
60 /* *             0.9.1 - 07/15/2000 - G.Juyn                                * */
61 /* *             - added callbacks for SAVE/SEEK processing                 * */
62 /* *             - added variable for NEEDSECTIONWAIT breaks                * */
63 /* *             - added variable for freeze & reset processing             * */
64 /* *             0.9.1 - 07/17/2000 - G.Juyn                                * */
65 /* *             - fixed suspension-buffering for 32K+ chunks               * */
66 /* *                                                                        * */
67 /* *             0.9.2 - 07/29/2000 - G.Juyn                                * */
68 /* *             - removed Nextbackxxx fields (no longer used)              * */
69 /* *             0.9.2 - 07/31/2000 - G.Juyn                                * */
70 /* *             - fixed wrapping of suspension parameters                  * */
71 /* *             0.9.2 - 08/04/2000 - G.Juyn                                * */
72 /* *             - B111096 - fixed large-buffer read-suspension             * */
73 /* *             0.9.2 - 08/05/2000 - G.Juyn                                * */
74 /* *             - changed file-prefixes                                    * */
75 /* *                                                                        * */
76 /* *             0.9.3 - 08/26/2000 - G.Juyn                                * */
77 /* *             - added MAGN chunk                                         * */
78 /* *             0.9.3 - 09/07/2000 - G.Juyn                                * */
79 /* *             - added support for new filter_types                       * */
80 /* *             0.9.3 - 09/10/2000 - G.Juyn                                * */
81 /* *             - fixed DEFI behavior                                      * */
82 /* *             0.9.3 - 10/10/2000 - G.Juyn                                * */
83 /* *             - added support for alpha-depth prediction                 * */
84 /* *             0.9.3 - 10/11/2000 - G.Juyn                                * */
85 /* *             - added support for nEED                                   * */
86 /* *             0.9.3 - 10/16/2000 - G.Juyn                                * */
87 /* *             - added optional support for bKGD for PNG images           * */
88 /* *             - added support for JDAA                                   * */
89 /* *             0.9.3 - 10/17/2000 - G.Juyn                                * */
90 /* *             - added callback to process non-critical unknown chunks    * */
91 /* *             - fixed support for bKGD                                   * */
92 /* *             0.9.3 - 10/19/2000 - G.Juyn                                * */
93 /* *             - implemented delayed delta-processing                     * */
94 /* *             0.9.4 - 12/16/2000 - G.Juyn                                * */
95 /* *             - fixed mixup of data- & function-pointers (thanks Dimitri)* */
96 /* *                                                                        * */
97 /* *             1.0.1 - 02/08/2001 - G.Juyn                                * */
98 /* *             - added MEND processing callback                           * */
99 /* *             1.0.1 - 02/13/2001 - G.Juyn                                * */
100 /* *             - fixed first FRAM_MODE=4 timing problem                   * */
101 /* *                                                                        * */
102 /* *             1.0.2 - 06/23/2001 - G.Juyn                                * */
103 /* *             - added optimization option for MNG-video playback         * */
104 /* *             - added processterm callback                               * */
105 /* *             1.0.2 - 06/25/2001 - G.Juyn                                * */
106 /* *             - added option to turn off progressive refresh             * */
107 /* *                                                                        * */
108 /* *             1.0.5 - 07/08/2002 - G.Juyn                                * */
109 /* *             - B578572 - removed eMNGma hack (thanks Dimitri!)          * */
110 /* *             1.0.5 - 07/16/2002 - G.Juyn                                * */
111 /* *             - B581625 - large chunks fail with suspension reads        * */
112 /* *             1.0.5 - 08/15/2002 - G.Juyn                                * */
113 /* *             - completed PROM support                                   * */
114 /* *             1.0.5 - 09/15/2002 - G.Juyn                                * */
115 /* *             - fixed LOOP iteration=0 special case                      * */
116 /* *             1.0.5 - 09/20/2002 - G.Juyn                                * */
117 /* *             - finished support for BACK image & tiling                 * */
118 /* *             1.0.5 - 10/07/2002 - G.Juyn                                * */
119 /* *             - added another fix for misplaced TERM chunk               * */
120 /* *             - completed support for condition=2 in TERM chunk          * */
121 /* *             1.0.5 - 10/20/2002 - G.Juyn                                * */
122 /* *             - fixed processing for multiple objects in MAGN            * */
123 /* *             - fixed display of visible target of PAST operation        * */
124 /* *             1.0.5 - 11/07/2002 - G.Juyn                                * */
125 /* *             - added support to get totals after mng_read()             * */
126 /* *             1.0.5 - 24/02/2003 - G.Juyn                                * */
127 /* *             - B683152 - libjpeg suspension not always honored correctly* */
128 /* *                                                                        * */
129 /* *             1.0.6 - 04/11/2003 - G.Juyn                                * */
130 /* *             - B719420 - fixed several MNG_APP_CMS problems             * */
131 /* *             1.0.6 - 07/05/2003 - G. R-P                                * */
132 /* *             - optionally use zlib's crc32() function                   * */
133 /* *             1.0.6 - 07/29/2003 - G.R-P                                 * */
134 /* *             - added SKIPCHUNK conditionals around PAST chunk support   * */
135 /* *             1.0.6 - 08/17/2003 - G.R-P                                 * */
136 /* *             - added iPNGdepth member to pData structure                * */
137 /* *                                                                        * */
138 /* *             1.0.7 - 03/10/2004 - G.R-P                                 * */
139 /* *             - added conditionals around openstream/closestream         * */
140 /* *             1.0.7 - 03/24/2004 - G.R-P                                 * */
141 /* *             - added more SKIPCHUNK conditionals                        * */
142 /* *                                                                        * */
143 /* *             1.0.8 - 04/02/2004 - G.Juyn                                * */
144 /* *             - added CRC existence & checking flags                     * */
145 /* *             1.0.8 - 04/10/2004 - G.Juyn                                * */
146 /* *             - added data-push mechanisms for specialized decoders      * */
147 /* *                                                                        * */
148 /* *             1.0.9 - 12/11/2004 - G.Juyn                                * */
149 /* *             - added conditional MNG_OPTIMIZE_DISPLAYCALLS              * */
150 /* *                                                                        * */
151 /* *             1.0.10 - 04/08/2007 - G.Juyn                               * */
152 /* *             - added support for mPNG proposal                          * */
153 /* *             1.0.10 - 04/12/2007 - G.Juyn                               * */
154 /* *             - added support for ANG proposal                           * */
155 /* *                                                                        * */
156 /* ************************************************************************** */
157 
158 #if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI)
159 #pragma option -A                      /* force ANSI-C */
160 #endif
161 
162 #ifndef _libmng_data_h_
163 #define _libmng_data_h_
164 
165 /* ************************************************************************** */
166 
167 #define MNG_MAGIC 0x52530a0aL
168 
169 /* ************************************************************************** */
170 /* *                                                                        * */
171 /* * Internal structures                                                    * */
172 /* *                                                                        * */
173 /* ************************************************************************** */
174 
175 typedef mng_palette8 mng_rgbpaltab;
176 
177 /* ************************************************************************** */
178 /* *                                                                        * */
179 /* * The saved_data structure                                               * */
180 /* *                                                                        * */
181 /* * This contains the saved data after a SAVE chunk has been processed.    * */
182 /* * The data is saved from the main data structure during SAVE processing, * */
183 /* * and restored to the main data structure during SEEK processing.        * */
184 /* *                                                                        * */
185 /* ************************************************************************** */
186 
187 typedef struct mng_savedata_struct {
188 
189 #if defined(MNG_SUPPORT_READ) || defined(MNG_SUPPORT_WRITE)
190            mng_bool          bHasglobalPLTE;     /* global PLTE chunk processed */
191            mng_bool          bHasglobalTRNS;     /* global tRNS chunk processed */
192            mng_bool          bHasglobalGAMA;     /* global gAMA chunk processed */
193            mng_bool          bHasglobalCHRM;     /* global cHRM chunk processed */
194            mng_bool          bHasglobalSRGB;     /* global sRGB chunk processed */
195            mng_bool          bHasglobalICCP;     /* global iCCP chunk processed */
196            mng_bool          bHasglobalBKGD;     /* global bKGD chunk processed */
197 #endif /* MNG_SUPPORT_READ || MNG_SUPPORT_WRITE */
198 
199 #ifdef MNG_SUPPORT_DISPLAY
200            mng_uint16        iBACKred;           /* BACK fields */
201            mng_uint16        iBACKgreen;
202            mng_uint16        iBACKblue;
203            mng_uint8         iBACKmandatory;
204            mng_uint16        iBACKimageid;
205            mng_uint8         iBACKtile;
206 
207            mng_uint8         iFRAMmode;          /* FRAM fields (global) */
208            mng_uint32        iFRAMdelay;
209            mng_uint32        iFRAMtimeout;
210            mng_bool          bFRAMclipping;
211            mng_int32         iFRAMclipl;
212            mng_int32         iFRAMclipr;
213            mng_int32         iFRAMclipt;
214            mng_int32         iFRAMclipb;
215 
216            mng_uint32        iGlobalPLTEcount;   /* global PLTE fields */
217            mng_rgbpaltab     aGlobalPLTEentries;
218 
219            mng_uint32        iGlobalTRNSrawlen;  /* global tRNS fields */
220            mng_uint8arr      aGlobalTRNSrawdata;
221 
222            mng_uint32        iGlobalGamma;       /* global gAMA fields */
223 
224 #ifndef MNG_SKIPCHUNK_cHRM
225            mng_uint32        iGlobalWhitepointx; /* global cHRM fields */
226            mng_uint32        iGlobalWhitepointy;
227            mng_uint32        iGlobalPrimaryredx;
228            mng_uint32        iGlobalPrimaryredy;
229            mng_uint32        iGlobalPrimarygreenx;
230            mng_uint32        iGlobalPrimarygreeny;
231            mng_uint32        iGlobalPrimarybluex;
232            mng_uint32        iGlobalPrimarybluey;
233 #endif
234 
235            mng_uint8         iGlobalRendintent;  /* global sRGB fields */
236 
237            mng_uint32        iGlobalProfilesize; /* global iCCP fields */
238            mng_ptr           pGlobalProfile;
239 
240            mng_uint16        iGlobalBKGDred;     /* global bKGD fields */
241            mng_uint16        iGlobalBKGDgreen;
242            mng_uint16        iGlobalBKGDblue;
243 #endif /* MNG_SUPPORT_DISPLAY */
244 
245         } mng_savedata;
246 
247 typedef mng_savedata * mng_savedatap;
248 
249 /* ************************************************************************** */
250 /* *                                                                        * */
251 /* * Internal buffer structure for data push mechanisms                     * */
252 /* *                                                                        * */
253 /* ************************************************************************** */
254 
255 typedef struct {
256            mng_ptr           pNext;              /* for linked list */
257            mng_ptr           pData;              /* used for chunks & data */
258            mng_uint32        iLength;
259            mng_bool          bOwned;
260            mng_uint8p        pDatanext;          /* only used for data */
261            mng_uint32        iRemaining;
262         } mng_pushdata;
263 typedef mng_pushdata * mng_pushdatap;
264 
265 /* ************************************************************************** */
266 /* *                                                                        * */
267 /* * The main libmng data structure                                         * */
268 /* *                                                                        * */
269 /* * The handle used in all functions points to this structure which        * */
270 /* * contains all volatile data necessary to process the network graphic.   * */
271 /* *                                                                        * */
272 /* ************************************************************************** */
273 
274 typedef struct mng_data_struct {
275 
276            mng_uint32        iMagic;             /* magic number to validate
277                                                     a given handle */
278            mng_ptr           pUserdata;          /* application workdata */
279 
280            mng_imgtype       eSigtype;           /* image information */
281            mng_imgtype       eImagetype;         /* initially zeroed */
282            mng_uint32        iWidth;             /* filled after header is processed */
283            mng_uint32        iHeight;
284            mng_uint32        iTicks;             /* these only after MHDR */
285            mng_uint32        iLayercount;
286            mng_uint32        iFramecount;
287            mng_uint32        iPlaytime;
288            mng_uint32        iSimplicity;
289            mng_uint8         iAlphadepth;        /* indicates expected alpha-depth */
290 
291            mng_uint32        iImagelevel;        /* level of image inside a stream */
292 
293            mng_uint32        iCanvasstyle;       /* layout of the drawing-canvas */
294            mng_uint32        iBkgdstyle;         /* layout of the background-canvas */
295 
296            mng_int8          iMagnify;           /* magnification factor (not used yet) */
297            mng_uint32        iOffsetx;           /* x-offset for extremely large image */
298            mng_uint32        iOffsety;           /* y-offset for extremely large image */
299            mng_uint32        iCanvaswidth;       /* real canvas size */
300            mng_uint32        iCanvasheight;      /* must be set by processheader callback */
301 
302            mng_uint16        iBGred;             /* default background color */
303            mng_uint16        iBGgreen;           /* initially "black" */
304            mng_uint16        iBGblue;
305            mng_bool          bUseBKGD;           /* preferred use of bKGD for PNG */
306 
307            mng_bool          bIssRGB;            /* indicates sRGB system */
308 
309 #ifdef MNG_FULL_CMS                              /* little CMS variables */
310            mng_cmsprof       hProf1;             /* image input profile */
311            mng_cmsprof       hProf2;             /* default output profile */
312            mng_cmsprof       hProf3;             /* default sRGB profile */
313            mng_cmstrans      hTrans;             /* current transformation handle */
314 #endif
315 
316            mng_float         dViewgamma;         /* gamma calculation variables */
317            mng_float         dDisplaygamma;      /* initially set for sRGB conditions */
318            mng_float         dDfltimggamma;
319 
320            mng_bool          bStorechunks;       /* switch for storing chunkdata */
321            mng_bool          bSectionbreaks;     /* indicate NEEDSECTIONWAIT breaks */
322            mng_bool          bCacheplayback;     /* switch to cache playback info */
323            mng_bool          bDoProgressive;     /* progressive refresh for large images */
324            mng_uint32        iCrcmode;           /* CRC existence & checking flags */
325 
326            mng_speedtype     iSpeed;             /* speed-modifier for animations */
327 
328            mng_uint32        iMaxwidth;          /* maximum canvas size */
329            mng_uint32        iMaxheight;         /* initially set to 1024 x 1024 */
330 
331            mng_int32         iErrorcode;         /* error reporting fields */
332            mng_int8          iSeverity;
333            mng_int32         iErrorx1;
334            mng_int32         iErrorx2;
335            mng_pchar         zErrortext;
336 
337            mng_memalloc      fMemalloc;          /* callback pointers */
338            mng_memfree       fMemfree;           /* initially nulled */
339            mng_releasedata   fReleasedata;
340 #ifndef MNG_NO_OPEN_CLOSE_STREAM
341            mng_openstream    fOpenstream;
342            mng_closestream   fClosestream;
343 #endif
344            mng_readdata      fReaddata;
345            mng_writedata     fWritedata;
346            mng_errorproc     fErrorproc;
347            mng_traceproc     fTraceproc;
348            mng_processheader fProcessheader;
349            mng_processtext   fProcesstext;
350            mng_processsave   fProcesssave;
351            mng_processseek   fProcessseek;
352            mng_processneed   fProcessneed;
353            mng_processmend   fProcessmend;
354            mng_processunknown fProcessunknown;
355            mng_processterm   fProcessterm;
356            mng_getcanvasline fGetcanvasline;
357            mng_getbkgdline   fGetbkgdline;
358            mng_getalphaline  fGetalphaline;
359            mng_refresh       fRefresh;
360            mng_gettickcount  fGettickcount;
361            mng_settimer      fSettimer;
362            mng_processgamma  fProcessgamma;
363            mng_processchroma fProcesschroma;
364            mng_processsrgb   fProcesssrgb;
365            mng_processiccp   fProcessiccp;
366            mng_processarow   fProcessarow;
367 
368 #if defined(MNG_SUPPORT_READ) || defined(MNG_SUPPORT_WRITE)
369 #ifndef MNG_NO_OLD_VERSIONS
370            mng_bool          bPreDraft48;        /* flags ancient style draft */
371 #endif
372 
373            mng_chunkid       iChunkname;         /* read/write-state variables */
374            mng_uint32        iChunkseq;
375            mng_chunkp        pFirstchunk;        /* double-linked list of */
376            mng_chunkp        pLastchunk;         /* stored chunk-structures */
377 
378            mng_bool          bHasheader;         /* first header chunk processed */
379            mng_bool          bHasMHDR;           /* inside a MHDR-MEND sequence */
380            mng_bool          bHasIHDR;           /* inside a IHDR-IEND sequence */
381            mng_bool          bHasBASI;           /* inside a BASI-IEND sequence */
382            mng_bool          bHasDHDR;           /* inside a DHDR-IEND sequence */
383 #ifdef MNG_INCLUDE_JNG
384            mng_bool          bHasJHDR;           /* inside a JHDR-IEND sequence */
385            mng_bool          bHasJSEP;           /* passed the JSEP separator */
386            mng_bool          bHasJDAA;           /* at least 1 JDAA processed */
387            mng_bool          bHasJDAT;           /* at least 1 JDAT processed */
388 #endif
389            mng_bool          bHasPLTE;           /* PLTE chunk processed */
390            mng_bool          bHasTRNS;           /* tRNS chunk processed */
391            mng_bool          bHasGAMA;           /* gAMA chunk processed */
392            mng_bool          bHasCHRM;           /* cHRM chunk processed */
393            mng_bool          bHasSRGB;           /* sRGB chunk processed */
394            mng_bool          bHasICCP;           /* iCCP chunk processed */
395            mng_bool          bHasBKGD;           /* bKGD chunk processed */
396            mng_bool          bHasIDAT;           /* at least 1 IDAT processed */
397 
398            mng_bool          bHasSAVE;           /* SAVE chunk processed */
399            mng_bool          bHasBACK;           /* BACK chunk processed */
400            mng_bool          bHasFRAM;           /* FRAM chunk processed */
401            mng_bool          bHasTERM;           /* TERM chunk processed */
402            mng_bool          bHasLOOP;           /* at least 1 LOOP open */
403 
404            mng_bool          bHasglobalPLTE;     /* global PLTE chunk processed */
405            mng_bool          bHasglobalTRNS;     /* global tRNS chunk processed */
406            mng_bool          bHasglobalGAMA;     /* global gAMA chunk processed */
407            mng_bool          bHasglobalCHRM;     /* global cHRM chunk processed */
408            mng_bool          bHasglobalSRGB;     /* global sRGB chunk processed */
409            mng_bool          bHasglobalICCP;     /* global iCCP chunk processed */
410            mng_bool          bHasglobalBKGD;     /* global bKGD chunk processed */
411 
412            mng_uint32        iDatawidth;         /* IHDR/BASI/DHDR fields */
413            mng_uint32        iDataheight;        /* valid if inside IHDR-IEND, */
414            mng_uint8         iBitdepth;          /* BASI-IEND or DHDR-IEND */
415            mng_uint8         iColortype;
416            mng_uint8         iCompression;
417            mng_uint8         iFilter;
418            mng_uint8         iInterlace;
419 
420            mng_uint32        iPLTEcount;         /* PLTE fields */
421 
422 #ifdef MNG_INCLUDE_JNG
423            mng_uint8         iJHDRcolortype;     /* JHDR fields */
424            mng_uint8         iJHDRimgbitdepth;   /* valid if inside JHDR-IEND */
425            mng_uint8         iJHDRimgcompression;
426            mng_uint8         iJHDRimginterlace;
427            mng_uint8         iJHDRalphabitdepth;
428            mng_uint8         iJHDRalphacompression;
429            mng_uint8         iJHDRalphafilter;
430            mng_uint8         iJHDRalphainterlace;
431 #endif
432 
433 #endif /* MNG_SUPPORT_READ || MNG_SUPPORT_WRITE */
434 
435 #ifdef MNG_SUPPORT_READ
436            mng_bool          bReading;           /* read processing variables */
437            mng_bool          bHavesig;
438            mng_bool          bEOF;
439            mng_uint32        iReadbufsize;
440            mng_uint8p        pReadbuf;
441 
442            mng_uint32        iLargebufsize;      /* temp for very large chunks */
443            mng_uint8p        pLargebuf;
444 
445            mng_uint32        iSuspendtime;       /* tickcount at last suspension */
446            mng_bool          bSuspended;         /* input-reading has been suspended;
447                                                     we're expecting a call to
448                                                     mng_read_resume! */
449            mng_uint8         iSuspendpoint;      /* indicates at which point the flow
450                                                     was broken to suspend input-reading */
451 
452            mng_bool          bSuspensionmode;    /* I/O-suspension variables */
453            mng_uint32        iSuspendbufsize;
454            mng_uint8p        pSuspendbuf;
455            mng_uint8p        pSuspendbufnext;
456            mng_uint32        iSuspendbufleft;
457            mng_uint32        iChunklen;          /* chunk length */
458            mng_uint8p        pReadbufnext;       /* 32K+ suspension-processing */
459            mng_uint8p        pLargebufnext;
460 
461            mng_pushdatap     pFirstpushchunk;    /* variables for push mechanisms */
462            mng_pushdatap     pLastpushchunk;
463            mng_pushdatap     pFirstpushdata;
464            mng_pushdatap     pLastpushdata;
465 #endif /* MNG_SUPPORT_READ */
466 
467 #ifdef MNG_SUPPORT_WRITE
468            mng_bool          bCreating;          /* create/write processing variables */
469            mng_bool          bWriting;
470            mng_chunkid       iFirstchunkadded;
471            mng_uint32        iWritebufsize;
472            mng_uint8p        pWritebuf;
473 #endif
474 
475 #ifdef MNG_SUPPORT_DISPLAY
476            mng_bool          bDisplaying;        /* display-state variables */
477            mng_bool          bFramedone;
478            mng_uint32        iFrameseq;
479            mng_uint32        iLayerseq;
480            mng_uint32        iFrametime;         /* millisecs */
481 
482            mng_uint32        iTotalframes;       /* end-totals after mng_read() */
483            mng_uint32        iTotallayers;
484            mng_uint32        iTotalplaytime;     /* millisecs */
485 
486            mng_bool          bSkipping;          /* LOOP iteration=0 */
487 
488 #ifdef MNG_SUPPORT_DYNAMICMNG
489            mng_bool          bDynamic;           /* MNG is dynamic (eg. has events) */
490            mng_bool          bRunningevent;      /* currently processing an event */
491            mng_bool          bStopafterseek;     /* stop after next SEEK */
492            mng_int32         iEventx;            /* X/Y of current event */
493            mng_int32         iEventy;
494            mng_objectp       pLastmousemove;     /* last event triggered */
495 #endif
496 
497            mng_uint32        iRequestframe;      /* go_xxxx variables */
498            mng_uint32        iRequestlayer;
499            mng_uint32        iRequesttime;
500            mng_bool          bSearching;
501 
502            mng_bool          bRestorebkgd;       /* flags restore required before IDAT/JDAT */
503 
504            mng_uint32        iRuntime;           /* millisecs since start */
505            mng_uint32        iSynctime;          /* tickcount at last framesync */
506            mng_uint32        iStarttime;         /* tickcount at start */
507            mng_uint32        iEndtime;           /* tickcount at end */
508            mng_bool          bRunning;           /* animation is active */
509            mng_bool          bTimerset;          /* the timer has been set;
510                                                     we're expecting a call to
511                                                     mng_display_resume! */
512            mng_uint8         iBreakpoint;        /* indicates at which point the
513                                                     flow was broken to run the timer */
514            mng_bool          bSectionwait;       /* indicates a section break */
515            mng_bool          bFreezing;          /* indicates app requested a freeze */
516            mng_bool          bResetting;         /* indicates app requested a reset */
517            mng_bool          bNeedrefresh;       /* indicates screen-refresh is needed */
518            mng_bool          bMisplacedTERM;     /* indicates TERM is out of place */
519            mng_bool          bOnlyfirstframe;    /* show first frame after TERM and stop */
520            mng_uint32        iFramesafterTERM;   /* determines frame-count after TERM */
521            mng_objectp       pCurrentobj;        /* current "object" */
522            mng_objectp       pCurraniobj;        /* current animation object
523                                                     "to be"/"being" processed */
524            mng_objectp       pTermaniobj;        /* TERM animation object */
525            mng_uint32        iIterations;        /* TERM/MEND iteration count */
526            mng_objectp       pObjzero;           /* "on-the-fly" image (object = 0) */
527            mng_objectp       pLastclone;         /* last clone */
528            mng_objectp       pStoreobj;          /* current store object for row routines */
529            mng_objectp       pStorebuf;          /* current store object-buffer for row routines */
530            mng_objectp       pRetrieveobj;       /* current retrieve object for row routines */
531            mng_savedatap     pSavedata;          /* pointer to saved data (after SAVE) */
532 
533            mng_uint32        iUpdateleft;        /* update region for refresh */
534            mng_uint32        iUpdateright;
535            mng_uint32        iUpdatetop;
536            mng_uint32        iUpdatebottom;
537 
538            mng_int8          iPass;              /* current interlacing pass;
539                                                     negative value means no interlace */
540            mng_int32         iRow;               /* current row counter */
541            mng_int32         iRowinc;            /* row increment for this pass */
542            mng_int32         iCol;               /* current starting column */
543            mng_int32         iColinc;            /* column increment for this pass */
544            mng_int32         iRowsamples;        /* nr. of samples in current workrow */
545            mng_int32         iSamplemul;         /* needed to calculate rowsize */
546            mng_int32         iSampleofs;            /* from rowsamples */
547            mng_int32         iSamplediv;
548            mng_int32         iRowsize;           /* size of actual data in work row */
549            mng_int32         iRowmax;            /* maximum size of data in work row */
550            mng_int32         iFilterofs;         /* offset to filter-byte in work row */
551            mng_int32         iPixelofs;          /* offset to pixel-bytes in work row */
552            mng_uint32        iLevel0;            /* leveling variables */
553            mng_uint32        iLevel1;
554            mng_uint32        iLevel2;
555            mng_uint32        iLevel3;
556            mng_uint8p        pWorkrow;           /* working row of pixel-data */
557            mng_uint8p        pPrevrow;           /* previous row of pixel-data */
558            mng_uint8p        pRGBArow;           /* intermediate row of RGBA8 or RGBA16 data */
559            mng_bool          bIsRGBA16;          /* indicates intermediate row is RGBA16 */
560            mng_bool          bIsOpaque;          /* indicates intermediate row is fully opaque */
561            mng_int32         iFilterbpp;         /* bpp index for filtering routines */
562 
563            mng_int32         iSourcel;           /* variables for showing objects */
564            mng_int32         iSourcer;
565            mng_int32         iSourcet;
566            mng_int32         iSourceb;
567            mng_int32         iDestl;
568            mng_int32         iDestr;
569            mng_int32         iDestt;
570            mng_int32         iDestb;
571 
572            mng_objectp       pFirstimgobj;       /* double-linked list of */
573            mng_objectp       pLastimgobj;        /* image-object structures */
574            mng_objectp       pFirstaniobj;       /* double-linked list of */
575            mng_objectp       pLastaniobj;        /* animation-object structures */
576 #ifdef MNG_SUPPORT_DYNAMICMNG
577            mng_objectp       pFirstevent;        /* double-linked list of */
578            mng_objectp       pLastevent;         /* event-object structures */
579 #endif
580 
581 #if defined(MNG_GAMMA_ONLY) || defined(MNG_FULL_CMS) || defined(MNG_APP_CMS)
582            mng_uint8         aGammatab[256];     /* precomputed gamma lookup table */
583            mng_float         dLastgamma;         /* last gamma used to compute table */
584 #endif
585 
586            mng_fptr          fDisplayrow;        /* internal callback to display an
587                                                     uncompressed/unfiltered/
588                                                     color-corrected row */
589            mng_fptr          fRestbkgdrow;       /* internal callback for restore-
590                                                     background processing of a row */
591            mng_fptr          fCorrectrow;        /* internal callback to color-correct an
592                                                     uncompressed/unfiltered row */
593            mng_fptr          fRetrieverow;       /* internal callback to retrieve an
594                                                     uncompressed/unfiltered row of data */
595            mng_fptr          fStorerow;          /* internal callback to store an
596                                                     uncompressed/unfiltered row of data */
597            mng_fptr          fProcessrow;        /* internal callback to process an
598                                                     uncompressed row of data */
599            mng_fptr          fDifferrow;         /* internal callback to perform
600                                                     added filter leveling and
601                                                     differing on an unfiltered row */
602            mng_fptr          fScalerow;          /* internal callback to scale a
603                                                     delta-row to the bitdepth of its target */
604            mng_fptr          fDeltarow;          /* internal callback to execute a
605                                                     delta-row onto a target */
606 #ifndef MNG_SKIPCHUNK_PAST
607            mng_fptr          fFliprow;           /* internal callback to flip a row of pixels
608                                                     left<->right for a PAST operation */
609            mng_fptr          fTilerow;           /* internal callback to tile a row of pixels
610                                                     during a PAST operation */
611 #endif
612            mng_fptr          fInitrowproc;       /* internal callback to initialize
613                                                     the row processing */
614 
615            mng_uint16        iDEFIobjectid;      /* DEFI fields */
616            mng_bool          bDEFIhasdonotshow;
617            mng_uint8         iDEFIdonotshow;
618            mng_bool          bDEFIhasconcrete;
619            mng_uint8         iDEFIconcrete;
620            mng_bool          bDEFIhasloca;
621            mng_int32         iDEFIlocax;
622            mng_int32         iDEFIlocay;
623            mng_bool          bDEFIhasclip;
624            mng_int32         iDEFIclipl;
625            mng_int32         iDEFIclipr;
626            mng_int32         iDEFIclipt;
627            mng_int32         iDEFIclipb;
628 
629            mng_uint16        iBACKred;           /* BACK fields */
630            mng_uint16        iBACKgreen;
631            mng_uint16        iBACKblue;
632            mng_uint8         iBACKmandatory;
633            mng_uint16        iBACKimageid;
634            mng_uint8         iBACKtile;
635 
636            mng_int32         iBackimgoffsx;      /* temp variables for restore_bkgd */
637            mng_int32         iBackimgoffsy;
638            mng_uint32        iBackimgwidth;
639            mng_uint32        iBackimgheight;
640 
641 #ifndef MNG_SKIPCHUNK_FRAM
642            mng_uint8         iFRAMmode;          /* FRAM fields (global) */
643            mng_uint32        iFRAMdelay;
644            mng_uint32        iFRAMtimeout;
645            mng_bool          bFRAMclipping;
646            mng_int32         iFRAMclipl;
647            mng_int32         iFRAMclipr;
648            mng_int32         iFRAMclipt;
649            mng_int32         iFRAMclipb;
650 
651            mng_uint8         iFramemode;         /* current subframe variables */
652            mng_uint32        iFramedelay;
653            mng_uint32        iFrametimeout;
654            mng_bool          bFrameclipping;
655            mng_int32         iFrameclipl;
656            mng_int32         iFrameclipr;
657            mng_int32         iFrameclipt;
658            mng_int32         iFrameclipb;
659 
660            mng_uint32        iNextdelay;         /* delay *after* next image */
661 #endif
662 
663 #ifndef MNG_SKIPCHUNK_SHOW
664            mng_uint8         iSHOWmode;          /* SHOW fields */
665            mng_uint16        iSHOWfromid;
666            mng_uint16        iSHOWtoid;
667            mng_uint16        iSHOWnextid;
668            mng_int16         iSHOWskip;
669 #endif
670 
671            mng_uint32        iGlobalPLTEcount;   /* global PLTE fields */
672            mng_rgbpaltab     aGlobalPLTEentries;
673 
674            mng_uint32        iGlobalTRNSrawlen;  /* global tRNS fields */
675            mng_uint8arr      aGlobalTRNSrawdata;
676 
677            mng_uint32        iGlobalGamma;       /* global gAMA fields */
678 
679 #ifndef MNG_SKIPCHUNK_cHRM
680            mng_uint32        iGlobalWhitepointx; /* global cHRM fields */
681            mng_uint32        iGlobalWhitepointy;
682            mng_uint32        iGlobalPrimaryredx;
683            mng_uint32        iGlobalPrimaryredy;
684            mng_uint32        iGlobalPrimarygreenx;
685            mng_uint32        iGlobalPrimarygreeny;
686            mng_uint32        iGlobalPrimarybluex;
687            mng_uint32        iGlobalPrimarybluey;
688 #endif
689 
690            mng_uint8         iGlobalRendintent;  /* global sRGB fields */
691 
692 #ifndef MNG_SKIPCHUNK_iCCP
693            mng_uint32        iGlobalProfilesize; /* global iCCP fields */
694            mng_ptr           pGlobalProfile;
695 #endif
696 
697            mng_uint16        iGlobalBKGDred;     /* global bKGD fields */
698            mng_uint16        iGlobalBKGDgreen;
699            mng_uint16        iGlobalBKGDblue;
700 
701            mng_ptr           pDeltaImage;        /* delta-image fields */
702            mng_uint8         iDeltaImagetype;
703 #endif /* MNG_SUPPORT_DISPLAY */
704            mng_uint8         iDeltatype;         /* need this one in read processing !! */
705 #ifdef MNG_SUPPORT_DISPLAY
706            mng_uint32        iDeltaBlockwidth;
707            mng_uint32        iDeltaBlockheight;
708            mng_uint32        iDeltaBlockx;
709            mng_uint32        iDeltaBlocky;
710            mng_bool          bDeltaimmediate;
711 
712            mng_fptr          fDeltagetrow;       /* internal delta-proc callbacks */
713            mng_fptr          fDeltaaddrow;
714            mng_fptr          fDeltareplacerow;
715            mng_fptr          fDeltaputrow;
716 
717 #ifndef MNG_SKIPCHUNK_PROM
718            mng_fptr          fPromoterow;        /* internal PROM fields */
719            mng_fptr          fPromBitdepth;
720            mng_ptr           pPromBuf;
721            mng_uint8         iPromColortype;
722            mng_uint8         iPromBitdepth;
723            mng_uint8         iPromFilltype;
724            mng_uint32        iPromWidth;
725            mng_ptr           pPromSrc;
726            mng_ptr           pPromDst;
727 #endif
728 
729 #ifndef MNG_SKIPCHUNK_MAGN
730            mng_uint16        iMAGNfromid;
731            mng_uint16        iMAGNcurrentid;
732            mng_uint16        iMAGNtoid;
733 #endif
734 
735 #ifndef MNG_SKIPCHUNK_PAST
736            mng_uint16        iPASTid;
737            mng_int32         iPastx;             /* target x/y of last PAST */
738            mng_int32         iPasty;
739 #endif
740 
741            mng_objectp       pLastseek;          /* last processed ani_seek object */
742 
743 #ifdef MNG_INCLUDE_MPNG_PROPOSAL
744            mng_objectp       pMPNG;              /* mpNG object if available */
745 #endif
746 #ifdef MNG_INCLUDE_ANG_PROPOSAL
747            mng_objectp       pANG;               /* ANG object if available */
748 #endif
749 
750 #endif /* MNG_SUPPORT_DISPLAY */
751 
752 #ifdef MNG_INCLUDE_ZLIB
753            z_stream          sZlib;              /* zlib (de)compression variables */
754 
755            mng_int32         iZlevel;            /* zlib compression parameters */
756            mng_int32         iZmethod;
757            mng_int32         iZwindowbits;
758            mng_int32         iZmemlevel;
759            mng_int32         iZstrategy;
760 
761            mng_uint32        iMaxIDAT;           /* maximum size of IDAT data */
762 
763            mng_bool          bInflating;         /* indicates "inflate" in progress */
764            mng_bool          bDeflating;         /* indicates "deflate" in progress */
765 #endif /* MNG_INCLUDE_ZLIB */
766 
767 #ifdef MNG_INCLUDE_JNG
768            mngjpeg_dctmethod eJPEGdctmethod;     /* IJG compression variables */
769            mng_int32         iJPEGquality;
770            mng_int32         iJPEGsmoothing;
771            mng_bool          bJPEGcompressprogr;
772            mng_bool          bJPEGcompressopt;
773 
774            mng_uint32        iMaxJDAT;           /* maximum size of JDAT/JDAA data */
775 
776            mngjpeg_compp     pJPEGcinfo;         /* compression structure */
777            mngjpeg_errorp    pJPEGcerr;          /* error-manager compress */
778 
779            mngjpeg_decompp   pJPEGdinfo;         /* decompression structure (JDAT) */
780            mngjpeg_errorp    pJPEGderr;          /* error-manager decompress (JDAT) */
781            mngjpeg_sourcep   pJPEGdsrc;          /* source-manager decompress (JDAT) */
782 
783            mngjpeg_decompp   pJPEGdinfo2;        /* decompression structure (JDAA) */
784            mngjpeg_errorp    pJPEGderr2;         /* error-manager decompress (JDAA) */
785            mngjpeg_sourcep   pJPEGdsrc2;         /* source-manager decompress (JDAA) */
786 
787            mng_uint8p        pJPEGbuf;           /* buffer for JPEG (de)compression (JDAT) */
788            mng_uint32        iJPEGbufmax;        /* allocated space for buffer (JDAT) */
789            mng_uint8p        pJPEGcurrent;       /* current pointer into buffer (JDAT) */
790            mng_uint32        iJPEGbufremain;     /* remaining bytes in buffer (JDAT) */
791            mng_uint32        iJPEGtoskip;        /* bytes to skip on next input-block (JDAT) */
792 
793            mng_uint8p        pJPEGbuf2;          /* buffer for JPEG (de)compression (JDAA) */
794            mng_uint32        iJPEGbufmax2;       /* allocated space for buffer (JDAA) */
795            mng_uint8p        pJPEGcurrent2;      /* current pointer into buffer (JDAA) */
796            mng_uint32        iJPEGbufremain2;    /* remaining bytes in buffer (JDAA) */
797            mng_uint32        iJPEGtoskip2;       /* bytes to skip on next input-block (JDAA) */
798 
799            mng_uint8p        pJPEGrow;           /* buffer for a JPEG row of samples (JDAT) */
800            mng_uint32        iJPEGrowlen;
801 
802            mng_uint8p        pJPEGrow2;          /* buffer for a JPEG row of samples (JDAA) */
803            mng_uint32        iJPEGrowlen2;
804 
805            mng_bool          bJPEGcompress;      /* indicates "compress" initialized */
806 
807            mng_bool          bJPEGdecompress;    /* indicates "decompress" initialized (JDAT) */
808            mng_bool          bJPEGhasheader;     /* indicates "readheader" succeeded (JDAT) */
809            mng_bool          bJPEGdecostarted;   /* indicates "decompress" started (JDAT) */
810            mng_bool          bJPEGscanstarted;   /* indicates "first scan" started (JDAT) */
811            mng_bool          bJPEGscanending;    /* indicates "finish_output" suspended (JDAT) */
812            mng_bool          bJPEGprogressive;   /* indicates a progressive image (JDAT) */
813 
814            mng_bool          bJPEGdecompress2;   /* indicates "decompress" initialized (JDAA) */
815            mng_bool          bJPEGhasheader2;    /* indicates "readheader" succeeded (JDAA) */
816            mng_bool          bJPEGdecostarted2;  /* indicates "decompress" started (JDAA) */
817            mng_bool          bJPEGscanstarted2;  /* indicates "first scan" started (JDAA) */
818            mng_bool          bJPEGprogressive2;  /* indicates a progressive image (JDAA) */
819 
820            mng_fptr          fStorerow2;         /* internal callback to store an
821                                                     uncompressed/unfiltered row of JPEG-data (JDAT) */
822 
823            mng_fptr          fStorerow3;         /* internal callback to store an
824                                                     uncompressed/unfiltered row of JPEG-data (JDAA) */
825 
826            mng_uint32        iJPEGrow;           /* row-number for current JPEG row */
827            mng_uint32        iJPEGalpharow;      /* nr. of rows filled with alpha */
828            mng_uint32        iJPEGrgbrow;        /* nr. of rows filled with 'color'-info */
829            mng_uint32        iJPEGdisprow;       /* nr. of rows already displayed "on-the-fly" */
830 
831 #if defined(MNG_USE_SETJMP) && defined (MNG_INCLUDE_IJG6B)
832            jmp_buf           sErrorbuf;          /* setjmp/longjmp buffer (error-recovery) */
833 #endif
834 
835 #endif /* MNG_INCLUDE_JNG */
836 
837 #ifndef MNG_USE_ZLIB_CRC
838            mng_uint32        aCRCtable [256];    /* CRC prefab table */
839            mng_bool          bCRCcomputed;       /* "has been built" indicator */
840 #endif
841 
842 #ifdef MNG_OPTIMIZE_FOOTPRINT_INIT
843            png_imgtype       ePng_imgtype;
844 #endif
845 
846 #if defined(MNG_NO_1_2_4BIT_SUPPORT) || defined(MNG_NO_16BIT_SUPPORT)
847            mng_uint8         iPNGdepth;          /* Real input depth */
848            mng_uint8         iPNGmult;
849 #endif
850 
851 #ifdef MNG_OPTIMIZE_DISPLAYCALLS
852            mng_uint32        iRawlen;            /* temp vars for display processing */
853            mng_uint8p        pRawdata;
854 #ifndef MNG_SKIPCHUNK_BASI
855            mng_uint16        iBASIred;
856            mng_uint16        iBASIgreen;
857            mng_uint16        iBASIblue;
858            mng_bool          bBASIhasalpha;
859            mng_uint16        iBASIalpha;
860            mng_uint8         iBASIviewable;
861 #endif
862 #ifndef MNG_SKIPCHUNK_CLON
863            mng_uint16        iCLONsourceid;
864            mng_uint16        iCLONcloneid;
865            mng_uint8         iCLONclonetype;
866            mng_bool          bCLONhasdonotshow;
867            mng_uint8         iCLONdonotshow;
868            mng_uint8         iCLONconcrete;
869            mng_bool          bCLONhasloca;
870            mng_uint8         iCLONlocationtype;
871            mng_int32         iCLONlocationx;
872            mng_int32         iCLONlocationy;
873 #endif
874 #ifndef MNG_SKIPCHUNK_DISC
875            mng_uint32        iDISCcount;
876            mng_uint16p       pDISCids;
877 #endif
878 #ifndef MNG_SKIPCHUNK_FRAM
879            mng_uint8         iTempFramemode;
880            mng_uint8         iTempChangedelay;
881            mng_uint32        iTempDelay;
882            mng_uint8         iTempChangetimeout;
883            mng_uint32        iTempTimeout;
884            mng_uint8         iTempChangeclipping;
885            mng_uint8         iTempCliptype;
886            mng_int32         iTempClipl;
887            mng_int32         iTempClipr;
888            mng_int32         iTempClipt;
889            mng_int32         iTempClipb;
890 #endif
891 #ifndef MNG_SKIPCHUNK_MOVE
892            mng_uint16        iMOVEfromid;
893            mng_uint16        iMOVEtoid;
894            mng_uint8         iMOVEmovetype;
895            mng_int32         iMOVEmovex;
896            mng_int32         iMOVEmovey;
897 #endif
898 #ifndef MNG_SKIPCHUNK_CLIP
899            mng_uint16        iCLIPfromid;
900            mng_uint16        iCLIPtoid;
901            mng_uint8         iCLIPcliptype;
902            mng_int32         iCLIPclipl;
903            mng_int32         iCLIPclipr;
904            mng_int32         iCLIPclipt;
905            mng_int32         iCLIPclipb;
906 #endif
907 #ifndef MNG_NO_DELTA_PNG
908            mng_uint16        iDHDRobjectid;
909            mng_uint8         iDHDRimagetype;
910            mng_uint8         iDHDRdeltatype;
911            mng_uint32        iDHDRblockwidth;
912            mng_uint32        iDHDRblockheight;
913            mng_uint32        iDHDRblockx;
914            mng_uint32        iDHDRblocky;
915            mng_uint8         iPROMbitdepth;
916            mng_uint8         iPROMcolortype;
917            mng_uint8         iPROMfilltype;
918            mng_uint8         iPPLTtype;
919            mng_uint32        iPPLTcount;
920            mng_palette8ep    paPPLTindexentries;
921            mng_uint8p        paPPLTalphaentries;
922            mng_uint8p        paPPLTusedentries;
923 #endif
924 #ifndef MNG_SKIPCHUNK_MAGN
925            mng_uint16        iMAGNfirstid;
926            mng_uint16        iMAGNlastid;
927            mng_uint8         iMAGNmethodX;
928            mng_uint16        iMAGNmX;
929            mng_uint16        iMAGNmY;
930            mng_uint16        iMAGNmL;
931            mng_uint16        iMAGNmR;
932            mng_uint16        iMAGNmT;
933            mng_uint16        iMAGNmB;
934            mng_uint8         iMAGNmethodY;
935 #endif
936 #ifndef MNG_SKIPCHUNK_PAST
937            mng_uint16        iPASTtargetid;
938            mng_uint8         iPASTtargettype;
939            mng_int32         iPASTtargetx;
940            mng_int32         iPASTtargety;
941            mng_uint32        iPASTcount;
942            mng_ptr           pPASTsources;
943 #endif
944 #endif /* MNG_OPTIMIZE_DISPLAYCALLS */
945 
946         } mng_data;
947 
948 typedef mng_data * mng_datap;
949 
950 /* ************************************************************************** */
951 /* *                                                                        * */
952 /* * Internal Callback-Function prototypes                                  * */
953 /* *                                                                        * */
954 /* ************************************************************************** */
955 
956 typedef mng_retcode(*mng_displayrow)  (mng_datap  pData);
957 typedef mng_retcode(*mng_restbkgdrow) (mng_datap  pData);
958 typedef mng_retcode(*mng_correctrow)  (mng_datap  pData);
959 typedef mng_retcode(*mng_retrieverow) (mng_datap  pData);
960 typedef mng_retcode(*mng_storerow)    (mng_datap  pData);
961 typedef mng_retcode(*mng_processrow)  (mng_datap  pData);
962 typedef mng_retcode(*mng_initrowproc) (mng_datap  pData);
963 typedef mng_retcode(*mng_differrow)   (mng_datap  pData);
964 typedef mng_retcode(*mng_scalerow)    (mng_datap  pData);
965 typedef mng_retcode(*mng_deltarow)    (mng_datap  pData);
966 typedef mng_retcode(*mng_promoterow)  (mng_datap  pData);
967 typedef mng_retcode(*mng_fliprow)     (mng_datap  pData);
968 typedef mng_retcode(*mng_tilerow)     (mng_datap  pData);
969 
970 typedef mng_uint8  (*mng_bitdepth_8)  (mng_uint8  iB);
971 typedef mng_uint16 (*mng_bitdepth_16) (mng_uint8  iB);
972 
973 typedef mng_retcode(*mng_magnify_x)   (mng_datap  pData,
974                                        mng_uint16 iMX,
975                                        mng_uint16 iML,
976                                        mng_uint16 iMR,
977                                        mng_uint32 iWidth,
978                                        mng_uint8p iSrcline,
979                                        mng_uint8p iDstline);
980 typedef mng_retcode(*mng_magnify_y)   (mng_datap  pData,
981                                        mng_int32  iM,
982                                        mng_int32  iS,
983                                        mng_uint32 iWidth,
984                                        mng_uint8p iSrcline1,
985                                        mng_uint8p iSrcline2,
986                                        mng_uint8p iDstline);
987 
988 /* ************************************************************************** */
989 /* *                                                                        * */
990 /* * Routines for swapping byte-order from and to graphic files             * */
991 /* * (This code is adapted from the libpng package)                         * */
992 /* *                                                                        * */
993 /* ************************************************************************** */
994 
995 #ifndef MNG_BIGENDIAN_SUPPORTED
996 mng_uint32 mng_get_uint32 (mng_uint8p pBuf);
997 mng_int32  mng_get_int32  (mng_uint8p pBuf);
998 mng_uint16 mng_get_uint16 (mng_uint8p pBuf);
999 void       mng_put_uint32 (mng_uint8p pBuf,
1000                            mng_uint32 i);
1001 void       mng_put_int32  (mng_uint8p pBuf,
1002                            mng_int32  i);
1003 void       mng_put_uint16 (mng_uint8p pBuf,
1004                            mng_uint16 i);
1005 #else /* MNG_BIGENDIAN_SUPPORTED */
1006 #define mng_get_uint32(P)   *(mng_uint32p)(P)
1007 #define mng_get_int32(P)    *(mng_int32p)(P)
1008 #define mng_get_uint16(P)   *(mng_uint16p)(P)
1009 #define mng_put_uint32(P,I) *(mng_uint32p)(P) = (I)
1010 #define mng_put_int32(P,I)  *(mng_int32p)(P) = (I)
1011 #define mng_put_uint16(P,I) *(mng_uint16p)(P) = (I)
1012 #endif /* MNG_BIGENDIAN_SUPPORTED */
1013 
1014 /* ************************************************************************** */
1015 /* *                                                                        * */
1016 /* * Some handy(?) macro definitions                                        * */
1017 /* *                                                                        * */
1018 /* ************************************************************************** */
1019 
1020 #define MAX_COORD(a, b)  (((a) > (b)) ? (a) : (b))
1021 #define MIN_COORD(a, b)  (((a) < (b)) ? (a) : (b))
1022 
1023 /* ************************************************************************** */
1024 
1025 #endif /* _libmng_data_h_ */
1026 
1027 /* ************************************************************************** */
1028 /* * end of file                                                            * */
1029 /* ************************************************************************** */
1030