📄 libmng_chunk_io.c
字号:
/* check chunk against signature */ if ((pDescr->eImgtype == mng_it_mng) && (pData->eSigtype != mng_it_mng)) MNG_ERROR (pData, MNG_CHUNKNOTALLOWED); if ((pDescr->eImgtype == mng_it_jng) && (pData->eSigtype == mng_it_png)) MNG_ERROR (pData, MNG_CHUNKNOTALLOWED); /* empties allowed ? */ if ((iRawlen == 0) && (!(pDescr->iAllowed & MNG_DESCR_EMPTY))) MNG_ERROR (pData, MNG_INVALIDLENGTH); if ((pData->eImagetype != mng_it_mng) || (!(pDescr->iAllowed & MNG_DESCR_GLOBAL))) { /* *a* header required ? */ if ((pDescr->iMusthaves & MNG_DESCR_GenHDR) &&#ifdef MNG_INCLUDE_JNG (!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))#else (!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR))#endif MNG_ERROR (pData, MNG_SEQUENCEERROR);#ifdef MNG_INCLUDE_JNG if ((pDescr->iMusthaves & MNG_DESCR_JngHDR) && (!pData->bHasDHDR) && (!pData->bHasJHDR)) MNG_ERROR (pData, MNG_SEQUENCEERROR);#endif } /* specific chunk pre-requisite ? */ if (((pDescr->iMusthaves & MNG_DESCR_IHDR) && (!pData->bHasIHDR)) ||#ifdef MNG_INCLUDE_JNG ((pDescr->iMusthaves & MNG_DESCR_JHDR) && (!pData->bHasJHDR)) ||#endif ((pDescr->iMusthaves & MNG_DESCR_DHDR) && (!pData->bHasDHDR)) || ((pDescr->iMusthaves & MNG_DESCR_LOOP) && (!pData->bHasLOOP)) || ((pDescr->iMusthaves & MNG_DESCR_PLTE) && (!pData->bHasPLTE)) || ((pDescr->iMusthaves & MNG_DESCR_MHDR) && (!pData->bHasMHDR)) || ((pDescr->iMusthaves & MNG_DESCR_SAVE) && (!pData->bHasSAVE)) ) MNG_ERROR (pData, MNG_SEQUENCEERROR); /* specific chunk undesired ? */ if (((pDescr->iMustNOThaves & MNG_DESCR_NOIHDR) && (pData->bHasIHDR)) || ((pDescr->iMustNOThaves & MNG_DESCR_NOBASI) && (pData->bHasBASI)) || ((pDescr->iMustNOThaves & MNG_DESCR_NODHDR) && (pData->bHasDHDR)) || ((pDescr->iMustNOThaves & MNG_DESCR_NOIDAT) && (pData->bHasIDAT)) || ((pDescr->iMustNOThaves & MNG_DESCR_NOPLTE) && (pData->bHasPLTE)) ||#ifdef MNG_INCLUDE_JNG ((pDescr->iMustNOThaves & MNG_DESCR_NOJHDR) && (pData->bHasJHDR)) || ((pDescr->iMustNOThaves & MNG_DESCR_NOJDAT) && (pData->bHasJDAT)) || ((pDescr->iMustNOThaves & MNG_DESCR_NOJDAA) && (pData->bHasJDAA)) || ((pDescr->iMustNOThaves & MNG_DESCR_NOJSEP) && (pData->bHasJSEP)) ||#endif ((pDescr->iMustNOThaves & MNG_DESCR_NOMHDR) && (pData->bHasMHDR)) || ((pDescr->iMustNOThaves & MNG_DESCR_NOLOOP) && (pData->bHasLOOP)) || ((pDescr->iMustNOThaves & MNG_DESCR_NOTERM) && (pData->bHasTERM)) || ((pDescr->iMustNOThaves & MNG_DESCR_NOSAVE) && (pData->bHasSAVE)) ) MNG_ERROR (pData, MNG_SEQUENCEERROR); if (pData->eSigtype == mng_it_mng) /* check global and embedded empty chunks */ {#ifdef MNG_INCLUDE_JNG if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))#else if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))#endif { if ((iRawlen == 0) && (!(pDescr->iAllowed & MNG_DESCR_EMPTYEMBED))) MNG_ERROR (pData, MNG_INVALIDLENGTH); } else { if ((iRawlen == 0) && (!(pDescr->iAllowed & MNG_DESCR_EMPTYGLOBAL))) MNG_ERROR (pData, MNG_INVALIDLENGTH); } } if (pDescr->pSpecialfunc) /* need special processing ? */ { iRetcode = create_chunk_storage (pData, pHeader, iRawlen, pRawdata, pField, iFields, ppChunk, MNG_TRUE); if (iRetcode) /* on error bail out */ return iRetcode; /* empty indicator ? */ if ((!iRawlen) && (pDescr->iOffsetempty)) *(((mng_uint8p)*ppChunk)+pDescr->iOffsetempty) = MNG_TRUE; iRetcode = pDescr->pSpecialfunc(pData, *ppChunk); if (iRetcode) /* on error bail out */ return iRetcode; if ((((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_IDAT) || (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_JDAT) || (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_JDAA) ) { iRetcode = ((mng_chunk_headerp)*ppChunk)->fCleanup (pData, *ppChunk); if (iRetcode) /* on error bail out */ return iRetcode; *ppChunk = MNG_NULL; } else {#ifdef MNG_STORE_CHUNKS if (!pData->bStorechunks)#endif { iRetcode = ((mng_chunk_headerp)*ppChunk)->fCleanup (pData, *ppChunk); if (iRetcode) /* on error bail out */ return iRetcode; *ppChunk = MNG_NULL; } } }#ifdef MNG_SUPPORT_DISPLAY if (iRawlen) {#ifdef MNG_OPTIMIZE_DISPLAYCALLS pData->iRawlen = iRawlen; pData->pRawdata = pRawdata;#endif /* display processing */#ifndef MNG_OPTIMIZE_DISPLAYCALLS if (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_IDAT) iRetcode = mng_process_display_idat (pData, iRawlen, pRawdata);#ifdef MNG_INCLUDE_JNG else if (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_JDAT) iRetcode = mng_process_display_jdat (pData, iRawlen, pRawdata); else if (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_JDAA) iRetcode = mng_process_display_jdaa (pData, iRawlen, pRawdata);#endif#else if (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_IDAT) iRetcode = mng_process_display_idat (pData);#ifdef MNG_INCLUDE_JNG else if (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_JDAT) iRetcode = mng_process_display_jdat (pData); else if (((mng_chunk_headerp)pHeader)->iChunkname == MNG_UINT_JDAA) iRetcode = mng_process_display_jdaa (pData);#endif#endif if (iRetcode) return iRetcode; }#endif /* MNG_SUPPORT_DISPLAY */#ifdef MNG_STORE_CHUNKS if ((pData->bStorechunks) && (!(*ppChunk))) { iRetcode = create_chunk_storage (pData, pHeader, iRawlen, pRawdata, pField, iFields, ppChunk, MNG_FALSE); if (iRetcode) /* on error bail out */ return iRetcode; /* empty indicator ? */ if ((!iRawlen) && (pDescr->iOffsetempty)) *(((mng_uint8p)*ppChunk)+pDescr->iOffsetempty) = MNG_TRUE; }#endif /* MNG_STORE_CHUNKS */ return MNG_NOERROR;}/* ************************************************************************** */#endif /* MNG_OPTIMIZE_CHUNKREADER *//* ************************************************************************** */#ifndef MNG_OPTIMIZE_CHUNKREADERREAD_CHUNK (mng_read_ihdr){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_READ_IHDR, MNG_LC_START);#endif if (iRawlen != 13) /* length oke ? */ MNG_ERROR (pData, MNG_INVALIDLENGTH); /* only allowed inside PNG or MNG */ if ((pData->eSigtype != mng_it_png) && (pData->eSigtype != mng_it_mng)) MNG_ERROR (pData, MNG_CHUNKNOTALLOWED); /* sequence checks */ if ((pData->eSigtype == mng_it_png) && (pData->iChunkseq > 1)) MNG_ERROR (pData, MNG_SEQUENCEERROR);#ifdef MNG_INCLUDE_JNG if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasIDAT) || (pData->bHasJHDR))#else if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasIDAT))#endif MNG_ERROR (pData, MNG_SEQUENCEERROR); pData->bHasIHDR = MNG_TRUE; /* indicate IHDR is present */ /* and store interesting fields */ if ((!pData->bHasDHDR) || (pData->iDeltatype == MNG_DELTATYPE_NOCHANGE)) { pData->iDatawidth = mng_get_uint32 (pRawdata); pData->iDataheight = mng_get_uint32 (pRawdata+4); } pData->iBitdepth = *(pRawdata+8); pData->iColortype = *(pRawdata+9); pData->iCompression = *(pRawdata+10); pData->iFilter = *(pRawdata+11); pData->iInterlace = *(pRawdata+12);#if defined(MNG_NO_1_2_4BIT_SUPPORT) || defined(MNG_NO_16BIT_SUPPORT) pData->iPNGmult = 1; pData->iPNGdepth = pData->iBitdepth;#endif#ifdef MNG_NO_1_2_4BIT_SUPPORT if (pData->iBitdepth < 8) pData->iBitdepth = 8;#endif#ifdef MNG_NO_16BIT_SUPPORT if (pData->iBitdepth > 8) { pData->iBitdepth = 8; pData->iPNGmult = 2; }#endif if ((pData->iBitdepth != 8) /* parameter validity checks */#ifndef MNG_NO_1_2_4BIT_SUPPORT && (pData->iBitdepth != 1) && (pData->iBitdepth != 2) && (pData->iBitdepth != 4)#endif#ifndef MNG_NO_16BIT_SUPPORT && (pData->iBitdepth != 16) #endif ) MNG_ERROR (pData, MNG_INVALIDBITDEPTH); if ((pData->iColortype != MNG_COLORTYPE_GRAY ) && (pData->iColortype != MNG_COLORTYPE_RGB ) && (pData->iColortype != MNG_COLORTYPE_INDEXED) && (pData->iColortype != MNG_COLORTYPE_GRAYA ) && (pData->iColortype != MNG_COLORTYPE_RGBA ) ) MNG_ERROR (pData, MNG_INVALIDCOLORTYPE); if ((pData->iColortype == MNG_COLORTYPE_INDEXED) && (pData->iBitdepth > 8)) MNG_ERROR (pData, MNG_INVALIDBITDEPTH); if (((pData->iColortype == MNG_COLORTYPE_RGB ) || (pData->iColortype == MNG_COLORTYPE_GRAYA ) || (pData->iColortype == MNG_COLORTYPE_RGBA ) ) && (pData->iBitdepth < 8 ) ) MNG_ERROR (pData, MNG_INVALIDBITDEPTH); if (pData->iCompression != MNG_COMPRESSION_DEFLATE) MNG_ERROR (pData, MNG_INVALIDCOMPRESS);#if defined(FILTER192) || defined(FILTER193) if ((pData->iFilter != MNG_FILTER_ADAPTIVE ) &&#if defined(FILTER192) && defined(FILTER193) (pData->iFilter != MNG_FILTER_DIFFERING) && (pData->iFilter != MNG_FILTER_NOFILTER ) )#else#ifdef FILTER192 (pData->iFilter != MNG_FILTER_DIFFERING) )#else (pData->iFilter != MNG_FILTER_NOFILTER ) )#endif#endif MNG_ERROR (pData, MNG_INVALIDFILTER);#else if (pData->iFilter) MNG_ERROR (pData, MNG_INVALIDFILTER);#endif if ((pData->iInterlace != MNG_INTERLACE_NONE ) && (pData->iInterlace != MNG_INTERLACE_ADAM7) ) MNG_ERROR (pData, MNG_INVALIDINTERLACE);#ifdef MNG_SUPPORT_DISPLAY #ifndef MNG_NO_DELTA_PNG if (pData->bHasDHDR) /* check the colortype for delta-images ! */ { mng_imagedatap pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf; if (pData->iColortype != pBuf->iColortype) { if ( ( (pData->iColortype != MNG_COLORTYPE_INDEXED) || (pBuf->iColortype == MNG_COLORTYPE_GRAY ) ) && ( (pData->iColortype != MNG_COLORTYPE_GRAY ) || (pBuf->iColortype == MNG_COLORTYPE_INDEXED) ) ) MNG_ERROR (pData, MNG_INVALIDCOLORTYPE); } }#endif#endif if (!pData->bHasheader) /* first chunk ? */ { pData->bHasheader = MNG_TRUE; /* we've got a header */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -