Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(16)

Side by Side Diff: third_party/libtiff/tif_getimage.c

Issue 1563103002: XFA: Upgrade to libtiff 4.0.6. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@xfa
Patch Set: rename to libtiff Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/libtiff/tif_flush.c ('k') | third_party/libtiff/tif_jpeg.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* $Id: tif_getimage.c,v 1.82 2012-06-06 00:17:49 fwarmerdam Exp $ */ 1 /* $Id: tif_getimage.c,v 1.90 2015-06-17 01:34:08 bfriesen Exp $ */
2 2
3 /* 3 /*
4 * Copyright (c) 1991-1997 Sam Leffler 4 * Copyright (c) 1991-1997 Sam Leffler
5 * Copyright (c) 1991-1997 Silicon Graphics, Inc. 5 * Copyright (c) 1991-1997 Silicon Graphics, Inc.
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 * Sam Leffler and Silicon Graphics may not be used in any advertising or 11 * Sam Leffler and Silicon Graphics may not be used in any advertising or
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 td->td_compression != COMPRESSION_SGILOG24) { 175 td->td_compression != COMPRESSION_SGILOG24) {
176 sprintf(emsg, "Sorry, LogLuv data must have %s=% d or %d", 176 sprintf(emsg, "Sorry, LogLuv data must have %s=% d or %d",
177 "Compression", COMPRESSION_SGILOG, COMPRESSI ON_SGILOG24); 177 "Compression", COMPRESSION_SGILOG, COMPRESSI ON_SGILOG24);
178 return (0); 178 return (0);
179 } 179 }
180 if (td->td_planarconfig != PLANARCONFIG_CONTIG) { 180 if (td->td_planarconfig != PLANARCONFIG_CONTIG) {
181 sprintf(emsg, "Sorry, can not handle LogLuv imag es with %s=%d", 181 sprintf(emsg, "Sorry, can not handle LogLuv imag es with %s=%d",
182 "Planarconfiguration", td->td_planarconfig); 182 "Planarconfiguration", td->td_planarconfig);
183 return (0); 183 return (0);
184 } 184 }
185 if( td->td_samplesperpixel != 3 )
186 {
187 sprintf(emsg,
188 "Sorry, can not handle image with %s=%d",
189 "Samples/pixel", td->td_samplesperpixel);
190 return 0;
191 }
185 break; 192 break;
186 case PHOTOMETRIC_CIELAB: 193 case PHOTOMETRIC_CIELAB:
194 if( td->td_samplesperpixel != 3 || td->td_bitspersample != 8 )
195 {
196 sprintf(emsg,
197 "Sorry, can not handle image with %s=%d and %s=%d",
198 "Samples/pixel", td->td_samplesperpixel,
199 "Bits/sample", td->td_bitspersample);
200 return 0;
201 }
187 break; 202 break;
188 default: 203 default:
189 sprintf(emsg, "Sorry, can not handle image with %s=%d", 204 sprintf(emsg, "Sorry, can not handle image with %s=%d",
190 photoTag, photometric); 205 photoTag, photometric);
191 return (0); 206 return (0);
192 } 207 }
193 return (1); 208 return (1);
194 } 209 }
195 210
196 void 211 void
(...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after
590 { 605 {
591 TIFF* tif = img->tif; 606 TIFF* tif = img->tif;
592 tileContigRoutine put = img->put.contig; 607 tileContigRoutine put = img->put.contig;
593 uint32 col, row, y, rowstoread; 608 uint32 col, row, y, rowstoread;
594 tmsize_t pos; 609 tmsize_t pos;
595 uint32 tw, th; 610 uint32 tw, th;
596 unsigned char* buf; 611 unsigned char* buf;
597 int32 fromskew, toskew; 612 int32 fromskew, toskew;
598 uint32 nrow; 613 uint32 nrow;
599 int ret = 1, flip; 614 int ret = 1, flip;
615 uint32 this_tw, tocol;
616 int32 this_toskew, leftmost_toskew;
617 int32 leftmost_fromskew;
618 uint32 leftmost_tw;
600 619
601 buf = (unsigned char*) _TIFFmalloc(TIFFTileSize(tif)); 620 buf = (unsigned char*) _TIFFmalloc(TIFFTileSize(tif));
602 if (buf == 0) { 621 if (buf == 0) {
603 TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "%s", "No s pace for tile buffer"); 622 TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "%s", "No s pace for tile buffer");
604 return (0); 623 return (0);
605 } 624 }
606 _TIFFmemset(buf, 0, TIFFTileSize(tif)); 625 _TIFFmemset(buf, 0, TIFFTileSize(tif));
607 TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw); 626 TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw);
608 TIFFGetField(tif, TIFFTAG_TILELENGTH, &th); 627 TIFFGetField(tif, TIFFTAG_TILELENGTH, &th);
609 628
610 flip = setorientation(img); 629 flip = setorientation(img);
611 if (flip & FLIP_VERTICALLY) { 630 if (flip & FLIP_VERTICALLY) {
612 y = h - 1; 631 y = h - 1;
613 toskew = -(int32)(tw + w); 632 toskew = -(int32)(tw + w);
614 } 633 }
615 else { 634 else {
616 y = 0; 635 y = 0;
617 toskew = -(int32)(tw - w); 636 toskew = -(int32)(tw - w);
618 } 637 }
619 638
639 /*
640 * Leftmost tile is clipped on left side if col_offset > 0.
641 */
642 leftmost_fromskew = img->col_offset % tw;
643 leftmost_tw = tw - leftmost_fromskew;
644 leftmost_toskew = toskew + leftmost_fromskew;
620 for (row = 0; row < h; row += nrow) 645 for (row = 0; row < h; row += nrow)
621 { 646 {
622 rowstoread = th - (row + img->row_offset) % th; 647 rowstoread = th - (row + img->row_offset) % th;
623 nrow = (row + rowstoread > h ? h - row : rowstoread); 648 nrow = (row + rowstoread > h ? h - row : rowstoread);
624 » for (col = 0; col < w; col += tw) 649 » fromskew = leftmost_fromskew;
650 » this_tw = leftmost_tw;
651 » this_toskew = leftmost_toskew;
652 » tocol = 0;
653 » col = img->col_offset;
654 » while (tocol < w)
625 { 655 {
626 » if (TIFFReadTile(tif, buf, col+img->col_offset, 656 » if (TIFFReadTile(tif, buf, col,
627 row+img->row_offset, 0, 0)==(tmsize_t)(-1) && img-> stoponerr) 657 row+img->row_offset, 0, 0)==(tmsize_t)(-1) && img-> stoponerr)
628 { 658 {
629 ret = 0; 659 ret = 0;
630 break; 660 break;
631 } 661 }
632 » 662 pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif) + \
633 » pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif); 663 » » ((tmsize_t) fromskew * img->samplesperpixel);
634 664 » if (tocol + this_tw > w)
635 » if (col + tw > w) 665 » {
636 { 666 » » /*
637 /* 667 » » * Rightmost tile is clipped on right side.
638 * Tile is clipped horizontally. Calculate 668 » » */
639 * visible portion and skewing factors. 669 » » fromskew = tw - (w - tocol);
640 */ 670 » » this_tw = tw - fromskew;
641 uint32 npix = w - col; 671 » » this_toskew = toskew + fromskew;
642 fromskew = tw - npix; 672 » }
643 (*put)(img, raster+y*w+col, col, y, 673 » (*put)(img, raster+y*w+tocol, tocol, y, this_tw, nrow, fromskew, thi s_toskew, buf + pos);
644 npix, nrow, fromskew, toskew + fromskew, buf + pos); 674 » tocol += this_tw;
645 } 675 » col += this_tw;
646 else 676 » /*
647 { 677 » * After the leftmost tile, tiles are no longer clipped on left side .
648 (*put)(img, raster+y*w+col, col, y, tw, nrow, 0, toskew, buf + p os); 678 » */
649 } 679 » fromskew = 0;
650 } 680 » this_tw = tw;
681 » this_toskew = toskew;
682 » }
651 683
652 y += (flip & FLIP_VERTICALLY ? -(int32) nrow : (int32) nrow); 684 y += (flip & FLIP_VERTICALLY ? -(int32) nrow : (int32) nrow);
653 } 685 }
654 _TIFFfree(buf); 686 _TIFFfree(buf);
655 687
656 if (flip & FLIP_HORIZONTALLY) { 688 if (flip & FLIP_HORIZONTALLY) {
657 uint32 line; 689 uint32 line;
658 690
659 for (line = 0; line < h; line++) { 691 for (line = 0; line < h; line++) {
660 uint32 *left = raster + (line * w); 692 uint32 *left = raster + (line * w);
(...skipping 30 matching lines...) Expand all
691 unsigned char* p1; 723 unsigned char* p1;
692 unsigned char* p2; 724 unsigned char* p2;
693 unsigned char* pa; 725 unsigned char* pa;
694 tmsize_t tilesize; 726 tmsize_t tilesize;
695 tmsize_t bufsize; 727 tmsize_t bufsize;
696 int32 fromskew, toskew; 728 int32 fromskew, toskew;
697 int alpha = img->alpha; 729 int alpha = img->alpha;
698 uint32 nrow; 730 uint32 nrow;
699 int ret = 1, flip; 731 int ret = 1, flip;
700 int colorchannels; 732 int colorchannels;
733 uint32 this_tw, tocol;
734 int32 this_toskew, leftmost_toskew;
735 int32 leftmost_fromskew;
736 uint32 leftmost_tw;
701 737
702 tilesize = TIFFTileSize(tif); 738 tilesize = TIFFTileSize(tif);
703 bufsize = TIFFSafeMultiply(tmsize_t,alpha?4:3,tilesize); 739 bufsize = TIFFSafeMultiply(tmsize_t,alpha?4:3,tilesize);
704 if (bufsize == 0) { 740 if (bufsize == 0) {
705 TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "Integer ov erflow in %s", "gtTileSeparate"); 741 TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "Integer ov erflow in %s", "gtTileSeparate");
706 return (0); 742 return (0);
707 } 743 }
708 buf = (unsigned char*) _TIFFmalloc(bufsize); 744 buf = (unsigned char*) _TIFFmalloc(bufsize);
709 if (buf == 0) { 745 if (buf == 0) {
710 TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "%s", "No s pace for tile buffer"); 746 TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "%s", "No s pace for tile buffer");
(...skipping 24 matching lines...) Expand all
735 case PHOTOMETRIC_PALETTE: 771 case PHOTOMETRIC_PALETTE:
736 colorchannels = 1; 772 colorchannels = 1;
737 p2 = p1 = p0; 773 p2 = p1 = p0;
738 break; 774 break;
739 775
740 default: 776 default:
741 colorchannels = 3; 777 colorchannels = 3;
742 break; 778 break;
743 } 779 }
744 780
781 /*
782 * Leftmost tile is clipped on left side if col_offset > 0.
783 */
784 leftmost_fromskew = img->col_offset % tw;
785 leftmost_tw = tw - leftmost_fromskew;
786 leftmost_toskew = toskew + leftmost_fromskew;
745 for (row = 0; row < h; row += nrow) 787 for (row = 0; row < h; row += nrow)
746 { 788 {
747 rowstoread = th - (row + img->row_offset) % th; 789 rowstoread = th - (row + img->row_offset) % th;
748 nrow = (row + rowstoread > h ? h - row : rowstoread); 790 nrow = (row + rowstoread > h ? h - row : rowstoread);
749 » » for (col = 0; col < w; col += tw) 791 » » fromskew = leftmost_fromskew;
792 » » this_tw = leftmost_tw;
793 » » this_toskew = leftmost_toskew;
794 » » tocol = 0;
795 » » col = img->col_offset;
796 » » while (tocol < w)
750 { 797 {
751 » » » if (TIFFReadTile(tif, p0, col+img->col_offset, 798 » » » if (TIFFReadTile(tif, p0, col,
752 row+img->row_offset,0,0)==(tmsize_t)(-1) && img->sto ponerr) 799 row+img->row_offset,0,0)==(tmsize_t)(-1) && img->sto ponerr)
753 { 800 {
754 ret = 0; 801 ret = 0;
755 break; 802 break;
756 } 803 }
757 if (colorchannels > 1 804 if (colorchannels > 1
758 && TIFFReadTile(tif, p1, col+img->col_offset, 805 && TIFFReadTile(tif, p1, col,
759 row+img->row_offset,0,1) == (tmsize_ t)(-1) 806 row+img->row_offset,0,1) == (tmsize_ t)(-1)
760 && img->stoponerr) 807 && img->stoponerr)
761 { 808 {
762 ret = 0; 809 ret = 0;
763 break; 810 break;
764 } 811 }
765 if (colorchannels > 1 812 if (colorchannels > 1
766 && TIFFReadTile(tif, p2, col+img->col_offset, 813 && TIFFReadTile(tif, p2, col,
767 row+img->row_offset,0,2) == (tmsize_ t)(-1) 814 row+img->row_offset,0,2) == (tmsize_ t)(-1)
768 && img->stoponerr) 815 && img->stoponerr)
769 { 816 {
770 ret = 0; 817 ret = 0;
771 break; 818 break;
772 } 819 }
773 if (alpha 820 if (alpha
774 && TIFFReadTile(tif,pa,col+img->col_offset, 821 && TIFFReadTile(tif,pa,col,
775 row+img->row_offset,0,colorchannels) == (tmsize_t)(-1) 822 row+img->row_offset,0,colorchannels) == (tmsize_t)(-1)
776 && img->stoponerr) 823 && img->stoponerr)
777 { 824 {
778 ret = 0; 825 ret = 0;
779 break; 826 break;
780 } 827 }
781 828
782 » » » pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif ); 829 » » » pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif ) + \
783 830 » » » ((tmsize_t) fromskew * img->samplesperpixel);
784 » » » if (col + tw > w) 831 » » » if (tocol + this_tw > w)
785 { 832 {
786 /* 833 /*
787 » » » » * Tile is clipped horizontally. Calculate 834 » » » » * Rightmost tile is clipped on right side.
788 » » » » * visible portion and skewing factors.
789 */ 835 */
790 » » » » uint32 npix = w - col; 836 » » » » fromskew = tw - (w - tocol);
791 » » » » fromskew = tw - npix; 837 » » » » this_tw = tw - fromskew;
792 » » » » (*put)(img, raster+y*w+col, col, y, 838 » » » » this_toskew = toskew + fromskew;
793 » » » » npix, nrow, fromskew, toskew + fromskew,
794 » » » » p0 + pos, p1 + pos, p2 + pos, (alpha?(pa+pos ):NULL));
795 » » » } else {
796 » » » » (*put)(img, raster+y*w+col, col, y,
797 » » » » tw, nrow, 0, toskew, p0 + pos, p1 + pos, p2 + pos, (alpha?(pa+pos):NULL));
798 } 839 }
840 (*put)(img, raster+y*w+tocol, tocol, y, this_tw, nrow, f romskew, this_toskew, \
841 p0 + pos, p1 + pos, p2 + pos, (alpha?(pa+pos):NU LL));
842 tocol += this_tw;
843 col += this_tw;
844 /*
845 * After the leftmost tile, tiles are no longer clipped o n left side.
846 */
847 fromskew = 0;
848 this_tw = tw;
849 this_toskew = toskew;
799 } 850 }
800 851
801 y += (flip & FLIP_VERTICALLY ?-(int32) nrow : (int32) nrow); 852 y += (flip & FLIP_VERTICALLY ?-(int32) nrow : (int32) nrow);
802 } 853 }
803 854
804 if (flip & FLIP_HORIZONTALLY) { 855 if (flip & FLIP_HORIZONTALLY) {
805 uint32 line; 856 uint32 line;
806 857
807 for (line = 0; line < h; line++) { 858 for (line = 0; line < h; line++) {
808 uint32 *left = raster + (line * w); 859 uint32 *left = raster + (line * w);
(...skipping 26 matching lines...) Expand all
835 uint32 row, y, nrow, nrowsub, rowstoread; 886 uint32 row, y, nrow, nrowsub, rowstoread;
836 tmsize_t pos; 887 tmsize_t pos;
837 unsigned char* buf; 888 unsigned char* buf;
838 uint32 rowsperstrip; 889 uint32 rowsperstrip;
839 uint16 subsamplinghor,subsamplingver; 890 uint16 subsamplinghor,subsamplingver;
840 uint32 imagewidth = img->width; 891 uint32 imagewidth = img->width;
841 tmsize_t scanline; 892 tmsize_t scanline;
842 int32 fromskew, toskew; 893 int32 fromskew, toskew;
843 int ret = 1, flip; 894 int ret = 1, flip;
844 895
896 TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRSUBSAMPLING, &subsamplinghor, &s ubsamplingver);
897 if( subsamplingver == 0 ) {
898 TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "Invalid ve rtical YCbCr subsampling");
899 return (0);
900 }
901
845 buf = (unsigned char*) _TIFFmalloc(TIFFStripSize(tif)); 902 buf = (unsigned char*) _TIFFmalloc(TIFFStripSize(tif));
846 if (buf == 0) { 903 if (buf == 0) {
847 TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "No space f or strip buffer"); 904 TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "No space f or strip buffer");
848 return (0); 905 return (0);
849 } 906 }
850 _TIFFmemset(buf, 0, TIFFStripSize(tif)); 907 _TIFFmemset(buf, 0, TIFFStripSize(tif));
851 908
852 flip = setorientation(img); 909 flip = setorientation(img);
853 if (flip & FLIP_VERTICALLY) { 910 if (flip & FLIP_VERTICALLY) {
854 y = h - 1; 911 y = h - 1;
855 toskew = -(int32)(w + w); 912 toskew = -(int32)(w + w);
856 } else { 913 } else {
857 y = 0; 914 y = 0;
858 toskew = -(int32)(w - w); 915 toskew = -(int32)(w - w);
859 } 916 }
860 917
861 TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); 918 TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
862 » TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRSUBSAMPLING, &subsamplinghor, &s ubsamplingver); 919
863 scanline = TIFFScanlineSize(tif); 920 scanline = TIFFScanlineSize(tif);
864 fromskew = (w < imagewidth ? imagewidth - w : 0); 921 fromskew = (w < imagewidth ? imagewidth - w : 0);
865 for (row = 0; row < h; row += nrow) 922 for (row = 0; row < h; row += nrow)
866 { 923 {
867 rowstoread = rowsperstrip - (row + img->row_offset) % rowsperstr ip; 924 rowstoread = rowsperstrip - (row + img->row_offset) % rowsperstr ip;
868 nrow = (row + rowstoread > h ? h - row : rowstoread); 925 nrow = (row + rowstoread > h ? h - row : rowstoread);
869 nrowsub = nrow; 926 nrowsub = nrow;
870 if ((nrowsub%subsamplingver)!=0) 927 if ((nrowsub%subsamplingver)!=0)
871 nrowsub+=subsamplingver-nrowsub%subsamplingver; 928 nrowsub+=subsamplingver-nrowsub%subsamplingver;
872 if (TIFFReadEncodedStrip(tif, 929 if (TIFFReadEncodedStrip(tif,
873 TIFFComputeStrip(tif,row+img->row_offset, 0), 930 TIFFComputeStrip(tif,row+img->row_offset, 0),
874 buf, 931 buf,
875 ((row + img->row_offset)%rowsperstrip + nrowsub) * scanline) ==(tmsize_t)(-1) 932 ((row + img->row_offset)%rowsperstrip + nrowsub) * scanline) ==(tmsize_t)(-1)
876 && img->stoponerr) 933 && img->stoponerr)
877 { 934 {
878 ret = 0; 935 ret = 0;
879 break; 936 break;
880 } 937 }
881 938
882 » » pos = ((row + img->row_offset) % rowsperstrip) * scanline; 939 » » pos = ((row + img->row_offset) % rowsperstrip) * scanline + \
940 » » » ((tmsize_t) img->col_offset * img->samplesperpixel);
883 (*put)(img, raster+y*w, 0, y, w, nrow, fromskew, toskew, buf + p os); 941 (*put)(img, raster+y*w, 0, y, w, nrow, fromskew, toskew, buf + p os);
884 y += (flip & FLIP_VERTICALLY ? -(int32) nrow : (int32) nrow); 942 y += (flip & FLIP_VERTICALLY ? -(int32) nrow : (int32) nrow);
885 } 943 }
886 944
887 if (flip & FLIP_HORIZONTALLY) { 945 if (flip & FLIP_HORIZONTALLY) {
888 uint32 line; 946 uint32 line;
889 947
890 for (line = 0; line < h; line++) { 948 for (line = 0; line < h; line++) {
891 uint32 *left = raster + (line * w); 949 uint32 *left = raster + (line * w);
892 uint32 *right = left + w - 1; 950 uint32 *right = left + w - 1;
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
1003 { 1061 {
1004 if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offs et_row, colorchannels), 1062 if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offs et_row, colorchannels),
1005 pa, ((row + img->row_offset)%rowsperstrip + nrow) * scanline)==(tmsize_t)(-1) 1063 pa, ((row + img->row_offset)%rowsperstrip + nrow) * scanline)==(tmsize_t)(-1)
1006 && img->stoponerr) 1064 && img->stoponerr)
1007 { 1065 {
1008 ret = 0; 1066 ret = 0;
1009 break; 1067 break;
1010 } 1068 }
1011 } 1069 }
1012 1070
1013 » » pos = ((row + img->row_offset) % rowsperstrip) * scanline; 1071 » » pos = ((row + img->row_offset) % rowsperstrip) * scanline + \
1072 » » » ((tmsize_t) img->col_offset * img->samplesperpixel);
1014 (*put)(img, raster+y*w, 0, y, w, nrow, fromskew, toskew, p0 + po s, p1 + pos, 1073 (*put)(img, raster+y*w, 0, y, w, nrow, fromskew, toskew, p0 + po s, p1 + pos,
1015 p2 + pos, (alpha?(pa+pos):NULL)); 1074 p2 + pos, (alpha?(pa+pos):NULL));
1016 y += (flip & FLIP_VERTICALLY ? -(int32) nrow : (int32) nrow); 1075 y += (flip & FLIP_VERTICALLY ? -(int32) nrow : (int32) nrow);
1017 } 1076 }
1018 1077
1019 if (flip & FLIP_HORIZONTALLY) { 1078 if (flip & FLIP_HORIZONTALLY) {
1020 uint32 line; 1079 uint32 line;
1021 1080
1022 for (line = 0; line < h; line++) { 1081 for (line = 0; line < h; line++) {
1023 uint32 *left = raster + (line * w); 1082 uint32 *left = raster + (line * w);
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after
1436 cp += toskew; 1495 cp += toskew;
1437 wp += fromskew; 1496 wp += fromskew;
1438 } 1497 }
1439 } 1498 }
1440 1499
1441 /* 1500 /*
1442 * 8-bit packed CMYK samples w/o Map => RGB 1501 * 8-bit packed CMYK samples w/o Map => RGB
1443 * 1502 *
1444 * NB: The conversion of CMYK->RGB is *very* crude. 1503 * NB: The conversion of CMYK->RGB is *very* crude.
1445 */ 1504 */
1446 /*DECLAREContigPutFunc(putRGBcontig8bitCMYKtile) 1505 DECLAREContigPutFunc(putRGBcontig8bitCMYKtile)
1447 { 1506 {
1448 int samplesperpixel = img->samplesperpixel; 1507 int samplesperpixel = img->samplesperpixel;
1449 uint16 r, g, b, k; 1508 uint16 r, g, b, k;
1450 » 1509
1451 (void) x; (void) y; 1510 (void) x; (void) y;
1452 fromskew *= samplesperpixel; 1511 fromskew *= samplesperpixel;
1453 while (h-- > 0) { 1512 while (h-- > 0) {
1454 » » UNROLL8(w, NOP, 1513 » UNROLL8(w, NOP,
1455 » » k = 255 - pp[3]; 1514 » k = 255 - pp[3];
1456 » » r = (k*(255-pp[0]))/255; 1515 » r = (k*(255-pp[0]))/255;
1457 » » g = (k*(255-pp[1]))/255; 1516 » g = (k*(255-pp[1]))/255;
1458 » » b = (k*(255-pp[2]))/255; 1517 » b = (k*(255-pp[2]))/255;
1459 » » *cp++ = PACK(r, g, b); 1518 » *cp++ = PACK(r, g, b);
1460 » » pp += samplesperpixel); 1519 » pp += samplesperpixel);
1461 » » cp += toskew; 1520 » cp += toskew;
1462 » » pp += fromskew; 1521 » pp += fromskew;
1463 }*/ 1522 }
1464 /* Modify in 20090723 by Sunliang.Liu */
1465 DECLAREContigPutFunc(putRGBcontig8bitCMYKtile)
1466 {
1467 » int samplesperpixel = img->samplesperpixel;
1468 » uint8 r, g, b, k;
1469
1470 » (void) x; (void) y;
1471 » fromskew *= samplesperpixel;
1472 » while (h-- > 0) {
1473 » » UNROLL8(w, NOP,
1474 » » » if(!TIFFCmyk2Rgb(img->tif->tif_clientdata,pp[0],pp[1],pp [2],pp[3],
1475 » » » » &r,&g,&b)){
1476 » » » » » k = 255 - pp[3];
1477 » » » » » r = (k*(255-pp[0]))/255;
1478 » » » » » g = (k*(255-pp[1]))/255;
1479 » » » » » b = (k*(255-pp[2]))/255;
1480 » » » }
1481
1482 » » » *cp++ = PACK(r, g, b);
1483 » » » pp += samplesperpixel);
1484 » » » cp += toskew;
1485 » » » pp += fromskew;
1486 » }
1487 } 1523 }
1488 1524
1489 /* 1525 /*
1490 * 16-bit packed CMYK samples w/o Map => RGB(8-bit)
1491 *
1492 * NB: The conversion of CMYK->RGB is *very* crude.
1493 */
1494 DECLAREContigPutFunc(putRGBcontig16bitCMYKtile)
1495 {
1496 int samplesperpixel = img->samplesperpixel;
1497 uint16* wp = (uint16*)pp;
1498 uint8 C, M, Y, K;
1499 uint8 r, g, b;
1500
1501 (void) x; (void) y;
1502 fromskew *= samplesperpixel;
1503 while (h-- > 0) {
1504 UNROLL8(w, NOP,
1505 C = wp[0]>>8;M = wp[1]>>8;Y = wp[2]>>8;K = wp[3]>>8;
1506 if(!TIFFCmyk2Rgb(img->tif->tif_clientdata,C,M,Y,K,
1507 &r,&g,&b)){
1508 K = 255 - K;
1509 r = (K*(255-C))/255;
1510 g = (K*(255-M))/255;
1511 b = (K*(255-Y))/255;
1512 }
1513
1514 *cp++ = PACK(r, g, b);
1515 wp += samplesperpixel);
1516 cp += toskew;
1517 wp += fromskew;
1518 }
1519 }
1520
1521 /*
1522 * 8-bit packed CMYK samples w/Map => RGB 1526 * 8-bit packed CMYK samples w/Map => RGB
1523 * 1527 *
1524 * NB: The conversion of CMYK->RGB is *very* crude. 1528 * NB: The conversion of CMYK->RGB is *very* crude.
1525 */ 1529 */
1526 /*
1527 DECLAREContigPutFunc(putRGBcontig8bitCMYKMaptile) 1530 DECLAREContigPutFunc(putRGBcontig8bitCMYKMaptile)
1528 { 1531 {
1529 int samplesperpixel = img->samplesperpixel; 1532 int samplesperpixel = img->samplesperpixel;
1530 TIFFRGBValue* Map = img->Map; 1533 TIFFRGBValue* Map = img->Map;
1531 uint16 r, g, b, k; 1534 uint16 r, g, b, k;
1532 1535
1533 (void) y; 1536 (void) y;
1534 fromskew *= samplesperpixel; 1537 fromskew *= samplesperpixel;
1535 while (h-- > 0) { 1538 while (h-- > 0) {
1536 for (x = w; x-- > 0;) { 1539 for (x = w; x-- > 0;) {
1537 k = 255 - pp[3]; 1540 k = 255 - pp[3];
1538 r = (k*(255-pp[0]))/255; 1541 r = (k*(255-pp[0]))/255;
1539 g = (k*(255-pp[1]))/255; 1542 g = (k*(255-pp[1]))/255;
1540 b = (k*(255-pp[2]))/255; 1543 b = (k*(255-pp[2]))/255;
1541 *cp++ = PACK(Map[r], Map[g], Map[b]); 1544 *cp++ = PACK(Map[r], Map[g], Map[b]);
1542 pp += samplesperpixel; 1545 pp += samplesperpixel;
1543 } 1546 }
1544 pp += fromskew; 1547 pp += fromskew;
1545 cp += toskew; 1548 cp += toskew;
1546 } 1549 }
1547 }*/
1548 /* Modify in 20090723 by Sunliang.Liu */
1549 DECLAREContigPutFunc(putRGBcontig8bitCMYKMaptile)
1550 {
1551 int samplesperpixel = img->samplesperpixel;
1552 TIFFRGBValue* Map = img->Map;
1553 uint8 r, g, b, k;
1554
1555 (void) y;
1556 fromskew *= samplesperpixel;
1557 while (h-- > 0) {
1558 for (x = w; x-- > 0;) {
1559 if(!TIFFCmyk2Rgb(img->tif->tif_clientdata,pp[0],pp[1],pp [2],pp[3],
1560 &r,&g,&b)){
1561 k = 255 - pp[3];
1562 r = (k*(255-pp[0]))/255;
1563 g = (k*(255-pp[1]))/255;
1564 b = (k*(255-pp[2]))/255;
1565 }
1566 *cp++ = PACK(Map[r], Map[g], Map[b]);
1567 pp += samplesperpixel;
1568 }
1569 pp += fromskew;
1570 cp += toskew;
1571 }
1572 }
1573
1574 /*
1575 * 16-bit packed CMYK samples w/Map => RGB(8-bit)
1576 *
1577 * NB: The conversion of CMYK->RGB is *very* crude.
1578 */
1579 DECLAREContigPutFunc(putRGBcontig16bitCMYKMaptile)
1580 {
1581 int samplesperpixel = img->samplesperpixel;
1582 TIFFRGBValue* Map = img->Map;
1583 uint16* wp = (uint16*)pp;
1584 uint8 C, M, Y, K;
1585 uint8 r, g, b;
1586
1587 (void) y;
1588 fromskew *= samplesperpixel;
1589 while (h-- > 0) {
1590 for (x = w; x-- > 0;) {
1591 C = wp[0]>>8;M = wp[1]>>8;Y = wp[2]>>8;K = wp[3]>>8;
1592 if(!TIFFCmyk2Rgb(img->tif->tif_clientdata,C,M,Y,K,
1593 &r,&g,&b)){
1594 K = 255 - K;
1595 r = (K*(255-C))/255;
1596 g = (K*(255-M))/255;
1597 b = (K*(255-Y))/255;
1598 }
1599 *cp++ = PACK(Map[r], Map[g], Map[b]);
1600 wp += samplesperpixel;
1601 }
1602 wp += fromskew;
1603 cp += toskew;
1604 }
1605 } 1550 }
1606 1551
1607 #define DECLARESepPutFunc(name) \ 1552 #define DECLARESepPutFunc(name) \
1608 static void name(\ 1553 static void name(\
1609 TIFFRGBAImage* img,\ 1554 TIFFRGBAImage* img,\
1610 uint32* cp,\ 1555 uint32* cp,\
1611 uint32 x, uint32 y, \ 1556 uint32 x, uint32 y, \
1612 uint32 w, uint32 h,\ 1557 uint32 w, uint32 h,\
1613 int32 fromskew, int32 toskew,\ 1558 int32 fromskew, int32 toskew,\
1614 unsigned char* r, unsigned char* g, unsigned char* b, unsigned char* a\ 1559 unsigned char* r, unsigned char* g, unsigned char* b, unsigned char* a\
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after
1959 /* 1904 /*
1960 * 8-bit packed YCbCr samples w/ 4,2 subsampling => RGB 1905 * 8-bit packed YCbCr samples w/ 4,2 subsampling => RGB
1961 */ 1906 */
1962 DECLAREContigPutFunc(putcontig8bitYCbCr42tile) 1907 DECLAREContigPutFunc(putcontig8bitYCbCr42tile)
1963 { 1908 {
1964 uint32* cp1 = cp+w+toskew; 1909 uint32* cp1 = cp+w+toskew;
1965 int32 incr = 2*toskew+w; 1910 int32 incr = 2*toskew+w;
1966 1911
1967 (void) y; 1912 (void) y;
1968 fromskew = (fromskew * 10) / 4; 1913 fromskew = (fromskew * 10) / 4;
1969 if ((h & 3) == 0 && (w & 1) == 0) { 1914 if ((w & 3) == 0 && (h & 1) == 0) {
1970 for (; h >= 2; h -= 2) { 1915 for (; h >= 2; h -= 2) {
1971 x = w>>2; 1916 x = w>>2;
1972 do { 1917 do {
1973 int32 Cb = pp[8]; 1918 int32 Cb = pp[8];
1974 int32 Cr = pp[9]; 1919 int32 Cr = pp[9];
1975 1920
1976 YCbCrtoRGB(cp [0], pp[0]); 1921 YCbCrtoRGB(cp [0], pp[0]);
1977 YCbCrtoRGB(cp [1], pp[1]); 1922 YCbCrtoRGB(cp [1], pp[1]);
1978 YCbCrtoRGB(cp [2], pp[2]); 1923 YCbCrtoRGB(cp [2], pp[2]);
1979 YCbCrtoRGB(cp [3], pp[3]); 1924 YCbCrtoRGB(cp [3], pp[3]);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
2036 1981
2037 /* 1982 /*
2038 * 8-bit packed YCbCr samples w/ 4,1 subsampling => RGB 1983 * 8-bit packed YCbCr samples w/ 4,1 subsampling => RGB
2039 */ 1984 */
2040 DECLAREContigPutFunc(putcontig8bitYCbCr41tile) 1985 DECLAREContigPutFunc(putcontig8bitYCbCr41tile)
2041 { 1986 {
2042 (void) y; 1987 (void) y;
2043 /* XXX adjust fromskew */ 1988 /* XXX adjust fromskew */
2044 do { 1989 do {
2045 x = w>>2; 1990 x = w>>2;
2046 » do { 1991 » while(x>0) {
2047 int32 Cb = pp[4]; 1992 int32 Cb = pp[4];
2048 int32 Cr = pp[5]; 1993 int32 Cr = pp[5];
2049 1994
2050 YCbCrtoRGB(cp [0], pp[0]); 1995 YCbCrtoRGB(cp [0], pp[0]);
2051 YCbCrtoRGB(cp [1], pp[1]); 1996 YCbCrtoRGB(cp [1], pp[1]);
2052 YCbCrtoRGB(cp [2], pp[2]); 1997 YCbCrtoRGB(cp [2], pp[2]);
2053 YCbCrtoRGB(cp [3], pp[3]); 1998 YCbCrtoRGB(cp [3], pp[3]);
2054 1999
2055 cp += 4; 2000 cp += 4;
2056 pp += 6; 2001 pp += 6;
2057 » } while (--x); 2002 » » x--;
2003 » }
2058 2004
2059 if( (w&3) != 0 ) 2005 if( (w&3) != 0 )
2060 { 2006 {
2061 int32 Cb = pp[4]; 2007 int32 Cb = pp[4];
2062 int32 Cr = pp[5]; 2008 int32 Cr = pp[5];
2063 2009
2064 switch( (w&3) ) { 2010 switch( (w&3) ) {
2065 case 3: YCbCrtoRGB(cp [2], pp[2]); 2011 case 3: YCbCrtoRGB(cp [2], pp[2]);
2066 case 2: YCbCrtoRGB(cp [1], pp[1]); 2012 case 2: YCbCrtoRGB(cp [1], pp[1]);
2067 case 1: YCbCrtoRGB(cp [0], pp[0]); 2013 case 1: YCbCrtoRGB(cp [0], pp[0]);
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
2138 2084
2139 /* 2085 /*
2140 * 8-bit packed YCbCr samples w/ 2,1 subsampling => RGB 2086 * 8-bit packed YCbCr samples w/ 2,1 subsampling => RGB
2141 */ 2087 */
2142 DECLAREContigPutFunc(putcontig8bitYCbCr21tile) 2088 DECLAREContigPutFunc(putcontig8bitYCbCr21tile)
2143 { 2089 {
2144 (void) y; 2090 (void) y;
2145 fromskew = (fromskew * 4) / 2; 2091 fromskew = (fromskew * 4) / 2;
2146 do { 2092 do {
2147 x = w>>1; 2093 x = w>>1;
2148 » » do { 2094 » » while(x>0) {
2149 int32 Cb = pp[2]; 2095 int32 Cb = pp[2];
2150 int32 Cr = pp[3]; 2096 int32 Cr = pp[3];
2151 2097
2152 YCbCrtoRGB(cp[0], pp[0]); 2098 YCbCrtoRGB(cp[0], pp[0]);
2153 YCbCrtoRGB(cp[1], pp[1]); 2099 YCbCrtoRGB(cp[1], pp[1]);
2154 2100
2155 cp += 2; 2101 cp += 2;
2156 pp += 4; 2102 pp += 4;
2157 » » } while (--x); 2103 » » » x --;
2104 » » }
2158 2105
2159 if( (w&1) != 0 ) 2106 if( (w&1) != 0 )
2160 { 2107 {
2161 int32 Cb = pp[2]; 2108 int32 Cb = pp[2];
2162 int32 Cr = pp[3]; 2109 int32 Cr = pp[3];
2163 2110
2164 YCbCrtoRGB(cp[0], pp[0]); 2111 YCbCrtoRGB(cp[0], pp[0]);
2165 2112
2166 cp += 1; 2113 cp += 1;
2167 pp += 4; 2114 pp += 4;
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
2305 refWhite[0] = whitePoint[0] / whitePoint[1] * refWhite[1]; 2252 refWhite[0] = whitePoint[0] / whitePoint[1] * refWhite[1];
2306 refWhite[2] = (1.0F - whitePoint[0] - whitePoint[1]) 2253 refWhite[2] = (1.0F - whitePoint[0] - whitePoint[1])
2307 / whitePoint[1] * refWhite[1]; 2254 / whitePoint[1] * refWhite[1];
2308 if (TIFFCIELabToRGBInit(img->cielab, &display_sRGB, refWhite) < 0) { 2255 if (TIFFCIELabToRGBInit(img->cielab, &display_sRGB, refWhite) < 0) {
2309 TIFFErrorExt(img->tif->tif_clientdata, module, 2256 TIFFErrorExt(img->tif->tif_clientdata, module,
2310 "Failed to initialize CIE L*a*b*->RGB conversion state."); 2257 "Failed to initialize CIE L*a*b*->RGB conversion state.");
2311 _TIFFfree(img->cielab); 2258 _TIFFfree(img->cielab);
2312 return NULL; 2259 return NULL;
2313 } 2260 }
2314 2261
2315 » return (tileContigRoutine)putcontig8bitCIELab; 2262 » return putcontig8bitCIELab;
2316 } 2263 }
2317 2264
2318 /* 2265 /*
2319 * Greyscale images with less than 8 bits/sample are handled 2266 * Greyscale images with less than 8 bits/sample are handled
2320 * with a table to avoid lots of shifts and masks. The table 2267 * with a table to avoid lots of shifts and masks. The table
2321 * is setup so that put*bwtile (below) can retrieve 8/bitspersample 2268 * is setup so that put*bwtile (below) can retrieve 8/bitspersample
2322 * pixel values simply by indexing into the table with one 2269 * pixel values simply by indexing into the table with one
2323 * number. 2270 * number.
2324 */ 2271 */
2325 static int 2272 static int
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
2587 { 2534 {
2588 if (BuildMapBitdepth16To8(img)) 2535 if (BuildMapBitdepth16To8(img))
2589 img->put.contig = putRGB contig16bittile; 2536 img->put.contig = putRGB contig16bittile;
2590 } 2537 }
2591 break; 2538 break;
2592 } 2539 }
2593 break; 2540 break;
2594 case PHOTOMETRIC_SEPARATED: 2541 case PHOTOMETRIC_SEPARATED:
2595 if (buildMap(img)) { 2542 if (buildMap(img)) {
2596 if (img->bitspersample == 8) { 2543 if (img->bitspersample == 8) {
2597 » » » » if (!img->Map) 2544 » » » » » if (!img->Map)
2598 » » » » » img->put.contig = putRGBcontig8bitCMYKti le; 2545 » » » » » » img->put.contig = putRGBcontig8b itCMYKtile;
2599 » » » » else 2546 » » » » » else
2600 » » » » » img->put.contig = putRGBcontig8bitCMYKMa ptile; 2547 » » » » » » img->put.contig = putRGBcontig8b itCMYKMaptile;
2548 » » » » }
2601 } 2549 }
2602 » » » else if(img->bitspersample == 16) /*LiuSunliang added 16 bpp CMYK support.*/ 2550 » » » break;
2603 » » » { 2551 » » case PHOTOMETRIC_PALETTE:
2604 » » » » if (!img->Map)
2605 » » » » » img->put.contig = putRGBcontig16bitCMYKt ile;
2606 » » » » else
2607 » » » » » img->put.contig = putRGBcontig16bitCMYKM aptile;
2608 » » » }
2609 » » }
2610 » » break;
2611 » case PHOTOMETRIC_PALETTE:
2612 if (buildMap(img)) { 2552 if (buildMap(img)) {
2613 switch (img->bitspersample) { 2553 switch (img->bitspersample) {
2614 case 8: 2554 case 8:
2615 img->put.contig = put8bitcmaptil e; 2555 img->put.contig = put8bitcmaptil e;
2616 break; 2556 break;
2617 case 4: 2557 case 4:
2618 img->put.contig = put4bitcmaptil e; 2558 img->put.contig = put4bitcmaptil e;
2619 break; 2559 break;
2620 case 2: 2560 case 2:
2621 img->put.contig = put2bitcmaptil e; 2561 img->put.contig = put2bitcmaptil e;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2655 if ((img->bitspersample==8) && (img->samplesperpixel==3) ) 2595 if ((img->bitspersample==8) && (img->samplesperpixel==3) )
2656 { 2596 {
2657 if (initYCbCrConversion(img)!=0) 2597 if (initYCbCrConversion(img)!=0)
2658 { 2598 {
2659 /* 2599 /*
2660 * The 6.0 spec says that subsampling mu st be 2600 * The 6.0 spec says that subsampling mu st be
2661 * one of 1, 2, or 4, and that vertical subsampling 2601 * one of 1, 2, or 4, and that vertical subsampling
2662 * must always be <= horizontal subsampl ing; so 2602 * must always be <= horizontal subsampl ing; so
2663 * there are only a few possibilities an d we just 2603 * there are only a few possibilities an d we just
2664 * enumerate the cases. 2604 * enumerate the cases.
2665 » » » » » * Joris: added support for the [1,2] ca se, nonetheless, to accomodate 2605 » » » » » * Joris: added support for the [1,2] ca se, nonetheless, to accommodate
2666 * some OJPEG files 2606 * some OJPEG files
2667 */ 2607 */
2668 uint16 SubsamplingHor; 2608 uint16 SubsamplingHor;
2669 uint16 SubsamplingVer; 2609 uint16 SubsamplingVer;
2670 TIFFGetFieldDefaulted(img->tif, TIFFTAG_ YCBCRSUBSAMPLING, &SubsamplingHor, &SubsamplingVer); 2610 TIFFGetFieldDefaulted(img->tif, TIFFTAG_ YCBCRSUBSAMPLING, &SubsamplingHor, &SubsamplingVer);
2671 switch ((SubsamplingHor<<4)|SubsamplingV er) { 2611 switch ((SubsamplingHor<<4)|SubsamplingV er) {
2672 case 0x44: 2612 case 0x44:
2673 img->put.contig = putcon tig8bitYCbCr44tile; 2613 img->put.contig = putcon tig8bitYCbCr44tile;
2674 break; 2614 break;
2675 case 0x42: 2615 case 0x42:
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after
2979 } 2919 }
2980 2920
2981 /* vim: set ts=8 sts=8 sw=8 noet: */ 2921 /* vim: set ts=8 sts=8 sw=8 noet: */
2982 /* 2922 /*
2983 * Local Variables: 2923 * Local Variables:
2984 * mode: c 2924 * mode: c
2985 * c-basic-offset: 8 2925 * c-basic-offset: 8
2986 * fill-column: 78 2926 * fill-column: 78
2987 * End: 2927 * End:
2988 */ 2928 */
2989
OLDNEW
« no previous file with comments | « third_party/libtiff/tif_flush.c ('k') | third_party/libtiff/tif_jpeg.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698