Optimize eterm Kitty graphics frame replacement

- swap decoded frames into reusable image storage
  - recycle previous frame allocations for subsequent transfers
  - avoid full-frame copies during anonymous image replacement
  - extend tests to verify safe allocation reuse across frames
  - document eterm and eeiv in the project introduction
This commit is contained in:
Martín Lucas Golini
2026-09-04 18:45:10 -03:00
parent 7ed9b7c517
commit 0e9f2e832f
3 changed files with 29 additions and 6 deletions
+12
View File
@@ -1064,12 +1064,24 @@ UTEST( eterm, kitty_graphics_reuses_unreferenced_replacement_pixel_storage ) {
updates.clear();
const auto* storage = protocol.imagePixels( 91 );
ASSERT_TRUE( storage != nullptr );
const auto* firstAllocation = storage->data();
ASSERT_EQ( KittyGraphicsError::None,
protocol.handle( "a=t,f=24,s=2,v=1,i=91,q=2;BwgJCgsM" ).error );
EXPECT_TRUE( storage == protocol.imagePixels( 91 ) );
const std::vector<Uint8> expected{ 7, 8, 9, 10, 11, 12 };
EXPECT_TRUE( expected == *protocol.imagePixels( 91 ) );
ASSERT_TRUE( firstAllocation != protocol.imagePixels( 91 )->data() );
updates = protocol.takeUpdates();
ASSERT_EQ( static_cast<size_t>( 1 ), updates.size() );
updates.clear();
ASSERT_EQ( KittyGraphicsError::None,
protocol.handle( "a=t,f=24,s=2,v=1,i=91,q=2;DQ4PEBES" ).error );
EXPECT_TRUE( storage == protocol.imagePixels( 91 ) );
const std::vector<Uint8> recycledExpected{ 13, 14, 15, 16, 17, 18 };
EXPECT_TRUE( recycledExpected == *protocol.imagePixels( 91 ) );
EXPECT_TRUE( firstAllocation == protocol.imagePixels( 91 )->data() );
}
UTEST( eterm, kitty_graphics_rejects_shared_memory_transmission ) {