xref: /aosp_15_r20/external/giflib/gifsponge.c (revision 324bb76b8d05e2a05aa88511fff61cf3f9ca5892)
1*324bb76bSAndroid Build Coastguard Worker /****************************************************************************
2*324bb76bSAndroid Build Coastguard Worker 
3*324bb76bSAndroid Build Coastguard Worker gifsponge.c - skeleton file for generic GIF `sponge' program
4*324bb76bSAndroid Build Coastguard Worker 
5*324bb76bSAndroid Build Coastguard Worker Slurp a GIF into core, operate on it, spew it out again.  Most of the
6*324bb76bSAndroid Build Coastguard Worker junk above `int main' isn't needed for the skeleton, but is likely to
7*324bb76bSAndroid Build Coastguard Worker be for what you'll do with it.
8*324bb76bSAndroid Build Coastguard Worker 
9*324bb76bSAndroid Build Coastguard Worker If you compile this, it will turn into an expensive GIF copying routine;
10*324bb76bSAndroid Build Coastguard Worker stdin to stdout with no changes and minimal validation.  Well, it's a
11*324bb76bSAndroid Build Coastguard Worker decent test of DGifSlurp() and EGifSpew(), anyway.
12*324bb76bSAndroid Build Coastguard Worker 
13*324bb76bSAndroid Build Coastguard Worker Note: due to the vicissitudes of Lempel-Ziv compression, the output of this
14*324bb76bSAndroid Build Coastguard Worker copier may not be bitwise identical to its input.  This can happen if you
15*324bb76bSAndroid Build Coastguard Worker copy an image from a much more (or much *less*) memory-limited system; your
16*324bb76bSAndroid Build Coastguard Worker compression may use more (or fewer) bits.  The uncompressed rasters should,
17*324bb76bSAndroid Build Coastguard Worker however, be identical (you can check this with gifbuild -d).
18*324bb76bSAndroid Build Coastguard Worker 
19*324bb76bSAndroid Build Coastguard Worker SPDX-License-Identifier: MIT
20*324bb76bSAndroid Build Coastguard Worker 
21*324bb76bSAndroid Build Coastguard Worker ****************************************************************************/
22*324bb76bSAndroid Build Coastguard Worker 
23*324bb76bSAndroid Build Coastguard Worker #include <fcntl.h>
24*324bb76bSAndroid Build Coastguard Worker #include <stdio.h>
25*324bb76bSAndroid Build Coastguard Worker #include <stdlib.h>
26*324bb76bSAndroid Build Coastguard Worker #include <string.h>
27*324bb76bSAndroid Build Coastguard Worker 
28*324bb76bSAndroid Build Coastguard Worker #include "getarg.h"
29*324bb76bSAndroid Build Coastguard Worker #include "gif_lib.h"
30*324bb76bSAndroid Build Coastguard Worker 
31*324bb76bSAndroid Build Coastguard Worker #define PROGRAM_NAME "gifsponge"
32*324bb76bSAndroid Build Coastguard Worker 
main(int argc,char ** argv)33*324bb76bSAndroid Build Coastguard Worker int main(int argc, char **argv) {
34*324bb76bSAndroid Build Coastguard Worker 	int i, ErrorCode;
35*324bb76bSAndroid Build Coastguard Worker 	GifFileType *GifFileIn, *GifFileOut = (GifFileType *)NULL;
36*324bb76bSAndroid Build Coastguard Worker 
37*324bb76bSAndroid Build Coastguard Worker 	if ((GifFileIn = DGifOpenFileHandle(0, &ErrorCode)) == NULL) {
38*324bb76bSAndroid Build Coastguard Worker 		PrintGifError(ErrorCode);
39*324bb76bSAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
40*324bb76bSAndroid Build Coastguard Worker 	}
41*324bb76bSAndroid Build Coastguard Worker 	if (DGifSlurp(GifFileIn) == GIF_ERROR) {
42*324bb76bSAndroid Build Coastguard Worker 		PrintGifError(GifFileIn->Error);
43*324bb76bSAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
44*324bb76bSAndroid Build Coastguard Worker 	}
45*324bb76bSAndroid Build Coastguard Worker 	if ((GifFileOut = EGifOpenFileHandle(1, &ErrorCode)) == NULL) {
46*324bb76bSAndroid Build Coastguard Worker 		PrintGifError(ErrorCode);
47*324bb76bSAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
48*324bb76bSAndroid Build Coastguard Worker 	}
49*324bb76bSAndroid Build Coastguard Worker 
50*324bb76bSAndroid Build Coastguard Worker 	/*
51*324bb76bSAndroid Build Coastguard Worker 	 * Your operations on in-core structures go here.
52*324bb76bSAndroid Build Coastguard Worker 	 * This code just copies the header and each image from the incoming
53*324bb76bSAndroid Build Coastguard Worker 	 * file.
54*324bb76bSAndroid Build Coastguard Worker 	 */
55*324bb76bSAndroid Build Coastguard Worker 	GifFileOut->SWidth = GifFileIn->SWidth;
56*324bb76bSAndroid Build Coastguard Worker 	GifFileOut->SHeight = GifFileIn->SHeight;
57*324bb76bSAndroid Build Coastguard Worker 	GifFileOut->SColorResolution = GifFileIn->SColorResolution;
58*324bb76bSAndroid Build Coastguard Worker 	GifFileOut->SBackGroundColor = GifFileIn->SBackGroundColor;
59*324bb76bSAndroid Build Coastguard Worker 	if (GifFileIn->SColorMap) {
60*324bb76bSAndroid Build Coastguard Worker 		GifFileOut->SColorMap =
61*324bb76bSAndroid Build Coastguard Worker 		    GifMakeMapObject(GifFileIn->SColorMap->ColorCount,
62*324bb76bSAndroid Build Coastguard Worker 		                     GifFileIn->SColorMap->Colors);
63*324bb76bSAndroid Build Coastguard Worker 	} else {
64*324bb76bSAndroid Build Coastguard Worker 		GifFileOut->SColorMap = NULL;
65*324bb76bSAndroid Build Coastguard Worker 	}
66*324bb76bSAndroid Build Coastguard Worker 
67*324bb76bSAndroid Build Coastguard Worker 	for (i = 0; i < GifFileIn->ImageCount; i++) {
68*324bb76bSAndroid Build Coastguard Worker 		(void)GifMakeSavedImage(GifFileOut, &GifFileIn->SavedImages[i]);
69*324bb76bSAndroid Build Coastguard Worker 	}
70*324bb76bSAndroid Build Coastguard Worker 
71*324bb76bSAndroid Build Coastguard Worker 	/*
72*324bb76bSAndroid Build Coastguard Worker 	 * Note: don't do DGifCloseFile early, as this will
73*324bb76bSAndroid Build Coastguard Worker 	 * deallocate all the memory containing the GIF data!
74*324bb76bSAndroid Build Coastguard Worker 	 *
75*324bb76bSAndroid Build Coastguard Worker 	 * Further note: EGifSpew() doesn't try to validity-check any of this
76*324bb76bSAndroid Build Coastguard Worker 	 * data; it's *your* responsibility to keep your changes consistent.
77*324bb76bSAndroid Build Coastguard Worker 	 * Caveat hacker!
78*324bb76bSAndroid Build Coastguard Worker 	 */
79*324bb76bSAndroid Build Coastguard Worker 	if (EGifSpew(GifFileOut) == GIF_ERROR) {
80*324bb76bSAndroid Build Coastguard Worker 		PrintGifError(GifFileOut->Error);
81*324bb76bSAndroid Build Coastguard Worker 	}
82*324bb76bSAndroid Build Coastguard Worker 
83*324bb76bSAndroid Build Coastguard Worker 	if (DGifCloseFile(GifFileIn, &ErrorCode) == GIF_ERROR) {
84*324bb76bSAndroid Build Coastguard Worker 		PrintGifError(ErrorCode);
85*324bb76bSAndroid Build Coastguard Worker 	}
86*324bb76bSAndroid Build Coastguard Worker 
87*324bb76bSAndroid Build Coastguard Worker 	return 0;
88*324bb76bSAndroid Build Coastguard Worker }
89*324bb76bSAndroid Build Coastguard Worker 
90*324bb76bSAndroid Build Coastguard Worker /* end */
91