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

📄 libmng_chunk_io.c

📁 Linux下的基于X11的图形开发环境。
💻 C
📖 第 1 页 / 共 5 页
字号:
#ifdef MNG_SUPPORT_DISPLAY  {    mng_retcode iRetcode = process_display_ihdr (pData);    if (iRetcode)                      /* on error bail out */      return iRetcode;  }#endif /* MNG_SUPPORT_DISPLAY */#ifdef MNG_STORE_CHUNKS  if (pData->bStorechunks)  {                                    /* initialize storage */    mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);    if (iRetcode)                      /* on error bail out */      return iRetcode;                                       /* fill the fields */    ((mng_ihdrp)*ppChunk)->iWidth       = mng_get_uint32 (pRawdata);    ((mng_ihdrp)*ppChunk)->iHeight      = mng_get_uint32 (pRawdata+4);    ((mng_ihdrp)*ppChunk)->iBitdepth    = pData->iBitdepth;    ((mng_ihdrp)*ppChunk)->iColortype   = pData->iColortype;    ((mng_ihdrp)*ppChunk)->iCompression = pData->iCompression;    ((mng_ihdrp)*ppChunk)->iFilter      = pData->iFilter;    ((mng_ihdrp)*ppChunk)->iInterlace   = pData->iInterlace;  }#endif /* MNG_STORE_CHUNKS */#ifdef MNG_SUPPORT_TRACE  MNG_TRACE (pData, MNG_FN_READ_IHDR, MNG_LC_END)#endif  return MNG_NOERROR;                  /* done */}/* ************************************************************************** */READ_CHUNK (read_plte){#if defined(MNG_SUPPORT_DISPLAY) || defined(MNG_STORE_CHUNKS)  mng_uint32  iX;  mng_uint8p  pRawdata2;#endif#ifdef MNG_SUPPORT_DISPLAY  mng_uint32  iRawlen2;#endif#ifdef MNG_SUPPORT_TRACE  MNG_TRACE (pData, MNG_FN_READ_PLTE, MNG_LC_START)#endif                                       /* sequence checks */  if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&      (!pData->bHasBASI) && (!pData->bHasDHDR)    )    MNG_ERROR (pData, MNG_SEQUENCEERROR)#ifdef MNG_INCLUDE_JNG  if ((pData->bHasIDAT) || (pData->bHasJHDR))#else  if (pData->bHasIDAT)#endif      MNG_ERROR (pData, MNG_SEQUENCEERROR)                                       /* multiple PLTE only inside BASI */  if ((pData->bHasPLTE) && (!pData->bHasBASI))    MNG_ERROR (pData, MNG_MULTIPLEERROR)                                       /* length must be multiple of 3 */  if (((iRawlen % 3) != 0) || (iRawlen > 768))    MNG_ERROR (pData, MNG_INVALIDLENGTH)  if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))  {                                    /* only allowed for indexed-color or                                          rgb(a)-color! */    if ((pData->iColortype != 2) && (pData->iColortype != 3) && (pData->iColortype != 6))      MNG_ERROR (pData, MNG_CHUNKNOTALLOWED)                                       /* empty only allowed if global present */    if ((iRawlen == 0) && (!pData->bHasglobalPLTE))        MNG_ERROR (pData, MNG_CANNOTBEEMPTY)  }  else  {    if (iRawlen == 0)                  /* cannot be empty as global! */      MNG_ERROR (pData, MNG_CANNOTBEEMPTY)  }  if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))    pData->bHasPLTE = MNG_TRUE;        /* got it! */  else    pData->bHasglobalPLTE = MNG_TRUE;  pData->iPLTEcount = iRawlen / 3;  #ifdef MNG_SUPPORT_DISPLAY  if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))  {    mng_imagep     pImage;    mng_imagedatap pBuf;    if (pData->bHasDHDR)               /* processing delta-image ? */    {                                  /* store in object 0 !!! */      pImage           = (mng_imagep)pData->pObjzero;      pBuf             = pImage->pImgbuf;      pBuf->bHasPLTE   = MNG_TRUE;     /* it's definitely got a PLTE now */      pBuf->iPLTEcount = iRawlen / 3;  /* this is the exact length */      pRawdata2        = pRawdata;     /* copy the entries */      for (iX = 0; iX < iRawlen / 3; iX++)      {        pBuf->aPLTEentries[iX].iRed   = *pRawdata2;        pBuf->aPLTEentries[iX].iGreen = *(pRawdata2+1);        pBuf->aPLTEentries[iX].iBlue  = *(pRawdata2+2);        pRawdata2 += 3;      }    }    else    {                                  /* get the current object */      pImage = (mng_imagep)pData->pCurrentobj;      if (!pImage)                     /* no object then dump it in obj 0 */        pImage = (mng_imagep)pData->pObjzero;      pBuf = pImage->pImgbuf;          /* address the object buffer */      pBuf->bHasPLTE = MNG_TRUE;       /* and tell it it's got a PLTE now */      if (!iRawlen)                    /* if empty, inherit from global */      {        pBuf->iPLTEcount = pData->iGlobalPLTEcount;        MNG_COPY (pBuf->aPLTEentries, pData->aGlobalPLTEentries,                  sizeof (pBuf->aPLTEentries))        if (pData->bHasglobalTRNS)     /* also copy global tRNS ? */        {                              /* indicate tRNS available */          pBuf->bHasTRNS = MNG_TRUE;          iRawlen2  = pData->iGlobalTRNSrawlen;          pRawdata2 = (mng_uint8p)(pData->aGlobalTRNSrawdata);                                       /* global length oke ? */          if ((iRawlen2 == 0) || (iRawlen2 > pBuf->iPLTEcount))            MNG_ERROR (pData, MNG_GLOBALLENGTHERR)                                       /* copy it */          pBuf->iTRNScount = iRawlen2;          MNG_COPY (pBuf->aTRNSentries, pRawdata2, iRawlen2)        }      }      else      {                                /* store fields for future reference */        pBuf->iPLTEcount = iRawlen / 3;        pRawdata2        = pRawdata;        for (iX = 0; iX < pBuf->iPLTEcount; iX++)        {          pBuf->aPLTEentries[iX].iRed   = *pRawdata2;          pBuf->aPLTEentries[iX].iGreen = *(pRawdata2+1);          pBuf->aPLTEentries[iX].iBlue  = *(pRawdata2+2);          pRawdata2 += 3;        }      }    }  }  else                                 /* store as global */  {    pData->iGlobalPLTEcount = iRawlen / 3;    pRawdata2               = pRawdata;    for (iX = 0; iX < pData->iGlobalPLTEcount; iX++)    {      pData->aGlobalPLTEentries[iX].iRed   = *pRawdata2;      pData->aGlobalPLTEentries[iX].iGreen = *(pRawdata2+1);      pData->aGlobalPLTEentries[iX].iBlue  = *(pRawdata2+2);      pRawdata2 += 3;    }    {                                  /* create an animation object */      mng_retcode iRetcode = create_ani_plte (pData, pData->iGlobalPLTEcount,                                              pData->aGlobalPLTEentries);      if (iRetcode)                    /* on error bail out */        return iRetcode;    }  }#endif /* MNG_SUPPORT_DISPLAY */#ifdef MNG_STORE_CHUNKS  if (pData->bStorechunks)  {                                    /* initialize storage */    mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);    if (iRetcode)                      /* on error bail out */      return iRetcode;                                       /* store the fields */    ((mng_pltep)*ppChunk)->bEmpty      = (mng_bool)(iRawlen == 0);    ((mng_pltep)*ppChunk)->iEntrycount = iRawlen / 3;    pRawdata2                          = pRawdata;    for (iX = 0; iX < ((mng_pltep)*ppChunk)->iEntrycount; iX++)    {      ((mng_pltep)*ppChunk)->aEntries[iX].iRed   = *pRawdata2;      ((mng_pltep)*ppChunk)->aEntries[iX].iGreen = *(pRawdata2+1);      ((mng_pltep)*ppChunk)->aEntries[iX].iBlue  = *(pRawdata2+2);      pRawdata2 += 3;    }  }#endif /* MNG_STORE_CHUNKS */#ifdef MNG_SUPPORT_TRACE  MNG_TRACE (pData, MNG_FN_READ_PLTE, MNG_LC_END)#endif  return MNG_NOERROR;                  /* done */}/* ************************************************************************** */READ_CHUNK (read_idat){#ifdef MNG_SUPPORT_TRACE  MNG_TRACE (pData, MNG_FN_READ_IDAT, MNG_LC_START)#endif#ifdef MNG_INCLUDE_JNG                 /* sequence checks */  if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))#else  if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR))#endif    MNG_ERROR (pData, MNG_SEQUENCEERROR)#ifdef MNG_INCLUDE_JNG  if ((pData->bHasJHDR) &&      (pData->iJHDRalphacompression != MNG_COMPRESSION_DEFLATE))    MNG_ERROR (pData, MNG_SEQUENCEERROR)  if (pData->bHasJSEP)    MNG_ERROR (pData, MNG_SEQUENCEERROR)#endif                                       /* not allowed for for deltatype NO_CHANGE */  if ((pData->bHasDHDR) && ((pData->iDeltatype == MNG_DELTATYPE_NOCHANGE)))    MNG_ERROR (pData, MNG_CHUNKNOTALLOWED)                                       /* can only be empty in BASI-block! */  if ((iRawlen == 0) && (!pData->bHasBASI))    MNG_ERROR (pData, MNG_INVALIDLENGTH)                                       /* indexed-color requires PLTE */  if ((pData->bHasIHDR) && (pData->iColortype == 3) && (!pData->bHasPLTE))    MNG_ERROR (pData, MNG_PLTEMISSING)  pData->bHasIDAT = MNG_TRUE;          /* got some IDAT now, don't we */#ifdef MNG_SUPPORT_DISPLAY  if (iRawlen)  {                                    /* display processing */    mng_retcode iRetcode = process_display_idat (pData, iRawlen, pRawdata);    if (iRetcode)                      /* on error bail out */      return iRetcode;  }#endif /* MNG_SUPPORT_DISPLAY */#ifdef MNG_STORE_CHUNKS  if (pData->bStorechunks)  {                                    /* initialize storage */    mng_retcode iRetcode = ((mng_chunk_headerp)pHeader)->fCreate (pData, pHeader, ppChunk);    if (iRetcode)                      /* on error bail out */      return iRetcode;                                       /* store the fields */    ((mng_idatp)*ppChunk)->bEmpty    = (mng_bool)(iRawlen == 0);    ((mng_idatp)*ppChunk)->iDatasize = iRawlen;    if (iRawlen != 0)                  /* is there any data ? */    {      MNG_ALLOC (pData, ((mng_idatp)*ppChunk)->pData, iRawlen)      MNG_COPY  (((mng_idatp)*ppChunk)->pData, pRawdata, iRawlen)    }  }#endif /* MNG_STORE_CHUNKS */#ifdef MNG_SUPPORT_TRACE  MNG_TRACE (pData, MNG_FN_READ_IDAT, MNG_LC_END)#endif  return MNG_NOERROR;                  /* done */}/* ************************************************************************** */READ_CHUNK (read_iend){#ifdef MNG_SUPPORT_TRACE  MNG_TRACE (pData, MNG_FN_READ_IEND, MNG_LC_START)#endif  if (iRawlen > 0)                     /* must not contain data! */    MNG_ERROR (pData, MNG_INVALIDLENGTH);#ifdef MNG_INCLUDE_JNG                 /* sequence checks */  if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))#else  if ((!pData->bHasIHDR) && (!pData->bHasBASI) && (!pData->bHasDHDR))#endif    MNG_ERROR (pData, MNG_SEQUENCEERROR)                                       /* IHDR-block requires IDAT */  if ((pData->bHasIHDR) && (!pData->bHasIDAT))    MNG_ERROR (pData, MNG_IDATMISSING)  pData->iImagelevel--;                /* one level up */#ifdef MNG_SUPPORT_DISPLAY  {                                    /* create an animation object */    mng_retcode iRetcode = create_ani_image (pData);    if (iRetcode)                      /* on error bail out */      return iRetcode;                                       /* display processing */    iRetcode = process_display_iend (pData);    if (iRetcode)                      /* on error bail out */      return iRetcode;  }#endif /* MNG_SUPPORT_DISPLAY */#ifdef MNG_SUPPORT_DISPLAY  if (!pData->bTimerset)               /* reset only if not broken !!! */  {#endif                                       /* IEND signals the end for most ... */    pData->bHasIHDR         = MNG_FALSE;    pData->bHasBASI         = MNG_FALSE;    pData->bHasDHDR         = MNG_FALSE;#ifdef MNG_INCLUDE_JNG

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -