
com.googlecode.lanterna.screen.ScreenBuffer Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of lanterna Show documentation
Show all versions of lanterna Show documentation
Java library for creating text-based terminal GUIs
/*
* This file is part of lanterna (http://code.google.com/p/lanterna/).
*
* lanterna is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*
* Copyright (C) 2010-2017 Martin Berglund
*/
package com.googlecode.lanterna.screen;
import com.googlecode.lanterna.TerminalPosition;
import com.googlecode.lanterna.TextCharacter;
import com.googlecode.lanterna.TerminalSize;
import com.googlecode.lanterna.graphics.BasicTextImage;
import com.googlecode.lanterna.graphics.TextGraphics;
import com.googlecode.lanterna.graphics.TextImage;
/**
* Defines a buffer used by AbstractScreen and its subclasses to keep its state of what's currently displayed and what
* the edit buffer looks like. A ScreenBuffer is essentially a two-dimensional array of TextCharacter with some utility
* methods to inspect and manipulate it in a safe way.
* @author martin
*/
public class ScreenBuffer implements TextImage {
private final BasicTextImage backend;
/**
* Creates a new ScreenBuffer with a given size and a TextCharacter to initially fill it with
* @param size Size of the buffer
* @param filler What character to set as the initial content of the buffer
*/
public ScreenBuffer(TerminalSize size, TextCharacter filler) {
this(new BasicTextImage(size, filler));
}
private ScreenBuffer(BasicTextImage backend) {
this.backend = backend;
}
@Override
public ScreenBuffer resize(TerminalSize newSize, TextCharacter filler) {
BasicTextImage resizedBackend = backend.resize(newSize, filler);
return new ScreenBuffer(resizedBackend);
}
boolean isVeryDifferent(ScreenBuffer other, int threshold) {
if(!getSize().equals(other.getSize())) {
throw new IllegalArgumentException("Can only call isVeryDifferent comparing two ScreenBuffers of the same size!"
+ " This is probably a bug in Lanterna.");
}
int differences = 0;
for(int y = 0; y < getSize().getRows(); y++) {
for(int x = 0; x < getSize().getColumns(); x++) {
if(!getCharacterAt(x, y).equals(other.getCharacterAt(x, y))) {
if(++differences >= threshold) {
return true;
}
}
}
}
return false;
}
///////////////////////////////////////////////////////////////////////////////
// Delegate all TextImage calls (except resize) to the backend BasicTextImage
@Override
public TerminalSize getSize() {
return backend.getSize();
}
@Override
public TextCharacter getCharacterAt(TerminalPosition position) {
return backend.getCharacterAt(position);
}
@Override
public TextCharacter getCharacterAt(int column, int row) {
return backend.getCharacterAt(column, row);
}
@Override
public void setCharacterAt(TerminalPosition position, TextCharacter character) {
backend.setCharacterAt(position, character);
}
@Override
public void setCharacterAt(int column, int row, TextCharacter character) {
backend.setCharacterAt(column, row, character);
}
@Override
public void setAll(TextCharacter character) {
backend.setAll(character);
}
@Override
public TextGraphics newTextGraphics() {
return backend.newTextGraphics();
}
@Override
public void copyTo(TextImage destination) {
if(destination instanceof ScreenBuffer) {
//This will allow the BasicTextImage's copy method to use System.arraycopy (micro-optimization?)
destination = ((ScreenBuffer)destination).backend;
}
backend.copyTo(destination);
}
@Override
public void copyTo(TextImage destination, int startRowIndex, int rows, int startColumnIndex, int columns, int destinationRowOffset, int destinationColumnOffset) {
if(destination instanceof ScreenBuffer) {
//This will allow the BasicTextImage's copy method to use System.arraycopy (micro-optimization?)
destination = ((ScreenBuffer)destination).backend;
}
backend.copyTo(destination, startRowIndex, rows, startColumnIndex, columns, destinationRowOffset, destinationColumnOffset);
}
/**
* Copies the content from a TextImage into this buffer.
* @param source Source to copy content from
* @param startRowIndex Which row in the source image to start copying from
* @param rows How many rows to copy
* @param startColumnIndex Which column in the source image to start copying from
* @param columns How many columns to copy
* @param destinationRowOffset The row offset in this buffer of where to place the copied content
* @param destinationColumnOffset The column offset in this buffer of where to place the copied content
*/
public void copyFrom(TextImage source, int startRowIndex, int rows, int startColumnIndex, int columns, int destinationRowOffset, int destinationColumnOffset) {
source.copyTo(backend, startRowIndex, rows, startColumnIndex, columns, destinationRowOffset, destinationColumnOffset);
}
@Override
public void scrollLines(int firstLine, int lastLine, int distance) {
backend.scrollLines(firstLine, lastLine, distance);
}
@Override
public String toString() {
return backend.toString();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy