+#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;
}