public void redrawFromDamage(){
		
		final int newOrigin = newClientScrollOrigin;
		if(!backBuffer.tryLock()){
			if(framesSkipped >= 5){
				backBuffer.lock();
			}else{
				framesSkipped++;
				return;
			}
		}
		try{
			framesSkipped =0;
			
			boolean serverScroll = pendingScrolls.enact(gfx, getPixelWidth(), charSize.height );
			
			boolean clientScroll = clientScrollOrigin != newOrigin;
			if( clientScroll ){
		    	final int oldOrigin = clientScrollOrigin;
		    	clientScrollOrigin = newOrigin;
		    	clientScrollOriginChanged(oldOrigin);
		    }
			
			boolean hasDamage = backBuffer.hasDamage();
			if(hasDamage){
				noDamage = 0;
				
				backBuffer.pumpRunsFromDamage(this);
				backBuffer.resetDamage();
			}else{ 
				noDamage++;
			}
			
			if(serverScroll || clientScroll || hasDamage || cursorChanged){
				repaint();
				cursorChanged = false;
			}
		}finally{
			backBuffer.unlock();
		}
	}