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

📄 libmng_chunk_io.c

📁 Linux下的基于X11的图形开发环境。
💻 C
📖 第 1 页 / 共 5 页
字号:
    pData->bHasJHDR         = MNG_FALSE;    pData->bHasJSEP         = MNG_FALSE;    pData->bHasJDAA         = MNG_FALSE;    pData->bHasJDAT         = MNG_FALSE;#endif    pData->bHasPLTE         = MNG_FALSE;    pData->bHasTRNS         = MNG_FALSE;    pData->bHasGAMA         = MNG_FALSE;    pData->bHasCHRM         = MNG_FALSE;    pData->bHasSRGB         = MNG_FALSE;    pData->bHasICCP         = MNG_FALSE;    pData->bHasBKGD         = MNG_FALSE;    pData->bHasIDAT         = MNG_FALSE;#ifdef MNG_SUPPORT_DISPLAY  }#endif  #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;  }#endif /* MNG_STORE_CHUNKS */#ifdef MNG_SUPPORT_TRACE  MNG_TRACE (pData, MNG_FN_READ_IEND, MNG_LC_END)#endif  return MNG_NOERROR;                  /* done */}/* ************************************************************************** */READ_CHUNK (read_trns){#ifdef MNG_SUPPORT_TRACE  MNG_TRACE (pData, MNG_FN_READ_TRNS, 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 tRNS only inside BASI */  if ((pData->bHasTRNS) && (!pData->bHasBASI))    MNG_ERROR (pData, MNG_MULTIPLEERROR)  if (iRawlen > 256)                   /* it just can't be bigger than that! */    MNG_ERROR (pData, MNG_INVALIDLENGTH)  if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))  {                                    /* not allowed with full alpha-channel */    if ((pData->iColortype == 4) || (pData->iColortype == 6))      MNG_ERROR (pData, MNG_CHUNKNOTALLOWED)    if (iRawlen != 0)                  /* filled ? */    {                                  /* length checks */      if ((pData->iColortype == 0) && (iRawlen != 2))        MNG_ERROR (pData, MNG_INVALIDLENGTH)      if ((pData->iColortype == 2) && (iRawlen != 6))        MNG_ERROR (pData, MNG_INVALIDLENGTH)#ifdef MNG_SUPPORT_DISPLAY      if (pData->iColortype == 3)      {        mng_imagep     pImage = (mng_imagep)pData->pCurrentobj;        mng_imagedatap pBuf;        if (!pImage)                   /* no object then check obj 0 */          pImage = (mng_imagep)pData->pObjzero;        pBuf = pImage->pImgbuf;        /* address object buffer */        if ((iRawlen == 0) || (iRawlen > pBuf->iPLTEcount))          MNG_ERROR (pData, MNG_INVALIDLENGTH)      }#endif    }    else                               /* if empty there must be global stuff! */    {      if (!pData->bHasglobalTRNS)        MNG_ERROR (pData, MNG_CANNOTBEEMPTY)    }  }  if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))    pData->bHasTRNS = MNG_TRUE;        /* indicate tRNS available */  else    pData->bHasglobalTRNS = MNG_TRUE;#ifdef MNG_SUPPORT_DISPLAY  if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))  {    mng_imagep     pImage;    mng_imagedatap pBuf;    mng_uint8p     pRawdata2;    mng_uint32     iRawlen2;    if (pData->bHasDHDR)               /* processing delta-image ? */    {                                  /* store in object 0 !!! */      pImage = (mng_imagep)pData->pObjzero;      pBuf   = pImage->pImgbuf;        /* address object buffer */      switch (pData->iColortype)       /* store fields for future reference */      {        case 0: {                      /* gray */                  pBuf->iTRNSgray  = mng_get_uint16 (pRawdata);                  pBuf->iTRNSred   = 0;                  pBuf->iTRNSgreen = 0;                  pBuf->iTRNSblue  = 0;                  pBuf->iTRNScount = 0;                  break;                }        case 2: {                      /* rgb */                  pBuf->iTRNSgray  = 0;                  pBuf->iTRNSred   = mng_get_uint16 (pRawdata);                  pBuf->iTRNSgreen = mng_get_uint16 (pRawdata+2);                  pBuf->iTRNSblue  = mng_get_uint16 (pRawdata+4);                  pBuf->iTRNScount = 0;                  break;                }        case 3: {                      /* indexed */                  pBuf->iTRNSgray  = 0;                  pBuf->iTRNSred   = 0;                  pBuf->iTRNSgreen = 0;                  pBuf->iTRNSblue  = 0;                  pBuf->iTRNScount = iRawlen;                  MNG_COPY (pBuf->aTRNSentries, pRawdata, iRawlen)                  break;                }      }      pBuf->bHasTRNS = MNG_TRUE;       /* tell it it's got a tRNS now */    }    else    {                                  /* address 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 object buffer */      pBuf->bHasTRNS = MNG_TRUE;       /* and tell it it's got a tRNS now */      if (iRawlen == 0)                /* if empty, inherit from global */      {        iRawlen2  = pData->iGlobalTRNSrawlen;        pRawdata2 = (mng_ptr)(pData->aGlobalTRNSrawdata);                                         /* global length oke ? */        if ((pData->iColortype == 0) && (iRawlen2 != 2))          MNG_ERROR (pData, MNG_GLOBALLENGTHERR)        if ((pData->iColortype == 2) && (iRawlen2 != 6))          MNG_ERROR (pData, MNG_GLOBALLENGTHERR)        if ((pData->iColortype == 3) && ((iRawlen2 == 0) || (iRawlen2 > pBuf->iPLTEcount)))          MNG_ERROR (pData, MNG_GLOBALLENGTHERR)      }      else      {        iRawlen2  = iRawlen;        pRawdata2 = pRawdata;      }      switch (pData->iColortype)        /* store fields for future reference */      {        case 0: {                      /* gray */                  pBuf->iTRNSgray  = mng_get_uint16 (pRawdata2);                  pBuf->iTRNSred   = 0;                  pBuf->iTRNSgreen = 0;                  pBuf->iTRNSblue  = 0;                  pBuf->iTRNScount = 0;                  break;                }        case 2: {                      /* rgb */                  pBuf->iTRNSgray  = 0;                  pBuf->iTRNSred   = mng_get_uint16 (pRawdata2);                  pBuf->iTRNSgreen = mng_get_uint16 (pRawdata2+2);                  pBuf->iTRNSblue  = mng_get_uint16 (pRawdata2+4);                  pBuf->iTRNScount = 0;                  break;                }        case 3: {                      /* indexed */                  pBuf->iTRNSgray  = 0;                  pBuf->iTRNSred   = 0;                  pBuf->iTRNSgreen = 0;                  pBuf->iTRNSblue  = 0;                  pBuf->iTRNScount = iRawlen2;                  MNG_COPY (pBuf->aTRNSentries, pRawdata2, iRawlen2)                  break;                }      }    }    }  else                                 /* store as global */  {    pData->iGlobalTRNSrawlen = iRawlen;    MNG_COPY (pData->aGlobalTRNSrawdata, pRawdata, iRawlen)    {                                  /* create an animation object */      mng_retcode iRetcode = create_ani_trns (pData, pData->iGlobalTRNSrawlen,                                              pData->aGlobalTRNSrawdata);      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;    if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))    {                                  /* not global! */      ((mng_trnsp)*ppChunk)->bGlobal  = MNG_FALSE;      ((mng_trnsp)*ppChunk)->iType    = pData->iColortype;      if (iRawlen == 0)                /* if empty, indicate so */        ((mng_trnsp)*ppChunk)->bEmpty = MNG_TRUE;      else      {        ((mng_trnsp)*ppChunk)->bEmpty = MNG_FALSE;        switch (pData->iColortype)     /* store fields */        {          case 0: {                    /* gray */                    ((mng_trnsp)*ppChunk)->iGray  = mng_get_uint16 (pRawdata);                    break;                  }          case 2: {                    /* rgb */                    ((mng_trnsp)*ppChunk)->iRed   = mng_get_uint16 (pRawdata);                    ((mng_trnsp)*ppChunk)->iGreen = mng_get_uint16 (pRawdata+2);                    ((mng_trnsp)*ppChunk)->iBlue  = mng_get_uint16 (pRawdata+4);                    break;                  }          case 3: {                    /* indexed */                    ((mng_trnsp)*ppChunk)->iCount = iRawlen;                    MNG_COPY (((mng_trnsp)*ppChunk)->aEntries, pRawdata, iRawlen)                    break;                  }        }      }    }    else                               /* it's global! */    {      ((mng_trnsp)*ppChunk)->bEmpty  = (mng_bool)(iRawlen == 0);      ((mng_trnsp)*ppChunk)->bGlobal = MNG_TRUE;      ((mng_trnsp)*ppChunk)->iType   = 0;      ((mng_trnsp)*ppChunk)->iRawlen = iRawlen;      MNG_COPY (((mng_trnsp)*ppChunk)->aRawdata, pRawdata, iRawlen)    }  }#endif /* MNG_STORE_CHUNKS */#ifdef MNG_SUPPORT_TRACE  MNG_TRACE (pData, MNG_FN_READ_TRNS, MNG_LC_END)#endif  return MNG_NOERROR;                  /* done */}/* ************************************************************************** */READ_CHUNK (read_gama){#ifdef MNG_SUPPORT_TRACE  MNG_TRACE (pData, MNG_FN_READ_GAMA, MNG_LC_START)#endif                                       /* sequence checks */#ifdef MNG_INCLUDE_JNG  if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&      (!pData->bHasBASI) && (!pData->bHasDHDR) && (!pData->bHasJHDR))#else  if ((!pData->bHasMHDR) && (!pData->bHasIHDR) &&      (!pData->bHasBASI) && (!pData->bHasDHDR)    )#endif    MNG_ERROR (pData, MNG_SEQUENCEERROR)#ifdef MNG_INCLUDE_JNG  if ((pData->bHasIDAT) || (pData->bHasPLTE) || (pData->bHasJDAT) || (pData->bHasJDAA))#else  if ((pData->bHasIDAT) || (pData->bHasPLTE))#endif    MNG_ERROR (pData, MNG_SEQUENCEERROR)#ifdef MNG_INCLUDE_JNG  if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))#else  if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))#endif  {                                    /* length must be exactly 4 */    if (iRawlen != 4)      MNG_ERROR (pData, MNG_INVALIDLENGTH)  }  else  {                                    /* length must be empty or exactly 4 */    if ((iRawlen != 0) && (iRawlen != 4))      MNG_ERROR (pData, MNG_INVALIDLENGTH)  }#ifdef MNG_INCLUDE_JNG  if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))#else  if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))#endif    pData->bHasGAMA = MNG_TRUE;        /* indicate we've got it */  else    pData->bHasglobalGAMA = (mng_bool)(iRawlen != 0);#ifdef MNG_SUPPORT_DISPLAY#ifdef MNG_INCLUDE_JNG  if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR) || (pData->bHasJHDR))#else  if ((pData->bHasIHDR) || (pData->bHasBASI) || (pData->bHasDHDR))

⌨️ 快捷键说明

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