Remove overlap logic in Cell -- pointers invalidated by vector ops

This commit is contained in:
Keith Winstein
2011-02-01 01:16:55 -05:00
parent 9633920fdb
commit efabaaf963
3 changed files with 20 additions and 43 deletions
+9 -6
View File
@@ -79,7 +79,12 @@ void Emulator::print( Parser::Print *act )
this_cell->width = chwidth; this_cell->width = chwidth;
fb.apply_renditions_to_current_cell(); fb.apply_renditions_to_current_cell();
fb.claim_overlap( fb.ds.get_cursor_row(), fb.ds.get_cursor_col() ); if ( chwidth == 2 ) { /* erase overlapped cell */
Cell *next = fb.get_cell( fb.ds.get_cursor_row(), fb.ds.get_cursor_col() + 1 );
if ( next ) {
next->reset();
}
}
fb.ds.move_col( chwidth, true, true ); fb.ds.move_col( chwidth, true, true );
@@ -134,15 +139,11 @@ void Emulator::debug_printout( int fd )
screen.append( "\033[H" ); screen.append( "\033[H" );
for ( int y = 0; y < fb.ds.get_height(); y++ ) { for ( int y = 0; y < fb.ds.get_height(); y++ ) {
for ( int x = 0; x < fb.ds.get_width(); x++ ) { for ( int x = 0; x < fb.ds.get_width(); /* let charwidth handle advance */ ) {
char curmove[ 32 ]; char curmove[ 32 ];
snprintf( curmove, 32, "\033[%d;%dH\033[X", y + 1, x + 1 ); snprintf( curmove, 32, "\033[%d;%dH\033[X", y + 1, x + 1 );
screen.append( curmove ); screen.append( curmove );
Cell *cell = fb.get_cell( y, x ); Cell *cell = fb.get_cell( y, x );
if ( cell->overlapping_cell ) continue;
assert( (cell->overlapped_cells.size() + 1 == (size_t)cell->width)
|| (x == fb.ds.get_width() - 1) );
/* print renditions */ /* print renditions */
screen.append( "\033[0" ); screen.append( "\033[0" );
@@ -171,6 +172,8 @@ void Emulator::debug_printout( int fd )
snprintf( utf8, 8, "%lc", *i ); snprintf( utf8, 8, "%lc", *i );
screen.append( utf8 ); screen.append( utf8 );
} }
x += cell->width;
} }
} }
+7 -34
View File
@@ -5,18 +5,14 @@
using namespace Terminal; using namespace Terminal;
Cell::Cell() Cell::Cell()
: overlapping_cell( NULL ), : contents(),
contents(),
overlapped_cells(),
fallback( false ), fallback( false ),
width( 1 ), width( 1 ),
renditions() renditions()
{} {}
Cell::Cell( const Cell &x ) Cell::Cell( const Cell &x )
: overlapping_cell( x.overlapping_cell ), : contents( x.contents ),
contents( x.contents ),
overlapped_cells( x.overlapped_cells ),
fallback( x.fallback ), fallback( x.fallback ),
width( x.width ), width( x.width ),
renditions( x.renditions ) renditions( x.renditions )
@@ -24,9 +20,7 @@ Cell::Cell( const Cell &x )
Cell & Cell::operator=( const Cell &x ) Cell & Cell::operator=( const Cell &x )
{ {
overlapping_cell = x.overlapping_cell;
contents = x.contents; contents = x.contents;
overlapped_cells = x.overlapped_cells;
fallback = x.fallback; fallback = x.fallback;
width = x.width; width = x.width;
renditions = x.renditions; renditions = x.renditions;
@@ -44,18 +38,6 @@ void Cell::reset( void )
fallback = false; fallback = false;
width = 1; width = 1;
renditions.clear(); renditions.clear();
if ( overlapping_cell ) {
assert( overlapped_cells.size() == 0 );
} else {
for ( std::vector<Cell *>::iterator i = overlapped_cells.begin();
i != overlapped_cells.end();
i++ ) {
(*i)->overlapping_cell = NULL;
(*i)->reset();
}
overlapped_cells.clear();
}
} }
DrawState::DrawState( int s_width, int s_height ) DrawState::DrawState( int s_width, int s_height )
@@ -183,20 +165,6 @@ Cell *Framebuffer::get_combining_cell( void )
return &rows[ ds.get_combining_char_row() ].cells[ ds.get_combining_char_col() ]; return &rows[ ds.get_combining_char_row() ].cells[ ds.get_combining_char_col() ];
} }
void Framebuffer::claim_overlap( int row, int col )
{
Cell *the_cell = &rows[ row ].cells[ col ];
for ( int i = col + 1; i < col + the_cell->width; i++ ) {
if ( i < ds.get_width() ) {
Cell *next_cell = get_cell( row, i );
next_cell->reset();
the_cell->overlapped_cells.push_back( next_cell );
next_cell->overlapping_cell = the_cell;
}
}
}
void DrawState::set_tab( void ) void DrawState::set_tab( void )
{ {
tabs[ cursor_col ] = true; tabs[ cursor_col ] = true;
@@ -319,3 +287,8 @@ void Framebuffer::delete_line( int row )
rows.erase( rows.begin() + row ); rows.erase( rows.begin() + row );
rows.insert( rows.begin() + ds.get_scrolling_region_bottom_row(), Row( ds.get_width() ) ); rows.insert( rows.begin() + ds.get_scrolling_region_bottom_row(), Row( ds.get_width() ) );
} }
void Row::insert_cell( int col )
{
cells.insert( cells.begin() + col, Cell() );
}
+4 -3
View File
@@ -9,9 +9,7 @@
namespace Terminal { namespace Terminal {
class Cell { class Cell {
public: public:
Cell *overlapping_cell;
std::vector<wchar_t> contents; std::vector<wchar_t> contents;
std::vector<Cell *> overlapped_cells;
char fallback; /* first character is combining character */ char fallback; /* first character is combining character */
int width; int width;
std::vector<int> renditions; /* e.g., bold, blinking, etc. */ std::vector<int> renditions; /* e.g., bold, blinking, etc. */
@@ -29,6 +27,9 @@ namespace Terminal {
std::vector<Cell> cells; std::vector<Cell> cells;
Row( size_t s_width ); Row( size_t s_width );
void insert_cell( int col );
void delete_cell( int col );
}; };
class SavedCursor { class SavedCursor {
@@ -119,7 +120,7 @@ namespace Terminal {
Cell *get_combining_cell( void ); Cell *get_combining_cell( void );
void apply_renditions_to_current_cell( void ); void apply_renditions_to_current_cell( void );
void claim_overlap( int row, int col );
void insert_line( int before_row ); void insert_line( int before_row );
void delete_line( int row ); void delete_line( int row );
}; };