]>
git.saurik.com Git - wxWidgets.git/blob - src/tiff/libtiff/tif_strip.c
   4  * Copyright (c) 1991-1997 Sam Leffler 
   5  * Copyright (c) 1991-1997 Silicon Graphics, Inc. 
   7  * Permission to use, copy, modify, distribute, and sell this software and  
   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 
  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 
  12  * publicity relating to the software without the specific, prior written 
  13  * permission of Sam Leffler and Silicon Graphics. 
  15  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,  
  16  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY  
  17  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.   
  19  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR 
  20  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, 
  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  
  23  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE  
  30  * Strip-organized Image Support Routines. 
  35 summarize(TIFF
* tif
, size_t summand1
, size_t summand2
, const char* where
) 
  38          * XXX: We are using casting to uint32 here, bacause sizeof(size_t) 
  39          * may be larger than sizeof(uint32) on 64-bit architectures. 
  41         uint32  bytes 
= summand1 
+ summand2
; 
  43         if (bytes 
- summand1 
!= summand2
) { 
  44                 TIFFErrorExt(tif
->tif_clientdata
, tif
->tif_name
, "Integer overflow in %s", where
); 
  52 multiply(TIFF
* tif
, size_t nmemb
, size_t elem_size
, const char* where
) 
  54         uint32  bytes 
= nmemb 
* elem_size
; 
  56         if (elem_size 
&& bytes 
/ elem_size 
!= nmemb
) { 
  57                 TIFFErrorExt(tif
->tif_clientdata
, tif
->tif_name
, "Integer overflow in %s", where
); 
  65  * Compute which strip a (row,sample) value is in. 
  68 TIFFComputeStrip(TIFF
* tif
, uint32 row
, tsample_t sample
) 
  70         TIFFDirectory 
*td 
= &tif
->tif_dir
; 
  73         strip 
= row 
/ td
->td_rowsperstrip
; 
  74         if (td
->td_planarconfig 
== PLANARCONFIG_SEPARATE
) { 
  75                 if (sample 
>= td
->td_samplesperpixel
) { 
  76                         TIFFErrorExt(tif
->tif_clientdata
, tif
->tif_name
, 
  77                             "%lu: Sample out of range, max %lu", 
  78                             (unsigned long) sample
, (unsigned long) td
->td_samplesperpixel
); 
  79                         return ((tstrip_t
) 0); 
  81                 strip 
+= sample
*td
->td_stripsperimage
; 
  87  * Compute how many strips are in an image. 
  90 TIFFNumberOfStrips(TIFF
* tif
) 
  92         TIFFDirectory 
*td 
= &tif
->tif_dir
; 
  95         nstrips 
= (td
->td_rowsperstrip 
== (uint32
) -1 ? 1 : 
  96              TIFFhowmany(td
->td_imagelength
, td
->td_rowsperstrip
)); 
  97         if (td
->td_planarconfig 
== PLANARCONFIG_SEPARATE
) 
  98                 nstrips 
= multiply(tif
, nstrips
, td
->td_samplesperpixel
, 
  99                                    "TIFFNumberOfStrips"); 
 104  * Compute the # bytes in a variable height, row-aligned strip. 
 107 TIFFVStripSize(TIFF
* tif
, uint32 nrows
) 
 109         TIFFDirectory 
*td 
= &tif
->tif_dir
; 
 111         if (nrows 
== (uint32
) -1) 
 112                 nrows 
= td
->td_imagelength
; 
 113         if (td
->td_planarconfig 
== PLANARCONFIG_CONTIG 
&& 
 114             td
->td_photometric 
== PHOTOMETRIC_YCBCR 
&& 
 117                  * Packed YCbCr data contain one Cb+Cr for every 
 118                  * HorizontalSampling*VerticalSampling Y values. 
 119                  * Must also roundup width and height when calculating 
 120                  * since images that are not a multiple of the 
 121                  * horizontal/vertical subsampling area include 
 122                  * YCbCr data for the extended image. 
 124                 uint16 ycbcrsubsampling
[2]; 
 125                 tsize_t w
, scanline
, samplingarea
; 
 127                 TIFFGetField( tif
, TIFFTAG_YCBCRSUBSAMPLING
,  
 128                               ycbcrsubsampling 
+ 0,  
 129                               ycbcrsubsampling 
+ 1 ); 
 131                 samplingarea 
= ycbcrsubsampling
[0]*ycbcrsubsampling
[1]; 
 132                 if (samplingarea 
== 0) { 
 133                         TIFFErrorExt(tif
->tif_clientdata
, tif
->tif_name
, 
 134                                      "Invalid YCbCr subsampling"); 
 138                 w 
= TIFFroundup(td
->td_imagewidth
, ycbcrsubsampling
[0]); 
 139                 scanline 
= TIFFhowmany8(multiply(tif
, w
, td
->td_bitspersample
, 
 141                 nrows 
= TIFFroundup(nrows
, ycbcrsubsampling
[1]); 
 142                 /* NB: don't need TIFFhowmany here 'cuz everything is rounded */ 
 143                 scanline 
= multiply(tif
, nrows
, scanline
, "TIFFVStripSize"); 
 145                     summarize(tif
, scanline
, 
 146                               multiply(tif
, 2, scanline 
/ samplingarea
, 
 147                                        "TIFFVStripSize"), "TIFFVStripSize")); 
 149                 return ((tsize_t
) multiply(tif
, nrows
, TIFFScanlineSize(tif
), 
 155  * Compute the # bytes in a raw strip. 
 158 TIFFRawStripSize(TIFF
* tif
, tstrip_t strip
) 
 160         TIFFDirectory
* td 
= &tif
->tif_dir
; 
 161         tsize_t bytecount 
= td
->td_stripbytecount
[strip
]; 
 163         if (bytecount 
<= 0) { 
 164                 TIFFErrorExt(tif
->tif_clientdata
, tif
->tif_name
, 
 165                           "%lu: Invalid strip byte count, strip %lu", 
 166                           (unsigned long) bytecount
, (unsigned long) strip
); 
 167                 bytecount 
= (tsize_t
) -1; 
 174  * Compute the # bytes in a (row-aligned) strip. 
 176  * Note that if RowsPerStrip is larger than the 
 177  * recorded ImageLength, then the strip size is 
 178  * truncated to reflect the actual space required 
 182 TIFFStripSize(TIFF
* tif
) 
 184         TIFFDirectory
* td 
= &tif
->tif_dir
; 
 185         uint32 rps 
= td
->td_rowsperstrip
; 
 186         if (rps 
> td
->td_imagelength
) 
 187                 rps 
= td
->td_imagelength
; 
 188         return (TIFFVStripSize(tif
, rps
)); 
 192  * Compute a default strip size based on the image 
 193  * characteristics and a requested value.  If the 
 194  * request is <1 then we choose a strip size according 
 195  * to certain heuristics. 
 198 TIFFDefaultStripSize(TIFF
* tif
, uint32 request
) 
 200         return (*tif
->tif_defstripsize
)(tif
, request
); 
 204 _TIFFDefaultStripSize(TIFF
* tif
, uint32 s
) 
 208                  * If RowsPerStrip is unspecified, try to break the 
 209                  * image up into strips that are approximately 
 210                  * STRIP_SIZE_DEFAULT bytes long. 
 212                 tsize_t scanline 
= TIFFScanlineSize(tif
); 
 213                 s 
= (uint32
)STRIP_SIZE_DEFAULT 
/ (scanline 
== 0 ? 1 : scanline
); 
 214                 if (s 
== 0)             /* very wide images */ 
 221  * Return the number of bytes to read/write in a call to 
 222  * one of the scanline-oriented i/o routines.  Note that 
 223  * this number may be 1/samples-per-pixel if data is 
 224  * stored as separate planes. 
 227 TIFFScanlineSize(TIFF
* tif
) 
 229         TIFFDirectory 
*td 
= &tif
->tif_dir
; 
 232         if (td
->td_planarconfig 
== PLANARCONFIG_CONTIG
) { 
 233                 if (td
->td_photometric 
== PHOTOMETRIC_YCBCR
 
 234                     && !isUpSampled(tif
)) { 
 235                         uint16 ycbcrsubsampling
[2]; 
 237                         TIFFGetField(tif
, TIFFTAG_YCBCRSUBSAMPLING
,  
 238                                      ycbcrsubsampling 
+ 0, 
 239                                      ycbcrsubsampling 
+ 1); 
 241                         if (ycbcrsubsampling
[0] == 0) { 
 242                                 TIFFErrorExt(tif
->tif_clientdata
, tif
->tif_name
, 
 243                                              "Invalid YCbCr subsampling"); 
 247                         scanline 
= TIFFroundup(td
->td_imagewidth
, 
 248                                                ycbcrsubsampling
[0]); 
 249                         scanline 
= TIFFhowmany8(multiply(tif
, scanline
, 
 250                                                          td
->td_bitspersample
, 
 251                                                          "TIFFScanlineSize")); 
 253                                 summarize(tif
, scanline
, 
 255                                                 scanline 
/ ycbcrsubsampling
[0], 
 259                         scanline 
= multiply(tif
, td
->td_imagewidth
, 
 260                                             td
->td_samplesperpixel
, 
 264                 scanline 
= td
->td_imagewidth
; 
 265         return ((tsize_t
) TIFFhowmany8(multiply(tif
, scanline
, 
 266                                                 td
->td_bitspersample
, 
 267                                                 "TIFFScanlineSize"))); 
 271  * Return the number of bytes required to store a complete 
 272  * decoded and packed raster scanline (as opposed to the 
 273  * I/O size returned by TIFFScanlineSize which may be less 
 274  * if data is store as separate planes). 
 277 TIFFRasterScanlineSize(TIFF
* tif
) 
 279         TIFFDirectory 
*td 
= &tif
->tif_dir
; 
 282         scanline 
= multiply (tif
, td
->td_bitspersample
, td
->td_imagewidth
, 
 283                              "TIFFRasterScanlineSize"); 
 284         if (td
->td_planarconfig 
== PLANARCONFIG_CONTIG
) { 
 285                 scanline 
= multiply (tif
, scanline
, td
->td_samplesperpixel
, 
 286                                      "TIFFRasterScanlineSize"); 
 287                 return ((tsize_t
) TIFFhowmany8(scanline
)); 
 289                 return ((tsize_t
) multiply (tif
, TIFFhowmany8(scanline
), 
 290                                             td
->td_samplesperpixel
, 
 291                                             "TIFFRasterScanlineSize")); 
 294 /* vim: set ts=8 sts=8 sw=8 noet: */