about summary refs log tree commit diff stats
path: root/src/local
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2024-09-25 15:21:44 +0200
committerbptato <nincsnevem662@gmail.com>2024-09-25 15:21:44 +0200
commite7c727c7fe399fb1b04af767495ec9d80183bc91 (patch)
tree6ea97381c2cc663ca51f5e0dd130a1ad5d9c88c2 /src/local
parent052697585d5d31691229693a9d4ed03b6dfb2337 (diff)
downloadchawan-e7c727c7fe399fb1b04af767495ec9d80183bc91.tar.gz
term: prevent negative line damage, fix off by one
Diffstat (limited to 'src/local')
-rw-r--r--src/local/pager.nim2
-rw-r--r--src/local/term.nim16
2 files changed, 9 insertions, 9 deletions
diff --git a/src/local/pager.nim b/src/local/pager.nim
index 62ac610c..d61f1dd8 100644
--- a/src/local/pager.nim
+++ b/src/local/pager.nim
@@ -670,7 +670,7 @@ proc initImages(pager: Pager; container: Container) =
       newImages.add(canvasImage)
   pager.term.clearImages(pager.bufHeight)
   pager.term.canvasImages = newImages
-  pager.term.checkImageDamage(pager.bufHeight)
+  pager.term.checkImageDamage(pager.bufWidth, pager.bufHeight)
 
 proc draw*(pager: Pager) =
   var redraw = false
diff --git a/src/local/term.nim b/src/local/term.nim
index d8ab5f53..2e0b1e25 100644
--- a/src/local/term.nim
+++ b/src/local/term.nim
@@ -724,7 +724,7 @@ proc clearImages*(term: Terminal; maxh: int) =
       term.clearImage(image, maxh)
     image.marked = false
 
-proc checkImageDamage*(term: Terminal; maxh: int) =
+proc checkImageDamage*(term: Terminal; maxw, maxh: int) =
   if term.imageMode == imSixel:
     for image in term.canvasImages:
       # check if any line of our image is damaged
@@ -733,14 +733,15 @@ proc checkImageDamage*(term: Terminal; maxh: int) =
       # here we floor, so that a last line with rounding error (which
       # will not fully cover text) is always cleared
       let ey1 = min(image.y + image.height div term.attrs.ppl, maxh)
-      let mx = image.x + (image.dispw - image.offx) div term.attrs.ppc
+      let x = max(image.x, 0)
+      let mx = min(image.x + image.dispw div term.attrs.ppc, maxw)
       for y in max(image.y, 0) ..< ey0:
         let od = term.lineDamage[y]
-        if image.transparent and od > image.x:
+        if image.transparent and od > x:
           image.damaged = true
           if od < mx:
             # damage starts inside this image; move it to its beginning.
-            term.lineDamage[y] = image.x
+            term.lineDamage[y] = x
         elif not image.transparent and od < mx:
           image.damaged = true
           if y >= ey1:
@@ -807,10 +808,9 @@ proc outputSixelImage(term: Terminal; x, y: int; image: CanvasImage;
   let disph = image.disph
   let realw = dispw - offx
   let realh = disph - offy
-  if data.len < 5: # bounds check
+  if data.len < 4: # bounds check
     return
-  let sraLen = int(data.getU32BE(0))
-  let preludeLen = sraLen + 5
+  let preludeLen = int(data.getU32BE(0))
   if preludeLen > data.len:
     return
   var outs = term.cursorGoto(x, y)
@@ -822,7 +822,7 @@ proc outputSixelImage(term: Terminal; x, y: int; image: CanvasImage;
   # set raster attributes
   outs &= "\"1;1;" & $realw & ';' & $realh
   term.write(outs)
-  term.write(data.toOpenArray(4, preludeLen - 1))
+  term.write(data.toOpenArray(5, preludeLen - 1))
   let lookupTableLen = int(data.getU32BE(data.len - 4))
   let L = data.len - lookupTableLen - 4
   # Note: we only crop images when it is possible to do so in near constant