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

📄 libmng_cms.c

📁 奇趣公司比较新的qt/emd版本
💻 C
📖 第 1 页 / 共 2 页
字号:
/* ************************************************************************** *//* *             For conditions of distribution and use,                    * *//* *                see copyright notice in libmng.h                        * *//* ************************************************************************** *//* *                                                                        * *//* * project   : libmng                                                     * *//* * file      : libmng_cms.c              copyright (c) 2000-2004 G.Juyn   * *//* * version   : 1.0.9                                                      * *//* *                                                                        * *//* * purpose   : color management routines (implementation)                 * *//* *                                                                        * *//* * author    : G.Juyn                                                     * *//* *                                                                        * *//* * comment   : implementation of the color management routines            * *//* *                                                                        * *//* * changes   : 0.5.1 - 05/01/2000 - G.Juyn                                * *//* *             - B001(105795) - fixed a typo and misconception about      * *//* *               freeing allocated gamma-table. (reported by Marti Maria) * *//* *             0.5.1 - 05/08/2000 - G.Juyn                                * *//* *             - changed strict-ANSI stuff                                * *//* *             0.5.1 - 05/09/2000 - G.Juyn                                * *//* *             - filled application-based color-management routines       * *//* *             0.5.1 - 05/11/2000 - G.Juyn                                * *//* *             - added creatememprofile                                   * *//* *             - added callback error-reporting support                   * *//* *             0.5.1 - 05/12/2000 - G.Juyn                                * *//* *             - changed trace to macro for callback error-reporting      * *//* *                                                                        * *//* *             0.5.2 - 06/10/2000 - G.Juyn                                * *//* *             - fixed some compilation-warnings (contrib Jason Morris)   * *//* *                                                                        * *//* *             0.5.3 - 06/21/2000 - G.Juyn                                * *//* *             - fixed problem with color-correction for stored images    * *//* *             0.5.3 - 06/23/2000 - G.Juyn                                * *//* *             - fixed problem with incorrect gamma-correction            * *//* *                                                                        * *//* *             0.9.2 - 08/05/2000 - G.Juyn                                * *//* *             - changed file-prefixes                                    * *//* *                                                                        * *//* *             0.9.3 - 08/31/2000 - G.Juyn                                * *//* *             - fixed sRGB precedence for gamma_only corection           * *//* *                                                                        * *//* *             0.9.4 - 12/16/2000 - G.Juyn                                * *//* *             - fixed mixup of data- & function-pointers (thanks Dimitri)* *//* *                                                                        * *//* *             1.0.1 - 03/31/2001 - G.Juyn                                * *//* *             - ignore gamma=0 (see png-list for more info)              * *//* *             1.0.1 - 04/25/2001 - G.Juyn (reported by Gregg Kelly)      * *//* *             - fixed problem with cms profile being created multiple    * *//* *               times when both iCCP & cHRM/gAMA are present             * *//* *             1.0.1 - 04/25/2001 - G.Juyn                                * *//* *             - moved mng_clear_cms to libmng_cms                        * *//* *             1.0.1 - 05/02/2001 - G.Juyn                                * *//* *             - added "default" sRGB generation (Thanks Marti!)          * *//* *                                                                        * *//* *             1.0.5 - 08/19/2002 - G.Juyn                                * *//* *             - B597134 - libmng pollutes the linker namespace           * *//* *             1.0.5 - 09/19/2002 - G.Juyn                                * *//* *             - optimized color-correction routines                      * *//* *             1.0.5 - 09/23/2002 - G.Juyn                                * *//* *             - added in-memory color-correction of abstract images      * *//* *             1.0.5 - 11/08/2002 - G.Juyn                                * *//* *             - fixed issues in init_app_cms()                           * *//* *                                                                        * *//* *             1.0.6 - 04/11/2003 - G.Juyn                                * *//* *             - B719420 - fixed several MNG_APP_CMS problems             * *//* *             1.0.6 - 07/11/2003 - G. R-P                                * *//* *             - added conditional MNG_SKIPCHUNK_cHRM/iCCP                * *//* *                                                                        * *//* *             1.0.9 - 12/20/2004 - G.Juyn                                * *//* *             - cleaned up macro-invocations (thanks to D. Airlie)       * *//* *                                                                        * *//* ************************************************************************** */#include "libmng.h"#include "libmng_data.h"#include "libmng_error.h"#include "libmng_trace.h"#ifdef __BORLANDC__#pragma hdrstop#endif#include "libmng_objects.h"#include "libmng_cms.h"#if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI)#pragma option -A                      /* force ANSI-C */#endif/* ************************************************************************** */#ifdef MNG_INCLUDE_DISPLAY_PROCS/* ************************************************************************** *//* *                                                                        * *//* * Little CMS helper routines                                             * *//* *                                                                        * *//* ************************************************************************** */#ifdef MNG_INCLUDE_LCMS#define MNG_CMS_FLAGS 0/* ************************************************************************** */void mnglcms_initlibrary (){  cmsErrorAction (LCMS_ERROR_IGNORE);  /* LCMS should ignore errors! */}/* ************************************************************************** */mng_cmsprof mnglcms_createfileprofile (mng_pchar zFilename){  return cmsOpenProfileFromFile (zFilename, "r");}/* ************************************************************************** */mng_cmsprof mnglcms_creatememprofile (mng_uint32 iProfilesize,                                      mng_ptr    pProfile){  return cmsOpenProfileFromMem (pProfile, iProfilesize);}/* ************************************************************************** */mng_cmsprof mnglcms_createsrgbprofile (void){  cmsCIExyY       D65;  cmsCIExyYTRIPLE Rec709Primaries = {                                      {0.6400, 0.3300, 1.0},                                      {0.3000, 0.6000, 1.0},                                      {0.1500, 0.0600, 1.0}                                    };  LPGAMMATABLE    Gamma24[3];  mng_cmsprof     hsRGB;  cmsWhitePointFromTemp(6504, &D65);  Gamma24[0] = Gamma24[1] = Gamma24[2] = cmsBuildGamma(256, 2.4);  hsRGB = cmsCreateRGBProfile(&D65, &Rec709Primaries, Gamma24);  cmsFreeGamma(Gamma24[0]);  return hsRGB;}/* ************************************************************************** */void mnglcms_freeprofile (mng_cmsprof hProf){  cmsCloseProfile (hProf);  return;}/* ************************************************************************** */void mnglcms_freetransform (mng_cmstrans hTrans){/* B001 start */  cmsDeleteTransform (hTrans);/* B001 end */  return;}/* ************************************************************************** */mng_retcode mng_clear_cms (mng_datap pData){#ifdef MNG_SUPPORT_TRACE  MNG_TRACE (pData, MNG_FN_CLEAR_CMS, MNG_LC_START);#endif  if (pData->hTrans)                   /* transformation still active ? */    mnglcms_freetransform (pData->hTrans);  pData->hTrans = 0;  if (pData->hProf1)                   /* file profile still active ? */    mnglcms_freeprofile (pData->hProf1);  pData->hProf1 = 0;#ifdef MNG_SUPPORT_TRACE  MNG_TRACE (pData, MNG_FN_CLEAR_CMS, MNG_LC_END);#endif  return MNG_NOERROR;}/* ************************************************************************** */#endif /* MNG_INCLUDE_LCMS *//* ************************************************************************** *//* *                                                                        * *//* * Color-management initialization & correction routines                  * *//* *                                                                        * *//* ************************************************************************** */#ifdef MNG_INCLUDE_LCMSmng_retcode mng_init_full_cms (mng_datap pData,                               mng_bool  bGlobal,                               mng_bool  bObject,                               mng_bool  bRetrobj){  mng_cmsprof    hProf;  mng_cmstrans   hTrans;  mng_imagep     pImage = MNG_NULL;  mng_imagedatap pBuf   = MNG_NULL;#ifdef MNG_SUPPORT_TRACE  MNG_TRACE (pData, MNG_FN_INIT_FULL_CMS, MNG_LC_START);#endif  if (bObject)                         /* use object if present ? */  {                                    /* current object ? */    if ((mng_imagep)pData->pCurrentobj)      pImage = (mng_imagep)pData->pCurrentobj;    else                               /* if not; use object 0 */      pImage = (mng_imagep)pData->pObjzero;  }  if (bRetrobj)                        /* retrieving from an object ? */    pImage = (mng_imagep)pData->pRetrieveobj;  if (pImage)                          /* are we using an object ? */    pBuf = pImage->pImgbuf;            /* then address the buffer */  if ((!pBuf) || (!pBuf->bCorrected))  /* is the buffer already corrected ? */  {#ifndef MNG_SKIPCHUNK_iCCP    if (((pBuf) && (pBuf->bHasICCP)) || ((bGlobal) && (pData->bHasglobalICCP)))    {      if (!pData->hProf2)              /* output profile not defined ? */      {                                /* then assume sRGB !! */        pData->hProf2 = mnglcms_createsrgbprofile ();        if (!pData->hProf2)            /* handle error ? */          MNG_ERRORL (pData, MNG_LCMS_NOHANDLE);      }      if ((pBuf) && (pBuf->bHasICCP))  /* generate a profile handle */        hProf = cmsOpenProfileFromMem (pBuf->pProfile, pBuf->iProfilesize);      else        hProf = cmsOpenProfileFromMem (pData->pGlobalProfile, pData->iGlobalProfilesize);      pData->hProf1 = hProf;           /* save for future use */      if (!hProf)                      /* handle error ? */        MNG_ERRORL (pData, MNG_LCMS_NOHANDLE);#ifndef MNG_NO_16BIT_SUPPORT      if (pData->bIsRGBA16)            /* 16-bit intermediates ? */        hTrans = cmsCreateTransform (hProf,         TYPE_RGBA_16_SE,                                     pData->hProf2, TYPE_RGBA_16_SE,                                     INTENT_PERCEPTUAL, MNG_CMS_FLAGS);      else#endif        hTrans = cmsCreateTransform (hProf,         TYPE_RGBA_8,                                     pData->hProf2, TYPE_RGBA_8,                                     INTENT_PERCEPTUAL, MNG_CMS_FLAGS);      pData->hTrans = hTrans;          /* save for future use */      if (!hTrans)                     /* handle error ? */        MNG_ERRORL (pData, MNG_LCMS_NOTRANS);                                       /* load color-correction routine */      pData->fCorrectrow = (mng_fptr)mng_correct_full_cms;      return MNG_NOERROR;              /* and done */    }    else#endif    if (((pBuf) && (pBuf->bHasSRGB)) || ((bGlobal) && (pData->bHasglobalSRGB)))    {      mng_uint8 iIntent;      if (pData->bIssRGB)              /* sRGB system ? */        return MNG_NOERROR;            /* no conversion required */      if (!pData->hProf3)              /* sRGB profile not defined ? */      {                                /* then create it implicitly !! */        pData->hProf3 = mnglcms_createsrgbprofile ();        if (!pData->hProf3)            /* handle error ? */          MNG_ERRORL (pData, MNG_LCMS_NOHANDLE);      }      hProf = pData->hProf3;           /* convert from sRGB profile */      if ((pBuf) && (pBuf->bHasSRGB))  /* determine rendering intent */        iIntent = pBuf->iRenderingintent;      else        iIntent = pData->iGlobalRendintent;      if (pData->bIsRGBA16)            /* 16-bit intermediates ? */        hTrans = cmsCreateTransform (hProf,         TYPE_RGBA_16_SE,                                     pData->hProf2, TYPE_RGBA_16_SE,                                     iIntent, MNG_CMS_FLAGS);      else        hTrans = cmsCreateTransform (hProf,         TYPE_RGBA_8,                                     pData->hProf2, TYPE_RGBA_8,                                     iIntent, MNG_CMS_FLAGS);      pData->hTrans = hTrans;          /* save for future use */      if (!hTrans)                     /* handle error ? */        MNG_ERRORL (pData, MNG_LCMS_NOTRANS);                                       /* load color-correction routine */      pData->fCorrectrow = (mng_fptr)mng_correct_full_cms;      return MNG_NOERROR;              /* and done */    }    else    if ( (((pBuf) && (pBuf->bHasCHRM)) || ((bGlobal) && (pData->bHasglobalCHRM))) &&         ( ((pBuf) && (pBuf->bHasGAMA) && (pBuf->iGamma > 0)) ||           ((bGlobal) && (pData->bHasglobalGAMA) && (pData->iGlobalGamma > 0))  )    )    {      mng_CIExyY       sWhitepoint;      mng_CIExyYTRIPLE sPrimaries;      mng_gammatabp    pGammatable[3];      mng_float        dGamma;      if (!pData->hProf2)              /* output profile not defined ? */      {                                /* then assume sRGB !! */        pData->hProf2 = mnglcms_createsrgbprofile ();        if (!pData->hProf2)            /* handle error ? */          MNG_ERRORL (pData, MNG_LCMS_NOHANDLE);      }#ifndef MNG_SKIPCHUNK_cHRM      if ((pBuf) && (pBuf->bHasCHRM))  /* local cHRM ? */      {        sWhitepoint.x      = (mng_float)pBuf->iWhitepointx   / 100000;        sWhitepoint.y      = (mng_float)pBuf->iWhitepointy   / 100000;        sPrimaries.Red.x   = (mng_float)pBuf->iPrimaryredx   / 100000;        sPrimaries.Red.y   = (mng_float)pBuf->iPrimaryredy   / 100000;        sPrimaries.Green.x = (mng_float)pBuf->iPrimarygreenx / 100000;        sPrimaries.Green.y = (mng_float)pBuf->iPrimarygreeny / 100000;        sPrimaries.Blue.x  = (mng_float)pBuf->iPrimarybluex  / 100000;        sPrimaries.Blue.y  = (mng_float)pBuf->iPrimarybluey  / 100000;      }      else      {        sWhitepoint.x      = (mng_float)pData->iGlobalWhitepointx   / 100000;        sWhitepoint.y      = (mng_float)pData->iGlobalWhitepointy   / 100000;        sPrimaries.Red.x   = (mng_float)pData->iGlobalPrimaryredx   / 100000;        sPrimaries.Red.y   = (mng_float)pData->iGlobalPrimaryredy   / 100000;        sPrimaries.Green.x = (mng_float)pData->iGlobalPrimarygreenx / 100000;        sPrimaries.Green.y = (mng_float)pData->iGlobalPrimarygreeny / 100000;        sPrimaries.Blue.x  = (mng_float)pData->iGlobalPrimarybluex  / 100000;        sPrimaries.Blue.y  = (mng_float)pData->iGlobalPrimarybluey  / 100000;      }#endif      sWhitepoint.Y      =             /* Y component is always 1.0 */      sPrimaries.Red.Y   =      sPrimaries.Green.Y =      sPrimaries.Blue.Y  = 1.0;      if ((pBuf) && (pBuf->bHasGAMA))  /* get the gamma value */        dGamma = (mng_float)pBuf->iGamma / 100000;      else        dGamma = (mng_float)pData->iGlobalGamma / 100000;      dGamma = pData->dViewgamma / dGamma;      pGammatable [0] =                /* and build the lookup tables */      pGammatable [1] =      pGammatable [2] = cmsBuildGamma (256, dGamma);      if (!pGammatable [0])            /* enough memory ? */        MNG_ERRORL (pData, MNG_LCMS_NOMEM);                                       /* create the profile */      hProf = cmsCreateRGBProfile (&sWhitepoint, &sPrimaries, pGammatable);      cmsFreeGamma (pGammatable [0]);  /* free the temporary gamma tables ? */                                       /* yes! but just the one! */

⌨️ 快捷键说明

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