📄 libmng_read.c
字号:
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){#ifndef MNG_OPTIMIZE_CHUNKREADER /* 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) */#ifdef MNG_OPTIMIZE_CHUNKINITFREE mng_chunk_header mng_chunk_unknown = {MNG_UINT_HUH, mng_init_general, mng_free_unknown, mng_read_unknown, mng_write_unknown, mng_assign_unknown, 0, 0, sizeof(mng_unknown_chunk)};#else mng_chunk_header mng_chunk_unknown = {MNG_UINT_HUH, mng_init_unknown, mng_free_unknown, mng_read_unknown, mng_write_unknown, mng_assign_unknown, 0, 0};#endif#ifdef MNG_OPTIMIZE_CHUNKINITFREE mng_chunk_header mng_chunk_table [] = {#ifndef MNG_SKIPCHUNK_BACK {MNG_UINT_BACK, mng_init_general, mng_free_general, mng_read_back, mng_write_back, mng_assign_general, 0, 0, sizeof(mng_back)},#endif#ifndef MNG_SKIPCHUNK_BASI {MNG_UINT_BASI, mng_init_general, mng_free_general, mng_read_basi, mng_write_basi, mng_assign_general, 0, 0, sizeof(mng_basi)},#endif#ifndef MNG_SKIPCHUNK_CLIP {MNG_UINT_CLIP, mng_init_general, mng_free_general, mng_read_clip, mng_write_clip, mng_assign_general, 0, 0, sizeof(mng_clip)},#endif#ifndef MNG_SKIPCHUNK_CLON {MNG_UINT_CLON, mng_init_general, mng_free_general, mng_read_clon, mng_write_clon, mng_assign_general, 0, 0, sizeof(mng_clon)},#endif#ifndef MNG_NO_DELTA_PNG#ifndef MNG_SKIPCHUNK_DBYK {MNG_UINT_DBYK, mng_init_general, mng_free_dbyk, mng_read_dbyk, mng_write_dbyk, mng_assign_dbyk, 0, 0, sizeof(mng_dbyk)},#endif#endif#ifndef MNG_SKIPCHUNK_DEFI {MNG_UINT_DEFI, mng_init_general, mng_free_general, mng_read_defi, mng_write_defi, mng_assign_general, 0, 0, sizeof(mng_defi)},#endif#ifndef MNG_NO_DELTA_PNG {MNG_UINT_DHDR, mng_init_general, mng_free_general, mng_read_dhdr, mng_write_dhdr, mng_assign_general, 0, 0, sizeof(mng_dhdr)},#endif#ifndef MNG_SKIPCHUNK_DISC {MNG_UINT_DISC, mng_init_general, mng_free_disc, mng_read_disc, mng_write_disc, mng_assign_disc, 0, 0, sizeof(mng_disc)},#endif#ifndef MNG_NO_DELTA_PNG#ifndef MNG_SKIPCHUNK_DROP {MNG_UINT_DROP, mng_init_general, mng_free_drop, mng_read_drop, mng_write_drop, mng_assign_drop, 0, 0, sizeof(mng_drop)},#endif#endif#ifndef MNG_SKIPCHUNK_LOOP {MNG_UINT_ENDL, mng_init_general, mng_free_general, mng_read_endl, mng_write_endl, mng_assign_general, 0, 0, sizeof(mng_endl)},#endif#ifndef MNG_SKIPCHUNK_FRAM {MNG_UINT_FRAM, mng_init_general, mng_free_fram, mng_read_fram, mng_write_fram, mng_assign_fram, 0, 0, sizeof(mng_fram)},#endif {MNG_UINT_IDAT, mng_init_general, mng_free_idat, mng_read_idat, mng_write_idat, mng_assign_idat, 0, 0, sizeof(mng_idat)}, /* 12-th element! */ {MNG_UINT_IEND, mng_init_general, mng_free_general, mng_read_iend, mng_write_iend, mng_assign_general, 0, 0, sizeof(mng_iend)}, {MNG_UINT_IHDR, mng_init_general, mng_free_general, mng_read_ihdr, mng_write_ihdr, mng_assign_general, 0, 0, sizeof(mng_ihdr)},#ifndef MNG_NO_DELTA_PNG#ifdef MNG_INCLUDE_JNG {MNG_UINT_IJNG, mng_init_general, mng_free_general, mng_read_ijng, mng_write_ijng, mng_assign_general, 0, 0, sizeof(mng_ijng)},#endif {MNG_UINT_IPNG, mng_init_general, mng_free_general, mng_read_ipng, mng_write_ipng, mng_assign_general, 0, 0, sizeof(mng_ipng)},#endif#ifdef MNG_INCLUDE_JNG {MNG_UINT_JDAA, mng_init_general, mng_free_jdaa, mng_read_jdaa, mng_write_jdaa, mng_assign_jdaa, 0, 0, sizeof(mng_jdaa)}, {MNG_UINT_JDAT, mng_init_general, mng_free_jdat, mng_read_jdat, mng_write_jdat, mng_assign_jdat, 0, 0, sizeof(mng_jdat)}, {MNG_UINT_JHDR, mng_init_general, mng_free_general, mng_read_jhdr, mng_write_jhdr, mng_assign_general, 0, 0, sizeof(mng_jhdr)}, {MNG_UINT_JSEP, mng_init_general, mng_free_general, mng_read_jsep, mng_write_jsep, mng_assign_general, 0, 0, sizeof(mng_jsep)}, {MNG_UINT_JdAA, mng_init_general, mng_free_jdaa, mng_read_jdaa, mng_write_jdaa, mng_assign_jdaa, 0, 0, sizeof(mng_jdaa)},#endif#ifndef MNG_SKIPCHUNK_LOOP {MNG_UINT_LOOP, mng_init_general, mng_free_loop, mng_read_loop, mng_write_loop, mng_assign_loop, 0, 0, sizeof(mng_loop)},#endif#ifndef MNG_SKIPCHUNK_MAGN {MNG_UINT_MAGN, mng_init_general, mng_free_general, mng_read_magn, mng_write_magn, mng_assign_general, 0, 0, sizeof(mng_magn)},#endif {MNG_UINT_MEND, mng_init_general, mng_free_general, mng_read_mend, mng_write_mend, mng_assign_general, 0, 0, sizeof(mng_mend)}, {MNG_UINT_MHDR, mng_init_general, mng_free_general, mng_read_mhdr, mng_write_mhdr, mng_assign_general, 0, 0, sizeof(mng_mhdr)},#ifndef MNG_SKIPCHUNK_MOVE {MNG_UINT_MOVE, mng_init_general, mng_free_general, mng_read_move, mng_write_move, mng_assign_general, 0, 0, sizeof(mng_move)},#endif#ifndef MNG_NO_DELTA_PNG#ifndef MNG_SKIPCHUNK_ORDR {MNG_UINT_ORDR, mng_init_general, mng_free_ordr, mng_read_ordr, mng_write_ordr, mng_assign_ordr, 0, 0, sizeof(mng_ordr)},#endif#endif#ifndef MNG_SKIPCHUNK_PAST {MNG_UINT_PAST, mng_init_general, mng_free_past, mng_read_past, mng_write_past, mng_assign_past, 0, 0, sizeof(mng_past)},#endif {MNG_UINT_PLTE, mng_init_general, mng_free_general, mng_read_plte, mng_write_plte, mng_assign_general, 0, 0, sizeof(mng_plte)},#ifndef MNG_NO_DELTA_PNG {MNG_UINT_PPLT, mng_init_general, mng_free_general, mng_read_pplt, mng_write_pplt, mng_assign_general, 0, 0, sizeof(mng_pplt)}, {MNG_UINT_PROM, mng_init_general, mng_free_general, mng_read_prom, mng_write_prom, mng_assign_general, 0, 0, sizeof(mng_prom)},#endif#ifndef MNG_SKIPCHUNK_SAVE {MNG_UINT_SAVE, mng_init_general, mng_free_save, mng_read_save, mng_write_save, mng_assign_save, 0, 0, sizeof(mng_save)},#endif#ifndef MNG_SKIPCHUNK_SEEK {MNG_UINT_SEEK, mng_init_general, mng_free_seek, mng_read_seek, mng_write_seek, mng_assign_seek, 0, 0, sizeof(mng_seek)},#endif#ifndef MNG_SKIPCHUNK_SHOW {MNG_UINT_SHOW, mng_init_general, mng_free_general, mng_read_show, mng_write_show, mng_assign_general, 0, 0, sizeof(mng_show)},#endif#ifndef MNG_SKIPCHUNK_TERM {MNG_UINT_TERM, mng_init_general, mng_free_general, mng_read_term, mng_write_term, mng_assign_general, 0, 0, sizeof(mng_term)},#endif#ifndef MNG_SKIPCHUNK_bKGD {MNG_UINT_bKGD, mng_init_general, mng_free_general, mng_read_bkgd, mng_write_bkgd, mng_assign_general, 0, 0, sizeof(mng_bkgd)},#endif#ifndef MNG_SKIPCHUNK_cHRM {MNG_UINT_cHRM, mng_init_general, mng_free_general, mng_read_chrm, mng_write_chrm, mng_assign_general, 0, 0, sizeof(mng_chrm)},#endif#ifndef MNG_SKIPCHUNK_eXPI {MNG_UINT_eXPI, mng_init_general, mng_free_expi, mng_read_expi, mng_write_expi, mng_assign_expi, 0, 0, sizeof(mng_expi)},#endif#ifndef MNG_SKIPCHUNK_evNT {MNG_UINT_evNT, mng_init_general, mng_free_evnt, mng_read_evnt, mng_write_evnt, mng_assign_evnt, 0, 0, sizeof(mng_evnt)},#endif#ifndef MNG_SKIPCHUNK_fPRI {MNG_UINT_fPRI, mng_init_general, mng_free_general, mng_read_fpri, mng_write_fpri, mng_assign_general, 0, 0, sizeof(mng_fpri)},#endif#ifndef MNG_SKIPCHUNK_gAMA {MNG_UINT_gAMA, mng_init_general, mng_free_general, mng_read_gama, mng_write_gama, mng_assign_general, 0, 0, sizeof(mng_gama)},#endif#ifndef MNG_SKIPCHUNK_hIST {MNG_UINT_hIST, mng_init_general, mng_free_general, mng_read_hist, mng_write_hist, mng_assign_general, 0, 0, sizeof(mng_hist)},#endif#ifndef MNG_SKIPCHUNK_iCCP {MNG_UINT_iCCP, mng_init_general, mng_free_iccp, mng_read_iccp, mng_write_iccp, mng_assign_iccp, 0, 0, sizeof(mng_iccp)},#endif#ifndef MNG_SKIPCHUNK_iTXt {MNG_UINT_iTXt, mng_init_general, mng_free_itxt, mng_read_itxt, mng_write_itxt, mng_assign_itxt, 0, 0, sizeof(mng_itxt)},#endif#ifndef MNG_SKIPCHUNK_nEED {MNG_UINT_nEED, mng_init_general, mng_free_need, mng_read_need, mng_write_need, mng_assign_need, 0, 0, sizeof(mng_need)},#endif/* TODO: {MNG_UINT_oFFs, 0, 0, 0, 0, 0, 0}, *//* TODO: {MNG_UINT_pCAL, 0, 0, 0, 0, 0, 0}, */#ifndef MNG_SKIPCHUNK_pHYg {MNG_UINT_pHYg, mng_init_general, mng_free_general, mng_read_phyg, mng_write_phyg, mng_assign_general, 0, 0, sizeof(mng_phyg)},#endif#ifndef MNG_SKIPCHUNK_pHYs {MNG_UINT_pHYs, mng_init_general, mng_free_general, mng_read_phys, mng_write_phys, mng_assign_general, 0, 0, sizeof(mng_phys)},#endif#ifndef MNG_SKIPCHUNK_sBIT {MNG_UINT_sBIT, mng_init_general, mng_free_general, mng_read_sbit, mng_write_sbit, mng_assign_general, 0, 0, sizeof(mng_sbit)},#endif/* TODO: {MNG_UINT_sCAL, 0, 0, 0, 0, 0, 0}, */#ifndef MNG_SKIPCHUNK_sPLT {MNG_UINT_sPLT, mng_init_general, mng_free_splt, mng_read_splt, mng_write_splt, mng_assign_splt, 0, 0, sizeof(mng_splt)},#endif {MNG_UINT_sRGB, mng_init_general, mng_free_general, mng_read_srgb, mng_write_srgb, mng_assign_general, 0, 0, sizeof(mng_srgb)},#ifndef MNG_SKIPCHUNK_tEXt {MNG_UINT_tEXt, mng_init_general, mng_free_text, mng_read_text, mng_write_text, mng_assign_text, 0, 0, sizeof(mng_text)},#endif#ifndef MNG_SKIPCHUNK_tIME {MNG_UINT_tIME, mng_init_general, mng_free_general, mng_read_time, mng_write_time, mng_assign_general, 0, 0, sizeof(mng_time)},#endif {MNG_UINT_tRNS, mng_init_general, mng_free_general, mng_read_trns, mng_write_trns, mng_assign_general, 0, 0, sizeof(mng_trns)},#ifndef MNG_SKIPCHUNK_zTXt {MNG_UINT_zTXt, mng_init_general, mng_free_ztxt, mng_read_ztxt, mng_write_ztxt, mng_assign_ztxt, 0, 0, sizeof(mng_ztxt)},#endif };#else /* MNG_OPTIMIZE_CHUNKINITFREE */ mng_chunk_header mng_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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -