📄 libmng_chunk_io.c
字号:
pData->eImagetype = mng_it_png; /* then this must be a PNG */ pData->iWidth = pData->iDatawidth; pData->iHeight = pData->iDataheight; /* predict alpha-depth ! */ if ((pData->iColortype == MNG_COLORTYPE_GRAYA ) || (pData->iColortype == MNG_COLORTYPE_RGBA ) ) pData->iAlphadepth = pData->iBitdepth; else if (pData->iColortype == MNG_COLORTYPE_INDEXED) pData->iAlphadepth = 8; /* worst case scenario */ else pData->iAlphadepth = 1; /* Possible tRNS cheap binary transparency */ /* fits on maximum canvas ? */ if ((pData->iWidth > pData->iMaxwidth) || (pData->iHeight > pData->iMaxheight)) MNG_WARNING (pData, MNG_IMAGETOOLARGE); if (pData->fProcessheader) /* inform the app ? */ if (!pData->fProcessheader (((mng_handle)pData), pData->iWidth, pData->iHeight)) MNG_ERROR (pData, MNG_APPMISCERROR); } if (!pData->bHasDHDR) pData->iImagelevel++; /* one level deeper */#ifdef MNG_SUPPORT_DISPLAY { mng_retcode iRetcode = mng_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 */}#endif /* MNG_OPTIMIZE_CHUNKREADER *//* ************************************************************************** */#ifndef MNG_OPTIMIZE_CHUNKREADERREAD_CHUNK (mng_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;#ifndef MNG_NO_DELTA_PNG 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#endif { /* 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 = 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 */}#endif /* MNG_OPTIMIZE_CHUNKREADER *//* ************************************************************************** */#ifndef MNG_OPTIMIZE_CHUNKREADERREAD_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 */ r
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -