📄 libmng_display.c
字号:
case 10 : {
#ifndef MNG_NO_16BIT_SUPPORT
if (pImage->pImgbuf->iBitdepth > 8)
pData->fRetrieverow = (mng_fptr)mng_retrieve_rgb16;
else
#endif
pData->fRetrieverow = (mng_fptr)mng_retrieve_rgb8;
pData->bIsOpaque = MNG_TRUE;
break;
}
case 12 : {
#ifndef MNG_NO_16BIT_SUPPORT
if (pImage->pImgbuf->iBitdepth > 8)
pData->fRetrieverow = (mng_fptr)mng_retrieve_ga16;
else
#endif
pData->fRetrieverow = (mng_fptr)mng_retrieve_ga8;
pData->bIsOpaque = MNG_FALSE;
break;
}
case 14 : {
#ifndef MNG_NO_16BIT_SUPPORT
if (pImage->pImgbuf->iBitdepth > 8)
pData->fRetrieverow = (mng_fptr)mng_retrieve_rgba16;
else
#endif
pData->fRetrieverow = (mng_fptr)mng_retrieve_rgba8;
pData->bIsOpaque = MNG_FALSE;
break;
}
}
#ifdef MNG_NO_CMS
iRetcode = MNG_NOERROR;
#else
#if defined(MNG_FULL_CMS) /* determine color-management routine */
iRetcode = mng_init_full_cms (pData, MNG_FALSE, MNG_FALSE, MNG_TRUE);
#elif defined(MNG_GAMMA_ONLY)
iRetcode = mng_init_gamma_only (pData, MNG_FALSE, MNG_FALSE, MNG_TRUE);
#elif defined(MNG_APP_CMS)
iRetcode = mng_init_app_cms (pData, MNG_FALSE, MNG_FALSE, MNG_TRUE);
#endif
if (iRetcode) /* on error bail out */
return iRetcode;
#endif /* MNG_NO_CMS */
/* get temporary row-buffers */
MNG_ALLOC (pData, pData->pPrevrow, pData->iRowsize)
MNG_ALLOC (pData, pData->pRGBArow, pData->iRowsize)
iY = pData->iDestt; /* this is where we start */
iRetcode = MNG_NOERROR; /* so far, so good */
while ((!iRetcode) && (iY < pData->iDestb))
{ /* restore a background row */
iRetcode = mng_restore_bkgd_backimage (pData);
/* color correction ? */
if ((!iRetcode) && (pData->fCorrectrow))
iRetcode = ((mng_correctrow)pData->fCorrectrow) (pData);
if (!iRetcode) /* so... display it */
iRetcode = ((mng_displayrow)pData->fDisplayrow) (pData);
if (!iRetcode)
iRetcode = mng_next_row (pData);
iY++; /* and next line */
}
/* drop temporary row-buffers */
MNG_FREE (pData, pData->pRGBArow, pData->iRowsize)
MNG_FREE (pData, pData->pPrevrow, pData->iRowsize)
if (iRetcode) /* on error bail out */
return iRetcode;
#if defined(MNG_FULL_CMS) /* cleanup cms stuff */
iRetcode = mng_clear_cms (pData);
if (iRetcode) /* on error bail out */
return iRetcode;
#endif
}
}
}
#endif
}
pData->iDestl = iDestl; /* restore values */
pData->iDestr = iDestr;
pData->iDestt = iDestt;
pData->iDestb = iDestb;
pData->iSourcel = iSourcel;
pData->iSourcer = iSourcer;
pData->iSourcet = iSourcet;
pData->iSourceb = iSourceb;
pData->iPass = iPass;
pData->iRow = iRow;
pData->iRowinc = iRowinc;
pData->iCol = iCol;
pData->iColinc = iColinc;
pData->iRowsamples = iRowsamples;
pData->iRowsize = iRowsize;
pData->pPrevrow = pPrevrow;
pData->pRGBArow = pRGBArow;
pData->bIsRGBA16 = bIsRGBA16;
pData->bIsOpaque = bIsOpaque;
pData->fCorrectrow = fCorrectrow;
pData->fDisplayrow = fDisplayrow;
pData->fRetrieverow = fRetrieverow;
pData->pCurrentobj = pCurrentobj;
pData->pRetrieveobj = pRetrieveobj;
}
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (pData, MNG_FN_LOAD_BKGDLAYER, MNG_LC_END)
#endif
return MNG_NOERROR;
}
/* ************************************************************************** */
MNG_LOCAL mng_retcode clear_canvas (mng_datap pData)
{
mng_int32 iY;
mng_retcode iRetcode;
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (pData, MNG_FN_CLEAR_CANVAS, MNG_LC_START)
#endif
pData->iDestl = 0; /* clipping region is full canvas! */
pData->iDestt = 0;
pData->iDestr = pData->iWidth;
pData->iDestb = pData->iHeight;
pData->iSourcel = 0; /* source is same as destination */
pData->iSourcer = pData->iWidth;
pData->iSourcet = 0;
pData->iSourceb = pData->iHeight;
pData->iPass = -1; /* these are the object's dimensions now */
pData->iRow = 0;
pData->iRowinc = 1;
pData->iCol = 0;
pData->iColinc = 1;
pData->iRowsamples = pData->iWidth;
pData->iRowsize = pData->iRowsamples << 2;
pData->bIsRGBA16 = MNG_FALSE; /* let's keep it simple ! */
pData->bIsOpaque = MNG_TRUE;
set_display_routine (pData); /* determine display routine */
/* get a temporary row-buffer */
/* it's transparent black by default!! */
MNG_ALLOC (pData, pData->pRGBArow, pData->iRowsize)
iY = pData->iDestt; /* this is where we start */
iRetcode = MNG_NOERROR; /* so far, so good */
while ((!iRetcode) && (iY < pData->iDestb))
{ /* clear a row then */
iRetcode = ((mng_displayrow)pData->fDisplayrow) (pData);
if (!iRetcode)
iRetcode = mng_next_row (pData); /* adjust variables for next row */
iY++; /* and next line */
}
/* drop the temporary row-buffer */
MNG_FREE (pData, pData->pRGBArow, pData->iRowsize)
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_LOCAL 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 ? */
#ifndef MNG_SKIPCHUNK_FRAM
if ((iOldmode == 2) || (iOldmode == 4))
{
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 = pData->iFRAMdelay;
if (iChangedelay == 2) /* also overall ? */
pData->iFRAMdelay = iDelay;
}
else
{ /* reload default */
pData->iNextdelay = pData->iFRAMdelay;
}
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -