📄 libmng_chunk_io.c
字号:
#ifdef MNG_SUPPORT_DISPLAY { mng_retcode iRetcode = process_display_ihdr (pData); 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; /* fill the fields */ ((mng_ihdrp)*ppChunk)->iWidth = mng_get_uint32 (pRawdata); ((mng_ihdrp)*ppChunk)->iHeight = mng_get_uint32 (pRawdata+4); ((mng_ihdrp)*ppChunk)->iBitdepth = pData->iBitdepth; ((mng_ihdrp)*ppChunk)->iColortype = pData->iColortype; ((mng_ihdrp)*ppChunk)->iCompression = pData->iCompression; ((mng_ihdrp)*ppChunk)->iFilter = pData->iFilter; ((mng_ihdrp)*ppChunk)->iInterlace = pData->iInterlace; }#endif /* MNG_STORE_CHUNKS */#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_READ_IHDR, MNG_LC_END)#endif return MNG_NOERROR; /* done */}/* ************************************************************************** */READ_CHUNK (read_plte){#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS) mng_uint32 iX; mng_uint8p pRawdata2;#endif#ifdef MNG_SUPPORT_DISPLAY mng_uint32 iRawlen2;#endif#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_READ_PLTE, 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 PLTE only inside BASI */ if ((pData->bHasPLTE) && (!pData->bHasBASI)) MNG_ERROR (pData, MNG_MULTIPLEERROR) /* length must be multiple of 3 */ if (((iRawlen % 3) != 0) || (iRawlen > 768)) MNG_ERROR (pData, MNG_INVALIDLENGTH) if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) { /* only allowed for indexed-color or rgb(a)-color! */ if ((pData->iColortype != 2) && (pData->iColortype != 3) && (pData->iColortype != 6)) MNG_ERROR (pData, MNG_CHUNKNOTALLOWED) /* empty only allowed if global present */ if ((iRawlen == 0) && (!pData->bHasglobalPLTE)) MNG_ERROR (pData, MNG_CANNOTBEEMPTY) } else { if (iRawlen == 0) /* cannot be empty as global! */ MNG_ERROR (pData, MNG_CANNOTBEEMPTY) } if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) pData->bHasPLTE = MNG_TRUE; /* got it! */ else pData->bHasglobalPLTE = MNG_TRUE; pData->iPLTEcount = iRawlen / 3; #ifdef MNG_SUPPORT_DISPLAY if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) { mng_imagep pImage; mng_imagedatap pBuf; if (pData->bHasDHDR) /* processing delta-image ? */ { /* store in object 0 !!! */ pImage = (mng_imagep)pData->pObjzero; pBuf = pImage->pImgbuf; pBuf->bHasPLTE = MNG_TRUE; /* it's definitely got a PLTE now */ pBuf->iPLTEcount = iRawlen / 3; /* this is the exact length */ pRawdata2 = pRawdata; /* copy the entries */ for (iX = 0; iX < iRawlen / 3; iX++) { pBuf->aPLTEentries[iX].iRed = *pRawdata2; pBuf->aPLTEentries[iX].iGreen = *(pRawdata2+1); pBuf->aPLTEentries[iX].iBlue = *(pRawdata2+2); pRawdata2 += 3; } } else { /* get the current object */ pImage = (mng_imagep)pData->pCurrentobj; if (!pImage) /* no object then dump it in obj 0 */ pImage = (mng_imagep)pData->pObjzero; pBuf = pImage->pImgbuf; /* address the object buffer */ pBuf->bHasPLTE = MNG_TRUE; /* and tell it it's got a PLTE now */ if (!iRawlen) /* if empty, inherit from global */ { pBuf->iPLTEcount = pData->iGlobalPLTEcount; MNG_COPY (pBuf->aPLTEentries, pData->aGlobalPLTEentries, sizeof (pBuf->aPLTEentries)) if (pData->bHasglobalTRNS) /* also copy global tRNS ? */ { /* indicate tRNS available */ pBuf->bHasTRNS = MNG_TRUE; iRawlen2 = pData->iGlobalTRNSrawlen; pRawdata2 = (mng_uint8p)(pData->aGlobalTRNSrawdata); /* global length oke ? */ if ((iRawlen2 == 0) || (iRawlen2 > pBuf->iPLTEcount)) MNG_ERROR (pData, MNG_GLOBALLENGTHERR) /* copy it */ pBuf->iTRNScount = iRawlen2; MNG_COPY (pBuf->aTRNSentries, pRawdata2, iRawlen2) } } else { /* store fields for future reference */ pBuf->iPLTEcount = iRawlen / 3; pRawdata2 = pRawdata; for (iX = 0; iX < pBuf->iPLTEcount; iX++) { 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 = 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 (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 for deltatype NO_CHANGE */ if ((pData->bHasDHDR) && ((pData->iDeltatype == MNG_DELTATYPE_NOCHANGE))) MNG_ERROR (pData, MNG_CHUNKNOTALLOWED) /* 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 = 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 (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 = create_ani_image (pData); if (iRetcode) /* on error bail out */ return iRetcode; /* display processing */ iRetcode = 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -