?
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



Reply via email to