blob: a94cf0b34a92c41378bc5916e7d3fc84813f1ea9
1 | /* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_dumpmode.c,v 1.14 2011-04-02 20:54:09 bfriesen Exp $ */ |
2 | |
3 | /* |
4 | * Copyright (c) 1988-1997 Sam Leffler |
5 | * Copyright (c) 1991-1997 Silicon Graphics, Inc. |
6 | * |
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. |
14 | * |
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. |
18 | * |
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 |
24 | * OF THIS SOFTWARE. |
25 | */ |
26 | |
27 | /* |
28 | * TIFF Library. |
29 | * |
30 | * "Null" Compression Algorithm Support. |
31 | */ |
32 | #include "tiffiop.h" |
33 | |
34 | static int |
35 | DumpFixupTags(TIFF* tif) |
36 | { |
37 | (void) tif; |
38 | return (1); |
39 | } |
40 | |
41 | /* |
42 | * Encode a hunk of pixels. |
43 | */ |
44 | static int |
45 | DumpModeEncode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s) |
46 | { |
47 | (void) s; |
48 | while (cc > 0) { |
49 | tmsize_t n; |
50 | |
51 | n = cc; |
52 | if (tif->tif_rawcc + n > tif->tif_rawdatasize) |
53 | n = tif->tif_rawdatasize - tif->tif_rawcc; |
54 | |
55 | assert( n > 0 ); |
56 | |
57 | /* |
58 | * Avoid copy if client has setup raw |
59 | * data buffer to avoid extra copy. |
60 | */ |
61 | if (tif->tif_rawcp != pp) |
62 | _TIFFmemcpy(tif->tif_rawcp, pp, n); |
63 | tif->tif_rawcp += n; |
64 | tif->tif_rawcc += n; |
65 | pp += n; |
66 | cc -= n; |
67 | if (tif->tif_rawcc >= tif->tif_rawdatasize && |
68 | !TIFFFlushData1(tif)) |
69 | return (-1); |
70 | } |
71 | return (1); |
72 | } |
73 | |
74 | /* |
75 | * Decode a hunk of pixels. |
76 | */ |
77 | static int |
78 | DumpModeDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) |
79 | { |
80 | static const char module[] = "DumpModeDecode"; |
81 | (void) s; |
82 | if (tif->tif_rawcc < cc) { |
83 | #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) |
84 | TIFFErrorExt(tif->tif_clientdata, module, |
85 | "Not enough data for scanline %lu, expected a request for at most %I64d bytes, got a request for %I64d bytes", |
86 | (unsigned long) tif->tif_row, |
87 | (signed __int64) tif->tif_rawcc, |
88 | (signed __int64) cc); |
89 | #else |
90 | TIFFErrorExt(tif->tif_clientdata, module, |
91 | "Not enough data for scanline %lu, expected a request for at most %lld bytes, got a request for %lld bytes", |
92 | (unsigned long) tif->tif_row, |
93 | (signed long long) tif->tif_rawcc, |
94 | (signed long long) cc); |
95 | #endif |
96 | return (0); |
97 | } |
98 | /* |
99 | * Avoid copy if client has setup raw |
100 | * data buffer to avoid extra copy. |
101 | */ |
102 | if (tif->tif_rawcp != buf) |
103 | _TIFFmemcpy(buf, tif->tif_rawcp, cc); |
104 | tif->tif_rawcp += cc; |
105 | tif->tif_rawcc -= cc; |
106 | return (1); |
107 | } |
108 | |
109 | /* |
110 | * Seek forwards nrows in the current strip. |
111 | */ |
112 | static int |
113 | DumpModeSeek(TIFF* tif, uint32 nrows) |
114 | { |
115 | tif->tif_rawcp += nrows * tif->tif_scanlinesize; |
116 | tif->tif_rawcc -= nrows * tif->tif_scanlinesize; |
117 | return (1); |
118 | } |
119 | |
120 | /* |
121 | * Initialize dump mode. |
122 | */ |
123 | int |
124 | TIFFInitDumpMode(TIFF* tif, int scheme) |
125 | { |
126 | (void) scheme; |
127 | tif->tif_fixuptags = DumpFixupTags; |
128 | tif->tif_decoderow = DumpModeDecode; |
129 | tif->tif_decodestrip = DumpModeDecode; |
130 | tif->tif_decodetile = DumpModeDecode; |
131 | tif->tif_encoderow = DumpModeEncode; |
132 | tif->tif_encodestrip = DumpModeEncode; |
133 | tif->tif_encodetile = DumpModeEncode; |
134 | tif->tif_seek = DumpModeSeek; |
135 | return (1); |
136 | } |
137 | /* |
138 | * Local Variables: |
139 | * mode: c |
140 | * c-basic-offset: 8 |
141 | * fill-column: 78 |
142 | * End: |
143 | */ |
144 |