📄 libmng_cms.c
字号:
/* ************************************************************************** *//* * 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 + -