1 /******************************************************************* 2 * morpho_easy_hdr.h 3 * [CP932/CRLF] { p } 4 *------------------------------------------------------------------ 5 * Copyright (C) 2010-2012 Morpho,Inc. 6 *******************************************************************/ 7 8 #ifndef MORPHO_EASY_HDR_H 9 #define MORPHO_EASY_HDR_H 10 11 /*******************************************************************/ 12 13 #include "morpho_api.h" 14 #include "morpho_error.h" 15 #include "morpho_image_data.h" 16 #include "morpho_rect_int.h" 17 18 /*******************************************************************/ 19 20 #define MORPHO_EASY_HDR_VER "Morpho EasyHDR Ver.2.0.1 2012/07/18" 21 22 /*-----------------------------------------------------------------*/ 23 24 /* (input-limitaion) */ 25 26 #define MORPHO_EASY_HDR_MIN_IMAGE_WIDTH 100 27 #define MORPHO_EASY_HDR_MAX_IMAGE_WIDTH 8192 28 #define MORPHO_EASY_HDR_MIN_IMAGE_HEIGHT 100 29 #define MORPHO_EASY_HDR_MAX_IMAGE_HEIGHT 8192 30 #define MORPHO_EASY_HDR_MIN_NIMAGES 2 31 #define MORPHO_EASY_HDR_MAX_NIMAGES 10 32 33 /*-----------------------------------------------------------------*/ 34 35 /* (parameter) */ 36 37 #define MORPHO_EASY_HDR_DISABLED 0 38 #define MORPHO_EASY_HDR_ENABLED 1 39 40 #define MORPHO_EASY_HDR_IMAGE_ALIGNMENT_DEFAULT MORPHO_EASY_HDR_ENABLED 41 42 #define MORPHO_EASY_HDR_GHOST_REMOVAL_DEFAULT MORPHO_EASY_HDR_ENABLED 43 44 #define MORPHO_EASY_HDR_AUTO_SCALING_DEFAULT MORPHO_EASY_HDR_ENABLED 45 46 #define MORPHO_EASY_HDR_FACE_DETECTION_DEFAULT MORPHO_EASY_HDR_ENABLED 47 48 #define MORPHO_EASY_HDR_FAIL_SOFT_MERGING_DEFAULT MORPHO_EASY_HDR_ENABLED 49 50 #define MORPHO_EASY_HDR_GHOST_DETECTION_SENSITIVITY_LEVEL_MIN 0 51 #define MORPHO_EASY_HDR_GHOST_DETECTION_SENSITIVITY_LEVEL_MAX 10 52 #define MORPHO_EASY_HDR_GHOST_DETECTION_SENSITIVITY_LEVEL_DEFAULT 7 53 54 #define MORPHO_EASY_HDR_MERGE_SMOOTHNESS_LEVEL_MIN 0 55 #define MORPHO_EASY_HDR_MERGE_SMOOTHNESS_LEVEL_MAX 10 56 #define MORPHO_EASY_HDR_MERGE_SMOOTHNESS_LEVEL_DEFAULT 6 57 58 #define MORPHO_EASY_HDR_MERGE_PARAM_MIN 0 59 #define MORPHO_EASY_HDR_MERGE_PARAM_MAX 255 60 #define MORPHO_EASY_HDR_MERGE_PARAM1_DEFAULT 0 61 #define MORPHO_EASY_HDR_MERGE_PARAM2_DEFAULT 128 62 #define MORPHO_EASY_HDR_MERGE_PARAM3_DEFAULT 0 63 #define MORPHO_EASY_HDR_MERGE_PARAM4_DEFAULT 255 64 65 #define MORPHO_EASY_HDR_RELIABLE_RECT_RATE_THRESHOLD_MIN 0 66 #define MORPHO_EASY_HDR_RELIABLE_RECT_RATE_THRESHOLD_MAX 100 67 #define MORPHO_EASY_HDR_RELIABLE_RECT_RATE_THRESHOLD_DEFAULT 80 68 69 #define MORPHO_EASY_HDR_GHOST_RATE_THRESHOLD_MIN 0 70 #define MORPHO_EASY_HDR_GHOST_RATE_THRESHOLD_MAX 100 71 #define MORPHO_EASY_HDR_GHOST_RATE_THRESHOLD_DEFAULT 90 72 73 #define MORPHO_EASY_HDR_CC_OFFSET_MIN 0 74 #define MORPHO_EASY_HDR_CC_OFFSET_MAX 255 75 #define MORPHO_EASY_HDR_CC_Y_OFFSET_DEFAULT 0 76 #define MORPHO_EASY_HDR_CC_C_OFFSET_DEFAULT 0 77 78 #define MORPHO_EASY_HDR_CC_GAIN_MIN 100 79 #define MORPHO_EASY_HDR_CC_GAIN_MAX 2000 80 #define MORPHO_EASY_HDR_CC_Y_GAIN_DEFAULT 1000 81 #define MORPHO_EASY_HDR_CC_C_GAIN_DEFAULT 1000 82 83 #define MORPHO_EASY_HDR_CC_GAMMA_MIN 100 84 #define MORPHO_EASY_HDR_CC_GAMMA_MAX 2000 85 #define MORPHO_EASY_HDR_CC_Y_GAMMA_DEFAULT 1000 86 #define MORPHO_EASY_HDR_CC_C_GAMMA_DEFAULT 1000 87 88 /*-----------------------------------------------------------------*/ 89 90 /* (merge-status) */ 91 92 #define MORPHO_EASY_HDR_OK 0x00000000 93 #define MORPHO_EASY_HDR_ERROR_IMAGE_ALIGNMENT_FAILURE 0x00000001 94 #define MORPHO_EASY_HDR_ERROR_EXP_ESTIMATION_FAILURE 0x00000002 95 #define MORPHO_EASY_HDR_ERROR_MOSTLY_GHOST 0x00000004 96 #define MORPHO_EASY_HDR_ERROR_INTERNAL 0x80000000 97 98 /*******************************************************************/ 99 100 typedef struct _morpho_EasyHDR morpho_EasyHDR; 101 typedef struct _morpho_EasyHDR_Callback morpho_EasyHDR_Callback; 102 103 /*-----------------------------------------------------------------*/ 104 105 /** EasyHDR */ 106 struct _morpho_EasyHDR 107 { 108 void *p; /**< \|C^ */ 109 }; 110 111 /** EasyHDR Callback (for multi-thread processing) */ 112 struct _morpho_EasyHDR_Callback 113 { 114 void *p; /**< R[obNnl */ 115 116 void * (* thread_create )(void *p, int index, void *(*start_routine)(void *arg), void *arg); 117 int (* thread_destroy)(void *p, void *thread); 118 int (* thread_join )(void *p, void *thread, void **value_ptr); 119 120 void * (* mutex_create )(void *p); 121 int (* mutex_destroy)(void *p, void *mutex); 122 int (* mutex_lock )(void *p, void *mutex); 123 int (* mutex_trylock)(void *p, void *mutex); 124 int (* mutex_unlock )(void *p, void *mutex); 125 126 void * (* cond_create )(void *p); 127 int (* cond_destroy )(void *p, void *cond); 128 int (* cond_wait )(void *p, void *cond, void *lock); 129 int (* cond_signal )(void *p, void *cond); 130 int (* cond_broadcast)(void *p, void *cond); 131 }; 132 133 /*******************************************************************/ 134 135 #ifdef __cplusplus 136 extern "C" 137 { 138 #endif 139 140 /*-----------------------------------------------------------------*/ 141 142 /** 143 * o[W 144 * 145 * @return o[W(MORPHO_EASY_HDR_VER) 146 */ 147 MORPHO_API(char const *) 148 morpho_EasyHDR_getVersion(void); 149 150 /*-----------------------------------------------------------------*/ 151 152 /** 153 * KvTCY 154 * 155 * @param[in] max_width 156 * @param[in] max_height 157 * @param[in] format tH[}bg 158 * 159 * @return KvTCY(byte) 160 */ 161 MORPHO_API(int) 162 morpho_EasyHDR_getBufferSize( 163 int max_width, 164 int max_height, 165 char const *format); 166 167 /** 168 * 169 * 170 * gpXbh0lA 171 * ssB 172 * 173 * gpXbh1lA 174 * ssB 175 * 176 * gpXbh2lA 177 * }`Xbhs(s)sB 178 * callback KlKvB 179 * 180 * ysJz 181 * ?_UNKNOWN 0_INITIALIZED 182 * 183 * @param[in,out] p EasyHDR CX^X 184 * @param[out] buffer EasyHDR|C^ 185 * @param[in] buffer_size EasyHDRTCY 186 * @param[in] nthreads gpXbh (RA) 187 * @param[in] callback R[obNQ 188 * 189 * @return G[R[h (see morpho_error.h) 190 */ 191 MORPHO_API(int) 192 morpho_EasyHDR_initialize( 193 morpho_EasyHDR *p, 194 void *buffer, 195 int buffer_size, 196 int nthreads, 197 morpho_EasyHDR_Callback const *callback); 198 199 /** 200 * N[Abv 201 * initialize() ss\ 202 * 203 * @param[in,out] p EasyHDR CX^X 204 * 205 * @return G[R[h (see morpho_error.h) 206 */ 207 MORPHO_API(int) 208 morpho_EasyHDR_finalize( 209 morpho_EasyHDR *p); 210 211 /*-----------------------------------------------------------------*/ 212 213 /** 214 * JnEs 215 * setImageFormat() ss\ 216 * 217 * ysJ (s)z 218 * 0_INITIALIZED (1_PROCESSING) 0_INITIALIZED () 219 * 2_SUSPENDED (suspend()o) 220 * 221 * ysJ (s)z 222 * 0_INITIALIZED 3_PAUSED () 223 * 0_INITIALIZED () 224 * 225 * @param[in,out] p EasyHDR CX^X 226 * @param[out] output_image (u1vw\) 227 * @param[in,out] input_images Q (GW) 228 * @param[in] nimages 229 * 230 * @return G[R[h (see morpho_error.h) 231 */ 232 MORPHO_API(int) 233 morpho_EasyHDR_merge( 234 morpho_EasyHDR *p, 235 morpho_ImageData *output_image, 236 morpho_ImageData *input_images[], 237 int nimages); 238 239 /*-----------------------------------------------------------------*/ 240 241 /** 242 * ps 243 * 244 * merge() ss\ 245 * 246 * s(initialize() nthreads 0 w)L 247 * 248 * ysJ (s)z 249 * 3_PAUSED 3_PAUSED () 250 * 0_INITIALIZED () 251 * 252 * @param[in,out] p EasyHDR CX^X 253 * 254 * @return G[R[h (see morpho_error.h) 255 */ 256 MORPHO_API(int) 257 morpho_EasyHDR_process( 258 morpho_EasyHDR *p); 259 260 /*-----------------------------------------------------------------*/ 261 262 /** 263 * f (ReLXgo) 264 * merge() ss\ 265 * 266 * ysJ (s)z 267 * 1_PROCESSING 2_SUSPENDED 268 * 269 * @param[in,out] p EasyHDR CX^X 270 * 271 * @return G[R[h (see morpho_error.h) 272 */ 273 MORPHO_API(int) 274 morpho_EasyHDR_suspend( 275 morpho_EasyHDR *p); 276 277 /** 278 * J 279 * suspend() ss\ 280 * 281 * ysJ (s)z 282 * 2_SUSPENDED (1_PROCESSING) 0_INITIALIZED () 283 * 2_SUSPENDED (suspend()o) 284 * 285 * @param[in,out] p EasyHDR CX^X 286 * 287 * @return G[R[h (see morpho_error.h) 288 */ 289 MORPHO_API(int) 290 morpho_EasyHDR_resume( 291 morpho_EasyHDR *p); 292 293 /*-----------------------------------------------------------------*/ 294 295 /** 296 * tH[}bg 297 * initialize() ss\ 298 * 299 * @param[in,out] p EasyHDR CX^X 300 * @param[in] format tH[}bg 301 * 302 * @return G[R[h (see morpho_error.h) 303 */ 304 MORPHO_API(int) 305 morpho_EasyHDR_setImageFormat( 306 morpho_EasyHDR *p, 307 char const *format); 308 309 /** 310 * tH[}bg 311 * setImageFormat() ss\ 312 * 313 * @param[in,out] p EasyHDR CX^X 314 * @param[out] buffer tH[}bgi[obt@ 315 * @param[in] buffer_size obt@TCY(I[) 316 * 317 * @return G[R[h (see morpho_error.h) 318 */ 319 MORPHO_API(int) 320 morpho_EasyHDR_getImageFormat( 321 morpho_EasyHDR *p, 322 char *buffer, 323 int buffer_size); 324 325 /*-----------------------------------------------------------------*/ 326 327 /** 328 * u()L 329 * initialize() ss\ 330 * 331 * value: 332 * MOR_EASY_HDR_ENABLED : u 333 * MOR_EASY_HDR_DISABLED : u 334 * 335 * @param[in,out] p EasyHDR CX^X 336 * @param[in] value l 337 * 338 * @return G[R[h (see morpho_error.h) 339 */ 340 MORPHO_API(int) 341 morpho_EasyHDR_setImageAlignmentStatus( 342 morpho_EasyHDR *p, 343 int value); 344 345 /** 346 * u()L 347 * initialize() ss\ 348 * 349 * @param[in,out] p EasyHDR CX^X 350 * @param[out] value li[ 351 * 352 * @return G[R[h (see morpho_error.h) 353 */ 354 MORPHO_API(int) 355 morpho_EasyHDR_getImageAlignmentStatus( 356 morpho_EasyHDR *p, 357 int *value); 358 359 /*-----------------------------------------------------------------*/ 360 361 /** 362 * S[Xg()L 363 * initialize() ss\ 364 * 365 * value: 366 * MOR_EASY_HDR_ENABLED : S[Xg 367 * MOR_EASY_HDR_DISABLED : S[Xg 368 * 369 * @param[in,out] p EasyHDR CX^X 370 * @param[in] value l 371 * 372 * @return G[R[h (see morpho_error.h) 373 */ 374 MORPHO_API(int) 375 morpho_EasyHDR_setGhostRemovalStatus( 376 morpho_EasyHDR *p, 377 int value); 378 379 /** 380 * S[Xg()L 381 * initialize() ss\ 382 * 383 * @param[in,out] p EasyHDR CX^X 384 * @param[out] value li[ 385 * 386 * @return G[R[h (see morpho_error.h) 387 */ 388 MORPHO_API(int) 389 morpho_EasyHDR_getGhostRemovalStatus( 390 morpho_EasyHDR *p, 391 int *value); 392 393 /*-----------------------------------------------------------------*/ 394 395 /** 396 * g(NbsO)L 397 * initialize() ss\ 398 * 399 * value: 400 * MOR_EASY_HDR_ENABLED : g 401 * MOR_EASY_HDR_DISABLED : g 402 * 403 * @param[in,out] p EasyHDR CX^X 404 * @param[in] value l 405 * 406 * @return G[R[h (see morpho_error.h) 407 */ 408 MORPHO_API(int) 409 morpho_EasyHDR_setAutoScalingStatus( 410 morpho_EasyHDR *p, 411 int value); 412 413 /** 414 * g(NbsO)L 415 * initialize() ss\ 416 * 417 * @param[in,out] p EasyHDR CX^X 418 * @param[out] value li[ 419 * 420 * @return G[R[h (see morpho_error.h) 421 */ 422 MORPHO_API(int) 423 morpho_EasyHDR_getAutoScalingStatus( 424 morpho_EasyHDR *p, 425 int *value); 426 427 /*-----------------------------------------------------------------*/ 428 429 /** 430 * oL 431 * initialize() ss\ 432 * 433 * value: 434 * MOR_EASY_HDR_ENABLED : o 435 * MOR_EASY_HDR_DISABLED : o 436 * 437 * @param[in,out] p EasyHDR CX^X 438 * @param[in] value l 439 * 440 * @return G[R[h (see morpho_error.h) 441 */ 442 MORPHO_API(int) 443 morpho_EasyHDR_setFaceDetectionStatus( 444 morpho_EasyHDR *p, 445 int value); 446 447 /** 448 * oL 449 * initialize() ss\ 450 * 451 * @param[in,out] p EasyHDR CX^X 452 * @param[out] value li[ 453 * 454 * @return G[R[h (see morpho_error.h) 455 */ 456 MORPHO_API(int) 457 morpho_EasyHDR_getFaceDetectionStatus( 458 morpho_EasyHDR *p, 459 int *value); 460 461 /*-----------------------------------------------------------------*/ 462 463 /** 464 * Fail-soft-merging L 465 * initialize() ss\ 466 * 467 * value: 468 * MOR_EASY_HDR_ENABLED : Fail-soft-merging 469 * MOR_EASY_HDR_DISABLED : Fail-soft-merging 470 * 471 * @param[in,out] p EasyHDR CX^X 472 * @param[in] value l 473 * 474 * @return G[R[h (see morpho_error.h) 475 */ 476 MORPHO_API(int) 477 morpho_EasyHDR_setFailSoftMergingStatus( 478 morpho_EasyHDR *p, 479 int value); 480 481 /** 482 * Fail-soft-merging L 483 * initialize() ss\ 484 * 485 * @param[in,out] p EasyHDR CX^X 486 * @param[out] value li[ 487 * 488 * @return G[R[h (see morpho_error.h) 489 */ 490 MORPHO_API(int) 491 morpho_EasyHDR_getFailSoftMergingStatus( 492 morpho_EasyHDR *p, 493 int *value); 494 495 /*-----------------------------------------------------------------*/ 496 497 /** 498 * S[Xgxx 499 * initialize() ss\ 500 * 501 * @param[in,out] p EasyHDR CX^X 502 * @param[in] value l 503 * 504 * @return G[R[h (see morpho_error.h) 505 */ 506 MORPHO_API(int) 507 morpho_EasyHDR_setGhostDetectionSensitivityLevel( 508 morpho_EasyHDR *p, 509 int value); 510 511 /** 512 * S[Xgxx 513 * initialize() ss\ 514 * 515 * @param[in,out] p EasyHDR CX^X 516 * @param[out] value li[ 517 * 518 * @return G[R[h (see morpho_error.h) 519 */ 520 MORPHO_API(int) 521 morpho_EasyHDR_getGhostDetectionSensitivityLevel( 522 morpho_EasyHDR *p, 523 int *value); 524 525 /*-----------------------------------------------------------------*/ 526 527 /** 528 * 529 * initialize() ss\ 530 * 531 * @param[in,out] p EasyHDR CX^X 532 * @param[in] value l 533 * 534 * @return G[R[h (see morpho_error.h) 535 */ 536 MORPHO_API(int) 537 morpho_EasyHDR_setMergeSmoothnessLevel( 538 morpho_EasyHDR *p, 539 int value); 540 541 /** 542 * 543 * initialize() ss\ 544 * 545 * @param[in,out] p EasyHDR CX^X 546 * @param[out] value li[ 547 * 548 * @return G[R[h (see morpho_error.h) 549 */ 550 MORPHO_API(int) 551 morpho_EasyHDR_getMergeSmoothnessLevel( 552 morpho_EasyHDR *p, 553 int *value); 554 555 /*-----------------------------------------------------------------*/ 556 557 /** 558 * p[^ 559 * initialize() ss\ 560 * 561 * @param[in,out] p EasyHDR CX^X 562 * @param[in] value1 l 563 * @param[in] value2 l 564 * @param[in] value3 l 565 * @param[in] value4 l 566 * 567 * @return G[R[h (see morpho_error.h) 568 */ 569 MORPHO_API(int) 570 morpho_EasyHDR_setMergeParameters( 571 morpho_EasyHDR *p, 572 int value1, 573 int value2, 574 int value3, 575 int value4); 576 577 /** 578 * p[^ 579 * initialize() ss\ 580 * 581 * @param[in,out] p EasyHDR CX^X 582 * @param[out] value1 li[ 583 * @param[out] value2 li[ 584 * @param[out] value3 li[ 585 * @param[out] value4 li[ 586 * 587 * @return G[R[h (see morpho_error.h) 588 */ 589 MORPHO_API(int) 590 morpho_EasyHDR_getMergeParameters( 591 morpho_EasyHDR *p, 592 int *value1, 593 int *value2, 594 int *value3, 595 int *value4); 596 597 /*-----------------------------------------------------------------*/ 598 599 /** 600 * Ll 601 * initialize() ss\ 602 * 603 * @param[in,out] p EasyHDR CX^X 604 * @param[in] rate l ( rate % `) 605 * 606 * @return G[R[h (see morpho_error.h) 607 */ 608 MORPHO_API(int) 609 morpho_EasyHDR_setReliableRectRateThreshold( 610 morpho_EasyHDR *p, 611 int rate); 612 613 /** 614 * Ll 615 * initialize() ss\ 616 * 617 * @param[in,out] p EasyHDR CX^X 618 * @param[out] rate li[ 619 * 620 * @return G[R[h (see morpho_error.h) 621 */ 622 MORPHO_API(int) 623 morpho_EasyHDR_getReliableRectRateThreshold( 624 morpho_EasyHDR *p, 625 int *rate); 626 627 /** 628 * L 629 * initialize() ss\ 630 * (LlZbg merge() ) 631 * 632 * @param[in,out] p EasyHDR CX^X 633 * @param[out] rect li[ 634 * 635 * @return G[R[h (see morpho_error.h) 636 */ 637 MORPHO_API(int) 638 morpho_EasyHDR_getReliableRect( 639 morpho_EasyHDR *p, 640 morpho_RectInt *rect); 641 642 /*-----------------------------------------------------------------*/ 643 644 /** 645 * S[Xgl 646 * initialize() ss\ 647 * 648 * @param[in,out] p EasyHDR CX^X 649 * @param[in] rate l 650 * 651 * @return G[R[h (see morpho_error.h) 652 */ 653 MORPHO_API(int) 654 morpho_EasyHDR_setGhostRateThreshold( 655 morpho_EasyHDR *p, 656 int rate); 657 658 /** 659 * S[Xgl 660 * initialize() ss\ 661 * 662 * @param[in,out] p EasyHDR CX^X 663 * @param[out] rate li[ 664 * 665 * @return G[R[h (see morpho_error.h) 666 */ 667 MORPHO_API(int) 668 morpho_EasyHDR_getGhostRateThreshold( 669 morpho_EasyHDR *p, 670 int *rate); 671 672 /*-----------------------------------------------------------------*/ 673 674 /** 675 * Fp[^ 676 * initialize() ss\ 677 * 678 * @param[in,out] p EasyHDR CX^X 679 * @param[in] y_offset l 680 * @param[in] y_gain l 681 * @param[in] y_gamma l 682 * @param[in] c_offset l 683 * @param[in] c_gain l 684 * @param[in] c_gamma l 685 * 686 * @return G[R[h (see morpho_error.h) 687 */ 688 MORPHO_API(int) 689 morpho_EasyHDR_setColorCorrectionParameters( 690 morpho_EasyHDR *p, 691 int y_offset, 692 int y_gain, 693 int y_gamma, 694 int c_offset, 695 int c_gain, 696 int c_gamma); 697 698 /** 699 * Fp[^ 700 * initialize() ss\ 701 * 702 * @param[in,out] p EasyHDR CX^X 703 * @param[out] y_offset li[ 704 * @param[out] y_gain li[ 705 * @param[out] y_gamma li[ 706 * @param[out] c_offset li[ 707 * @param[out] c_gain li[ 708 * @param[out] c_gamma li[ 709 * 710 * @return G[R[h (see morpho_error.h) 711 */ 712 MORPHO_API(int) 713 morpho_EasyHDR_getColorCorrectionParameters( 714 morpho_EasyHDR *p, 715 int *y_offset, 716 int *y_gain, 717 int *y_gamma, 718 int *c_offset, 719 int *c_gain, 720 int *c_gamma); 721 722 /*-----------------------------------------------------------------*/ 723 724 /** 725 * Xe[^X 726 * initialize() ss\ 727 * 728 * Xe[^XR[h 729 * MORPHO_EASY_HDR_OK 730 * MORPHO_EASY_HDR_ERROR_* 731 * 732 * @param[in,out] p EasyHDR CX^X 733 * 734 * @return Xe[^XR[h (MORPHO_EASMORPHO_EASY_HDR_ERROR_ 735 */ 736 MORPHO_API(int) 737 morpho_EasyHDR_getMergeStatus( 738 morpho_EasyHDR *p); 739 740 /*-----------------------------------------------------------------*/ 741 742 /** 743 * TlC (ok) 744 * morpho_EasyHDR_setImageFormat() ss\ 745 * 746 * @param[in,out] p EasyHDR CX^X 747 * @param[out] thumbnail_image o 748 * @param[in] output_image 749 * 750 * @return G[R[h (see morpho_error.h) 751 */ 752 MORPHO_API(int) 753 morpho_EasyHDR_makeThumbnail( 754 morpho_EasyHDR *p, 755 morpho_ImageData *thumbnail_image, 756 morpho_ImageData const *output_image); 757 758 /*-----------------------------------------------------------------*/ 759 760 #ifdef __cplusplus 761 } /* extern "C" */ 762 #endif 763 764 /*******************************************************************/ 765 766 #endif /* !MORPHO_EASY_HDR_H */ 767 768 /*******************************************************************/ 769 /* [EOF] */ 770