?? libmng_chunk_io.c
字號:
{
pBuf->aPLTEentries[iX].iRed = *pRawdata2;
pBuf->aPLTEentries[iX].iGreen = *(pRawdata2+1);
pBuf->aPLTEentries[iX].iBlue = *(pRawdata2+2);
pRawdata2 += 3;
}
}
}
}
else /* store as global */
{
pData->iGlobalPLTEcount = iRawlen / 3;
pRawdata2 = pRawdata;
for (iX = 0; iX < pData->iGlobalPLTEcount; iX++)
{
pData->aGlobalPLTEentries[iX].iRed = *pRawdata2;
pData->aGlobalPLTEentries[iX].iGreen = *(pRawdata2+1);
pData->aGlobalPLTEentries[iX].iBlue = *(pRawdata2+2);
pRawdata2 += 3;
}
{ /* create an animation object */
mng_retcode iRetcode = mng_create_ani_plte (pData, pData->iGlobalPLTEcount,
pData->aGlobalPLTEentries);
if (iRetcode) /* on error bail out */
return iRetcode;
}
}
#endif /* MNG_SUPPORT_DISPLAY */
#ifdef MNG_STORE_CHUNKS
if (pData->bStorechunks)
{ /* initialize storage */
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
if (iRetcode) /* on error bail out */
return iRetcode;
/* store the fields */
((mng_pltep)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
((mng_pltep)*ppChunk)->iEntrycount = iRawlen / 3;
pRawdata2 = pRawdata;
for (iX = 0; iX < ((mng_pltep)*ppChunk)->iEntrycount; iX++)
{
((mng_pltep)*ppChunk)->aEntries[iX].iRed = *pRawdata2;
((mng_pltep)*ppChunk)->aEntries[iX].iGreen = *(pRawdata2+1);
((mng_pltep)*ppChunk)->aEntries[iX].iBlue = *(pRawdata2+2);
pRawdata2 += 3;
}
}
#endif /* MNG_STORE_CHUNKS */
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (pData, MNG_FN_READ_PLTE, MNG_LC_END)
#endif
return MNG_NOERROR; /* done */
}
/* ************************************************************************** */
READ_CHUNK (mng_read_idat)
{
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (pData, MNG_FN_READ_IDAT, MNG_LC_START)
#endif
#ifdef MNG_INCLUDE_JNG /* sequence checks */
if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
#else
if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR))
#endif
MNG_ERROR (pData, MNG_SEQUENCEERROR)
#ifdef MNG_INCLUDE_JNG
if ((pData->bHasJHDR) &&
(pData->iJHDRalphacompression != MNG_COMPRESSION_DEFLATE))
MNG_ERROR (pData, MNG_SEQUENCEERROR)
if (pData->bHasJSEP)
MNG_ERROR (pData, MNG_SEQUENCEERROR)
#endif
/* not allowed for deltatype NO_CHANGE */
#ifndef MNG_NO_DELTA_PNG
if ((pData->bHasDHDR) && ((pData->iDeltatype == MNG_DELTATYPE_NOCHANGE)))
MNG_ERROR (pData, MNG_CHUNKNOTALLOWED)
#endif
/* can only be empty in BASI-block! */
if ((iRawlen == 0) && (!pData->bHasBASI))
MNG_ERROR (pData, MNG_INVALIDLENGTH)
/* indexed-color requires PLTE */
if ((pData->bHasIHDR) && (pData->iColortype == 3) && (!pData->bHasPLTE))
MNG_ERROR (pData, MNG_PLTEMISSING)
pData->bHasIDAT = MNG_TRUE; /* got some IDAT now, don't we */
#ifdef MNG_SUPPORT_DISPLAY
if (iRawlen)
{ /* display processing */
mng_retcode iRetcode = mng_process_display_idat (pData, iRawlen, pRawdata);
if (iRetcode) /* on error bail out */
return iRetcode;
}
#endif /* MNG_SUPPORT_DISPLAY */
#ifdef MNG_STORE_CHUNKS
if (pData->bStorechunks)
{ /* initialize storage */
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
if (iRetcode) /* on error bail out */
return iRetcode;
/* store the fields */
((mng_idatp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0);
((mng_idatp)*ppChunk)->iDatasize = iRawlen;
if (iRawlen != 0) /* is there any data ? */
{
MNG_ALLOC (pData, ((mng_idatp)*ppChunk)->pData, iRawlen)
MNG_COPY (((mng_idatp)*ppChunk)->pData, pRawdata, iRawlen)
}
}
#endif /* MNG_STORE_CHUNKS */
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (pData, MNG_FN_READ_IDAT, MNG_LC_END)
#endif
return MNG_NOERROR; /* done */
}
/* ************************************************************************** */
READ_CHUNK (mng_read_iend)
{
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (pData, MNG_FN_READ_IEND, MNG_LC_START)
#endif
if (iRawlen > 0) /* must not contain data! */
MNG_ERROR (pData, MNG_INVALIDLENGTH);
#ifdef MNG_INCLUDE_JNG /* sequence checks */
if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))
#else
if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR))
#endif
MNG_ERROR (pData, MNG_SEQUENCEERROR)
/* IHDR-block requires IDAT */
if ((pData->bHasIHDR) && (!pData->bHasIDAT))
MNG_ERROR (pData, MNG_IDATMISSING)
pData->iImagelevel--; /* one level up */
#ifdef MNG_SUPPORT_DISPLAY
{ /* create an animation object */
mng_retcode iRetcode = mng_create_ani_image (pData);
if (iRetcode) /* on error bail out */
return iRetcode;
/* display processing */
iRetcode = mng_process_display_iend (pData);
if (iRetcode) /* on error bail out */
return iRetcode;
}
#endif /* MNG_SUPPORT_DISPLAY */
#ifdef MNG_SUPPORT_DISPLAY
if (!pData->bTimerset) /* reset only if not broken !!! */
{
#endif
/* IEND signals the end for most ... */
pData->bHasIHDR = MNG_FALSE;
pData->bHasBASI = MNG_FALSE;
pData->bHasDHDR = MNG_FALSE;
#ifdef MNG_INCLUDE_JNG
pData->bHasJHDR = MNG_FALSE;
pData->bHasJSEP = MNG_FALSE;
pData->bHasJDAA = MNG_FALSE;
pData->bHasJDAT = MNG_FALSE;
#endif
pData->bHasPLTE = MNG_FALSE;
pData->bHasTRNS = MNG_FALSE;
pData->bHasGAMA = MNG_FALSE;
pData->bHasCHRM = MNG_FALSE;
pData->bHasSRGB = MNG_FALSE;
pData->bHasICCP = MNG_FALSE;
pData->bHasBKGD = MNG_FALSE;
pData->bHasIDAT = MNG_FALSE;
#ifdef MNG_SUPPORT_DISPLAY
}
#endif
#ifdef MNG_STORE_CHUNKS
if (pData->bStorechunks)
{ /* initialize storage */
mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);
if (iRetcode) /* on error bail out */
return iRetcode;
}
#endif /* MNG_STORE_CHUNKS */
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (pData, MNG_FN_READ_IEND, MNG_LC_END)
#endif
return MNG_NOERROR; /* done */
}
/* ************************************************************************** */
READ_CHUNK (mng_read_trns)
{
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (pData, MNG_FN_READ_TRNS, MNG_LC_START)
#endif
/* sequence checks */
if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&
(!pData->bHasBASI) && (!pData->bHasDHDR) )
MNG_ERROR (pData, MNG_SEQUENCEERROR)
#ifdef MNG_INCLUDE_JNG
if ((pData->bHasIDAT) || (pData->bHasJHDR))
#else
if (pData->bHasIDAT)
#endif
MNG_ERROR (pData, MNG_SEQUENCEERROR)
/* multiple tRNS only inside BASI */
if ((pData->bHasTRNS) && (!pData->bHasBASI))
MNG_ERROR (pData, MNG_MULTIPLEERROR)
if (iRawlen > 256) /* it just can't be bigger than that! */
MNG_ERROR (pData, MNG_INVALIDLENGTH)
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
{ /* not allowed with full alpha-channel */
if ((pData->iColortype == 4) || (pData->iColortype == 6))
MNG_ERROR (pData, MNG_CHUNKNOTALLOWED)
if (iRawlen != 0) /* filled ? */
{ /* length checks */
if ((pData->iColortype == 0) && (iRawlen != 2))
MNG_ERROR (pData, MNG_INVALIDLENGTH)
if ((pData->iColortype == 2) && (iRawlen != 6))
MNG_ERROR (pData, MNG_INVALIDLENGTH)
#ifdef MNG_SUPPORT_DISPLAY
if (pData->iColortype == 3)
{
mng_imagep pImage = (mng_imagep)pData->pCurrentobj;
mng_imagedatap pBuf;
if (!pImage) /* no object then check obj 0 */
pImage = (mng_imagep)pData->pObjzero;
pBuf = pImage->pImgbuf; /* address object buffer */
if (iRawlen > pBuf->iPLTEcount)
MNG_ERROR (pData, MNG_INVALIDLENGTH)
}
#endif
}
else /* if empty there must be global stuff! */
{
if (!pData->bHasglobalTRNS)
MNG_ERROR (pData, MNG_CANNOTBEEMPTY)
}
}
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
pData->bHasTRNS = MNG_TRUE; /* indicate tRNS available */
else
pData->bHasglobalTRNS = MNG_TRUE;
#ifdef MNG_SUPPORT_DISPLAY
if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
{
mng_imagep pImage;
mng_imagedatap pBuf;
mng_uint8p pRawdata2;
mng_uint32 iRawlen2;
#ifndef MNG_NO_DELTA_PNG
if (pData->bHasDHDR) /* processing delta-image ? */
{ /* store in object 0 !!! */
pImage = (mng_imagep)pData->pObjzero;
pBuf = pImage->pImgbuf; /* address object buffer */
switch (pData->iColortype) /* store fields for future reference */
{
case 0: { /* gray */
pBuf->iTRNSgray = mng_get_uint16 (pRawdata);
pBuf->iTRNSred = 0;
pBuf->iTRNSgreen = 0;
pBuf->iTRNSblue = 0;
pBuf->iTRNScount = 0;
break;
}
case 2: { /* rgb */
pBuf->iTRNSgray = 0;
pBuf->iTRNSred = mng_get_uint16 (pRawdata);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -