📄 libmng_chunk_io.c
字号:
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 (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 == 0) || (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; 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); pBuf->iTRNSgreen = mng_get_uint16 (pRawdata+2); pBuf->iTRNSblue = mng_get_uint16 (pRawdata+4); pBuf->iTRNScount = 0; break; } case 3: { /* indexed */ pBuf->iTRNSgray = 0; pBuf->iTRNSred = 0; pBuf->iTRNSgreen = 0; pBuf->iTRNSblue = 0; pBuf->iTRNScount = iRawlen; MNG_COPY (pBuf->aTRNSentries, pRawdata, iRawlen) break; } } pBuf->bHasTRNS = MNG_TRUE; /* tell it it's got a tRNS now */ } else { /* address 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 object buffer */ pBuf->bHasTRNS = MNG_TRUE; /* and tell it it's got a tRNS now */ if (iRawlen == 0) /* if empty, inherit from global */ { iRawlen2 = pData->iGlobalTRNSrawlen; pRawdata2 = (mng_ptr)(pData->aGlobalTRNSrawdata); /* global length oke ? */ if ((pData->iColortype == 0) && (iRawlen2 != 2)) MNG_ERROR (pData, MNG_GLOBALLENGTHERR) if ((pData->iColortype == 2) && (iRawlen2 != 6)) MNG_ERROR (pData, MNG_GLOBALLENGTHERR) if ((pData->iColortype == 3) && ((iRawlen2 == 0) || (iRawlen2 > pBuf->iPLTEcount))) MNG_ERROR (pData, MNG_GLOBALLENGTHERR) } else { iRawlen2 = iRawlen; pRawdata2 = pRawdata; } switch (pData->iColortype) /* store fields for future reference */ { case 0: { /* gray */ pBuf->iTRNSgray = mng_get_uint16 (pRawdata2); pBuf->iTRNSred = 0; pBuf->iTRNSgreen = 0; pBuf->iTRNSblue = 0; pBuf->iTRNScount = 0; break; } case 2: { /* rgb */ pBuf->iTRNSgray = 0; pBuf->iTRNSred = mng_get_uint16 (pRawdata2); pBuf->iTRNSgreen = mng_get_uint16 (pRawdata2+2); pBuf->iTRNSblue = mng_get_uint16 (pRawdata2+4); pBuf->iTRNScount = 0; break; } case 3: { /* indexed */ pBuf->iTRNSgray = 0; pBuf->iTRNSred = 0; pBuf->iTRNSgreen = 0; pBuf->iTRNSblue = 0; pBuf->iTRNScount = iRawlen2; MNG_COPY (pBuf->aTRNSentries, pRawdata2, iRawlen2) break; } } } } else /* store as global */ { pData->iGlobalTRNSrawlen = iRawlen; MNG_COPY (pData->aGlobalTRNSrawdata, pRawdata, iRawlen) { /* create an animation object */ mng_retcode iRetcode = create_ani_trns (pData, pData->iGlobalTRNSrawlen, pData->aGlobalTRNSrawdata); 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; if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR)) { /* not global! */ ((mng_trnsp)*ppChunk)->bGlobal = MNG_FALSE; ((mng_trnsp)*ppChunk)->iType = pData->iColortype; if (iRawlen == 0) /* if empty, indicate so */ ((mng_trnsp)*ppChunk)->bEmpty = MNG_TRUE; else { ((mng_trnsp)*ppChunk)->bEmpty = MNG_FALSE; switch (pData->iColortype) /* store fields */ { case 0: { /* gray */ ((mng_trnsp)*ppChunk)->iGray = mng_get_uint16 (pRawdata); break; } case 2: { /* rgb */ ((mng_trnsp)*ppChunk)->iRed = mng_get_uint16 (pRawdata); ((mng_trnsp)*ppChunk)->iGreen = mng_get_uint16 (pRawdata+2); ((mng_trnsp)*ppChunk)->iBlue = mng_get_uint16 (pRawdata+4); break; } case 3: { /* indexed */ ((mng_trnsp)*ppChunk)->iCount = iRawlen; MNG_COPY (((mng_trnsp)*ppChunk)->aEntries, pRawdata, iRawlen) break; } } } } else /* it's global! */ { ((mng_trnsp)*ppChunk)->bEmpty = (mng_bool)(iRawlen == 0); ((mng_trnsp)*ppChunk)->bGlobal = MNG_TRUE; ((mng_trnsp)*ppChunk)->iType = 0; ((mng_trnsp)*ppChunk)->iRawlen = iRawlen; MNG_COPY (((mng_trnsp)*ppChunk)->aRawdata, pRawdata, iRawlen) } }#endif /* MNG_STORE_CHUNKS */#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_READ_TRNS, MNG_LC_END)#endif return MNG_NOERROR; /* done */}/* ************************************************************************** */READ_CHUNK (read_gama){#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_READ_GAMA, MNG_LC_START)#endif /* sequence checks */#ifdef MNG_INCLUDE_JNG if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))#else if ((!pData->bHasMHDR) && (!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR) )#endif MNG_ERROR (pData, MNG_SEQUENCEERROR)#ifdef MNG_INCLUDE_JNG if ((pData->bHasIDAT) || (pData->bHasPLTE) || (pData->bHasJDAT) || (pData->bHasJDAA))#else if ((pData->bHasIDAT) || (pData->bHasPLTE))#endif MNG_ERROR (pData, MNG_SEQUENCEERROR)#ifdef MNG_INCLUDE_JNG if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))#else if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))#endif { /* length must be exactly 4 */ if (iRawlen != 4) MNG_ERROR (pData, MNG_INVALIDLENGTH) } else { /* length must be empty or exactly 4 */ if ((iRawlen != 0) && (iRawlen != 4)) MNG_ERROR (pData, MNG_INVALIDLENGTH) }#ifdef MNG_INCLUDE_JNG if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))#else if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))#endif pData->bHasGAMA = MNG_TRUE; /* indicate we've got it */ else pData->bHasglobalGAMA = (mng_bool)(iRawlen != 0);#ifdef MNG_SUPPORT_DISPLAY#ifdef MNG_INCLUDE_JNG if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))#else if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -