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;
}

}

}