@@ -113,6 +113,8 @@ export const workerFn = (parentPort: NodeWorkerThreadsType["parentPort"] | Brows
113113 _graOutputGraphicsIndex : - 1 ,
114114 _graOriginX : 0 ,
115115 _graOriginY : 0 ,
116+ _graLastEmittedX : 0 ,
117+ _graLastEmittedY : 0 ,
116118
117119 _isTerminal : false , // output for terminal
118120 _keyBuffer : [ ] as string [ ] , // buffered pressed keys
@@ -327,6 +329,8 @@ export const workerFn = (parentPort: NodeWorkerThreadsType["parentPort"] | Brows
327329 }
328330 vm . _graGraphicsX = 0 ;
329331 vm . _graGraphicsY = 0 ;
332+ vm . _graLastEmittedX = 0 ;
333+ vm . _graLastEmittedY = 0 ;
330334 vm . _graOutputGraphicsIndex = - 1 ;
331335 vm . _output = "" ;
332336 vm . _paperSpanPos = - 1 ;
@@ -454,7 +458,9 @@ export const workerFn = (parentPort: NodeWorkerThreadsType["parentPort"] | Brows
454458 y = Math . round ( y ) ;
455459
456460 if ( ! vm . _graGraphicsPathBuffer . length && type !== "M" && type !== "P" ) { // path must start with an absolute move
457- vm . _graGraphicsPathBuffer . push ( `M${ vm . _graGraphicsX + vm . _graOriginX } ${ 399 - vm . _graGraphicsY - vm . _graOriginY } ` ) ;
461+ vm . _graLastEmittedX = vm . _graGraphicsX + vm . _graOriginX ;
462+ vm . _graLastEmittedY = 399 - vm . _graGraphicsY - vm . _graOriginY ;
463+ vm . _graGraphicsPathBuffer . push ( `M${ vm . _graLastEmittedX } ${ vm . _graLastEmittedY } ` ) ;
458464 }
459465
460466 const isAbsolute = type === type . toUpperCase ( ) ;
@@ -469,11 +475,27 @@ export const workerFn = (parentPort: NodeWorkerThreadsType["parentPort"] | Brows
469475 y = - y ;
470476 }
471477
478+ // Skip MOVE if we're already at this position (works regardless of preceding command type)
479+ if ( type === "M" || type === "m" ) {
480+ let compareX = x ;
481+ let compareY = y ;
482+ if ( ! isAbsolute ) {
483+ // Convert relative to absolute screen coordinates
484+ compareX = vm . _graGraphicsX + vm . _graOriginX ;
485+ compareY = 399 - vm . _graGraphicsY - vm . _graOriginY ;
486+ }
487+ if ( vm . _graLastEmittedX === compareX && vm . _graLastEmittedY === compareY ) {
488+ return ;
489+ }
490+ }
491+
472492 const svgPathCmd = ( type === "P" || type === "p" )
473493 ? `${ isAbsolute ? "M" : "m" } ${ x } ${ y } h1v1h-1v-1`
474494 : `${ type } ${ x } ${ y } ` ;
475495
476496 vm . _graGraphicsPathBuffer . push ( svgPathCmd ) ;
497+ vm . _graLastEmittedX = x ;
498+ vm . _graLastEmittedY = y ;
477499 } ,
478500
479501 graFlushGraphicsPath : ( ) : void => {
@@ -511,8 +533,10 @@ export const workerFn = (parentPort: NodeWorkerThreadsType["parentPort"] | Brows
511533 text = vm . escapeText ( text ) ;
512534 const yOffset = 16 ;
513535 const colorStyleStr = vm . _graCurrGraphicsPen >= 0 ? `; color: ${ vm . graGetRgbColorStringForPen ( vm . _graCurrGraphicsPen ) } ` : "" ;
514- vm . graAddGraphicsElement ( `<text x="${ vm . _graGraphicsX + vm . _graOriginX } " y="${ 399 - vm . _graGraphicsY - vm . _graOriginY + yOffset } " style="white-space: pre${ colorStyleStr } ">${ text } </text>` ) ;
536+ vm . _graLastEmittedY = 399 - vm . _graGraphicsY - vm . _graOriginY ;
537+ vm . graAddGraphicsElement ( `<text x="${ vm . _graGraphicsX + vm . _graOriginX } " y="${ vm . _graLastEmittedY + yOffset } " style="white-space: pre${ colorStyleStr } ">${ text } </text>` ) ;
515538 vm . _graGraphicsX += text . length * 8 ; // assuming 8px width per character
539+ vm . _graLastEmittedX = vm . _graGraphicsX + vm . _graOriginX ;
516540 } ,
517541
518542 graSetOutputGraphicsIndex : ( ) : void => {
0 commit comments