📄 libmng_display.c
字号:
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; pData->iDestl = 0; /* determine clipping region */ pData->iDestt = 0; pData->iDestr = pData->iWidth; pData->iDestb = pData->iHeight;#ifndef MNG_SKIPCHUNK_FRAM 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); }#endif /* 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; } */ } }#ifndef MNG_SKIPCHUNK_BACK 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; } }#endif 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -