case 'M':
case 'm':
case 'L':
- case 'l': {
+ case 'l':
+ case 'T':
+ case 't': {
count = 2;
break;
}
case 'S':
case 's':
case 'Q':
- case 'q':
- case 'T':
- case 't': {
+ case 'q': {
count = 4;
break;
}
}
-static void _processCommand(vector<PathCommand>* cmds, vector<Point>* pts, char cmd, float* arr, int count, Point* cur, Point* curCtl)
+static void _processCommand(vector<PathCommand>* cmds, vector<Point>* pts, char cmd, float* arr, int count, Point* cur, Point* curCtl, bool *isQuadratic)
{
int i;
switch (cmd) {
pts->push_back(p[2]);
*curCtl = p[1];
*cur = p[2];
+ *isQuadratic = false;
break;
}
case 's':
case 'S': {
Point p[3], ctrl;
- if ((cmds->size() > 1) && (cmds->at(cmds->size() - 1) == PathCommand::CubicTo)) {
+ if ((cmds->size() > 1) && (cmds->at(cmds->size() - 1) == PathCommand::CubicTo) &&
+ !(*isQuadratic)) {
ctrl.x = 2 * cur->x - curCtl->x;
ctrl.y = 2 * cur->y - curCtl->y;
} else {
pts->push_back(p[2]);
*curCtl = p[1];
*cur = p[2];
+ *isQuadratic = false;
break;
}
case 'q':
pts->push_back(p[0]);
pts->push_back(p[1]);
pts->push_back(p[2]);
- *curCtl = p[1];
+ *curCtl = {arr[0], arr[1]};
*cur = p[2];
+ *isQuadratic = true;
break;
}
case 't':
case 'T': {
- Point p = {arr[0], arr[1]};
- cmds->push_back(PathCommand::MoveTo);
- pts->push_back(p);
- *cur = {arr[0] ,arr[1]};
+ Point p[3], ctrl;
+ if ((cmds->size() > 1) && (cmds->at(cmds->size() - 1) == PathCommand::CubicTo) &&
+ *isQuadratic) {
+ ctrl.x = 2 * cur->x - curCtl->x;
+ ctrl.y = 2 * cur->y - curCtl->y;
+ } else {
+ ctrl = *cur;
+ }
+ float ctrl_x0 = (cur->x + 2 * ctrl.x) * (1.0 / 3.0);
+ float ctrl_y0 = (cur->y + 2 * ctrl.y) * (1.0 / 3.0);
+ float ctrl_x1 = (arr[0] + 2 * ctrl.x) * (1.0 / 3.0);
+ float ctrl_y1 = (arr[1] + 2 * ctrl.y) * (1.0 / 3.0);
+ cmds->push_back(PathCommand::CubicTo);
+ p[0] = {ctrl_x0, ctrl_y0};
+ p[1] = {ctrl_x1, ctrl_y1};
+ p[2] = {arr[0], arr[1]};
+ pts->push_back(p[0]);
+ pts->push_back(p[1]);
+ pts->push_back(p[2]);
+ *curCtl = {ctrl.x, ctrl.y};
+ *cur = p[2];
+ *isQuadratic = true;
break;
}
case 'h':
Point cur = { 0, 0 };
Point curCtl = { 0, 0 };
char cmd = 0;
+ bool isQuadratic = false;
char* path = (char*)svgPath;
char* curLocale;
while ((path[0] != '\0')) {
path = _nextCommand(path, &cmd, numberArray, &numberCount);
if (!path) break;
- _processCommand(&cmds, &pts, cmd, numberArray, numberCount, &cur, &curCtl);
+ _processCommand(&cmds, &pts, cmd, numberArray, numberCount, &cur, &curCtl, &isQuadratic);
}
setlocale(LC_NUMERIC, curLocale);