dankamongmen / notcurses

blingful character graphics/TUI library. definitely not curses.
https://nick-black.com/dankwiki/index.php/Notcurses
Other
3.59k stars 112 forks source link

sixel deepclean isn't entirely accurate #1580

Closed dankamongmen closed 3 years ago

dankamongmen commented 3 years ago

The Sixel deepclean cell wiping process works more or less, but I realized tonight that it has some inaccuracy. Look at the bottom of Natasha's segway since fixing #1568:

2021-04-22-014751_994x1415_scrot

there's definitely some shittiness there. I think it's actually best described as we're properly scrubbing out the wiped regions, but unwiped regions on the same rows are getting damaged. things look fine in kitty.

dankamongmen commented 3 years ago

and what's going on here? 2021-04-22-021301_884x556_scrot

dankamongmen commented 3 years ago

I've got a unit test for this now which is clearly showing the behavior. I think resolving this might just solve a few things. Should have it done tomorrow or this weekend at the latest.

dankamongmen commented 3 years ago

I hacked up a quick sixel-to-RGBA converter, and indeed, it looks like we have a persistent off-by-1. here's a diff of the end of undamaged vs damaged natasha-blur.png:

-@ BMAP[480][153] = 0
-E BMAP[481][154] = 0
-E BMAP[482][154] = 0
-G BMAP[483][155] = 0
-O BMAP[484][156] = 0
-_ BMAP[485][266] = 0
-O BMAP[484][267] = 0
-G BMAP[483][268] = 0
-C BMAP[482][269] = 0
+E BMAP[481][153] = 0
+E BMAP[482][153] = 0
+G BMAP[483][154] = 0
+O BMAP[484][155] = 0
+_ BMAP[485][265] = 0
+O BMAP[484][266] = 0
+G BMAP[483][267] = 0
+C BMAP[482][268] = 0
dankamongmen commented 3 years ago

when we're writing that second output, we think we're at 480/265 when we write the O, not 480/266:

writing 480:0..156 (?)                                                          
writing 480:157..157 (G)                                                        
writing 480:158..158 (O)                                                        
writing 480:159..159 (O)                                                        
writing 480:160..215 (?)                                                        
writing 480:216..216 (A)                                                        
writing 480:217..259 (?)                                                        
writing 480:260..260 (C)                                                        
writing 480:261..264 (?)                                                        
writing 480:265..265 (O)                                                        
writing 480:266..266 (G)                                                        
writing 480:267..267 (C)                                                        
writing 480:268..268 (A)                                                        
writing 480:269..269 (@)   
dankamongmen commented 3 years ago

here's a collection of differences:

@@ -143847,127 +143847,127 @@
 rgba[1df][92] (1112e): 0
 rgba[1df][93] (1130d): 0
 rgba[1df][94] (114ec): 0
-rgba[1df][95] (116cb): 30333400
+rgba[1df][95] (116cb): 0
 rgba[1df][96] (118aa): 0
 rgba[1df][97] (11a89): 0
-rgba[1df][98] (11c68): 0
-rgba[1df][99] (11e47): 0
-rgba[1df][9a] (12026): 90a0a00
-rgba[1df][9b] (12205): 5070700
-rgba[1df][9c] (123e4): 3040500
-rgba[1df][9d] (125c3): 0
-rgba[1df][9e] (127a2): 0
-rgba[1df][9f] (12981): 4060700
+rgba[1df][98] (11c68): 90a0a00
+rgba[1df][99] (11e47): 5070700
+rgba[1df][9a] (12026): 3040500
+rgba[1df][9b] (12205): 0
+rgba[1df][9c] (123e4): 0
+rgba[1df][9d] (125c3): 4060700
+rgba[1df][9e] (127a2): 3040500
+rgba[1df][9f] (12981): 3040500
 rgba[1df][a0] (12b60): 3040500
-rgba[1df][a1] (12d3f): 3040500
-rgba[1df][a2] (12f1e): 3040500
-rgba[1df][a3] (130fd): 4050600
-rgba[1df][a4] (132dc): 4060700
-rgba[1df][a5] (134bb): 5070700
-rgba[1df][a6] (1369a): 5070700
-rgba[1df][a7] (13879): 4060700
-rgba[1df][a8] (13a58): 4060700
-rgba[1df][a9] (13c37): 6080900
-rgba[1df][aa] (13e16): 0
-rgba[1df][ab] (13ff5): 5070700
+rgba[1df][a1] (12d3f): 0
+rgba[1df][a2] (12f1e): 4060700
+rgba[1df][a3] (130fd): 5070700
+rgba[1df][a4] (132dc): 5070700
+rgba[1df][a5] (134bb): 4060700
+rgba[1df][a6] (1369a): 4060700
+rgba[1df][a7] (13879): 0
+rgba[1df][a8] (13a58): 6080900
+rgba[1df][a9] (13c37): 5070700
+rgba[1df][aa] (13e16): 3040500
+rgba[1df][ab] (13ff5): 3040500
 rgba[1df][ac] (141d4): 3040500
 rgba[1df][ad] (143b3): 3040500
 rgba[1df][ae] (14592): 3040500
-rgba[1df][af] (14771): 3040500
+rgba[1df][af] (14771): 0
 rgba[1df][b0] (14950): 3040500
-rgba[1df][b1] (14b2f): 0
-rgba[1df][b2] (14d0e): 3040500
-rgba[1df][b3] (14eed): 5070700
+rgba[1df][b1] (14b2f): 5070700
+rgba[1df][b2] (14d0e): 0
+rgba[1df][b3] (14eed): 6080900
 rgba[1df][b4] (150cc): 6080900
-rgba[1df][b5] (152ab): 6080900
+rgba[1df][b5] (152ab): 5070700
 rgba[1df][b6] (1548a): 0
-rgba[1df][b7] (15669): 5070700
-rgba[1df][b8] (15848): 4050600
+rgba[1df][b7] (15669): 3040500
+rgba[1df][b8] (15848): 3040500
 rgba[1df][b9] (15a27): 3040500
 rgba[1df][ba] (15c06): 3040500
 rgba[1df][bb] (15de5): 3040500
-rgba[1df][bc] (15fc4): 3040500
-rgba[1df][bd] (161a3): 3040500
-rgba[1df][be] (16382): 4060700
+rgba[1df][bc] (15fc4): 4060700
+rgba[1df][bd] (161a3): 5070700
+rgba[1df][be] (16382): 0
 rgba[1df][bf] (16561): 5070700
-rgba[1df][c0] (16740): 0
+rgba[1df][c0] (16740): 5070700
 rgba[1df][c1] (1691f): 5070700
 rgba[1df][c2] (16afe): 5070700
 rgba[1df][c3] (16cdd): 5070700
 rgba[1df][c4] (16ebc): 5070700
-rgba[1df][c5] (1709b): 5070700
-rgba[1df][c6] (1727a): 5070700
+rgba[1df][c5] (1709b): 0
+rgba[1df][c6] (1727a): 6080900
 rgba[1df][c7] (17459): 6080900
-rgba[1df][c8] (17638): 6080900
-rgba[1df][c9] (17817): 5070700
-rgba[1df][ca] (179f6): 5070700
-rgba[1df][cb] (17bd5): 6080900
+rgba[1df][c8] (17638): 5070700
+rgba[1df][c9] (17817): 0
+rgba[1df][ca] (179f6): 6080900
+rgba[1df][cb] (17bd5): 5070700
 rgba[1df][cc] (17db4): 5070700
 rgba[1df][cd] (17f93): 5070700
-rgba[1df][ce] (18172): 5070700
-rgba[1df][cf] (18351): 5070700
+rgba[1df][ce] (18172): 0
+rgba[1df][cf] (18351): 6080900
 rgba[1df][d0] (18530): 6080900
-rgba[1df][d1] (1870f): 6080900
+rgba[1df][d1] (1870f): 0
 rgba[1df][d2] (188ee): 0
 rgba[1df][d3] (18acd): 0
 rgba[1df][d4] (18cac): 0
-rgba[1df][d5] (18e8b): 30333400
-rgba[1df][d6] (1906a): 0
-rgba[1df][d7] (19249): 6080900
-rgba[1df][d8] (19428): 5070700
+rgba[1df][d5] (18e8b): 0
+rgba[1df][d6] (1906a): 6080900
+rgba[1df][d7] (19249): 0
+rgba[1df][d8] (19428): 6080900
 rgba[1df][d9] (19607): 6080900
-rgba[1df][da] (197e6): 6080900
+rgba[1df][da] (197e6): 5070700
 rgba[1df][db] (199c5): 5070700
 rgba[1df][dc] (19ba4): 5070700
 rgba[1df][dd] (19d83): 5070700
 rgba[1df][de] (19f62): 5070700
-rgba[1df][df] (1a141): 5070700
+rgba[1df][df] (1a141): 0
 rgba[1df][e0] (1a320): 5070700
-rgba[1df][e1] (1a4ff): 0
+rgba[1df][e1] (1a4ff): 5070700
 rgba[1df][e2] (1a6de): 5070700
 rgba[1df][e3] (1a8bd): 5070700
 rgba[1df][e4] (1aa9c): 5070700
 rgba[1df][e5] (1ac7b): 5070700
-rgba[1df][e6] (1ae5a): 5070700
-rgba[1df][e7] (1b039): 5070700
+rgba[1df][e6] (1ae5a): 4060700
+rgba[1df][e7] (1b039): 4060700
 rgba[1df][e8] (1b218): 4060700
 rgba[1df][e9] (1b3f7): 4060700
-rgba[1df][ea] (1b5d6): 4060700
-rgba[1df][eb] (1b7b5): 4060700
+rgba[1df][ea] (1b5d6): 3040500
+rgba[1df][eb] (1b7b5): 3040500
 rgba[1df][ec] (1b994): 3040500
 rgba[1df][ed] (1bb73): 3040500
 rgba[1df][ee] (1bd52): 3040500
 rgba[1df][ef] (1bf31): 3040500
-rgba[1df][f0] (1c110): 3040500
-rgba[1df][f1] (1c2ef): 3040500
-rgba[1df][f2] (1c4ce): 5070700
+rgba[1df][f0] (1c110): 5070700
+rgba[1df][f1] (1c2ef): 0
+rgba[1df][f2] (1c4ce): 6080900
 rgba[1df][f3] (1c6ad): 6080900
-rgba[1df][f4] (1c88c): 6080900
+rgba[1df][f4] (1c88c): 4060700
 rgba[1df][f5] (1ca6b): 0
-rgba[1df][f6] (1cc4a): 4060700
-rgba[1df][f7] (1ce29): 4050600
-rgba[1df][f8] (1d008): 5070700
+rgba[1df][f6] (1cc4a): 5070700
+rgba[1df][f7] (1ce29): 3040500
+rgba[1df][f8] (1d008): 3040500
 rgba[1df][f9] (1d1e7): 3040500
 rgba[1df][fa] (1d3c6): 3040500
 rgba[1df][fb] (1d5a5): 3040500
-rgba[1df][fc] (1d784): 3040500
-rgba[1df][fd] (1d963): 3040500
-rgba[1df][fe] (1db42): 5070700
-rgba[1df][ff] (1dd21): 4060700
+rgba[1df][fc] (1d784): 5070700
+rgba[1df][fd] (1d963): 4060700
+rgba[1df][fe] (1db42): 0
+rgba[1df][ff] (1dd21): 3040500
 rgba[1df][100] (1df00): 3050600
-rgba[1df][101] (1e0df): 3040500
-rgba[1df][102] (1e2be): 2030400
-rgba[1df][103] (1e49d): 2030400
-rgba[1df][104] (1e67c): 3040500
-rgba[1df][105] (1e85b): 4060700
+rgba[1df][101] (1e0df): 0
+rgba[1df][102] (1e2be): 3040500
+rgba[1df][103] (1e49d): 4060700
+rgba[1df][104] (1e67c): 0
+rgba[1df][105] (1e85b): 3040500
 rgba[1df][106] (1ea3a): 4050600
-rgba[1df][107] (1ec19): 3040500
+rgba[1df][107] (1ec19): 0
 rgba[1df][108] (1edf8): 0
 rgba[1df][109] (1efd7): 0
 rgba[1df][10a] (1f1b6): 0
-rgba[1df][10b] (1f395): 0
+rgba[1df][10b] (1f395): 3040500
 rgba[1df][10c] (1f574): 2030400
-rgba[1df][10d] (1f753): 3040500
+rgba[1df][10d] (1f753): 0
 rgba[1df][10e] (1f932): 0
 rgba[1df][10f] (1fb11): 0
 rgba[1df][110] (1fcf0): 0
@@ -145951,7 +145951,7 @@
 rgba[1e6][96] (11cc4): 0
 rgba[1e6][97] (11eaa): 0
 rgba[1e6][98] (12090): 0
-rgba[1e6][99] (12276): 5d5e5d00
+rgba[1e6][99] (12276): 0
 rgba[1e6][9a] (1245c): 0
 rgba[1e6][9b] (12642): 0
 rgba[1e6][9c] (12828): 0
[schwarzgerat](1) $ 
dankamongmen commented 3 years ago

i think i might have got it!

dankamongmen commented 3 years ago

yeah this fix makes orca look superficially correct, though it doesn't fix the flicker in yield, and i don't trust it to be a complete fix. i want to close the loop on this unit test i've added, which i can do now that i have the sixel -> rgb conversion. the test ought check that all rgb values are equal after scrub, except those which we meant to blow away, at the pixel level. this will give us our final answer.

dankamongmen commented 3 years ago

i've cherry-picked the sixel fix thus far into master, but let's close out this unit test and ensure there aren't any further problems.

dankamongmen commented 3 years ago

Man, these unit tests are proving difficult to get working all the way, presumably due to bugs in our ad hoc sixel->rgba decoder. I've got them checked in now, but important chunks are commented out with FIXMEs.

dankamongmen commented 3 years ago

well, all this stuff probably does indeed work, but we're junking it anyway in favor of sixel rematerialization, see #1440.

dankamongmen commented 3 years ago

Yeah, this will be going away. Closing.