GCC Code Coverage Report


Directory: src/
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 100.0% 18 / 0 / 18
Functions: 100.0% 2 / 0 / 2
Branches: 100.0% 6 / 0 / 6

bunkers/src/bunkers.c
Line Branch Exec Source
1 /*
2 * SPDX-License-Identifier: MIT
3 *
4 * Copyright (c) 2026 Manuel Hernández Méndez
5 *
6 * Authors:
7 * Manuel Hernández Méndez <maherme.dev@gmail.com>
8 */
9
10 #include "bunkers.h"
11 #include "graph.h"
12 #include "graphGlutCallbacks.h"
13 #include <assert.h>
14 #include <string.h>
15
16 #define BUNKER_WIDTH 22
17 #define BUNKER_HEIGHT 16
18 #define NUM_BUNKERS 4
19 #define BUNKER_SPACING ((GAME_WIDTH - BUNKER_WIDTH * NUM_BUNKERS) / (NUM_BUNKERS + 1))
20
21 static const char bunker_image[BUNKER_HEIGHT][BUNKER_WIDTH][NUM_RGBA_CHANNELS] = {
22 {B, B, B, B, G, G, G, G, G, G, G, G, G, G, G, G, G, G, B, B, B, B},
23 {B, B, B, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, B, B, B},
24 {B, B, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, B, B},
25 {B, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, B},
26 {G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G},
27 {G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G},
28 {G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G},
29 {G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G},
30 {G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G},
31 {G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G},
32 {G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G},
33 {G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G},
34 {G, G, G, G, G, G, G, B, B, B, B, B, B, B, B, G, G, G, G, G, G, G},
35 {G, G, G, G, G, G, B, B, B, B, B, B, B, B, B, B, G, G, G, G, G, G},
36 {G, G, G, G, G, B, B, B, B, B, B, B, B, B, B, B, B, G, G, G, G, G},
37 {G, G, G, G, G, B, B, B, B, B, B, B, B, B, B, B, B, G, G, G, G, G}};
38
39 struct bunker_instance_t
40 {
41 sprite_t sprite;
42 char image[BUNKER_HEIGHT][BUNKER_WIDTH][NUM_RGBA_CHANNELS];
43 };
44
45 static struct bunker_instance_t bunkerPool[NUM_BUNKERS];
46
47 void
48 1 bunkersCreate(void)
49 {
50
2/2
✓ Branch 5 → 3 taken 4 times.
✓ Branch 5 → 6 taken 1 time.
5 for (int i = 0; i < NUM_BUNKERS; i++)
51 {
52 4 bunker_t bunker = &bunkerPool[i];
53 4 bunker->sprite.x = BUNKER_SPACING * (i + 1) + BUNKER_WIDTH * i;
54 4 bunker->sprite.y = GAME_HEIGHT / 16;
55 4 bunker->sprite.width = BUNKER_WIDTH;
56 4 bunker->sprite.height = BUNKER_HEIGHT;
57 4 memcpy(bunker->image, bunker_image, sizeof(bunker_image));
58 4 bunker->sprite.image = (char *)bunker->image;
59 4 bunker->sprite.layer = LAYER_BACKGROUND;
60 4 bunker->sprite.visible = true;
61 4 graphRegisterPrint(&bunker->sprite);
62 }
63 1 }
64
65 void
66 2 bunkersCallFunctionForEach(void (*fn)(bunker_t, void *ctx), void *ctx)
67 {
68
2/2
✓ Branch 2 → 3 taken 1 time.
✓ Branch 2 → 4 taken 1 time.
2 if (!fn)
69 {
70 assert(!"pointer to fn must not be NULL");
71 1 return;
72 }
73
74
2/2
✓ Branch 7 → 5 taken 4 times.
✓ Branch 7 → 8 taken 1 time.
5 for (int i = 0; i < NUM_BUNKERS; i++)
75 {
76 4 fn(&bunkerPool[i], ctx);
77 }
78 }
79