OLD | NEW |
1 /* $Id: tif_pixarlog.c,v 1.38 2012-06-21 01:01:53 fwarmerdam Exp $ */ | 1 /* $Id: tif_pixarlog.c,v 1.39 2012-12-10 17:27:13 tgl Exp $ */ |
2 | 2 |
3 /* | 3 /* |
4 * Copyright (c) 1996-1997 Sam Leffler | 4 * Copyright (c) 1996-1997 Sam Leffler |
5 * Copyright (c) 1996 Pixar | 5 * Copyright (c) 1996 Pixar |
6 * | 6 * |
7 * Permission to use, copy, modify, distribute, and sell this software and | 7 * Permission to use, copy, modify, distribute, and sell this software and |
8 * its documentation for any purpose is hereby granted without fee, provided | 8 * its documentation for any purpose is hereby granted without fee, provided |
9 * that (i) the above copyright notices and this permission notice appear in | 9 * that (i) the above copyright notices and this permission notice appear in |
10 * all copies of the software and related documentation, and (ii) the names of | 10 * all copies of the software and related documentation, and (ii) the names of |
11 * Pixar, Sam Leffler and Silicon Graphics may not be used in any advertising or | 11 * Pixar, Sam Leffler and Silicon Graphics may not be used in any advertising or |
12 * publicity relating to the software without the specific, prior written | 12 * publicity relating to the software without the specific, prior written |
13 * permission of Pixar, Sam Leffler and Silicon Graphics. | 13 * permission of Pixar, Sam Leffler and Silicon Graphics. |
14 * | 14 * |
15 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, | 15 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, |
16 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY | 16 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY |
17 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. | 17 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. |
18 * | 18 * |
19 * IN NO EVENT SHALL PIXAR, SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR | 19 * IN NO EVENT SHALL PIXAR, SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR |
20 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, | 20 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, |
21 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, | 21 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, |
22 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF | 22 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF |
23 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE | 23 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE |
24 * OF THIS SOFTWARE. | 24 * OF THIS SOFTWARE. |
25 */ | 25 */ |
| 26 |
26 #include "tiffiop.h" | 27 #include "tiffiop.h" |
27 #ifdef PIXARLOG_SUPPORT | 28 #ifdef PIXARLOG_SUPPORT |
28 | 29 |
29 /* | 30 /* |
30 * TIFF Library. | 31 * TIFF Library. |
31 * PixarLog Compression Support | 32 * PixarLog Compression Support |
32 * | 33 * |
33 * Contributed by Dan McCoy. | 34 * Contributed by Dan McCoy. |
34 * | 35 * |
35 * PixarLog film support uses the TIFF library to store companded | 36 * PixarLog film support uses the TIFF library to store companded |
(...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
636 multiply_ms(tmsize_t m1, tmsize_t m2) | 637 multiply_ms(tmsize_t m1, tmsize_t m2) |
637 { | 638 { |
638 tmsize_t bytes = m1 * m2; | 639 tmsize_t bytes = m1 * m2; |
639 | 640 |
640 if (m1 && bytes / m1 != m2) | 641 if (m1 && bytes / m1 != m2) |
641 bytes = 0; | 642 bytes = 0; |
642 | 643 |
643 return bytes; | 644 return bytes; |
644 } | 645 } |
645 | 646 |
| 647 static tmsize_t |
| 648 add_ms(tmsize_t m1, tmsize_t m2) |
| 649 { |
| 650 tmsize_t bytes = m1 + m2; |
| 651 |
| 652 /* if either input is zero, assume overflow already occurred */ |
| 653 if (m1 == 0 || m2 == 0) |
| 654 bytes = 0; |
| 655 else if (bytes <= m1 || bytes <= m2) |
| 656 bytes = 0; |
| 657 |
| 658 return bytes; |
| 659 } |
| 660 |
646 static int | 661 static int |
647 PixarLogFixupTags(TIFF* tif) | 662 PixarLogFixupTags(TIFF* tif) |
648 { | 663 { |
649 (void) tif; | 664 (void) tif; |
650 return (1); | 665 return (1); |
651 } | 666 } |
652 | 667 |
653 static int | 668 static int |
654 PixarLogSetupDecode(TIFF* tif) | 669 PixarLogSetupDecode(TIFF* tif) |
655 { | 670 { |
656 static const char module[] = "PixarLogSetupDecode"; | 671 static const char module[] = "PixarLogSetupDecode"; |
657 TIFFDirectory *td = &tif->tif_dir; | 672 TIFFDirectory *td = &tif->tif_dir; |
658 PixarLogState* sp = DecoderState(tif); | 673 PixarLogState* sp = DecoderState(tif); |
659 tmsize_t tbuf_size; | 674 tmsize_t tbuf_size; |
660 | 675 |
661 assert(sp != NULL); | 676 assert(sp != NULL); |
662 | 677 |
663 /* Make sure no byte swapping happens on the data | 678 /* Make sure no byte swapping happens on the data |
664 * after decompression. */ | 679 * after decompression. */ |
665 tif->tif_postdecode = _TIFFNoPostDecode; | 680 tif->tif_postdecode = _TIFFNoPostDecode; |
666 | 681 |
667 /* for some reason, we can't do this in TIFFInitPixarLog */ | 682 /* for some reason, we can't do this in TIFFInitPixarLog */ |
668 | 683 |
669 sp->stride = (td->td_planarconfig == PLANARCONFIG_CONTIG ? | 684 sp->stride = (td->td_planarconfig == PLANARCONFIG_CONTIG ? |
670 td->td_samplesperpixel : 1); | 685 td->td_samplesperpixel : 1); |
671 tbuf_size = multiply_ms(multiply_ms(multiply_ms(sp->stride, td->td_image
width), | 686 tbuf_size = multiply_ms(multiply_ms(multiply_ms(sp->stride, td->td_image
width), |
672 td->td_rowsperstrip), sizeof(uint16)); | 687 td->td_rowsperstrip), sizeof(uint16)); |
| 688 /* add one more stride in case input ends mid-stride */ |
| 689 tbuf_size = add_ms(tbuf_size, sizeof(uint16) * sp->stride); |
673 if (tbuf_size == 0) | 690 if (tbuf_size == 0) |
674 return (0); /* TODO: this is an error return without error rep
ort through TIFFErrorExt */ | 691 return (0); /* TODO: this is an error return without error rep
ort through TIFFErrorExt */ |
675 » sp->tbuf = (uint16 *) _TIFFmalloc(tbuf_size+sizeof(uint16)*sp->stride); | 692 » sp->tbuf = (uint16 *) _TIFFmalloc(tbuf_size); |
676 if (sp->tbuf == NULL) | 693 if (sp->tbuf == NULL) |
677 return (0); | 694 return (0); |
678 if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) | 695 if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) |
679 sp->user_datafmt = PixarLogGuessDataFmt(td); | 696 sp->user_datafmt = PixarLogGuessDataFmt(td); |
680 if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) { | 697 if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) { |
681 TIFFErrorExt(tif->tif_clientdata, module, | 698 TIFFErrorExt(tif->tif_clientdata, module, |
682 "PixarLog compression can't handle bits depth/data forma
t combination (depth: %d)", | 699 "PixarLog compression can't handle bits depth/data forma
t combination (depth: %d)", |
683 td->td_bitspersample); | 700 td->td_bitspersample); |
684 return (0); | 701 return (0); |
685 } | 702 } |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
898 static const char module[] = "PixarLogPreEncode"; | 915 static const char module[] = "PixarLogPreEncode"; |
899 PixarLogState *sp = EncoderState(tif); | 916 PixarLogState *sp = EncoderState(tif); |
900 | 917 |
901 (void) s; | 918 (void) s; |
902 assert(sp != NULL); | 919 assert(sp != NULL); |
903 sp->stream.next_out = tif->tif_rawdata; | 920 sp->stream.next_out = tif->tif_rawdata; |
904 assert(sizeof(sp->stream.avail_out)==4); /* if this assert gets raised, | 921 assert(sizeof(sp->stream.avail_out)==4); /* if this assert gets raised, |
905 we need to simplify this code to reflect a ZLib that is likely updat
ed | 922 we need to simplify this code to reflect a ZLib that is likely updat
ed |
906 to deal with 8byte memory sizes, though this code will respond | 923 to deal with 8byte memory sizes, though this code will respond |
907 apropriately even before we simplify it */ | 924 apropriately even before we simplify it */ |
908 » sp->stream.avail_out = (uInt)tif->tif_rawdatasize; | 925 » sp->stream.avail_out = tif->tif_rawdatasize; |
909 if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize) | 926 if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize) |
910 { | 927 { |
911 TIFFErrorExt(tif->tif_clientdata, module, "ZLib cannot deal with
buffers this size"); | 928 TIFFErrorExt(tif->tif_clientdata, module, "ZLib cannot deal with
buffers this size"); |
912 return (0); | 929 return (0); |
913 } | 930 } |
914 return (deflateReset(&sp->stream) == Z_OK); | 931 return (deflateReset(&sp->stream) == Z_OK); |
915 } | 932 } |
916 | 933 |
917 static void | 934 static void |
918 horizontalDifferenceF(float *ip, int n, int stride, uint16 *wp, uint16 *FromLT2) | 935 horizontalDifferenceF(float *ip, int n, int stride, uint16 *wp, uint16 *FromLT2) |
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1416 #endif /* PIXARLOG_SUPPORT */ | 1433 #endif /* PIXARLOG_SUPPORT */ |
1417 | 1434 |
1418 /* vim: set ts=8 sts=8 sw=8 noet: */ | 1435 /* vim: set ts=8 sts=8 sw=8 noet: */ |
1419 /* | 1436 /* |
1420 * Local Variables: | 1437 * Local Variables: |
1421 * mode: c | 1438 * mode: c |
1422 * c-basic-offset: 8 | 1439 * c-basic-offset: 8 |
1423 * fill-column: 78 | 1440 * fill-column: 78 |
1424 * End: | 1441 * End: |
1425 */ | 1442 */ |
1426 | |
OLD | NEW |