xref: /aosp_15_r20/external/giflib/gifhisto.c (revision 324bb76b8d05e2a05aa88511fff61cf3f9ca5892)
1*324bb76bSAndroid Build Coastguard Worker /*****************************************************************************
2*324bb76bSAndroid Build Coastguard Worker 
3*324bb76bSAndroid Build Coastguard Worker gifhisto - make a color histogram from image color frequencies
4*324bb76bSAndroid Build Coastguard Worker 
5*324bb76bSAndroid Build Coastguard Worker SPDX-License-Identifier: MIT
6*324bb76bSAndroid Build Coastguard Worker 
7*324bb76bSAndroid Build Coastguard Worker *****************************************************************************/
8*324bb76bSAndroid Build Coastguard Worker 
9*324bb76bSAndroid Build Coastguard Worker #include <ctype.h>
10*324bb76bSAndroid Build Coastguard Worker #include <stdbool.h>
11*324bb76bSAndroid Build Coastguard Worker #include <stdio.h>
12*324bb76bSAndroid Build Coastguard Worker #include <stdlib.h>
13*324bb76bSAndroid Build Coastguard Worker #include <string.h>
14*324bb76bSAndroid Build Coastguard Worker 
15*324bb76bSAndroid Build Coastguard Worker #include "getarg.h"
16*324bb76bSAndroid Build Coastguard Worker #include "gif_lib.h"
17*324bb76bSAndroid Build Coastguard Worker 
18*324bb76bSAndroid Build Coastguard Worker #define PROGRAM_NAME "gifhisto"
19*324bb76bSAndroid Build Coastguard Worker 
20*324bb76bSAndroid Build Coastguard Worker #define DEFAULT_HISTO_WIDTH 100 /* Histogram image diemnsions. */
21*324bb76bSAndroid Build Coastguard Worker #define DEFAULT_HISTO_HEIGHT 256
22*324bb76bSAndroid Build Coastguard Worker #define HISTO_BITS_PER_PIXEL 2 /* Size of bitmap for histogram GIF. */
23*324bb76bSAndroid Build Coastguard Worker 
24*324bb76bSAndroid Build Coastguard Worker static char *VersionStr = PROGRAM_NAME VERSION_COOKIE
25*324bb76bSAndroid Build Coastguard Worker     "	Gershon Elber,	" __DATE__ ",   " __TIME__ "\n"
26*324bb76bSAndroid Build Coastguard Worker     "(C) Copyright 1989 Gershon Elber.\n";
27*324bb76bSAndroid Build Coastguard Worker static char *CtrlStr = PROGRAM_NAME
28*324bb76bSAndroid Build Coastguard Worker     " v%- t%- s%-Width|Height!d!d n%-ImageNumber!d b%- h%- GifFile!*s";
29*324bb76bSAndroid Build Coastguard Worker 
30*324bb76bSAndroid Build Coastguard Worker static int ImageWidth = DEFAULT_HISTO_WIDTH, ImageHeight = DEFAULT_HISTO_HEIGHT,
31*324bb76bSAndroid Build Coastguard Worker            ImageN = 1;
32*324bb76bSAndroid Build Coastguard Worker static GifColorType HistoColorMap[] = {/* Constant bit map for histograms: */
33*324bb76bSAndroid Build Coastguard Worker                                        {0, 0, 0},
34*324bb76bSAndroid Build Coastguard Worker                                        {255, 0, 0},
35*324bb76bSAndroid Build Coastguard Worker                                        {0, 255, 0},
36*324bb76bSAndroid Build Coastguard Worker                                        {0, 0, 255}};
37*324bb76bSAndroid Build Coastguard Worker 
38*324bb76bSAndroid Build Coastguard Worker static void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut);
39*324bb76bSAndroid Build Coastguard Worker 
40*324bb76bSAndroid Build Coastguard Worker /******************************************************************************
41*324bb76bSAndroid Build Coastguard Worker  Interpret the command line and scan the given GIF file.
42*324bb76bSAndroid Build Coastguard Worker ******************************************************************************/
main(int argc,char ** argv)43*324bb76bSAndroid Build Coastguard Worker int main(int argc, char **argv) {
44*324bb76bSAndroid Build Coastguard Worker 	int i, j, ErrorCode, NumFiles, ExtCode, CodeSize, NumColors = 2,
45*324bb76bSAndroid Build Coastguard Worker 	                                                  ImageNum = 0;
46*324bb76bSAndroid Build Coastguard Worker 	bool Error, TextFlag = false, SizeFlag = false, ImageNFlag = false,
47*324bb76bSAndroid Build Coastguard Worker 	            BackGroundFlag = false, HelpFlag = false, GifNoisyPrint;
48*324bb76bSAndroid Build Coastguard Worker 	long Histogram[256];
49*324bb76bSAndroid Build Coastguard Worker 	GifRecordType RecordType;
50*324bb76bSAndroid Build Coastguard Worker 	GifByteType *Extension, *CodeBlock;
51*324bb76bSAndroid Build Coastguard Worker 	char **FileName = NULL;
52*324bb76bSAndroid Build Coastguard Worker 	GifRowType Line;
53*324bb76bSAndroid Build Coastguard Worker 	GifFileType *GifFileIn = NULL, *GifFileOut = NULL;
54*324bb76bSAndroid Build Coastguard Worker 
55*324bb76bSAndroid Build Coastguard Worker 	/* Same image dimension vars for both Image & ImageN as only one allowed
56*324bb76bSAndroid Build Coastguard Worker 	 */
57*324bb76bSAndroid Build Coastguard Worker 	if ((Error = GAGetArgs(argc, argv, CtrlStr, &GifNoisyPrint, &TextFlag,
58*324bb76bSAndroid Build Coastguard Worker 	                       &SizeFlag, &ImageWidth, &ImageHeight,
59*324bb76bSAndroid Build Coastguard Worker 	                       &ImageNFlag, &ImageN, &BackGroundFlag, &HelpFlag,
60*324bb76bSAndroid Build Coastguard Worker 	                       &NumFiles, &FileName)) != false ||
61*324bb76bSAndroid Build Coastguard Worker 	    (NumFiles > 1 && !HelpFlag)) {
62*324bb76bSAndroid Build Coastguard Worker 		if (Error) {
63*324bb76bSAndroid Build Coastguard Worker 			GAPrintErrMsg(Error);
64*324bb76bSAndroid Build Coastguard Worker 		} else if (NumFiles > 1) {
65*324bb76bSAndroid Build Coastguard Worker 			GIF_MESSAGE("Error in command line parsing - one GIF "
66*324bb76bSAndroid Build Coastguard Worker 			            "file please.");
67*324bb76bSAndroid Build Coastguard Worker 		}
68*324bb76bSAndroid Build Coastguard Worker 		GAPrintHowTo(CtrlStr);
69*324bb76bSAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
70*324bb76bSAndroid Build Coastguard Worker 	}
71*324bb76bSAndroid Build Coastguard Worker 
72*324bb76bSAndroid Build Coastguard Worker 	if (HelpFlag) {
73*324bb76bSAndroid Build Coastguard Worker 		(void)fprintf(stderr, VersionStr, GIFLIB_MAJOR, GIFLIB_MINOR);
74*324bb76bSAndroid Build Coastguard Worker 		GAPrintHowTo(CtrlStr);
75*324bb76bSAndroid Build Coastguard Worker 		exit(EXIT_SUCCESS);
76*324bb76bSAndroid Build Coastguard Worker 	}
77*324bb76bSAndroid Build Coastguard Worker 
78*324bb76bSAndroid Build Coastguard Worker 	if (NumFiles == 1) {
79*324bb76bSAndroid Build Coastguard Worker 		if ((GifFileIn = DGifOpenFileName(*FileName, &ErrorCode)) ==
80*324bb76bSAndroid Build Coastguard Worker 		    NULL) {
81*324bb76bSAndroid Build Coastguard Worker 			PrintGifError(ErrorCode);
82*324bb76bSAndroid Build Coastguard Worker 			exit(EXIT_FAILURE);
83*324bb76bSAndroid Build Coastguard Worker 		}
84*324bb76bSAndroid Build Coastguard Worker 	} else {
85*324bb76bSAndroid Build Coastguard Worker 		/* Use stdin instead: */
86*324bb76bSAndroid Build Coastguard Worker 		if ((GifFileIn = DGifOpenFileHandle(0, &ErrorCode)) == NULL) {
87*324bb76bSAndroid Build Coastguard Worker 			PrintGifError(ErrorCode);
88*324bb76bSAndroid Build Coastguard Worker 			exit(EXIT_FAILURE);
89*324bb76bSAndroid Build Coastguard Worker 		}
90*324bb76bSAndroid Build Coastguard Worker 	}
91*324bb76bSAndroid Build Coastguard Worker 
92*324bb76bSAndroid Build Coastguard Worker 	for (i = 0; i < 256; i++) {
93*324bb76bSAndroid Build Coastguard Worker 		Histogram[i] = 0; /* Reset counters. */
94*324bb76bSAndroid Build Coastguard Worker 	}
95*324bb76bSAndroid Build Coastguard Worker 	/* Scan the content of the GIF file and load the image(s) in: */
96*324bb76bSAndroid Build Coastguard Worker 	do {
97*324bb76bSAndroid Build Coastguard Worker 		if (DGifGetRecordType(GifFileIn, &RecordType) == GIF_ERROR) {
98*324bb76bSAndroid Build Coastguard Worker 			QuitGifError(GifFileIn, GifFileOut);
99*324bb76bSAndroid Build Coastguard Worker 		}
100*324bb76bSAndroid Build Coastguard Worker 
101*324bb76bSAndroid Build Coastguard Worker 		switch (RecordType) {
102*324bb76bSAndroid Build Coastguard Worker 		case IMAGE_DESC_RECORD_TYPE:
103*324bb76bSAndroid Build Coastguard Worker 			if (DGifGetImageDesc(GifFileIn) == GIF_ERROR) {
104*324bb76bSAndroid Build Coastguard Worker 				QuitGifError(GifFileIn, GifFileOut);
105*324bb76bSAndroid Build Coastguard Worker 			}
106*324bb76bSAndroid Build Coastguard Worker 
107*324bb76bSAndroid Build Coastguard Worker 			if (GifFileIn->Image.ColorMap) {
108*324bb76bSAndroid Build Coastguard Worker 				NumColors =
109*324bb76bSAndroid Build Coastguard Worker 				    GifFileIn->Image.ColorMap->ColorCount;
110*324bb76bSAndroid Build Coastguard Worker 			} else if (GifFileIn->SColorMap) {
111*324bb76bSAndroid Build Coastguard Worker 				NumColors = GifFileIn->SColorMap->ColorCount;
112*324bb76bSAndroid Build Coastguard Worker 			} else {
113*324bb76bSAndroid Build Coastguard Worker 				GIF_EXIT("Neither Screen nor Image color map "
114*324bb76bSAndroid Build Coastguard Worker 				         "exists.");
115*324bb76bSAndroid Build Coastguard Worker 			}
116*324bb76bSAndroid Build Coastguard Worker 
117*324bb76bSAndroid Build Coastguard Worker 			if ((ImageHeight / NumColors) * NumColors !=
118*324bb76bSAndroid Build Coastguard Worker 			    ImageHeight) {
119*324bb76bSAndroid Build Coastguard Worker 				GIF_EXIT("Image height specified not dividable "
120*324bb76bSAndroid Build Coastguard Worker 				         "by #colors.");
121*324bb76bSAndroid Build Coastguard Worker 			}
122*324bb76bSAndroid Build Coastguard Worker 
123*324bb76bSAndroid Build Coastguard Worker 			if (++ImageNum == ImageN) {
124*324bb76bSAndroid Build Coastguard Worker 				/* This is the image we should make histogram
125*324bb76bSAndroid Build Coastguard Worker 				 * for:       */
126*324bb76bSAndroid Build Coastguard Worker 				Line =
127*324bb76bSAndroid Build Coastguard Worker 				    (GifRowType)malloc(GifFileIn->Image.Width *
128*324bb76bSAndroid Build Coastguard Worker 				                       sizeof(GifPixelType));
129*324bb76bSAndroid Build Coastguard Worker 				GifQprintf(
130*324bb76bSAndroid Build Coastguard Worker 				    "\n%s: Image %d at (%d, %d) [%dx%d]:     ",
131*324bb76bSAndroid Build Coastguard Worker 				    PROGRAM_NAME, ImageNum,
132*324bb76bSAndroid Build Coastguard Worker 				    GifFileIn->Image.Left, GifFileIn->Image.Top,
133*324bb76bSAndroid Build Coastguard Worker 				    GifFileIn->Image.Width,
134*324bb76bSAndroid Build Coastguard Worker 				    GifFileIn->Image.Height);
135*324bb76bSAndroid Build Coastguard Worker 
136*324bb76bSAndroid Build Coastguard Worker 				for (i = 0; i < GifFileIn->Image.Height; i++) {
137*324bb76bSAndroid Build Coastguard Worker 					if (DGifGetLine(
138*324bb76bSAndroid Build Coastguard Worker 					        GifFileIn, Line,
139*324bb76bSAndroid Build Coastguard Worker 					        GifFileIn->Image.Width) ==
140*324bb76bSAndroid Build Coastguard Worker 					    GIF_ERROR) {
141*324bb76bSAndroid Build Coastguard Worker 						QuitGifError(GifFileIn,
142*324bb76bSAndroid Build Coastguard Worker 						             GifFileOut);
143*324bb76bSAndroid Build Coastguard Worker 					}
144*324bb76bSAndroid Build Coastguard Worker 					for (j = 0; j < GifFileIn->Image.Width;
145*324bb76bSAndroid Build Coastguard Worker 					     j++) {
146*324bb76bSAndroid Build Coastguard Worker 						Histogram[Line[j]]++;
147*324bb76bSAndroid Build Coastguard Worker 					}
148*324bb76bSAndroid Build Coastguard Worker 					GifQprintf("\b\b\b\b%-4d", i);
149*324bb76bSAndroid Build Coastguard Worker 				}
150*324bb76bSAndroid Build Coastguard Worker 
151*324bb76bSAndroid Build Coastguard Worker 				free((char *)Line);
152*324bb76bSAndroid Build Coastguard Worker 			} else {
153*324bb76bSAndroid Build Coastguard Worker 				/* Skip the image: */
154*324bb76bSAndroid Build Coastguard Worker 				/* Now read image itself in decoded form as we
155*324bb76bSAndroid Build Coastguard Worker 				 * dont      */
156*324bb76bSAndroid Build Coastguard Worker 				/* really care what is there, and this is much
157*324bb76bSAndroid Build Coastguard Worker 				 * faster.   */
158*324bb76bSAndroid Build Coastguard Worker 				if (DGifGetCode(GifFileIn, &CodeSize,
159*324bb76bSAndroid Build Coastguard Worker 				                &CodeBlock) == GIF_ERROR) {
160*324bb76bSAndroid Build Coastguard Worker 					QuitGifError(GifFileIn, GifFileOut);
161*324bb76bSAndroid Build Coastguard Worker 				}
162*324bb76bSAndroid Build Coastguard Worker 				while (CodeBlock != NULL) {
163*324bb76bSAndroid Build Coastguard Worker 					if (DGifGetCodeNext(GifFileIn,
164*324bb76bSAndroid Build Coastguard Worker 					                    &CodeBlock) ==
165*324bb76bSAndroid Build Coastguard Worker 					    GIF_ERROR) {
166*324bb76bSAndroid Build Coastguard Worker 						QuitGifError(GifFileIn,
167*324bb76bSAndroid Build Coastguard Worker 						             GifFileOut);
168*324bb76bSAndroid Build Coastguard Worker 					}
169*324bb76bSAndroid Build Coastguard Worker 				}
170*324bb76bSAndroid Build Coastguard Worker 			}
171*324bb76bSAndroid Build Coastguard Worker 			break;
172*324bb76bSAndroid Build Coastguard Worker 		case EXTENSION_RECORD_TYPE:
173*324bb76bSAndroid Build Coastguard Worker 			/* Skip any extension blocks in file: */
174*324bb76bSAndroid Build Coastguard Worker 			if (DGifGetExtension(GifFileIn, &ExtCode, &Extension) ==
175*324bb76bSAndroid Build Coastguard Worker 			    GIF_ERROR) {
176*324bb76bSAndroid Build Coastguard Worker 				QuitGifError(GifFileIn, GifFileOut);
177*324bb76bSAndroid Build Coastguard Worker 			}
178*324bb76bSAndroid Build Coastguard Worker 
179*324bb76bSAndroid Build Coastguard Worker 			while (Extension != NULL) {
180*324bb76bSAndroid Build Coastguard Worker 				if (DGifGetExtensionNext(
181*324bb76bSAndroid Build Coastguard Worker 				        GifFileIn, &Extension) == GIF_ERROR) {
182*324bb76bSAndroid Build Coastguard Worker 					QuitGifError(GifFileIn, GifFileOut);
183*324bb76bSAndroid Build Coastguard Worker 				}
184*324bb76bSAndroid Build Coastguard Worker 			}
185*324bb76bSAndroid Build Coastguard Worker 			break;
186*324bb76bSAndroid Build Coastguard Worker 		case TERMINATE_RECORD_TYPE:
187*324bb76bSAndroid Build Coastguard Worker 			break;
188*324bb76bSAndroid Build Coastguard Worker 		default: /* Should be trapped by DGifGetRecordType. */
189*324bb76bSAndroid Build Coastguard Worker 			break;
190*324bb76bSAndroid Build Coastguard Worker 		}
191*324bb76bSAndroid Build Coastguard Worker 	} while (RecordType != TERMINATE_RECORD_TYPE);
192*324bb76bSAndroid Build Coastguard Worker 
193*324bb76bSAndroid Build Coastguard Worker 	/* We requested suppression of the background count: */
194*324bb76bSAndroid Build Coastguard Worker 	if (BackGroundFlag) {
195*324bb76bSAndroid Build Coastguard Worker 		Histogram[GifFileIn->SBackGroundColor] = 0;
196*324bb76bSAndroid Build Coastguard Worker 	}
197*324bb76bSAndroid Build Coastguard Worker 
198*324bb76bSAndroid Build Coastguard Worker 	if (DGifCloseFile(GifFileIn, &ErrorCode) == GIF_ERROR) {
199*324bb76bSAndroid Build Coastguard Worker 		PrintGifError(ErrorCode);
200*324bb76bSAndroid Build Coastguard Worker 		exit(EXIT_FAILURE);
201*324bb76bSAndroid Build Coastguard Worker 	}
202*324bb76bSAndroid Build Coastguard Worker 
203*324bb76bSAndroid Build Coastguard Worker 	/* We may required to dump out the histogram as text file: */
204*324bb76bSAndroid Build Coastguard Worker 	if (TextFlag) {
205*324bb76bSAndroid Build Coastguard Worker 		for (i = 0; i < NumColors; i++) {
206*324bb76bSAndroid Build Coastguard Worker 			printf("%12ld  %3d\n", Histogram[i], i);
207*324bb76bSAndroid Build Coastguard Worker 		}
208*324bb76bSAndroid Build Coastguard Worker 	} else {
209*324bb76bSAndroid Build Coastguard Worker 		int Color, Count;
210*324bb76bSAndroid Build Coastguard Worker 		long Scaler;
211*324bb76bSAndroid Build Coastguard Worker 		/* Open stdout for the histogram output file: */
212*324bb76bSAndroid Build Coastguard Worker 		if ((GifFileOut = EGifOpenFileHandle(1, &ErrorCode)) == NULL) {
213*324bb76bSAndroid Build Coastguard Worker 			PrintGifError(ErrorCode);
214*324bb76bSAndroid Build Coastguard Worker 			exit(EXIT_FAILURE);
215*324bb76bSAndroid Build Coastguard Worker 		}
216*324bb76bSAndroid Build Coastguard Worker 
217*324bb76bSAndroid Build Coastguard Worker 		/* Dump out screen descriptor to fit histogram dimensions: */
218*324bb76bSAndroid Build Coastguard Worker 		if (EGifPutScreenDesc(GifFileOut, ImageWidth, ImageHeight,
219*324bb76bSAndroid Build Coastguard Worker 		                      HISTO_BITS_PER_PIXEL, 0,
220*324bb76bSAndroid Build Coastguard Worker 		                      GifMakeMapObject(4, HistoColorMap)) ==
221*324bb76bSAndroid Build Coastguard Worker 		    GIF_ERROR) {
222*324bb76bSAndroid Build Coastguard Worker 			QuitGifError(GifFileIn, GifFileOut);
223*324bb76bSAndroid Build Coastguard Worker 		}
224*324bb76bSAndroid Build Coastguard Worker 
225*324bb76bSAndroid Build Coastguard Worker 		/* Dump out image descriptor to fit histogram dimensions: */
226*324bb76bSAndroid Build Coastguard Worker 		if (EGifPutImageDesc(GifFileOut, 0, 0, ImageWidth, ImageHeight,
227*324bb76bSAndroid Build Coastguard Worker 		                     false, NULL) == GIF_ERROR) {
228*324bb76bSAndroid Build Coastguard Worker 			QuitGifError(GifFileIn, GifFileOut);
229*324bb76bSAndroid Build Coastguard Worker 		}
230*324bb76bSAndroid Build Coastguard Worker 
231*324bb76bSAndroid Build Coastguard Worker 		/* Prepare scan line for histogram file, and find scaler to
232*324bb76bSAndroid Build Coastguard Worker 		 * scale    */
233*324bb76bSAndroid Build Coastguard Worker 		/* histogram to be between 0 and ImageWidth: */
234*324bb76bSAndroid Build Coastguard Worker 		Line = (GifRowType)malloc(ImageWidth * sizeof(GifPixelType));
235*324bb76bSAndroid Build Coastguard Worker 		for (Scaler = 0, i = 0; i < NumColors; i++) {
236*324bb76bSAndroid Build Coastguard Worker 			if (Histogram[i] > Scaler) {
237*324bb76bSAndroid Build Coastguard Worker 				Scaler = Histogram[i];
238*324bb76bSAndroid Build Coastguard Worker 			}
239*324bb76bSAndroid Build Coastguard Worker 		}
240*324bb76bSAndroid Build Coastguard Worker 		Scaler /= ImageWidth;
241*324bb76bSAndroid Build Coastguard Worker 		if (Scaler == 0) {
242*324bb76bSAndroid Build Coastguard Worker 			Scaler = 1; /* In case maximum is less than width. */
243*324bb76bSAndroid Build Coastguard Worker 		}
244*324bb76bSAndroid Build Coastguard Worker 		/* Dump out the image itself: */
245*324bb76bSAndroid Build Coastguard Worker 		for (Count = ImageHeight, i = 0, Color = 1; i < NumColors;
246*324bb76bSAndroid Build Coastguard Worker 		     i++) {
247*324bb76bSAndroid Build Coastguard Worker 			int Size;
248*324bb76bSAndroid Build Coastguard Worker 			if ((Size = Histogram[i] / Scaler) > ImageWidth) {
249*324bb76bSAndroid Build Coastguard Worker 				Size = ImageWidth;
250*324bb76bSAndroid Build Coastguard Worker 			}
251*324bb76bSAndroid Build Coastguard Worker 			for (j = 0; j < Size; j++) {
252*324bb76bSAndroid Build Coastguard Worker 				Line[j] = Color;
253*324bb76bSAndroid Build Coastguard Worker 			}
254*324bb76bSAndroid Build Coastguard Worker 			for (j = Size; j < ImageWidth; j++) {
255*324bb76bSAndroid Build Coastguard Worker 				Line[j] = GifFileOut->SBackGroundColor;
256*324bb76bSAndroid Build Coastguard Worker 			}
257*324bb76bSAndroid Build Coastguard Worker 
258*324bb76bSAndroid Build Coastguard Worker 			/* Move to next color: */
259*324bb76bSAndroid Build Coastguard Worker 			if (++Color >= (1 << HISTO_BITS_PER_PIXEL)) {
260*324bb76bSAndroid Build Coastguard Worker 				Color = 1;
261*324bb76bSAndroid Build Coastguard Worker 			}
262*324bb76bSAndroid Build Coastguard Worker 
263*324bb76bSAndroid Build Coastguard Worker 			/* Dump this histogram entry as many times as required:
264*324bb76bSAndroid Build Coastguard Worker 			 */
265*324bb76bSAndroid Build Coastguard Worker 			for (j = 0; j < ImageHeight / NumColors; j++) {
266*324bb76bSAndroid Build Coastguard Worker 				if (EGifPutLine(GifFileOut, Line, ImageWidth) ==
267*324bb76bSAndroid Build Coastguard Worker 				    GIF_ERROR) {
268*324bb76bSAndroid Build Coastguard Worker 					QuitGifError(GifFileIn, GifFileOut);
269*324bb76bSAndroid Build Coastguard Worker 				}
270*324bb76bSAndroid Build Coastguard Worker 				GifQprintf("\b\b\b\b%-4d", Count--);
271*324bb76bSAndroid Build Coastguard Worker 			}
272*324bb76bSAndroid Build Coastguard Worker 		}
273*324bb76bSAndroid Build Coastguard Worker 
274*324bb76bSAndroid Build Coastguard Worker 		if (EGifCloseFile(GifFileOut, &ErrorCode) == GIF_ERROR) {
275*324bb76bSAndroid Build Coastguard Worker 			PrintGifError(ErrorCode);
276*324bb76bSAndroid Build Coastguard Worker 			exit(EXIT_FAILURE);
277*324bb76bSAndroid Build Coastguard Worker 		}
278*324bb76bSAndroid Build Coastguard Worker 	}
279*324bb76bSAndroid Build Coastguard Worker 
280*324bb76bSAndroid Build Coastguard Worker 	return 0;
281*324bb76bSAndroid Build Coastguard Worker }
282*324bb76bSAndroid Build Coastguard Worker 
283*324bb76bSAndroid Build Coastguard Worker /******************************************************************************
284*324bb76bSAndroid Build Coastguard Worker  Close both input and output file (if open), and exit.
285*324bb76bSAndroid Build Coastguard Worker ******************************************************************************/
QuitGifError(GifFileType * GifFileIn,GifFileType * GifFileOut)286*324bb76bSAndroid Build Coastguard Worker static void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut) {
287*324bb76bSAndroid Build Coastguard Worker 	if (GifFileIn != NULL) {
288*324bb76bSAndroid Build Coastguard Worker 		PrintGifError(GifFileIn->Error);
289*324bb76bSAndroid Build Coastguard Worker 		EGifCloseFile(GifFileIn, NULL);
290*324bb76bSAndroid Build Coastguard Worker 	}
291*324bb76bSAndroid Build Coastguard Worker 	if (GifFileOut != NULL) {
292*324bb76bSAndroid Build Coastguard Worker 		PrintGifError(GifFileOut->Error);
293*324bb76bSAndroid Build Coastguard Worker 		EGifCloseFile(GifFileOut, NULL);
294*324bb76bSAndroid Build Coastguard Worker 	}
295*324bb76bSAndroid Build Coastguard Worker 	exit(EXIT_FAILURE);
296*324bb76bSAndroid Build Coastguard Worker }
297*324bb76bSAndroid Build Coastguard Worker 
298*324bb76bSAndroid Build Coastguard Worker /* end */
299