1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-01-20 22:16:57 +00:00

Store colour support in the Terminal

Previously we stored it alongside the terminal. While this makes sense -
it's not a property of the terminal itself, it ends up duplicating code
in a bunch of places.

We now track the colour flag on the terminal itself. This allows us to
simplify a couple of things:

 - The palette now also knows whether it supports colours or not, and so
   performs greyscale conversion. This means we no longer need to thread
   a "greyscale" flag throughout terminal rendering.

 - Remove isColour() getters from a whole load of
   places (TerminalMethods, ServerTerminal, IComputerEnvironment).
This commit is contained in:
Jonathan Coates 2022-10-21 18:26:57 +01:00
parent c49547b962
commit cf05ab1db1
No known key found for this signature in database
GPG Key ID: B9E431FF07C98D06
33 changed files with 190 additions and 262 deletions

View File

@ -9,7 +9,6 @@ import com.mojang.blaze3d.matrix.MatrixStack;
import dan200.computercraft.client.gui.widgets.ComputerSidebar; import dan200.computercraft.client.gui.widgets.ComputerSidebar;
import dan200.computercraft.client.gui.widgets.WidgetTerminal; import dan200.computercraft.client.gui.widgets.WidgetTerminal;
import dan200.computercraft.client.render.ComputerBorderRenderer; import dan200.computercraft.client.render.ComputerBorderRenderer;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.computer.inventory.ContainerComputerBase; import dan200.computercraft.shared.computer.inventory.ContainerComputerBase;
import net.minecraft.entity.player.PlayerInventory; import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
@ -32,10 +31,7 @@ public final class GuiComputer<T extends ContainerComputerBase> extends Computer
@Override @Override
protected WidgetTerminal createTerminal() protected WidgetTerminal createTerminal()
{ {
return new WidgetTerminal( return new WidgetTerminal( terminalData, input, leftPos + ComputerSidebar.WIDTH + BORDER, topPos + BORDER );
getMenu().getFamily() != ComputerFamily.NORMAL, terminalData, input,
leftPos + ComputerSidebar.WIDTH + BORDER, topPos + BORDER
);
} }
@Override @Override

View File

@ -43,10 +43,7 @@ public class GuiTurtle extends ComputerScreenBase<ContainerTurtle>
@Override @Override
protected WidgetTerminal createTerminal() protected WidgetTerminal createTerminal()
{ {
return new WidgetTerminal( return new WidgetTerminal( terminalData, input, leftPos + BORDER + ComputerSidebar.WIDTH, topPos + BORDER );
getMenu().getFamily() != ComputerFamily.NORMAL, terminalData, input,
leftPos + BORDER + ComputerSidebar.WIDTH, topPos + BORDER
);
} }
@Override @Override

View File

@ -8,7 +8,6 @@ package dan200.computercraft.client.gui;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import dan200.computercraft.client.gui.widgets.WidgetTerminal; import dan200.computercraft.client.gui.widgets.WidgetTerminal;
import dan200.computercraft.core.terminal.Terminal; import dan200.computercraft.core.terminal.Terminal;
import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.computer.inventory.ContainerComputerBase; import dan200.computercraft.shared.computer.inventory.ContainerComputerBase;
import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.IHasContainer; import net.minecraft.client.gui.IHasContainer;
@ -56,7 +55,7 @@ public class NoTermComputerScreen<T extends ContainerComputerBase> extends Scree
super.init(); super.init();
minecraft.keyboardHandler.setSendRepeatsToGui( true ); minecraft.keyboardHandler.setSendRepeatsToGui( true );
terminal = addWidget( new WidgetTerminal( getMenu().getFamily() != ComputerFamily.NORMAL, terminalData, new ClientInputHandler( menu ), 0, 0 ) ); terminal = addWidget( new WidgetTerminal( terminalData, new ClientInputHandler( menu ), 0, 0 ) );
terminal.visible = false; terminal.visible = false;
terminal.active = false; terminal.active = false;
setFocused( terminal ); setFocused( terminal );

View File

@ -33,11 +33,9 @@ public class WidgetTerminal extends Widget
{ {
private static final float TERMINATE_TIME = 0.5f; private static final float TERMINATE_TIME = 0.5f;
private final boolean isColour;
private final @Nonnull Terminal terminal; private final @Nonnull Terminal terminal;
private final @Nonnull InputHandler computer; private final @Nonnull InputHandler computer;
// The positions of the actual terminal // The positions of the actual terminal
private final int innerX; private final int innerX;
private final int innerY; private final int innerY;
@ -54,11 +52,10 @@ public class WidgetTerminal extends Widget
private final BitSet keysDown = new BitSet( 256 ); private final BitSet keysDown = new BitSet( 256 );
public WidgetTerminal( boolean isColour, @Nonnull Terminal terminal, @Nonnull InputHandler computer, int x, int y ) public WidgetTerminal( @Nonnull Terminal terminal, @Nonnull InputHandler computer, int x, int y )
{ {
super( x, y, terminal.getWidth() * FONT_WIDTH + MARGIN * 2, terminal.getHeight() * FONT_HEIGHT + MARGIN * 2, StringTextComponent.EMPTY ); super( x, y, terminal.getWidth() * FONT_WIDTH + MARGIN * 2, terminal.getHeight() * FONT_HEIGHT + MARGIN * 2, StringTextComponent.EMPTY );
this.isColour = isColour;
this.terminal = terminal; this.terminal = terminal;
this.computer = computer; this.computer = computer;
@ -178,7 +175,7 @@ public class WidgetTerminal extends Widget
public boolean mouseClicked( double mouseX, double mouseY, int button ) public boolean mouseClicked( double mouseX, double mouseY, int button )
{ {
if( !inTermRegion( mouseX, mouseY ) ) return false; if( !inTermRegion( mouseX, mouseY ) ) return false;
if( !isColour || button < 0 || button > 2 ) return false; if( !hasMouseSupport() || button < 0 || button > 2 ) return false;
int charX = (int) ((mouseX - innerX) / FONT_WIDTH); int charX = (int) ((mouseX - innerX) / FONT_WIDTH);
int charY = (int) ((mouseY - innerY) / FONT_HEIGHT); int charY = (int) ((mouseY - innerY) / FONT_HEIGHT);
@ -198,7 +195,7 @@ public class WidgetTerminal extends Widget
public boolean mouseReleased( double mouseX, double mouseY, int button ) public boolean mouseReleased( double mouseX, double mouseY, int button )
{ {
if( !inTermRegion( mouseX, mouseY ) ) return false; if( !inTermRegion( mouseX, mouseY ) ) return false;
if( !isColour || button < 0 || button > 2 ) return false; if( !hasMouseSupport() || button < 0 || button > 2 ) return false;
int charX = (int) ((mouseX - innerX) / FONT_WIDTH); int charX = (int) ((mouseX - innerX) / FONT_WIDTH);
int charY = (int) ((mouseY - innerY) / FONT_HEIGHT); int charY = (int) ((mouseY - innerY) / FONT_HEIGHT);
@ -221,7 +218,7 @@ public class WidgetTerminal extends Widget
public boolean mouseDragged( double mouseX, double mouseY, int button, double v2, double v3 ) public boolean mouseDragged( double mouseX, double mouseY, int button, double v2, double v3 )
{ {
if( !inTermRegion( mouseX, mouseY ) ) return false; if( !inTermRegion( mouseX, mouseY ) ) return false;
if( !isColour || button < 0 || button > 2 ) return false; if( !hasMouseSupport() || button < 0 || button > 2 ) return false;
int charX = (int) ((mouseX - innerX) / FONT_WIDTH); int charX = (int) ((mouseX - innerX) / FONT_WIDTH);
int charY = (int) ((mouseY - innerY) / FONT_HEIGHT); int charY = (int) ((mouseY - innerY) / FONT_HEIGHT);
@ -242,7 +239,7 @@ public class WidgetTerminal extends Widget
public boolean mouseScrolled( double mouseX, double mouseY, double delta ) public boolean mouseScrolled( double mouseX, double mouseY, double delta )
{ {
if( !inTermRegion( mouseX, mouseY ) ) return false; if( !inTermRegion( mouseX, mouseY ) ) return false;
if( !isColour || delta == 0 ) return false; if( !hasMouseSupport() || delta == 0 ) return false;
int charX = (int) ((mouseX - innerX) / FONT_WIDTH); int charX = (int) ((mouseX - innerX) / FONT_WIDTH);
int charY = (int) ((mouseY - innerY) / FONT_HEIGHT); int charY = (int) ((mouseY - innerY) / FONT_HEIGHT);
@ -262,6 +259,11 @@ public class WidgetTerminal extends Widget
return active && visible && mouseX >= innerX && mouseY >= innerY && mouseX < innerX + innerWidth && mouseY < innerY + innerHeight; return active && visible && mouseX >= innerX && mouseY >= innerY && mouseX < innerX + innerWidth && mouseY < innerY + innerHeight;
} }
private boolean hasMouseSupport()
{
return terminal.isColour();
}
public void update() public void update()
{ {
if( terminateTimer >= 0 && terminateTimer < TERMINATE_TIME && (terminateTimer += 0.05f) > TERMINATE_TIME ) if( terminateTimer >= 0 && terminateTimer < TERMINATE_TIME && (terminateTimer += 0.05f) > TERMINATE_TIME )
@ -315,14 +317,7 @@ public class WidgetTerminal extends Widget
IRenderTypeBuffer.Impl renderer = IRenderTypeBuffer.immediate( Tessellator.getInstance().getBuilder() ); IRenderTypeBuffer.Impl renderer = IRenderTypeBuffer.immediate( Tessellator.getInstance().getBuilder() );
IVertexBuilder buffer = renderer.getBuffer( RenderTypes.TERMINAL_WITH_DEPTH ); IVertexBuilder buffer = renderer.getBuffer( RenderTypes.TERMINAL_WITH_DEPTH );
if( terminal != null ) FixedWidthFontRenderer.drawTerminal( matrix, buffer, innerX, innerY, terminal, MARGIN, MARGIN, MARGIN, MARGIN );
{
FixedWidthFontRenderer.drawTerminal( matrix, buffer, innerX, innerY, terminal, !isColour, MARGIN, MARGIN, MARGIN, MARGIN );
}
else
{
FixedWidthFontRenderer.drawEmptyTerminal( matrix, buffer, x, y, width, height );
}
renderer.endBatch(); renderer.endBatch();
} }

View File

@ -25,15 +25,13 @@ import javax.annotation.Nonnull;
*/ */
public class PocketComputerData public class PocketComputerData
{ {
private boolean isColour;
private Terminal terminal; private Terminal terminal;
private ComputerState state = ComputerState.OFF; private ComputerState state = ComputerState.OFF;
private int lightColour = -1; private int lightColour = -1;
public PocketComputerData( boolean colour ) public PocketComputerData( boolean colour )
{ {
isColour = colour; terminal = new Terminal( ComputerCraft.pocketTermWidth, ComputerCraft.pocketTermHeight, colour );
terminal = new Terminal( ComputerCraft.pocketTermWidth, ComputerCraft.pocketTermHeight );
} }
public int getLightState() public int getLightState()
@ -41,11 +39,6 @@ public class PocketComputerData
return state != ComputerState.OFF ? lightColour : -1; return state != ComputerState.OFF ? lightColour : -1;
} }
public boolean isColour()
{
return isColour;
}
@Nonnull @Nonnull
public Terminal getTerminal() public Terminal getTerminal()
{ {
@ -65,8 +58,7 @@ public class PocketComputerData
public void setTerminal( TerminalState state ) public void setTerminal( TerminalState state )
{ {
isColour = state.colour; if( state.width != terminal.getWidth() || state.height != terminal.getHeight() || state.colour != terminal.isColour() )
if( state.width != terminal.getWidth() || state.height != terminal.getHeight() )
{ {
terminal = state.create(); terminal = state.create();
} }

View File

@ -92,7 +92,7 @@ public final class ItemPocketRenderer extends ItemMapLikeRenderer
FixedWidthFontRenderer.drawTerminal( FixedWidthFontRenderer.drawTerminal(
matrix, bufferSource.getBuffer( RenderTypes.TERMINAL_WITHOUT_DEPTH ), matrix, bufferSource.getBuffer( RenderTypes.TERMINAL_WITHOUT_DEPTH ),
MARGIN, MARGIN, terminal, !computer.isColour(), MARGIN, MARGIN, MARGIN, MARGIN MARGIN, MARGIN, terminal, MARGIN, MARGIN, MARGIN, MARGIN
); );
FixedWidthFontRenderer.drawBlocker( FixedWidthFontRenderer.drawBlocker(
matrix, bufferSource.getBuffer( RenderTypes.TERMINAL_BLOCKER ), matrix, bufferSource.getBuffer( RenderTypes.TERMINAL_BLOCKER ),

View File

@ -173,14 +173,14 @@ class MonitorTextureBufferShader
buffer.limit( pos ); buffer.limit( pos );
} }
public static void setUniformData( ByteBuffer buffer, Terminal terminal, boolean greyscale ) public static void setUniformData( ByteBuffer buffer, Terminal terminal )
{ {
int pos = 0; int pos = 0;
Palette palette = terminal.getPalette(); Palette palette = terminal.getPalette();
for( int i = 0; i < 16; i++ ) for( int i = 0; i < 16; i++ )
{ {
double[] colour = palette.getColour( i ); double[] colour = palette.getColour( i );
if( greyscale ) if( !terminal.isColour() )
{ {
float f = FixedWidthFontRenderer.toGreyscale( colour ); float f = FixedWidthFontRenderer.toGreyscale( colour );
buffer.putFloat( pos, f ).putFloat( pos + 4, f ).putFloat( pos + 8, f ); buffer.putFloat( pos, f ).putFloat( pos + 4, f ).putFloat( pos + 8, f );

View File

@ -63,7 +63,7 @@ public final class PrintoutRenderer
{ {
FixedWidthFontRenderer.drawString( transform, buffer, FixedWidthFontRenderer.drawString( transform, buffer,
x, y + line * FONT_HEIGHT, text[start + line], colours[start + line], x, y + line * FONT_HEIGHT, text[start + line], colours[start + line],
Palette.DEFAULT, false, light Palette.DEFAULT, light
); );
} }
} }
@ -76,7 +76,7 @@ public final class PrintoutRenderer
FixedWidthFontRenderer.drawString( transform, buffer, FixedWidthFontRenderer.drawString( transform, buffer,
x, y + line * FONT_HEIGHT, x, y + line * FONT_HEIGHT,
new TextBuffer( text[start + line] ), new TextBuffer( colours[start + line] ), new TextBuffer( text[start + line] ), new TextBuffer( colours[start + line] ),
Palette.DEFAULT, false, light Palette.DEFAULT, light
); );
} }
} }

View File

@ -157,7 +157,7 @@ public class TileEntityMonitorRenderer extends TileEntityRenderer<TileMonitor>
DirectBuffers.setBufferData( GL31.GL_TEXTURE_BUFFER, monitor.tboBuffer, terminalBuffer, GL20.GL_STATIC_DRAW ); DirectBuffers.setBufferData( GL31.GL_TEXTURE_BUFFER, monitor.tboBuffer, terminalBuffer, GL20.GL_STATIC_DRAW );
ByteBuffer uniformBuffer = getBuffer( MonitorTextureBufferShader.UNIFORM_SIZE ); ByteBuffer uniformBuffer = getBuffer( MonitorTextureBufferShader.UNIFORM_SIZE );
MonitorTextureBufferShader.setUniformData( uniformBuffer, terminal, !monitor.isColour() ); MonitorTextureBufferShader.setUniformData( uniformBuffer, terminal );
DirectBuffers.setBufferData( GL31.GL_UNIFORM_BUFFER, monitor.tboUniform, uniformBuffer, GL20.GL_STATIC_DRAW ); DirectBuffers.setBufferData( GL31.GL_UNIFORM_BUFFER, monitor.tboUniform, uniformBuffer, GL20.GL_STATIC_DRAW );
} }
@ -197,13 +197,13 @@ public class TileEntityMonitorRenderer extends TileEntityRenderer<TileMonitor>
// Draw the main terminal and store how many vertices it has. // Draw the main terminal and store how many vertices it has.
DirectFixedWidthFontRenderer.drawTerminalWithoutCursor( DirectFixedWidthFontRenderer.drawTerminalWithoutCursor(
buffer, 0, 0, terminal, !monitor.isColour(), yMargin, yMargin, xMargin, xMargin buffer, 0, 0, terminal, yMargin, yMargin, xMargin, xMargin
); );
int termIndexes = buffer.position() / vertexSize; int termIndexes = buffer.position() / vertexSize;
// If the cursor is visible, we append it to the end of our buffer. When rendering, we can either // If the cursor is visible, we append it to the end of our buffer. When rendering, we can either
// render n or n+1 quads and so toggle the cursor on and off. // render n or n+1 quads and so toggle the cursor on and off.
DirectFixedWidthFontRenderer.drawCursor( buffer, 0, 0, terminal, !monitor.isColour() ); DirectFixedWidthFontRenderer.drawCursor( buffer, 0, 0, terminal );
buffer.flip(); buffer.flip();

View File

@ -61,25 +61,25 @@ public final class DirectFixedWidthFontRenderer
); );
} }
private static void drawQuad( ByteBuffer emitter, float x, float y, float width, float height, Palette palette, boolean greyscale, char colourIndex ) private static void drawQuad( ByteBuffer emitter, float x, float y, float width, float height, Palette palette, char colourIndex )
{ {
byte[] colour = palette.getByteColour( getColour( colourIndex, Colour.BLACK ), greyscale ); byte[] colour = palette.getRenderColours( getColour( colourIndex, Colour.BLACK ) );
quad( emitter, x, y, x + width, y + height, colour, BACKGROUND_START, BACKGROUND_START, BACKGROUND_END, BACKGROUND_END ); quad( emitter, x, y, x + width, y + height, colour, BACKGROUND_START, BACKGROUND_START, BACKGROUND_END, BACKGROUND_END );
} }
private static void drawBackground( private static void drawBackground(
@Nonnull ByteBuffer buffer, float x, float y, @Nonnull TextBuffer backgroundColour, @Nonnull Palette palette, boolean greyscale, @Nonnull ByteBuffer buffer, float x, float y, @Nonnull TextBuffer backgroundColour, @Nonnull Palette palette,
float leftMarginSize, float rightMarginSize, float height float leftMarginSize, float rightMarginSize, float height
) )
{ {
if( leftMarginSize > 0 ) if( leftMarginSize > 0 )
{ {
drawQuad( buffer, x - leftMarginSize, y, leftMarginSize, height, palette, greyscale, backgroundColour.charAt( 0 ) ); drawQuad( buffer, x - leftMarginSize, y, leftMarginSize, height, palette, backgroundColour.charAt( 0 ) );
} }
if( rightMarginSize > 0 ) if( rightMarginSize > 0 )
{ {
drawQuad( buffer, x + backgroundColour.length() * FONT_WIDTH, y, rightMarginSize, height, palette, greyscale, backgroundColour.charAt( backgroundColour.length() - 1 ) ); drawQuad( buffer, x + backgroundColour.length() * FONT_WIDTH, y, rightMarginSize, height, palette, backgroundColour.charAt( backgroundColour.length() - 1 ) );
} }
// Batch together runs of identical background cells. // Batch together runs of identical background cells.
@ -92,7 +92,7 @@ public final class DirectFixedWidthFontRenderer
if( blockColour != '\0' ) if( blockColour != '\0' )
{ {
drawQuad( buffer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (i - blockStart), height, palette, greyscale, blockColour ); drawQuad( buffer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (i - blockStart), height, palette, blockColour );
} }
blockColour = colourIndex; blockColour = colourIndex;
@ -101,15 +101,15 @@ public final class DirectFixedWidthFontRenderer
if( blockColour != '\0' ) if( blockColour != '\0' )
{ {
drawQuad( buffer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (backgroundColour.length() - blockStart), height, palette, greyscale, blockColour ); drawQuad( buffer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (backgroundColour.length() - blockStart), height, palette, blockColour );
} }
} }
private static void drawString( @Nonnull ByteBuffer buffer, float x, float y, @Nonnull TextBuffer text, @Nonnull TextBuffer textColour, @Nonnull Palette palette, boolean greyscale ) private static void drawString( @Nonnull ByteBuffer buffer, float x, float y, @Nonnull TextBuffer text, @Nonnull TextBuffer textColour, @Nonnull Palette palette )
{ {
for( int i = 0; i < text.length(); i++ ) for( int i = 0; i < text.length(); i++ )
{ {
byte[] colour = palette.getByteColour( getColour( textColour.charAt( i ), Colour.BLACK ), greyscale ); byte[] colour = palette.getRenderColours( getColour( textColour.charAt( i ), Colour.BLACK ) );
int index = text.charAt( i ); int index = text.charAt( i );
if( index > 255 ) index = '?'; if( index > 255 ) index = '?';
@ -118,7 +118,7 @@ public final class DirectFixedWidthFontRenderer
} }
public static void drawTerminalWithoutCursor( public static void drawTerminalWithoutCursor(
@Nonnull ByteBuffer buffer, float x, float y, @Nonnull Terminal terminal, boolean greyscale, @Nonnull ByteBuffer buffer, float x, float y, @Nonnull Terminal terminal,
float topMarginSize, float bottomMarginSize, float leftMarginSize, float rightMarginSize float topMarginSize, float bottomMarginSize, float leftMarginSize, float rightMarginSize
) )
{ {
@ -127,12 +127,12 @@ public final class DirectFixedWidthFontRenderer
// Top and bottom margins // Top and bottom margins
drawBackground( drawBackground(
buffer, x, y - topMarginSize, terminal.getBackgroundColourLine( 0 ), palette, greyscale, buffer, x, y - topMarginSize, terminal.getBackgroundColourLine( 0 ), palette,
leftMarginSize, rightMarginSize, topMarginSize leftMarginSize, rightMarginSize, topMarginSize
); );
drawBackground( drawBackground(
buffer, x, y + height * FONT_HEIGHT, terminal.getBackgroundColourLine( height - 1 ), palette, greyscale, buffer, x, y + height * FONT_HEIGHT, terminal.getBackgroundColourLine( height - 1 ), palette,
leftMarginSize, rightMarginSize, bottomMarginSize leftMarginSize, rightMarginSize, bottomMarginSize
); );
@ -141,21 +141,21 @@ public final class DirectFixedWidthFontRenderer
{ {
float rowY = y + FONT_HEIGHT * i; float rowY = y + FONT_HEIGHT * i;
drawBackground( drawBackground(
buffer, x, rowY, terminal.getBackgroundColourLine( i ), palette, greyscale, buffer, x, rowY, terminal.getBackgroundColourLine( i ), palette,
leftMarginSize, rightMarginSize, FONT_HEIGHT leftMarginSize, rightMarginSize, FONT_HEIGHT
); );
drawString( drawString(
buffer, x, rowY, terminal.getLine( i ), terminal.getTextColourLine( i ), buffer, x, rowY, terminal.getLine( i ), terminal.getTextColourLine( i ),
palette, greyscale palette
); );
} }
} }
public static void drawCursor( @Nonnull ByteBuffer buffer, float x, float y, @Nonnull Terminal terminal, boolean greyscale ) public static void drawCursor( @Nonnull ByteBuffer buffer, float x, float y, @Nonnull Terminal terminal )
{ {
if( isCursorVisible( terminal ) ) if( isCursorVisible( terminal ) )
{ {
byte[] colour = terminal.getPalette().getByteColour( 15 - terminal.getTextColour(), greyscale ); byte[] colour = terminal.getPalette().getRenderColours( 15 - terminal.getTextColour() );
drawChar( buffer, x + terminal.getCursorX() * FONT_WIDTH, y + terminal.getCursorY() * FONT_HEIGHT, '_', colour ); drawChar( buffer, x + terminal.getCursorX() * FONT_WIDTH, y + terminal.getCursorY() * FONT_HEIGHT, '_', colour );
} }
} }

View File

@ -92,26 +92,26 @@ public final class FixedWidthFontRenderer
quad( transform, buffer, x, y, x + width, y + height, z, colour, BACKGROUND_START, BACKGROUND_START, BACKGROUND_END, BACKGROUND_END, light ); quad( transform, buffer, x, y, x + width, y + height, z, colour, BACKGROUND_START, BACKGROUND_START, BACKGROUND_END, BACKGROUND_END, light );
} }
private static void drawQuad( Matrix4f transform, IVertexBuilder buffer, float x, float y, float width, float height, Palette palette, boolean greyscale, char colourIndex, int light ) private static void drawQuad( Matrix4f transform, IVertexBuilder buffer, float x, float y, float width, float height, Palette palette, char colourIndex, int light )
{ {
byte[] colour = palette.getByteColour( getColour( colourIndex, Colour.BLACK ), greyscale ); byte[] colour = palette.getRenderColours( getColour( colourIndex, Colour.BLACK ) );
drawQuad( transform, buffer, x, y, 0, width, height, colour, light ); drawQuad( transform, buffer, x, y, 0, width, height, colour, light );
} }
private static void drawBackground( private static void drawBackground(
@Nonnull Matrix4f transform, @Nonnull IVertexBuilder buffer, float x, float y, @Nonnull Matrix4f transform, @Nonnull IVertexBuilder buffer, float x, float y,
@Nonnull TextBuffer backgroundColour, @Nonnull Palette palette, boolean greyscale, @Nonnull TextBuffer backgroundColour, @Nonnull Palette palette,
float leftMarginSize, float rightMarginSize, float height, int light float leftMarginSize, float rightMarginSize, float height, int light
) )
{ {
if( leftMarginSize > 0 ) if( leftMarginSize > 0 )
{ {
drawQuad( transform, buffer, x - leftMarginSize, y, leftMarginSize, height, palette, greyscale, backgroundColour.charAt( 0 ), light ); drawQuad( transform, buffer, x - leftMarginSize, y, leftMarginSize, height, palette, backgroundColour.charAt( 0 ), light );
} }
if( rightMarginSize > 0 ) if( rightMarginSize > 0 )
{ {
drawQuad( transform, buffer, x + backgroundColour.length() * FONT_WIDTH, y, rightMarginSize, height, palette, greyscale, backgroundColour.charAt( backgroundColour.length() - 1 ), light ); drawQuad( transform, buffer, x + backgroundColour.length() * FONT_WIDTH, y, rightMarginSize, height, palette, backgroundColour.charAt( backgroundColour.length() - 1 ), light );
} }
// Batch together runs of identical background cells. // Batch together runs of identical background cells.
@ -124,7 +124,7 @@ public final class FixedWidthFontRenderer
if( blockColour != '\0' ) if( blockColour != '\0' )
{ {
drawQuad( transform, buffer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (i - blockStart), height, palette, greyscale, blockColour, light ); drawQuad( transform, buffer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (i - blockStart), height, palette, blockColour, light );
} }
blockColour = colourIndex; blockColour = colourIndex;
@ -133,18 +133,18 @@ public final class FixedWidthFontRenderer
if( blockColour != '\0' ) if( blockColour != '\0' )
{ {
drawQuad( transform, buffer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (backgroundColour.length() - blockStart), height, palette, greyscale, blockColour, light ); drawQuad( transform, buffer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (backgroundColour.length() - blockStart), height, palette, blockColour, light );
} }
} }
public static void drawString( public static void drawString(
@Nonnull Matrix4f transform, @Nonnull IVertexBuilder renderer, float x, float y, @Nonnull Matrix4f transform, @Nonnull IVertexBuilder renderer, float x, float y,
@Nonnull TextBuffer text, @Nonnull TextBuffer textColour, @Nonnull Palette palette, boolean greyscale, int light @Nonnull TextBuffer text, @Nonnull TextBuffer textColour, @Nonnull Palette palette, int light
) )
{ {
for( int i = 0; i < text.length(); i++ ) for( int i = 0; i < text.length(); i++ )
{ {
byte[] colour = palette.getByteColour( getColour( textColour.charAt( i ), Colour.BLACK ), greyscale ); byte[] colour = palette.getRenderColours( getColour( textColour.charAt( i ), Colour.BLACK ) );
int index = text.charAt( i ); int index = text.charAt( i );
if( index > 255 ) index = '?'; if( index > 255 ) index = '?';
@ -154,7 +154,7 @@ public final class FixedWidthFontRenderer
public static void drawTerminalWithoutCursor( public static void drawTerminalWithoutCursor(
@Nonnull Matrix4f transform, @Nonnull IVertexBuilder buffer, float x, float y, @Nonnull Matrix4f transform, @Nonnull IVertexBuilder buffer, float x, float y,
@Nonnull Terminal terminal, boolean greyscale, @Nonnull Terminal terminal,
float topMarginSize, float bottomMarginSize, float leftMarginSize, float rightMarginSize float topMarginSize, float bottomMarginSize, float leftMarginSize, float rightMarginSize
) )
{ {
@ -164,13 +164,13 @@ public final class FixedWidthFontRenderer
// Top and bottom margins // Top and bottom margins
drawBackground( drawBackground(
transform, buffer, x, y - topMarginSize, transform, buffer, x, y - topMarginSize,
terminal.getBackgroundColourLine( 0 ), palette, greyscale, terminal.getBackgroundColourLine( 0 ), palette,
leftMarginSize, rightMarginSize, topMarginSize, FULL_BRIGHT_LIGHTMAP leftMarginSize, rightMarginSize, topMarginSize, FULL_BRIGHT_LIGHTMAP
); );
drawBackground( drawBackground(
transform, buffer, x, y + height * FONT_HEIGHT, transform, buffer, x, y + height * FONT_HEIGHT,
terminal.getBackgroundColourLine( height - 1 ), palette, greyscale, terminal.getBackgroundColourLine( height - 1 ), palette,
leftMarginSize, rightMarginSize, bottomMarginSize, FULL_BRIGHT_LIGHTMAP leftMarginSize, rightMarginSize, bottomMarginSize, FULL_BRIGHT_LIGHTMAP
); );
@ -180,12 +180,12 @@ public final class FixedWidthFontRenderer
float rowY = y + FONT_HEIGHT * i; float rowY = y + FONT_HEIGHT * i;
drawBackground( drawBackground(
transform, buffer, x, rowY, terminal.getBackgroundColourLine( i ), transform, buffer, x, rowY, terminal.getBackgroundColourLine( i ),
palette, greyscale, leftMarginSize, rightMarginSize, FONT_HEIGHT, FULL_BRIGHT_LIGHTMAP palette, leftMarginSize, rightMarginSize, FONT_HEIGHT, FULL_BRIGHT_LIGHTMAP
); );
drawString( drawString(
transform, buffer, x, rowY, terminal.getLine( i ), terminal.getTextColourLine( i ), transform, buffer, x, rowY, terminal.getLine( i ), terminal.getTextColourLine( i ),
palette, greyscale, FULL_BRIGHT_LIGHTMAP palette, FULL_BRIGHT_LIGHTMAP
); );
} }
} }
@ -200,25 +200,23 @@ public final class FixedWidthFontRenderer
} }
public static void drawCursor( public static void drawCursor(
@Nonnull Matrix4f transform, @Nonnull IVertexBuilder buffer, float x, float y, @Nonnull Matrix4f transform, @Nonnull IVertexBuilder buffer, float x, float y, @Nonnull Terminal terminal
@Nonnull Terminal terminal, boolean greyscale
) )
{ {
if( isCursorVisible( terminal ) && FrameInfo.getGlobalCursorBlink() ) if( isCursorVisible( terminal ) && FrameInfo.getGlobalCursorBlink() )
{ {
byte[] colour = terminal.getPalette().getByteColour( 15 - terminal.getTextColour(), greyscale ); byte[] colour = terminal.getPalette().getRenderColours( 15 - terminal.getTextColour() );
drawChar( transform, buffer, x + terminal.getCursorX() * FONT_WIDTH, y + terminal.getCursorY() * FONT_HEIGHT, '_', colour, FULL_BRIGHT_LIGHTMAP ); drawChar( transform, buffer, x + terminal.getCursorX() * FONT_WIDTH, y + terminal.getCursorY() * FONT_HEIGHT, '_', colour, FULL_BRIGHT_LIGHTMAP );
} }
} }
public static void drawTerminal( public static void drawTerminal(
@Nonnull Matrix4f transform, @Nonnull IVertexBuilder buffer, float x, float y, @Nonnull Matrix4f transform, @Nonnull IVertexBuilder buffer, float x, float y, @Nonnull Terminal terminal,
@Nonnull Terminal terminal, boolean greyscale,
float topMarginSize, float bottomMarginSize, float leftMarginSize, float rightMarginSize float topMarginSize, float bottomMarginSize, float leftMarginSize, float rightMarginSize
) )
{ {
drawTerminalWithoutCursor( transform, buffer, x, y, terminal, greyscale, topMarginSize, bottomMarginSize, leftMarginSize, rightMarginSize ); drawTerminalWithoutCursor( transform, buffer, x, y, terminal, topMarginSize, bottomMarginSize, leftMarginSize, rightMarginSize );
drawCursor( transform, buffer, x, y, terminal, greyscale ); drawCursor( transform, buffer, x, y, terminal );
} }
public static void drawEmptyTerminal( @Nonnull Matrix4f transform, @Nonnull IVertexBuilder renderer, float x, float y, float width, float height ) public static void drawEmptyTerminal( @Nonnull Matrix4f transform, @Nonnull IVertexBuilder renderer, float x, float y, float width, float height )

View File

@ -69,10 +69,4 @@ public class TermAPI extends TermMethods implements ILuaAPI
{ {
return terminal; return terminal;
} }
@Override
public boolean isColour()
{
return environment.isColour();
}
} }

View File

@ -37,8 +37,6 @@ public abstract class TermMethods
@Nonnull @Nonnull
public abstract Terminal getTerminal() throws LuaException; public abstract Terminal getTerminal() throws LuaException;
public abstract boolean isColour() throws LuaException;
/** /**
* Write {@code text} at the current cursor position, moving the cursor to the end of the text. * Write {@code text} at the current cursor position, moving the cursor to the end of the text.
* *
@ -258,7 +256,7 @@ public abstract class TermMethods
@LuaFunction( { "isColour", "isColor" } ) @LuaFunction( { "isColour", "isColor" } )
public final boolean getIsColour() throws LuaException public final boolean getIsColour() throws LuaException
{ {
return isColour(); return getTerminal().isColour();
} }
/** /**

View File

@ -637,11 +637,10 @@ final class ComputerExecutor
private void displayFailure( String message, String extra ) private void displayFailure( String message, String extra )
{ {
Terminal terminal = computer.getTerminal(); Terminal terminal = computer.getTerminal();
boolean colour = computer.getComputerEnvironment().isColour();
terminal.reset(); terminal.reset();
// Display our primary error message // Display our primary error message
if( colour ) terminal.setTextColour( 15 - Colour.RED.ordinal() ); if( terminal.isColour() ) terminal.setTextColour( 15 - Colour.RED.ordinal() );
terminal.write( message ); terminal.write( message );
if( extra != null ) if( extra != null )
@ -654,7 +653,7 @@ final class ComputerExecutor
// And display our generic "CC may be installed incorrectly" message. // And display our generic "CC may be installed incorrectly" message.
terminal.setCursorPos( 0, terminal.getCursorY() + 1 ); terminal.setCursorPos( 0, terminal.getCursorY() + 1 );
if( colour ) terminal.setTextColour( 15 - Colour.WHITE.ordinal() ); if( terminal.isColour() ) terminal.setTextColour( 15 - Colour.WHITE.ordinal() );
terminal.write( "ComputerCraft may be installed incorrectly" ); terminal.write( "ComputerCraft may be installed incorrectly" );
} }

View File

@ -18,8 +18,6 @@ public interface IComputerEnvironment
double getTimeOfDay(); double getTimeOfDay();
boolean isColour();
long getComputerSpaceLimit(); long getComputerSpaceLimit();
@Nonnull @Nonnull

View File

@ -11,11 +11,16 @@ import net.minecraft.nbt.CompoundNBT;
import net.minecraft.network.PacketBuffer; import net.minecraft.network.PacketBuffer;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
public class Terminal public class Terminal
{ {
private static final String base16 = "0123456789abcdef"; private static final String BASE_16 = "0123456789abcdef";
private int width;
private int height;
private final boolean colour;
private int cursorX = 0; private int cursorX = 0;
private int cursorY = 0; private int cursorY = 0;
@ -23,26 +28,25 @@ public class Terminal
private int cursorColour = 0; private int cursorColour = 0;
private int cursorBackgroundColour = 15; private int cursorBackgroundColour = 15;
private int width;
private int height;
private TextBuffer[] text; private TextBuffer[] text;
private TextBuffer[] textColour; private TextBuffer[] textColour;
private TextBuffer[] backgroundColour; private TextBuffer[] backgroundColour;
private final Palette palette = new Palette(); private final Palette palette;
private final Runnable onChanged; private final @Nullable Runnable onChanged;
public Terminal( int width, int height ) public Terminal( int width, int height, boolean colour )
{ {
this( width, height, null ); this( width, height, colour, null );
} }
public Terminal( int width, int height, Runnable changedCallback ) public Terminal( int width, int height, boolean colour, Runnable changedCallback )
{ {
this.width = width; this.width = width;
this.height = height; this.height = height;
this.colour = colour;
palette = new Palette( colour );
onChanged = changedCallback; onChanged = changedCallback;
text = new TextBuffer[height]; text = new TextBuffer[height];
@ -51,8 +55,8 @@ public class Terminal
for( int i = 0; i < this.height; i++ ) for( int i = 0; i < this.height; i++ )
{ {
text[i] = new TextBuffer( ' ', this.width ); text[i] = new TextBuffer( ' ', this.width );
textColour[i] = new TextBuffer( base16.charAt( cursorColour ), this.width ); textColour[i] = new TextBuffer( BASE_16.charAt( cursorColour ), this.width );
backgroundColour[i] = new TextBuffer( base16.charAt( cursorBackgroundColour ), this.width ); backgroundColour[i] = new TextBuffer( BASE_16.charAt( cursorBackgroundColour ), this.width );
} }
} }
@ -78,6 +82,11 @@ public class Terminal
return height; return height;
} }
public boolean isColour()
{
return colour;
}
public synchronized void resize( int width, int height ) public synchronized void resize( int width, int height )
{ {
if( width == this.width && height == this.height ) if( width == this.width && height == this.height )
@ -102,8 +111,8 @@ public class Terminal
if( i >= oldHeight ) if( i >= oldHeight )
{ {
text[i] = new TextBuffer( ' ', this.width ); text[i] = new TextBuffer( ' ', this.width );
textColour[i] = new TextBuffer( base16.charAt( cursorColour ), this.width ); textColour[i] = new TextBuffer( BASE_16.charAt( cursorColour ), this.width );
backgroundColour[i] = new TextBuffer( base16.charAt( cursorBackgroundColour ), this.width ); backgroundColour[i] = new TextBuffer( BASE_16.charAt( cursorBackgroundColour ), this.width );
} }
else if( this.width == oldWidth ) else if( this.width == oldWidth )
{ {
@ -114,8 +123,8 @@ public class Terminal
else else
{ {
text[i] = new TextBuffer( ' ', this.width ); text[i] = new TextBuffer( ' ', this.width );
textColour[i] = new TextBuffer( base16.charAt( cursorColour ), this.width ); textColour[i] = new TextBuffer( BASE_16.charAt( cursorColour ), this.width );
backgroundColour[i] = new TextBuffer( base16.charAt( cursorBackgroundColour ), this.width ); backgroundColour[i] = new TextBuffer( BASE_16.charAt( cursorBackgroundColour ), this.width );
text[i].write( oldText[i] ); text[i].write( oldText[i] );
textColour[i].write( oldTextColour[i] ); textColour[i].write( oldTextColour[i] );
backgroundColour[i].write( oldBackgroundColour[i] ); backgroundColour[i].write( oldBackgroundColour[i] );
@ -212,8 +221,8 @@ public class Terminal
if( y >= 0 && y < height ) if( y >= 0 && y < height )
{ {
this.text[y].write( text, x ); this.text[y].write( text, x );
textColour[y].fill( base16.charAt( cursorColour ), x, x + text.length() ); textColour[y].fill( BASE_16.charAt( cursorColour ), x, x + text.length() );
backgroundColour[y].fill( base16.charAt( cursorBackgroundColour ), x, x + text.length() ); backgroundColour[y].fill( BASE_16.charAt( cursorBackgroundColour ), x, x + text.length() );
setChanged(); setChanged();
} }
} }
@ -237,8 +246,8 @@ public class Terminal
else else
{ {
newText[y] = new TextBuffer( ' ', width ); newText[y] = new TextBuffer( ' ', width );
newTextColour[y] = new TextBuffer( base16.charAt( cursorColour ), width ); newTextColour[y] = new TextBuffer( BASE_16.charAt( cursorColour ), width );
newBackgroundColour[y] = new TextBuffer( base16.charAt( cursorBackgroundColour ), width ); newBackgroundColour[y] = new TextBuffer( BASE_16.charAt( cursorBackgroundColour ), width );
} }
} }
text = newText; text = newText;
@ -253,8 +262,8 @@ public class Terminal
for( int y = 0; y < height; y++ ) for( int y = 0; y < height; y++ )
{ {
text[y].fill( ' ' ); text[y].fill( ' ' );
textColour[y].fill( base16.charAt( cursorColour ) ); textColour[y].fill( BASE_16.charAt( cursorColour ) );
backgroundColour[y].fill( base16.charAt( cursorBackgroundColour ) ); backgroundColour[y].fill( BASE_16.charAt( cursorBackgroundColour ) );
} }
setChanged(); setChanged();
} }
@ -265,8 +274,8 @@ public class Terminal
if( y >= 0 && y < height ) if( y >= 0 && y < height )
{ {
text[y].fill( ' ' ); text[y].fill( ' ' );
textColour[y].fill( base16.charAt( cursorColour ) ); textColour[y].fill( BASE_16.charAt( cursorColour ) );
backgroundColour[y].fill( base16.charAt( cursorBackgroundColour ) ); backgroundColour[y].fill( BASE_16.charAt( cursorBackgroundColour ) );
setChanged(); setChanged();
} }
} }
@ -357,8 +366,8 @@ public class Terminal
for( int x = 0; x < width; x++ ) for( int x = 0; x < width; x++ )
{ {
byte colour = buffer.readByte(); byte colour = buffer.readByte();
backColour.setChar( x, base16.charAt( (colour >> 4) & 0xF ) ); backColour.setChar( x, BASE_16.charAt( (colour >> 4) & 0xF ) );
textColour.setChar( x, base16.charAt( colour & 0xF ) ); textColour.setChar( x, BASE_16.charAt( colour & 0xF ) );
} }
} }
@ -399,12 +408,12 @@ public class Terminal
{ {
text[n].write( nbt.getString( "term_text_" + n ) ); text[n].write( nbt.getString( "term_text_" + n ) );
} }
textColour[n].fill( base16.charAt( cursorColour ) ); textColour[n].fill( BASE_16.charAt( cursorColour ) );
if( nbt.contains( "term_textColour_" + n ) ) if( nbt.contains( "term_textColour_" + n ) )
{ {
textColour[n].write( nbt.getString( "term_textColour_" + n ) ); textColour[n].write( nbt.getString( "term_textColour_" + n ) );
} }
backgroundColour[n].fill( base16.charAt( cursorBackgroundColour ) ); backgroundColour[n].fill( BASE_16.charAt( cursorBackgroundColour ) );
if( nbt.contains( "term_textBgColour_" + n ) ) if( nbt.contains( "term_textBgColour_" + n ) )
{ {
backgroundColour[n].write( nbt.getString( "term_textBgColour_" + n ) ); backgroundColour[n].write( nbt.getString( "term_textBgColour_" + n ) );

View File

@ -8,7 +8,7 @@ package dan200.computercraft.shared.common;
import dan200.computercraft.core.terminal.Terminal; import dan200.computercraft.core.terminal.Terminal;
import dan200.computercraft.shared.network.client.TerminalState; import dan200.computercraft.shared.network.client.TerminalState;
public class ClientTerminal implements ITerminal public class ClientTerminal
{ {
private boolean colour; private boolean colour;
private Terminal terminal; private Terminal terminal;
@ -28,20 +28,11 @@ public class ClientTerminal implements ITerminal
return changed; return changed;
} }
// ITerminal implementation
@Override
public Terminal getTerminal() public Terminal getTerminal()
{ {
return terminal; return terminal;
} }
@Override
public boolean isColour()
{
return colour;
}
public void read( TerminalState state ) public void read( TerminalState state )
{ {
colour = state.colour; colour = state.colour;
@ -60,7 +51,7 @@ public class ClientTerminal implements ITerminal
{ {
if( terminal == null ) if( terminal == null )
{ {
terminal = new Terminal( width, height, () -> terminalChanged = true ); terminal = new Terminal( width, height, colour, () -> terminalChanged = true );
terminalChanged = true; terminalChanged = true;
} }
else else

View File

@ -1,15 +0,0 @@
/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.shared.common;
import dan200.computercraft.core.terminal.Terminal;
public interface ITerminal
{
Terminal getTerminal();
boolean isColour();
}

View File

@ -8,32 +8,26 @@ package dan200.computercraft.shared.common;
import dan200.computercraft.core.terminal.Terminal; import dan200.computercraft.core.terminal.Terminal;
import dan200.computercraft.shared.network.client.TerminalState; import dan200.computercraft.shared.network.client.TerminalState;
import javax.annotation.Nullable;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
public class ServerTerminal implements ITerminal public class ServerTerminal
{ {
private final boolean colour; private final boolean colour;
private Terminal terminal; private @Nullable Terminal terminal;
private final AtomicBoolean terminalChanged = new AtomicBoolean( false ); private final AtomicBoolean terminalChanged = new AtomicBoolean( false );
private boolean terminalChangedLastFrame = false; private boolean terminalChangedLastFrame = false;
public ServerTerminal( boolean colour ) public ServerTerminal( boolean colour )
{ {
this.colour = colour; this.colour = colour;
terminal = null;
}
public ServerTerminal( boolean colour, int terminalWidth, int terminalHeight )
{
this.colour = colour;
terminal = new Terminal( terminalWidth, terminalHeight, this::markTerminalChanged );
} }
protected void resize( int width, int height ) protected void resize( int width, int height )
{ {
if( terminal == null ) if( terminal == null )
{ {
terminal = new Terminal( width, height, this::markTerminalChanged ); terminal = new Terminal( width, height, colour, this::markTerminalChanged );
markTerminalChanged(); markTerminalChanged();
} }
else else
@ -66,20 +60,13 @@ public class ServerTerminal implements ITerminal
return terminalChangedLastFrame; return terminalChangedLastFrame;
} }
@Override
public Terminal getTerminal() public Terminal getTerminal()
{ {
return terminal; return terminal;
} }
@Override
public boolean isColour()
{
return colour;
}
public TerminalState write() public TerminalState write()
{ {
return new TerminalState( colour, terminal ); return new TerminalState( terminal );
} }
} }

View File

@ -56,18 +56,12 @@ public class ServerComputer implements InputHandler, IComputerEnvironment
this.family = family; this.family = family;
instanceID = ServerComputerRegistry.INSTANCE.getUnusedInstanceID(); instanceID = ServerComputerRegistry.INSTANCE.getUnusedInstanceID();
terminal = new Terminal( terminalWidth, terminalHeight, this::markTerminalChanged ); terminal = new Terminal( terminalWidth, terminalHeight, family != ComputerFamily.NORMAL, this::markTerminalChanged );
computer = new Computer( this, terminal, computerID ); computer = new Computer( this, terminal, computerID );
computer.setLabel( label ); computer.setLabel( label );
} }
@Override
public boolean isColour()
{
return family != ComputerFamily.NORMAL;
}
public ComputerFamily getFamily() public ComputerFamily getFamily()
{ {
return family; return family;
@ -126,7 +120,7 @@ public class ServerComputer implements InputHandler, IComputerEnvironment
public TerminalState getTerminalState() public TerminalState getTerminalState()
{ {
return new TerminalState( isColour(), terminal ); return new TerminalState( terminal );
} }
public void keepAlive() public void keepAlive()

View File

@ -7,6 +7,7 @@ package dan200.computercraft.shared.network.client;
import dan200.computercraft.client.pocket.ClientPocketComputers; import dan200.computercraft.client.pocket.ClientPocketComputers;
import dan200.computercraft.client.pocket.PocketComputerData; import dan200.computercraft.client.pocket.PocketComputerData;
import dan200.computercraft.core.terminal.Terminal;
import dan200.computercraft.shared.computer.core.ComputerState; import dan200.computercraft.shared.computer.core.ComputerState;
import dan200.computercraft.shared.network.NetworkMessage; import dan200.computercraft.shared.network.NetworkMessage;
import dan200.computercraft.shared.pocket.core.PocketServerComputer; import dan200.computercraft.shared.pocket.core.PocketServerComputer;
@ -28,7 +29,7 @@ public class PocketComputerDataMessage implements NetworkMessage
instanceId = computer.getInstanceID(); instanceId = computer.getInstanceID();
state = computer.getState(); state = computer.getState();
lightState = computer.getLight(); lightState = computer.getLight();
terminal = sendTerminal ? computer.getTerminalState() : new TerminalState( false, null ); terminal = sendTerminal ? computer.getTerminalState() : new TerminalState( (Terminal) null );
} }
public PocketComputerDataMessage( PacketBuffer buf ) public PocketComputerDataMessage( PacketBuffer buf )

View File

@ -42,23 +42,24 @@ public class TerminalState
private ByteBuf compressed; private ByteBuf compressed;
public TerminalState( boolean colour, @Nullable Terminal terminal ) public TerminalState( @Nullable Terminal terminal )
{ {
this( colour, terminal, true ); this( terminal, true );
} }
public TerminalState( boolean colour, @Nullable Terminal terminal, boolean compress ) public TerminalState( @Nullable Terminal terminal, boolean compress )
{ {
this.colour = colour;
this.compress = compress; this.compress = compress;
if( terminal == null ) if( terminal == null )
{ {
colour = false;
width = height = 0; width = height = 0;
buffer = null; buffer = null;
} }
else else
{ {
colour = terminal.isColour();
width = terminal.getWidth(); width = terminal.getWidth();
height = terminal.getHeight(); height = terminal.getHeight();
@ -123,7 +124,7 @@ public class TerminalState
public Terminal create() public Terminal create()
{ {
if( buffer == null ) throw new NullPointerException( "Terminal does not exist" ); if( buffer == null ) throw new NullPointerException( "Terminal does not exist" );
Terminal terminal = new Terminal( width, height ); Terminal terminal = new Terminal( width, height, colour );
terminal.read( new PacketBuffer( buffer ) ); terminal.read( new PacketBuffer( buffer ) );
return terminal; return terminal;
} }

View File

@ -39,6 +39,7 @@ public class KeyEventServerMessage extends ComputerServerMessage
@Override @Override
public void toBytes( @Nonnull PacketBuffer buf ) public void toBytes( @Nonnull PacketBuffer buf )
{ {
super.toBytes( buf );
buf.writeByte( type ); buf.writeByte( type );
buf.writeVarInt( key ); buf.writeVarInt( key );
} }

View File

@ -120,12 +120,6 @@ public class MonitorPeripheral extends TermMethods implements IPeripheral
return terminal; return terminal;
} }
@Override
public boolean isColour() throws LuaException
{
return getMonitor().isColour();
}
@Nullable @Nullable
@Override @Override
public Object getTarget() public Object getTarget()

View File

@ -577,6 +577,8 @@ public class TileMonitor extends TileGeneric
private void monitorTouched( float xPos, float yPos, float zPos ) private void monitorTouched( float xPos, float yPos, float zPos )
{ {
if( !advanced ) return;
XYPair pair = XYPair XYPair pair = XYPair
.of( xPos, yPos, zPos, getDirection(), getOrientation() ) .of( xPos, yPos, zPos, getDirection(), getOrientation() )
.add( xIndex, height - yIndex - 1 ); .add( xIndex, height - yIndex - 1 );
@ -587,7 +589,7 @@ public class TileMonitor extends TileGeneric
} }
ServerTerminal serverTerminal = getServerMonitor(); ServerTerminal serverTerminal = getServerMonitor();
if( serverTerminal == null || !serverTerminal.isColour() ) return; if( serverTerminal == null ) return;
Terminal originTerminal = serverTerminal.getTerminal(); Terminal originTerminal = serverTerminal.getTerminal();
if( originTerminal == null ) return; if( originTerminal == null ) return;

View File

@ -63,7 +63,7 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent
SidedCaps.ofNullable( facing -> facing == null ? new InvWrapper( this ) : new SidedInvWrapper( this, facing ) ); SidedCaps.ofNullable( facing -> facing == null ? new InvWrapper( this ) : new SidedInvWrapper( this, facing ) );
private LazyOptional<IPeripheral> peripheralCap; private LazyOptional<IPeripheral> peripheralCap;
private final Terminal page = new Terminal( ItemPrintout.LINE_MAX_LENGTH, ItemPrintout.LINES_PER_PAGE ); private final Terminal page = new Terminal( ItemPrintout.LINE_MAX_LENGTH, ItemPrintout.LINES_PER_PAGE, true );
private String pageTitle = ""; private String pageTitle = "";
private boolean printing = false; private boolean printing = false;

View File

@ -5,7 +5,6 @@
*/ */
package dan200.computercraft.shared.util; package dan200.computercraft.shared.util;
import dan200.computercraft.client.render.text.FixedWidthFontRenderer;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.network.PacketBuffer; import net.minecraft.network.PacketBuffer;
@ -14,18 +13,19 @@ import javax.annotation.Nonnull;
public class Palette public class Palette
{ {
private static final int PALETTE_SIZE = 16; private static final int PALETTE_SIZE = 16;
private final boolean colour;
private final double[][] colours = new double[PALETTE_SIZE][3]; private final double[][] colours = new double[PALETTE_SIZE][3];
private final byte[][] byteColours = new byte[PALETTE_SIZE][4]; private final byte[][] byteColours = new byte[PALETTE_SIZE][4];
private final byte[][] greyByteColours = new byte[PALETTE_SIZE][4];
public static final Palette DEFAULT = new Palette(); public static final Palette DEFAULT = new Palette( true );
public Palette() public Palette( boolean colour )
{ {
// Get the default palette this.colour = colour;
resetColours(); resetColours();
for( int i = 0; i < PALETTE_SIZE; i++ ) byteColours[i][3] = greyByteColours[i][3] = (byte) 255; for( int i = 0; i < PALETTE_SIZE; i++ ) byteColours[i][3] = (byte) 255;
} }
public void setColour( int i, double r, double g, double b ) public void setColour( int i, double r, double g, double b )
@ -35,12 +35,17 @@ public class Palette
colours[i][1] = g; colours[i][1] = g;
colours[i][2] = b; colours[i][2] = b;
byteColours[i][0] = (byte) (int) (r * 255); if( colour )
byteColours[i][1] = (byte) (int) (g * 255); {
byteColours[i][2] = (byte) (int) (b * 255); byteColours[i][0] = (byte) (int) (r * 255);
byteColours[i][1] = (byte) (int) (g * 255);
byte grey = (byte) (int) ((r + g + b) / 3 * 255); byteColours[i][2] = (byte) (int) (b * 255);
greyByteColours[i][0] = greyByteColours[i][1] = greyByteColours[i][2] = grey; }
else
{
byte grey = (byte) (int) ((r + g + b) / 3 * 255);
byteColours[i][0] = byteColours[i][1] = byteColours[i][2] = grey;
}
} }
public void setColour( int i, Colour colour ) public void setColour( int i, Colour colour )
@ -54,20 +59,18 @@ public class Palette
} }
/** /**
* Get the colour as a set of bytes rather than floats. This is called frequently by {@link FixedWidthFontRenderer}, * Get the colour as a set of RGB values suitable for rendering. Colours are automatically converted to greyscale
* as our vertex format uses bytes. * when using a black and white palette.
* <p>
* This returns a byte array, suitable for being used directly by our terminal vertex format.
* *
* This allows us to do the conversion once (when setting the colour) rather than for every vertex, at the cost of * @param i The colour index.
* some memory overhead.
*
* @param i The colour index.
* @param greyscale Whether this number should be converted to greyscale.
* @return The number as a tuple of bytes. * @return The number as a tuple of bytes.
*/ */
@Nonnull @Nonnull
public byte[] getByteColour( int i, boolean greyscale ) public byte[] getRenderColours( int i )
{ {
return greyscale ? greyByteColours[i] : byteColours[i]; return byteColours[i];
} }
public void resetColour( int i ) public void resetColour( int i )

View File

@ -97,7 +97,7 @@ public class ComputerTestDelegate
if( REPORT_PATH.delete() ) ComputerCraft.log.info( "Deleted previous coverage report." ); if( REPORT_PATH.delete() ) ComputerCraft.log.info( "Deleted previous coverage report." );
Terminal term = new Terminal( 80, 100 ); Terminal term = new Terminal( 80, 100, true );
IWritableMount mount = new FileMount( new File( "test-files/mount" ), 10_000_000 ); IWritableMount mount = new FileMount( new File( "test-files/mount" ), 10_000_000 );
// Remove any existing files // Remove any existing files

View File

@ -62,12 +62,6 @@ public class BasicEnvironment implements IComputerEnvironment
return 0; return 0;
} }
@Override
public boolean isColour()
{
return true;
}
@Override @Override
public long getComputerSpaceLimit() public long getComputerSpaceLimit()
{ {

View File

@ -37,7 +37,7 @@ public class ComputerBootstrap
public static void run( String program, int maxTimes ) public static void run( String program, int maxTimes )
{ {
run( program, x -> { }, maxTimes ); run( program, x -> {}, maxTimes );
} }
public static void run( IWritableMount mount, Consumer<Computer> setup, int maxTicks ) public static void run( IWritableMount mount, Consumer<Computer> setup, int maxTicks )
@ -45,7 +45,7 @@ public class ComputerBootstrap
ComputerCraft.logComputerErrors = true; ComputerCraft.logComputerErrors = true;
ComputerCraft.maxMainComputerTime = ComputerCraft.maxMainGlobalTime = Integer.MAX_VALUE; ComputerCraft.maxMainComputerTime = ComputerCraft.maxMainGlobalTime = Integer.MAX_VALUE;
Terminal term = new Terminal( ComputerCraft.computerTermWidth, ComputerCraft.computerTermHeight ); Terminal term = new Terminal( ComputerCraft.computerTermWidth, ComputerCraft.computerTermHeight, true );
final Computer computer = new Computer( new BasicEnvironment( mount ), term, 0 ); final Computer computer = new Computer( new BasicEnvironment( mount ), term, 0 );
AssertApi api = new AssertApi(); AssertApi api = new AssertApi();

View File

@ -55,7 +55,7 @@ public class FakeComputerManager
@Nonnull @Nonnull
public static Computer create() public static Computer create()
{ {
Computer computer = new Computer( new BasicEnvironment(), new Terminal( 51, 19 ), 0 ); Computer computer = new Computer( new BasicEnvironment(), new Terminal( 51, 19, true ), 0 );
machines.put( computer, new ConcurrentLinkedQueue<>() ); machines.put( computer, new ConcurrentLinkedQueue<>() );
return computer; return computer;
} }

View File

@ -27,7 +27,7 @@ class TerminalTest
@Test @Test
void testCreation() void testCreation()
{ {
Terminal terminal = new Terminal( 16, 9 ); Terminal terminal = new Terminal( 16, 9, true );
assertEquals( 16, terminal.getWidth() ); assertEquals( 16, terminal.getWidth() );
assertEquals( 9, terminal.getHeight() ); assertEquals( 9, terminal.getHeight() );
} }
@ -35,7 +35,7 @@ class TerminalTest
@Test @Test
void testSetAndGetLine() void testSetAndGetLine()
{ {
Terminal terminal = new Terminal( 16, 9 ); Terminal terminal = new Terminal( 16, 9, true );
terminal.setLine( 1, "ABCDEFGHIJKLMNOP", "0123456789abcdef", "fedcba9876543210" ); terminal.setLine( 1, "ABCDEFGHIJKLMNOP", "0123456789abcdef", "fedcba9876543210" );
assertEquals( "ABCDEFGHIJKLMNOP", terminal.getLine( 1 ).toString() ); assertEquals( "ABCDEFGHIJKLMNOP", terminal.getLine( 1 ).toString() );
assertEquals( "0123456789abcdef", terminal.getTextColourLine( 1 ).toString() ); assertEquals( "0123456789abcdef", terminal.getTextColourLine( 1 ).toString() );
@ -45,7 +45,7 @@ class TerminalTest
@Test @Test
void testGetLineOutOfBounds() void testGetLineOutOfBounds()
{ {
Terminal terminal = new Terminal( 16, 9 ); Terminal terminal = new Terminal( 16, 9, true );
assertNull( terminal.getLine( -5 ) ); assertNull( terminal.getLine( -5 ) );
assertNull( terminal.getLine( 12 ) ); assertNull( terminal.getLine( 12 ) );
@ -60,7 +60,7 @@ class TerminalTest
@Test @Test
void testDefaults() void testDefaults()
{ {
Terminal terminal = new Terminal( 16, 9 ); Terminal terminal = new Terminal( 16, 9, true );
assertEquals( 0, terminal.getCursorX() ); assertEquals( 0, terminal.getCursorX() );
assertEquals( 0, terminal.getCursorY() ); assertEquals( 0, terminal.getCursorY() );
assertFalse( terminal.getCursorBlink() ); assertFalse( terminal.getCursorBlink() );
@ -71,7 +71,7 @@ class TerminalTest
@Test @Test
void testDefaultTextBuffer() void testDefaultTextBuffer()
{ {
assertThat( new Terminal( 4, 3 ), textMatches( new String[] { assertThat( new Terminal( 4, 3, true ), textMatches( new String[] {
" ", " ",
" ", " ",
" ", " ",
@ -81,7 +81,7 @@ class TerminalTest
@Test @Test
void testDefaultTextColourBuffer() void testDefaultTextColourBuffer()
{ {
assertThat( new Terminal( 4, 3 ), textColourMatches( new String[] { assertThat( new Terminal( 4, 3, true ), textColourMatches( new String[] {
"0000", "0000",
"0000", "0000",
"0000", "0000",
@ -91,7 +91,7 @@ class TerminalTest
@Test @Test
void testDefaultBackgroundColourBuffer() void testDefaultBackgroundColourBuffer()
{ {
assertThat( new Terminal( 4, 3 ), TerminalMatchers.backgroundColourMatches( new String[] { assertThat( new Terminal( 4, 3, true ), TerminalMatchers.backgroundColourMatches( new String[] {
"ffff", "ffff",
"ffff", "ffff",
"ffff", "ffff",
@ -102,7 +102,7 @@ class TerminalTest
void testZeroSizeBuffers() void testZeroSizeBuffers()
{ {
String[] x = new String[0]; String[] x = new String[0];
assertThat( new Terminal( 0, 0 ), allOf( assertThat( new Terminal( 0, 0, true ), allOf(
textMatches( new String[0] ), textMatches( new String[0] ),
textColourMatches( x ), textColourMatches( x ),
TerminalMatchers.backgroundColourMatches( x ) TerminalMatchers.backgroundColourMatches( x )
@ -113,7 +113,7 @@ class TerminalTest
void testResizeWidthAndHeight() void testResizeWidthAndHeight()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
terminal.setLine( 0, "test", "aaaa", "eeee" ); terminal.setLine( 0, "test", "aaaa", "eeee" );
callCounter.reset(); callCounter.reset();
@ -146,7 +146,7 @@ class TerminalTest
void testResizeSmaller() void testResizeSmaller()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
terminal.setLine( 0, "test", "aaaa", "eeee" ); terminal.setLine( 0, "test", "aaaa", "eeee" );
terminal.setLine( 1, "smol", "aaaa", "eeee" ); terminal.setLine( 1, "smol", "aaaa", "eeee" );
terminal.setLine( 2, "term", "aaaa", "eeee" ); terminal.setLine( 2, "term", "aaaa", "eeee" );
@ -176,7 +176,7 @@ class TerminalTest
void testResizeWithSameDimensions() void testResizeWithSameDimensions()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
TerminalBufferSnapshot old = new TerminalBufferSnapshot( terminal ); TerminalBufferSnapshot old = new TerminalBufferSnapshot( terminal );
terminal.resize( 4, 3 ); terminal.resize( 4, 3 );
@ -189,7 +189,7 @@ class TerminalTest
void testSetAndGetCursorPos() void testSetAndGetCursorPos()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
terminal.setCursorPos( 2, 1 ); terminal.setCursorPos( 2, 1 );
@ -202,7 +202,7 @@ class TerminalTest
void testSetCursorPosUnchanged() void testSetCursorPosUnchanged()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
terminal.setCursorPos( 2, 1 ); terminal.setCursorPos( 2, 1 );
callCounter.reset(); callCounter.reset();
@ -217,7 +217,7 @@ class TerminalTest
void testSetCursorBlink() void testSetCursorBlink()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
terminal.setCursorBlink( true ); terminal.setCursorBlink( true );
@ -229,7 +229,7 @@ class TerminalTest
void testSetCursorBlinkUnchanged() void testSetCursorBlinkUnchanged()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
terminal.setCursorBlink( true ); terminal.setCursorBlink( true );
callCounter.reset(); callCounter.reset();
@ -243,7 +243,7 @@ class TerminalTest
void testSetTextColour() void testSetTextColour()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
terminal.setTextColour( 5 ); terminal.setTextColour( 5 );
@ -255,7 +255,7 @@ class TerminalTest
void testSetTextColourUnchanged() void testSetTextColourUnchanged()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
terminal.setTextColour( 5 ); terminal.setTextColour( 5 );
callCounter.reset(); callCounter.reset();
@ -269,7 +269,7 @@ class TerminalTest
void testSetBackgroundColour() void testSetBackgroundColour()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
terminal.setBackgroundColour( 5 ); terminal.setBackgroundColour( 5 );
@ -281,7 +281,7 @@ class TerminalTest
void testSetBackgroundColourUnchanged() void testSetBackgroundColourUnchanged()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
terminal.setBackgroundColour( 5 ); terminal.setBackgroundColour( 5 );
callCounter.reset(); callCounter.reset();
@ -295,7 +295,7 @@ class TerminalTest
void testBlitFromOrigin() void testBlitFromOrigin()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
blit( terminal, "test", "1234", "abcd" ); blit( terminal, "test", "1234", "abcd" );
@ -322,7 +322,7 @@ class TerminalTest
void testBlitWithOffset() void testBlitWithOffset()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
terminal.setCursorPos( 2, 1 ); terminal.setCursorPos( 2, 1 );
callCounter.reset(); callCounter.reset();
@ -353,7 +353,7 @@ class TerminalTest
void testBlitOutOfBounds() void testBlitOutOfBounds()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
TerminalBufferSnapshot old = new TerminalBufferSnapshot( terminal ); TerminalBufferSnapshot old = new TerminalBufferSnapshot( terminal );
terminal.setCursorPos( 2, -5 ); terminal.setCursorPos( 2, -5 );
@ -372,7 +372,7 @@ class TerminalTest
@Test @Test
public void testBlitPartialBuffer() public void testBlitPartialBuffer()
{ {
Terminal terminal = new Terminal( 4, 3 ); Terminal terminal = new Terminal( 4, 3, true );
ByteBuffer text = LuaValues.encode( "123456" ); ByteBuffer text = LuaValues.encode( "123456" );
text.position( 1 ); text.position( 1 );
@ -386,7 +386,7 @@ class TerminalTest
void testWriteFromOrigin() void testWriteFromOrigin()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
terminal.write( "test" ); terminal.write( "test" );
@ -413,7 +413,7 @@ class TerminalTest
void testWriteWithOffset() void testWriteWithOffset()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
terminal.setCursorPos( 2, 1 ); terminal.setCursorPos( 2, 1 );
callCounter.reset(); callCounter.reset();
@ -444,7 +444,7 @@ class TerminalTest
void testWriteOutOfBounds() void testWriteOutOfBounds()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
TerminalBufferSnapshot old = new TerminalBufferSnapshot( terminal ); TerminalBufferSnapshot old = new TerminalBufferSnapshot( terminal );
terminal.setCursorPos( 2, -5 ); terminal.setCursorPos( 2, -5 );
@ -465,7 +465,7 @@ class TerminalTest
void testScrollUp() void testScrollUp()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
terminal.setLine( 1, "test", "1111", "eeee" ); terminal.setLine( 1, "test", "1111", "eeee" );
callCounter.reset(); callCounter.reset();
@ -496,7 +496,7 @@ class TerminalTest
void testScrollDown() void testScrollDown()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
terminal.setLine( 1, "test", "1111", "eeee" ); terminal.setLine( 1, "test", "1111", "eeee" );
callCounter.reset(); callCounter.reset();
@ -527,7 +527,7 @@ class TerminalTest
void testScrollZeroLinesUnchanged() void testScrollZeroLinesUnchanged()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
terminal.setLine( 1, "test", "1111", "eeee" ); terminal.setLine( 1, "test", "1111", "eeee" );
TerminalBufferSnapshot old = new TerminalBufferSnapshot( terminal ); TerminalBufferSnapshot old = new TerminalBufferSnapshot( terminal );
@ -543,7 +543,7 @@ class TerminalTest
void testClear() void testClear()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
TerminalBufferSnapshot old = new TerminalBufferSnapshot( terminal ); TerminalBufferSnapshot old = new TerminalBufferSnapshot( terminal );
terminal.setLine( 1, "test", "1111", "eeee" ); terminal.setLine( 1, "test", "1111", "eeee" );
@ -559,7 +559,7 @@ class TerminalTest
void testClearLine() void testClearLine()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
TerminalBufferSnapshot old = new TerminalBufferSnapshot( terminal ); TerminalBufferSnapshot old = new TerminalBufferSnapshot( terminal );
terminal.setLine( 1, "test", "1111", "eeee" ); terminal.setLine( 1, "test", "1111", "eeee" );
@ -576,7 +576,7 @@ class TerminalTest
void testClearLineOutOfBounds() void testClearLineOutOfBounds()
{ {
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal terminal = new Terminal( 4, 3, callCounter ); Terminal terminal = new Terminal( 4, 3, true, callCounter );
TerminalBufferSnapshot old; TerminalBufferSnapshot old;
terminal.setLine( 1, "test", "1111", "eeee" ); terminal.setLine( 1, "test", "1111", "eeee" );
@ -599,7 +599,7 @@ class TerminalTest
@Test @Test
void testPacketBufferRoundtrip() void testPacketBufferRoundtrip()
{ {
Terminal writeTerminal = new Terminal( 2, 1 ); Terminal writeTerminal = new Terminal( 2, 1, true );
blit( writeTerminal, "hi", "11", "ee" ); blit( writeTerminal, "hi", "11", "ee" );
writeTerminal.setCursorPos( 2, 5 ); writeTerminal.setCursorPos( 2, 5 );
@ -610,7 +610,7 @@ class TerminalTest
writeTerminal.write( packetBuffer ); writeTerminal.write( packetBuffer );
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal readTerminal = new Terminal( 2, 1, callCounter ); Terminal readTerminal = new Terminal( 2, 1, true, callCounter );
packetBuffer.writeBytes( packetBuffer ); packetBuffer.writeBytes( packetBuffer );
readTerminal.read( packetBuffer ); readTerminal.read( packetBuffer );
@ -630,7 +630,7 @@ class TerminalTest
@Test @Test
void testNbtRoundtrip() void testNbtRoundtrip()
{ {
Terminal writeTerminal = new Terminal( 10, 5 ); Terminal writeTerminal = new Terminal( 10, 5, true );
blit( writeTerminal, "hi", "11", "ee" ); blit( writeTerminal, "hi", "11", "ee" );
writeTerminal.setCursorPos( 2, 5 ); writeTerminal.setCursorPos( 2, 5 );
writeTerminal.setTextColour( 3 ); writeTerminal.setTextColour( 3 );
@ -640,7 +640,7 @@ class TerminalTest
writeTerminal.writeToNBT( nbt ); writeTerminal.writeToNBT( nbt );
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
Terminal readTerminal = new Terminal( 2, 1, callCounter ); Terminal readTerminal = new Terminal( 2, 1, true, callCounter );
readTerminal.readFromNBT( nbt ); readTerminal.readFromNBT( nbt );
@ -660,13 +660,13 @@ class TerminalTest
@Test @Test
void testReadWriteNBTEmpty() void testReadWriteNBTEmpty()
{ {
Terminal terminal = new Terminal( 0, 0 ); Terminal terminal = new Terminal( 0, 0, true );
CompoundNBT nbt = new CompoundNBT(); CompoundNBT nbt = new CompoundNBT();
terminal.writeToNBT( nbt ); terminal.writeToNBT( nbt );
CallCounter callCounter = new CallCounter(); CallCounter callCounter = new CallCounter();
terminal = new Terminal( 0, 1, callCounter ); terminal = new Terminal( 0, 1, true, callCounter );
terminal.readFromNBT( nbt ); terminal.readFromNBT( nbt );
assertThat( terminal, allOf( assertThat( terminal, allOf(

View File

@ -26,7 +26,7 @@ public class TerminalStateTest
Terminal terminal = randomTerminal(); Terminal terminal = randomTerminal();
PacketBuffer buffer = new PacketBuffer( Unpooled.directBuffer() ); PacketBuffer buffer = new PacketBuffer( Unpooled.directBuffer() );
new TerminalState( true, terminal, true ).write( buffer ); new TerminalState( terminal, true ).write( buffer );
checkEqual( terminal, read( buffer ) ); checkEqual( terminal, read( buffer ) );
assertEquals( 0, buffer.readableBytes() ); assertEquals( 0, buffer.readableBytes() );
@ -38,7 +38,7 @@ public class TerminalStateTest
Terminal terminal = randomTerminal(); Terminal terminal = randomTerminal();
PacketBuffer buffer = new PacketBuffer( Unpooled.directBuffer() ); PacketBuffer buffer = new PacketBuffer( Unpooled.directBuffer() );
new TerminalState( true, terminal, false ).write( buffer ); new TerminalState( terminal, false ).write( buffer );
checkEqual( terminal, read( buffer ) ); checkEqual( terminal, read( buffer ) );
assertEquals( 0, buffer.readableBytes() ); assertEquals( 0, buffer.readableBytes() );
@ -47,7 +47,7 @@ public class TerminalStateTest
private static Terminal randomTerminal() private static Terminal randomTerminal()
{ {
Random random = new Random(); Random random = new Random();
Terminal terminal = new Terminal( 10, 5 ); Terminal terminal = new Terminal( 10, 5, true );
for( int y = 0; y < terminal.getHeight(); y++ ) for( int y = 0; y < terminal.getHeight(); y++ )
{ {
TextBuffer buffer = terminal.getLine( y ); TextBuffer buffer = terminal.getLine( y );
@ -77,7 +77,7 @@ public class TerminalStateTest
if( !state.hasTerminal() ) return null; if( !state.hasTerminal() ) return null;
Terminal other = new Terminal( state.width, state.height ); Terminal other = new Terminal( state.width, state.height, true );
state.apply( other ); state.apply( other );
return other; return other;
} }