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