Including LCMS [ Little Color Management System ] with Solaris Stefan Teleman 29 January 2008 1. Summary and motivation LCMS [Little CMS] [1] is a Color Management System implementing the International Color Consortium's ICC.1:2004-10 Specification. [2] LCMS implements fast and efficient colorspace transforms between different ICC Profiles. Its features include full multicolor support, Black color preservation in CMYK <-> CMYK transforms, Virtual Gray <-> RGB Profiles, built-in ICC Profiles support, ICC Profile writing, Specialized Virtual Profiles, and Ink Limiting. An ICC Profile is a standardized means of encoding color definitions and calibrations. Conversion between different ICC Profiles is usually achieved by means of a Profile Connection Space. A Profile Connection Space is a mapping between two Colorspaces [ for example, RGB and CMYK ]. An ICC Profile may define several Colorspace mappings, thereby allowing for the closest possible color match. A competing alternative to the ICC.1:2004-10 Specification has been proposed by OpenEXR. [5] ICC Profile [6] and Colorspace information may be encoded within each graphics file. This approach is currently in use by some of the most popular graphics file formats: TIFF, JPEG, PNG, MNG, EPS, PDF, SVG. The inclusion of LCMS in Solaris will add ICC Profile and Color Management capabilities to those graphics file formats supporting such facilities. The "Little" in LCMS stands for "small overhead". This case seeks Micro/Patch release Binding. 2. Technical issues 2.1. Key objects /usr/bin/icctrans /usr/bin/icc2ps /usr/bin/icclink /usr/bin/jpegicc /usr/bin/tifficc /usr/bin/tiffdiff /usr/bin/wtpt /usr/include/lcms/icc34.h /usr/include/lcms/lcms.h /usr/lib/liblcms.so.1.0.16 /usr/lib/liblcms.so.1 -> /usr/lib/liblcms.so.1.0.16 /usr/lib/liblcms.so -> /usr/lib/liblcms.so.1.0.16 /usr/lib/pkgconfig/lcms.pc /usr/lib/${MACH64}/liblcms.so.1.0.16 /usr/lib/${MACH64}/liblcms.so.1 -> /usr/lib/${MACH64}/liblcms.so.1.0.16 /usr/lib/${MACH64}/liblcms.so -> /usr/lib/${MACH64}/liblcms.so.1.0.16 /usr/lib/${MACH64}/pkgconfig/lcms.pc /usr/share/man/man1/icc2ps.1 /usr/share/man/man1/icclink.1 /usr/share/man/man1/icctrans.1 /usr/share/man/man1/jpegicc.1 /usr/share/man/man1/tifficc.1 /usr/share/man/man1/wtpt.1 This case proposes the integration of LCMS Version 1.17. This version of LCMS [1.17] is thread-safe, 64-bit clean and largefile aware. The 64-bit LCMS library will be delivered with this Integration. By default, LCMS installs its header files under /usr/include. We propose changing this default installation location to a more suitable /usr/include/lcms, for the purpose of avoiding namespace pollution in /usr/include. LCMS provides documentation in UNIX Manual format for Section 1 (User Commands) of the Manual only. It does not provide a Section 3 Manual page for the LCMS API; the documentation for the LCMS API is provided in plaintext format. The plaintext documentation will be used as basis for a new lcms.3 Manual Page, which will be added to, and included with, this Integration. 2.2. Programmatic facilities Access to LCMS' API is provided by one header file, lcms.h: #include A basic application using the LCMS API will, generally, perform the following steps: /* 1. declare an input CMS Profile and an output CMS Profile */ cmsHPROFILE hInProfile; cmsHPROFILE hOutProfile; /* 2. declare a Colorspace Transform */ cmsHTRANSFORM hTransform; /* 3. Initialize the input and output CMS Profiles */ hInProfile = cmsOpenProfileFromFile("HPSJTW.ICM", "r"); hOutProfile = cmsOpenProfileFromFile("sRGBColorSpace.ICM", "r"); /* 4. Initialize the Colorspace Transform */ hTransform = cmsCreateTransform(hInProfile, TYPE_BGR_8, hOutProfile, TYPE_BGR_8, INTENT_PERCEPTUAL, 0); /* 5. Perform Colorspace Transformations */ int i; for (i = 0; i < SOME_MAX_VALUE_WE_HAVE_DETERMINED; i++) { cmsDoTransform(hTransform, YourInputBuffer, YourOutputBuffer, YourBuffersSizeInPixels); } /* 6. Cleanup Colorspace Transform */ cmsDeleteTransform(hTransform); /* 7. Cleanup Input and Output Profiles */ cmsCloseProfile(hInProfile); cmsCloseProfile(hOutProfile); 2.3. Language Bindings LCMS is written in ANSI C. The canonical LCMS distribution also includes Python bindings for LCMS, written in C++. The Python LCMS bindings will be included with this Integration, and will be installed in the canonical Python 'site-packages' directory location. 2.4. Documentation The canonical LCMS release contains documentation in UNIX Manual format, for the User Commands Section (1) only. This documentation set will be included with this Integration. In addition, a Section 3 Manual page [ lcms.3 ], detailing LCMS's API will be provided with this Integration. 3. Interfaces 3.1. Interface stability LCMS's development and release schedules are controlled by a group of developers external to SMI. [1] Although LCMS attempts to maintain API and ABI compatibility between Major releases, no explicit guarantee of compatibility is provided by the LCMS developers. 3.2. Imported interfaces LCMS imports interfaces from the Standard C Library, Standard Math Library and the POSIX Threads Library. The Python LCMS shared module imports Interfaces from the C++ run-time Library [ libCrun.so.1 ]. In addition, the Python Binding shared module also imports interfaces from the Python Library: NAME STABILITY NOTES SUNWPython External PSARC/2005/532 3.3. Exported interfaces NAME STABILITY NOTES SUNWlcms Uncommitted Package Name /usr/bin/icctrans Uncommitted Executable Location /usr/bin/icc2ps Uncommitted Executable Location /usr/bin/icclink Uncommitted Executable Location /usr/bin/jpegicc Uncommitted Executable Location /usr/bin/tifficc Uncommitted Executable Location /usr/bin/tiffdiff Uncommitted Executable Location /usr/bin/wtpt Uncommitted Executable Location /usr/include/lcms Uncommitted Include Directory /usr/include/lcms/icc34.h Uncommitted Header file /usr/include/lcms/lcms.h Uncommitted Header file /usr/lib/liblcms.so.1.0.16 Uncommitted Shared Library /usr/lib/liblcms.so.1 Uncommitted Symbolic Link /usr/lib/liblcms.so Uncommitted Symbolic Link /usr/lib/pkgconfig/lcms.pc Uncommitted Pkg-config Entry /usr/lib/${MACH64}/liblcms.so.1.0.16 Uncommitted Shared Library /usr/lib/${MACH64}/liblcms.so.1 Uncommitted Symbolic Link /usr/lib/${MACH64}/liblcms.so Uncommitted Symbolic Link /usr/lib/${MACH64}/pkgconfig/lcms.pc Uncommitted Pkg-config Entry /usr/share/man/man1/icc2ps.1 Uncommitted Manual Page /usr/share/man/man1/icclink.1 Uncommitted Manual Page /usr/share/man/man1/icctrans.1 Uncommitted Manual Page /usr/share/man/man1/jpegicc.1 Uncommitted Manual Page /usr/share/man/man1/tifficc.1 Uncommitted Manual Page /usr/share/man/man1/wtpt.1 Uncommitted Manual Page /usr/share/man/man3/lcms.3 Uncommitted Manual Page 4. References [1] http://www.littlecms.com/ [2] http://www.color.org/ICC1V42.pdf http://www.color.org/icc_specs2.xalter [3] http://www.libmng.com/ [4] http://sourceforge.net/project/showfiles.php?group_id=12272 [5] http://www.openexr.com/ [6] http://www.srgb.com/