MCPcopy Create free account
hub / github.com/MyGUI/mygui / buildShapeFromSvgPath

Function buildShapeFromSvgPath

MyGUIEngine/src/msdfgen/ext/import-svg.cpp:156–284  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

154}
155
156bool 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':

Callers 1

loadSvgShapeFunction · 0.85

Calls 12

readNodeTypeFunction · 0.85
readCoordFunction · 0.85
EdgeHolderClass · 0.85
readDoubleFunction · 0.85
readBoolFunction · 0.85
addArcApproximateFunction · 0.85
addContourMethod · 0.80
moveEndPointMethod · 0.80
addEdgeMethod · 0.45
emptyMethod · 0.45
lengthMethod · 0.45
pointMethod · 0.45

Tested by

no test coverage detected