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