15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * iccprofile.h
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This file provides code to read and write International Color Consortium
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (ICC) device profiles embedded in JFIF JPEG image files.  The ICC has
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * defined a standard format for including such data in JPEG "APP2" markers.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The code given here does not know anything about the internal structure
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the ICC profile data; it just knows how to put the profile data into
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a JPEG file being written, or get it back out when reading.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This code depends on new features added to the IJG JPEG library as of
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IJG release 6b; it will not compile or work with older IJG versions.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: this code would need surgery to work on 16-bit-int machines
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * with ICC profiles exceeding 64K bytes in size.  See iccprofile.c
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for details.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h>		/* needed to define "FILE", "NULL" */
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_SYSTEM_LIBJPEG)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <jpeglib.h>
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jpeglib.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This routine writes the given ICC profile data into a JPEG file.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * It *must* be called AFTER calling jpeg_start_compress() and BEFORE
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the first call to jpeg_write_scanlines().
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (This ordering ensures that the APP2 marker(s) will appear after the
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SOI and JFIF or Adobe markers, but before all else.)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern void write_icc_profile JPP((j_compress_ptr cinfo,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   const JOCTET *icc_data_ptr,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   unsigned int icc_data_len));
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reading a JPEG file that may contain an ICC profile requires two steps:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1. After jpeg_create_decompress() but before jpeg_read_header(),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    call setup_read_icc_profile().  This routine tells the IJG library
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    to save in memory any APP2 markers it may find in the file.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2. After jpeg_read_header(), call read_icc_profile() to find out
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    whether there was a profile and obtain it if so.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Prepare for reading an ICC profile
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern void setup_read_icc_profile JPP((j_decompress_ptr cinfo));
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See if there was an ICC profile in the JPEG file being read;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if so, reassemble and return the profile data.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TRUE is returned if an ICC profile was found, FALSE if not.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If TRUE is returned, *icc_data_ptr is set to point to the
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * returned data, and *icc_data_len is set to its length.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IMPORTANT: the data at **icc_data_ptr has been allocated with malloc()
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and must be freed by the caller with free() when the caller no longer
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * needs it.  (Alternatively, we could write this routine to use the
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IJG library's memory allocator, so that the data would be freed implicitly
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * at jpeg_finish_decompress() time.  But it seems likely that many apps
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * will prefer to have the data stick around after decompression finishes.)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern boolean read_icc_profile JPP((j_decompress_ptr cinfo,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				     JOCTET **icc_data_ptr,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				     unsigned int *icc_data_len));
79