1/* 2 * Copyright (c) 2002-2003 Michael David Adams. 3 * All rights reserved. 4 */ 5 6/* __START_OF_JASPER_LICENSE__ 7 * 8 * JasPer License Version 2.0 9 * 10 * Copyright (c) 2001-2006 Michael David Adams 11 * Copyright (c) 1999-2000 Image Power, Inc. 12 * Copyright (c) 1999-2000 The University of British Columbia 13 * 14 * All rights reserved. 15 * 16 * Permission is hereby granted, free of charge, to any person (the 17 * "User") obtaining a copy of this software and associated documentation 18 * files (the "Software"), to deal in the Software without restriction, 19 * including without limitation the rights to use, copy, modify, merge, 20 * publish, distribute, and/or sell copies of the Software, and to permit 21 * persons to whom the Software is furnished to do so, subject to the 22 * following conditions: 23 * 24 * 1. The above copyright notices and this permission notice (which 25 * includes the disclaimer below) shall be included in all copies or 26 * substantial portions of the Software. 27 * 28 * 2. The name of a copyright holder shall not be used to endorse or 29 * promote products derived from the Software without specific prior 30 * written permission. 31 * 32 * THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS 33 * LICENSE. NO USE OF THE SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER 34 * THIS DISCLAIMER. THE SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 35 * "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 36 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 37 * PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO 38 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL 39 * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING 40 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, 41 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 42 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. NO ASSURANCES ARE 43 * PROVIDED BY THE COPYRIGHT HOLDERS THAT THE SOFTWARE DOES NOT INFRINGE 44 * THE PATENT OR OTHER INTELLECTUAL PROPERTY RIGHTS OF ANY OTHER ENTITY. 45 * EACH COPYRIGHT HOLDER DISCLAIMS ANY LIABILITY TO THE USER FOR CLAIMS 46 * BROUGHT BY ANY OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL 47 * PROPERTY RIGHTS OR OTHERWISE. AS A CONDITION TO EXERCISING THE RIGHTS 48 * GRANTED HEREUNDER, EACH USER HEREBY ASSUMES SOLE RESPONSIBILITY TO SECURE 49 * ANY OTHER INTELLECTUAL PROPERTY RIGHTS NEEDED, IF ANY. THE SOFTWARE 50 * IS NOT FAULT-TOLERANT AND IS NOT INTENDED FOR USE IN MISSION-CRITICAL 51 * SYSTEMS, SUCH AS THOSE USED IN THE OPERATION OF NUCLEAR FACILITIES, 52 * AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL 53 * SYSTEMS, DIRECT LIFE SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH 54 * THE FAILURE OF THE SOFTWARE OR SYSTEM COULD LEAD DIRECTLY TO DEATH, 55 * PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH 56 * RISK ACTIVITIES"). THE COPYRIGHT HOLDERS SPECIFICALLY DISCLAIM ANY 57 * EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR HIGH RISK ACTIVITIES. 58 * 59 * __END_OF_JASPER_LICENSE__ 60 */ 61 62#ifndef JAS_ICC_H 63#define JAS_ICC_H 64 65#include <jasper/jas_config.h> 66#include <jasper/jas_types.h> 67#include <jasper/jas_stream.h> 68 69#ifdef __cplusplus 70extern "C" { 71#endif 72 73/* Profile file signature. */ 74#define JAS_ICC_MAGIC 0x61637370 75 76#define JAS_ICC_HDRLEN 128 77 78/* Profile/device class signatures. */ 79#define JAS_ICC_CLAS_IN 0x73636e72 /* input device */ 80#define JAS_ICC_CLAS_DPY 0x6d6e7472 /* display device */ 81#define JAS_ICC_CLAS_OUT 0x70727472 /* output device */ 82#define JAS_ICC_CLAS_LNK 0x6c696e6b /* device link */ 83#define JAS_ICC_CLAS_CNV 0x73706163 /* color space conversion */ 84#define JAS_ICC_CLAS_ABS 0x61627374 /* abstract */ 85#define JAS_ICC_CLAS_NAM 0x6e6d636c /* named color */ 86 87/* Color space signatures. */ 88#define JAS_ICC_COLORSPC_XYZ 0x58595a20 /* XYZ */ 89#define JAS_ICC_COLORSPC_LAB 0x4c616220 /* LAB */ 90#define JAS_ICC_COLORSPC_LUV 0x4c757620 /* LUV */ 91#define JAS_ICC_COLORSPC_YCBCR 0x59436272 /* YCbCr */ 92#define JAS_ICC_COLORSPC_YXY 0x59787920 /* Yxy */ 93#define JAS_ICC_COLORSPC_RGB 0x52474220 /* RGB */ 94#define JAS_ICC_COLORSPC_GRAY 0x47524159 /* Gray */ 95#define JAS_ICC_COLORSPC_HSV 0x48535620 /* HSV */ 96#define JAS_ICC_COLORSPC_HLS 0x484c5320 /* HLS */ 97#define JAS_ICC_COLORSPC_CMYK 0x434d594b /* CMYK */ 98#define JAS_ICC_COLORSPC_CMY 0x434d5920 /* CMY */ 99#define JAS_ICC_COLORSPC_2 0x32434c52 /* 2 channel color */ 100#define JAS_ICC_COLORSPC_3 0x33434c52 /* 3 channel color */ 101#define JAS_ICC_COLORSPC_4 0x34434c52 /* 4 channel color */ 102#define JAS_ICC_COLORSPC_5 0x35434c52 /* 5 channel color */ 103#define JAS_ICC_COLORSPC_6 0x36434c52 /* 6 channel color */ 104#define JAS_ICC_COLORSPC_7 0x37434c52 /* 7 channel color */ 105#define JAS_ICC_COLORSPC_8 0x38434c52 /* 8 channel color */ 106#define JAS_ICC_COLORSPC_9 0x39434c52 /* 9 channel color */ 107#define JAS_ICC_COLORSPC_10 0x41434c52 /* 10 channel color */ 108#define JAS_ICC_COLORSPC_11 0x42434c52 /* 11 channel color */ 109#define JAS_ICC_COLORSPC_12 0x43434c52 /* 12 channel color */ 110#define JAS_ICC_COLORSPC_13 0x44434c52 /* 13 channel color */ 111#define JAS_ICC_COLORSPC_14 0x45434c52 /* 14 channel color */ 112#define JAS_ICC_COLORSPC_15 0x46434c52 /* 15 channel color */ 113 114/* Profile connection color space (PCS) signatures. */ 115#define JAS_ICC_REFCOLORSPC_XYZ 0x58595a20 /* CIE XYZ */ 116#define JAS_ICC_REFCOLORSPC_LAB 0x4c616220 /* CIE Lab */ 117 118/* Primary platform signatures. */ 119#define JAS_ICC_PLATFORM_APPL 0x4150504c /* Apple Computer */ 120#define JAS_ICC_PLATFORM_MSFT 0x4d534654 /* Microsoft */ 121#define JAS_ICC_PLATFORM_SGI 0x53474920 /* Silicon Graphics */ 122#define JAS_ICC_PLATFORM_SUNW 0x53554e57 /* Sun Microsystems */ 123#define JAS_ICC_PLATFORM_TGNT 0x54474e54 /* Taligent */ 124 125/* Profile flags. */ 126#define JAS_ICC_FLAGS_EMBED 0x01 /* embedded */ 127#define JAS_ICC_FLAGS_NOSEP 0x02 /* no separate use */ 128 129/* Attributes. */ 130#define JAS_ICC_ATTR_TRANS 0x01 /* transparent */ 131#define JAS_ICC_ATTR_MATTE 0x02 /* matte */ 132 133/* Rendering intents. */ 134#define JAS_ICC_INTENT_PER 0 /* perceptual */ 135#define JAS_ICC_INTENT_REL 1 /* relative colorimetric */ 136#define JAS_ICC_INTENT_SAT 2 /* saturation */ 137#define JAS_ICC_INTENT_ABS 3 /* absolute colorimetric */ 138 139/* Tag signatures. */ 140#define JAS_ICC_TAG_ATOB0 0x41324230 /* */ 141#define JAS_ICC_TAG_ATOB1 0x41324231 /* */ 142#define JAS_ICC_TAG_ATOB2 0x41324232 /* */ 143#define JAS_ICC_TAG_BLUMATCOL 0x6258595a /* */ 144#define JAS_ICC_TAG_BLUTRC 0x62545243 /* */ 145#define JAS_ICC_TAG_BTOA0 0x42324130 /* */ 146#define JAS_ICC_TAG_BTOA1 0x42324131 /* */ 147#define JAS_ICC_TAG_BTOA2 0x42324132 /* */ 148#define JAS_ICC_TAG_CALTIME 0x63616c74 /* */ 149#define JAS_ICC_TAG_CHARTARGET 0x74617267 /* */ 150#define JAS_ICC_TAG_CPYRT 0x63707274 /* */ 151#define JAS_ICC_TAG_CRDINFO 0x63726469 /* */ 152#define JAS_ICC_TAG_DEVMAKERDESC 0x646d6e64 /* */ 153#define JAS_ICC_TAG_DEVMODELDESC 0x646d6464 /* */ 154#define JAS_ICC_TAG_DEVSET 0x64657673 /* */ 155#define JAS_ICC_TAG_GAMUT 0x67616d74 /* */ 156#define JAS_ICC_TAG_GRYTRC 0x6b545243 /* */ 157#define JAS_ICC_TAG_GRNMATCOL 0x6758595a /* */ 158#define JAS_ICC_TAG_GRNTRC 0x67545243 /* */ 159#define JAS_ICC_TAG_LUM 0x6c756d69 /* */ 160#define JAS_ICC_TAG_MEASURE 0x6d656173 /* */ 161#define JAS_ICC_TAG_MEDIABLKPT 0x626b7074 /* */ 162#define JAS_ICC_TAG_MEDIAWHIPT 0x77747074 /* */ 163#define JAS_ICC_TAG_NAMCOLR 0x6e636f6c /* */ 164#define JAS_ICC_TAG_NAMCOLR2 0x6e636c32 /* */ 165#define JAS_ICC_TAG_OUTRESP 0x72657370 /* */ 166#define JAS_ICC_TAG_PREVIEW0 0x70726530 /* */ 167#define JAS_ICC_TAG_PREVIEW1 0x70726531 /* */ 168#define JAS_ICC_TAG_PREVIEW2 0x70726532 /* */ 169#define JAS_ICC_TAG_PROFDESC 0x64657363 /* */ 170#define JAS_ICC_TAG_PROFSEQDESC 0x70736571 /* */ 171#define JAS_ICC_TAG_PSDCRD0 0x70736430 /* */ 172#define JAS_ICC_TAG_PSCRDD1 0x70736431 /* */ 173#define JAS_ICC_TAG_PSCRDD2 0x70736432 /* */ 174#define JAS_ICC_TAG_PSCRDD3 0x70736433 /* */ 175#define JAS_ICC_TAG_PS2CSA 0x70733273 /* */ 176#define JAS_ICC_TAG_PS2RENINTENT 0x70733269 /* */ 177#define JAS_ICC_TAG_REDMATCOL 0x7258595a /* */ 178#define JAS_ICC_TAG_REDTRC 0x72545243 /* */ 179#define JAS_ICC_TAG_SCRNGDES 0x73637264 /* */ 180#define JAS_ICC_TAG_SCRNG 0x7363726e /* */ 181#define JAS_ICC_TAG_TECH 0x74656368 /* */ 182#define JAS_ICC_TAG_UCRBG 0x62666420 /* */ 183#define JAS_ICC_TAG_VIEWCONDDESC 0x76756564 /* */ 184#define JAS_ICC_TAG_VIEWCOND 0x76696577 /* */ 185 186/* Type signatures. */ 187#define JAS_ICC_TYPE_CRDINFO 0x63726469 /* CRD information */ 188#define JAS_ICC_TYPE_CURV 0x63757276 /* curve */ 189#define JAS_ICC_TYPE_DATA 0x64617461 /* data */ 190#define JAS_ICC_TYPE_TIME 0x6474696d /* date/time */ 191#define JAS_ICC_TYPE_DEVSET 0x64657673 /* device settings */ 192#define JAS_ICC_TYPE_LUT16 0x6d667432 /* */ 193#define JAS_ICC_TYPE_LUT8 0x6d667431 /* */ 194#define JAS_ICC_TYPE_MEASURE 0x6d656173 /* */ 195#define JAS_ICC_TYPE_NAMCOLR 0x6e636f6c /* */ 196#define JAS_ICC_TYPE_NAMCOLR2 0x6e636c32 /* */ 197#define JAS_ICC_TYPE_PROFSEQDESC 0x70736571 /* profile sequence description */ 198#define JAS_ICC_TYPE_RESPCURVSET16 0x72637332 /* response curve set 16 */ 199#define JAS_ICC_TYPE_SF32 0x73663332 /* signed 32-bit fixed-point */ 200#define JAS_ICC_TYPE_SCRNG 0x7363726e /* screening */ 201#define JAS_ICC_TYPE_SIG 0x73696720 /* signature */ 202#define JAS_ICC_TYPE_TXTDESC 0x64657363 /* text description */ 203#define JAS_ICC_TYPE_TXT 0x74657874 /* text */ 204#define JAS_ICC_TYPE_UF32 0x75663332 /* unsigned 32-bit fixed-point */ 205#define JAS_ICC_TYPE_UCRBG 0x62666420 /* */ 206#define JAS_ICC_TYPE_UI16 0x75693136 /* */ 207#define JAS_ICC_TYPE_UI32 0x75693332 /* */ 208#define JAS_ICC_TYPE_UI8 0x75693038 /* */ 209#define JAS_ICC_TYPE_UI64 0x75693634 /* */ 210#define JAS_ICC_TYPE_VIEWCOND 0x76696577 /* */ 211#define JAS_ICC_TYPE_XYZ 0x58595a20 /* XYZ */ 212 213typedef uint_fast8_t jas_iccuint8_t; 214typedef uint_fast16_t jas_iccuint16_t; 215typedef uint_fast32_t jas_iccuint32_t; 216typedef int_fast32_t jas_iccsint32_t; 217typedef int_fast32_t jas_iccs15fixed16_t; 218typedef uint_fast32_t jas_iccu16fixed16_t; 219typedef uint_fast64_t jas_iccuint64_t; 220typedef uint_fast32_t jas_iccsig_t; 221 222typedef jas_iccsig_t jas_icctagsig_t; 223typedef jas_iccsig_t jas_icctagtype_t; 224typedef jas_iccsig_t jas_iccattrname_t; 225 226/* Date/time type. */ 227typedef struct { 228 jas_iccuint16_t year; 229 jas_iccuint16_t month; 230 jas_iccuint16_t day; 231 jas_iccuint16_t hour; 232 jas_iccuint16_t min; 233 jas_iccuint16_t sec; 234} jas_icctime_t; 235 236/* XYZ type. */ 237typedef struct { 238 jas_iccs15fixed16_t x; 239 jas_iccs15fixed16_t y; 240 jas_iccs15fixed16_t z; 241} jas_iccxyz_t; 242 243/* Curve type. */ 244typedef struct { 245 jas_iccuint32_t numents; 246 jas_iccuint16_t *ents; 247} jas_icccurv_t; 248 249/* Text description type. */ 250typedef struct { 251 jas_iccuint32_t asclen; 252 char *ascdata; /* ASCII invariant description */ 253 jas_iccuint32_t uclangcode; /* Unicode language code */ 254 jas_iccuint32_t uclen; /* Unicode localizable description count */ 255 uchar *ucdata; /* Unicode localizable description */ 256 jas_iccuint16_t sccode; /* ScriptCode code */ 257 jas_iccuint8_t maclen; /* Localizable Macintosh description count */ 258 uchar macdata[69]; /* Localizable Macintosh description */ 259} jas_icctxtdesc_t; 260 261/* Text type. */ 262typedef struct { 263 char *string; /* ASCII character string */ 264} jas_icctxt_t; 265 266typedef struct { 267 jas_iccuint8_t numinchans; 268 jas_iccuint8_t numoutchans; 269 jas_iccsint32_t e[3][3]; 270 jas_iccuint8_t clutlen; 271 jas_iccuint8_t *clut; 272 jas_iccuint16_t numintabents; 273 jas_iccuint8_t **intabs; 274 jas_iccuint8_t *intabsbuf; 275 jas_iccuint16_t numouttabents; 276 jas_iccuint8_t **outtabs; 277 jas_iccuint8_t *outtabsbuf; 278} jas_icclut8_t; 279 280typedef struct { 281 jas_iccuint8_t numinchans; 282 jas_iccuint8_t numoutchans; 283 jas_iccsint32_t e[3][3]; 284 jas_iccuint8_t clutlen; 285 jas_iccuint16_t *clut; 286 jas_iccuint16_t numintabents; 287 jas_iccuint16_t **intabs; 288 jas_iccuint16_t *intabsbuf; 289 jas_iccuint16_t numouttabents; 290 jas_iccuint16_t **outtabs; 291 jas_iccuint16_t *outtabsbuf; 292} jas_icclut16_t; 293 294struct jas_iccattrval_s; 295 296typedef struct { 297 void (*destroy)(struct jas_iccattrval_s *); 298 int (*copy)(struct jas_iccattrval_s *, struct jas_iccattrval_s *); 299 int (*input)(struct jas_iccattrval_s *, jas_stream_t *, int); 300 int (*output)(struct jas_iccattrval_s *, jas_stream_t *); 301 int (*getsize)(struct jas_iccattrval_s *); 302 void (*dump)(struct jas_iccattrval_s *, FILE *); 303} jas_iccattrvalops_t; 304 305/* Attribute value type (type and value information). */ 306typedef struct jas_iccattrval_s { 307 int refcnt; /* reference count */ 308 jas_iccsig_t type; /* type */ 309 jas_iccattrvalops_t *ops; /* type-dependent operations */ 310 union { 311 jas_iccxyz_t xyz; 312 jas_icccurv_t curv; 313 jas_icctxtdesc_t txtdesc; 314 jas_icctxt_t txt; 315 jas_icclut8_t lut8; 316 jas_icclut16_t lut16; 317 } data; /* value */ 318} jas_iccattrval_t; 319 320/* Header type. */ 321typedef struct { 322 jas_iccuint32_t size; /* profile size */ 323 jas_iccsig_t cmmtype; /* CMM type signature */ 324 jas_iccuint32_t version; /* profile version */ 325 jas_iccsig_t clas; /* profile/device class signature */ 326 jas_iccsig_t colorspc; /* color space of data */ 327 jas_iccsig_t refcolorspc; /* profile connection space */ 328 jas_icctime_t ctime; /* creation time */ 329 jas_iccsig_t magic; /* profile file signature */ 330 jas_iccsig_t platform; /* primary platform */ 331 jas_iccuint32_t flags; /* profile flags */ 332 jas_iccsig_t maker; /* device manufacturer signature */ 333 jas_iccsig_t model; /* device model signature */ 334 jas_iccuint64_t attr; /* device setup attributes */ 335 jas_iccsig_t intent; /* rendering intent */ 336 jas_iccxyz_t illum; /* illuminant */ 337 jas_iccsig_t creator; /* profile creator signature */ 338} jas_icchdr_t; 339 340typedef struct { 341 jas_iccsig_t name; 342 jas_iccattrval_t *val; 343} jas_iccattr_t; 344 345typedef struct { 346 int numattrs; 347 int maxattrs; 348 jas_iccattr_t *attrs; 349} jas_iccattrtab_t; 350 351typedef struct jas_icctagtabent_s { 352 jas_iccuint32_t tag; 353 jas_iccuint32_t off; 354 jas_iccuint32_t len; 355 void *data; 356 struct jas_icctagtabent_s *first; 357} jas_icctagtabent_t; 358 359typedef struct { 360 jas_iccuint32_t numents; 361 jas_icctagtabent_t *ents; 362} jas_icctagtab_t; 363 364/* ICC profile type. */ 365typedef struct { 366 jas_icchdr_t hdr; 367 jas_icctagtab_t tagtab; 368 jas_iccattrtab_t *attrtab; 369} jas_iccprof_t; 370 371typedef struct { 372 jas_iccuint32_t type; 373 jas_iccattrvalops_t ops; 374} jas_iccattrvalinfo_t; 375 376jas_iccprof_t *jas_iccprof_load(jas_stream_t *in); 377int jas_iccprof_save(jas_iccprof_t *prof, jas_stream_t *out); 378void jas_iccprof_destroy(jas_iccprof_t *prof); 379jas_iccattrval_t *jas_iccprof_getattr(jas_iccprof_t *prof, 380 jas_iccattrname_t name); 381int jas_iccprof_setattr(jas_iccprof_t *prof, jas_iccattrname_t name, 382 jas_iccattrval_t *val); 383void jas_iccprof_dump(jas_iccprof_t *prof, FILE *out); 384jas_iccprof_t *jas_iccprof_copy(jas_iccprof_t *prof); 385int jas_iccprof_gethdr(jas_iccprof_t *prof, jas_icchdr_t *hdr); 386int jas_iccprof_sethdr(jas_iccprof_t *prof, jas_icchdr_t *hdr); 387 388void jas_iccattrval_destroy(jas_iccattrval_t *attrval); 389void jas_iccattrval_dump(jas_iccattrval_t *attrval, FILE *out); 390int jas_iccattrval_allowmodify(jas_iccattrval_t **attrval); 391jas_iccattrval_t *jas_iccattrval_clone(jas_iccattrval_t *attrval); 392jas_iccattrval_t *jas_iccattrval_create(jas_iccuint32_t type); 393 394void jas_iccattrtab_dump(jas_iccattrtab_t *attrtab, FILE *out); 395 396extern uchar jas_iccprofdata_srgb[]; 397extern int jas_iccprofdata_srgblen; 398extern uchar jas_iccprofdata_sgray[]; 399extern int jas_iccprofdata_sgraylen; 400jas_iccprof_t *jas_iccprof_createfrombuf(uchar *buf, int len); 401jas_iccprof_t *jas_iccprof_createfromclrspc(int clrspc); 402 403#ifdef __cplusplus 404} 405#endif 406 407#endif 408