Comment/label decoder for the game "Human Resource Machine"
October 21, 2015 ยท View on GitHub
import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.ByteArrayInputStream; import java.util.Base64; import java.util.zip.Inflater;
import javax.swing.*;
public class LabelDraw extends JFrame {
private final Canvas canvas; private final JTextArea textArea;
public LabelDraw() throws HeadlessException { setTitle("Human Resource Machine"); setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setLayout(new BorderLayout(4, 4));
canvas = new Canvas();
add(canvas, BorderLayout.CENTER);
textArea = new JTextArea();
textArea.setFont(new Font("monospaced", Font.PLAIN, 14));
textArea.setLineWrap(true);
textArea.setRows(8);
add(new JScrollPane(textArea), BorderLayout.SOUTH);
textArea.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
textArea.selectAll();
}
});
textArea.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
}
});
textArea.getInputMap().put(KeyStroke.getKeyStroke("control ENTER"), "draw-data");
textArea.getActionMap().put("draw-data", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
canvas.setData(textArea.getText());
}
});
setResizable(false);
pack();
setLocationRelativeTo(null);
}
public static void main(String[] args) { new LabelDraw().setVisible(true); }
static class Canvas extends JPanel {
public static final int WIDTH = 1035;
private static final int HEIGHT = 340;
private static final int STROKE_WISTH = 30;
private static final int MAX_COORD = 65535;
private String data = null;
public Canvas() {
setPreferredSize(new Dimension(WIDTH, HEIGHT));
}
public void setData(String data) {
this.data = data;
repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.WHITE);
g.fillRect(0, 0, WIDTH, HEIGHT);
if (data != null) {
g.setColor(Color.BLACK);
final Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setStroke(new BasicStroke(STROKE_WISTH, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
try {
final Inflater inflater = new Inflater();
inflater.setInput(Base64.getMimeDecoder().decode(data));
byte[] buf = new byte[8192];
final int len = inflater.inflate(buf);
final ByteArrayInputStream inputStream = new ByteArrayInputStream(buf, 0, len);
int count = inputStream.read();
count |= inputStream.read() << 8;
count |= inputStream.read() << 16;
count |= inputStream.read() << 24;
if (count > 256 || count < 0) {
throw new RuntimeException("Invalid instruction count: " + count);
}
int lastX = 0, lastY = 0;
boolean startLine = true;
for (; count > 0; count--) {
int ox = inputStream.read();
ox |= inputStream.read() << 8;
int oy = inputStream.read();
oy |= inputStream.read() << 8;
if (ox == 0 && oy == 0) {
startLine = true;
} else {
final int x = transformX(ox);
final int y = transformY(oy);
if (startLine) {
startLine = false;
lastX = x;
lastY = y;
g.drawLine(lastX, lastY, x, y);
} else {
g.drawLine(lastX, lastY, x, y);
lastX = x;
lastY = y;
}
}
}
} catch (Exception ignored) {
}
}
}
private static int transformX(int x) {
return x * WIDTH / MAX_COORD;
}
private static int transformY(int y) {
return y * HEIGHT / MAX_COORD;
}
}
}