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 1 : 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 1 : printf("plain_text_ext tx=%u ty=%u tw=%u th=%u cw=%u ch=%u fg=%u bg=%u\ntext: ",
31 1 : tx,ty,tw,th,cw,ch,fg,bg);
32 : unsigned char c;
33 1 : while (read(gif->fd, &c, 1)) {
34 1 : if (c == 0) break;
35 0 : write(1,&c,1);
36 : }
37 1 : printf("\n");
38 1 : }
39 :
40 7 : void handle_comment(struct gd_GIF *gif) {
41 7 : printf("comment: ");
42 : unsigned char c;
43 19 : while (read(gif->fd, &c, 1)) {
44 19 : if (c == 0) break;
45 12 : write(1,&c,1);
46 : }
47 7 : printf("\n");
48 7 : }
49 :
50 : int
51 222 : main(int argc, char *argv[])
52 : {
53 : gd_GIF *gif;
54 222 : 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 222 : if (argc != 2) {
69 0 : fprintf(stderr, "usage:\n %s gif-file\n", argv[0]);
70 0 : return 1;
71 : }
72 222 : gif = gd_open_gif(argv[1]);
73 222 : if (!gif) {
74 6 : fprintf(stderr, "Could not open %s\n", argv[1]);
75 6 : return 1;
76 : }
77 216 : frame = malloc(gif->width * gif->height * 3);
78 216 : if (!frame) {
79 0 : fprintf(stderr, "Could not allocate frame\n");
80 0 : return 1;
81 : }
82 216 : gif->plain_text = handle_plain_text;
83 216 : gif->comment = handle_comment;
84 216 : snprintf(title, sizeof(title) - 1, "GIF %dx%d %d colors",
85 : gif->width, gif->height, gif->palette->size);
86 216 : color = &gif->gct.colors[gif->bgindex * 3];
87 216 : int num_bgcolors = 0;
88 216 : int loopcount = 1;
89 590 : while (loopcount) {
90 406 : ret = gd_get_frame(gif);
91 406 : if (ret == -1)
92 32 : break;
93 374 : gd_render_frame(gif, frame);
94 374 : color = frame;
95 11410 : for (i = 0; i < gif->height; i++) {
96 353116 : for (j = 0; j < gif->width; j++) {
97 342080 : if (!gd_is_bgcolor(gif, color)) {
98 143201 : num_bgcolors++;
99 143201 : }
100 342080 : color += 3;
101 342080 : }
102 11036 : }
103 374 : if (ret == 0) {
104 184 : loopcount--;
105 184 : gd_rewind(gif);
106 184 : }
107 : }
108 216 : free(frame);
109 216 : gd_close_gif(gif);
110 216 : return 0;
111 222 : }
|