📄 libmng_display.c
字号:
pData->iDestl = 0; /* determine clipping region */
pData->iDestt = 0;
pData->iDestr = pData->iWidth;
pData->iDestb = pData->iHeight;
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);
}
/* anything to clear ? */
if ((pData->iDestr >= pData->iDestl) && (pData->iDestb >= pData->iDestt))
{
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;
pData->iSourcel = 0; /* source relative to destination */
pData->iSourcer = pData->iDestr - pData->iDestl;
pData->iSourcet = 0;
pData->iSourceb = pData->iDestb - pData->iDestt;
set_display_routine (pData); /* determine display routine */
/* default restore using preset BG color */
pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_bgcolor;
#ifndef MNG_SKIPCHUNK_bKGD
if (((pData->eImagetype == mng_it_png) || (pData->eImagetype == mng_it_jng)) &&
(pData->bUseBKGD))
{ /* prefer bKGD in PNG/JNG */
if (!pData->pCurrentobj)
pData->pCurrentobj = pData->pObjzero;
if (((mng_imagep)pData->pCurrentobj)->pImgbuf->bHasBKGD)
{
pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_bkgd;
bColorcorr = MNG_TRUE;
}
}
#endif
if (pData->fGetbkgdline) /* background-canvas-access callback set ? */
{
switch (pData->iBkgdstyle)
{
#ifndef MNG_SKIPCANVAS_RGB8
case MNG_CANVAS_RGB8 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_rgb8; break; }
#endif
#ifndef MNG_SKIPCANVAS_BGR8
case MNG_CANVAS_BGR8 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_bgr8; break; }
#endif
#ifndef MNG_SKIPCANVAS_BGRX8
case MNG_CANVAS_BGRX8 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_bgrx8; break; }
#endif
#ifndef MNG_SKIPCANVAS_BGR565
case MNG_CANVAS_BGR565 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_bgr565; break; }
#endif
#ifndef MNG_SKIPCANVAS_RGB565
case MNG_CANVAS_RGB565 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_rgb565; break; }
#endif
#ifndef MNG_NO_16BIT_SUPPORT
/* case MNG_CANVAS_RGB16 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_rgb16; break; } */
/* case MNG_CANVAS_BGR16 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_bgr16; break; } */
#endif
/* case MNG_CANVAS_INDEX8 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_index8; break; } */
/* case MNG_CANVAS_GRAY8 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_gray8; break; } */
#ifndef MNG_NO_16BIT_SUPPORT
/* case MNG_CANVAS_GRAY16 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_gray16; break; } */
#endif
/* case MNG_CANVAS_DX15 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_dx15; break; } */
/* case MNG_CANVAS_DX16 : { pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_dx16; break; } */
}
}
if (pData->bHasBACK)
{ /* background image ? */
if ((pData->iBACKmandatory & 0x02) && (pData->iBACKimageid))
{
pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_backcolor;
bColorcorr = MNG_TRUE;
}
else /* background color ? */
if (pData->iBACKmandatory & 0x01)
{
pData->fRestbkgdrow = (mng_fptr)mng_restore_bkgd_backcolor;
bColorcorr = MNG_TRUE;
}
}
pData->fCorrectrow = MNG_NULL; /* default no color-correction */
if (bColorcorr) /* do we have to do color-correction ? */
{
#ifdef MNG_NO_CMS
iRetcode = MNG_NOERROR;
#else
#if defined(MNG_FULL_CMS) /* determine color-management routine */
iRetcode = mng_init_full_cms (pData, MNG_TRUE, MNG_FALSE, MNG_FALSE);
#elif defined(MNG_GAMMA_ONLY)
iRetcode = mng_init_gamma_only (pData, MNG_TRUE, MNG_FALSE, MNG_FALSE);
#elif defined(MNG_APP_CMS)
iRetcode = mng_init_app_cms (pData, MNG_TRUE, MNG_FALSE, MNG_FALSE);
#endif
if (iRetcode) /* on error bail out */
return iRetcode;
#endif /* MNG_NO_CMS */
}
/* get a temporary row-buffer */
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_restbkgdrow)pData->fRestbkgdrow) (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 the temporary row-buffer */
MNG_FREE (pData, pData->pRGBArow, pData->iRowsize)
if (iRetcode) /* on error bail out */
return iRetcode;
#if defined(MNG_FULL_CMS) /* cleanup cms stuff */
if (bColorcorr) /* did we do color-correction ? */
{
iRetcode = mng_clear_cms (pData);
if (iRetcode) /* on error bail out */
return iRetcode;
}
#endif
#ifndef MNG_SKIPCHUNK_BACK
/* background image ? */
if ((pData->bHasBACK) && (pData->iBACKmandatory & 0x02) && (pData->iBACKimageid))
{
mng_imagep pImage;
/* let's find that object then */
pData->pRetrieveobj = mng_find_imageobject (pData, pData->iBACKimageid);
pImage = (mng_imagep)pData->pRetrieveobj;
/* exists, viewable and visible ? */
if ((pImage) && (pImage->bViewable) && (pImage->bVisible))
{ /* will it fall within the target region ? */
if ((pImage->iPosx < pData->iDestr) && (pImage->iPosy < pData->iDestb) &&
((pData->iBACKtile) ||
((pImage->iPosx + (mng_int32)pImage->pImgbuf->iWidth >= pData->iDestl) &&
(pImage->iPosy + (mng_int32)pImage->pImgbuf->iHeight >= pData->iDestt) )) &&
((!pImage->bClipped) ||
((pImage->iClipl <= pImage->iClipr) && (pImage->iClipt <= pImage->iClipb) &&
(pImage->iClipl < pData->iDestr) && (pImage->iClipr >= pData->iDestl) &&
(pImage->iClipt < pData->iDestb) && (pImage->iClipb >= pData->iDestt) )))
{ /* right; we've got ourselves something to do */
if (pImage->bClipped) /* clip output region with image's clipping region ? */
{
if (pImage->iClipl > pData->iDestl)
pData->iDestl = pImage->iClipl;
if (pImage->iClipr < pData->iDestr)
pData->iDestr = pImage->iClipr;
if (pImage->iClipt > pData->iDestt)
pData->iDestt = pImage->iClipt;
if (pImage->iClipb < pData->iDestb)
pData->iDestb = pImage->iClipb;
}
/* image offset does some extra clipping too ! */
if (pImage->iPosx > pData->iDestl)
pData->iDestl = pImage->iPosx;
if (pImage->iPosy > pData->iDestt)
pData->iDestt = pImage->iPosy;
if (!pData->iBACKtile) /* without tiling further clipping is needed */
{
if (pImage->iPosx + (mng_int32)pImage->pImgbuf->iWidth < pData->iDestr)
pData->iDestr = pImage->iPosx + (mng_int32)pImage->pImgbuf->iWidth;
if (pImage->iPosy + (mng_int32)pImage->pImgbuf->iHeight < pData->iDestb)
pData->iDestb = pImage->iPosy + (mng_int32)pImage->pImgbuf->iHeight;
}
pData->iSourcel = 0; /* source relative to destination */
pData->iSourcer = pData->iDestr - pData->iDestl;
pData->iSourcet = 0;
pData->iSourceb = pData->iDestb - pData->iDestt;
/* 16-bit background ? */
#ifdef MNG_NO_16BIT_SUPPORT
pData->bIsRGBA16 = MNG_FALSE;
#else
pData->bIsRGBA16 = (mng_bool)(pImage->pImgbuf->iBitdepth > 8);
#endif
/* let restore routine know the offsets !!! */
pData->iBackimgoffsx = pImage->iPosx;
pData->iBackimgoffsy = pImage->iPosy;
pData->iBackimgwidth = pImage->pImgbuf->iWidth;
pData->iBackimgheight = pImage->pImgbuf->iHeight;
pData->iRow = 0; /* start at the top again !! */
/* determine background object 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;
}
case 8 : {
#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_TRUE;
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -