📄 libmng_display.c
字号:
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;
}
#endif
}
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;
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_LOCAL 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);
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;
}
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 mng_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->bSearching)) && (!pData->bSkipping))
{
if ( (!pData->iBreakpoint) && /* needs magnification ? */
( (pImage->iMAGN_MethodX) || (pImage->iMAGN_MethodY) ) )
{
iRetcode = mng_magnify_imageobject (pData, pImage);
if (iRetcode) /* on error bail out */
return iRetcode;
}
}
pData->pRetrieveobj = pImage; /* so retrieve-row and color-correction can find it */
if (!bLayeradvanced) /* need to advance the layer ? */
{
mng_imagep pSave = pData->pCurrentobj;
pData->pCurrentobj = pImage;
next_layer (pData); /* advance to next layer */
pData->pCurrentobj = pSave;
}
/* need to restore the background ? */
if ((!pData->bTimerset) && (pData->bRestorebkgd))
{
mng_imagep pSave = pData->pCurrentobj;
pData->pCurrentobj = pImage;
pData->bRestorebkgd = MNG_FALSE;
iRetcode = load_bkgdlayer (pData);
pData->pCurrentobj = pSave;
if (iRetcode) /* on error bail out */
return iRetcode;
pData->iLayerseq++; /* and it counts as a layer then ! */
}
/* actively running ? */
if (((pData->bRunning) || (pData->bSearching)) && (!pData->bSkipping))
{
if (!pData->bTimerset) /* all systems still go ? */
{
pData->iBreakpoint = 0; /* let's make absolutely sure... */
/* anything to display ? */
if ((pData->iDestr >= pData->iDestl) && (pData->iDestb >= pData->iDestt))
{
mng_int32 iY;
set_display_routine (pData); /* determine display routine */
/* and image-buffer retrieval routine */
switch (pImage->pImgbuf->iColortype)
{
case 0 : {
#ifndef MNG_NO_16BIT_SUPPORT
if (pImage->pImgbuf->iBitdepth > 8)
pData->fRetrieverow = (mng_fptr)mng_retrieve_g16;
else
#endif
pData->fRetrieverow = (mng_fptr)mng_retrieve_g8;
pData->bIsOpaque = (mng_bool)(!pImage->pImgbuf->bHasTRNS);
break;
}
case 2 : {
#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_bool)(!pImage->pImgbuf->bHasTRNS);
break;
}
case 3 : { pData->fRetrieverow = (mng_fptr)mng_retrieve_idx8;
pData->bIsOpaque = (mng_bool)(!pImage->pImgbuf->bHasTRNS);
break;
}
case 4 : {
#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 6 : {
#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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -