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