]> 4ch.mooo.com Git - 16.git/blobdiff - src/lib/planar.c
OK! that PLANAR been renamed to planar.... fuckin FAT!
[16.git] / src / lib / planar.c
diff --git a/src/lib/planar.c b/src/lib/planar.c
new file mode 100644 (file)
index 0000000..8b9f004
--- /dev/null
@@ -0,0 +1,78 @@
+/*\r
+ * Implimentation of the planar buffer files.\r
+ */\r
+#include <stdlib.h>\r
+#include "planar.h"\r
+\r
+/* creates a planar buffer from the bitmap data.\r
+   The planar buffer is dynamically allocated, and should\r
+   be destroyed with the planar_buf_free function when no longer\r
+   needed.\r
+ */\r
+planar_buf_t *\r
+planar_buf_from_bitmap(bitmap_t *b) {\r
+    planar_buf_t *p;\r
+    int plane, bi, pi, x, y;\r
+\r
+    /* allocate the buffer */\r
+    p = planar_buf_alloc(b->width, b->height);\r
+\r
+    /* copy the bitmap data into the planar format */\r
+    bi=0;\r
+    pi=0;\r
+    for(y=0; y < b->height; y++) {\r
+       /* start on the first plane */\r
+       plane=0;\r
+       for(x=0; x < b->width; x++) {\r
+           /* copy to each plane */\r
+           p->plane[plane++][pi]=b->data[bi++];\r
+\r
+           /* handle the completion of 4 planes. */\r
+           if(plane==4) {\r
+               plane=0;\r
+               pi++;\r
+           }\r
+       }\r
+\r
+       /* correct for images not divisible by 4 */\r
+       if(plane) pi++;\r
+    }\r
+\r
+    return p;\r
+}\r
+\r
+\r
+/* allocates a planar buffer with specified dimensions */\r
+planar_buf_t *\r
+planar_buf_alloc(word width, word height) {\r
+    planar_buf_t *p;\r
+    int i;\r
+\r
+    /* allocate the structure and populate sizes */\r
+    p=malloc(sizeof(planar_buf_t));\r
+    p->width  = width;\r
+    p->height = height;\r
+    p->pwidth = width / 4 + (width%4 ? 1 : 0);\r
+\r
+    /* allocate the planes */\r
+    for(i=0; i<4; i++) {\r
+       p->plane[i] = malloc(p->height * p->pwidth);\r
+    }\r
+\r
+    return p;\r
+}\r
+\r
+\r
+/* deallocates a planar buffer */\r
+void\r
+planar_buf_free(planar_buf_t *p) {\r
+    int i;\r
+\r
+    /* free the planes */\r
+    for(i=0; i<4; i++) {\r
+       free(p->plane[i]);\r
+    }\r
+\r
+    /* free the structure */\r
+    free(p);\r
+}\r