📄 libmng_display.c
字号:
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; if (pData->bRunning) pData->iLayerseq++; /* and it counts as a layer then ! */ } /* actively running ? */ if ((pData->bRunning) && (!pData->bFreezing)) { 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 : { if (pImage->pImgbuf->iBitdepth > 8) pData->fRetrieverow = (mng_fptr)retrieve_g16; else pData->fRetrieverow = (mng_fptr)retrieve_g8; pData->bIsOpaque = (mng_bool)(!pImage->pImgbuf->bHasTRNS); break; } case 2 : { if (pImage->pImgbuf->iBitdepth > 8) pData->fRetrieverow = (mng_fptr)retrieve_rgb16; else pData->fRetrieverow = (mng_fptr)retrieve_rgb8; pData->bIsOpaque = (mng_bool)(!pImage->pImgbuf->bHasTRNS); break; } case 3 : { pData->fRetrieverow = (mng_fptr)retrieve_idx8; pData->bIsOpaque = (mng_bool)(!pImage->pImgbuf->bHasTRNS); break; } case 4 : { if (pImage->pImgbuf->iBitdepth > 8) pData->fRetrieverow = (mng_fptr)retrieve_ga16; else pData->fRetrieverow = (mng_fptr)retrieve_ga8; pData->bIsOpaque = MNG_FALSE; break; } case 6 : { if (pImage->pImgbuf->iBitdepth > 8) pData->fRetrieverow = (mng_fptr)retrieve_rgba16; else pData->fRetrieverow = (mng_fptr)retrieve_rgba8; pData->bIsOpaque = MNG_FALSE; break; } case 8 : { if (pImage->pImgbuf->iBitdepth > 8) pData->fRetrieverow = (mng_fptr)retrieve_g16; else pData->fRetrieverow = (mng_fptr)retrieve_g8; pData->bIsOpaque = MNG_TRUE; break; } case 10 : { if (pImage->pImgbuf->iBitdepth > 8) pData->fRetrieverow = (mng_fptr)retrieve_rgb16; else pData->fRetrieverow = (mng_fptr)retrieve_rgb8; pData->bIsOpaque = MNG_TRUE; break; } case 12 : { if (pImage->pImgbuf->iBitdepth > 8) pData->fRetrieverow = (mng_fptr)retrieve_ga16; else pData->fRetrieverow = (mng_fptr)retrieve_ga8; pData->bIsOpaque = MNG_FALSE; break; } case 14 : { if (pImage->pImgbuf->iBitdepth > 8) pData->fRetrieverow = (mng_fptr)retrieve_rgba16; else pData->fRetrieverow = (mng_fptr)retrieve_rgba8; pData->bIsOpaque = MNG_FALSE; break; } } pData->iPass = -1; /* these are the object's dimensions now */ pData->iRow = pData->iSourcet; pData->iRowinc = 1; pData->iCol = 0; pData->iColinc = 1; pData->iRowsamples = pImage->pImgbuf->iWidth; pData->iRowsize = pData->iRowsamples << 2; pData->bIsRGBA16 = MNG_FALSE; /* adjust for 16-bit object ? */ if (pImage->pImgbuf->iBitdepth > 8) { pData->bIsRGBA16 = MNG_TRUE; pData->iRowsize = pData->iRowsamples << 3; } pData->fCorrectrow = MNG_NULL; /* default no color-correction */#ifdef MNG_NO_CMS iRetcode = MNG_NOERROR;#else#if defined(MNG_FULL_CMS) /* determine color-management routine */ iRetcode = init_full_cms_object (pData);#elif defined(MNG_GAMMA_ONLY) iRetcode = init_gamma_only_object (pData);#elif defined(MNG_APP_CMS) iRetcode = init_app_cms_object (pData);#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->iSourcet; /* this is where we start */ while ((!iRetcode) && (iY < pData->iSourceb)) { /* get a row */ iRetcode = ((mng_retrieverow)pData->fRetrieverow) (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) /* adjust variables for next row */ iRetcode = 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_INCLUDE_LCMS) /* cleanup cms stuff */ iRetcode = mng_clear_cms (pData); if (iRetcode) /* on error bail out */ return iRetcode;#endif } } }#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DISPLAY_IMAGE, MNG_LC_END)#endif return MNG_NOERROR; /* whehehe, this is good ! */}/* ************************************************************************** */mng_retcode execute_delta_image (mng_datap pData, mng_imagep pTarget, mng_imagep pDelta){ mng_imagedatap pBuftarget = pTarget->pImgbuf; mng_imagedatap pBufdelta = pDelta->pImgbuf; mng_uint32 iY; mng_retcode iRetcode;#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_EXECUTE_DELTA_IMAGE, MNG_LC_START)#endif /* actively running ? */ if ((pData->bRunning) && (!pData->bFreezing)) { if (pBufdelta->bHasPLTE) /* palette in delta ? */ { mng_uint32 iX; /* new palette larger than old one ? */ if ((!pBuftarget->bHasPLTE) || (pBuftarget->iPLTEcount < pBufdelta->iPLTEcount)) pBuftarget->iPLTEcount = pBufdelta->iPLTEcount; /* it's definitely got a PLTE now */ pBuftarget->bHasPLTE = MNG_TRUE; for (iX = 0; iX < pBufdelta->iPLTEcount; iX++) { pBuftarget->aPLTEentries[iX].iRed = pBufdelta->aPLTEentries[iX].iRed; pBuftarget->aPLTEentries[iX].iGreen = pBufdelta->aPLTEentries[iX].iGreen; pBuftarget->aPLTEentries[iX].iBlue = pBufdelta->aPLTEentries[iX].iBlue; } } if (pBufdelta->bHasTRNS) /* cheap transparency in delta ? */ { switch (pData->iColortype) /* drop it into the target */ { case 0: { /* gray */ pBuftarget->iTRNSgray = pBufdelta->iTRNSgray; pBuftarget->iTRNSred = 0; pBuftarget->iTRNSgreen = 0; pBuftarget->iTRNSblue = 0; pBuftarget->iTRNScount = 0; break; } case 2: { /* rgb */ pBuftarget->iTRNSgray = 0; pBuftarget->iTRNSred = pBufdelta->iTRNSred; pBuftarget->iTRNSgreen = pBufdelta->iTRNSgreen; pBuftarget->iTRNSblue = pBufdelta->iTRNSblue; pBuftarget->iTRNScount = 0; break; } case 3: { /* indexed */ pBuftarget->iTRNSgray = 0; pBuftarget->iTRNSred = 0; pBuftarget->iTRNSgreen = 0; pBuftarget->iTRNSblue = 0; /* existing range smaller than new one ? */ if ((!pBuftarget->bHasTRNS) || (pBuftarget->iTRNScount < pBufdelta->iTRNScount)) pBuftarget->iTRNScount = pBufdelta->iTRNScount; MNG_COPY (pBuftarget->aTRNSentries, pBufdelta->aTRNSentries, pBufdelta->iTRNScount) break; } } pBuftarget->bHasTRNS = MNG_TRUE; /* tell it it's got a tRNS now */ } if (pBufdelta->bHasBKGD) /* bkgd in source ? */ { /* drop it onto the target */ pBuftarget->bHasBKGD = MNG_TRUE; pBuftarget->iBKGDindex = pBufdelta->iBKGDindex; pBuftarget->iBKGDgray = pBufdelta->iBKGDgray; pBuftarget->iBKGDred = pBufdelta->iBKGDred; pBuftarget->iBKGDgreen = pBufdelta->iBKGDgreen; pBuftarget->iBKGDblue = pBufdelta->iBKGDblue; } if (pBufdelta->bHasGAMA) /* gamma in source ? */ { pBuftarget->bHasGAMA = MNG_TRUE; /* drop it onto the target */ pBuftarget->iGamma = pBufdelta->iGamma; } if (pBufdelta->bHasCHRM) /* chroma in delta ? */ { /* drop it onto the target */ pBuftarget->bHasCHRM = MNG_TRUE; pBuftarget->iWhitepointx = pBufdelta->iWhitepointx; pBuftarget->iWhitepointy = pBufdelta->iWhitepointy; pBuftarget->iPrimaryredx = pBufdelta->iPrimaryredx; pBuftarget->iPrimaryredy = pBufdelta->iPrimaryredy; pBuftarget->iPrimarygreenx = pBufdelta->iPrimarygreenx; pBuftarget->iPrimarygreeny = pBufdelta->iPrimarygreeny; pBuftarget->iPrimarybluex = pBufdelta->iPrimarybluex;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -