aboutsummaryrefslogtreecommitdiff
path: root/src/brailleboi.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/brailleboi.c')
-rw-r--r--src/brailleboi.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/brailleboi.c b/src/brailleboi.c
new file mode 100644
index 0000000..82fbeeb
--- /dev/null
+++ b/src/brailleboi.c
@@ -0,0 +1,56 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <wchar.h>
+#include <locale.h>
+
+#include "brailleboi.h"
+
+int brailleInit(int width, int height, image_buffer* buf)
+{
+ setlocale(LC_ALL, "");
+ buf->width = width;
+ buf->height = height;
+ buf->char_width = (width+1)/2;
+ buf->char_height = (height+1)/2;
+ buf->contents = malloc((buf->char_width * buf->char_height) * sizeof(int));
+ return 0;
+}
+
+int brailleStop(image_buffer* buf)
+{
+ free(buf->contents);
+ return 0;
+}
+
+int brailleReorganizeBits(int old)
+{
+ //Reorganizes bits because the unicode standard for 8 dotted braille is weird
+ int new = (old&0x87) | // 0b10000111
+ (old&0x70)>>1 | // 0b01110000
+ (old&0x08)<<3; // 0b00001000
+ return new;
+}
+
+void braillePrint(int data)
+{
+ wprintf(L"%lc", (0x2800|data));
+}
+
+int braillePlot(int x, int y, image_buffer* buf)
+{
+ //Check if plot is within bounds
+ if ((x>buf->width) | (y>buf->height))
+ return 1;
+ buf->contents[(y-1)/4 * buf->char_width + (x-1)/2] |= 1<<((y-1)%4+(1-x%2)*4);
+ return 0;
+}
+
+void brailleUpdateScreen(image_buffer* buf)
+{
+ for (int x=0;x<buf->char_width;x++) {
+ for (int y=0;y<buf->char_height;y++) {
+ wprintf(L"\e[%d;%dH", y+1, x+1);
+ braillePrint(brailleReorganizeBits(buf->contents[y * buf->char_width + x]));
+ }
+ }
+}