?
Including LCMS [ Little Color Management System ] with Solaris
Stefan Teleman <Stefan.Teleman at Sun.COM>
7 November 2007
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. [6] 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 <lcms.h>
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/
--
Stefan Teleman
Sun Microsystems, Inc.
Stefan.Teleman at Sun.COM