tuxanci2-engine
Game engine for tuxanci2
Log | Files | Refs | README | LICENSE

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 }