00001
00038 #ifndef INC_MI32_MG2CMS_H
00039 #define INC_MI32_MG2CMS_H
00040
00041 #ifndef INC_MI32_FILEPATH_H
00042 #include <mi32/filepath.h>
00043 #endif
00044
00045 #ifndef INC_MI32_MILIST_H
00046 #include <mi32/milist.h>
00047 #endif
00048
00049 #ifndef INC_MI32_COLOR_H
00050 #include <mi32/color.h>
00051 #endif
00052
00053 #ifndef INC_MI32_MICALLBACKLIST_H
00054 #include <mi32/micallbacklist.h>
00055 #endif
00056
00057 #ifndef INC_MI32_SERIALIZERBASE_H
00058 #include <mi32/serializerbase.h>
00059 #endif
00060
00061
00062 #ifndef GENERATING_DOXYGEN_OUTPUT
00063
00064 struct COLOR;
00065 class MISTRING;
00066 class XMLNODE;
00067 namespace MGUI {
00068 class XMLFORM_DATA;
00069 }
00070
00071 typedef void* cmsHPROFILE;
00072 typedef void* cmsHTRANSFORM;
00073 #endif
00074
00075
00076
00077 #ifndef GENERATING_DOXYGEN_OUTPUT
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 #ifdef __cms_H
00088 #define COLORXYZ_BASE cmsCIEXYZ
00089 #define COLORxyY_BASE cmsCIExyY
00090 #else
00091 struct CIECOLORXYZ { double X, Y, Z; };
00092 struct CIECOLORxyY { double x, y, Y; };
00093 #define COLORXYZ_BASE CIECOLORXYZ
00094 #define COLORxyY_BASE CIECOLORxyY
00095 #endif
00096 #endif // GENERATING_DOXYGEN_OUTPUT
00097
00098
00106 class COLORXYZ : public COLORXYZ_BASE {
00107 public:
00108 COLORXYZ();
00109 COLORXYZ(double X, double Y, double Z);
00110 COLORXYZ(const COLORXYZ&);
00111 explicit COLORXYZ(const COLOR&);
00112 COLORXYZ& operator=(const COLORXYZ& rhs);
00113 COLORXYZ& operator=(const COLOR& rhs);
00114
00116 static const SERIALIZERITEM* GetSerialItemDef();
00117
00120 bool GetColor_sRGB(COLOR&) const;
00121 };
00122
00123
00131 class COLORxyY : public COLORxyY_BASE {
00132 public:
00133 COLORxyY();
00134 COLORxyY(double x, double y, double Y);
00135 COLORxyY(const COLORxyY&);
00136 COLORxyY(const COLOR&);
00137 COLORxyY& operator=(const COLORxyY& rhs);
00138 COLORxyY& operator=(const COLOR& rhs);
00139
00141 static const SERIALIZERITEM* GetSerialItemDef();
00142
00144 bool SetTemperature (
00145 int DegreesKelvin
00146 );
00147
00150 bool GetColor_sRGB(COLOR&) const;
00151
00153 };
00154
00155
00156
00157 namespace MGD {
00158
00159 class TRANSFORM;
00160 class DEVICE;
00161 class PROFILEPARMS_RGB;
00162 class PROFILEPARMS_PRINTER;
00163
00164
00165
00166 class GAMMA {
00167 public:
00168 GAMMA (
00169 int entries,
00170 double gamma
00171 );
00172
00173 ~GAMMA();
00174
00178 bool Smooth (
00179 double lambda
00180 );
00181
00182 #ifndef GENERATING_DOXYGEN_OUTPUT
00183 #ifdef __cms_H
00185 GAMMATABLE* GetTable (
00186 ) const {
00187 return m_table;
00188 }
00189 #endif
00190 #endif // GENERATING_DOXYGEN_OUTPUT
00191
00195 private:
00196 #ifndef GENERATING_DOXYGEN_OUTPUT
00197 #ifdef __cms_H
00201 GAMMATABLE* m_table;
00202 #else
00203 void* m_table;
00204 #endif
00205 #endif // GENERATING_DOXYGEN_OUTPUT
00206
00207 };
00208
00209
00211 class PROFILE {
00212 public:
00214 enum BUILTIN_PROFILE {
00215 PROFILE_NONE = -1,
00216 PROFILE_sRGB = 0,
00217 PROFILE_XYZ,
00218 PROFILE_LAB,
00219 PROFILE_AdobeRGB_1998,
00220 PROFILE_AppleRGB
00221 };
00222
00224 enum INTENT {
00225 INTENT_Perceptual = 0,
00226 INTENT_RelativeColorimetric = 1,
00227 INTENT_Saturation = 2,
00228 INTENT_AbsoluteColorimetric = 3
00229 };
00230
00232 enum USAGE {
00233 USAGE_Input = 0,
00234 USAGE_Output = 1,
00235 USAGE_Proof = 2
00236 };
00237
00241 enum TAG {
00242 TAG_AToB0 = 0x41324230L,
00243 TAG_AToB1 = 0x41324231L,
00244 TAG_AToB2 = 0x41324232L,
00245 TAG_BlueColorant = 0x6258595AL,
00246 TAG_BlueTRC = 0x62545243L,
00247 TAG_BToA0 = 0x42324130L,
00248 TAG_BToA1 = 0x42324131L,
00249 TAG_BToA2 = 0x42324132L,
00250 TAG_CalibrationDateTime = 0x63616C74L,
00251 TAG_CharTarget = 0x74617267L,
00252 TAG_Copyright = 0x63707274L,
00253 TAG_CrdInfo = 0x63726469L,
00254 TAG_DeviceMfgDesc = 0x646D6E64L,
00255 TAG_DeviceModelDesc = 0x646D6464L,
00256 TAG_Gamut = 0x67616D74L,
00257 TAG_GrayTRC = 0x6b545243L,
00258 TAG_GreenColorant = 0x6758595AL,
00259 TAG_GreenTRC = 0x67545243L,
00260 TAG_Luminance = 0x6C756d69L,
00261 TAG_Measurement = 0x6D656173L,
00262 TAG_MediaBlackPoint = 0x626B7074L,
00263 TAG_MediaWhitePoint = 0x77747074L,
00264 TAG_NamedColor = 0x6E636f6CL,
00265
00266 TAG_NamedColor2 = 0x6E636C32L,
00267 TAG_Preview0 = 0x70726530L,
00268 TAG_Preview1 = 0x70726531L,
00269 TAG_Preview2 = 0x70726532L,
00270 TAG_ProfileDescription = 0x64657363L,
00271 TAG_ProfileSequenceDesc = 0x70736571L,
00272 TAG_Ps2CRD0 = 0x70736430L,
00273 TAG_Ps2CRD1 = 0x70736431L,
00274 TAG_Ps2CRD2 = 0x70736432L,
00275 TAG_Ps2CRD3 = 0x70736433L,
00276 TAG_Ps2CSA = 0x70733273L,
00277 TAG_RenderingIntent = 0x70733269L,
00278 TAG_RedColorant = 0x7258595AL,
00279 TAG_RedTRC = 0x72545243L,
00280 TAG_ScreeningDesc = 0x73637264L,
00281 TAG_Screening = 0x7363726EL,
00282 TAG_Technology = 0x74656368L,
00283 TAG_UcrBg = 0x62666420L,
00284 TAG_ViewingCondDesc = 0x76756564L,
00285 TAG_ViewingConditions = 0x76696577L
00286 };
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296 enum ICMCOLORSPACE {
00297 ICMCOLORSPACE_XYZ = 0x58595A20L,
00298 ICMCOLORSPACE_Lab = 0x4C616220L,
00299 ICMCOLORSPACE_Luv = 0x4C757620L,
00300 ICMCOLORSPACE_YCbCr = 0x59436272L,
00301 ICMCOLORSPACE_Yxy = 0x59787920L,
00302 ICMCOLORSPACE_RGB = 0x52474220L,
00303 ICMCOLORSPACE_Gray = 0x47524159L,
00304 ICMCOLORSPACE_HSV = 0x48535620L,
00305 ICMCOLORSPACE_HLS = 0x484C5320L,
00306 ICMCOLORSPACE_CMYK = 0x434D594BL,
00307 ICMCOLORSPACE_CMY = 0x434D5920L,
00308 ICMCOLORSPACE_2Color = 0x32434C52L,
00309 ICMCOLORSPACE_3Color = 0x33434C52L,
00310 ICMCOLORSPACE_4Color = 0x34434C52L,
00311 ICMCOLORSPACE_5Color = 0x35434C52L,
00312 ICMCOLORSPACE_6Color = 0x36434C52L,
00313 ICMCOLORSPACE_7Color = 0x37434C52L,
00314 ICMCOLORSPACE_8Color = 0x38434C52L
00315 };
00316
00318 enum CLASS {
00319 CLASS_Unspecified = 0,
00320 CLASS_Input = 0x73636E72L,
00321 CLASS_Display = 0x6D6E7472L,
00322 CLASS_Output = 0x70727472L,
00323 CLASS_Link = 0x6C696E6BL,
00324 CLASS_Abstract = 0x61627374L,
00325 CLASS_ColorSpace = 0x73706163L,
00326 CLASS_NamedColor = 0x6e6d636cL
00327 };
00328
00331 struct PRIMARIES {
00333 PRIMARIES(
00334 ) :
00335 id(0)
00336 {
00337 }
00338
00339 ~PRIMARIES() {}
00340 int id;
00341 MISTRING name;
00342 COLORxyY red;
00343 COLORxyY green;
00344 COLORxyY blue;
00345
00347 static const SERIALIZERITEM* GetSerialItemDef();
00348 };
00349
00352 struct WHITEPOINT {
00353 ~WHITEPOINT() {}
00354 int id;
00355 MISTRING name;
00356 COLORxyY color;
00357 };
00358
00359 class LISTENTRY;
00360
00363 PROFILE (
00364 ) :
00365 m_priv(0)
00366 {
00367 }
00368
00373 PROFILE (
00374 BUILTIN_PROFILE builtin
00375 ) :
00376 m_priv(0)
00377 {
00378 CreateBuiltInProfile(builtin);
00379 }
00380
00383 PROFILE (
00384 const PROFILE& rhs
00385 );
00386
00389 ~PROFILE (
00390 );
00391
00394 PROFILE& operator= (
00395 const PROFILE& rhs
00396 );
00397
00399 bool operator== (
00400 const PROFILE& rhs
00401 ) const;
00402
00403 bool operator!= (
00404 const PROFILE& rhs
00405 ) const {
00406 return (!(*this == rhs));
00407 }
00408
00410 static ERRVALUE EnumerateProfiles (
00411 CLASS ProfileClass,
00412 MILIST<LISTENTRY>& List
00413 );
00414
00422 static ERRVALUE EnumeratePrimaries (
00423 MILIST<PRIMARIES>& List
00424 );
00425
00436 static ERRVALUE EnumerateWhitePoints (
00437 MILIST<WHITEPOINT>& List
00438 );
00439
00443 static bool WhitePointFromTemp (
00444 int tempK,
00445 COLORxyY& WhitePoint
00446 );
00447
00449 bool GetColorants (
00450 COLORXYZ& red,
00451 COLORXYZ& green,
00452 COLORXYZ& blue
00453 ) const;
00454
00456 bool GetIluminant (
00457 COLORXYZ& illuminant
00458 ) const;
00459
00461 bool GetMediaBlackPoint (
00462 COLORXYZ& blackpoint
00463 ) const;
00464
00466 bool GetMediaWhitePoint (
00467 COLORXYZ& whitepoint
00468 ) const;
00469
00471 void GetName (
00472 MISTRING&
00473 ) const;
00474
00476 void GetDesc (
00477 MISTRING&
00478 ) const;
00479
00481 INTENT GetRenderingIntent (
00482 ) const;
00483
00487 ICMCOLORSPACE GetPCS (
00488 ) const;
00489
00490 ICMCOLORSPACE GetColorSpace (
00491 ) const;
00493
00495 CLASS GetDeviceClass (
00496 ) const;
00497
00499 bool SupportsIntent (
00500 INTENT intent,
00501 USAGE use
00502 ) const;
00503
00504 void Free (
00505 );
00506
00508 bool HasTag (
00509 TAG sig
00510 ) const;
00511
00512 bool IsEmpty (
00513 ) const {
00514 return (m_priv == 0);
00515 }
00516
00518 ERRVALUE Read (
00519 const FILEPATH& path
00520 );
00522 ERRVALUE ReadFromMemory (
00523 const void* buf,
00524 int size
00525 );
00526
00527 ERRVALUE Create (
00528 const PROFILEPARMS_RGB& parms
00529 );
00530
00531 ERRVALUE Create (
00532 const PROFILEPARMS_PRINTER& parms
00533 );
00534
00537 ERRVALUE CreateDeviceLinkProfile (
00538 TRANSFORM& transform,
00539 UINT32 flags
00540 );
00544
00546 ERRVALUE CreateInkLimitingProfile (
00547 double limit,
00548 COLORSPACE ColorSpace
00549 );
00550
00552 ERRVALUE CreateBuiltInProfile (
00553 BUILTIN_PROFILE profile
00554 );
00555
00560 ERRVALUE CreateRGBProfile (
00561 const COLORxyY& WhitePoint,
00562 const PRIMARIES& Primaries,
00563 const GAMMA& TransferFunctionRed,
00564 const GAMMA& TransferFunctionGreen,
00565 const GAMMA& TransferFunctionBlue
00566 );
00567
00568 ERRVALUE CreateGrayProfile (
00569 const COLORxyY& WhitePoint,
00570 const GAMMA& TransferFunction
00571 );
00572
00573 private:
00574 #ifndef GENERATING_DOXYGEN_OUTPUT
00575 friend class TRANSFORM;
00576
00577 class PRIVDATA;
00578
00579 PRIVDATA* m_priv;
00580 cmsHPROFILE GetProfile() const;
00581
00582 ERRVALUE CreateSimpleRGBProfile (
00583 int WhitePoint,
00584 double gamma,
00585 double rx,
00586 double ry,
00587 double gx,
00588 double gy,
00589 double bx,
00590 double by
00591 );
00592 #endif
00593 };
00594
00595
00596
00597 class PROFILEPARMS {
00598 public:
00599 enum MODE {
00600 MODE_None = 0,
00601 MODE_sRGB = 1,
00602 MODE_ICMFile = 2,
00603 MODE_UserDefined = 3
00604 };
00605
00606 PROFILEPARMS();
00607 virtual ~PROFILEPARMS() {}
00608
00610 static const SERIALIZERITEM* GetSerialItemDef();
00611
00612 ERRVALUE IniRead(const char*inikey = 0, INIHANDLE handle = 0);
00613 ERRVALUE IniWrite(const char*inikey = 0, INIHANDLE handle = 0) const;
00614 void XMLRead (const MGUI::XMLFORM_DATA&);
00615 void XMLWrite (MGUI::XMLFORM_DATA&) const;
00616
00617 MODE m_mode;
00618 PROFILE::INTENT m_intent;
00619 PROFILE::BUILTIN_PROFILE m_BuiltInProfile;
00620 FILEPATH m_filepath;
00621 int m_WhitePoint;
00622 double m_wx, m_wy;
00623
00624 private:
00625 virtual const char* v_GetDefaultINIKey() const = 0;
00629 virtual ERRVALUE v_IniRead(const char*inikey, INIHANDLE handle = 0) = 0;
00630 virtual ERRVALUE v_IniWrite(const char*inikey, INIHANDLE handle = 0) const = 0;
00631 virtual void v_XMLRead(const MGUI::XMLFORM_DATA&) = 0;
00632 virtual void v_XMLWrite(MGUI::XMLFORM_DATA&) const = 0;
00633
00634 virtual void v_NotifyObservers() const {}
00635 };
00636
00637 class PROFILEPARMS_RGB : public PROFILEPARMS {
00638 public:
00639 PROFILEPARMS_RGB ();
00640 ~PROFILEPARMS_RGB() {};
00641
00643 static const SERIALIZERITEM* GetSerialItemDef();
00644
00645 double m_RedGamma, m_GreenGamma, m_BlueGamma;
00646 PROFILE::PRIMARIES m_primary;
00647
00648 private:
00649 #ifndef GENERATING_DOXYGEN_OUTPUT
00650 virtual const char* v_GetDefaultINIKey() const { return "ICMScreen"; }
00651 virtual ERRVALUE v_IniRead(const char*inikey, INIHANDLE handle = 0);
00652 virtual ERRVALUE v_IniWrite(const char*inikey, INIHANDLE handle = 0) const;
00653 virtual void v_XMLRead(const MGUI::XMLFORM_DATA&);
00654 virtual void v_XMLWrite(MGUI::XMLFORM_DATA&) const;
00655 #endif // GENERATING_DOXYGEN_OUTPUT
00656 };
00657
00658
00662 class PROFILEPARMS_SCREEN : public PROFILEPARMS_RGB {
00663 public:
00664 PROFILEPARMS_SCREEN ();
00665 ~PROFILEPARMS_SCREEN() {}
00666
00667 static void AddChangeCallback (
00668 MICALLBACKLIST::CALLBACKFUNC func,
00669 void* cbdata
00670 );
00671
00672 static void RemoveChangeCallback (
00673 MICALLBACKLIST::CALLBACKFUNC func,
00674 void* cbdata
00675 );
00676
00677 private:
00678 #ifndef GENERATING_DOXYGEN_OUTPUT
00679 virtual void v_NotifyObservers() const ;
00680 #endif // GENERATING_DOXYGEN_OUTPUT
00681 };
00682
00683
00684 class PROFILEPARMS_PRINTER : public PROFILEPARMS {
00685 public:
00686 PROFILEPARMS_PRINTER ();
00687 ~PROFILEPARMS_PRINTER() {};
00688
00690 static const SERIALIZERITEM* GetSerialItemDef();
00691
00692 bool m_bProofToScreen;
00693 bool m_bOutOfGamutAlarm;
00694 COLOR m_AlarmColor;
00695 bool m_bUseProfileForProofingOnly;
00696 double m_InkLimit;
00697 double m_BlackInkLimit;
00698 private:
00699 #ifndef GENERATING_DOXYGEN_OUTPUT
00700 virtual const char* v_GetDefaultINIKey() const { return "PrinterICM"; }
00701 virtual ERRVALUE v_IniRead(const char*inikey, INIHANDLE handle = 0);
00702 virtual ERRVALUE v_IniWrite(const char*inikey, INIHANDLE handle = 0) const;
00703 virtual void v_XMLRead(const MGUI::XMLFORM_DATA&);
00704 virtual void v_XMLWrite(MGUI::XMLFORM_DATA&) const;
00705 #endif // GENERATING_DOXYGEN_OUTPUT
00706
00707 };
00708
00709
00712 class PROFILE::LISTENTRY {
00713 public:
00714 LISTENTRY () { }
00715
00717 LISTENTRY (
00718 const LISTENTRY& rhs
00719 ) :
00720 m_filepath(rhs.m_filepath),
00721 m_desc(rhs.m_desc),
00722 m_bIsBuiltIn(rhs.m_bIsBuiltIn),
00723 m_BuiltInID(rhs.m_BuiltInID)
00724 {}
00725
00726
00727 ~LISTENTRY () {}
00728
00730 LISTENTRY& operator= (
00731 const LISTENTRY& rhs
00732 ) {
00733 if (&rhs != this) {
00734 m_filepath = rhs.m_filepath;
00735 m_desc = rhs.m_desc;
00736 m_bIsBuiltIn = rhs.m_bIsBuiltIn;
00737 m_BuiltInID = rhs.m_BuiltInID;
00738 }
00739 return (*this);
00740 }
00741
00742 const MISTRING& GetDescription (
00743 ) const {
00744 return (m_desc);
00745 }
00746
00747 const FILEPATH& GetFilePath (
00748 ) const {
00749 return (m_filepath);
00750 }
00751
00752 bool IsBuiltIn (
00753 ) const {
00754 return (m_bIsBuiltIn);
00755 }
00756
00757 BUILTIN_PROFILE GetBuiltInID (
00758 ) const {
00759 return (m_BuiltInID);
00760 }
00761
00762 private:
00763 #ifndef GENERATING_DOXYGEN_OUTPUT
00764 FILEPATH m_filepath;
00765 MISTRING m_desc;
00766 bool m_bIsBuiltIn;
00767 BUILTIN_PROFILE m_BuiltInID;
00768
00770 LISTENTRY (
00771 const FILEPATH& fp,
00772 const MISTRING& desc
00773 ) :
00774 m_desc(desc),
00775 m_filepath(fp),
00776 m_bIsBuiltIn(false),
00777 m_BuiltInID(PROFILE::PROFILE_NONE)
00778 {
00779 }
00780
00781 LISTENTRY (
00782 PROFILE::BUILTIN_PROFILE id,
00783 const MISTRING& desc
00784 ) :
00785 m_desc(desc),
00786 m_bIsBuiltIn(true),
00787 m_BuiltInID(id)
00788 {
00789 }
00790
00791 friend class PROFILE;
00792 #endif // GENERATING_DOXYGEN_OUTPUT
00793 };
00794
00795
00796 class TRANSFORM {
00797 public:
00798
00801 TRANSFORM (
00802 ) :
00803 m_priv(0)
00804 { }
00805
00807 TRANSFORM (
00808 const PROFILE& InputProfile,
00809 COLORSPACE InputColorSpace,
00810 const PROFILE& OutputProfile,
00811 COLORSPACE OutputColorSpace,
00812 PROFILE::INTENT RenderingIntent = PROFILE::INTENT_Perceptual,
00813 UINT32 flags = 0
00814 );
00815
00825
00826
00832
00835 TRANSFORM (
00836 const TRANSFORM& rhs
00837 );
00838
00841 ~TRANSFORM (
00842 );
00843
00846 TRANSFORM& operator= (
00847 const TRANSFORM& rhs
00848 );
00849
00853 static void SetOutOfGamutAlarmColor (
00854 const COLOR& color
00855 );
00856
00857 ERRVALUE Create (
00858 const PROFILE& InputProfile,
00859 COLORSPACE InputColorSpace,
00860 const PROFILE& OutputProfile,
00861 COLORSPACE OutputColorSpace,
00862 PROFILE::INTENT RenderingIntent = PROFILE::INTENT_Perceptual,
00863 UINT32 flags = 0
00864 );
00865
00866 ERRVALUE Create (
00867 const PROFILE& InputProfile,
00868 COLORSPACE InputColorSpace,
00869 const PROFILEPARMS_PRINTER& ProofParms,
00870 const PROFILE& OutputProfile,
00871 COLORSPACE OutputColorSpace,
00872 PROFILE::INTENT RenderingIntent = PROFILE::INTENT_Perceptual,
00873 UINT32 flags = 0
00874 );
00875
00876 COLORSPACE GetOutputColorSpace (
00877 ) const {
00878 return (m_DestColorSpace);
00879 }
00880
00883 const PROFILE& GetInputProfile (
00884 ) const;
00885
00888 const PROFILE& GetOutputProfile (
00889 ) const;
00890
00895 bool IsEmpty (
00896 ) const {
00897 return (m_priv == 0);
00898 }
00899
00905 void DoTransform (
00906 const void* src,
00907 void* dest,
00908 int size
00909 ) const;
00910
00911 void DoTransform (
00912 const COLOR& src,
00913 COLOR& dest
00914 ) const;
00915
00916 void Free();
00917
00918 private:
00919 #ifndef GENERATING_DOXYGEN_OUTPUT
00920 class PRIVDATA;
00921
00922 PRIVDATA* m_priv;
00923 COLORSPACE m_SrcColorSpace;
00924 COLORSPACE m_DestColorSpace;
00925
00926 cmsHTRANSFORM GetTrans() const;
00927 #endif // GENERATING_DOXYGEN_OUTPUT
00928
00929 };
00930
00931
00932
00933 }
00934
00935 #endif // INC_MI32_MG2CMS_H