foo
[erebus2020] / liberebus / src / erebus.c
index da07635..af2b2d9 100644 (file)
@@ -1,10 +1,95 @@
+#include <stdio.h>
 #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; i<erb->fb_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;
 }