diff options
Diffstat (limited to 'src/brailleboi.c')
| -rw-r--r-- | src/brailleboi.c | 56 |
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])); + } + } +} |
