⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 libmng_object_prc.c

📁 Linux下的基于X11的图形开发环境。
💻 C
📖 第 1 页 / 共 5 页
字号:
  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 + -