]>
git.saurik.com Git - wxWidgets.git/blob - src/tiff/libtiff/tif_tile.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  * Tiled 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, because 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 tile an (x,y,z,s) value is in. 
  68 TIFFComputeTile(TIFF
* tif
, uint32 x
, uint32 y
, uint32 z
, tsample_t s
) 
  70         TIFFDirectory 
*td 
= &tif
->tif_dir
; 
  71         uint32 dx 
= td
->td_tilewidth
; 
  72         uint32 dy 
= td
->td_tilelength
; 
  73         uint32 dz 
= td
->td_tiledepth
; 
  76         if (td
->td_imagedepth 
== 1) 
  78         if (dx 
== (uint32
) -1) 
  79                 dx 
= td
->td_imagewidth
; 
  80         if (dy 
== (uint32
) -1) 
  81                 dy 
= td
->td_imagelength
; 
  82         if (dz 
== (uint32
) -1) 
  83                 dz 
= td
->td_imagedepth
; 
  84         if (dx 
!= 0 && dy 
!= 0 && dz 
!= 0) { 
  85                 uint32 xpt 
= TIFFhowmany(td
->td_imagewidth
, dx
);  
  86                 uint32 ypt 
= TIFFhowmany(td
->td_imagelength
, dy
);  
  87                 uint32 zpt 
= TIFFhowmany(td
->td_imagedepth
, dz
);  
  89                 if (td
->td_planarconfig 
== PLANARCONFIG_SEPARATE
)  
  90                         tile 
= (xpt
*ypt
*zpt
)*s 
+ 
  95                         tile 
= (xpt
*ypt
)*(z
/dz
) + xpt
*(y
/dy
) + x
/dx
; 
 101  * Check an (x,y,z,s) coordinate 
 102  * against the image bounds. 
 105 TIFFCheckTile(TIFF
* tif
, uint32 x
, uint32 y
, uint32 z
, tsample_t s
) 
 107         TIFFDirectory 
*td 
= &tif
->tif_dir
; 
 109         if (x 
>= td
->td_imagewidth
) { 
 110                 TIFFErrorExt(tif
->tif_clientdata
, tif
->tif_name
, 
 111                              "%lu: Col out of range, max %lu", 
 113                              (unsigned long) (td
->td_imagewidth 
- 1)); 
 116         if (y 
>= td
->td_imagelength
) { 
 117                 TIFFErrorExt(tif
->tif_clientdata
, tif
->tif_name
, 
 118                              "%lu: Row out of range, max %lu", 
 120                              (unsigned long) (td
->td_imagelength 
- 1)); 
 123         if (z 
>= td
->td_imagedepth
) { 
 124                 TIFFErrorExt(tif
->tif_clientdata
, tif
->tif_name
, 
 125                              "%lu: Depth out of range, max %lu", 
 127                              (unsigned long) (td
->td_imagedepth 
- 1)); 
 130         if (td
->td_planarconfig 
== PLANARCONFIG_SEPARATE 
&& 
 131             s 
>= td
->td_samplesperpixel
) { 
 132                 TIFFErrorExt(tif
->tif_clientdata
, tif
->tif_name
, 
 133                              "%lu: Sample out of range, max %lu", 
 135                              (unsigned long) (td
->td_samplesperpixel 
- 1)); 
 142  * Compute how many tiles are in an image. 
 145 TIFFNumberOfTiles(TIFF
* tif
) 
 147         TIFFDirectory 
*td 
= &tif
->tif_dir
; 
 148         uint32 dx 
= td
->td_tilewidth
; 
 149         uint32 dy 
= td
->td_tilelength
; 
 150         uint32 dz 
= td
->td_tiledepth
; 
 153         if (dx 
== (uint32
) -1) 
 154                 dx 
= td
->td_imagewidth
; 
 155         if (dy 
== (uint32
) -1) 
 156                 dy 
= td
->td_imagelength
; 
 157         if (dz 
== (uint32
) -1) 
 158                 dz 
= td
->td_imagedepth
; 
 159         ntiles 
= (dx 
== 0 || dy 
== 0 || dz 
== 0) ? 0 : 
 160             multiply(tif
, multiply(tif
, TIFFhowmany(td
->td_imagewidth
, dx
), 
 161                                    TIFFhowmany(td
->td_imagelength
, dy
), 
 162                                    "TIFFNumberOfTiles"), 
 163                      TIFFhowmany(td
->td_imagedepth
, dz
), "TIFFNumberOfTiles"); 
 164         if (td
->td_planarconfig 
== PLANARCONFIG_SEPARATE
) 
 165                 ntiles 
= multiply(tif
, ntiles
, td
->td_samplesperpixel
, 
 166                                   "TIFFNumberOfTiles"); 
 171  * Compute the # bytes in each row of a tile. 
 174 TIFFTileRowSize(TIFF
* tif
) 
 176         TIFFDirectory 
*td 
= &tif
->tif_dir
; 
 179         if (td
->td_tilelength 
== 0 || td
->td_tilewidth 
== 0) 
 180                 return ((tsize_t
) 0); 
 181         rowsize 
= multiply(tif
, td
->td_bitspersample
, td
->td_tilewidth
, 
 183         if (td
->td_planarconfig 
== PLANARCONFIG_CONTIG
) 
 184                 rowsize 
= multiply(tif
, rowsize
, td
->td_samplesperpixel
, 
 186         return ((tsize_t
) TIFFhowmany8(rowsize
)); 
 190  * Compute the # bytes in a variable length, row-aligned tile. 
 193 TIFFVTileSize(TIFF
* tif
, uint32 nrows
) 
 195         TIFFDirectory 
*td 
= &tif
->tif_dir
; 
 198         if (td
->td_tilelength 
== 0 || td
->td_tilewidth 
== 0 || 
 199             td
->td_tiledepth 
== 0) 
 200                 return ((tsize_t
) 0); 
 201         if (td
->td_planarconfig 
== PLANARCONFIG_CONTIG 
&& 
 202             td
->td_photometric 
== PHOTOMETRIC_YCBCR 
&& 
 205                  * Packed YCbCr data contain one Cb+Cr for every 
 206                  * HorizontalSampling*VerticalSampling Y values. 
 207                  * Must also roundup width and height when calculating 
 208                  * since images that are not a multiple of the 
 209                  * horizontal/vertical subsampling area include 
 210                  * YCbCr data for the extended image. 
 213                     TIFFroundup(td
->td_tilewidth
, td
->td_ycbcrsubsampling
[0]); 
 215                     TIFFhowmany8(multiply(tif
, w
, td
->td_bitspersample
, 
 217                 tsize_t samplingarea 
= 
 218                     td
->td_ycbcrsubsampling
[0]*td
->td_ycbcrsubsampling
[1]; 
 219                 if (samplingarea 
== 0) { 
 220                         TIFFErrorExt(tif
->tif_clientdata
, tif
->tif_name
, "Invalid YCbCr subsampling"); 
 223                 nrows 
= TIFFroundup(nrows
, td
->td_ycbcrsubsampling
[1]); 
 224                 /* NB: don't need TIFFhowmany here 'cuz everything is rounded */ 
 225                 tilesize 
= multiply(tif
, nrows
, rowsize
, "TIFFVTileSize"); 
 226                 tilesize 
= summarize(tif
, tilesize
, 
 227                                      multiply(tif
, 2, tilesize 
/ samplingarea
, 
 231                 tilesize 
= multiply(tif
, nrows
, TIFFTileRowSize(tif
), 
 234             multiply(tif
, tilesize
, td
->td_tiledepth
, "TIFFVTileSize")); 
 238  * Compute the # bytes in a row-aligned tile. 
 241 TIFFTileSize(TIFF
* tif
) 
 243         return (TIFFVTileSize(tif
, tif
->tif_dir
.td_tilelength
)); 
 247  * Compute a default tile size based on the image 
 248  * characteristics and a requested value.  If a 
 249  * request is <1 then we choose a size according 
 250  * to certain heuristics. 
 253 TIFFDefaultTileSize(TIFF
* tif
, uint32
* tw
, uint32
* th
) 
 255         (*tif
->tif_deftilesize
)(tif
, tw
, th
); 
 259 _TIFFDefaultTileSize(TIFF
* tif
, uint32
* tw
, uint32
* th
) 
 262         if (*(int32
*) tw 
< 1) 
 264         if (*(int32
*) th 
< 1) 
 266         /* roundup to a multiple of 16 per the spec */ 
 268                 *tw 
= TIFFroundup(*tw
, 16); 
 270                 *th 
= TIFFroundup(*th
, 16); 
 273 /* vim: set ts=8 sts=8 sw=8 noet: */