📄 libmng_display.c
字号:
break;
}
case mng_st_slow :
{
iWaitfor = (mng_uint32)((3000 * iDelay) / iTicks);
break;
}
case mng_st_slowest :
{
iWaitfor = (mng_uint32)((8000 * iDelay) / iTicks);
break;
}
default :
{
iWaitfor = (mng_uint32)((1000 * iDelay) / iTicks);
}
}
}
return iWaitfor;
}
/* ************************************************************************** */
/* * * */
/* * Progressive display refresh - does the call to the refresh callback * */
/* * and sets the timer to allow the app to perform the actual refresh to * */
/* * the screen (eg. process its main message-loop) * */
/* * * */
/* ************************************************************************** */
mng_retcode mng_display_progressive_refresh (mng_datap pData,
mng_uint32 iInterval)
{
{ /* let the app refresh first ? */
if ((pData->bRunning) && (!pData->bSkipping) &&
(pData->iUpdatetop < pData->iUpdatebottom) && (pData->iUpdateleft < pData->iUpdateright))
{
if (!pData->fRefresh (((mng_handle)pData),
pData->iUpdateleft, pData->iUpdatetop,
pData->iUpdateright - pData->iUpdateleft,
pData->iUpdatebottom - pData->iUpdatetop))
MNG_ERROR (pData, MNG_APPMISCERROR)
pData->iUpdateleft = 0; /* reset update-region */
pData->iUpdateright = 0;
pData->iUpdatetop = 0;
pData->iUpdatebottom = 0; /* reset refreshneeded indicator */
pData->bNeedrefresh = MNG_FALSE;
/* interval requested ? */
if ((!pData->bFreezing) && (iInterval))
{ /* setup the timer */
mng_retcode iRetcode = set_delay (pData, iInterval);
if (iRetcode) /* on error bail out */
return iRetcode;
}
}
}
return MNG_NOERROR;
}
/* ************************************************************************** */
/* * * */
/* * Generic display routines * */
/* * * */
/* ************************************************************************** */
MNG_LOCAL mng_retcode interframe_delay (mng_datap pData)
{
mng_uint32 iWaitfor = 0;
mng_uint32 iInterval;
mng_uint32 iRuninterval;
mng_retcode iRetcode;
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (pData, MNG_FN_INTERFRAME_DELAY, MNG_LC_START)
#endif
{
if (pData->iFramedelay > 0) /* real delay ? */
{ /* let the app refresh first ? */
if ((pData->bRunning) && (!pData->bSkipping) &&
(pData->iUpdatetop < pData->iUpdatebottom) && (pData->iUpdateleft < pData->iUpdateright))
if (!pData->fRefresh (((mng_handle)pData),
pData->iUpdateleft, pData->iUpdatetop,
pData->iUpdateright - pData->iUpdateleft,
pData->iUpdatebottom - pData->iUpdatetop))
MNG_ERROR (pData, MNG_APPMISCERROR)
pData->iUpdateleft = 0; /* reset update-region */
pData->iUpdateright = 0;
pData->iUpdatetop = 0;
pData->iUpdatebottom = 0; /* reset refreshneeded indicator */
pData->bNeedrefresh = MNG_FALSE;
if (pData->bOnlyfirstframe) /* only processing first frame after TERM ? */
{
pData->iFramesafterTERM++;
/* did we do a frame yet ? */
if (pData->iFramesafterTERM > 1)
{ /* then that's it; just stop right here ! */
pData->pCurraniobj = MNG_NULL;
pData->bRunning = MNG_FALSE;
return MNG_NOERROR;
}
}
if (pData->fGettickcount)
{ /* get current tickcount */
pData->iRuntime = pData->fGettickcount ((mng_handle)pData);
/* calculate interval since last sync-point */
if (pData->iRuntime < pData->iSynctime)
iRuninterval = pData->iRuntime + ~pData->iSynctime + 1;
else
iRuninterval = pData->iRuntime - pData->iSynctime;
/* calculate actual run-time */
if (pData->iRuntime < pData->iStarttime)
pData->iRuntime = pData->iRuntime + ~pData->iStarttime + 1;
else
pData->iRuntime = pData->iRuntime - pData->iStarttime;
}
else
{
iRuninterval = 0;
}
iWaitfor = calculate_delay (pData, pData->iFramedelay);
if (iWaitfor > iRuninterval) /* delay necessary ? */
iInterval = iWaitfor - iRuninterval;
else
iInterval = 1; /* force app to process messageloop */
/* set the timer ? */
if (((pData->bRunning) || (pData->bSearching) || (pData->bReading)) &&
(!pData->bSkipping))
{
iRetcode = set_delay (pData, iInterval);
if (iRetcode) /* on error bail out */
return iRetcode;
}
}
if (!pData->bSkipping) /* increase frametime in advance */
pData->iFrametime = pData->iFrametime + iWaitfor;
/* setup for next delay */
pData->iFramedelay = pData->iNextdelay;
}
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (pData, MNG_FN_INTERFRAME_DELAY, MNG_LC_END)
#endif
return MNG_NOERROR;
}
/* ************************************************************************** */
MNG_LOCAL void set_display_routine (mng_datap pData)
{ /* actively running ? */
if (((pData->bRunning) || (pData->bSearching)) && (!pData->bSkipping))
{
switch (pData->iCanvasstyle) /* determine display routine */
{
#ifndef MNG_SKIPCANVAS_RGB8
case MNG_CANVAS_RGB8 : { pData->fDisplayrow = (mng_fptr)mng_display_rgb8; break; }
#endif
#ifndef MNG_SKIPCANVAS_RGBA8
case MNG_CANVAS_RGBA8 : { pData->fDisplayrow = (mng_fptr)mng_display_rgba8; break; }
#endif
#ifndef MNG_SKIPCANVAS_RGBA8_PM
case MNG_CANVAS_RGBA8_PM: { pData->fDisplayrow = (mng_fptr)mng_display_rgba8_pm; break; }
#endif
#ifndef MNG_SKIPCANVAS_ARGB8
case MNG_CANVAS_ARGB8 : { pData->fDisplayrow = (mng_fptr)mng_display_argb8; break; }
#endif
#ifndef MNG_SKIPCANVAS_ARGB8_PM
case MNG_CANVAS_ARGB8_PM: { pData->fDisplayrow = (mng_fptr)mng_display_argb8_pm; break; }
#endif
#ifndef MNG_SKIPCANVAS_RGB8_A8
case MNG_CANVAS_RGB8_A8 : { pData->fDisplayrow = (mng_fptr)mng_display_rgb8_a8; break; }
#endif
#ifndef MNG_SKIPCANVAS_BGR8
case MNG_CANVAS_BGR8 : { pData->fDisplayrow = (mng_fptr)mng_display_bgr8; break; }
#endif
#ifndef MNG_SKIPCANVAS_BGRX8
case MNG_CANVAS_BGRX8 : { pData->fDisplayrow = (mng_fptr)mng_display_bgrx8; break; }
#endif
#ifndef MNG_SKIPCANVAS_BGRA8
case MNG_CANVAS_BGRA8 : { pData->fDisplayrow = (mng_fptr)mng_display_bgra8; break; }
#endif
#ifndef MNG_SKIPCANVAS_BGRA8_PM
case MNG_CANVAS_BGRA8_PM: { pData->fDisplayrow = (mng_fptr)mng_display_bgra8_pm; break; }
#endif
#ifndef MNG_SKIPCANVAS_ABGR8
case MNG_CANVAS_ABGR8 : { pData->fDisplayrow = (mng_fptr)mng_display_abgr8; break; }
#endif
#ifndef MNG_SKIPCANVAS_ABGR8_PM
case MNG_CANVAS_ABGR8_PM: { pData->fDisplayrow = (mng_fptr)mng_display_abgr8_pm; break; }
#endif
#ifndef MNG_SKIPCANVAS_RGB565
case MNG_CANVAS_RGB565 : { pData->fDisplayrow = (mng_fptr)mng_display_rgb565; break; }
#endif
#ifndef MNG_SKIPCANVAS_RGBA565
case MNG_CANVAS_RGBA565 : { pData->fDisplayrow = (mng_fptr)mng_display_rgba565; break; }
#endif
#ifndef MNG_SKIPCANVAS_BGR565
case MNG_CANVAS_BGR565 : { pData->fDisplayrow = (mng_fptr)mng_display_bgr565; break; }
#endif
#ifndef MNG_SKIPCANVAS_BGRA565
case MNG_CANVAS_BGRA565 : { pData->fDisplayrow = (mng_fptr)mng_display_bgra565; break; }
#endif
#ifndef MNG_NO_16BIT_SUPPORT
/* case MNG_CANVAS_RGB16 : { pData->fDisplayrow = (mng_fptr)mng_display_rgb16; break; } */
/* case MNG_CANVAS_RGBA16 : { pData->fDisplayrow = (mng_fptr)mng_display_rgba16; break; } */
/* case MNG_CANVAS_ARGB16 : { pData->fDisplayrow = (mng_fptr)mng_display_argb16; break; } */
/* case MNG_CANVAS_BGR16 : { pData->fDisplayrow = (mng_fptr)mng_display_bgr16; break; } */
/* case MNG_CANVAS_BGRA16 : { pData->fDisplayrow = (mng_fptr)mng_display_bgra16; break; } */
/* case MNG_CANVAS_ABGR16 : { pData->fDisplayrow = (mng_fptr)mng_display_abgr16; break; } */
#endif
/* case MNG_CANVAS_INDEX8 : { pData->fDisplayrow = (mng_fptr)mng_display_index8; break; } */
/* case MNG_CANVAS_INDEXA8 : { pData->fDisplayrow = (mng_fptr)mng_display_indexa8; break; } */
/* case MNG_CANVAS_AINDEX8 : { pData->fDisplayrow = (mng_fptr)mng_display_aindex8; break; } */
/* case MNG_CANVAS_GRAY8 : { pData->fDisplayrow = (mng_fptr)mng_display_gray8; break; } */
/* case MNG_CANVAS_AGRAY8 : { pData->fDisplayrow = (mng_fptr)mng_display_agray8; break; } */
/* case MNG_CANVAS_GRAYA8 : { pData->fDisplayrow = (mng_fptr)mng_display_graya8; break; } */
#ifndef MNG_NO_16BIT_SUPPORT
/* case MNG_CANVAS_GRAY16 : { pData->fDisplayrow = (mng_fptr)mng_display_gray16; break; } */
/* case MNG_CANVAS_GRAYA16 : { pData->fDisplayrow = (mng_fptr)mng_display_graya16; break; } */
/* case MNG_CANVAS_AGRAY16 : { pData->fDisplayrow = (mng_fptr)mng_display_agray16; break; } */
#endif
/* case MNG_CANVAS_DX15 : { pData->fDisplayrow = (mng_fptr)mng_display_dx15; break; } */
/* case MNG_CANVAS_DX16 : { pData->fDisplayrow = (mng_fptr)mng_display_dx16; break; } */
}
}
return;
}
/* ************************************************************************** */
MNG_LOCAL mng_retcode load_bkgdlayer (mng_datap pData)
{
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (pData, MNG_FN_LOAD_BKGDLAYER, MNG_LC_START)
#endif
/* actively running ? */
if (((pData->bRunning) || (pData->bSearching)) && (!pData->bSkipping))
{
mng_int32 iY;
mng_retcode iRetcode;
mng_bool bColorcorr = MNG_FALSE;
/* save values */
mng_int32 iDestl = pData->iDestl;
mng_int32 iDestr = pData->iDestr;
mng_int32 iDestt = pData->iDestt;
mng_int32 iDestb = pData->iDestb;
mng_int32 iSourcel = pData->iSourcel;
mng_int32 iSourcer = pData->iSourcer;
mng_int32 iSourcet = pData->iSourcet;
mng_int32 iSourceb = pData->iSourceb;
mng_int8 iPass = pData->iPass;
mng_int32 iRow = pData->iRow;
mng_int32 iRowinc = pData->iRowinc;
mng_int32 iCol = pData->iCol;
mng_int32 iColinc = pData->iColinc;
mng_int32 iRowsamples = pData->iRowsamples;
mng_int32 iRowsize = pData->iRowsize;
mng_uint8p pPrevrow = pData->pPrevrow;
mng_uint8p pRGBArow = pData->pRGBArow;
mng_bool bIsRGBA16 = pData->bIsRGBA16;
mng_bool bIsOpaque = pData->bIsOpaque;
mng_fptr fCorrectrow = pData->fCorrectrow;
mng_fptr fDisplayrow = pData->fDisplayrow;
mng_fptr fRetrieverow = pData->fRetrieverow;
mng_objectp pCurrentobj = pData->pCurrentobj;
mng_objectp pRetrieveobj = pData->pRetrieveobj;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -