X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=erebus2020;a=blobdiff_plain;f=liberebus%2Fsrc%2Ferebus.c;h=af2b2d9df078d2298a35e693a6e5f8521b6a53ad;hp=da0763520ed8de6017418bdf3c66531562354ef3;hb=399df0323dcd1cafe860565fd82598321aff52ee;hpb=2e09068ea0c58f8a464f8584b2bb4e9f23241e95 diff --git a/liberebus/src/erebus.c b/liberebus/src/erebus.c index da07635..af2b2d9 100644 --- a/liberebus/src/erebus.c +++ b/liberebus/src/erebus.c @@ -1,10 +1,95 @@ +#include #include "erebus.h" -int erb_init(void) +struct erb_rend { + int fb_width, fb_height, fb_npix; + float *fb_pixels; + int *fb_nsamples; +}; + +struct erb_rend *erb_create(void) +{ + struct erb_rend *erb; + + if(!(erb = calloc(1, sizeof *erb))) { + return 0; + } + return erb; +} + +void erb_destroy(struct erb_rend *erb) { + if(!erb) return; + free(erb->fb_pixels); + free(erb); +} + +int erb_allocframe(struct erb_rend *erb, int width, int height) +{ + float *newfb; + int *newns; + int npix; + + if(width == erb->fb_width && height == erb->fb_height) { + return 0; + } + + npix = width * height; + + if(!(newfb = malloc(npix * 3 * sizeof *erb->fb_pixels))) { + goto err; + } + if(!(newns = malloc(npix * sizeof *erb->fb_nsamples))) { + free(newfb); + goto err; + } + + free(erb->fb_pixels); + free(erb->fb_nsamples); + + erb->fb_pixels = newfb; + erb->fb_nsamples = newns; + erb->fb_width = width; + erb->fb_height = height; + erb->fb_npix = npix; return 0; + +err: + fprintf(stderr, "erb_allocframe: failed to allocate %dx%d framebuffer\n", width, height); + return -1; +} + +float *erb_getframe(struct erb_rend *erb) +{ + return erb->fb_pixels; } -void erb_cleanup(void) +void erb_begin(struct erb_rend *erb) { + memset(erb->fb_pixels, 0, erb->fb_npix * 3 * sizeof *erb->fb_pixels); + memset(erb->fb_nsamples, 0, erb->fb_npix * sizeof *erb->fb_nsamples); +} + +float *erb_end(struct erb_rend *erb) +{ + int i, n; + float s; + float *pptr = erb->fb_pixels; + int *nptr = erb->fb_nsamples; + + for(i=0; ifb_npix; i++) { + n = *nptr; + if(n > 1) { + s = 1.0f / n; + *pptr++ *= s; + *pptr++ *= s; + *pptr++ *= s; + *nptr++ = 1; + } else { + pptr += 3; + nptr++; + } + } + + return erb->fb_pixels; }