1
/* $Id: tif_strip.c,v 1.20 2007/11/10 18:41:32 drolon Exp $ */
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
* Some stuff depends on this older version of TIFFScanlineSize
275
TIFFOldScanlineSize(TIFF* tif)
277
TIFFDirectory *td = &tif->tif_dir;
280
scanline = multiply (tif, td->td_bitspersample, td->td_imagewidth,
282
if (td->td_planarconfig == PLANARCONFIG_CONTIG)
283
scanline = multiply (tif, scanline, td->td_samplesperpixel,
285
return ((tsize_t) TIFFhowmany8(scanline));
289
* Return the number of bytes to read/write in a call to
290
* one of the scanline-oriented i/o routines. Note that
291
* this number may be 1/samples-per-pixel if data is
292
* stored as separate planes.
293
* The ScanlineSize in case of YCbCrSubsampling is defined as the
294
* strip size divided by the strip height, i.e. the size of a pack of vertical
295
* subsampling lines divided by vertical subsampling. It should thus make
296
* sense when multiplied by a multiple of vertical subsampling.
297
* Some stuff depends on this newer version of TIFFScanlineSize
301
TIFFNewScanlineSize(TIFF* tif)
303
TIFFDirectory *td = &tif->tif_dir;
306
if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
307
if (td->td_photometric == PHOTOMETRIC_YCBCR
308
&& !isUpSampled(tif)) {
309
uint16 ycbcrsubsampling[2];
311
TIFFGetField(tif, TIFFTAG_YCBCRSUBSAMPLING,
312
ycbcrsubsampling + 0,
313
ycbcrsubsampling + 1);
315
if (ycbcrsubsampling[0]*ycbcrsubsampling[1] == 0) {
316
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
317
"Invalid YCbCr subsampling");
321
return((tsize_t) ((((td->td_imagewidth+ycbcrsubsampling[0]-1)
322
/ycbcrsubsampling[0])
323
*(ycbcrsubsampling[0]*ycbcrsubsampling[1]+2)
324
*td->td_bitspersample+7)
325
/8)/ycbcrsubsampling[1]);
328
scanline = multiply(tif, td->td_imagewidth,
329
td->td_samplesperpixel,
333
scanline = td->td_imagewidth;
334
return ((tsize_t) TIFFhowmany8(multiply(tif, scanline,
335
td->td_bitspersample,
336
"TIFFScanlineSize")));
340
* Return the number of bytes required to store a complete
341
* decoded and packed raster scanline (as opposed to the
342
* I/O size returned by TIFFScanlineSize which may be less
343
* if data is store as separate planes).
346
TIFFRasterScanlineSize(TIFF* tif)
348
TIFFDirectory *td = &tif->tif_dir;
351
scanline = multiply (tif, td->td_bitspersample, td->td_imagewidth,
352
"TIFFRasterScanlineSize");
353
if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
354
scanline = multiply (tif, scanline, td->td_samplesperpixel,
355
"TIFFRasterScanlineSize");
356
return ((tsize_t) TIFFhowmany8(scanline));
358
return ((tsize_t) multiply (tif, TIFFhowmany8(scanline),
359
td->td_samplesperpixel,
360
"TIFFRasterScanlineSize"));
363
/* vim: set ts=8 sts=8 sw=8 noet: */
1
/* $Id: tif_strip.c,v 1.19.2.1 2010-06-08 18:50:43 bfriesen Exp $ */
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]*ycbcrsubsampling[1] == 0) {
242
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
243
"Invalid YCbCr subsampling");
247
/* number of sample clumps per line */
248
scanline = TIFFhowmany(td->td_imagewidth,
249
ycbcrsubsampling[0]);
250
/* number of samples per line */
251
scanline = multiply(tif, scanline,
252
ycbcrsubsampling[0]*ycbcrsubsampling[1] + 2,
255
scanline = multiply(tif, td->td_imagewidth,
256
td->td_samplesperpixel,
260
scanline = td->td_imagewidth;
261
return ((tsize_t) TIFFhowmany8(multiply(tif, scanline,
262
td->td_bitspersample,
263
"TIFFScanlineSize")));
267
* Some stuff depends on this older version of TIFFScanlineSize
271
TIFFOldScanlineSize(TIFF* tif)
273
TIFFDirectory *td = &tif->tif_dir;
276
scanline = multiply (tif, td->td_bitspersample, td->td_imagewidth,
278
if (td->td_planarconfig == PLANARCONFIG_CONTIG)
279
scanline = multiply (tif, scanline, td->td_samplesperpixel,
281
return ((tsize_t) TIFFhowmany8(scanline));
285
* Return the number of bytes to read/write in a call to
286
* one of the scanline-oriented i/o routines. Note that
287
* this number may be 1/samples-per-pixel if data is
288
* stored as separate planes.
289
* The ScanlineSize in case of YCbCrSubsampling is defined as the
290
* strip size divided by the strip height, i.e. the size of a pack of vertical
291
* subsampling lines divided by vertical subsampling. It should thus make
292
* sense when multiplied by a multiple of vertical subsampling.
293
* Some stuff depends on this newer version of TIFFScanlineSize
297
TIFFNewScanlineSize(TIFF* tif)
299
TIFFDirectory *td = &tif->tif_dir;
302
if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
303
if (td->td_photometric == PHOTOMETRIC_YCBCR
304
&& !isUpSampled(tif)) {
305
uint16 ycbcrsubsampling[2];
307
TIFFGetField(tif, TIFFTAG_YCBCRSUBSAMPLING,
308
ycbcrsubsampling + 0,
309
ycbcrsubsampling + 1);
311
if (ycbcrsubsampling[0]*ycbcrsubsampling[1] == 0) {
312
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
313
"Invalid YCbCr subsampling");
317
return((tsize_t) ((((td->td_imagewidth+ycbcrsubsampling[0]-1)
318
/ycbcrsubsampling[0])
319
*(ycbcrsubsampling[0]*ycbcrsubsampling[1]+2)
320
*td->td_bitspersample+7)
321
/8)/ycbcrsubsampling[1]);
324
scanline = multiply(tif, td->td_imagewidth,
325
td->td_samplesperpixel,
329
scanline = td->td_imagewidth;
330
return ((tsize_t) TIFFhowmany8(multiply(tif, scanline,
331
td->td_bitspersample,
332
"TIFFScanlineSize")));
336
* Return the number of bytes required to store a complete
337
* decoded and packed raster scanline (as opposed to the
338
* I/O size returned by TIFFScanlineSize which may be less
339
* if data is store as separate planes).
342
TIFFRasterScanlineSize(TIFF* tif)
344
TIFFDirectory *td = &tif->tif_dir;
347
scanline = multiply (tif, td->td_bitspersample, td->td_imagewidth,
348
"TIFFRasterScanlineSize");
349
if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
350
scanline = multiply (tif, scanline, td->td_samplesperpixel,
351
"TIFFRasterScanlineSize");
352
return ((tsize_t) TIFFhowmany8(scanline));
354
return ((tsize_t) multiply (tif, TIFFhowmany8(scanline),
355
td->td_samplesperpixel,
356
"TIFFRasterScanlineSize"));
359
/* vim: set ts=8 sts=8 sw=8 noet: */