📄 libmng_object_prc.c
字号:
mng_uint32 iNewW = pBuf->iWidth; mng_uint32 iNewH = pBuf->iHeight; mng_magnify_x fMagnifyX = MNG_NULL; mng_magnify_y fMagnifyY = MNG_NULL;#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_MAGNIFY_IMGOBJECT, MNG_LC_START)#endif if (pBuf->iColortype == 3) /* indexed color ? */ { /* concrete buffer ? */ if ((pBuf->bConcrete) && (pImage->iId)) MNG_ERROR (pData, MNG_INVALIDCOLORTYPE) if (pBuf->iTRNScount) /* with transparency ? */ iRetcode = promote_imageobject (pData, pImage, 8, 6, 0); else iRetcode = promote_imageobject (pData, pImage, 8, 2, 0); if (iRetcode) /* on error bail out */ return iRetcode; } if (pImage->iMAGN_MethodX) /* determine new width */ { if (pImage->iMAGN_MethodX == 1) { iNewW = pImage->iMAGN_ML; if (pBuf->iWidth > 1) iNewW = iNewW + pImage->iMAGN_MR; if (pBuf->iWidth > 2) iNewW = iNewW + (pBuf->iWidth - 2) * (pImage->iMAGN_MX); } else { iNewW = pBuf->iWidth + pImage->iMAGN_ML - 1; if (pBuf->iWidth > 2) iNewW = iNewW + pImage->iMAGN_MR - 1; if (pBuf->iWidth > 3) iNewW = iNewW + (pBuf->iWidth - 3) * (pImage->iMAGN_MX - 1); } } if (pImage->iMAGN_MethodY) /* determine new height */ { if (pImage->iMAGN_MethodY == 1) { iNewH = pImage->iMAGN_MT; if (pBuf->iHeight > 1) iNewH = iNewH + pImage->iMAGN_ML; if (pBuf->iHeight > 2) iNewH = iNewH + (pBuf->iHeight - 2) * (pImage->iMAGN_MY); } else { iNewH = pBuf->iHeight + pImage->iMAGN_MT - 1; if (pBuf->iHeight > 2) iNewH = iNewH + pImage->iMAGN_MB - 1; if (pBuf->iHeight > 3) iNewH = iNewH + (pBuf->iHeight - 3) * (pImage->iMAGN_MY - 1); } } /* get new buffer */ iNewrowsize = iNewW * pBuf->iSamplesize; iNewsize = iNewH * iNewrowsize; MNG_ALLOC (pData, pNewdata, iNewsize); switch (pBuf->iColortype) /* determine magnification routines */ { case 0 : ; case 8 : { if (pBuf->iBitdepth <= 8) { switch (pImage->iMAGN_MethodX) { case 1 : { fMagnifyX = magnify_g8_x1; break; } case 2 : { fMagnifyX = magnify_g8_x2; break; } case 3 : { fMagnifyX = magnify_g8_x3; break; } case 4 : { fMagnifyX = magnify_g8_x2; break; } case 5 : { fMagnifyX = magnify_g8_x3; break; } } switch (pImage->iMAGN_MethodY) { case 1 : { fMagnifyY = magnify_g8_y1; break; } case 2 : { fMagnifyY = magnify_g8_y2; break; } case 3 : { fMagnifyY = magnify_g8_y3; break; } case 4 : { fMagnifyY = magnify_g8_y2; break; } case 5 : { fMagnifyY = magnify_g8_y3; break; } } } else { /* TODO: magnify 16-bit */ } break; } case 2 : ; case 10 : { if (pBuf->iBitdepth <= 8) { switch (pImage->iMAGN_MethodX) { case 1 : { fMagnifyX = magnify_rgb8_x1; break; } case 2 : { fMagnifyX = magnify_rgb8_x2; break; } case 3 : { fMagnifyX = magnify_rgb8_x3; break; } case 4 : { fMagnifyX = magnify_rgb8_x2; break; } case 5 : { fMagnifyX = magnify_rgb8_x3; break; } } switch (pImage->iMAGN_MethodY) { case 1 : { fMagnifyY = magnify_rgb8_y1; break; } case 2 : { fMagnifyY = magnify_rgb8_y2; break; } case 3 : { fMagnifyY = magnify_rgb8_y3; break; } case 4 : { fMagnifyY = magnify_rgb8_y2; break; } case 5 : { fMagnifyY = magnify_rgb8_y3; break; } } } else { /* TODO: magnify 16-bit */ } break; } case 4 : ; case 12 : { if (pBuf->iBitdepth <= 8) { switch (pImage->iMAGN_MethodX) { case 1 : { fMagnifyX = magnify_ga8_x1; break; } case 2 : { fMagnifyX = magnify_ga8_x2; break; } case 3 : { fMagnifyX = magnify_ga8_x3; break; } case 4 : { fMagnifyX = magnify_ga8_x4; break; } case 5 : { fMagnifyX = magnify_ga8_x5; break; } } switch (pImage->iMAGN_MethodY) { case 1 : { fMagnifyY = magnify_ga8_y1; break; } case 2 : { fMagnifyY = magnify_ga8_y2; break; } case 3 : { fMagnifyY = magnify_ga8_y3; break; } case 4 : { fMagnifyY = magnify_ga8_y4; break; } case 5 : { fMagnifyY = magnify_ga8_y5; break; } } } else { /* TODO: magnify 16-bit */ } break; } case 6 : ; case 14 : { if (pBuf->iBitdepth <= 8) { switch (pImage->iMAGN_MethodX) { case 1 : { fMagnifyX = magnify_rgba8_x1; break; } case 2 : { fMagnifyX = magnify_rgba8_x2; break; } case 3 : { fMagnifyX = magnify_rgba8_x3; break; } case 4 : { fMagnifyX = magnify_rgba8_x4; break; } case 5 : { fMagnifyX = magnify_rgba8_x5; break; } } switch (pImage->iMAGN_MethodY) { case 1 : { fMagnifyY = magnify_rgba8_y1; break; } case 2 : { fMagnifyY = magnify_rgba8_y2; break; } case 3 : { fMagnifyY = magnify_rgba8_y3; break; } case 4 : { fMagnifyY = magnify_rgba8_y4; break; } case 5 : { fMagnifyY = magnify_rgba8_y5; break; } } } else { /* TODO: magnify 16-bit */ } break; } } pSrcline1 = pBuf->pImgdata; /* initialize row-loop variables */ pDstline = pNewdata; /* allocate temporary row */ MNG_ALLOC (pData, pTempline, iNewrowsize) for (iY = 0; iY < pBuf->iHeight; iY++) { pSrcline2 = pSrcline1 + pBuf->iRowsize; if (fMagnifyX) /* magnifying in X-direction ? */ { iRetcode = fMagnifyX (pData, pImage->iMAGN_MX, pImage->iMAGN_ML, pImage->iMAGN_MR, pBuf->iWidth, pSrcline1, pDstline); if (iRetcode) /* on error bail out */ { MNG_FREEX (pData, pTempline, iNewrowsize) MNG_FREEX (pData, pNewdata, iNewsize) return iRetcode; } } else { MNG_COPY (pDstline, pSrcline1, iNewrowsize) } pDstline += iNewrowsize; /* magnifying in Y-direction ? */ if ((fMagnifyY) && ((iY < pBuf->iHeight - 1) || (pBuf->iHeight == 1) || (pImage->iMAGN_MethodY == 1))) { if (iY == 0) /* first interval ? */ { if (pBuf->iHeight == 1) /* single row ? */ pSrcline2 = MNG_NULL; iM = (mng_int32)pImage->iMAGN_MT; } else /* last interval ? */ if (((pImage->iMAGN_MethodY == 1) && (iY == (pBuf->iHeight - 1))) || ((pImage->iMAGN_MethodY != 1) && (iY == (pBuf->iHeight - 2))) ) iM = (mng_int32)pImage->iMAGN_MB; else /* middle interval */ iM = (mng_int32)pImage->iMAGN_MY; for (iS = 1; iS < iM; iS++) { iRetcode = fMagnifyY (pData, iS, iM, pBuf->iWidth, pSrcline1, pSrcline2, pTempline); if (iRetcode) /* on error bail out */ { MNG_FREEX (pData, pTempline, iNewrowsize) MNG_FREEX (pData, pNewdata, iNewsize) return iRetcode; } if (fMagnifyX) /* magnifying in X-direction ? */ { iRetcode = fMagnifyX (pData, pImage->iMAGN_MX, pImage->iMAGN_ML, pImage->iMAGN_MR, pBuf->iWidth, pTempline, pDstline); if (iRetcode) /* on error bail out */ { MNG_FREEX (pData, pTempline, iNewrowsize) MNG_FREEX (pData, pNewdata, iNewsize) return iRetcode; } } else { MNG_COPY (pDstline, pTempline, iNewrowsize) } pDstline += iNewrowsize; } } pSrcline1 += pBuf->iRowsize; } /* drop temporary row */ MNG_FREEX (pData, pTempline, iNewrowsize) /* drop old pixel-data */ MNG_FREEX (pData, pBuf->pImgdata, pBuf->iImgdatasize) pBuf->pImgdata = pNewdata; /* save new buffer dimensions */ pBuf->iRowsize = iNewrowsize; pBuf->iImgdatasize = iNewsize; pBuf->iWidth = iNewW; pBuf->iHeight = iNewH; if (pImage->iId) /* real object ? */ { pImage->iMAGN_MethodX = 0; /* it's done; don't do it again !!! */ pImage->iMAGN_MethodY = 0; pImage->iMAGN_MX = 0; pImage->iMAGN_MY = 0; pImage->iMAGN_ML = 0; pImage->iMAGN_MR = 0; pImage->iMAGN_MT = 0; pImage->iMAGN_MB = 0; }#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_MAGNIFY_IMGOBJECT, MNG_LC_END)#endif return MNG_NOERROR;}/* ************************************************************************** *//* * * *//* * Animation-object routines * *//* * * *//* * these handle the animation objects used to re-run parts of a MNG. * *//* * eg. during LOOP or TERM processing * *//* * * *//* ************************************************************************** */void add_ani_object (mng_datap pData, mng_object_headerp pObject){ mng_object_headerp pLast = (mng_object_headerp)pData->pLastaniobj; if (pLast) /* link it as last in the chain */ { pObject->pPrev = pLast; pLast->pNext = pObject; } else { pObject->pPrev = MNG_NULL; /* be on the safe side */ pData->pFirstaniobj = pObject; } pObject->pNext = MNG_NULL; /* be on the safe side */ pData->pLastaniobj = pObject; /* keep track for jumping */ pObject->iFramenr = pData->iFrameseq; pObject->iLayernr = pData->iLayerseq; pObject->iPlaytime = pData->iFrametime; /* save restart object ? */ if ((pData->bDisplaying) && (!pData->bRunning) && (!pData->pCurraniobj)) pData->pCurraniobj = pObject; return;}/* ************************************************************************** *//* ************************************************************************** */mng_retcode create_ani_image (mng_datap pData){ mng_ani_imagep pImage; mng_imagep pCurrent; mng_retcode iRetcode;#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_CREATE_ANI_IMAGE, MNG_LC_START)#endif if (pData->bCacheplayback) /* caching playback info ? */ { if (pData->bHasDHDR) /* processing delta-image ? */ pCurrent = (mng_imagep)pData->pObjzero;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -