📄 libmng_read.c
字号:
/* ************************************************************************** */
MNG_LOCAL mng_retcode read_databuffer (mng_datap pData,
mng_uint8p pBuf,
mng_uint8p * pBufnext,
mng_uint32 iSize,
mng_uint32 * iRead)
{
mng_retcode iRetcode;
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (pData, MNG_FN_READ_DATABUFFER, MNG_LC_START)
#endif
if (pData->bSuspensionmode)
{
mng_uint8p pTemp;
mng_uint32 iTemp;
*iRead = 0; /* let's be negative about the outcome */
if (!pData->pSuspendbuf) /* need to create a suspension buffer ? */
{
pData->iSuspendbufsize = MNG_SUSPENDBUFFERSIZE;
/* so, create it */
MNG_ALLOC (pData, pData->pSuspendbuf, pData->iSuspendbufsize)
pData->iSuspendbufleft = 0; /* make sure to fill it first time */
pData->pSuspendbufnext = pData->pSuspendbuf;
}
/* more than our buffer can hold ? */
if (iSize > pData->iSuspendbufsize)
{
mng_uint32 iRemain;
if (!*pBufnext) /* first time ? */
{
if (pData->iSuspendbufleft) /* do we have some data left ? */
{ /* then copy it */
MNG_COPY (pBuf, pData->pSuspendbufnext, pData->iSuspendbufleft)
/* fixup variables */
*pBufnext = pBuf + pData->iSuspendbufleft;
pData->pSuspendbufnext = pData->pSuspendbuf;
pData->iSuspendbufleft = 0;
}
else
{
*pBufnext = pBuf;
}
}
/* calculate how much to get */
iRemain = iSize - (mng_uint32)(*pBufnext - pBuf);
/* let's go get it */
iRetcode = read_data (pData, *pBufnext, iRemain, &iTemp);
if (iRetcode)
return iRetcode;
/* first read after suspension return 0 means EOF */
if ((pData->iSuspendpoint) && (iTemp == 0))
{ /* that makes it final */
mng_retcode iRetcode = mng_process_eof (pData);
if (iRetcode) /* on error bail out */
return iRetcode;
/* indicate the source is depleted */
*iRead = iSize - iRemain + iTemp;
}
else
{
if (iTemp < iRemain) /* suspension required ? */
{
*pBufnext = *pBufnext + iTemp;
pData->bSuspended = MNG_TRUE;
}
else
{
*iRead = iSize; /* got it all now ! */
}
}
}
else
{ /* need to read some more ? */
while ((!pData->bSuspended) && (!pData->bEOF) && (iSize > pData->iSuspendbufleft))
{ /* not enough space left in buffer ? */
if (pData->iSuspendbufsize - pData->iSuspendbufleft -
(mng_uint32)(pData->pSuspendbufnext - pData->pSuspendbuf) <
MNG_SUSPENDREQUESTSIZE)
{
if (pData->iSuspendbufleft) /* then lets shift (if there's anything left) */
MNG_COPY (pData->pSuspendbuf, pData->pSuspendbufnext, pData->iSuspendbufleft)
/* adjust running pointer */
pData->pSuspendbufnext = pData->pSuspendbuf;
}
/* still not enough room ? */
if (pData->iSuspendbufsize - pData->iSuspendbufleft < MNG_SUSPENDREQUESTSIZE)
MNG_ERROR (pData, MNG_INTERNALERROR)
/* now read some more data */
pTemp = pData->pSuspendbufnext + pData->iSuspendbufleft;
iRetcode = read_data (pData, pTemp, MNG_SUSPENDREQUESTSIZE, &iTemp);
if (iRetcode)
return iRetcode;
/* adjust fill-counter */
pData->iSuspendbufleft += iTemp;
/* first read after suspension returning 0 means EOF */
if ((pData->iSuspendpoint) && (iTemp == 0))
{ /* that makes it final */
mng_retcode iRetcode = mng_process_eof (pData);
if (iRetcode) /* on error bail out */
return iRetcode;
if (pData->iSuspendbufleft) /* return the leftover scraps */
MNG_COPY (pBuf, pData->pSuspendbufnext, pData->iSuspendbufleft)
/* and indicate so */
*iRead = pData->iSuspendbufleft;
pData->pSuspendbufnext = pData->pSuspendbuf;
pData->iSuspendbufleft = 0;
}
else
{ /* suspension required ? */
if ((iSize > pData->iSuspendbufleft) && (iTemp < MNG_SUSPENDREQUESTSIZE))
pData->bSuspended = MNG_TRUE;
}
pData->iSuspendpoint = 0; /* reset it here in case we loop back */
}
if ((!pData->bSuspended) && (!pData->bEOF))
{ /* return the data ! */
MNG_COPY (pBuf, pData->pSuspendbufnext, iSize)
*iRead = iSize; /* returned it all */
/* adjust suspension-buffer variables */
pData->pSuspendbufnext += iSize;
pData->iSuspendbufleft -= iSize;
}
}
}
else
{
iRetcode = read_data (pData, (mng_ptr)pBuf, iSize, iRead);
if (iRetcode)
return iRetcode;
if (*iRead == 0) /* suspension required ? */
pData->bSuspended = MNG_TRUE;
}
pData->iSuspendpoint = 0; /* safely reset it here ! */
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (pData, MNG_FN_READ_DATABUFFER, MNG_LC_END)
#endif
return MNG_NOERROR;
}
/* ************************************************************************** */
MNG_LOCAL mng_retcode process_raw_chunk (mng_datap pData,
mng_uint8p pBuf,
mng_uint32 iBuflen)
{
/* the table-idea & binary search code was adapted from
libpng 1.1.0 (pngread.c) */
/* NOTE1: the table must remain sorted by chunkname, otherwise the binary
search will break !!! (ps. watch upper-/lower-case chunknames !!) */
/* NOTE2: the layout must remain equal to the header part of all the
chunk-structures (yes, that means even the pNext and pPrev fields;
it's wasting a bit of space, but hey, the code is a lot easier) */
mng_chunk_header chunk_unknown = {MNG_UINT_HUH, mng_init_unknown, mng_free_unknown,
mng_read_unknown, mng_write_unknown, mng_assign_unknown, 0, 0};
mng_chunk_header chunk_table [] =
{
#ifndef MNG_SKIPCHUNK_BACK
{MNG_UINT_BACK, mng_init_back, mng_free_back, mng_read_back, mng_write_back, mng_assign_back, 0, 0},
#endif
#ifndef MNG_SKIPCHUNK_BASI
{MNG_UINT_BASI, mng_init_basi, mng_free_basi, mng_read_basi, mng_write_basi, mng_assign_basi, 0, 0},
#endif
#ifndef MNG_SKIPCHUNK_CLIP
{MNG_UINT_CLIP, mng_init_clip, mng_free_clip, mng_read_clip, mng_write_clip, mng_assign_clip, 0, 0},
#endif
#ifndef MNG_SKIPCHUNK_CLON
{MNG_UINT_CLON, mng_init_clon, mng_free_clon, mng_read_clon, mng_write_clon, mng_assign_clon, 0, 0},
#endif
#ifndef MNG_NO_DELTA_PNG
#ifndef MNG_SKIPCHUNK_DBYK
{MNG_UINT_DBYK, mng_init_dbyk, mng_free_dbyk, mng_read_dbyk, mng_write_dbyk, mng_assign_dbyk, 0, 0},
#endif
#endif
#ifndef MNG_SKIPCHUNK_DEFI
{MNG_UINT_DEFI, mng_init_defi, mng_free_defi, mng_read_defi, mng_write_defi, mng_assign_defi, 0, 0},
#endif
#ifndef MNG_NO_DELTA_PNG
{MNG_UINT_DHDR, mng_init_dhdr, mng_free_dhdr, mng_read_dhdr, mng_write_dhdr, mng_assign_dhdr, 0, 0},
#endif
#ifndef MNG_SKIPCHUNK_DISC
{MNG_UINT_DISC, mng_init_disc, mng_free_disc, mng_read_disc, mng_write_disc, mng_assign_disc, 0, 0},
#endif
#ifndef MNG_NO_DELTA_PNG
#ifndef MNG_SKIPCHUNK_DROP
{MNG_UINT_DROP, mng_init_drop, mng_free_drop, mng_read_drop, mng_write_drop, mng_assign_drop, 0, 0},
#endif
#endif
#ifndef MNG_SKIPCHUNK_LOOP
{MNG_UINT_ENDL, mng_init_endl, mng_free_endl, mng_read_endl, mng_write_endl, mng_assign_endl, 0, 0},
#endif
#ifndef MNG_SKIPCHUNK_FRAM
{MNG_UINT_FRAM, mng_init_fram, mng_free_fram, mng_read_fram, mng_write_fram, mng_assign_fram, 0, 0},
#endif
{MNG_UINT_IDAT, mng_init_idat, mng_free_idat, mng_read_idat, mng_write_idat, mng_assign_idat, 0, 0}, /* 12-th element! */
{MNG_UINT_IEND, mng_init_iend, mng_free_iend, mng_read_iend, mng_write_iend, mng_assign_iend, 0, 0},
{MNG_UINT_IHDR, mng_init_ihdr, mng_free_ihdr, mng_read_ihdr, mng_write_ihdr, mng_assign_ihdr, 0, 0},
#ifndef MNG_NO_DELTA_PNG
#ifdef MNG_INCLUDE_JNG
{MNG_UINT_IJNG, mng_init_ijng, mng_free_ijng, mng_read_ijng, mng_write_ijng, mng_assign_ijng, 0, 0},
#endif
{MNG_UINT_IPNG, mng_init_ipng, mng_free_ipng, mng_read_ipng, mng_write_ipng, mng_assign_ipng, 0, 0},
#endif
#ifdef MNG_INCLUDE_JNG
{MNG_UINT_JDAA, mng_init_jdaa, mng_free_jdaa, mng_read_jdaa, mng_write_jdaa, mng_assign_jdaa, 0, 0},
{MNG_UINT_JDAT, mng_init_jdat, mng_free_jdat, mng_read_jdat, mng_write_jdat, mng_assign_jdat, 0, 0},
{MNG_UINT_JHDR, mng_init_jhdr, mng_free_jhdr, mng_read_jhdr, mng_write_jhdr, mng_assign_jhdr, 0, 0},
{MNG_UINT_JSEP, mng_init_jsep, mng_free_jsep, mng_read_jsep, mng_write_jsep, mng_assign_jsep, 0, 0},
{MNG_UINT_JdAA, mng_init_jdaa, mng_free_jdaa, mng_read_jdaa, mng_write_jdaa, mng_assign_jdaa, 0, 0},
#endif
#ifndef MNG_SKIPCHUNK_LOOP
{MNG_UINT_LOOP, mng_init_loop, mng_free_loop, mng_read_loop, mng_write_loop, mng_assign_loop, 0, 0},
#endif
#ifndef MNG_SKIPCHUNK_MAGN
{MNG_UINT_MAGN, mng_init_magn, mng_free_magn, mng_read_magn, mng_write_magn, mng_assign_magn, 0, 0},
#endif
{MNG_UINT_MEND, mng_init_mend, mng_free_mend, mng_read_mend, mng_write_mend, mng_assign_mend, 0, 0},
{MNG_UINT_MHDR, mng_init_mhdr, mng_free_mhdr, mng_read_mhdr, mng_write_mhdr, mng_assign_mhdr, 0, 0},
#ifndef MNG_SKIPCHUNK_MOVE
{MNG_UINT_MOVE, mng_init_move, mng_free_move, mng_read_move, mng_write_move, mng_assign_move, 0, 0},
#endif
#ifndef MNG_NO_DELTA_PNG
#ifndef MNG_SKIPCHUNK_ORDR
{MNG_UINT_ORDR, mng_init_ordr, mng_free_ordr, mng_read_ordr, mng_write_ordr, mng_assign_ordr, 0, 0},
#endif
#endif
#ifndef MNG_SKIPCHUNK_PAST
{MNG_UINT_PAST, mng_init_past, mng_free_past, mng_read_past, mng_write_past, mng_assign_past, 0, 0},
#endif
{MNG_UINT_PLTE, mng_init_plte, mng_free_plte, mng_read_plte, mng_write_plte, mng_assign_plte, 0, 0},
#ifndef MNG_NO_DELTA_PNG
{MNG_UINT_PPLT, mng_init_pplt, mng_free_pplt, mng_read_pplt, mng_write_pplt, mng_assign_pplt, 0, 0},
{MNG_UINT_PROM, mng_init_prom, mng_free_prom, mng_read_prom, mng_write_prom, mng_assign_prom, 0, 0},
#endif
#ifndef MNG_SKIPCHUNK_SAVE
{MNG_UINT_SAVE, mng_init_save, mng_free_save, mng_read_save, mng_write_save, mng_assign_save, 0, 0},
#endif
#ifndef MNG_SKIPCHUNK_SEEK
{MNG_UINT_SEEK, mng_init_seek, mng_free_seek, mng_read_seek, mng_write_seek, mng_assign_seek, 0, 0},
#endif
#ifndef MNG_SKIPCHUNK_SHOW
{MNG_UINT_SHOW, mng_init_show, mng_free_show, mng_read_show, mng_write_show, mng_assign_show, 0, 0},
#endif
#ifndef MNG_SKIPCHUNK_TERM
{MNG_UINT_TERM, mng_init_term, mng_free_term, mng_read_term, mng_write_term, mng_assign_term, 0, 0},
#endif
#ifndef MNG_SKIPCHUNK_bKGD
{MNG_UINT_bKGD, mng_init_bkgd, mng_free_bkgd, mng_read_bkgd, mng_write_bkgd, mng_assign_bkgd, 0, 0},
#endif
#ifndef MNG_SKIPCHUNK_cHRM
{MNG_UINT_cHRM, mng_init_chrm, mng_free_chrm, mng_read_chrm, mng_write_chrm, mng_assign_chrm, 0, 0},
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -