You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

130 lines
3.7 KiB
Java

package net.brokenmoon;
import com.simon816.j65el02.device.MonitorDriver;
import com.simon816.j65el02.device.RPMonitor;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Arrays;
import java.util.Objects;
import static com.simon816.j65el02.device.RPMonitor.HEIGHT;
import static com.simon816.j65el02.device.RPMonitor.WIDTH;
public class BasicMonitorDriver implements MonitorDriver, KeyListener {
BufferedImage display;
JLabel[] lines = new JLabel[HEIGHT];
byte[][] windowDataOld = new byte[HEIGHT][WIDTH];
int xoffset = 30;
int yoffset = 26;
public BasicMonitorDriver() {
try{
display = ImageIO.read(Objects.requireNonNull(getClass().getResourceAsStream("/display.png")));
} catch(IOException e){
System.out.print("No image!");
}
JPanel panel = new JPanel(null);
JFrame frame = new JFrame("Monitor");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
Font bescii;
try {
bescii = Font.createFont(Font.TRUETYPE_FONT, new File(getClass().getResource("/C64ProMonoMonitor.ttf").toURI()));
ge.registerFont(bescii);
} catch (FontFormatException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
bescii = bescii.deriveFont(Font.PLAIN, 8f);
for(int i = 0; i < HEIGHT; i++){
lines[i] = new JLabel();
lines[i].setFont(bescii);
lines[i].setBounds(xoffset, yoffset + i * 8, 8 * WIDTH, 16);
lines[i].setForeground(Color.GREEN);
panel.add(lines[i]);
}
JLabel label = new JLabel(new ImageIcon(display.getScaledInstance(350 * 2,230 * 2,0)));
label.setBounds(0, 0, 350 * 2, 230 * 2);
panel.add(label);
frame.add(panel);
frame.addKeyListener(this);
frame.setFocusTraversalKeysEnabled(false);
frame.setBounds(0, 0, 710, 493);
frame.setVisible(true);
}
private RPMonitor monitor;
private int cursorX;
private int cursorY;
private int cursorMode;
@Override
public void setMonitor(RPMonitor rpMonitor) {
this.monitor = rpMonitor;
}
@Override
public void updateCursor(int cursorX, int cursorY, int cursorMode) {
this.cursorX = cursorX;
this.cursorY = cursorY;
this.cursorMode = cursorMode;
}
@Override
public void update(byte[][] windowData) {
for(int y = windowData.length - 1; y >= 0; y--){
String text = "";
if(!Arrays.equals(windowData[y], windowDataOld[y])) {
for (int x = 0; x < windowData[y].length; x++) {
int temp = Math.floorMod(windowData[y][x], 256);
text += (char) ((temp + 0xDED0));
}
lines[y].setText(text);
System.arraycopy(windowData[y], 0, windowDataOld[y], 0, windowData[y].length);
}
}
}
@Override
public void keyTyped(KeyEvent e) {
if(e.getKeyChar() == 10){
monitor.onKey((byte)13);
} else{
monitor.onKey((byte)e.getKeyChar());
}
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
}