@@ -961,14 +961,36 @@ else if (lexState == LexState.EXP_HEAD) {
961961 float rx = PApplet .parseFloat (pathTokens [i + 1 ]);
962962 float ry = PApplet .parseFloat (pathTokens [i + 2 ]);
963963 float angle = PApplet .parseFloat (pathTokens [i + 3 ]);
964- boolean fa = PApplet .parseFloat (pathTokens [i + 4 ]) != 0 ;
965- boolean fs = PApplet .parseFloat (pathTokens [i + 5 ]) != 0 ;
966- float endX = PApplet .parseFloat (pathTokens [i + 6 ]);
967- float endY = PApplet .parseFloat (pathTokens [i + 7 ]);
964+ // In compact arc notation, flags and coordinates may be concatenated.
965+ // e.g. "013" is parsed as large-arc=0, sweep=1, x=3
966+ String token4 = pathTokens [i + 4 ];
967+ boolean fa ;
968+ boolean fs ;
969+ float endX ;
970+ float endY ;
971+ int tokenOffset = 0 ;
972+ if (isCompactArcNotation (token4 )) {
973+ fa = token4 .charAt (0 ) == '1' ;
974+ fs = token4 .charAt (1 ) == '1' ;
975+ if (token4 .length () > 2 ) {
976+ endX = PApplet .parseFloat (token4 .substring (2 ));
977+ endY = PApplet .parseFloat (pathTokens [i + 5 ]);
978+ tokenOffset = -2 ;
979+ } else {
980+ endX = PApplet .parseFloat (pathTokens [i + 5 ]);
981+ endY = PApplet .parseFloat (pathTokens [i + 6 ]);
982+ tokenOffset = -1 ;
983+ }
984+ } else {
985+ fa = PApplet .parseFloat (token4 ) != 0 ;
986+ fs = PApplet .parseFloat (pathTokens [i + 5 ]) != 0 ;
987+ endX = PApplet .parseFloat (pathTokens [i + 6 ]);
988+ endY = PApplet .parseFloat (pathTokens [i + 7 ]);
989+ }
968990 parsePathArcto (cx , cy , rx , ry , angle , fa , fs , endX , endY );
969991 cx = endX ;
970992 cy = endY ;
971- i += 8 ;
993+ i += 8 + tokenOffset ;
972994 prevCurve = true ;
973995 }
974996 break ;
@@ -978,14 +1000,34 @@ else if (lexState == LexState.EXP_HEAD) {
9781000 float rx = PApplet .parseFloat (pathTokens [i + 1 ]);
9791001 float ry = PApplet .parseFloat (pathTokens [i + 2 ]);
9801002 float angle = PApplet .parseFloat (pathTokens [i + 3 ]);
981- boolean fa = PApplet .parseFloat (pathTokens [i + 4 ]) != 0 ;
982- boolean fs = PApplet .parseFloat (pathTokens [i + 5 ]) != 0 ;
983- float endX = cx + PApplet .parseFloat (pathTokens [i + 6 ]);
984- float endY = cy + PApplet .parseFloat (pathTokens [i + 7 ]);
1003+ String token4 = pathTokens [i + 4 ];
1004+ boolean fa ;
1005+ boolean fs ;
1006+ float endX ;
1007+ float endY ;
1008+ int tokenOffset = 0 ;
1009+ if (isCompactArcNotation (token4 )) {
1010+ fa = token4 .charAt (0 ) == '1' ;
1011+ fs = token4 .charAt (1 ) == '1' ;
1012+ if (token4 .length () > 2 ) {
1013+ endX = cx + PApplet .parseFloat (token4 .substring (2 ));
1014+ endY = cy + PApplet .parseFloat (pathTokens [i + 5 ]);
1015+ tokenOffset = -2 ;
1016+ } else {
1017+ endX = cx + PApplet .parseFloat (pathTokens [i + 5 ]);
1018+ endY = cy + PApplet .parseFloat (pathTokens [i + 6 ]);
1019+ tokenOffset = -1 ;
1020+ }
1021+ } else {
1022+ fa = PApplet .parseFloat (token4 ) != 0 ;
1023+ fs = PApplet .parseFloat (pathTokens [i + 5 ]) != 0 ;
1024+ endX = cx + PApplet .parseFloat (pathTokens [i + 6 ]);
1025+ endY = cy + PApplet .parseFloat (pathTokens [i + 7 ]);
1026+ }
9851027 parsePathArcto (cx , cy , rx , ry , angle , fa , fs , endX , endY );
9861028 cx = endX ;
9871029 cy = endY ;
988- i += 8 ;
1030+ i += 8 + tokenOffset ;
9891031 prevCurve = true ;
9901032 }
9911033 break ;
@@ -1054,6 +1096,29 @@ private void parsePathMoveto(float px, float py) {
10541096 }
10551097
10561098
1099+ /**
1100+ * Checks if a token represents compact arc notation where flags and coordinates
1101+ * are concatenated (e.g., "013" for large-arc=0, sweep=1, x=3).
1102+ *
1103+ * @param token the token to check
1104+ * @return true if the token is in compact arc notation format
1105+ */
1106+ private boolean isCompactArcNotation (String token ) {
1107+ if (token == null ) {
1108+ return false ;
1109+ }
1110+ return token .length () > 1 &&
1111+ (token .charAt (0 ) == '0' || token .charAt (0 ) == '1' ) &&
1112+ (token .charAt (1 ) == '0' || token .charAt (1 ) == '1' ) &&
1113+ (token .length () == 2 ||
1114+ (token .length () > 2 && (
1115+ Character .isDigit (token .charAt (2 )) ||
1116+ token .charAt (2 ) == '+' ||
1117+ token .charAt (2 ) == '-' ||
1118+ token .charAt (2 ) == '.' )));
1119+ }
1120+
1121+
10571122 private void parsePathLineto (float px , float py ) {
10581123 parsePathCode (VERTEX );
10591124 parsePathVertex (px , py );
0 commit comments