jas_icc.h (15305B)
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) 1999-2000 Image Power, Inc. 11 * Copyright (c) 1999-2000 The University of British Columbia 12 * Copyright (c) 2001-2003 Michael David Adams 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 70 extern "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 213 typedef uint_fast8_t jas_iccuint8_t; 214 typedef uint_fast16_t jas_iccuint16_t; 215 typedef uint_fast32_t jas_iccuint32_t; 216 typedef int_fast32_t jas_iccsint32_t; 217 typedef int_fast32_t jas_iccs15fixed16_t; 218 typedef uint_fast32_t jas_iccu16fixed16_t; 219 typedef uint_fast64_t jas_iccuint64_t; 220 typedef uint_fast32_t jas_iccsig_t; 221 222 typedef jas_iccsig_t jas_icctagsig_t; 223 typedef jas_iccsig_t jas_icctagtype_t; 224 typedef jas_iccsig_t jas_iccattrname_t; 225 226 /* Date/time type. */ 227 typedef 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. */ 237 typedef struct { 238 jas_iccs15fixed16_t x; 239 jas_iccs15fixed16_t y; 240 jas_iccs15fixed16_t z; 241 } jas_iccxyz_t; 242 243 /* Curve type. */ 244 typedef struct { 245 jas_iccuint32_t numents; 246 jas_iccuint16_t *ents; 247 } jas_icccurv_t; 248 249 /* Text description type. */ 250 typedef 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. */ 262 typedef struct { 263 char *string; /* ASCII character string */ 264 } jas_icctxt_t; 265 266 typedef 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 280 typedef 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 294 struct jas_iccattrval_s; 295 296 typedef 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). */ 306 typedef 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. */ 321 typedef 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 340 typedef struct { 341 jas_iccsig_t name; 342 jas_iccattrval_t *val; 343 } jas_iccattr_t; 344 345 typedef struct { 346 int numattrs; 347 int maxattrs; 348 jas_iccattr_t *attrs; 349 } jas_iccattrtab_t; 350 351 typedef 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 359 typedef struct { 360 jas_iccuint32_t numents; 361 jas_icctagtabent_t *ents; 362 } jas_icctagtab_t; 363 364 /* ICC profile type. */ 365 typedef struct { 366 jas_icchdr_t hdr; 367 jas_icctagtab_t tagtab; 368 jas_iccattrtab_t *attrtab; 369 } jas_iccprof_t; 370 371 typedef struct { 372 jas_iccuint32_t type; 373 jas_iccattrvalops_t ops; 374 } jas_iccattrvalinfo_t; 375 376 jas_iccprof_t *jas_iccprof_load(jas_stream_t *in); 377 int jas_iccprof_save(jas_iccprof_t *prof, jas_stream_t *out); 378 void jas_iccprof_destroy(jas_iccprof_t *prof); 379 jas_iccattrval_t *jas_iccprof_getattr(jas_iccprof_t *prof, 380 jas_iccattrname_t name); 381 int jas_iccprof_setattr(jas_iccprof_t *prof, jas_iccattrname_t name, 382 jas_iccattrval_t *val); 383 void jas_iccprof_dump(jas_iccprof_t *prof, FILE *out); 384 jas_iccprof_t *jas_iccprof_copy(jas_iccprof_t *prof); 385 int jas_iccprof_gethdr(jas_iccprof_t *prof, jas_icchdr_t *hdr); 386 int jas_iccprof_sethdr(jas_iccprof_t *prof, jas_icchdr_t *hdr); 387 388 void jas_iccattrval_destroy(jas_iccattrval_t *attrval); 389 void jas_iccattrval_dump(jas_iccattrval_t *attrval, FILE *out); 390 int jas_iccattrval_allowmodify(jas_iccattrval_t **attrval); 391 jas_iccattrval_t *jas_iccattrval_clone(jas_iccattrval_t *attrval); 392 jas_iccattrval_t *jas_iccattrval_create(jas_iccuint32_t type); 393 394 void jas_iccattrtab_dump(jas_iccattrtab_t *attrtab, FILE *out); 395 396 extern uchar jas_iccprofdata_srgb[]; 397 extern int jas_iccprofdata_srgblen; 398 extern uchar jas_iccprofdata_sgray[]; 399 extern int jas_iccprofdata_sgraylen; 400 jas_iccprof_t *jas_iccprof_createfrombuf(uchar *buf, int len); 401 jas_iccprof_t *jas_iccprof_createfromclrspc(int clrspc); 402 403 #ifdef __cplusplus 404 } 405 #endif 406 407 #endif