fb.c (1659B)
1 #include <stdlib.h>
2 #include <stddef.h>
3 #include "fb.h"
4
5 size_t ta_fb_init(ta_fbs *fb) {
6 if (fb == 0 || fb->width == 0 || fb->height == 0 || fb->bpp == 0 || fb->bpp % 8 != 0) {
7 return 0;
8 }
9
10 size_t bytes_per_pixel = fb->bpp / 8;
11 size_t max_size = (size_t)-1;
12 if (fb->width > max_size / bytes_per_pixel || fb->height > max_size / (fb->width * bytes_per_pixel)) {
13 return 0;
14 }
15
16 size_t size = fb->width * fb->height * bytes_per_pixel;
17 free(fb->buffers[0]);
18 free(fb->buffers[1]);
19 fb->buffers[0] = 0;
20 fb->buffers[1] = 0;
21
22 void *first = malloc(size);
23 if (first == 0) {
24 return 0;
25 }
26
27 void *second = malloc(size);
28 if (second == 0) {
29 free(first);
30 return 0;
31 }
32
33 fb->size = size;
34 fb->buffers[0] = first;
35 fb->buffers[1] = second;
36 if (fb->bpp == 8) {
37 fb->format = TA_DISPLAY_PIXEL_FORMAT_8;
38 } else if (fb->bpp == 16) {
39 fb->format = TA_DISPLAY_PIXEL_FORMAT_16;
40 } else {
41 fb->format = TA_DISPLAY_PIXEL_FORMAT_32;
42 }
43 return size;
44 }
45
46 void ta_fb_swap(ta_fbs *fb) {
47 if (!fb || !fb->buffers[0] || !fb->buffers[1]) {
48 return;
49 }
50
51 void *temp = fb->buffers[0];
52 fb->buffers[0] = fb->buffers[1];
53 fb->buffers[1] = temp;
54 }
55
56 void ta_fb_clear(ta_fbs *fb) {
57 if (!fb) {
58 return;
59 }
60
61 if (fb->sprite_mode) {
62 ta_display_sprites_clear();
63 return;
64 }
65
66 if (!fb->buffers[1] || fb->size == 0) {
67 return;
68 }
69
70 size_t *dest = (size_t *)fb->buffers[1];
71 size_t num_words = fb->size / sizeof(size_t);
72
73 for (size_t i = 0; i < num_words; i++) {
74 dest[i] = 0;
75 }
76
77 unsigned char *byte_dest = (unsigned char *)fb->buffers[1];
78 size_t handled_bytes = num_words * sizeof(size_t);
79 for (size_t i = handled_bytes; i < fb->size; i++) {
80 byte_dest[i] = 0;
81 }
82 }