@@ -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+ }
0 commit comments