diff options
Diffstat (limited to 'fbwarn/src/parseBVG.c')
-rw-r--r-- | fbwarn/src/parseBVG.c | 78 |
1 files changed, 61 insertions, 17 deletions
diff --git a/fbwarn/src/parseBVG.c b/fbwarn/src/parseBVG.c index ff8b248..ead9c83 100644 --- a/fbwarn/src/parseBVG.c +++ b/fbwarn/src/parseBVG.c @@ -1,7 +1,19 @@ +#include <stdbool.h> #include <stdlib.h> #include <stdio.h> #include <string.h> +#include "BVGTypes.h" #include "raylib.h" +#include "extString.h" + +void BVGDrawRectangle(BVGRectangle *rectangle) { + if (rectangle->fill) { + DrawRectangleRec(rectangle->rayrectangle, rectangle->color); + } else { + DrawRectangleLinesEx(rectangle->rayrectangle, rectangle->lineThickness, rectangle->color); + } + return; +} // reads a given file FILE *readFile(char *path) { @@ -28,41 +40,73 @@ char *multiToSingle(char *lines) { return result; } -void BVGRectangle(char *argv[5]) { - printf("Drawing rectangle\n"); - argv[4][strlen(argv[4])-2] = '\0'; - printf("%s, %s\n %s, %s,\n %s\n", argv[0], argv[1], argv[2], argv[3], argv[4]); - int x, y, width, height, r, g, b; +/* + Converts a given char pointer to a corresponding boolean value + expects the char to only contain true/false without any whitespace or similiar + case is ignored + If no match is found, true is returned by default +*/ +bool parseBoolValue(char *value) { + char *valueLower = strdup(strlwr(value)); + printf("Matching bool %s --- %s", valueLower, value); + if (strcmp(valueLower, "false") == 0) { + return false; + } else { + return true; + } +} + +BVGRectangle *BVGParseRectangle(char *argv[7]) { + BVGRectangle *result = malloc(sizeof(BVGRectangle)); + Rectangle *rectangle = malloc(sizeof(Rectangle)); + argv[4][strlen(argv[4])-1] = '\0'; + argv[4] = argv[4]+strlen("color=#'"); + int x, y, width, height, r, g, b, a; + float thickness = 1.0; + Color *clr = malloc(sizeof(Color)); sscanf(argv[0]+strlen("x="), "%d", &x); sscanf(argv[1]+strlen("y="), "%d", &y); sscanf(argv[2]+strlen("width="), "%d", &width); sscanf(argv[3]+strlen("height="), "%d", &height); - sscanf(argv[4]+strlen("color='#"), "%02x%02x%02x", &r, &g, &b); + if (strlen(argv[4]) == 6) { + sscanf(argv[4], "%02x%02x%02x", &r, &g, &b); + clr->r=r; clr->g=g; clr->b=b; clr->a=255; + } else { + sscanf(argv[4], "%02x%02x%02x%02x", &r, &g, &b, &a); + clr->r=r; clr->g=g; clr->b=b; clr->a=a; + } + sscanf(argv[6]+strlen("thickness="), "%fd", &thickness); printf("X: %d, Y: %d\n", x, y); printf("Width: %d, Height: %d\n", width, height); printf("Color: %d, %d, %d\n", r, g, b); - Color *clr = malloc(sizeof(Color)); - clr->r=r; - clr->g=g; - clr->b=b; - clr->a=255; - DrawRectangle(x, y, width, height, *clr); - return; + printf("Fill: %d, Thickness: %f\n", parseBoolValue(argv[5]+strlen("fill=")), thickness); + + rectangle->x=x; rectangle->y=y; + rectangle->height=height; rectangle->width=width; + result->rayrectangle=*rectangle; + + result->color=*clr; + result->fill=parseBoolValue(argv[5]+strlen("fill=")); + result->lineThickness=thickness; + + return result; } -void matchFunctionCall(char *call) { +void matchFunctionCall(char *call, void *ret) { printf("Matching %s\n", call); char *funcCall = strdup(call); char *funcName = strsep(&funcCall, "("); printf("Got function %s\n", funcName); if (strcmp(funcName, "rectangle ") == 0) { - char **arg, *argv[5]; + char **arg, *argv[7]; call = call+strlen("rectangle ("); for (arg = argv; (*arg = strsep(&call, ",")) != NULL;) if (**arg != '\0') - if (++arg >= &argv[5]) + if (++arg >= &argv[7]) break; - BVGRectangle(argv); + BVGRectangle *rect = malloc(sizeof(BVGRectangle)); + rect = BVGParseRectangle(argv); + BVGDrawRectangle(rect); } return; } |