📄 libmng_object_prc.c
字号:
/* ************************************************************************** */
/* * For conditions of distribution and use, * */
/* * see copyright notice in libmng.h * */
/* ************************************************************************** */
/* * * */
/* * project : libmng * */
/* * file : libmng_object_prc.c copyright (c) 2000-2004 G.Juyn * */
/* * version : 1.0.6 * */
/* * * */
/* * purpose : Object processing routines (implementation) * */
/* * * */
/* * author : G.Juyn * */
/* * * */
/* * comment : implementation of the internal object processing routines * */
/* * * */
/* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */
/* * - changed strict-ANSI stuff * */
/* * 0.5.1 - 05/12/2000 - G.Juyn * */
/* * - changed trace to macro for callback error-reporting * */
/* * * */
/* * 0.5.2 - 05/20/2000 - G.Juyn * */
/* * - fixed to support JNG objects * */
/* * 0.5.2 - 05/24/2000 - G.Juyn * */
/* * - added support for global color-chunks in animation * */
/* * - added support for global PLTE,tRNS,bKGD in animation * */
/* * - added SAVE & SEEK animation objects * */
/* * 0.5.2 - 05/29/2000 - G.Juyn * */
/* * - added initialization of framenr/layernr/playtime * */
/* * - changed ani_object create routines not to return the * */
/* * created object (wasn't necessary) * */
/* * 0.5.2 - 05/30/2000 - G.Juyn * */
/* * - added object promotion routine (PROM handling) * */
/* * - added ani-object routines for delta-image processing * */
/* * - added compression/filter/interlace fields to * */
/* * object-buffer for delta-image processing * */
/* * * */
/* * 0.5.3 - 06/17/2000 - G.Juyn * */
/* * - changed support for delta-image processing * */
/* * 0.5.3 - 06/20/2000 - G.Juyn * */
/* * - fixed some small things (as precaution) * */
/* * 0.5.3 - 06/21/2000 - G.Juyn * */
/* * - added processing of PLTE/tRNS & color-info for * */
/* * delta-images in the ani_objects chain * */
/* * 0.5.3 - 06/22/2000 - G.Juyn * */
/* * - added support for PPLT chunk * */
/* * * */
/* * 0.9.1 - 07/07/2000 - G.Juyn * */
/* * - added support for freeze/restart/resume & go_xxxx * */
/* * 0.9.1 - 07/16/2000 - G.Juyn * */
/* * - fixed support for mng_display() after mng_read() * */
/* * * */
/* * 0.9.2 - 07/29/2000 - G.Juyn * */
/* * - fixed small bugs in display processing * */
/* * 0.9.2 - 08/05/2000 - G.Juyn * */
/* * - changed file-prefixes * */
/* * * */
/* * 0.9.3 - 08/07/2000 - G.Juyn * */
/* * - B111300 - fixup for improved portability * */
/* * 0.9.3 - 08/26/2000 - G.Juyn * */
/* * - added MAGN chunk * */
/* * 0.9.3 - 09/10/2000 - G.Juyn * */
/* * - fixed DEFI behavior * */
/* * 0.9.3 - 10/17/2000 - G.Juyn * */
/* * - added valid-flag to stored objects for read() / display()* */
/* * - added routine to discard "invalid" objects * */
/* * 0.9.3 - 10/18/2000 - G.Juyn * */
/* * - fixed delta-processing behavior * */
/* * 0.9.3 - 10/19/2000 - G.Juyn * */
/* * - added storage for pixel-/alpha-sampledepth for delta's * */
/* * * */
/* * 0.9.4 - 1/18/2001 - G.Juyn * */
/* * - removed "old" MAGN methods 3 & 4 * */
/* * - added "new" MAGN methods 3, 4 & 5 * */
/* * * */
/* * 0.9.5 - 1/22/2001 - G.Juyn * */
/* * - B129681 - fixed compiler warnings SGI/Irix * */
/* * * */
/* * 1.0.2 - 06/23/2001 - G.Juyn * */
/* * - added optimization option for MNG-video playback * */
/* * * */
/* * 1.0.5 - 08/15/2002 - G.Juyn * */
/* * - completed PROM support * */
/* * 1.0.5 - 08/16/2002 - G.Juyn * */
/* * - completed MAGN support (16-bit functions) * */
/* * 1.0.5 - 08/19/2002 - G.Juyn * */
/* * - B597134 - libmng pollutes the linker namespace * */
/* * 1.0.5 - 09/13/2002 - G.Juyn * */
/* * - fixed read/write of MAGN chunk * */
/* * 1.0.5 - 09/15/2002 - G.Juyn * */
/* * - added event handling for dynamic MNG * */
/* * 1.0.5 - 09/20/2002 - G.Juyn * */
/* * - added support for PAST * */
/* * 1.0.5 - 09/23/2002 - G.Juyn * */
/* * - fixed reset_object_detail to clear old buffer * */
/* * - added in-memory color-correction of abstract images * */
/* * 1.0.5 - 10/05/2002 - G.Juyn * */
/* * - fixed problem with cloned objects marked as invalid * */
/* * - fixed problem cloning frozen object_buffers * */
/* * 1.0.5 - 10/07/2002 - G.Juyn * */
/* * - fixed DISC support * */
/* * 1.0.5 - 11/04/2002 - G.Juyn * */
/* * - fixed goframe/golayer/gotime processing * */
/* * 1.0.5 - 11/07/2002 - G.Juyn * */
/* * - fixed magnification bug with object 0 * */
/* * 1.0.5 - 01/19/2003 - G.Juyn * */
/* * - B664911 - fixed buffer overflow during init * */
/* * * */
/* * 1.0.6 - 04/19/2003 - G.Juyn * */
/* * - fixed problem with infinite loops during readdisplay() * */
/* * 1.0.6 - 05/25/2003 - G.R-P * */
/* * - added MNG_SKIPCHUNK_cHNK footprint optimizations * */
/* * 1.0.6 - 06/09/2003 - G. R-P * */
/* * - added conditionals around 8-bit magn routines * */
/* * 1.0.6 - 07/07/2003 - G.R-P * */
/* * - added conditionals around some JNG-supporting code * */
/* * - removed conditionals around 8-bit magn routines * */
/* * - added conditionals around delta-png and 16-bit code * */
/* * 1.0.6 - 07/14/2003 - G.R-P * */
/* * - added MNG_NO_LOOP_SIGNALS_SUPPORTED conditional * */
/* * 1.0.6 - 07/29/2003 - G.Juyn * */
/* * - fixed invalid test in promote_imageobject * */
/* * 1.0.6 - 07/29/2003 - G.R-P * */
/* * - added conditionals around PAST chunk support * */
/* * 1.0.6 - 08/17/2003 - G.R-P * */
/* * - added conditionals around MAGN chunk support * */
/* * 1.0.7 - 03/21/2004 - G.Juyn * */
/* * - fixed some 64-bit platform compiler warnings * */
/* * * */
/* ************************************************************************** */
#include "libmng.h"
#include "libmng_data.h"
#include "libmng_error.h"
#include "libmng_trace.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "libmng_memory.h"
#include "libmng_chunks.h"
#include "libmng_objects.h"
#include "libmng_display.h"
#include "libmng_pixels.h"
#include "libmng_object_prc.h"
#include "libmng_cms.h"
#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI)
#pragma option -A /* force ANSI-C */
#endif
/* ************************************************************************** */
#ifdef MNG_INCLUDE_DISPLAY_PROCS
/* ************************************************************************** */
/* * * */
/* * Generic object routines * */
/* * * */
/* ************************************************************************** */
mng_retcode mng_drop_invalid_objects (mng_datap pData)
{
mng_objectp pObject;
mng_objectp pNext;
mng_cleanupobject fCleanup;
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (pData, MNG_FN_DROP_INVALID_OBJECTS, MNG_LC_START)
#endif
pObject = pData->pFirstimgobj; /* get first stored image-object (if any) */
while (pObject) /* more objects to check ? */
{
pNext = ((mng_object_headerp)pObject)->pNext;
/* invalid ? */
if (!((mng_imagep)pObject)->bValid)
{ /* call appropriate cleanup */
fCleanup = ((mng_object_headerp)pObject)->fCleanup;
fCleanup (pData, pObject);
}
pObject = pNext; /* neeeext */
}
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (pData, MNG_FN_DROP_INVALID_OBJECTS, MNG_LC_END)
#endif
return MNG_NOERROR;
}
/* ************************************************************************** */
/* * * */
/* * Image-data-object routines * */
/* * * */
/* * these handle the "object buffer" as defined by the MNG specification * */
/* * * */
/* ************************************************************************** */
mng_retcode mng_create_imagedataobject (mng_datap pData,
mng_bool bConcrete,
mng_bool bViewable,
mng_uint32 iWidth,
mng_uint32 iHeight,
mng_uint8 iBitdepth,
mng_uint8 iColortype,
mng_uint8 iCompression,
mng_uint8 iFilter,
mng_uint8 iInterlace,
mng_imagedatap *ppObject)
{
mng_imagedatap pImagedata;
mng_uint32 iSamplesize = 0;
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (pData, MNG_FN_CREATE_IMGDATAOBJECT, MNG_LC_START)
#endif
/* get a buffer */
MNG_ALLOC (pData, pImagedata, sizeof (mng_imagedata))
/* fill the appropriate fields */
pImagedata->sHeader.fCleanup = (mng_cleanupobject)mng_free_imagedataobject;
pImagedata->sHeader.fProcess = MNG_NULL;
pImagedata->iRefcount = 1;
pImagedata->bFrozen = MNG_FALSE;
pImagedata->bConcrete = bConcrete;
pImagedata->bViewable = bViewable;
pImagedata->iWidth = iWidth;
pImagedata->iHeight = iHeight;
pImagedata->iBitdepth = iBitdepth;
pImagedata->iColortype = iColortype;
pImagedata->iCompression = iCompression;
pImagedata->iFilter = iFilter;
pImagedata->iInterlace = iInterlace;
pImagedata->bCorrected = MNG_FALSE;
pImagedata->iAlphabitdepth = 0;
pImagedata->iJHDRcompression = 0;
pImagedata->iJHDRinterlace = 0;
pImagedata->iPixelsampledepth = iBitdepth;
pImagedata->iAlphasampledepth = iBitdepth;
/* determine samplesize from color_type/bit_depth */
switch (iColortype) /* for < 8-bit samples we just reserve 8 bits */
{
case 0 : ; /* gray */
case 8 : { /* JPEG gray */
#ifndef MNG_NO_16BIT_SUPPORT
if (iBitdepth > 8)
iSamplesize = 2;
else
#endif
iSamplesize = 1;
break;
}
case 2 : ; /* rgb */
case 10 : { /* JPEG rgb */
#ifndef MNG_NO_16BIT_SUPPORT
if (iBitdepth > 8)
iSamplesize = 6;
else
#endif
iSamplesize = 3;
break;
}
case 3 : { /* indexed */
iSamplesize = 1;
break;
}
case 4 : ; /* gray+alpha */
case 12 : { /* JPEG gray+alpha */
#ifndef MNG_NO_16BIT_SUPPORT
if (iBitdepth > 8)
iSamplesize = 4;
else
#endif
iSamplesize = 2;
break;
}
case 6 : ; /* rgb+alpha */
case 14 : { /* JPEG rgb+alpha */
#ifndef MNG_NO_16BIT_SUPPORT
if (iBitdepth > 8)
iSamplesize = 8;
else
#endif
iSamplesize = 4;
break;
}
}
/* make sure we remember all this */
pImagedata->iSamplesize = iSamplesize;
pImagedata->iRowsize = iSamplesize * iWidth;
pImagedata->iImgdatasize = pImagedata->iRowsize * iHeight;
if (pImagedata->iImgdatasize) /* need a buffer ? */
{ /* so allocate it */
MNG_ALLOCX (pData, pImagedata->pImgdata, pImagedata->iImgdatasize)
if (!pImagedata->pImgdata) /* enough memory ? */
{
MNG_FREEX (pData, pImagedata, sizeof (mng_imagedata))
MNG_ERROR (pData, MNG_OUTOFMEMORY)
}
}
/* check global stuff */
pImagedata->bHasGAMA = pData->bHasglobalGAMA;
#ifndef MNG_SKIPCHUNK_cHRM
pImagedata->bHasCHRM = pData->bHasglobalCHRM;
#endif
pImagedata->bHasSRGB = pData->bHasglobalSRGB;
#ifndef MNG_SKIPCHUNK_iCCP
pImagedata->bHasICCP = pData->bHasglobalICCP;
#endif
#ifndef MNG_SKIPCHUNK_bKGD
pImagedata->bHasBKGD = pData->bHasglobalBKGD;
#endif
if (pData->bHasglobalGAMA) /* global gAMA present ? */
pImagedata->iGamma = pData->iGlobalGamma;
#ifndef MNG_SKIPCHUNK_cHRM
if (pData->bHasglobalCHRM) /* global cHRM present ? */
{
pImagedata->iWhitepointx = pData->iGlobalWhitepointx;
pImagedata->iWhitepointy = pData->iGlobalWhitepointy;
pImagedata->iPrimaryredx = pData->iGlobalPrimaryredx;
pImagedata->iPrimaryredy = pData->iGlobalPrimaryredy;
pImagedata->iPrimarygreenx = pData->iGlobalPrimarygreenx;
pImagedata->iPrimarygreeny = pData->iGlobalPrimarygreeny;
pImagedata->iPrimarybluex = pData->iGlobalPrimarybluex;
pImagedata->iPrimarybluey = pData->iGlobalPrimarybluey;
}
#endif
if (pData->bHasglobalSRGB) /* glbal sRGB present ? */
pImagedata->iRenderingintent = pData->iGlobalRendintent;
#ifndef MNG_SKIPCHUNK_iCCP
if (pData->bHasglobalICCP) /* glbal iCCP present ? */
{
pImagedata->iProfilesize = pData->iGlobalProfilesize;
if (pImagedata->iProfilesize)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -