xref: /aosp_15_r20/external/pdfium/third_party/libtiff/tif_dumpmode.c (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1 /*
2  * Copyright (c) 1988-1997 Sam Leffler
3  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
4  *
5  * Permission to use, copy, modify, distribute, and sell this software and
6  * its documentation for any purpose is hereby granted without fee, provided
7  * that (i) the above copyright notices and this permission notice appear in
8  * all copies of the software and related documentation, and (ii) the names of
9  * Sam Leffler and Silicon Graphics may not be used in any advertising or
10  * publicity relating to the software without the specific, prior written
11  * permission of Sam Leffler and Silicon Graphics.
12  *
13  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
14  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
15  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
16  *
17  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
18  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
19  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
20  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
21  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
22  * OF THIS SOFTWARE.
23  */
24 
25 /*
26  * TIFF Library.
27  *
28  * "Null" Compression Algorithm Support.
29  */
30 #include "tiffiop.h"
31 
DumpFixupTags(TIFF * tif)32 static int DumpFixupTags(TIFF *tif)
33 {
34     (void)tif;
35     return (1);
36 }
37 
38 /*
39  * Encode a hunk of pixels.
40  */
DumpModeEncode(TIFF * tif,uint8_t * pp,tmsize_t cc,uint16_t s)41 static int DumpModeEncode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
42 {
43     (void)s;
44     while (cc > 0)
45     {
46         tmsize_t n;
47 
48         n = cc;
49         if (tif->tif_rawcc + n > tif->tif_rawdatasize)
50             n = tif->tif_rawdatasize - tif->tif_rawcc;
51 
52         assert(n > 0);
53 
54         /*
55          * Avoid copy if client has setup raw
56          * data buffer to avoid extra copy.
57          */
58         if (tif->tif_rawcp != pp)
59             _TIFFmemcpy(tif->tif_rawcp, pp, n);
60         tif->tif_rawcp += n;
61         tif->tif_rawcc += n;
62         pp += n;
63         cc -= n;
64         if (tif->tif_rawcc >= tif->tif_rawdatasize && !TIFFFlushData1(tif))
65             return (0);
66     }
67     return (1);
68 }
69 
70 /*
71  * Decode a hunk of pixels.
72  */
DumpModeDecode(TIFF * tif,uint8_t * buf,tmsize_t cc,uint16_t s)73 static int DumpModeDecode(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s)
74 {
75     static const char module[] = "DumpModeDecode";
76     (void)s;
77     if (tif->tif_rawcc < cc)
78     {
79         TIFFErrorExtR(tif, module,
80                       "Not enough data for scanline %" PRIu32
81                       ", expected a request for at most %" TIFF_SSIZE_FORMAT
82                       " bytes, got a request for %" TIFF_SSIZE_FORMAT " bytes",
83                       tif->tif_row, tif->tif_rawcc, cc);
84         return (0);
85     }
86     /*
87      * Avoid copy if client has setup raw
88      * data buffer to avoid extra copy.
89      */
90     if (tif->tif_rawcp != buf)
91         _TIFFmemcpy(buf, tif->tif_rawcp, cc);
92     tif->tif_rawcp += cc;
93     tif->tif_rawcc -= cc;
94     return (1);
95 }
96 
97 /*
98  * Seek forwards nrows in the current strip.
99  */
DumpModeSeek(TIFF * tif,uint32_t nrows)100 static int DumpModeSeek(TIFF *tif, uint32_t nrows)
101 {
102     tif->tif_rawcp += nrows * tif->tif_scanlinesize;
103     tif->tif_rawcc -= nrows * tif->tif_scanlinesize;
104     return (1);
105 }
106 
107 /*
108  * Initialize dump mode.
109  */
TIFFInitDumpMode(TIFF * tif,int scheme)110 int TIFFInitDumpMode(TIFF *tif, int scheme)
111 {
112     (void)scheme;
113     tif->tif_fixuptags = DumpFixupTags;
114     tif->tif_decoderow = DumpModeDecode;
115     tif->tif_decodestrip = DumpModeDecode;
116     tif->tif_decodetile = DumpModeDecode;
117     tif->tif_encoderow = DumpModeEncode;
118     tif->tif_encodestrip = DumpModeEncode;
119     tif->tif_encodetile = DumpModeEncode;
120     tif->tif_seek = DumpModeSeek;
121     return (1);
122 }
123