]>
git.saurik.com Git - wxWidgets.git/blob - src/tiff/libtiff/tif_read.c
4 * Copyright (c) 1988-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
29 * Scanline-oriented Read Support
34 int TIFFFillStrip(TIFF
*, tstrip_t
);
35 int TIFFFillTile(TIFF
*, ttile_t
);
36 static int TIFFStartStrip(TIFF
*, tstrip_t
);
37 static int TIFFStartTile(TIFF
*, ttile_t
);
38 static int TIFFCheckRead(TIFF
*, int);
40 #define NOSTRIP ((tstrip_t) -1) /* undefined state */
41 #define NOTILE ((ttile_t) -1) /* undefined state */
44 * Seek to a random row+sample in a file.
47 TIFFSeek(TIFF
* tif
, uint32 row
, tsample_t sample
)
49 register TIFFDirectory
*td
= &tif
->tif_dir
;
52 if (row
>= td
->td_imagelength
) { /* out of range */
53 TIFFErrorExt(tif
->tif_clientdata
, tif
->tif_name
, "%lu: Row out of range, max %lu",
54 (unsigned long) row
, (unsigned long) td
->td_imagelength
);
57 if (td
->td_planarconfig
== PLANARCONFIG_SEPARATE
) {
58 if (sample
>= td
->td_samplesperpixel
) {
59 TIFFErrorExt(tif
->tif_clientdata
, tif
->tif_name
,
60 "%lu: Sample out of range, max %lu",
61 (unsigned long) sample
, (unsigned long) td
->td_samplesperpixel
);
64 strip
= sample
*td
->td_stripsperimage
+ row
/td
->td_rowsperstrip
;
66 strip
= row
/ td
->td_rowsperstrip
;
67 if (strip
!= tif
->tif_curstrip
) { /* different strip, refill */
68 if (!TIFFFillStrip(tif
, strip
))
70 } else if (row
< tif
->tif_row
) {
72 * Moving backwards within the same strip: backup
73 * to the start and then decode forward (below).
75 * NB: If you're planning on lots of random access within a
76 * strip, it's better to just read and decode the entire
77 * strip, and then access the decoded data in a random fashion.
79 if (!TIFFStartStrip(tif
, strip
))
82 if (row
!= tif
->tif_row
) {
84 * Seek forward to the desired row.
86 if (!(*tif
->tif_seek
)(tif
, row
- tif
->tif_row
))
94 TIFFReadScanline(TIFF
* tif
, tdata_t buf
, uint32 row
, tsample_t sample
)
98 if (!TIFFCheckRead(tif
, 0))
100 if( (e
= TIFFSeek(tif
, row
, sample
)) != 0) {
102 * Decompress desired row into user buffer.
104 e
= (*tif
->tif_decoderow
)
105 (tif
, (tidata_t
) buf
, tif
->tif_scanlinesize
, sample
);
107 /* we are now poised at the beginning of the next row */
108 tif
->tif_row
= row
+ 1;
111 (*tif
->tif_postdecode
)(tif
, (tidata_t
) buf
,
112 tif
->tif_scanlinesize
);
114 return (e
> 0 ? 1 : -1);
118 * Read a strip of data and decompress the specified
119 * amount into the user-supplied buffer.
122 TIFFReadEncodedStrip(TIFF
* tif
, tstrip_t strip
, tdata_t buf
, tsize_t size
)
124 TIFFDirectory
*td
= &tif
->tif_dir
;
127 tstrip_t sep_strip
, strips_per_sep
;
129 if (!TIFFCheckRead(tif
, 0))
131 if (strip
>= td
->td_nstrips
) {
132 TIFFErrorExt(tif
->tif_clientdata
, tif
->tif_name
, "%ld: Strip out of range, max %ld",
133 (long) strip
, (long) td
->td_nstrips
);
137 * Calculate the strip size according to the number of
138 * rows in the strip (check for truncated last strip on any
139 * of the separations).
141 if( td
->td_rowsperstrip
>= td
->td_imagelength
)
144 strips_per_sep
= (td
->td_imagelength
+td
->td_rowsperstrip
-1)
145 / td
->td_rowsperstrip
;
147 sep_strip
= strip
% strips_per_sep
;
149 if (sep_strip
!= strips_per_sep
-1 ||
150 (nrows
= td
->td_imagelength
% td
->td_rowsperstrip
) == 0)
151 nrows
= td
->td_rowsperstrip
;
153 stripsize
= TIFFVStripSize(tif
, nrows
);
154 if (size
== (tsize_t
) -1)
156 else if (size
> stripsize
)
158 if (TIFFFillStrip(tif
, strip
)
159 && (*tif
->tif_decodestrip
)(tif
, (tidata_t
) buf
, size
,
160 (tsample_t
)(strip
/ td
->td_stripsperimage
)) > 0 ) {
161 (*tif
->tif_postdecode
)(tif
, (tidata_t
) buf
, size
);
164 return ((tsize_t
) -1);
168 TIFFReadRawStrip1(TIFF
* tif
,
169 tstrip_t strip
, tdata_t buf
, tsize_t size
, const char* module)
171 TIFFDirectory
*td
= &tif
->tif_dir
;
173 if (!isMapped(tif
)) {
176 if (!SeekOK(tif
, td
->td_stripoffset
[strip
])) {
177 TIFFErrorExt(tif
->tif_clientdata
, module,
178 "%s: Seek error at scanline %lu, strip %lu",
180 (unsigned long) tif
->tif_row
, (unsigned long) strip
);
183 cc
= TIFFReadFile(tif
, buf
, size
);
185 TIFFErrorExt(tif
->tif_clientdata
, module,
186 "%s: Read error at scanline %lu; got %lu bytes, expected %lu",
188 (unsigned long) tif
->tif_row
,
190 (unsigned long) size
);
194 if (td
->td_stripoffset
[strip
] + size
> tif
->tif_size
) {
195 TIFFErrorExt(tif
->tif_clientdata
, module,
196 "%s: Read error at scanline %lu, strip %lu; got %lu bytes, expected %lu",
198 (unsigned long) tif
->tif_row
,
199 (unsigned long) strip
,
200 (unsigned long) tif
->tif_size
- td
->td_stripoffset
[strip
],
201 (unsigned long) size
);
204 _TIFFmemcpy(buf
, tif
->tif_base
+ td
->td_stripoffset
[strip
],
211 * Read a strip of data from the file.
214 TIFFReadRawStrip(TIFF
* tif
, tstrip_t strip
, tdata_t buf
, tsize_t size
)
216 static const char module[] = "TIFFReadRawStrip";
217 TIFFDirectory
*td
= &tif
->tif_dir
;
220 if (!TIFFCheckRead(tif
, 0))
221 return ((tsize_t
) -1);
222 if (strip
>= td
->td_nstrips
) {
223 TIFFErrorExt(tif
->tif_clientdata
, tif
->tif_name
, "%lu: Strip out of range, max %lu",
224 (unsigned long) strip
, (unsigned long) td
->td_nstrips
);
225 return ((tsize_t
) -1);
227 bytecount
= td
->td_stripbytecount
[strip
];
228 if (bytecount
<= 0) {
229 TIFFErrorExt(tif
->tif_clientdata
, tif
->tif_name
,
230 "%lu: Invalid strip byte count, strip %lu",
231 (unsigned long) bytecount
, (unsigned long) strip
);
232 return ((tsize_t
) -1);
234 if (size
!= (tsize_t
)-1 && size
< bytecount
)
236 return (TIFFReadRawStrip1(tif
, strip
, buf
, bytecount
, module));
240 * Read the specified strip and setup for decoding.
241 * The data buffer is expanded, as necessary, to
242 * hold the strip's data.
245 TIFFFillStrip(TIFF
* tif
, tstrip_t strip
)
247 static const char module[] = "TIFFFillStrip";
248 TIFFDirectory
*td
= &tif
->tif_dir
;
251 bytecount
= td
->td_stripbytecount
[strip
];
252 if (bytecount
<= 0) {
253 TIFFErrorExt(tif
->tif_clientdata
, tif
->tif_name
,
254 "%lu: Invalid strip byte count, strip %lu",
255 (unsigned long) bytecount
, (unsigned long) strip
);
259 (isFillOrder(tif
, td
->td_fillorder
)
260 || (tif
->tif_flags
& TIFF_NOBITREV
))) {
262 * The image is mapped into memory and we either don't
263 * need to flip bits or the compression routine is going
264 * to handle this operation itself. In this case, avoid
265 * copying the raw data and instead just reference the
266 * data from the memory mapped file image. This assumes
267 * that the decompression routines do not modify the
268 * contents of the raw data buffer (if they try to,
269 * the application will get a fault since the file is
272 if ((tif
->tif_flags
& TIFF_MYBUFFER
) && tif
->tif_rawdata
)
273 _TIFFfree(tif
->tif_rawdata
);
274 tif
->tif_flags
&= ~TIFF_MYBUFFER
;
275 if ( td
->td_stripoffset
[strip
] + bytecount
> tif
->tif_size
) {
277 * This error message might seem strange, but it's
278 * what would happen if a read were done instead.
280 TIFFErrorExt(tif
->tif_clientdata
, module,
281 "%s: Read error on strip %lu; got %lu bytes, expected %lu",
283 (unsigned long) strip
,
284 (unsigned long) tif
->tif_size
- td
->td_stripoffset
[strip
],
285 (unsigned long) bytecount
);
286 tif
->tif_curstrip
= NOSTRIP
;
289 tif
->tif_rawdatasize
= bytecount
;
290 tif
->tif_rawdata
= tif
->tif_base
+ td
->td_stripoffset
[strip
];
293 * Expand raw data buffer, if needed, to
294 * hold data strip coming from file
295 * (perhaps should set upper bound on
296 * the size of a buffer we'll use?).
298 if (bytecount
> tif
->tif_rawdatasize
) {
299 tif
->tif_curstrip
= NOSTRIP
;
300 if ((tif
->tif_flags
& TIFF_MYBUFFER
) == 0) {
301 TIFFErrorExt(tif
->tif_clientdata
, module,
302 "%s: Data buffer too small to hold strip %lu",
303 tif
->tif_name
, (unsigned long) strip
);
306 if (!TIFFReadBufferSetup(tif
, 0,
307 TIFFroundup(bytecount
, 1024)))
310 if (TIFFReadRawStrip1(tif
, strip
, (unsigned char *)tif
->tif_rawdata
,
311 bytecount
, module) != bytecount
)
313 if (!isFillOrder(tif
, td
->td_fillorder
) &&
314 (tif
->tif_flags
& TIFF_NOBITREV
) == 0)
315 TIFFReverseBits(tif
->tif_rawdata
, bytecount
);
317 return (TIFFStartStrip(tif
, strip
));
321 * Tile-oriented Read Support
322 * Contributed by Nancy Cam (Silicon Graphics).
326 * Read and decompress a tile of data. The
327 * tile is selected by the (x,y,z,s) coordinates.
330 TIFFReadTile(TIFF
* tif
,
331 tdata_t buf
, uint32 x
, uint32 y
, uint32 z
, tsample_t s
)
333 if (!TIFFCheckRead(tif
, 1) || !TIFFCheckTile(tif
, x
, y
, z
, s
))
335 return (TIFFReadEncodedTile(tif
,
336 TIFFComputeTile(tif
, x
, y
, z
, s
), buf
, (tsize_t
) -1));
340 * Read a tile of data and decompress the specified
341 * amount into the user-supplied buffer.
344 TIFFReadEncodedTile(TIFF
* tif
, ttile_t tile
, tdata_t buf
, tsize_t size
)
346 TIFFDirectory
*td
= &tif
->tif_dir
;
347 tsize_t tilesize
= tif
->tif_tilesize
;
349 if (!TIFFCheckRead(tif
, 1))
351 if (tile
>= td
->td_nstrips
) {
352 TIFFErrorExt(tif
->tif_clientdata
, tif
->tif_name
, "%ld: Tile out of range, max %ld",
353 (long) tile
, (unsigned long) td
->td_nstrips
);
356 if (size
== (tsize_t
) -1)
358 else if (size
> tilesize
)
360 if (TIFFFillTile(tif
, tile
) && (*tif
->tif_decodetile
)(tif
,
361 (tidata_t
) buf
, size
, (tsample_t
)(tile
/td
->td_stripsperimage
))) {
362 (*tif
->tif_postdecode
)(tif
, (tidata_t
) buf
, size
);
369 TIFFReadRawTile1(TIFF
* tif
,
370 ttile_t tile
, tdata_t buf
, tsize_t size
, const char* module)
372 TIFFDirectory
*td
= &tif
->tif_dir
;
374 if (!isMapped(tif
)) {
377 if (!SeekOK(tif
, td
->td_stripoffset
[tile
])) {
378 TIFFErrorExt(tif
->tif_clientdata
, module,
379 "%s: Seek error at row %ld, col %ld, tile %ld",
384 return ((tsize_t
) -1);
386 cc
= TIFFReadFile(tif
, buf
, size
);
388 TIFFErrorExt(tif
->tif_clientdata
, module,
389 "%s: Read error at row %ld, col %ld; got %lu bytes, expected %lu",
394 (unsigned long) size
);
395 return ((tsize_t
) -1);
398 if (td
->td_stripoffset
[tile
] + size
> tif
->tif_size
) {
399 TIFFErrorExt(tif
->tif_clientdata
, module,
400 "%s: Read error at row %ld, col %ld, tile %ld; got %lu bytes, expected %lu",
405 (unsigned long) tif
->tif_size
- td
->td_stripoffset
[tile
],
406 (unsigned long) size
);
407 return ((tsize_t
) -1);
409 _TIFFmemcpy(buf
, tif
->tif_base
+ td
->td_stripoffset
[tile
], size
);
415 * Read a tile of data from the file.
418 TIFFReadRawTile(TIFF
* tif
, ttile_t tile
, tdata_t buf
, tsize_t size
)
420 static const char module[] = "TIFFReadRawTile";
421 TIFFDirectory
*td
= &tif
->tif_dir
;
424 if (!TIFFCheckRead(tif
, 1))
425 return ((tsize_t
) -1);
426 if (tile
>= td
->td_nstrips
) {
427 TIFFErrorExt(tif
->tif_clientdata
, tif
->tif_name
, "%lu: Tile out of range, max %lu",
428 (unsigned long) tile
, (unsigned long) td
->td_nstrips
);
429 return ((tsize_t
) -1);
431 bytecount
= td
->td_stripbytecount
[tile
];
432 if (size
!= (tsize_t
) -1 && size
< bytecount
)
434 return (TIFFReadRawTile1(tif
, tile
, buf
, bytecount
, module));
438 * Read the specified tile and setup for decoding.
439 * The data buffer is expanded, as necessary, to
440 * hold the tile's data.
443 TIFFFillTile(TIFF
* tif
, ttile_t tile
)
445 static const char module[] = "TIFFFillTile";
446 TIFFDirectory
*td
= &tif
->tif_dir
;
449 bytecount
= td
->td_stripbytecount
[tile
];
450 if (bytecount
<= 0) {
451 TIFFErrorExt(tif
->tif_clientdata
, tif
->tif_name
,
452 "%lu: Invalid tile byte count, tile %lu",
453 (unsigned long) bytecount
, (unsigned long) tile
);
457 (isFillOrder(tif
, td
->td_fillorder
)
458 || (tif
->tif_flags
& TIFF_NOBITREV
))) {
460 * The image is mapped into memory and we either don't
461 * need to flip bits or the compression routine is going
462 * to handle this operation itself. In this case, avoid
463 * copying the raw data and instead just reference the
464 * data from the memory mapped file image. This assumes
465 * that the decompression routines do not modify the
466 * contents of the raw data buffer (if they try to,
467 * the application will get a fault since the file is
470 if ((tif
->tif_flags
& TIFF_MYBUFFER
) && tif
->tif_rawdata
)
471 _TIFFfree(tif
->tif_rawdata
);
472 tif
->tif_flags
&= ~TIFF_MYBUFFER
;
473 if ( td
->td_stripoffset
[tile
] + bytecount
> tif
->tif_size
) {
474 tif
->tif_curtile
= NOTILE
;
477 tif
->tif_rawdatasize
= bytecount
;
478 tif
->tif_rawdata
= tif
->tif_base
+ td
->td_stripoffset
[tile
];
481 * Expand raw data buffer, if needed, to
482 * hold data tile coming from file
483 * (perhaps should set upper bound on
484 * the size of a buffer we'll use?).
486 if (bytecount
> tif
->tif_rawdatasize
) {
487 tif
->tif_curtile
= NOTILE
;
488 if ((tif
->tif_flags
& TIFF_MYBUFFER
) == 0) {
489 TIFFErrorExt(tif
->tif_clientdata
, module,
490 "%s: Data buffer too small to hold tile %ld",
491 tif
->tif_name
, (long) tile
);
494 if (!TIFFReadBufferSetup(tif
, 0,
495 TIFFroundup(bytecount
, 1024)))
498 if (TIFFReadRawTile1(tif
, tile
,
499 (unsigned char *)tif
->tif_rawdata
,
500 bytecount
, module) != bytecount
)
502 if (!isFillOrder(tif
, td
->td_fillorder
) &&
503 (tif
->tif_flags
& TIFF_NOBITREV
) == 0)
504 TIFFReverseBits(tif
->tif_rawdata
, bytecount
);
506 return (TIFFStartTile(tif
, tile
));
510 * Setup the raw data buffer in preparation for
511 * reading a strip of raw data. If the buffer
512 * is specified as zero, then a buffer of appropriate
513 * size is allocated by the library. Otherwise,
514 * the client must guarantee that the buffer is
515 * large enough to hold any individual strip of
519 TIFFReadBufferSetup(TIFF
* tif
, tdata_t bp
, tsize_t size
)
521 static const char module[] = "TIFFReadBufferSetup";
523 if (tif
->tif_rawdata
) {
524 if (tif
->tif_flags
& TIFF_MYBUFFER
)
525 _TIFFfree(tif
->tif_rawdata
);
526 tif
->tif_rawdata
= NULL
;
529 tif
->tif_rawdatasize
= size
;
530 tif
->tif_rawdata
= (tidata_t
) bp
;
531 tif
->tif_flags
&= ~TIFF_MYBUFFER
;
533 tif
->tif_rawdatasize
= TIFFroundup(size
, 1024);
534 tif
->tif_rawdata
= (tidata_t
) _TIFFmalloc(tif
->tif_rawdatasize
);
535 tif
->tif_flags
|= TIFF_MYBUFFER
;
537 if (tif
->tif_rawdata
== NULL
) {
538 TIFFErrorExt(tif
->tif_clientdata
, module,
539 "%s: No space for data buffer at scanline %ld",
540 tif
->tif_name
, (long) tif
->tif_row
);
541 tif
->tif_rawdatasize
= 0;
548 * Set state to appear as if a
549 * strip has just been read in.
552 TIFFStartStrip(TIFF
* tif
, tstrip_t strip
)
554 TIFFDirectory
*td
= &tif
->tif_dir
;
556 if ((tif
->tif_flags
& TIFF_CODERSETUP
) == 0) {
557 if (!(*tif
->tif_setupdecode
)(tif
))
559 tif
->tif_flags
|= TIFF_CODERSETUP
;
561 tif
->tif_curstrip
= strip
;
562 tif
->tif_row
= (strip
% td
->td_stripsperimage
) * td
->td_rowsperstrip
;
563 tif
->tif_rawcp
= tif
->tif_rawdata
;
564 tif
->tif_rawcc
= td
->td_stripbytecount
[strip
];
565 return ((*tif
->tif_predecode
)(tif
,
566 (tsample_t
)(strip
/ td
->td_stripsperimage
)));
570 * Set state to appear as if a
571 * tile has just been read in.
574 TIFFStartTile(TIFF
* tif
, ttile_t tile
)
576 TIFFDirectory
*td
= &tif
->tif_dir
;
578 if ((tif
->tif_flags
& TIFF_CODERSETUP
) == 0) {
579 if (!(*tif
->tif_setupdecode
)(tif
))
581 tif
->tif_flags
|= TIFF_CODERSETUP
;
583 tif
->tif_curtile
= tile
;
585 (tile
% TIFFhowmany(td
->td_imagewidth
, td
->td_tilewidth
)) *
588 (tile
% TIFFhowmany(td
->td_imagelength
, td
->td_tilelength
)) *
590 tif
->tif_rawcp
= tif
->tif_rawdata
;
591 tif
->tif_rawcc
= td
->td_stripbytecount
[tile
];
592 return ((*tif
->tif_predecode
)(tif
,
593 (tsample_t
)(tile
/td
->td_stripsperimage
)));
597 TIFFCheckRead(TIFF
* tif
, int tiles
)
599 if (tif
->tif_mode
== O_WRONLY
) {
600 TIFFErrorExt(tif
->tif_clientdata
, tif
->tif_name
, "File not open for reading");
603 if (tiles
^ isTiled(tif
)) {
604 TIFFErrorExt(tif
->tif_clientdata
, tif
->tif_name
, tiles
?
605 "Can not read tiles from a stripped image" :
606 "Can not read scanlines from a tiled image");
613 _TIFFNoPostDecode(TIFF
* tif
, tidata_t buf
, tsize_t cc
)
615 (void) tif
; (void) buf
; (void) cc
;
619 _TIFFSwab16BitData(TIFF
* tif
, tidata_t buf
, tsize_t cc
)
622 assert((cc
& 1) == 0);
623 TIFFSwabArrayOfShort((uint16
*) buf
, cc
/2);
627 _TIFFSwab24BitData(TIFF
* tif
, tidata_t buf
, tsize_t cc
)
630 assert((cc
% 3) == 0);
631 TIFFSwabArrayOfTriples((uint8
*) buf
, cc
/3);
635 _TIFFSwab32BitData(TIFF
* tif
, tidata_t buf
, tsize_t cc
)
638 assert((cc
& 3) == 0);
639 TIFFSwabArrayOfLong((uint32
*) buf
, cc
/4);
643 _TIFFSwab64BitData(TIFF
* tif
, tidata_t buf
, tsize_t cc
)
646 assert((cc
& 7) == 0);
647 TIFFSwabArrayOfDouble((double*) buf
, cc
/8);
650 /* vim: set ts=8 sts=8 sw=8 noet: */