Ensure row map applies negative deltas only after the given start row

This commit is contained in:
Nathan Sobo
2013-05-09 12:18:30 -06:00
parent 9849c62d80
commit d7914d2c54
2 changed files with 67 additions and 10 deletions

View File

@@ -64,21 +64,46 @@ class RowMap
@regions[overlapStartIndex..overlapEndIndex] = newRegions
applyBufferDelta: (startBufferRow, delta) ->
{ region } = @traverseToBufferRow(startBufferRow)
region?.bufferRows += delta
return if delta is 0
{ index, bufferRow } = @traverseToBufferRow(startBufferRow)
if delta > 0 and index < @regions.length
{ bufferRows, screenRows } = @regions[index]
bufferRows += delta
@regions[index] = { bufferRows, screenRows }
else
delta = -delta
while delta > 0 and index < @regions.length
{ bufferRows, screenRows } = @regions[index]
regionStartBufferRow = bufferRow
regionEndBufferRow = bufferRow + bufferRows
maxDelta = regionEndBufferRow - Math.max(regionStartBufferRow, startBufferRow)
regionDelta = Math.min(delta, maxDelta)
bufferRows -= regionDelta
@regions[index] = { bufferRows, screenRows }
delta -= regionDelta
bufferRow += bufferRows
index++
applyScreenDelta: (startScreenRow, delta) ->
{ index } = @traverseToScreenRow(startScreenRow)
while delta != 0 and index < @regions.length
return if delta is 0
{ index, screenRow } = @traverseToScreenRow(startScreenRow)
if delta > 0 and index < @regions.length
{ bufferRows, screenRows } = @regions[index]
screenRows += delta
if screenRows < 0
delta = screenRows
screenRows = 0
else
delta = 0
@regions[index] = { bufferRows, screenRows }
index++
else
delta = -delta
while delta > 0 and index < @regions.length
{ bufferRows, screenRows } = @regions[index]
regionStartScreenRow = screenRow
regionEndScreenRow = screenRow + screenRows
maxDelta = regionEndScreenRow - Math.max(regionStartScreenRow, startScreenRow)
regionDelta = Math.min(delta, maxDelta)
screenRows -= regionDelta
@regions[index] = { bufferRows, screenRows }
delta -= regionDelta
screenRow += screenRows
index++
traverseToBufferRow: (targetBufferRow) ->
bufferRow = 0