Line data Source code
1 : /* gifdec example -- simple GIF player using SDL2
2 : * compiling:
3 : * cc `pkg-config --cflags --libs sdl2` -o example gifdec.c example.c
4 : * executing:
5 : * ./example animation.gif
6 : * */
7 :
8 : #include <stdio.h>
9 : #include <stdlib.h>
10 : #include <stdint.h>
11 : #include <signal.h>
12 : #include <unistd.h>
13 :
14 : #include "gifdec.h"
15 :
16 : #ifdef GCOV
17 : void __gcov_dump();
18 :
19 : void gc_handler(int signum) {
20 : __gcov_dump();
21 : exit(1);
22 : }
23 : #endif
24 :
25 8 : void handle_plain_text(
26 : struct gd_GIF *gif, uint16_t tx, uint16_t ty,
27 : uint16_t tw, uint16_t th, uint8_t cw, uint8_t ch,
28 : uint8_t fg, uint8_t bg
29 : ) {
30 8 : printf("plain_text_ext tx=%u ty=%u tw=%u th=%u cw=%u ch=%u fg=%u bg=%u\ntext: ",
31 8 : tx,ty,tw,th,cw,ch,fg,bg);
32 : unsigned char c;
33 97 : while (read(gif->fd, &c, 1)) {
34 97 : if (c == 0) break;
35 89 : write(1,&c,1);
36 : }
37 8 : printf("\n");
38 8 : }
39 :
40 7 : void handle_comment(struct gd_GIF *gif) {
41 7 : printf("comment: ");
42 : unsigned char c;
43 17 : while (read(gif->fd, &c, 1)) {
44 17 : if (c == 0) break;
45 10 : write(1,&c,1);
46 : }
47 7 : printf("\n");
48 7 : }
49 :
50 : int
51 78 : main(int argc, char *argv[])
52 : {
53 : gd_GIF *gif;
54 78 : char title[32] = {0};
55 : uint8_t *color, *frame;
56 : void *addr;
57 : int i, j;
58 : uint32_t pixel;
59 : int ret, paused, quit;
60 : uint32_t t0, t1, delay, delta;
61 :
62 : #ifdef GCOV
63 : for (int sig = 1; sig <= SIGRTMAX; ++sig) {
64 : signal(sig, gc_handler);
65 : }
66 : #endif
67 :
68 78 : if (argc != 2) {
69 0 : fprintf(stderr, "usage:\n %s gif-file\n", argv[0]);
70 0 : return 1;
71 : }
72 78 : gif = gd_open_gif(argv[1]);
73 78 : if (!gif) {
74 6 : fprintf(stderr, "Could not open %s\n", argv[1]);
75 6 : return 1;
76 : }
77 72 : frame = malloc(gif->width * gif->height * 3);
78 72 : if (!frame) {
79 0 : fprintf(stderr, "Could not allocate frame\n");
80 0 : return 1;
81 : }
82 72 : gif->plain_text = handle_plain_text;
83 72 : gif->comment = handle_comment;
84 72 : snprintf(title, sizeof(title) - 1, "GIF %dx%d %d colors",
85 : gif->width, gif->height, gif->palette->size);
86 72 : color = &gif->gct.colors[gif->bgindex * 3];
87 72 : int num_bgcolors = 0;
88 72 : int loopcount = 1;
89 97 : while (loopcount) {
90 72 : ret = gd_get_frame(gif);
91 72 : if (ret == -1)
92 47 : break;
93 25 : gd_render_frame(gif, frame);
94 25 : color = frame;
95 239380 : for (i = 0; i < gif->height; i++) {
96 4588543 : for (j = 0; j < gif->width; j++) {
97 4349188 : if (!gd_is_bgcolor(gif, color)) {
98 0 : num_bgcolors++;
99 0 : }
100 4349188 : color += 3;
101 4349188 : }
102 239355 : }
103 25 : if (ret == 0) {
104 25 : loopcount--;
105 25 : gd_rewind(gif);
106 25 : }
107 : }
108 72 : free(frame);
109 72 : gd_close_gif(gif);
110 72 : return 0;
111 78 : }
|