diff options
author | bptato <nincsnevem662@gmail.com> | 2024-09-25 15:21:44 +0200 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2024-09-25 15:21:44 +0200 |
commit | e7c727c7fe399fb1b04af767495ec9d80183bc91 (patch) | |
tree | 6ea97381c2cc663ca51f5e0dd130a1ad5d9c88c2 /src/local | |
parent | 052697585d5d31691229693a9d4ed03b6dfb2337 (diff) | |
download | chawan-e7c727c7fe399fb1b04af767495ec9d80183bc91.tar.gz |
term: prevent negative line damage, fix off by one
Diffstat (limited to 'src/local')
-rw-r--r-- | src/local/pager.nim | 2 | ||||
-rw-r--r-- | src/local/term.nim | 16 |
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 |