LCOV - code coverage report
Current view: top level - gifdec - gifread.c (source / functions) Coverage Total Hit
Test: gifread_o_kitty.info Lines: 92.9 % 56 52
Test Date: 2024-03-08 14:23:29 Functions: 100.0 % 3 3

            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 : }
        

Generated by: LCOV version 2.0-1