📄 libmng_display.c
字号:
if (iRetcode) /* on error bail out */ return iRetcode;#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_CLEAR_CANVAS, MNG_LC_END)#endif return MNG_NOERROR;}/* ************************************************************************** */mng_retcode next_frame (mng_datap pData, mng_uint8 iFramemode, mng_uint8 iChangedelay, mng_uint32 iDelay, mng_uint8 iChangetimeout, mng_uint32 iTimeout, mng_uint8 iChangeclipping, mng_uint8 iCliptype, mng_int32 iClipl, mng_int32 iClipr, mng_int32 iClipt, mng_int32 iClipb){ mng_retcode iRetcode = MNG_NOERROR;#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_NEXT_FRAME, MNG_LC_START)#endif if (!pData->iBreakpoint) /* no previous break here ? */ { mng_uint8 iOldmode = pData->iFramemode; /* interframe delay required ? */ if ((iOldmode == 2) || (iOldmode == 4)) {/* changed here because FRAM 1/3 will delay themselves before each image */ if ((pData->iFrameseq) && (iFramemode != 1) && (iFramemode != 3)) iRetcode = interframe_delay (pData); else pData->iFramedelay = pData->iNextdelay; } else { /* delay before inserting background layer? */ if ((pData->bFramedone) && (iFramemode == 4)) iRetcode = interframe_delay (pData); } if (iRetcode) /* on error bail out */ return iRetcode; /* now we'll assume we're in the next frame! */ if (iFramemode) /* save the new framing mode ? */ { pData->iFRAMmode = iFramemode; pData->iFramemode = iFramemode; } else /* reload default */ pData->iFramemode = pData->iFRAMmode; if (iChangedelay) /* delay changed ? */ { pData->iNextdelay = iDelay; /* for *after* next subframe */ if ((iOldmode == 2) || (iOldmode == 4))/* pData->iFramedelay = iDelay; */ pData->iFramedelay = pData->iFRAMdelay; if (iChangedelay == 2) /* also overall ? */ pData->iFRAMdelay = iDelay; } else { /* reload default */ pData->iNextdelay = pData->iFRAMdelay;/* if ((iOldmode == 2) || (iOldmode == 4)) pData->iFramedelay = pData->iNextdelay; */ } if (iChangetimeout) /* timeout changed ? */ { /* for next subframe */ pData->iFrametimeout = iTimeout; if ((iChangetimeout == 2) || /* also overall ? */ (iChangetimeout == 4) || (iChangetimeout == 6) || (iChangetimeout == 8)) pData->iFRAMtimeout = iTimeout; } else /* reload default */ pData->iFrametimeout = pData->iFRAMtimeout; if (iChangeclipping) /* clipping changed ? */ { pData->bFrameclipping = MNG_TRUE; if (!iCliptype) /* absolute ? */ { pData->iFrameclipl = iClipl; pData->iFrameclipr = iClipr; pData->iFrameclipt = iClipt; pData->iFrameclipb = iClipb; } else /* relative */ { pData->iFrameclipl = pData->iFrameclipl + iClipl; pData->iFrameclipr = pData->iFrameclipr + iClipr; pData->iFrameclipt = pData->iFrameclipt + iClipt; pData->iFrameclipb = pData->iFrameclipb + iClipb; } if (iChangeclipping == 2) /* also overall ? */ { pData->bFRAMclipping = MNG_TRUE; if (!iCliptype) /* absolute ? */ { pData->iFRAMclipl = iClipl; pData->iFRAMclipr = iClipr; pData->iFRAMclipt = iClipt; pData->iFRAMclipb = iClipb; } else /* relative */ { pData->iFRAMclipl = pData->iFRAMclipl + iClipl; pData->iFRAMclipr = pData->iFRAMclipr + iClipr; pData->iFRAMclipt = pData->iFRAMclipt + iClipt; pData->iFRAMclipb = pData->iFRAMclipb + iClipb; } } } else { /* reload defaults */ pData->bFrameclipping = pData->bFRAMclipping; pData->iFrameclipl = pData->iFRAMclipl; pData->iFrameclipr = pData->iFRAMclipr; pData->iFrameclipt = pData->iFRAMclipt; pData->iFrameclipb = pData->iFRAMclipb; } } if (!pData->bTimerset) /* timer still off ? */ { if ((pData->iFramemode == 4) || /* insert background layer after a new frame */ (!pData->iLayerseq)) /* and certainly before the very first layer */ iRetcode = load_bkgdlayer (pData); if (iRetcode) /* on error bail out */ return iRetcode; if ((pData->bDisplaying) && (pData->bRunning)) { pData->iFrameseq++; /* count the frame ! */ pData->bFramedone = MNG_TRUE; /* and indicate we've done one */ } }#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_NEXT_FRAME, MNG_LC_END)#endif return MNG_NOERROR;}/* ************************************************************************** */mng_retcode next_layer (mng_datap pData){ mng_imagep pImage; mng_retcode iRetcode = MNG_NOERROR;#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_NEXT_LAYER, MNG_LC_START)#endif if (!pData->iBreakpoint) /* no previous break here ? */ { /* interframe delay required ? */ if ((pData->eImagetype == mng_it_mng) && (pData->iLayerseq) && ((pData->iFramemode == 1) || (pData->iFramemode == 3))) iRetcode = interframe_delay (pData); else pData->iFramedelay = pData->iNextdelay; if (iRetcode) /* on error bail out */ return iRetcode; } if (!pData->bTimerset) /* timer still off ? */ { if (!pData->iLayerseq) /* restore background for the very first layer ? */ { /* wait till IDAT/JDAT for PNGs & JNGs !!! */ if ((pData->eImagetype == mng_it_png) || (pData->eImagetype == mng_it_jng)) pData->bRestorebkgd = MNG_TRUE; else { /* for MNG we do it right away */ iRetcode = load_bkgdlayer (pData); if (pData->bRunning) pData->iLayerseq++; /* and it counts as a layer then ! */ } } else if (pData->iFramemode == 3) /* restore background for each layer ? */ iRetcode = load_bkgdlayer (pData); if (iRetcode) /* on error bail out */ return iRetcode; if (pData->bHasDHDR) /* processing a delta-image ? */ pImage = (mng_imagep)pData->pDeltaImage; else pImage = (mng_imagep)pData->pCurrentobj; if (!pImage) /* not an active object ? */ pImage = (mng_imagep)pData->pObjzero; /* determine display rectangle */ pData->iDestl = MAX_COORD ((mng_int32)0, pImage->iPosx); pData->iDestt = MAX_COORD ((mng_int32)0, pImage->iPosy); /* is it a valid buffer ? */ if ((pImage->pImgbuf->iWidth) && (pImage->pImgbuf->iHeight)) { pData->iDestr = MIN_COORD ((mng_int32)pData->iWidth, pImage->iPosx + (mng_int32)pImage->pImgbuf->iWidth ); pData->iDestb = MIN_COORD ((mng_int32)pData->iHeight, pImage->iPosy + (mng_int32)pImage->pImgbuf->iHeight); } else /* it's a single image ! */ { pData->iDestr = MIN_COORD ((mng_int32)pData->iWidth, (mng_int32)pData->iDatawidth ); pData->iDestb = MIN_COORD ((mng_int32)pData->iHeight, (mng_int32)pData->iDataheight); } if (pData->bFrameclipping) /* frame clipping specified ? */ { pData->iDestl = MAX_COORD (pData->iDestl, pData->iFrameclipl); pData->iDestt = MAX_COORD (pData->iDestt, pData->iFrameclipt); pData->iDestr = MIN_COORD (pData->iDestr, pData->iFrameclipr); pData->iDestb = MIN_COORD (pData->iDestb, pData->iFrameclipb); } if (pImage->bClipped) /* is the image clipped itself ? */ { pData->iDestl = MAX_COORD (pData->iDestl, pImage->iClipl); pData->iDestt = MAX_COORD (pData->iDestt, pImage->iClipt); pData->iDestr = MIN_COORD (pData->iDestr, pImage->iClipr); pData->iDestb = MIN_COORD (pData->iDestb, pImage->iClipb); } /* determine source starting point */ pData->iSourcel = MAX_COORD ((mng_int32)0, pData->iDestl - pImage->iPosx); pData->iSourcet = MAX_COORD ((mng_int32)0, pData->iDestt - pImage->iPosy); if ((pImage->pImgbuf->iWidth) && (pImage->pImgbuf->iHeight)) { /* and maximum size */ pData->iSourcer = MIN_COORD ((mng_int32)pImage->pImgbuf->iWidth, pData->iSourcel + pData->iDestr - pData->iDestl); pData->iSourceb = MIN_COORD ((mng_int32)pImage->pImgbuf->iHeight, pData->iSourcet + pData->iDestb - pData->iDestt); } else /* it's a single image ! */ { pData->iSourcer = pData->iSourcel + pData->iDestr - pData->iDestl; pData->iSourceb = pData->iSourcet + pData->iDestb - pData->iDestt; } if (pData->bRunning) pData->iLayerseq++; /* count the layer ! */ }#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_NEXT_LAYER, MNG_LC_END)#endif return MNG_NOERROR;}/* ************************************************************************** */mng_retcode display_image (mng_datap pData, mng_imagep pImage, mng_bool bLayeradvanced){ mng_retcode iRetcode; #ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DISPLAY_IMAGE, MNG_LC_START)#endif /* actively running ? */ if ((pData->bRunning) && (!pData->bFreezing)) { if ( (!pData->iBreakpoint) && /* needs magnification ? */ ( (pImage->iMAGN_MethodX) || (pImage->iMAGN_MethodY) ) ) { iRetcode = magnify_imageobject (pData, pImage); if (iRetcode) /* on error bail out */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -