mkcmy.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. //
  2. // Little cms
  3. // Copyright (C) 1998-2003 Marti Maria
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining
  6. // a copy of this software and associated documentation files (the "Software"),
  7. // to deal in the Software without restriction, including without limitation
  8. // the rights to use, copy, modify, merge, publish, distribute, sublicense,
  9. // and/or sell copies of the Software, and to permit persons to whom the Software
  10. // is furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in
  13. // all copies or substantial portions of the Software.
  14. //
  15. // THIS SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
  16. // EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
  17. // WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  18. //
  19. // IN NO EVENT SHALL MARTI MARIA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
  20. // INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  21. // OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  22. // WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
  23. // LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  24. // OF THIS SOFTWARE.
  25. //
  26. // Version 1.12
  27. #include "lcms.h"
  28. typedef struct {
  29. cmsHPROFILE hLab;
  30. cmsHPROFILE hRGB;
  31. cmsHTRANSFORM Lab2RGB;
  32. cmsHTRANSFORM RGB2Lab;
  33. } CARGO, FAR* LPCARGO;
  34. // Our space will be CIE primaries plus a gamma of 4.5
  35. static
  36. int Forward(register WORD In[], register WORD Out[], register LPVOID Cargo)
  37. {
  38. LPCARGO C = (LPCARGO) Cargo;
  39. WORD RGB[3];
  40. cmsCIELab Lab;
  41. cmsLabEncoded2Float(&Lab, In);
  42. printf("%g %g %g\n", Lab.L, Lab.a, Lab.b);
  43. cmsDoTransform(C ->Lab2RGB, In, &RGB, 1);
  44. Out[0] = 0xFFFF - RGB[0]; // Our CMY is negative of RGB
  45. Out[1] = 0xFFFF - RGB[1];
  46. Out[2] = 0xFFFF - RGB[2];
  47. return TRUE;
  48. }
  49. static
  50. int Reverse(register WORD In[], register WORD Out[], register LPVOID Cargo)
  51. {
  52. LPCARGO C = (LPCARGO) Cargo;
  53. WORD RGB[3];
  54. RGB[0] = 0xFFFF - In[0];
  55. RGB[1] = 0xFFFF - In[1];
  56. RGB[2] = 0xFFFF - In[2];
  57. cmsDoTransform(C ->RGB2Lab, &RGB, Out, 1);
  58. return TRUE;
  59. }
  60. static
  61. void InitCargo(LPCARGO Cargo)
  62. {
  63. Cargo -> hLab = cmsCreateLabProfile(NULL);
  64. Cargo -> hRGB = cmsCreate_sRGBProfile();
  65. Cargo->Lab2RGB = cmsCreateTransform(Cargo->hLab, TYPE_Lab_16,
  66. Cargo ->hRGB, TYPE_RGB_16,
  67. INTENT_RELATIVE_COLORIMETRIC,
  68. cmsFLAGS_NOTPRECALC);
  69. Cargo->RGB2Lab = cmsCreateTransform(Cargo ->hRGB, TYPE_RGB_16,
  70. Cargo ->hLab, TYPE_Lab_16,
  71. INTENT_RELATIVE_COLORIMETRIC,
  72. cmsFLAGS_NOTPRECALC);
  73. }
  74. static
  75. void FreeCargo(LPCARGO Cargo)
  76. {
  77. cmsDeleteTransform(Cargo ->Lab2RGB);
  78. cmsDeleteTransform(Cargo ->RGB2Lab);
  79. cmsCloseProfile(Cargo ->hLab);
  80. cmsCloseProfile(Cargo ->hRGB);
  81. }
  82. int main(void)
  83. {
  84. LPLUT AToB0, BToA0;
  85. CARGO Cargo;
  86. cmsHPROFILE hProfile;
  87. fprintf(stderr, "Creating lcmscmy.icm...");
  88. InitCargo(&Cargo);
  89. hProfile = cmsCreateLabProfile(NULL);
  90. AToB0 = cmsAllocLUT();
  91. BToA0 = cmsAllocLUT();
  92. cmsAlloc3DGrid(AToB0, 25, 3, 3);
  93. cmsAlloc3DGrid(BToA0, 25, 3, 3);
  94. cmsSample3DGrid(AToB0, Reverse, &Cargo, 0);
  95. cmsSample3DGrid(BToA0, Forward, &Cargo, 0);
  96. cmsAddTag(hProfile, icSigAToB0Tag, AToB0);
  97. cmsAddTag(hProfile, icSigBToA0Tag, BToA0);
  98. cmsSetColorSpace(hProfile, icSigCmyData);
  99. cmsSetDeviceClass(hProfile, icSigOutputClass);
  100. cmsAddTag(hProfile, icSigProfileDescriptionTag, "CMY ");
  101. cmsAddTag(hProfile, icSigCopyrightTag, "Copyright (c) HP, 2007. All rights reserved.");
  102. cmsAddTag(hProfile, icSigDeviceMfgDescTag, "Little cms");
  103. cmsAddTag(hProfile, icSigDeviceModelDescTag, "CMY space");
  104. _cmsSaveProfile(hProfile, "lcmscmy.icm");
  105. cmsFreeLUT(AToB0);
  106. cmsFreeLUT(BToA0);
  107. cmsCloseProfile(hProfile);
  108. FreeCargo(&Cargo);
  109. fprintf(stderr, "Done.\n");
  110. return 0;
  111. }