From 91d58f9ae9e9d9adc2e19a0b56d2b9757f6696d6 Mon Sep 17 00:00:00 2001 From: axtloss Date: Wed, 28 Feb 2024 21:34:09 +0100 Subject: BVG: add scaling support --- fbwarn/src/parseBVG.c | 99 ++++++++++++++++++++++++--------------------------- fbwarn/src/parseBVG.h | 2 +- fbwarn/src/warn.c | 12 +++++-- 3 files changed, 58 insertions(+), 55 deletions(-) diff --git a/fbwarn/src/parseBVG.c b/fbwarn/src/parseBVG.c index 83dda73..a7f6798 100644 --- a/fbwarn/src/parseBVG.c +++ b/fbwarn/src/parseBVG.c @@ -7,6 +7,8 @@ #include "raylib.h" #include "extString.h" +float scale; + void BVGDrawRectangle(BVGRectangle *rectangle) { if (rectangle->fill) { DrawRectangleRec(rectangle->rayrectangle, rectangle->color); @@ -178,31 +180,28 @@ BVGRectangle *BVGParseRectangle(char *argv[7]) { size_t argN = 7; char *args[argN]; char *knownArgs[7] = {"x", "y", "width", "height", "color", "fill", "thickness"}; - orderArgs(args, argv, argN, knownArgs); - printf("119 Parsing...%s \n", args[0]); int x, y, width, height, r, g, b, a; float thickness = 1.0; bool fill = true; + Color *clr; + + orderArgs(args, argv, argN, knownArgs); sscanf(args[0], "%d", &x); sscanf(args[1], "%d", &y); sscanf(args[2], "%d", &width); sscanf(args[3], "%d", &height); args[4] = args[4]+2; args[4][strlen(args[4])-1] = '\0'; - Color *clr = parseColorFromHex(args[4]); + clr = parseColorFromHex(args[4]); sscanf(args[6], "%fd", &thickness); fill = parseBoolValue(args[5]); - 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); - printf("Fill: %d, Thickness: %f\n", fill, thickness); - - rectangle->x=x; rectangle->y=y; - rectangle->height=height; rectangle->width=width; + + rectangle->x=x*scale; rectangle->y=y*scale; + rectangle->height=height*scale; rectangle->width=width*scale; result->rayrectangle=*rectangle; result->color=*clr; result->fill=fill; - result->lineThickness=thickness; + result->lineThickness=thickness*scale; free(clr); free(rectangle); @@ -219,12 +218,12 @@ BVGRoundedRectangle *BVGParseRoundedRectangle(char *argv[9]) { size_t argN = 9; char *args[argN]; char *knownArgs[9] = {"x", "y", "width", "height", "color", "fill", "thickness", "roundness", "segments"}; + float roundness; + int segments; + orderArgs(args, argv, argN, knownArgs); bvgrectangle = BVGParseRectangle(argv); result->rectangle = *bvgrectangle; - - float roundness; - int segments; sscanf(args[7], "%fd", &roundness); sscanf(args[8], "%d", &segments); @@ -240,23 +239,23 @@ BVGCircle *BVGParseCircle(char *argv[4]) { size_t argN = 4; char *args[argN]; char *knownArgs[4] = {"x", "y", "radius", "color"}; - orderArgs(args, argv, argN, knownArgs); int x, y; float radius; Color *clr; + + orderArgs(args, argv, argN, knownArgs); sscanf(args[0], "%d", &x); sscanf(args[1], "%d", &y); sscanf(args[2], "%fd", &radius); args[3] = args[3]+2; args[3][strlen(args[3])-1] = '\0'; clr = parseColorFromHex(args[3]); - printf("X: %d, Y: %d\n", x, y); - printf("radius: %f, color: %s\n", radius, args[3]); + result->drawSector=false; - result->centerX=x; - result->centerY=y; + result->centerX=x*scale; + result->centerY=y*scale; + result->radius=radius*scale; result->color=*clr; - result->radius=radius; free(clr); return result; @@ -267,10 +266,11 @@ BVGCircle *BVGParseCircleSegment(char *argv[7]) { size_t argN = 7; char *args[argN]; char *knownArgs[7] = {"x", "y", "radius", "color", "startangle", "endangle", "segments"}; - orderArgs(args, argv, argN, knownArgs); int x, y, segments; float radius, startAngle, endAngle; Color *clr; + + orderArgs(args, argv, argN, knownArgs); sscanf(args[0], "%d", &x); sscanf(args[1], "%d", &y); sscanf(args[2], "%fd", &radius); @@ -280,16 +280,13 @@ BVGCircle *BVGParseCircleSegment(char *argv[7]) { args[3] = args[3]+2; args[3][strlen(args[3])-1] = '\0'; clr = parseColorFromHex(args[3]); - printf("X: %d, Y: %d\n", x, y); - printf("radius: %f, color: %s\n", radius, args[3]); + result->drawSector=true; - result->centerX=x; - result->centerY=y; + result->centerX=x; result->centerY=y*scale; result->color=*clr; - result->radius=radius; + result->radius=radius*scale; result->segments=segments; - result->startAngle=startAngle; - result->endAngle=endAngle; + result->startAngle=startAngle; result->endAngle=endAngle; free(clr); return result; @@ -300,10 +297,11 @@ BVGRing *BVGParseRing(char *argv[8]) { size_t argN = 8; char *args[argN]; char *knownArgs[8] = {"x", "y", "innerradius", "outerradius", "startangle", "endangle", "segments", "color"}; - orderArgs(args, argv, argN, knownArgs); int x, y, segments; float innerRadius, outerRadius, startAngle, endAngle; Color *clr; + + orderArgs(args, argv, argN, knownArgs); sscanf(args[0], "%d", &x); sscanf(args[1], "%d", &y); sscanf(args[2], "%f", &innerRadius); @@ -314,9 +312,8 @@ BVGRing *BVGParseRing(char *argv[8]) { args[7] = args[7]+2; args[7][strlen(args[7])-1] = '\0'; clr = parseColorFromHex(args[7]); - printf("X: %d, Y: %d\n", x, y); - printf("startAng: %f, endAng: %f\n", startAngle, endAngle); - result->centerX=x; result->centerY=y; + + result->centerX=x*scale; result->centerY=y*scale; result->inRadius=innerRadius; result->outRadius=outerRadius; result->startAngle=startAngle; result->endAngle=endAngle; result->segmets=segments; @@ -344,12 +341,10 @@ BVGEllipse *BVGParseEllipse(char *argv[6]) { args[5] = args[5]+2; args[5][strlen(args[5])-1] = '\0'; clr = parseColorFromHex(args[5]); - printf("X: %d, Y: %d", x, y); - printf("hRad: %f, vRad: %f", horizontalRadius, verticalRadius); - printf("fill: %d, Color: %s", fill, args[5]); + result->centerX=x; result->centerY=y; - result->horizontalRadius=horizontalRadius; - result->verticalRadius=verticalRadius; + result->horizontalRadius=horizontalRadius*scale; + result->verticalRadius=verticalRadius*scale; result->fill=fill; result->color=*clr; @@ -362,11 +357,12 @@ BVGTriangle *BVGParseTriangle(char *argv[8]) { size_t argN = 8; char *args[argN]; char *knownArgs[8] = {"x1", "y1", "x2", "y2", "x3", "y3", "fill", "color"}; - orderArgs(args, argv, argN, knownArgs); int x1, x2, x3; int y1, y2, y3; bool fill; Color *clr; + + orderArgs(args, argv, argN, knownArgs); sscanf(args[0], "%d", &x1); sscanf(args[1], "%d", &y1); sscanf(args[2], "%d", &x2); @@ -377,9 +373,10 @@ BVGTriangle *BVGParseTriangle(char *argv[8]) { args[7] = args[7]+2; args[7][strlen(args[7])-1] = '\0'; clr = parseColorFromHex(args[7]); - result->corner1 = (Vector2){x1, y1}; - result->corner2 = (Vector2){x2, y2}; - result->corner3 = (Vector2){x3, y3}; + + result->corner1 = (Vector2){x1*scale, y1*scale}; + result->corner2 = (Vector2){x2*scale, y2*scale}; + result->corner3 = (Vector2){x3*scale, y3*scale}; result->fill = fill; result->color = *clr; @@ -392,23 +389,22 @@ BVGText *BVGParseText(char *argv[5]) { size_t argN = 5; char *args[argN]; char *knownArgs[5] = {"text", "x", "y", "size", "color"}; - orderArgs(args, argv, argN, knownArgs); - args[0] = args[0]+1; - args[0][strlen(args[0])-1] = '\0'; char *text = args[0]; int x, y, size; Color *clr; + + orderArgs(args, argv, argN, knownArgs); + args[0] = args[0]+1; + args[0][strlen(args[0])-1] = '\0'; sscanf(args[1], "%d", &x); sscanf(args[2], "%d", &y); sscanf(args[3], "%d", &size); args[4] = args[4]+2; args[4][strlen(args[4])-1] = '\0'; - printf("Text: %s\n", text); - printf("X: %d, Y: %d\n", x, y); - printf("Size: %d, Color: %s\n", size, args[4]); clr = parseColorFromHex(args[4]); - result->text=text; result->x=x; - result->y=y; result->fontSize=size; + + result->text=text; result->fontSize=size; + result->x=x*scale; result->y=y*scale; result->color=*clr; free(clr); @@ -418,13 +414,12 @@ BVGText *BVGParseText(char *argv[5]) { /* Takes a BVG function call and calls the according C function */ -void matchFunctionCall(char *call) { - printf("Matching %s\n", call); +void matchFunctionCall(char *call, float locScale) { + scale = locScale; char *funcCall = strdup(call); char *funcName = strsep(&funcCall, "("); char *function = trim(strlwr(funcName)); free(funcName); - printf("Got function %s\n", function); call[strlen(call)-1]='\0'; if (strcmp(function, "rectangle") == 0) { char *argv[7]; diff --git a/fbwarn/src/parseBVG.h b/fbwarn/src/parseBVG.h index bf833cf..1a90c78 100644 --- a/fbwarn/src/parseBVG.h +++ b/fbwarn/src/parseBVG.h @@ -6,7 +6,7 @@ FILE *readFile(char *path); char *multiToSingle(char *s); -void matchFunctionCall(char *call); +void matchFunctionCall(char *call, float locScale); void collectArgs(char *res[], char *call, int n); void orderArgs(char *res[], char *argv[], int n, char *knownArgs[]); Color *parseColorFromHex(char *hex); diff --git a/fbwarn/src/warn.c b/fbwarn/src/warn.c index 195977c..70e4baf 100644 --- a/fbwarn/src/warn.c +++ b/fbwarn/src/warn.c @@ -61,6 +61,14 @@ int getFuncs(char *file, char ***ret) { int main(int argc, char **argv) { + if (argc < 3) { + printf("USAGE: %s \n", argv[0]); + exit(1); + } + + float scale; + sscanf(argv[2], "%f", &scale); + char **funcs; int funcCount = getFuncs(argv[1], &funcs); @@ -72,7 +80,7 @@ int main(int argc, char **argv) { collectArgs(args, callTrim, 2); BVGIMG *imgsize = BVGParseIMG(args); - InitWindow (imgsize->width, imgsize->height, ":3"); + InitWindow (imgsize->width*scale, imgsize->height*scale, ":3"); free(imgsize); free(call-strlen("IMG (")); @@ -91,7 +99,7 @@ int main(int argc, char **argv) { // i = 1 since the first item is always IMG for (int i = 1; i