Skip to content

Commit 40b57f3

Browse files
committed
Fixed shortand curve distortion due to converted prev curve. Resolves #415
1 parent c19511e commit 40b57f3

File tree

2 files changed

+35
-46
lines changed

2 files changed

+35
-46
lines changed

plugins/convertPathData.js

Lines changed: 30 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -256,10 +256,11 @@ function filters(path, params) {
256256
pathBase = [0, 0],
257257
prev = {};
258258

259-
path = path.filter(function(item, index) {
259+
path = path.filter(function(item, index, path) {
260260

261261
var instruction = item.instruction,
262-
data = item.data;
262+
data = item.data,
263+
next = path[index + 1];
263264

264265
if (data) {
265266

@@ -314,76 +315,46 @@ function filters(path, params) {
314315
// convert straight curves into lines segments
315316
if (params.straightCurves) {
316317

317-
// c
318318
if (
319319
instruction === 'c' &&
320320
isCurveStraightLine(
321321
[ 0, data[0], data[2], data[4] ],
322322
[ 0, data[1], data[3], data[5] ]
323-
)
324-
) {
325-
instruction = 'l';
326-
data = data.slice(-2);
327-
}
328-
329-
// s
330-
else if (
323+
) ||
331324
instruction === 's' &&
332325
isCurveStraightLine(
333326
[ 0, sdata[0], sdata[2], sdata[4] ],
334327
[ 0, sdata[1], sdata[3], sdata[5] ]
335328
)
336329
) {
330+
if (next && next.instruction == 's')
331+
makeLonghand(next, data); // fix up next curve
337332
instruction = 'l';
338333
data = data.slice(-2);
339334
}
340335

341-
// q
342336
else if (
343337
instruction === 'q' &&
344338
isCurveStraightLine(
345339
[ 0, data[0], data[2] ],
346340
[ 0, data[1], data[3] ]
347341
)
348342
) {
349-
// save the original one for the future potential q + t conversion
350-
item.original = {
351-
instruction: instruction,
352-
data: data
353-
};
354-
343+
if (next && next.instruction == 't')
344+
makeLonghand(next, data); // fix up next curve
355345
instruction = 'l';
356346
data = data.slice(-2);
357347
}
358348

359-
else if (instruction === 't') {
360-
361-
// q (original) + t
362-
if (
363-
prev.original &&
364-
prev.original.instruction === 'q'
365-
) {
366-
if (isCurveStraightLine(
367-
[ prev.original.data[0], prev.original.data[2], data[0] ],
368-
[ prev.original.data[1], prev.original.data[3], data[1] ]
369-
)) {
370-
instruction = 'l';
371-
data = data.slice(-2);
372-
} else {
373-
prev.instruction = 'q';
374-
prev.data = prev.original.data;
375-
}
376-
}
377-
378-
// [^qt] + t
379-
else if ('qt'.indexOf(prev.instruction) < 0) {
380-
instruction = 'l';
381-
data = data.slice(-2);
382-
}
383-
349+
else if (
350+
instruction === 't' &&
351+
prev.instruction !== 'q' &&
352+
prev.instruction !== 't'
353+
) {
354+
instruction = 'l';
355+
data = data.slice(-2);
384356
}
385357

386-
// a
387358
else if (
388359
instruction === 'a' &&
389360
(data[0] === 0 || data[1] === 0)
@@ -426,7 +397,6 @@ function filters(path, params) {
426397
prev.data[1] += data[1];
427398
}
428399
prev.coords = item.coords;
429-
if (prev.original) prev.original = null;
430400
path[index] = prev;
431401
return false;
432402
}
@@ -676,3 +646,18 @@ function isCurveStraightLine(xs, ys) {
676646
return true;
677647

678648
}
649+
650+
/**
651+
* Converts next curve from shorthand to full form using the current curve data.
652+
*
653+
* @param {Object} item curve to convert
654+
* @param {Array} data current curve data
655+
*/
656+
657+
function makeLonghand(item, data) {
658+
switch (item.instruction) {
659+
case 's': item.instruction = 'c'; break;
660+
case 't': item.instruction = 'q'; break;
661+
}
662+
item.data.unshift(data[data.length - 2] - data[data.length - 4], data[data.length - 1] - data[data.length - 3]);
663+
}

test/plugins/convertPathData.08.svg

Lines changed: 5 additions & 1 deletion
Loading

0 commit comments

Comments
 (0)