| 154 | } |
| 155 | |
| 156 | bool buildShapeFromSvgPath(Shape &shape, const char *pathDef, double endpointSnapRange) { |
| 157 | char nodeType = '\0'; |
| 158 | char prevNodeType = '\0'; |
| 159 | Point2 prevNode(0, 0); |
| 160 | bool nodeTypePreread = false; |
| 161 | while (nodeTypePreread || readNodeType(nodeType, pathDef)) { |
| 162 | nodeTypePreread = false; |
| 163 | Contour &contour = shape.addContour(); |
| 164 | bool contourStart = true; |
| 165 | |
| 166 | Point2 startPoint; |
| 167 | Point2 controlPoint[2]; |
| 168 | Point2 node; |
| 169 | |
| 170 | while (*pathDef) { |
| 171 | switch (nodeType) { |
| 172 | case 'M': case 'm': |
| 173 | if (!contourStart) { |
| 174 | nodeTypePreread = true; |
| 175 | goto NEXT_CONTOUR; |
| 176 | } |
| 177 | REQUIRE(readCoord(node, pathDef)); |
| 178 | if (nodeType == 'm') |
| 179 | node += prevNode; |
| 180 | startPoint = node; |
| 181 | --nodeType; // to 'L' or 'l' |
| 182 | break; |
| 183 | case 'Z': case 'z': |
| 184 | REQUIRE(!contourStart); |
| 185 | goto NEXT_CONTOUR; |
| 186 | case 'L': case 'l': |
| 187 | REQUIRE(readCoord(node, pathDef)); |
| 188 | if (nodeType == 'l') |
| 189 | node += prevNode; |
| 190 | contour.addEdge(EdgeHolder(prevNode, node)); |
| 191 | break; |
| 192 | case 'H': case 'h': |
| 193 | REQUIRE(readDouble(node.x, pathDef)); |
| 194 | if (nodeType == 'h') |
| 195 | node.x += prevNode.x; |
| 196 | contour.addEdge(EdgeHolder(prevNode, node)); |
| 197 | break; |
| 198 | case 'V': case 'v': |
| 199 | REQUIRE(readDouble(node.y, pathDef)); |
| 200 | if (nodeType == 'v') |
| 201 | node.y += prevNode.y; |
| 202 | contour.addEdge(EdgeHolder(prevNode, node)); |
| 203 | break; |
| 204 | case 'Q': case 'q': |
| 205 | REQUIRE(readCoord(controlPoint[0], pathDef)); |
| 206 | REQUIRE(readCoord(node, pathDef)); |
| 207 | if (nodeType == 'q') { |
| 208 | controlPoint[0] += prevNode; |
| 209 | node += prevNode; |
| 210 | } |
| 211 | contour.addEdge(EdgeHolder(prevNode, controlPoint[0], node)); |
| 212 | break; |
| 213 | case 'T': case 't': |
no test coverage detected