jas_image.h (18649B)
1 /* 2 * Copyright (c) 1999-2000 Image Power, Inc. and the University of 3 * British Columbia. 4 * Copyright (c) 2001-2003 Michael David Adams. 5 * All rights reserved. 6 */ 7 8 /* __START_OF_JASPER_LICENSE__ 9 * 10 * JasPer License Version 2.0 11 * 12 * Copyright (c) 1999-2000 Image Power, Inc. 13 * Copyright (c) 1999-2000 The University of British Columbia 14 * Copyright (c) 2001-2003 Michael David Adams 15 * 16 * All rights reserved. 17 * 18 * Permission is hereby granted, free of charge, to any person (the 19 * "User") obtaining a copy of this software and associated documentation 20 * files (the "Software"), to deal in the Software without restriction, 21 * including without limitation the rights to use, copy, modify, merge, 22 * publish, distribute, and/or sell copies of the Software, and to permit 23 * persons to whom the Software is furnished to do so, subject to the 24 * following conditions: 25 * 26 * 1. The above copyright notices and this permission notice (which 27 * includes the disclaimer below) shall be included in all copies or 28 * substantial portions of the Software. 29 * 30 * 2. The name of a copyright holder shall not be used to endorse or 31 * promote products derived from the Software without specific prior 32 * written permission. 33 * 34 * THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS 35 * LICENSE. NO USE OF THE SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER 36 * THIS DISCLAIMER. THE SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 37 * "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 38 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 39 * PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO 40 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL 41 * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING 42 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, 43 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 44 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. NO ASSURANCES ARE 45 * PROVIDED BY THE COPYRIGHT HOLDERS THAT THE SOFTWARE DOES NOT INFRINGE 46 * THE PATENT OR OTHER INTELLECTUAL PROPERTY RIGHTS OF ANY OTHER ENTITY. 47 * EACH COPYRIGHT HOLDER DISCLAIMS ANY LIABILITY TO THE USER FOR CLAIMS 48 * BROUGHT BY ANY OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL 49 * PROPERTY RIGHTS OR OTHERWISE. AS A CONDITION TO EXERCISING THE RIGHTS 50 * GRANTED HEREUNDER, EACH USER HEREBY ASSUMES SOLE RESPONSIBILITY TO SECURE 51 * ANY OTHER INTELLECTUAL PROPERTY RIGHTS NEEDED, IF ANY. THE SOFTWARE 52 * IS NOT FAULT-TOLERANT AND IS NOT INTENDED FOR USE IN MISSION-CRITICAL 53 * SYSTEMS, SUCH AS THOSE USED IN THE OPERATION OF NUCLEAR FACILITIES, 54 * AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL 55 * SYSTEMS, DIRECT LIFE SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH 56 * THE FAILURE OF THE SOFTWARE OR SYSTEM COULD LEAD DIRECTLY TO DEATH, 57 * PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH 58 * RISK ACTIVITIES"). THE COPYRIGHT HOLDERS SPECIFICALLY DISCLAIM ANY 59 * EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR HIGH RISK ACTIVITIES. 60 * 61 * __END_OF_JASPER_LICENSE__ 62 */ 63 64 /* 65 * Image Class 66 * 67 * $Id: jas_image.h 1918 2005-07-24 14:12:08Z baford $ 68 */ 69 70 #ifndef JAS_IMAGE_H 71 #define JAS_IMAGE_H 72 73 /******************************************************************************\ 74 * Includes. 75 \******************************************************************************/ 76 77 #include <jasper/jas_config.h> 78 #include <jasper/jas_stream.h> 79 #include <jasper/jas_seq.h> 80 #include <jasper/jas_cm.h> 81 #include <stdio.h> 82 83 #ifdef __cplusplus 84 extern "C" { 85 #endif 86 87 /******************************************************************************\ 88 * Constants. 89 \******************************************************************************/ 90 91 /* 92 * Miscellaneous constants. 93 */ 94 95 /* The threshold at which image data is no longer stored in memory. */ 96 #define JAS_IMAGE_INMEMTHRESH (16 * 1024 * 1024) 97 98 /* 99 * Component types 100 */ 101 102 #define JAS_IMAGE_CT_UNKNOWN 0x10000 103 #define JAS_IMAGE_CT_COLOR(n) ((n) & 0x7fff) 104 #define JAS_IMAGE_CT_OPACITY 0x08000 105 106 #define JAS_IMAGE_CT_RGB_R 0 107 #define JAS_IMAGE_CT_RGB_G 1 108 #define JAS_IMAGE_CT_RGB_B 2 109 110 #define JAS_IMAGE_CT_YCBCR_Y 0 111 #define JAS_IMAGE_CT_YCBCR_CB 1 112 #define JAS_IMAGE_CT_YCBCR_CR 2 113 114 #define JAS_IMAGE_CT_GRAY_Y 0 115 116 /******************************************************************************\ 117 * Simple types. 118 \******************************************************************************/ 119 120 /* Image coordinate. */ 121 typedef int_fast32_t jas_image_coord_t; 122 123 /* Color space (e.g., RGB, YCbCr). */ 124 typedef int_fast16_t jas_image_colorspc_t; 125 126 /* Component type (e.g., color, opacity). */ 127 typedef int_fast32_t jas_image_cmpttype_t; 128 129 /* Component sample data format (e.g., real/integer, signedness, precision). */ 130 typedef int_fast16_t jas_image_smpltype_t; 131 132 /******************************************************************************\ 133 * Image class and supporting classes. 134 \******************************************************************************/ 135 136 /* Image component class. */ 137 138 typedef struct { 139 140 jas_image_coord_t tlx_; 141 /* The x-coordinate of the top-left corner of the component. */ 142 143 jas_image_coord_t tly_; 144 /* The y-coordinate of the top-left corner of the component. */ 145 146 jas_image_coord_t hstep_; 147 /* The horizontal sampling period in units of the reference grid. */ 148 149 jas_image_coord_t vstep_; 150 /* The vertical sampling period in units of the reference grid. */ 151 152 jas_image_coord_t width_; 153 /* The component width in samples. */ 154 155 jas_image_coord_t height_; 156 /* The component height in samples. */ 157 158 #ifdef FIX_ME 159 int smpltype_; 160 #else 161 int prec_; 162 /* The precision of the sample data (i.e., the number of bits per 163 sample). If the samples are signed values, this quantity 164 includes the sign bit. */ 165 166 int sgnd_; 167 /* The signedness of the sample data. */ 168 #endif 169 170 jas_stream_t *stream_; 171 /* The stream containing the component data. */ 172 173 int cps_; 174 /* The number of characters per sample in the stream. */ 175 176 jas_image_cmpttype_t type_; 177 /* The type of component (e.g., opacity, red, green, blue, luma). */ 178 179 } jas_image_cmpt_t; 180 181 /* Image class. */ 182 183 typedef struct { 184 185 jas_image_coord_t tlx_; 186 /* The x-coordinate of the top-left corner of the image bounding box. */ 187 188 jas_image_coord_t tly_; 189 /* The y-coordinate of the top-left corner of the image bounding box. */ 190 191 jas_image_coord_t brx_; 192 /* The x-coordinate of the bottom-right corner of the image bounding 193 box (plus one). */ 194 195 jas_image_coord_t bry_; 196 /* The y-coordinate of the bottom-right corner of the image bounding 197 box (plus one). */ 198 199 int numcmpts_; 200 /* The number of components. */ 201 202 int maxcmpts_; 203 /* The maximum number of components that this image can have (i.e., the 204 allocated size of the components array). */ 205 206 jas_image_cmpt_t **cmpts_; 207 /* Per-component information. */ 208 209 jas_clrspc_t clrspc_; 210 211 jas_cmprof_t *cmprof_; 212 213 bool inmem_; 214 215 } jas_image_t; 216 217 /* Component parameters class. */ 218 /* This data type exists solely/mainly for the purposes of the 219 jas_image_create function. */ 220 221 typedef struct { 222 223 jas_image_coord_t tlx; 224 /* The x-coordinate of the top-left corner of the component. */ 225 226 jas_image_coord_t tly; 227 /* The y-coordinate of the top-left corner of the component. */ 228 229 jas_image_coord_t hstep; 230 /* The horizontal sampling period in units of the reference grid. */ 231 232 jas_image_coord_t vstep; 233 /* The vertical sampling period in units of the reference grid. */ 234 235 jas_image_coord_t width; 236 /* The width of the component in samples. */ 237 238 jas_image_coord_t height; 239 /* The height of the component in samples. */ 240 241 #ifdef FIX_ME 242 int smpltype; 243 #else 244 int prec; 245 /* The precision of the component sample data. */ 246 247 int sgnd; 248 /* The signedness of the component sample data. */ 249 #endif 250 251 } jas_image_cmptparm_t; 252 253 /******************************************************************************\ 254 * File format related classes. 255 \******************************************************************************/ 256 257 #define JAS_IMAGE_MAXFMTS 32 258 /* The maximum number of image data formats supported. */ 259 260 /* Image format-dependent operations. */ 261 262 typedef struct { 263 264 jas_image_t *(*decode)(jas_stream_t *in, char *opts); 265 /* Decode image data from a stream. */ 266 267 int (*encode)(jas_image_t *image, jas_stream_t *out, char *opts); 268 /* Encode image data to a stream. */ 269 270 int (*validate)(jas_stream_t *in); 271 /* Determine if stream data is in a particular format. */ 272 273 } jas_image_fmtops_t; 274 275 /* Image format information. */ 276 277 typedef struct { 278 279 int id; 280 /* The ID for this format. */ 281 282 char *name; 283 /* The name by which this format is identified. */ 284 285 char *ext; 286 /* The file name extension associated with this format. */ 287 288 char *desc; 289 /* A brief description of the format. */ 290 291 jas_image_fmtops_t ops; 292 /* The operations for this format. */ 293 294 } jas_image_fmtinfo_t; 295 296 /******************************************************************************\ 297 * Image operations. 298 \******************************************************************************/ 299 300 /* Create an image. */ 301 jas_image_t *jas_image_create(int numcmpts, 302 jas_image_cmptparm_t *cmptparms, jas_clrspc_t clrspc); 303 304 /* Create an "empty" image. */ 305 jas_image_t *jas_image_create0(void); 306 307 /* Clone an image. */ 308 jas_image_t *jas_image_copy(jas_image_t *image); 309 310 /* Deallocate any resources associated with an image. */ 311 void jas_image_destroy(jas_image_t *image); 312 313 /* Get the width of the image in units of the image reference grid. */ 314 #define jas_image_width(image) \ 315 ((image)->brx_ - (image)->tlx_) 316 317 /* Get the height of the image in units of the image reference grid. */ 318 #define jas_image_height(image) \ 319 ((image)->bry_ - (image)->tly_) 320 321 /* Get the x-coordinate of the top-left corner of the image bounding box 322 on the reference grid. */ 323 #define jas_image_tlx(image) \ 324 ((image)->tlx_) 325 326 /* Get the y-coordinate of the top-left corner of the image bounding box 327 on the reference grid. */ 328 #define jas_image_tly(image) \ 329 ((image)->tly_) 330 331 /* Get the x-coordinate of the bottom-right corner of the image bounding box 332 on the reference grid (plus one). */ 333 #define jas_image_brx(image) \ 334 ((image)->brx_) 335 336 /* Get the y-coordinate of the bottom-right corner of the image bounding box 337 on the reference grid (plus one). */ 338 #define jas_image_bry(image) \ 339 ((image)->bry_) 340 341 /* Get the number of image components. */ 342 #define jas_image_numcmpts(image) \ 343 ((image)->numcmpts_) 344 345 /* Get the color model used by the image. */ 346 #define jas_image_clrspc(image) \ 347 ((image)->clrspc_) 348 349 /* Set the color model for an image. */ 350 #define jas_image_setclrspc(image, clrspc) \ 351 ((image)->clrspc_ = (clrspc)) 352 353 #define jas_image_cmpttype(image, cmptno) \ 354 ((image)->cmpts_[(cmptno)]->type_) 355 #define jas_image_setcmpttype(image, cmptno, type) \ 356 ((image)->cmpts_[(cmptno)]->type_ = (type)) 357 358 /* Get the width of a component. */ 359 #define jas_image_cmptwidth(image, cmptno) \ 360 ((image)->cmpts_[cmptno]->width_) 361 362 /* Get the height of a component. */ 363 #define jas_image_cmptheight(image, cmptno) \ 364 ((image)->cmpts_[cmptno]->height_) 365 366 /* Get the signedness of the sample data for a component. */ 367 #define jas_image_cmptsgnd(image, cmptno) \ 368 ((image)->cmpts_[cmptno]->sgnd_) 369 370 /* Get the precision of the sample data for a component. */ 371 #define jas_image_cmptprec(image, cmptno) \ 372 ((image)->cmpts_[cmptno]->prec_) 373 374 /* Get the horizontal subsampling factor for a component. */ 375 #define jas_image_cmpthstep(image, cmptno) \ 376 ((image)->cmpts_[cmptno]->hstep_) 377 378 /* Get the vertical subsampling factor for a component. */ 379 #define jas_image_cmptvstep(image, cmptno) \ 380 ((image)->cmpts_[cmptno]->vstep_) 381 382 /* Get the x-coordinate of the top-left corner of a component. */ 383 #define jas_image_cmpttlx(image, cmptno) \ 384 ((image)->cmpts_[cmptno]->tlx_) 385 386 /* Get the y-coordinate of the top-left corner of a component. */ 387 #define jas_image_cmpttly(image, cmptno) \ 388 ((image)->cmpts_[cmptno]->tly_) 389 390 /* Get the x-coordinate of the bottom-right corner of a component 391 (plus "one"). */ 392 #define jas_image_cmptbrx(image, cmptno) \ 393 ((image)->cmpts_[cmptno]->tlx_ + (image)->cmpts_[cmptno]->width_ * \ 394 (image)->cmpts_[cmptno]->hstep_) 395 396 /* Get the y-coordinate of the bottom-right corner of a component 397 (plus "one"). */ 398 #define jas_image_cmptbry(image, cmptno) \ 399 ((image)->cmpts_[cmptno]->tly_ + (image)->cmpts_[cmptno]->height_ * \ 400 (image)->cmpts_[cmptno]->vstep_) 401 402 /* Get the raw size of an image (i.e., the nominal size of the image without 403 any compression. */ 404 uint_fast32_t jas_image_rawsize(jas_image_t *image); 405 406 /* Create an image from a stream in some specified format. */ 407 jas_image_t *jas_image_decode(jas_stream_t *in, int fmt, char *optstr); 408 409 /* Write an image to a stream in a specified format. */ 410 int jas_image_encode(jas_image_t *image, jas_stream_t *out, int fmt, 411 char *optstr); 412 413 /* Read a rectangular region of an image component. */ 414 /* The position and size of the rectangular region to be read is specified 415 relative to the component's coordinate system. */ 416 int jas_image_readcmpt(jas_image_t *image, int cmptno, 417 jas_image_coord_t x, jas_image_coord_t y, jas_image_coord_t width, jas_image_coord_t height, 418 jas_matrix_t *data); 419 420 /* Write a rectangular region of an image component. */ 421 int jas_image_writecmpt(jas_image_t *image, int cmptno, 422 jas_image_coord_t x, jas_image_coord_t y, jas_image_coord_t width, jas_image_coord_t height, 423 jas_matrix_t *data); 424 425 /* Delete a component from an image. */ 426 void jas_image_delcmpt(jas_image_t *image, int cmptno); 427 428 /* Add a component to an image. */ 429 int jas_image_addcmpt(jas_image_t *image, int cmptno, 430 jas_image_cmptparm_t *cmptparm); 431 432 /* Copy a component from one image to another. */ 433 int jas_image_copycmpt(jas_image_t *dstimage, int dstcmptno, 434 jas_image_t *srcimage, int srccmptno); 435 436 #define JAS_IMAGE_CDT_GETSGND(dtype) (((dtype) >> 7) & 1) 437 #define JAS_IMAGE_CDT_SETSGND(dtype) (((dtype) & 1) << 7) 438 #define JAS_IMAGE_CDT_GETPREC(dtype) ((dtype) & 0x7f) 439 #define JAS_IMAGE_CDT_SETPREC(dtype) ((dtype) & 0x7f) 440 441 #define jas_image_cmptdtype(image, cmptno) \ 442 (JAS_IMAGE_CDT_SETSGND((image)->cmpts_[cmptno]->sgnd_) | JAS_IMAGE_CDT_SETPREC((image)->cmpts_[cmptno]->prec_)) 443 444 int jas_image_depalettize(jas_image_t *image, int cmptno, int numlutents, 445 int_fast32_t *lutents, int dtype, int newcmptno); 446 447 int jas_image_readcmptsample(jas_image_t *image, int cmptno, int x, int y); 448 void jas_image_writecmptsample(jas_image_t *image, int cmptno, int x, int y, 449 int_fast32_t v); 450 451 int jas_image_getcmptbytype(jas_image_t *image, int ctype); 452 453 /******************************************************************************\ 454 * Image format-related operations. 455 \******************************************************************************/ 456 457 /* Clear the table of image formats. */ 458 void jas_image_clearfmts(void); 459 460 /* Add entry to table of image formats. */ 461 int jas_image_addfmt(int id, char *name, char *ext, char *desc, 462 jas_image_fmtops_t *ops); 463 464 /* Get the ID for the image format with the specified name. */ 465 int jas_image_strtofmt(char *s); 466 467 /* Get the name of the image format with the specified ID. */ 468 char *jas_image_fmttostr(int fmt); 469 470 /* Lookup image format information by the format ID. */ 471 jas_image_fmtinfo_t *jas_image_lookupfmtbyid(int id); 472 473 /* Lookup image format information by the format name. */ 474 jas_image_fmtinfo_t *jas_image_lookupfmtbyname(const char *name); 475 476 /* Guess the format of an image file based on its name. */ 477 int jas_image_fmtfromname(char *filename); 478 479 /* Get the format of image data in a stream. */ 480 int jas_image_getfmt(jas_stream_t *in); 481 482 483 #define jas_image_cmprof(image) ((image)->cmprof_) 484 int jas_image_ishomosamp(jas_image_t *image); 485 int jas_image_sampcmpt(jas_image_t *image, int cmptno, int newcmptno, 486 jas_image_coord_t ho, jas_image_coord_t vo, jas_image_coord_t hs, 487 jas_image_coord_t vs, int sgnd, int prec); 488 int jas_image_writecmpt2(jas_image_t *image, int cmptno, jas_image_coord_t x, 489 jas_image_coord_t y, jas_image_coord_t width, jas_image_coord_t height, 490 long *buf); 491 int jas_image_readcmpt2(jas_image_t *image, int cmptno, jas_image_coord_t x, 492 jas_image_coord_t y, jas_image_coord_t width, jas_image_coord_t height, 493 long *buf); 494 495 #define jas_image_setcmprof(image, cmprof) ((image)->cmprof_ = cmprof) 496 jas_image_t *jas_image_chclrspc(jas_image_t *image, jas_cmprof_t *outprof, 497 int intent); 498 void jas_image_dump(jas_image_t *image, FILE *out); 499 500 /******************************************************************************\ 501 * Image format-dependent operations. 502 \******************************************************************************/ 503 504 #if !defined(EXCLUDE_JPG_SUPPORT) 505 /* Format-dependent operations for JPG support. */ 506 jas_image_t *jpg_decode(jas_stream_t *in, char *optstr); 507 int jpg_encode(jas_image_t *image, jas_stream_t *out, char *optstr); 508 int jpg_validate(jas_stream_t *in); 509 #endif 510 511 #if !defined(EXCLUDE_MIF_SUPPORT) 512 /* Format-dependent operations for MIF support. */ 513 jas_image_t *mif_decode(jas_stream_t *in, char *optstr); 514 int mif_encode(jas_image_t *image, jas_stream_t *out, char *optstr); 515 int mif_validate(jas_stream_t *in); 516 #endif 517 518 #if !defined(EXCLUDE_PNM_SUPPORT) 519 /* Format-dependent operations for PNM support. */ 520 jas_image_t *pnm_decode(jas_stream_t *in, char *optstr); 521 int pnm_encode(jas_image_t *image, jas_stream_t *out, char *optstr); 522 int pnm_validate(jas_stream_t *in); 523 #endif 524 525 #if !defined(EXCLUDE_RAS_SUPPORT) 526 /* Format-dependent operations for Sun Rasterfile support. */ 527 jas_image_t *ras_decode(jas_stream_t *in, char *optstr); 528 int ras_encode(jas_image_t *image, jas_stream_t *out, char *optstr); 529 int ras_validate(jas_stream_t *in); 530 #endif 531 532 #if !defined(EXCLUDE_BMP_SUPPORT) 533 /* Format-dependent operations for BMP support. */ 534 jas_image_t *bmp_decode(jas_stream_t *in, char *optstr); 535 int bmp_encode(jas_image_t *image, jas_stream_t *out, char *optstr); 536 int bmp_validate(jas_stream_t *in); 537 #endif 538 539 #if !defined(EXCLUDE_JP2_SUPPORT) 540 /* Format-dependent operations for JP2 support. */ 541 jas_image_t *jp2_decode(jas_stream_t *in, char *optstr); 542 int jp2_encode(jas_image_t *image, jas_stream_t *out, char *optstr); 543 int jp2_validate(jas_stream_t *in); 544 #endif 545 546 #if !defined(EXCLUDE_JPC_SUPPORT) 547 /* Format-dependent operations for JPEG-2000 code stream support. */ 548 jas_image_t *jpc_decode(jas_stream_t *in, char *optstr); 549 int jpc_encode(jas_image_t *image, jas_stream_t *out, char *optstr); 550 int jpc_validate(jas_stream_t *in); 551 #endif 552 553 #if !defined(EXCLUDE_PGX_SUPPORT) 554 /* Format-dependent operations for PGX support. */ 555 jas_image_t *pgx_decode(jas_stream_t *in, char *optstr); 556 int pgx_encode(jas_image_t *image, jas_stream_t *out, char *optstr); 557 int pgx_validate(jas_stream_t *in); 558 #endif 559 560 #ifdef __cplusplus 561 } 562 #endif 563 564 #endif