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

📄 libmng_cms.c

📁 Linux下的基于X11的图形开发环境。
💻 C
📖 第 1 页 / 共 3 页
字号:
/* ************************************************************************** *//* *             For conditions of distribution and use,                    * *//* *                see copyright notice in libmng.h                        * *//* ************************************************************************** *//* *                                                                        * *//* * project   : libmng                                                     * *//* * file      : libmng_cms.c              copyright (c) 2000 G.Juyn        * *//* * version   : 1.0.1                                                      * *//* *                                                                        * *//* * purpose   : color management routines (implementation)                 * *//* *                                                                        * *//* * author    : G.Juyn                                                     * *//* * web       : http://www.3-t.com                                         * *//* * email     : mailto:info@3-t.com                                        * *//* *                                                                        * *//* * 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!)          * *//* *                                                                        * *//* ************************************************************************** */#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 init_full_cms (mng_datap pData){  mng_cmsprof    hProf;  mng_cmstrans   hTrans;  mng_imagep     pImage = (mng_imagep)pData->pCurrentobj;  mng_imagedatap pBuf;#ifdef MNG_SUPPORT_TRACE  MNG_TRACE (pData, MNG_FN_INIT_FULL_CMS, MNG_LC_START)#endif  if (!pImage)                         /* no current object? then use object 0 */    pImage = (mng_imagep)pData->pObjzero;  pBuf = pImage->pImgbuf;              /* address the buffer */   if ((pBuf->bHasICCP) || (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->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)    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      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)correct_full_cms;    return MNG_NOERROR;                /* and done */  }  else  if ((pBuf->bHasSRGB) || (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->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)correct_full_cms;    return MNG_NOERROR;                /* and done */  }  else  if ( ((pBuf->bHasCHRM) || (pData->bHasglobalCHRM)) &&       ( ((pBuf->bHasGAMA)        && (pBuf->iGamma        > 0)) ||         ((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)    }    if (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

⌨️ 快捷键说明

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